本講義では 2 通のレポートで評価します。 レポートは A4 の紙を縦に使い、適宜表紙を付けて提出すること。 またプログラムは C 言語で作成しなさい。
次の 4 つの課題を合わせて行い、報告しなさい。
なお、遅れレポートは教員に直接提出してください。 遅れた方が有利にならない範囲内で採点します。
行列の演算を行うパッケージを作成したい。 そのため、次のような構造体を作成した。
typedef struct {
int row;
int column;
double **array;
} MATIX;
また、2×2の正方行列を作成する関数を次のように作成した。
#include <stdlib.h>
MATRIX* create2x2(double a, double b, double c, double d){
MATRIX *m;
if((m= malloc(sizeof(MATRIX)))==NULL){
return NULL;
}
m->row=2;
m->column=2;
if((m->array= malloc(sizeof(double*)*2))==NULL){
free(m);
return NULL;
}
if((m->array[0]=malloc(sizeof(double)*2))==NULL){
free(m->array);
free(m);
return NULL;
}
if((m->array[1]=malloc(sizeof(double)*2))==NULL){
free(m->array[0]);
free(m->array);
free(m);
return NULL;
}
m->array[0][0]=a;
m->array[0][1]=b;
m->array[1][0]=c;
m->array[1][1]=d;
return m;
}
さらに、作成した行列を free する関数 freeMatrix を作成した。
void freeMatrix(MATRIX* m){
int i;
for(i=0;i<m->row;i++){
free(m->array[i]);
}
free(m->array);
free(m);
}
行列の表示を行う関数 void printMatrix(MATRIX* m)を作成しなさい。 但し、数値を横に並べる場合、空白で区切らず、タブ記号 '\t' で区切りなさい。 そして、次のテストプログラムと結合し、正常な出力が得られることを確認しなさい。
#define G (999)
/* 学籍番号の下3桁を記入する。先頭の 0 は省く */
MATRIX* create2x2(double a, double b, double c, double d);
void printMatrix(MATRIX* m);
int main(void){
MATRIX* a;
if((a = create2x2(G+1,G+2,G+3,G+4))==NULL){
return -1;
}
printMatrix(a);
freeMatrix(a);
return 0;
}
1000.000000 1001.000000 1002.000000 1003.000000
3×3の正方行列を作成する MATRIX* create3x3(double a,double b,double c,double d,double e,double f,double g,double h,double i) を作成しなさい。 そして、次のテストプログラムと結合し、正常な出力が得られることを確認しなさい。
#define G (999)
/* 学籍番号の下3桁を記入する。先頭の 0 は省く */
void printMatrix(MATRIX* m);
MATRIX* create3x3(double a, double b, double c, double d,double e,double f, double g,double h, double i);
int main(void){
MATRIX* a;
MATRIX* b;
if((a = create2x2(G+1,G+2,G+3,G+4))==NULL){
return -1;
}
if((b= create3x3(G+1,2,3,4,5,6,7,8,9))==NULL){
printMatrix(a);
return -1;
}
printMatrix(a);
printMatrix(b);
freeMatrix(b);
freeMatrix(a);
return 0;
}
1000.000000 1001.000000 1002.000000 1003.000000 1000.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000
1行2列のベクトルと、 2行1列のベクトルを作る関数 MATRIX* create1x2(double a, double b) と MATRIX* create2x1(double a, double b) を作成しなさい。 そして、次のテストプログラムと結合し、正常な出力が得られることを確認しなさい。
#define G (999)
/* 学籍番号の下3桁を記入する。先頭の 0 は省く */
void printMatrix(MATRIX* m);
MATRIX* create1x2(double a, double b);
MATRIX* create2x1(double a, double b);
int main(void){
MATRIX* a;
MATRIX* b;
if((a = create1x2(G+1,G+2))==NULL){
return -1;
}
if((b= create2x1(G+3,G+4))==NULL){
printMatrix(a);
return -1;
}
printMatrix(a);
printMatrix(b);
freeMatrix(b);
freeMatrix(a);
return 0;
}
1000.000000 1001.000000 1002.000000 1003.000000
行列の積を求める関数 MATRIX* multiply(MATRIX* a, MATRIX* b) を作成しなさい。 なお、行列の型が合わずに積を求められない場合は Type mismatch という表示を標準エラー出力に出し、 NULL を返しなさい。
そして、次のテストプログラムと結合し、正常な出力が得られることを確認しなさい。
#define G (999)
/* 学籍番号の下3桁を記入する。先頭の 0 は省く */
MATRIX* create1x2(double a, double b);
MATRIX* create2x1(double a, double b);
MATRIX* create2x2(double a, double b, double c, double d);
MATRIX* multiply(MATRIX* a, MATRIX* b);
void printMatrix(MATRIX* m);
int main(void){
MATRIX *a;
MATRIX *b;
MATRIX *c;
MATRIX *x;
MATRIX *y;
if((a = create1x2(G+1,2))==NULL){
return -1;
}
if((b = create2x1(3,4))==NULL){
freeMatrix(a);
return -1;
}
if((c = create2x2(1,2,3,4))==NULL){
freeMatrix(b); freeMatrix(a);
return -1;
}
if((x=multiply(a,a))!=NULL){
freeMatrix(c); freeMatrix(b); freeMatrix(a);
return -1;
}
if((x=multiply(a,b))==NULL){
freeMatrix(c); freeMatrix(b); freeMatrix(a);
return -1;
}
printMatrix(x);
freeMatrix(x);
if((x=multiply(b,b))!=NULL){
freeMatrix(c); freeMatrix(b); freeMatrix(a);
return -1;
}
if((x=multiply(b,a))==NULL){
freeMatrix(c); freeMatrix(b); freeMatrix(a);
return -1;
}
printMatrix(x);
freeMatrix(x);
if((x=multiply(c,a))!=NULL){
freeMatrix(c); freeMatrix(b); freeMatrix(a);
return -1;
}
if((x=multiply(a,c))==NULL){
freeMatrix(c); freeMatrix(b); freeMatrix(a);
return -1;
}
printMatrix(x);
freeMatrix(x);
if((x=multiply(b,c))!=NULL){
freeMatrix(c); freeMatrix(b); freeMatrix(a);
return -1;
}
if((x=multiply(c,b))==NULL){
freeMatrix(c); freeMatrix(b); freeMatrix(a);
return -1;
}
printMatrix(x);
freeMatrix(x);
if((x=multiply(c,c))==NULL){
freeMatrix(c); freeMatrix(b); freeMatrix(a);
return -1;
}
if((y=multiply(x,c))==NULL){
freeMatrix(x); freeMatrix(c); freeMatrix(b); freeMatrix(a);
return -1;
}
printMatrix(y);
freeMatrix(y); freeMatrix(x); freeMatrix(c); freeMatrix(b); freeMatrix(a);
return 0;
}
Type mismatch 3008.000000 Type mismatch 3000.000000 6.000000 4000.000000 8.000000 Type mismatch 1006.000000 2008.000000 Type mismatch 11.000000 25.000000 37.000000 54.000000 81.000000 118.000000