表の水色の部分のデータを二次元配列として定義する。
出席番号 | 語学 | 力学 | 合計 |
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);
}
課題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);
}
}
(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);
}
}