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
などと表示されればうまくいっている.
Keyword(s):
References:[LinuxEx]