質問編集履歴

2

ソースコードの改良

2019/06/30 16:22

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -36,27 +36,29 @@
36
36
 
37
37
  typedef struct{
38
38
 
39
- char num[10]; /*在籍番号*/
39
+ char num[10]; /*在籍番号*/
40
-
40
+
41
- char name[NAME_LEN]; /*学生の名前*/
41
+ char name[NAME_LEN]; /*名前*/
42
-
42
+
43
- double math; /*数学の点数*/
43
+ double math; /*数学*/
44
-
44
+
45
- double phy; /*物理の点数*/
45
+ double phy; /*物理*/
46
-
46
+
47
- double eng; /*英語の点数*/
47
+ double eng; /*英語*/
48
48
 
49
49
  } Student;
50
50
 
51
51
 
52
52
 
53
+ /*データを入力してファイルに書き込み*/
54
+
53
55
  void data_input(Student a[]){
54
56
 
55
57
  FILE *fp;
56
58
 
57
59
  int i;
58
60
 
59
- if ((fp=fopen("score.dat","a"))==NULL) /*オープン*/
61
+ if ((fp=fopen("score.dat","w"))==NULL) /*オープン*/
60
62
 
61
63
  printf("\aファイルをオープンできません。\n");
62
64
 
@@ -74,25 +76,15 @@
74
76
 
75
77
  break;
76
78
 
77
- printf("Num:");
78
-
79
- scanf("%s",a[i].num);
79
+ printf("Num:");scanf("%s",a[i].num);
80
-
81
- printf("Name:");
80
+
82
-
83
- scanf("%s",a[i].name);
81
+ printf("Name:");scanf("%s",a[i].name);
84
-
85
- printf("Math:");
82
+
86
-
87
- scanf("%lf",&a[i].math);
83
+ printf("Math:");scanf("%lf",&a[i].math);
88
-
89
- printf("Phy:");
84
+
90
-
91
- scanf("%lf",&a[i].phy);
85
+ printf("Phy:");scanf("%lf",&a[i].phy);
92
-
93
- printf("Eng:");
86
+
94
-
95
- scanf("%lf",&a[i].eng);
87
+ printf("Eng:");scanf("%lf",&a[i].eng);
96
88
 
97
89
  fprintf(fp,"%-10s %-10s %5.1f %5.1f %5.1f \n",a[i].num,a[i].name,a[i].math,a[i].phy,a[i].eng);
98
90
 
@@ -106,6 +98,208 @@
106
98
 
107
99
 
108
100
 
101
+ float gpa(int average){
102
+
103
+ if(average<=60)
104
+
105
+ return 0;
106
+
107
+ if(average>=61 && average<=70)
108
+
109
+ return 1.0;
110
+
111
+ if(average>=71 && average<=80)
112
+
113
+ return 2.0;
114
+
115
+ if(average>=81 && average<=90)
116
+
117
+ return 3.0;
118
+
119
+ if(average>=91 && average<=100)
120
+
121
+ return 4.0;
122
+
123
+ return 0;
124
+
125
+ }
126
+
127
+
128
+
129
+ // 数学の合計の計算
130
+
131
+ double sum_math(Student a[], int person){
132
+
133
+ int i;
134
+
135
+ double total = 0.0;
136
+
137
+ for(i=0; i<person; i++){
138
+
139
+ total += a[i].math;
140
+
141
+ }
142
+
143
+ return total;
144
+
145
+ }
146
+
147
+ // 物理の合計の計算
148
+
149
+ double sum_phy(Student a[], int person){
150
+
151
+ int i;
152
+
153
+ double total = 0.0;
154
+
155
+ for(i=0; i<person; i++){
156
+
157
+ total += a[i].phy;
158
+
159
+ }
160
+
161
+ return total;
162
+
163
+ }
164
+
165
+ // 英語の合計の計算
166
+
167
+ double sum_eng(Student a[], int person){
168
+
169
+ int i;
170
+
171
+ double total = 0.0;
172
+
173
+ for(i=0; i<person; i++){
174
+
175
+ total += a[i].eng;
176
+
177
+ }
178
+
179
+ return total;
180
+
181
+ }
182
+
183
+
184
+
185
+ // 数学の平均の計算
186
+
187
+ double ave_math(Student a[], int person){
188
+
189
+ double total = sum_math(a, person);
190
+
191
+ return total/person;
192
+
193
+ }
194
+
195
+ // 物理の平均の計算
196
+
197
+ double ave_phy(Student a[], int person){
198
+
199
+ double total = sum_phy(a, person);
200
+
201
+ return total/person;
202
+
203
+ }
204
+
205
+ // 英語の平均の計算
206
+
207
+ double ave_eng(Student a[], int person){
208
+
209
+ double total = sum_eng(a, person);
210
+
211
+ return total/person;
212
+
213
+ }
214
+
215
+
216
+
217
+ // 数学の分散の計算
218
+
219
+ double var_math(Student a[], int person) {
220
+
221
+ int i;
222
+
223
+ double A = ave_math(a, person);
224
+
225
+ double v = 0.0;
226
+
227
+ for (i=0; i<person; i++)
228
+
229
+ v += (a[i].math - A) * (a[i].math - A);
230
+
231
+ return v/person;
232
+
233
+ }
234
+
235
+
236
+
237
+ // 物理の分散の計算
238
+
239
+ double var_phy(Student a[], int person) {
240
+
241
+ int i;
242
+
243
+ double A = ave_phy(a, person);
244
+
245
+ double v = 0.0;
246
+
247
+ for (i=0; i<person; i++)
248
+
249
+ v += (a[i].phy - A) * (a[i].phy - A);
250
+
251
+ return v/person;
252
+
253
+ }
254
+
255
+ // 英語の分散の計算
256
+
257
+ double var_eng(Student a[], int person) {
258
+
259
+ int i;
260
+
261
+ double A = ave_eng(a, person);
262
+
263
+ double v = 0.0;
264
+
265
+ // 分散を計算
266
+
267
+ for (i=0; i<person; i++)
268
+
269
+ v += (a[i].eng - A) * (a[i].eng - A);
270
+
271
+ return v/person;
272
+
273
+ }
274
+
275
+
276
+
277
+ // 数学の標準偏差の計算
278
+
279
+ double std_math(Student a[], int person) {
280
+
281
+ return sqrt(var_math(a, person));
282
+
283
+ }
284
+
285
+
286
+
287
+ // 標準偏差の計算
288
+
289
+ double std_phy(Student a[], int person) {
290
+
291
+ return sqrt(var_phy(a, person));
292
+
293
+ }
294
+
295
+ // 標準偏差の計算
296
+
297
+ double std_eng(Student a[], int person) {
298
+
299
+ return sqrt(var_eng(a, person));
300
+
301
+ }
302
+
109
303
 
110
304
 
111
305
  /*ファイルを読み込んでデータを出力*/
@@ -116,11 +310,15 @@
116
310
 
117
311
  int i;
118
312
 
119
- double sum_math=0.0;
120
-
121
- double sum_phy=0.0;
122
-
123
- double sum_eng=0.0;
313
+ int person = 0;
314
+
315
+ int average = 0;
316
+
317
+ int total = 0;
318
+
319
+ int math_max,math_min,phy_max,phy_min,eng_max,eng_min;
320
+
321
+
124
322
 
125
323
  if ((fp=fopen("score.dat","r"))==NULL) /*オープン*/
126
324
 
@@ -134,17 +332,69 @@
134
332
 
135
333
  printf("%-10s %-10s %5.1f %5.1f %5.1f \n",a[i].num,a[i].name,a[i].math,a[i].phy,a[i].eng);
136
334
 
137
- sum_math += a[i].math;
138
-
139
- sum_phy += a[i].phy;
140
-
141
- sum_eng += a[i].eng;
142
-
143
335
  i++;
144
336
 
337
+ person++;
338
+
145
- }
339
+ }
340
+
146
-
341
+ math_max = math_min = a[0].math;
342
+
343
+ phy_max = phy_min = a[0].phy;
344
+
345
+ eng_max = eng_min = a[0].eng;
346
+
347
+ for(i=1;i<person;++i){
348
+
349
+ if (math_max < a[i].math)
350
+
351
+ math_max = a[i].math;
352
+
353
+ if (math_min > a[i].math)
354
+
355
+ math_min = a[i].math;
356
+
357
+ if (phy_max < a[i].phy)
358
+
359
+ phy_max = a[i].phy;
360
+
361
+ if (phy_min > a[i].phy)
362
+
363
+ phy_min = a[i].phy;
364
+
365
+ if (eng_max < a[i].eng)
366
+
367
+ eng_max = a[i].eng;
368
+
369
+ if (eng_min > a[i].eng)
370
+
371
+ eng_min = a[i].eng;
372
+
373
+ }
374
+
375
+ /* 最高点と最低点の表示 */
376
+
147
- printf("合計 %5.1f %5.1f %5.1f \n",sum_math,sum_phy,sum_eng);
377
+ printf("最高点 数学:%d 物理:%d 英語:%d\n", math_max,phy_max,eng_max);
378
+
379
+ printf("最低点 数学:%d 物理:%d 英語:%d\n", math_min,phy_min,eng_min);
380
+
381
+ for(i=0;i<person;i++){
382
+
383
+ total=(a[i].math+a[i].phy+a[i].eng);/*平均を計算*/
384
+
385
+ average=(a[i].math+a[i].phy+a[i].eng)/3; /*平均を計算*/
386
+
387
+ printf("%-10s %-10s 合計:%3.1d 平均:%5.1f → GPA:%5.1f\n",a[i].num,a[i].name,total,average,gpa(average));
388
+
389
+ }
390
+
391
+
392
+
393
+ printf("math 合計:%5.1f 平均:%5.1f 分散:%5.1f 標準偏差:%f\n",sum_math(a,person),ave_math(a,person),var_math(a,person),std_math(a,person));
394
+
395
+ printf("phy 合計:%5.1f 平均:%5.1f 分散:%5.1f 標準偏差:%f\n",sum_phy(a,person),ave_phy(a,person),var_phy(a,person),std_phy(a,person));
396
+
397
+ printf("eng 合計:%5.1f 平均:%5.1f 分散:%5.1f 標準偏差:%f\n",sum_eng(a,person),ave_eng(a,person),var_eng(a,person),std_eng(a,person));
148
398
 
149
399
  fclose(fp);
150
400
 
@@ -154,6 +404,60 @@
154
404
 
155
405
 
156
406
 
407
+ void swap_Student(Student *x,Student *y){
408
+
409
+ Student temp=*x;
410
+
411
+ *x=*y;
412
+
413
+ *y=temp;
414
+
415
+ }
416
+
417
+
418
+
419
+ /*昇順*/
420
+
421
+ void sort_by_num(Student a[], int n){
422
+
423
+ int i,j;
424
+
425
+ for(i=0;i<n-1;i++){
426
+
427
+ for(j=n-1;j>1;j--){
428
+
429
+ if (a[j-1].num>a[j].num)
430
+
431
+ swap_Student(&a[j-1],&a[j]);
432
+
433
+ }
434
+
435
+ }
436
+
437
+ }
438
+
439
+ /*降順*/
440
+
441
+ void sort_by_num_2(Student a[], int n){
442
+
443
+ int i,j;
444
+
445
+ for(i=0;i<n-1;i++){
446
+
447
+ for(j=n-1;j>1;j--){
448
+
449
+ if (strcmp(a[j-1].num,a[j].num)<0)
450
+
451
+ swap_Student(&a[j-1],&a[j]);
452
+
453
+ }
454
+
455
+ }
456
+
457
+ }
458
+
459
+
460
+
157
461
  int main(void){
158
462
 
159
463
  Student std[NUMBER];
@@ -176,16 +480,18 @@
176
480
 
177
481
  }while(flag != 0);
178
482
 
179
- avemath(std);
180
-
181
483
  return 0;
182
484
 
183
485
  }
184
486
 
185
487
 
186
488
 
489
+
490
+
187
491
  ```
188
492
 
189
493
  ### やってみたこと
190
494
 
495
+ 色々と書き換えてここまできました。
496
+
191
- std[]に格納されが、i変動的なため、のようにプログラム組めばいいのかわかりません。
497
+ 各教科の平均は関数を用い記述できしたが、各個人平均を関数で表す方法思い浮かばかっめ、無理やり?計算しました。また、学籍番号を用いたソートのように、各個人の平均やGPAたソートを行たいですが、構造体を使っていないため?strcmp(a[j-1].num,a[j].num)<0の部分の書き方がわかりません。

1

インデント

2019/06/30 16:22

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -16,9 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- ### 該当のソースコード
19
+ ### 該当のソースコード>
20
-
21
-
22
20
 
23
21
  ```C
24
22
 
@@ -38,103 +36,119 @@
38
36
 
39
37
  typedef struct{
40
38
 
41
- char num[10]; /*在籍番号*/
39
+ char num[10]; /*在籍番号*/
42
40
 
43
- char name[NAME_LEN]; /*学生の名前*/
41
+ char name[NAME_LEN]; /*学生の名前*/
44
42
 
45
- double math; /*数学の点数*/
43
+ double math; /*数学の点数*/
46
44
 
47
- double phy; /*物理の点数*/
45
+ double phy; /*物理の点数*/
48
46
 
49
- double eng; /*英語の点数*/
47
+ double eng; /*英語の点数*/
50
48
 
51
49
  } Student;
52
50
 
53
51
 
54
52
 
55
-
56
-
57
53
  void data_input(Student a[]){
58
54
 
59
- FILE *fp;
55
+ FILE *fp;
60
56
 
61
- int i;
57
+ int i;
62
58
 
63
- if ((fp=fopen("score.dat","a"))==NULL) /*オープン*/
59
+ if ((fp=fopen("score.dat","a"))==NULL) /*オープン*/
64
60
 
65
- printf("\aファイルをオープンできません。\n");
61
+ printf("\aファイルをオープンできません。\n");
66
62
 
67
- else{
63
+ else{
68
64
 
69
- for(i=0;;i++){
65
+ for(i=0;;i++){
70
66
 
71
- int flag;
67
+ int flag;
72
68
 
73
- printf("%d人目のデータを入力しますか(YES-1/NO-0):",i+1);
69
+ printf("%d人目のデータを入力しますか(YES-1/NO-0):",i+1);
74
70
 
75
- scanf("%d",&flag);
71
+ scanf("%d",&flag);
76
72
 
77
- if(flag==0)
73
+ if(flag==0)
78
74
 
79
- break;
75
+ break;
80
76
 
81
- printf("Num:");
77
+ printf("Num:");
82
78
 
83
- scanf("%s",a[i].num);
79
+ scanf("%s",a[i].num);
84
80
 
85
- printf("Name:");
81
+ printf("Name:");
86
82
 
87
- scanf("%s",a[i].name);
83
+ scanf("%s",a[i].name);
88
84
 
89
- printf("Math:");
85
+ printf("Math:");
90
86
 
91
- scanf("%lf",&a[i].math);
87
+ scanf("%lf",&a[i].math);
92
88
 
93
- printf("Phy:");
89
+ printf("Phy:");
94
90
 
95
- scanf("%lf",&a[i].phy);
91
+ scanf("%lf",&a[i].phy);
96
92
 
97
- printf("Eng:");
93
+ printf("Eng:");
98
94
 
99
- scanf("%lf",&a[i].eng);
95
+ scanf("%lf",&a[i].eng);
100
96
 
101
- fprintf(fp,"%-10s %-10s %5.1f %5.1f %5.1f \n",a[i].num,a[i].name,a[i].math,a[i].phy,a[i].eng);
97
+ fprintf(fp,"%-10s %-10s %5.1f %5.1f %5.1f \n",a[i].num,a[i].name,a[i].math,a[i].phy,a[i].eng);
102
98
 
103
- }
99
+ }
104
100
 
105
- fclose(fp);
101
+ fclose(fp);
106
102
 
107
- }
103
+ }
108
104
 
109
105
  }
110
106
 
111
107
 
112
108
 
109
+
110
+
111
+ /*ファイルを読み込んでデータを出力*/
112
+
113
113
  void data_output(Student a[]){
114
114
 
115
- FILE *fp;
115
+ FILE *fp;
116
116
 
117
- int i;
117
+ int i;
118
118
 
119
- if ((fp=fopen("score.dat","r"))==NULL) /*オープン*/
119
+ double sum_math=0.0;
120
120
 
121
- printf("\aファイルをオープンできません。\n");
121
+ double sum_phy=0.0;
122
122
 
123
- else{
123
+ double sum_eng=0.0;
124
124
 
125
- i=0;
125
+ if ((fp=fopen("score.dat","r"))==NULL) /*オープン*/
126
126
 
127
- while(fscanf(fp,"%s%s%lf%lf%lf",a[i].num,a[i].name,&a[i].math,&a[i].phy,&a[i].eng)==5){
127
+ printf("\aファイルをオープンできません。\n");
128
128
 
129
- printf("%-10s %-10s %5.1f %5.1f %5.1f \n",a[i].num,a[i].name,a[i].math,a[i].phy,a[i].eng);
129
+ else{
130
130
 
131
- i++;
131
+ i=0;
132
132
 
133
- }
133
+ while(fscanf(fp,"%s%s%lf%lf%lf",a[i].num,a[i].name,&a[i].math,&a[i].phy,&a[i].eng)==5){
134
134
 
135
- fclose(fp);
135
+ printf("%-10s %-10s %5.1f %5.1f %5.1f \n",a[i].num,a[i].name,a[i].math,a[i].phy,a[i].eng);
136
136
 
137
+ sum_math += a[i].math;
138
+
139
+ sum_phy += a[i].phy;
140
+
141
+ sum_eng += a[i].eng;
142
+
143
+ i++;
144
+
137
- }
145
+ }
146
+
147
+ printf("合計 %5.1f %5.1f %5.1f \n",sum_math,sum_phy,sum_eng);
148
+
149
+ fclose(fp);
150
+
151
+ }
138
152
 
139
153
  }
140
154
 
@@ -142,28 +156,36 @@
142
156
 
143
157
  int main(void){
144
158
 
145
- Student std[NUMBER];
159
+ Student std[NUMBER];
146
160
 
147
- int flag;
161
+ int flag;
148
162
 
149
- do{
163
+ do{
150
164
 
151
- printf("ファイル書き込み-1 / ファイル読み込み-2 / 終了-0 :");
165
+ printf("ファイル書き込み-1 / ファイル読み込み-2 / 終了-0 :");
152
166
 
153
- scanf("%d",&flag);
167
+ scanf("%d",&flag);
154
168
 
155
- if(flag==1)
169
+ if(flag==1)
156
170
 
157
- data_input(std);
171
+ data_input(std);
158
172
 
159
- else if(flag==2)
173
+ else if(flag==2)
160
174
 
161
- data_output(std);
175
+ data_output(std);
162
176
 
163
- }while(flag != 0);
177
+ }while(flag != 0);
164
178
 
179
+ avemath(std);
180
+
165
- return 0;
181
+ return 0;
166
182
 
167
183
  }
168
184
 
185
+
186
+
169
187
  ```
188
+
189
+ ### やってみたこと
190
+
191
+ std[]に格納されていますが、iの値が変動的なため、どのようにプログラムを組めばいいのかわかりません。