- ベストアンサー
Microsoft Visual Studio 2008での得点分布・偏差値を求めるプログラムの作り方
- Microsoft Visual Studio 2008で質問があるのですが、課題でテキストファイルに各生徒の学籍番号と教科の点数を書いたファイルを作成し、そのファイルを読み取って教科ごとと生徒ごとの平均点、生徒ごとの平均点の高い順に降順で表示するプログラムを作成しました。しかし、得点分布と偏差値を求めるプログラムの作り方がわかりません。生徒数は10人、教科は5教科です。
- 私はMicrosoft Visual Studio 2008をあまり理解していないため、文章が伝わりにくいかもしれませんが、得点分布と偏差値を求めるプログラムの作り方を教えてください。
- また、SEOを意識したタイトルとハッシュタグを生成しました。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
/* ここ最近自分の分割力は非常に下がっているのでソースコードが関数ごとに分かれておらず、 非常に見辛く汚いです。自覚はあるんです。 その代わりコメントは大量に書いたんで許してください。 */ #include <stdio.h> #include <math.h> typedef struct student{ char id[8]; //IDは桁数固定の[0-9]のみからなる文字列。7桁とnull文字で8 int english; //英語。 int math; //数学。 int science; //理科。 int demon;// 外道力。 int through; //スルー力。 /* 本当はアレげ力が欲しかったけど訳が思いつかず断念。*/ //本当は上記得点決定をコンストラクタだけにして、ここを読み取りに死たいんだけど //C言語普段使ってなくて調べるのが面倒なので却下。 int total; } student; int main () { student s[30]; /* 人数を動的に確保したいのでstd::vectorとかC#List<student>使いたいけど、そんなのがあるか知らない。*/ student temp; /* 合計点を保持 */ student temp2; /* 並び替えの時の交換用 */ double stddev; /* 標準偏差 */ FILE * pFile; int n; /* 受験者数 */ int x; /* ヒストグラムの人数測定 */ /* ループ変数。VC++ 2008でやっているけど、 C言語ってループ変数のスコープ限定出来ないって聞いた気がするから。 ちゃんと初期化すれば使いまわしOKと考えています。 */ int i,j; pFile = fopen ("c:\\aaa.txt","r"); rewind (pFile); n = 0; while(!feof(pFile)){ fscanf (pFile, "%7s %d %d %d %d %d\n", &(s[n].id[0]),&(s[n].english),&(s[n].math),&(s[n].science),&(s[n].demon),&(s[n].through) ); n++; } fclose (pFile); /*生徒別平均点を求めて表示*/ for(i = 0;i < n;i++){ s[i].total = s[i].english + s[i].math + s[i].science + s[i].demon + s[i].through; printf("出席番号%sの全科目平均点は%.1lf点です。\n",s[i].id,((double)(s[i].total)) / 5); } printf("\n"); /*科目別平均点*/ temp.english = 0; temp.math = 0; temp.science = 0; temp.demon = 0; temp.through = 0; temp.total = 0; /* 演算子のオーバーロードってCで出来るのかなぁ? */ for(i = 0;i < n;i++){ /* 初期化されてねーよ?って警告出るけど、char配列の扱いや構造体の扱いのサイト見る限り 特にそういう処理もなさそうだから問題ないよね? */ temp.english += s[i].english; temp.math += s[i].math; temp.science += s[i].science; temp.demon += s[i].demon; temp.through += s[i].through; temp.total += s[i].total; } printf("全生徒の英語の平均点:%.1lf\n",((double)(temp.english)) / n); printf("全生徒の数学の平均点:%.1lf\n",((double)(temp.math)) / n); printf("全生徒の理科の平均点:%.1lf\n",((double)(temp.science)) / n); printf("全生徒の外道力の平均点:%.1lf\n",((double)(temp.demon)) / n); printf("全生徒のスルー力の平均点:%.1lf\n",((double)(temp.through)) / n); printf("\n"); /* 平均点 = 総合得点の高さ。いちいち平均点を計算するのが面倒なので、総合点順に並び替える */ /* 選択ソート */ for(i = 0; i < n - 1;i++){ for(j = i + 1;j < n; j++){ if (s[i].total < s[j].total){ temp2 = s[j]; s[j] = s[i]; s[i] = temp2; } } } printf("好成績順:\n"); for(i = 0;i < n;i++){ s[i].total = s[i].english + s[i].math + s[i].science + s[i].through + s[i].demon; printf("出席番号%sの全科目平均点は%.1lf点です。\n",s[i].id,((double)(s[i].total)) / 5); } /* 標準偏差を求める */ /* http://ja.wikipedia.org/wiki/%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE */ /* を参考に不偏分散を求めていますが「母集団が十分に大きく」と言えるかはわかりません。 */ /* http://ja.wikipedia.org/wiki/%E5%AD%A6%E5%8A%9B%E5%81%8F%E5%B7%AE%E5%80%A4 */ /* 「分布が正規分布から離れると誤差が大きくなる。」の誤差の検討は行いません。 */ stddev = 0; for(i = 0;i < n;i++){ stddev += pow(((double)(s[i].total)- (double)(temp.total)),2.0); } /* nが1の時の除外は面倒だから省略 */ stddev = (stddev) / (n - 1); /* 面倒だったんでファイルの元の順番を保っていません。好成績順です。*/ for(i = 0;i < n;i++){ printf("出席番号%sの偏差値は%.5lfです。\n",s[i].id , ((double)(s[i].total) - (((double)(temp.total)) / n)) / stddev * 10 + 50); } printf("\n"); /* ヒストグラム */ printf("得点分布\n"); for(i = 0;i < 500 / 50; i++){ x = 0; for ( j = 0; j < n ; j++){ if((i * 50 <= s[j].total) && (s[j].total < (i + 1) * 50)){ x = x + 1; } } printf("[%3d-%3d]",i*50,(i+1)*50-1); for (j = 0;j < x;j++){ printf("*"); } printf("\n"); } for ( j = 0; j < n ; j++){ if(s[j].total == 100 * 5){ x = x + 1; } } printf("[%3d ]",500); for (j = 0;j < x;j++){ printf("*"); } printf("\n"); return 0; /* やらないけど TODO: 関数の分割 マジックナンバーの除去 人数上限の撤廃 */ }
その他の回答 (2)
- himajin100000
- ベストアンサー率54% (1660/3060)
忘れてた検証に使ったファイル。 最後の100の直後にLFがあります ============================ 1654287 50 70 45 28 100 3468100 35 42 56 42 100 0349735 20 38 99 37 100 2647891 75 60 65 61 100 6267564 48 38 33 48 100 3861547 62 46 65 35 100 2222222 73 75 58 71 100 5151515 65 58 42 46 100 3862735 59 39 37 50 100 4442444 90 91 61 66 100
- himajin100000
- ベストアンサー率54% (1660/3060)
言語が何か言ってくれないと何も回答出来ないよ。 #Visual Studioは複数の言語サポートする
補足
すいません。 C言語です