質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

4685閲覧

準備された入力ファイルをもとに、合計、平均、偏差値を表示(合計点降順)させたプログラム作成

xxxxxxx

総合スコア50

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/12/27 13:03

レポート課題でわからない問題があります。
問題:入力ファイル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言語に詳しい方でプログラムを書ける方がいましたら、助けていただけると幸いです。よろしくおねがいいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

大まかな流れです。

  1. ファイルをオープンする。
  2. 得点データを読み込む、人数を数える、合計を求める、構造体に保存
  3. 合計を人数で割って平均点を求める
  4. 得点と平均点から標準偏差を求める
  5. 各人の得点から平均点から人の偏差値を求める
  6. ファイルに書き出す

お答えではありませんが、参考プログラムです。大筋上記の流れで作成されています。

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 int hensa; 17} SEISEKI; 18 19int main(int, char **); 20int input(FILE *, SEISEKI *); 21void output(FILE *, SEISEKI *, int); 22int compare(const SEISEKI *, const SEISEKI *); 23double avg(SEISEKI *, int); 24double dev(SEISEKI *, int); 25void hens(SEISEKI *, double, double, int); 26 27int main(int argc, char **argv) 28{ 29 FILE *infile, *outfile; 30 SEISEKI student[MAX]; 31 int number; 32 double ttl_mean; 33 double std; 34 35 if (argc != 3) { 36 fprintf(stderr, "Example: qtotal motofile.dat insatsu.dat\n"); 37 } 38 if ((infile = fopen(argv[1], "rt")) == NULL) { 39 fprintf(stderr, "Can not open file: %s\n", argv[1]); 40 exit(1); 41 } 42 if ((outfile = fopen(argv[2], "wt")) == NULL) { 43 fprintf(stderr, "Can not open file: %s\n", argv[2]); 44 exit(1); 45 } 46 47 number = input(infile, student); 48 49 qsort(student, number, sizeof(SEISEKI),(int (*) (const void *, const void *)) compare); 50 51 ttl_mean=avg(student, number); 52 std=dev(student, number); 53 hens(student, ttl_mean, std, number); 54 55 output(outfile, student, number); 56 57 fprintf(outfile, "Mean of Total =%.2f, Standard Deviation of Total =%.2f\n",ttl_mean,std); 58 59 fclose(infile); fclose(outfile); 60 return 0; 61} 62int input(FILE *infile, SEISEKI *student) 63{ 64 char n[LEN]; 65 int e, m, s, i = 0; 66 67 while (fscanf(infile, "%s %d %d %d", n, &e, &m, &s) != EOF) { 68 strcpy(student[i].name, n); 69 student[i].eng = e; student[i].math = m; student[i].sci = s; 70 student[i].total = e + m + s; 71 student[i].mean = student[i].total / 3.0; 72 i++; 73 } 74 75 return i; 76} 77 78void output(FILE *outfile, SEISEKI *student, int number) 79{ 80 int i; 81 82 for (i = 0; i < number; i++) { 83 SEISEKI *tmp = &student[i]; 84 fprintf(outfile, "%-14s %3d %3d %3d %3d %6.2f %4d\n", tmp->name, tmp->eng, tmp->math, 85 tmp->sci, tmp->total, tmp->mean, tmp->hensa); 86 } 87 88 return; 89} 90 91int compare(const SEISEKI *p, const SEISEKI *q) 92{ 93 return -(p->total - q->total); 94} 95double avg(SEISEKI *student, int n){ 96 int i; 97 double sum = 0.0; 98 for (i = 0; i < n; i++) 99 sum += student[i].total; 100 return sum / n; 101} 102double dev(SEISEKI *student, int n){ 103 int i; 104 double m = avg(student, n); 105 double var = 0.0; 106 for (i = 0; i < n; i++) 107 var += (student[i].total - m) * (student[i].total - m); 108 return sqrt(var/n); 109} 110void hens(SEISEKI *student, double ttl_mean, double std, int n){ 111 int i; 112 for (i = 0; i < n; i++) 113 student[i].hensa=50+10*(student[i].total-ttl_mean)/std; 114}

投稿2016/12/27 14:57

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxxxxxx

2016/12/27 15:32

本当に丁寧なご回答ありがとうございました。 構造体がイマイチ苦手でコードでどのような処理をしているのかを実際にコンパイルして確かめて仕組みについてこれから自学していこうと思っています。 一度自分でやってみて、まだわからないところがあれば参考書などで解決していきたいと思います。 お忙しい中お手数おかけして申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問