プログラミング実習II (2025) 課題

[T7] 第6章 配列(2)


(本実習の課題ページ上で問題として記載されたサンプルプログラムは,特に指示がない限りコピー・ペーストして使用してよい.ただし,必要に応じて,インデントなど調整を行うこと)

(T7_1) 配列の要素数と実際のデータの個数が一致しない場合,あるいは配列の要素数が明示されていない場合を考える.

#include <stdio.h>

int main( void )
{

	int a[ 50 ] = { 75, 44, 98, 76, 42, 87, 64, 88, 78, 55, 91, 69, 47, 84, 75, 63, 81, 29, 42, 53, -1, };

	int b[ ] = { 75, 44, 98, 76, 42, 87, 64, 88, 78, 55, 91, 69, 47, 84, 75, 63, 81, 29, 42, 53, };



	return 0;
}


(T7_2) 配列を引数として,関数を呼び出すことができる.以下のプログラムを作成せよ.

下のプログラムは,6 種類の硬貨(1円, 5円, 10円, 50円, 100円, 500円)についてそれぞれの枚数に対して,金額の合計を表示するプログラムである.以下に沿うように完成せよ.


※ 関数の引数に配列を使う方法は教科書 7章および 8章で扱われる.ここでは,引数となっている配列は関数の中で main 関数の中と同様に使用できると考えて解答すればよい.
出力結果の例:
1円が 3枚
5円が 2枚
10円が 0枚
50円が 5枚
100円が 3枚
500円が 1枚

合計は 1063円です.

#include <stdio.h>

#define N 6

/* プロトタイプ宣言,配列の引数の書き方に注意 */
void array_print( int a[], int b[] );
int array_sum( int a[], int b[] );

int main ( void )
{
	int value[ N ] = { 1, 5, 10, 50, 100, 500 };
	int num[ N ] = { 3, 2, 0, 5, 3, 1 };
	int sum;

	printf(" 硬貨の額面,枚数\n ");
	array_print( value, num );

	sum = array_sum( value, num );
	printf(" 硬貨の合計金額は %d 円です\n ", sum);

	return 0;
}

void array_print( int a[], int b[] )  /* 表示を行う関数の本体 */
{
  /* 金額と枚数を順に出力する */
}

int array_sum( int a[], int b[] )     /* 合計を求める関数の本体 */
{
  /* 合計金額を求めて戻り値とする */
}


(T7_3) 教科書 6.5節を読んだ上で,以下のプログラムの出力を予想してレポートに記せ.次に,プログラムを入力,コンパイル・実行して結果を確認せよ.予想が間違った場合はその理由をレポートにて報告すること.

#include <stdio.h>

#define M 3

int main ( void )
{
	int a[ M ][ M ];
	int sum;

	a[0][0] =  2; a[0][1] =  0; a[0][2] = -1;
	a[1][0] = -1; a[1][1] =  2; a[1][2] =  3;
	a[2][0] =  5; a[2][1] =  4; a[2][2] =  3;

	sum = 0;
	for( int i = 0; i < M; i++ ){
		sum += a[ 1 ][ i ];
	}
	printf("%d \n", sum );



	sum = 0;
	for( int i = 0; i < M; i++ ){
		sum += a[ i ][ 2 ];
	}
	printf("%d \n", sum );



	sum = 0;
	for( int i = 0; i < M; i++ ){
		for( int j = 0; j < M; j++ ){
			sum += a[ i ][ j ];
		}
	}
	printf("%d \n", sum );



	sum = 0;
	for( int i = 0; i < M; i++ ){
		for( int j = 0; j < M; j++ ){
			if( (i+j)%2 == 0 )
				sum += a[ i ][ j ];	
		}
	}
	printf("%d \n", sum );


	return 0;
}


(T7_4) 行列の和を求めるプログラムを作成する.

#include <stdio.h>

#define M 3

void print_array( double a[M][M] ){

	// 配列 a を表示.printf の書式は "% 2.1f" など(% の後ろにスペース).


}


int main ( void )
{
	double a[ M ][ M ], b[ M ][ M ], c[ M ][ M ];

	a[0][0] =  2.5; a[0][1] =  0.0; a[0][2] = -1.0;
	a[1][0] = -1.0; a[1][1] =  1.5; a[1][2] =  0.0;
	a[2][0] =  5.0; a[2][1] =  4.0; a[2][2] =  3.0;

	b[0][0] = -2.0; b[0][1] =  4.5; b[0][2] =  1.0;
	b[1][0] =  4.0; b[1][1] = -3.0; b[1][2] =  2.5;
	b[2][0] = -2.5; b[2][1] =  0.0; b[2][2] = -2.0;

	// ここで行列の和を求める

	print_array( c );

	return 0;
}


(T7_5) 正方行列 A に対して,その転置,トレース,フロベニウスノルムを求める関数を作成して,プログラムを完成せよ.

 表示例:

    3  -4   1   7
   -2   1  -6   0
    5   0   4  -3
    1   2   3  -2

   trace = 6, Frobenius norm = 13.564660

 

#include <stdio.h>
#include <math.h>

#define M 4

void transpose( int a[M][M] ){

	int b[M][M];

	// A の転置を求めて表示する.printf の書式は %2d

	// この関数で配列 a の要素を変更しないこと.
	// 変更した場合は,main 関数で参照する配列 a も値が変わってしまう.

}

int comp_trace( int a[M][M] ){


}

double comp_fnorm( int a[M][M] ){


}

int main ( void )
{



	transpose( a );




	printf("trace = %d, Frobenius norm = %f \n",       ,       );

	return 0;
}