Microsoft Visual Studio 2008で質問があるのですが…
課題で、テキストファイルに各生徒(架空の人物)の学籍番号、各教科の点数書いたファイルを作成し、そのファイルを読み取り、教科ごとと各生徒ごとの平均点、生徒ごとの平均点の高い順から降順に並べたものを画面に出力する(windows¥system~とかいうやつです)プログラムを作ったのですが、そこからさらにまた各生徒の得点分布(ヒストグラム)・偏差値を出力するプログラムの作り方がわかりません。生徒数は10人、教科は5教科としています。
私はあまりこのソフトのことをわかってないので、伝わりにくい文章だったと思いますが、どうか得点分布・偏差値を求めるプログラムの作り方を教えていただけませんでしょうか…?
No.2ベストアンサー
- 回答日時:
/*
ここ最近自分の分割力は非常に下がっているのでソースコードが関数ごとに分かれておらず、
非常に見辛く汚いです。自覚はあるんです。
その代わりコメントは大量に書いたんで許してください。
*/
#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:
関数の分割
マジックナンバーの除去
人数上限の撤廃
*/
}
No.3
- 回答日時:
忘れてた検証に使ったファイル。
最後の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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- 数学 データの分析と標準偏差 5 2022/03/25 12:55
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) マクロか関数で処理したいのですが、教えて頂けませんか。 8 2022/10/31 15:18
- 中学校受験 中学受験 3 2022/11/13 21:17
- 高校受験 夏休み、本気で勉強を頑張りたい 2 2022/07/03 16:33
- 統計学 信頼区間についての質問です。 6 2023/06/25 17:34
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- C言語・C++・C# visual studioでフォームデザインを作成する時のVB.netとC#の違い 2 2023/06/22 03:04
- 高校受験 中学3年生です。 もう1月からの受験勉強の方法を教えて頂きたいです。 恥ずかしいことながら今まで受験 4 2023/01/04 21:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
C言語に関する質問です
-
万年カレンダーのC言語プログラ...
-
【C言語教えてください】sin波...
-
文字を動かしたい
-
球の体積と表面積を表示するプ...
-
ホームページをC言語で作りたい...
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
printf で二進表示を行いたい。
-
C言語
-
%P と %X の違い
-
改行について 1行に何個かづ...
-
円の面積を求めるプログラミン...
-
C言語で入力した変数の値から三...
-
unsigned int型について
-
c言語で2000年以降カレンダーを...
-
C言語 文字列の比較 compare
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語について
-
printf で二進表示を行いたい。
-
cshの文字列操作(0埋め)
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
テキストカーソル位置の取得
-
strcmp
-
unsigned int型について
-
c言語でAからZまでを表示する...
-
printf( " %2d", p * q );
-
コマンドラインに出力した文字...
-
printfの出力内の文字をdefine...
-
ホームページをC言語で作りたい...
-
コマンドプロンプトがすぐ消える
-
小数点切捨て表示
-
【C言語教えてください】sin波...
-
switch分のケースを範囲数?に...
-
二つの整数値の大小比較
-
4の倍数を論理演算で表す。。
-
defineで定数が置き換えられな...
おすすめ情報