プロが教えるわが家の防犯対策術!

Microsoft Visual Studio 2008で質問があるのですが…

課題で、テキストファイルに各生徒(架空の人物)の学籍番号、各教科の点数書いたファイルを作成し、そのファイルを読み取り、教科ごとと各生徒ごとの平均点、生徒ごとの平均点の高い順から降順に並べたものを画面に出力する(windows¥system~とかいうやつです)プログラムを作ったのですが、そこからさらにまた各生徒の得点分布(ヒストグラム)・偏差値を出力するプログラムの作り方がわかりません。生徒数は10人、教科は5教科としています。

私はあまりこのソフトのことをわかってないので、伝わりにくい文章だったと思いますが、どうか得点分布・偏差値を求めるプログラムの作り方を教えていただけませんでしょうか…?

A 回答 (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% … */
/* を参考に不偏分散を求めていますが「母集団が十分に大きく」と言えるかはわかりません。 */

/* http://ja.wikipedia.org/wiki/%E5%AD%A6%E5%8A%9B% … */
/* 「分布が正規分布から離れると誤差が大きくなる。」の誤差の検討は行いません。 */

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:
関数の分割
マジックナンバーの除去
人数上限の撤廃


*/
}
    • good
    • 0

忘れてた検証に使ったファイル。


最後の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
    • good
    • 0

言語が何か言ってくれないと何も回答出来ないよ。



#Visual Studioは複数の言語サポートする

この回答への補足

すいません。
C言語です

補足日時:2010/01/15 02:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!