テキスト115ページの演習5-4
教員からの解答例
#include <stdio.h>
int main(void)
{
int i;
int a[5] = {17, 23, 36};
int b[5];
for(i = 0; i < 5; i++)
b[i] = a[4 - i];
puts(" a b");
puts("---------");
for(i =0; i < 5; i++)
printf("%4d%4d\n", a[i], b[i]);
return (0);
}
学生からの解答例その1
#include <stdio.h>
int main (void)
{
int i;
int a[5] = {17,23,36,0,0};
int b[5];
for(i = 0; i < 5; i++)
b[4 - i] = a[i];/* もちろんこれでもO.K.ですね。 */
puts(" a b");
puts("-------");
for(i = 0; i < 5; i++)
printf("%4d %4d\n", a[i],b[i]);
return(0);
}
学生からの解答例その2
カウント用の変数を二つ用いる例
プログラムで何を行っているかが非常に分かりやすくなる(Excellent!!)
#include <stdio.h>
int main(void)
{
int i, j;
int a[5] = {17, 23, 36}; /* 17,23,36,0,0で初期化 */
int b[5] = { 0 }; /* b[ ]も,念のため,0で初期化している。慎重で,大変良い! */
for(i = 4, j = 0; i >= 0; i--, j++) /* jという変数を用意して、iと逆向きにカウントさせるアイデアです。Very good! */
b[j] = a[i];
puts(" a b");
puts("-------");
for (i = 0; i < 5; i++)
printf("%4d%4d\n", a[i], b[i]);
return (0);
}
テキスト127ページの演習5-10
教員からの解答例
#include <stdio.h>
#define ROW 4 /* A = B*C のとき,行列Aの行数(=行列Bの行数) */
#define COL 4 /* A = B*C のとき,行列Aの列数(=行列Cの列数) */
#define INN 3 /* A = B*C のとき,行列Bの列数(=行列Cの行数) */
int main(void)
{
int i, j, k ;
int A[ROW][COL] ;
int B[ROW][INN] ;
int C[INN][COL] ;
printf("行列の積 A = B*C を計算します。\n\n") ;
for(i = 0 ; i < ROW ; i++){
printf("行列Bの%d行目の値を入力してください。\n", i) ;
for(j = 0 ; j < INN ; j++){
printf("%d列目の値:", j) ;
scanf("%d", &B[i][j]) ;
}
}
putchar('\n') ;
for(i = 0 ; i < INN ; i++){
printf("行列Cの%d行目の値を入力してください。\n", i) ;
for(j = 0 ; j < COL ; j++){
printf("%d列目の値:", j) ;
scanf("%d", &C[i][j]) ;
}
}
putchar('\n') ;
for(i = 0 ; i < ROW ; i++){
for(j = 0 ; j < COL ; j++){
A[i][j] = 0; /* 次のforループで,Aに+=(足しこんでいく)するので,最初の値としては,0でなければならない。
これをしないと,実行結果が実行するたびに,ふらふら変わってしまう。 */
for(k = 0 ; k < INN ; k++){
A[i][j] += B[i][k] * C[k][j];
}
}
}
printf("行列A =\n") ;
for(i = 0 ; i < ROW ; i++){
for(j = 0 ; j < COL ; j++){
printf("%3d", A[i][j]) ;
}
putchar('\n') ;
}
return(0) ;
}
学生からの解答例その1
B×Cと,C×Bの両方を計算している例。非常によく一般化されている。Very Very Excellent!!
このようなプログラムを書くひとは,将来,非常に質の高い仕事をするようになるでしょう。とても楽しみです!!
/*
2つの行列の積をを求めて表示
*/
#include <stdio.h>
int main(void)
{
int i, j, k;
int matrix1[4][3];
int matrix2[3][4];
int product1[4][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; /* 掛け算の結果を収める行列は,0で初期化している。 */
int product2[3][3] = {{0,0,0},{0,0,0},{0,0,0}}; /* 掛け算の結果を収める行列は,0で初期化している。 */
printf("このプログラムは4行3列の行列matrix1と3行4列の行列matrix2の積を計算します.\n\n");
/* matrix1の要素を入力 */
printf("matrix1の要素を入力してください.\n");
for (i = 0; i < 4; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d行%d列:", i+1, j+1);
scanf("%d", &matrix1[i][j]);
}
}
/* matrix1を表示 */
puts("[matrix1] =");
for (i = 0; i < 4; i++)
{
for (j = 0; j < 3; j++)
printf("%4d", matrix1[i][j]);
putchar('\n');
}
putchar('\n');
/* matrix2の要素を入力 */
printf("matrix2の要素を入力してください.\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("%d行%d列:", i+1, j+1);
scanf("%d", &matrix2[i][j]);
}
}
/* matrix2を表示 */
puts("[matrix2] =");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
printf("%4d", matrix2[i][j]);
putchar('\n');
}
putchar('\n');
/* 2つの行列の積を計算 */
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
for (k = 0; k < 3; k++)
{
product1[i][j] += matrix1[i][k] * matrix2[k][j]; /* product1[][]は,型宣言をするところで0で初期化しているので,安心して足し込んでいける。 */
}
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
for (k = 0; k < 4; k++)
{
product2[i][j] += matrix2[i][k] * matrix1[k][j];
}
}
}
/* 2つの行列の積を表示 */
puts("[matrix1] × [matrix2] =");
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
printf("%6d", product1[i][j]);
putchar('\n');
}
putchar('\n');
puts("[matrix2] × [matrix1] =");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
printf("%6d", product1[i][j]);
putchar('\n');
}
putchar('\n');
return 0;
}
学生からの解答例その2
掛け算の結果を収める行列を,式文によって0に初期化している例。
フォーマットもきれいに整えられているので,プログラムも見やすくて良い。 Excellent!!
#include <stdio.h>
int main(void){
int i, j, k;
int matrix1[4][3];
int matrix2[3][4];
int matrix_ans[4][4]; /* ここでは,型宣言をしているだけなので,matrix_ans[][]の値は,不定となっている。
すなわち,このプログラムを実行するたびに,matrix_ans[][]の初期値は,変わってしまう。 */
/////////////////////////////////////////////行列の入力//////////////////////////////////////////////////////
for(i=0;i<4;i++){
printf("4行3列の行列の%d行目をスペース区切りで入力:", i + 1);
scanf("%d %d %d", &matrix1[i][0], &matrix1[i][1], &matrix1[i][2]);
}
for(i=0;i<3;i++){
printf("3行4列の行列の%d行目をスペース区切りで入力:", i + 1);
scanf("%d %d %d %d", &matrix2[i][0], &matrix2[i][1], &matrix2[i][2], &matrix2[i][3]);
}
/////////////解答用配列の初期化(これ無しで行うと答えが変になるので書いています)/////////////
/* 変数や配列は,型宣言しただけでは,不定である(値が決まっていない)ので,ここで式文を使って,0を代入しているわけですね。
こうしておけば,後に出てくる式文
matrix_ans[i][j] = matrix_ans[i][j] + matrix1[i][k] * matrix2[k][j];
が期待した動作をするようになるわけです。*/
for(i=0;i<4;i++){
for(j=0;j<4;j++){
matrix_ans[i][j] = 0;
}
}
//////////////////////////////////////////////行列の演算////////////////////////////////////////////////
for(i=0;i<4;i++){
for(j=0;j<4;j++){
for(k=0;k<3;k++){
matrix_ans[i][j] = matrix_ans[i][j] + matrix1[i][k] * matrix2[k][j]; /* matrix_ans[i][j]の最初の値は0になっているので,安心して足し込んでいける */
}
}
}
////////////////////4 × 3行列の表示//////////////////////////
for(i=0;i<4;i++){
printf("|");
for(j=0;j<3;j++){
printf("%d",matrix1[i][j]);
if(j<2){
printf(" ");
}
}
printf("|");
printf("\n");
}
printf("\n");
////////////////////3 × 4行列の表示//////////////////////////
for(i=0;i<3;i++){
printf("|");
for(j=0;j<4;j++){
printf("%d",matrix2[i][j]);
if(j<3){
printf(" ");
}
}
printf("|");
printf("\n");
}
printf("\n=\n\n");
///////////////////////解行列の表示/////////////////////////
for(i=0;i<4;i++){
printf("|");
for(j=0;j<4;j++){
printf("%d",matrix_ans[i][j]);
if(j<3){
printf(" ");
}
}
printf("|");
printf("\n");
}
return 0;
}
学生からの解答例その3
掛け算した結果を,ダイレクトに画面表示している例。掛け算した結果を収める行列を別に準備してもよかったか?
#include <stdio.h>
int main(){
int i, j, k, sum = 0; /* sumは,型宣言をするところで0で初期化している。 */
int matrix1[4][3], matrix2[3][4];
printf("4行3列の行列と3行4列の行列の積を求めます。\n");
printf("4行3列の行列を入力して下さい。(数字と数字の間は半角スペース)\n");
for(i = 0; i < 4; i++){
scanf("%d %d %d", &matrix1[i][0], &matrix1[i][1], &matrix1[i][2]);
}
printf("3行4列の行列を入力して下さい。(数字と数字の間は半角スペース)\n");
for(i = 0; i < 3; i++){
scanf("%d %d %d %d", &matrix2[i][0], &matrix2[i][1], &matrix2[i][2], &matrix2[i][3]);
}
printf("4行3列の行列と3行4列の行列の積は\n");
for(k = 0; k < 4; k++){
for(i = 0; i < 4; i++){
for(j = 0; j < 3; j++){
sum = sum + (matrix1[k][j] * matrix2[j][i]); /* sumは,型宣言をするところで0で初期化しているので,安心して足し込んでいける。 */
}
printf("%3d ", sum);
sum = 0; /* 掛け算した結果の別の要素を求めるために,改めて0で初期化している。 */
}
printf("\n");
}
return 0;
}