テキスト130ページの演習5-9

解答例その1


#include <stdio.h>

int main(void)
{
    int i;
    int a[5];
    int b[5];
	
	for (i = 0; i < 5; i++) {
		printf("a[%d]:", i);
		scanf("%d", &a[i]);
	}

    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);
}

解答例その2


#include <stdio.h>

int main (void)
{
    int i;
    int a[5];
    int b[5];
	
    for (i = 0; i < 5; i++) {
	    printf("a[%d]:", i);
	    scanf("%d", &a[i]);
    }

    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);
}

解答例その3

カウント用の変数を二つ用いる例
プログラムで何を行っているかが非常に分かりやすくなる(Excellent!!)

#include <stdio.h>

int main(void)
{
    int i;
    int a[5];
    int b[5];
	
	for (i = 0; i < 5; i++) {
		printf("a[%d]:", i);
		scanf("%d", &a[i]);
	}

	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);
}


テキスト135ページの演習5-10

解答例その1


#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) ;
}

解答例その2

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;
}

解答例その3

掛け算の結果を収める行列を,式文によって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;
}

解答例その4

掛け算した結果を,ダイレクトに画面表示している例。掛け算した結果を収める行列を別に準備してもよかったか?

#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;
}