冬休み前に行った演習の,解答です.
プログラム作成の手順
1.ここでは,人数があらかじめ100人とわかっているとして,手始めに平均点だけを求めることを考えよう.
2.次に,標準偏差を求めてみよう.
3.各人の偏差値を求める準備として,うえのプログラムを改良してデータを配列に読み込んでから平均値を求めてみよう.
ここまでは,前回解説しました.
4.次に各点数の偏差値を求めてみよう.
ファイルからデータを読み込めてしまえば,もう一度やったことのあるプログラムと同じです.
偏差値の求め方:
偏差値=(得点−平均値)/標準偏差*10+50
#include <stdio.h> #include <math.h> void main() { int i; int data[100], hensa[100]; float sum=0, sum2=0, ave, sigma; FILE *fp; fp = fopen("testdata.txt", "r"); if(fp == NULL) return; sum = 0; for(i = 0; i<100; i++){ fscanf(fp, "%d", &(data[i])); sum += data[i]; sum2 += data[i] * data[i]; } fclose(fp); ave = sum / 100; sigma = sqrt((100 * sum2 - (sum * sum)) / 100 /(100 - 1)); printf("平均値=%f\n", ave); printf("標準偏差=%f\n", sigma); for(i =0; i<100; i++){ hensa[i] = (data[i] - ave) / sigma * 10 + 50; printf("%d 番目の人の偏差値: %f\n", i+1, hensa[i]); } }
5.入力されたアルファベットの小文字の文字列をabc順に並べ替えるプログラムを参考にして,成績のよい順に並べ替えてみよう.
........ void swap(int *a, int *b) { int t; t = *a; *a = *b; *b = t; } void sort(int *s, int n) { int i, j; for(i=0; i < n-1; i++){ for(j=i+1; j < n; j++){ if(s[i] > s[j]){ swap(&(s[i]), &(s[j])); } } } } ........ sort(data, 100); ........
実行例:
0-9:12人
10-19:14人
20-29:9人
....
100:1人
2. 各得点の順位を求めよ.ただし,同じ点数の者が2名いたら,次の点数の者の順位は,一つ飛ぶ.
たとえば,47点が53位で,47点の者が2名いたとすると,46点の者は,55位となる.