1回目の課題


課題1−1

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

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

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

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

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

#include <stdio.h>

int 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);
 }
 return 0;
}

課題1−2

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

偏差値

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

 int 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);
 }
 return 0;
}

課題2−1 課題1−1を構造体を用いて書き直しなさい。

#include <stdio.h>

struct seiseki{
 char name[10];
 int lang;
 int phy;
};

void main() {
 int i;
 struct seiseki a[] ={
   {"佐藤", 65, 71},
  {"鈴木", 84, 83},
  {"高橋", 74, 74},
  {"田中", 90, 90},
  {"渡辺", 87, 78},
  {"伊藤", 93, 95}
 }; /* 各人の名前と平均点 */

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

課題2−2 課題1−2を構造体を用いて書き直しなさい。

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

struct test{
 char name[10];
 int score;
};

 int main() {
 FILE *fp;
 int i, sum=0;
 float ave, bun, dev;
 struct test seiseki[50];

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

 /* (2)平均点標準偏差の算出 */
 for(i=0; i<50; i++){
   sum+=seiseki[i].score;
 }
 ave = (float)sum/50;
 for(i=0; i<50; i++){
   bun+=(seiseki[i].score-ave)*(seiseki[i].score-ave);
 }
 bun /= 50;
 dev = sqrt(bun);
 printf("平均点:%.1f,標準偏差:%.1f\n", ave, dev);

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