レポート課題でわからない問題があります。
問題:入力ファイルmotofile.datを事前に用意し、出力ファイルresult.datを生成するC言語ソースプログラムファイルhensa.cをかけ。
入力/出力ファイルはコマンドライン引数から文字列として取得し、プログラムでは必ず構造体を使用すること。
【result.datの内容】
Grade Name Eng.Math.Sci. Total Mean Hensa
1 Lawler,E.L. 90 85 78 253 84.33 65
2 Jong,K.A. 80 80 91 251 83.67 65
3 Forrest,S. 60 85 100 245 81.67 63
4 Martin,F.G. 80 75 60 215 71.67 54
4 Powell,M.J.D. 90 85 40 215 71.67 54
6 Smith,R.E. 50 75 85 210 70.00 53
7 Reed,J. 50 60 98 208 69.33 52
8 Fletcher,R. 80 65 60 205 68.33 51
9 Holland,J.H. 100 70 33 203 67.67 51
9 Brent,R.P. 30 90 83 203 67.67 51
11 Jones,W.T. 80 65 56 201 67.00 50
12 Richardson,J. 60 70 65 195 65.00 48
13 Wilson,S.W. 50 60 73 183 61.00 45
14 Baker,J.E. 50 40 75 165 55.00 40
15 Ackley,D.H. 50 67 35 152 50.67 36
16 Keller,K.S. 30 40 81 151 50.33 36
17 Goldberg,D.E. 50 40 35 125 41.67 28
Mean of Total = 198.82 Standard Deviation of Total = 34.25
【参考】
N
平均 μ = (1/N) Σ Xi, Xi:i番目の学生の合計点, N:人数
i=1 N
標準偏差 σ = sqrt{(1/N) Σ (Xi - μ)・(Xi - μ)}
i=1
偏差値 Yi = 50 + 10・(Xi - μ)/σ
【実行例】
$ gcc -pedantic -std=c89 -lm -o hensa hensa.c
$ ./hensa motofile.dat result.dat
$ cat result.txt | more
ここで、-lmは数学ライブラリ libm.a のリンクを指示しているが最近のコンパイラでは必要なくなっているケースが多い。
【備考】
平方根の計算にはsprt関数またはpow関数を利用すると便利である。その場合には#include<math.h>とヘッダファイルmath.hの取り込みが必要となる。使い方はdouble sprt(double 数値); double pow(double 底, double 乗数);が参考となる。
C
1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#include <math.h> 5 6#define MAX 20 7#define LEN 15 8 9typedef struct seiseki { 10 char name[LEN]; 11 int eng; 12 int math; 13 int sci; 14 int total; 15 double mean; 16} SEISEKI; 17 18int main(int, char **); 19int input(FILE *, SEISEKI *); 20void output(FILE *, SEISEKI *, int); 21int compare(const SEISEKI *, const SEISEKI *); 22 23int main(int argc, char **argv) 24{ 25 FILE *infile, *outfile; 26 SEISEKI student[MAX]; 27 int number; 28 29 if (argc != 3) { 30 fprintf(stderr, "Example: qtotal motofile.dat insatsu.dat\n"); 31 } 32 if ((infile = fopen(argv[1], "rt")) == NULL) { 33 fprintf(stderr, "Can not open file: %s\n", argv[1]); 34 exit(1); 35 } 36 if ((outfile = fopen(argv[2], "wt")) == NULL) { 37 fprintf(stderr, "Can not open file: %s\n", argv[2]); 38 exit(1); 39 } 40 41 number = input(infile, student); 42 43 qsort(student, number, sizeof(SEISEKI),(int (*) (const void *, const void *))\ 44 compare); 45 46 output(outfile, student, number); 47 48 fclose(infile); fclose(outfile); 49 return 0; 50} 51int input(FILE *infile, SEISEKI *student) 52{ 53 char n[LEN]; 54 int e, m, s, i = 0; 55 56 while (fscanf(infile, "%s %d %d %d", n, &e, &m, &s) != EOF) { 57 strcpy(student[i].name, n); 58 student[i].eng = e; student[i].math = m; student[i].sci = s; 59 student[i].total = e + m + s; 60 student[i].mean = student[i].total / 3.0; 61 i++; 62 } 63 64 return i; 65} 66 67void output(FILE *outfile, SEISEKI *student, int number) 68{ 69 int i; 70 71 for (i = 0; i < number; i++) { 72 SEISEKI *tmp = &student[i]; 73 fprintf(outfile, "%-14s %3d %3d %3d %3d %6.2f\n", tmp->name, tmp->eng, tmp-\ 74>math, tmp->sci, tmp->total, tmp->mean); 75 } 76 77 return; 78} 79 80int compare(const SEISEKI *p, const SEISEKI *q) 81{ 82 return -(p->total - q->total); 83}
上記のコードを書き換えて本課題に取り組もうと思っております。
長々と大変申し訳ありません。。。
この問題が初心者の私には大変難しくてとても困っております。
どなたかC言語に詳しい方でプログラムを書ける方がいましたら、助けていただけると幸いです。よろしくおねがいいたします。
回答1件
あなたの回答
tips
プレビュー