Matrix1

課題1:コイン投げのC化

コイン投げをC言語に書き換えよ.ただし,コインの枚数に対応する配列のメモリー確保はmallocを使え. 基本となるRubyの解答例

number = gets.chomp.to_i
total = Array.new(number+1,0)
iter = gets.chomp.to_i

iter.times do
  up=0
  number.times do
    up+=rand(2)
  end
  total[up]+=1
end

(number+1).times {|i|
  puts i.to_s+" "+total[i].to_s
}

メモリー確保の例

#include <stdio.h>
#include <stdlib.h>

int main(void){
  int number, iter,*total,i;
  scanf("%d",&number);
  scanf("%d",&iter);
  total = (int *)malloc((number+1)*sizeof(int));
  
  /* ここにコイン投げのシミュレーションが入る.変数宣言を忘れずに*/
  for (i=0;i<number+1;i++){
    printf("%10d %10d\n",i,total[i]);
  }
  free(total);
}

課題2:ランダム行列の生成

以下のプログラムをコンパイル・実行し,何をやっているかを解説せよ.

#include <stdio.h>
#include <stdlib.h>

void printMatrix(double *a, int n);

int main(void){
  int i,j;
  int n;
  double *a;

  scanf("%d",&n);
  printf("%d\n",n);

  a=(double *)malloc(n*n*sizeof(double));

  for (i=0;i<n;i++){
    for (j=0;j<n;j++){
      a[i*n+j]= 2*(double) random() / RAND_MAX - 1.0;
    }
  }
  printMatrix(a,n);
  free(a);
  return 0;
}

void printMatrix(double *a, int n){
  int i,j;

  for (i=0;i<n;i++){
    for (j=0;j<n;j++){
      printf("%10.5f",a[i*n+j]);
    }
    printf("\n");
  }
  return;
}

通常の行列のメモリー確保と違うのはどこか?

課題3:連立一次方程式の解の計算

以下のガウス消去法を実行する関数を加えて,連立一次方程式を解くプログラムを完成させよ. ここで,関数はnxnの正方係数行列a,未知ベクトルx, 数値ベクトルbとすると,

a . x =b

を解くことに相当する.mainではa,bを適当に生成させよ.

int MatrixInverse(double *a, double *b, long n){
  double *x;
  double pvt=0.00005,am;
  int i,j,k;

  x=(double *)malloc(n*sizeof(double));

  for(i=0;i<n-1;i++){
    for(j=i+1;j<n;j++){
      am=a[j*n+i]/a[i*n+i];
      for(k=0;k<n;k++) a[j*n+k]-=am*a[i*n+k];
      b[j]-=am*b[i];
    }
  }
  //Backward substitution
  for(j=n-1;j>=0;j--){
    x[j]=b[j];
    for(k=j+1;k<n;k++){
      x[j]-=a[j*n+k]*x[k];
    }
    b[j]=x[j]/=a[j*n+j];
  }
  free(x);
  return 0;
}

例えば,

void printMatrix(double *a, double *b, long n){
  int i,j;
  printf("?n");
  for (i=0;i<n;i++){
    for (j=0;j<n;j++){
      printf("%10.5f",a[i*n+j]);
    }
    printf(":%10.5f",b[i]);
    printf("\n");
  }
  printf("\n");
  return;
}

というプリント関数を使うと,

5
5 
   0.68038  -0.21123   0.56620   0.59688   0.82329:  -0.19811
  -0.60490  -0.32955   0.53646  -0.44445   0.10794:  -0.74042
  -0.04521   0.25774  -0.27043   0.02680   0.90446:  -0.78238
   0.83239   0.27142   0.43459  -0.71679   0.21394:   0.99785
  -0.96740  -0.51423  -0.72554   0.60835  -0.68664:  -0.56349

BOB    5 [dim]     0.0000 [sec] #BOB

   0.68038  -0.21123   0.56620   0.59688   0.82329:   1.28561
   0.00000  -0.51736   1.03985   0.08621   0.83990:  -0.31269
  -0.00000   0.00000   0.25702   0.10707   1.35481:  -0.34998
   0.00000   0.00000   0.00000  -1.69487  -4.18620:  -0.46925
   0.00000   0.00000   0.00000   0.00000   2.50623:  -0.80240

などと表示されればうまくいっている.

Last modified:2007/08/19 22:03:12
Keyword(s):
References:[LinuxEx]