第11回演習の解答例


(1)と(2)には以下の成績表を使って答えよ.

出席番号 語学  材料力学 熱力学機械力学流体力学 合計  平均点 
16571748297--
28483746465--
37474788078--
49090909090--
58778856088--
69395949295--

(1)まず,各人の合計と平均値を順次計算するプログラムを作る.
   (計算前と計算結果を両方表示すること)


#include <stdio.h>

void main()
{
	float bangou[6]={1, 2, 3, 4, 5, 6 };
	float seiseki[6][5]={ {65, 71, 74, 82, 97 } ,
                    	    {84, 83, 74, 64, 65 } ,
                            {74, 74, 78, 80, 78 } ,
                            {90, 90, 90, 90, 90 } ,
                            {87, 78, 85, 60, 88 } ,
                            {93, 95, 94, 92, 95 }  };
      float sum[6]={0, 0, 0, 0, 0, 0 };
      float ave[6]={0, 0, 0, 0, 0, 0 };
	int i,j;

	printf("番号¥t語学¥t材力¥t熱力¥t機力¥t流力¥t合計¥t平均¥n");

	for(i=0;i<6;i++){
		printf("%.1f¥t",bangou[i]);
		for(j=0;j<5;j++){
			printf("%.1f¥t",seiseki[i][j]);
		}
		printf("%.1f¥t",sum[i]);
		printf("%.1f¥t",ave[i]);
		printf("¥n");
	}

      for(i=0;i<6;i++){
		for(j=0;j<5;j++){
			sum[i] += seiseki[i][j];
			ave[i] += seiseki[i][j]/5;
		}
	}
	
	printf("¥n");
	
	printf("番号¥t語学¥t材力¥t熱力¥t機力¥t流力¥t合計¥t平均¥n");

	for(i=0;i<6;i++){
		printf("%.1f¥t",bangou[i]);
		for(j=0;j<5;j++){
			printf("%.1f¥t",seiseki[i][j]);
		}
		printf("%.1f¥t",sum[i]);
		printf("%.1f¥t",ave[i]);
		printf("¥n");
	}
}


(2)結果(総合得点もしくは平均)を成績の良い順番に並べ替え,表示してみよう.
    (番号と結果両方表示すること)


#include <stdio.h>

void main()
{
	float bangou[6]={1, 2, 3, 4, 5, 6 };
	float seiseki[6][5]={ {65, 71, 74, 82, 97 } ,
                    	    {84, 83, 74, 64, 65 } ,
                            {74, 74, 78, 80, 78 } ,
                            {90, 90, 90, 90, 90 } ,
                            {87, 78, 85, 60, 88 } ,
                            {93, 95, 94, 92, 95 }  };
      float sum[6]={0, 0, 0, 0, 0, 0 };
      float ave[6]={0, 0, 0, 0, 0, 0 };
	int i,j;
	int tmp;

	printf("番号¥t語学¥t材力¥t熱力¥t機力¥t流力¥t合計¥t平均¥n");

	for(i=0;i<6;i++){
		printf("%.1f¥t",bangou[i]);
		for(j=0;j<5;j++){
			printf("%.1f¥t",seiseki[i][j]);
		}
		printf("%.1f¥t",sum[i]);
		printf("%.1f¥t",ave[i]);
		printf("¥n");
	}

      for(i=0;i<6;i++){
		for(j=0;j<5;j++){
			sum[i] += seiseki[i][j];
			ave[i] += seiseki[i][j]/5;
		}
	}
	
	printf("¥n");
	
	printf("番号¥t語学¥t材力¥t熱力¥t機力¥t流力¥t合計¥t平均¥n");

	for(i=0;i<6;i++){
		printf("%.1f¥t",bangou[i]);
		for(j=0;j<5;j++){
			printf("%.1f¥t",seiseki[i][j]);
		}
		printf("%.1f¥t",sum[i]);
		printf("%.1f¥t",ave[i]);
		printf("¥n");
	}

	for(i=0;i<5;i++){
		for(j=i+1;j<6;j++){
			if(ave[i]<ave[j]){
				tmp = ave[i];
				ave[i] = ave[j];
				ave[j] = tmp;
				
				tmp = bangou[i];
				bangou[i] = bangou[j];
				bangou[j] = tmp;
			}
		}
	}
	printf("¥n");
      printf("成績の良い順番に並べると・・・¥n¥n");
      printf("番号¥t平均¥n");
      for(i=0;i<6;i++){
		printf("%.0f¥t%.1f¥n", bangou[i], ave[i]);
	}

}


(3)以下の表で”1”の箇所には黒の代わりに”x”を、”0”の箇所には白の代わりに”スペース”を画面に表示するようなプログラムを組もう.


#include <stdio.h>

void main()
{
	int seiseki[8][8]={ {1, 0, 0, 0, 0, 0, 0, 1 } ,
                    	  {0, 1, 0, 0, 0, 0, 1, 0 } ,
                          {0, 0, 1, 0, 0, 1, 0, 0 } ,
                          {0, 0, 0, 1, 1, 0, 0, 0 } ,
                          {0, 0, 0, 1, 1, 0, 0, 0 } ,
                          {0, 0, 1, 0, 0, 1, 0, 0 } ,
                          {0, 1, 0, 0, 0, 0, 1, 0 } ,
                          {1, 0, 0, 0, 0, 0, 0, 1 }  };
	int i, j;

	for(i=0;i<8;i++){
		for(j=0;j<8;j++){
			if(seiseki[i][j]==1){
				printf("x");
			} else {
				printf(" ");
			}
		}
		printf("¥n");
	}
}


(4)(3)で画面に表示した画像の白黒を反転させてみよう.


#include <stdio.h>

void main()
{
	int seiseki[8][8]={ {1, 0, 0, 0, 0, 0, 0, 1 } ,
                    	  {0, 1, 0, 0, 0, 0, 1, 0 } ,
                          {0, 0, 1, 0, 0, 1, 0, 0 } ,
                          {0, 0, 0, 1, 1, 0, 0, 0 } ,
                          {0, 0, 0, 1, 1, 0, 0, 0 } ,
                          {0, 0, 1, 0, 0, 1, 0, 0 } ,
                          {0, 1, 0, 0, 0, 0, 1, 0 } ,
                          {1, 0, 0, 0, 0, 0, 0, 1 }  };
	int i, j;

	for(i=0;i<8;i++){
		for(j=0;j<8;j++){
			if(seiseki[i][j]==1){
				printf(" ");
			} else {
				printf("x");
			}
		}
		printf("¥n");
	}
}


(5)三目並べのプログラムを組もう.
     今回は,1君と2さんの二人で交互に遊べるようなプログラムを組んでみましょう.
  (3行3列の二次元配列を用意し0で初期化し,6回くらい繰り返すようにしなさい.)


#include <stdio.h>

void main()
{
	int sanmoku[3][3]={ {0, 0, 0 } ,
                          {0, 0, 0 } ,
                          {0, 0, 0 }  };
	int a, b, c;
      int i, j, k;

	for(i=0;i<6;i++){
		scanf("%d",&a);
		scanf("%d",&b);
		scanf("%d",&c);
		printf("¥n");
		
		sanmoku[a][b]=c;

		for(j=0;j<3;j++){
			for(k=0;k<3;k++){
				printf("%d ",sanmoku[j][k]);
			}
			printf("¥n");
		}
		
		printf("¥n");
		
	}
}



スーパーアドバンスドステップ

(5)で組んだプログラムに

 ・入力エラーチェック

 ・勝ち負け判定を

を加えてみよう!!


#include <stdio.h>

void main()
{
	int sanmoku[3][3]={ {0, 0, 0 } ,
                          {0, 0, 0 } ,
                          {0, 0, 0 }  };
	int a, b, c;
      int i, j, k;

	for(i=0;i<9;i++){
		scanf("%d",&a);
		scanf("%d",&b);
		scanf("%d",&c);
		printf("¥n");
		
		if(a!=0 && a!=1 && a!=2){
			printf("入力エラーです¥n");
			i--;
		} else if(b!=0 && b!=1 && b!=2){
			printf("入力エラーです¥n");
			i--;
		} else if(c!=1 && c!=2){
			printf("入力エラーです¥n");
			i--;
		}else if(sanmoku[a][b]!=0){
			printf("入力エラーです¥n");
			i--;
		} else{
		
			sanmoku[a][b]=c;

			for(j=0;j<3;j++){
				for(k=0;k<3;k++){
					printf("%d ",sanmoku[j][k]);
				}
				printf("¥n");
			}
			
		}
		printf("¥n");
		
		if(sanmoku[0][0]==1 && sanmoku[0][1]==1 && sanmoku[0][2]==1){
			printf("1君の勝ちです¥n");
			i=9;
		} else if(sanmoku[1][0]==1 && sanmoku[1][1]==1 && sanmoku[1][2]==1){
			printf("1君の勝ちです¥n");
			i=9;
		} else if(sanmoku[2][0]==1 && sanmoku[2][1]==1 && sanmoku[2][2]==1){
			printf("1君の勝ちです¥n");
			i=9;
		} else if(sanmoku[0][0]==1 && sanmoku[1][0]==1 && sanmoku[2][0]==1){
			printf("1君の勝ちです¥n");
			i=9;
		} else if(sanmoku[0][1]==1 && sanmoku[1][1]==1 && sanmoku[2][1]==1){
			printf("1君の勝ちです¥n");
			i=9;
		} else if(sanmoku[0][2]==1 && sanmoku[1][2]==1 && sanmoku[2][2]==1){
			printf("1君の勝ちです¥n");
			i=9;
		} else if(sanmoku[0][0]==1 && sanmoku[1][1]==1 && sanmoku[2][2]==1){
			printf("1君の勝ちです¥n");
			i=9;
		} else if(sanmoku[0][2]==1 && sanmoku[1][1]==1 && sanmoku[2][0]==1){
			printf("1君の勝ちです¥n");
			i=9;
		} else if(sanmoku[0][0]==2 && sanmoku[0][1]==2 && sanmoku[0][2]==2){
			printf("2さんの勝ちです¥n");
			i=9;
		} else if(sanmoku[1][0]==2 && sanmoku[1][1]==2 && sanmoku[1][2]==2){
			printf("2さんの勝ちです¥n");
			i=9;
		} else if(sanmoku[2][0]==2 && sanmoku[2][1]==2 && sanmoku[2][2]==2){
			printf("2さんの勝ちです¥n");
			i=9;
		} else if(sanmoku[0][0]==2 && sanmoku[1][0]==2 && sanmoku[2][0]==2){
			printf("2さんの勝ちです¥n");
			i=9;
		} else if(sanmoku[0][1]==2 && sanmoku[1][1]==2 && sanmoku[2][1]==2){
			printf("2さんの勝ちです¥n");
			i=9;
		} else if(sanmoku[0][2]==2 && sanmoku[1][2]==2 && sanmoku[2][2]==2){
			printf("2さんの勝ちです¥n");
			i=9;
		} else if(sanmoku[0][0]==2 && sanmoku[1][1]==2 && sanmoku[2][2]==2){
			printf("2さんの勝ちです¥n");
			i=9;
		} else if(sanmoku[0][2]==2 && sanmoku[1][1]==2 && sanmoku[2][0]==2){
			printf("2さんの勝ちです¥n");
			i=9;
		}
	}
}