プログラミング実習II 期末試験・想定問題 [S5] 配列

プログラミング実習II 期末試験・想定問題 [S5] 配列


(S5_1) 以下のプログラムをコンパイル・実行したときの出力がキーボードから入力される値によりどのように変わるかを答えよ.

#include <stdio.h>
#define N 5

int main(void)
{
    int i;
    int tray[ N ];

    tray[0] = 15;
    tray[1] = 200;
    tray[2] = 18;
    tray[3] = 55;
    tray[4] = 30;

    printf("文房具の番号を入力して下さい>>> ");
    scanf( "%d" , &i );

    if( ( i <= 0 ) || ( i > 5) )
        printf( " 1 から 5 までの数字を入力して下さい\n");
    else
        printf( " %d 個の在庫があります\n", tray[i-1] );

    return 0;
}

(S5_2) 以下のプログラムをコンパイル・実行したときの出力がキーボードから入力される値によりどのように変わるかを答えよ.

#include <stdio.h>
#define N 10

int main(void)
{
    int i;
    int array[ N ];
    int bias[ N ];
    int sum[ N ];

    for( i = 0; i < N; i++ )
        array[ i ] = i;

    for( i = 0; i < N; i++ ){
        if( i % 2 == 0 )
            bias[ i ] = 1;
        else
            bias[ i ] = -1;
    }

    for( i = 0; i < N; i++ )
        printf(" %d  %d \n", i, array[i] + bias[i] );

    return 0;
}

(S5_3) 2次元配列 matrix が2次正方行列の成分を格納しているとする.このとき,その行列の行列式とトレース(対角成分の和)を計算して出力するプログラムを完成せよ.

#include <stdio.h>
#define N 2

int main(void)
{
    int matrix[N][N];
    int determinant, trace;

    printf("(1, 1)成分を入力して下さい>>> ");
    scanf( "%d" , &matrix[0][0] );
    printf("(1, 2)成分を入力して下さい>>> ");
    scanf( "%d" , &matrix[0][1] );
    printf("(2, 1)成分を入力して下さい>>> ");
    scanf( "%d" , &matrix[1][0] );
    printf("(2, 2)成分を入力して下さい>>> ");
    scanf( "%d" , &matrix[1][1] );



    printf("行列式は %d,トレースは %d です.\n", determinant, trace);

    return 0;
}

(S5_4)★ 以下のソースコードは,「各列ごとに数値を入力すると,各列の数値の行に"*"が表示される」プログラムである. これをマクロ定数を用いた形式に書き換えなさい. なお,マクロ定数の値を変更した場合,その数値に応じた数の入力と表示ができるようにすること.

#include <stdio.h>
#include <limits.h>


//ここにマクロ定数の定義を記述する


//プロトタイプ宣言
void setArrayValue( int a[], int i, int value);
void print_graph( int result[] );

int main( int argc, const char **argv ){

	int point[5];
	int i;
	int x;

	for(i = 0 ; i < 5; i++){
		//値の入力
		printf( "%2d 列目の位置を入力してください >>>" , i + 1 );
		scanf( "%d", &x );

		setArrayValue( point, i, x);
	}

	//内容の表示
	print_graph( point );

	return 0;
}

//値を配列に格納
void setArrayValue( int a[], int i, int value ){

	a[i] = value;

}

//配列内の最大値を求める
int ArrayMax( int a[] ){

	int i;
	int max = -INT_MAX;

	for( i = 0; i < 5; i++){
		if( max < a[i] ) max = a[i];
	}

	return max;
}

//配列内容を表示
void print_graph( int result[] ){

	int i, j;
	int max = ArrayMax( result );

	for(i = 0;i < max;i++){
		for( j = 0; j < 5; j++){
			if( result[j] == i + 1 ) printf( " * ");
			else printf(" - ");
		}
		printf("\n");
	}

}

(S5_5)★ 以下のプログラムをコンパイル・実行したときの出力を示せ.
#include <stdio.h>

#define	M 3
#define	N 3

int main( void )
{
	int i, j;
	int a[M][N];

	a[0][0]=1, a[0][1]=2, a[0][2]=3;
	a[1][0]=4, a[1][1]=5, a[1][2]=6;
	a[2][0]=5, a[2][1]=0, a[2][2]=5;

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

	for( i = 0; i < M;i++ )
	{
		a[1][i]=(a[1][i]-4*a[0][i])/(-3);
		a[2][i]=(a[2][i]-5*a[0][i])/(-10);
	}

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

	for( i = 0; i < M;i++ )
	{
		a[0][i]=(a[0][i]-2*a[1][i]);
		a[2][i]=(a[2][i]-  a[1][i])*(-1);
	}

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

	for( i = 0; i < M;i++ )
	{
		a[0][i]=(a[0][i]+a[2][i]);
		a[1][i]=(a[1][i]-2*a[2][i]);
	}

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

	return 0;
}

(S5_6)★★ 3×3のマインスイーパーを作成しなさい。爆弾の位置をキーボードから数個入力し、その後、x,yの場所を入力することで、アウトまたは、セーフという表示を出しなさい。

(S5_7)★★ 次のプログラムを作成せよ。 6個の文字('b', 'w', 'k', 'z', 'j', 'a')をchar型配列letterに(順番通りに)格納し、 [リスト 6.9]を参考に交換法を用いて配列の要素をアルファベット順に並び替えろ。 並び替えた配列letterを出力し、'a', 'b', 'j', 'k', 'w', 'z' の順番になっていることを確認せよ。

(S5_8)★★ 6個の文字('b', 'w', 'k', 'z', 'j', 'a')を要素とするarray[]を宣言段階で初期化せよ。配列のサイズとその配列を引数とし、配列の要素を昇順に並び変える関数sort(int arraySize, int array[])と、それを表示する関数output(int arraySize, int array)を作成し、それぞれをmain分から呼び出すプログラムを作成せよ。(ソートの関数は「2.」を利用するとよい)