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]