第11回:二次元配列 演習解答

課題1

表の水色の部分のデータを二次元配列として定義する。

出席番号  語学   力学 合計
1 65 71
2 84 83
3 74 74
4 90 90
5 87 78
6 93 95
平均点

(1) 各人の2科目の合計点を計算し,画面に表示する。

(2) 各科目の平均点を計算し,画面に表示する。(配列に格納する必要はない)

(3) 配列の定義を一次元配列に置き換えて,コンピュータの中で二次元配列がどのように扱われているのか,確認する。


/* 課題1 */
#include <stdio.h>

void main()
{
	int i;
	int sum0=0, sum1=0;
	int seiseki[6][2]={ {65, 71 } ,
                    {84, 83 } ,
                    {74, 74 } ,
                    {90, 90 } ,
                    {87, 78 } ,
                    {93, 95 }  };

/* (1) 各人の合計点 */
	for(i=0; i<6; i++){
		printf("%d番目の合計点:%d点¥n", i, seiseki[i][0]+seiseki[i][1]);
	}

/* (2) 各科目の平均点 */
	for(i=0; i<6; i++){
		sum0+=seiseki[i][0];
		sum1+=seiseki[i][1];
	}
		printf("語学の平均点:%.1f点¥n", (float)sum0/6);
		printf("力学の平均点:%.1f点¥n", (float)sum1/6);
}

課題(3)


/* 課題1-2 */
#include <stdio.h>

void main()
{
	int i;
	int sum0=0, sum1=0;
	int seiseki[12]={ 65, 71, 84, 83, 74, 74, 90, 90, 87, 78, 93, 95};


/* (1) 各人の合計点 */
	for(i=0; i<6; i++){
		printf("%d番目の合計点:%d点¥n", i, seiseki[2*i]+seiseki[2*i+1]);
	}

/* (2) 各科目の平均点 */
	for(i=0; i<6; i++){
		sum0+=seiseki[2*i];
		sum1+=seiseki[2*i+1];
	}
		printf("語学の平均点:%.1f点¥n", (float)sum0/6);
		printf("力学の平均点:%.1f点¥n", (float)sum1/6);
}

課題3

課題1において,氏名がデータとして与えられたとき,各人の名前と平均点を表示する方法を考えよ。

出席番号 名前  語学   力学 平均点
1 佐藤 65 71
2 鈴木 84 83
3 高橋 74 74
4 田中 90 90
5 渡辺 87 78
6 伊藤 93 95

名前と点数は,型が異なるため一つの配列では扱えません。名前用の配列と点数用の配列を用意する。
また,名前には文字列型を使いますが,文字列型の配列は,二次元配列となり以下のように定義します。

char 変数名[配列の要素番号][各要素の最大文字数];

各要素には,変数名[要素番号]でアクセスできます。

 


/* 課題3 */
#include <stdio.h>

void main()
{
	int i;
	char name[6][10]={"佐藤","鈴木","高橋","田中","渡辺","伊藤"};
	int seiseki[6][2]={ {65, 71 } ,
                    {84, 83 } ,
                    {74, 74 } ,
                    {90, 90 } ,
                    {87, 78 } ,
                    {93, 95 }  };

/* 各人の名前と平均点 */
	for(i=0; i<6; i++){
		printf("%d番目 名前:%s,平均点:%.1f\n",
		 i, name[i],(float)(seiseki[i][0]+seiseki[i][1])/2);
	}

}

課題4

(1)50人分の名前とテスト結果をファイル(50data.txt)から読み込み,画面に表示せよ。
(2)平均点,標準偏差を求めよ。
(3)各人の偏差値を求めて,名前と偏差値を画面に表示しなさい。

偏差値


/* 課題4 */
#include <stdio.h>
#include <math.h> /* sqrt関数を使うため */

void main()
{
	FILE *fp;
	int i, sum=0, sum2=0;
	float ave, dev;
	char name[50][10];
	int seiseki[50];

/* (1)ファイルから読み込む */
	fp = fopen("50data.txt","r");
	
	for(i=0; i<50; i++){
		fscanf(fp, "%s %d", &(name[i]), &(seiseki[i]));
		printf("%s %d¥n", name[i], seiseki[i]);
	}
	
	fclose(fp);

/* (2)平均点標準偏差の算出 */
    /* 平均点を求める */
	for(i=0; i<50; i++){
		sum+=seiseki[i];
	}
	ave = (float)sum/50;
	
    /* 平均点を用いて分散を求め,標準偏差を求める */
	for(i=0; i<50; i++){
		sum2+=(seiseki[i]-ave)*(seiseki[i]-ave);
	}
	
	dev = sqrt((float)sum2/50);
	
	printf("平均点:%.1f,標準偏差:%.1f¥n", ave, dev);

/* (3)偏差値の算出 */
	for(i=0; i<50; i++){
		printf("%s %.1f¥n", name[i], 10*(seiseki[i]-ave)/dev+50);
	}
}