回答編集履歴

2

加筆修正

2019/06/30 22:41

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -71,3 +71,47 @@
71
71
  }
72
72
 
73
73
  ```
74
+
75
+
76
+
77
+ 追記2:strcmp関数の仕様を調べ、それと類似するインターフェースを持つ関数を定義して差し替えれば解決します。
78
+
79
+
80
+
81
+ ```C
82
+
83
+ // 使用側
84
+
85
+ if (avecmp(&a[j-1], &a[j])<0)
86
+
87
+ swap_Student(&a[j-1],&a[j]);
88
+
89
+
90
+
91
+ // 関数定義
92
+
93
+ int avecmp(const void* p, const void* q){
94
+
95
+ const Student *a = p, *b = q;
96
+
97
+
98
+
99
+ // 平均の大小は、科目数が同じ場合合計の大小と一致する
100
+
101
+ double diff = (a->math + a->phy + a->eng) - (b->math + b->phy + b->eng);
102
+
103
+ if(diff < 0) return -1;
104
+
105
+ if(diff > 0) return 1;
106
+
107
+ return 0;
108
+
109
+ }
110
+
111
+ ```
112
+
113
+ 要するに、関数の内部でgpaなり平均を計算して、それを比較すればいいのです。
114
+
115
+
116
+
117
+ 事後課題:qsortという関数を調べてみてください。謎仕様のインターフェースの意図が分かると思います。

1

加筆修正

2019/06/30 22:41

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -1 +1,73 @@
1
1
  関数の返り値として、正常に読み込めたデータ数、もしくは書き込めたデータ数を返し、それを全体の人数として処理してはいかがですか?
2
+
3
+
4
+
5
+ 追記1:元々意図していたことが伝わらなかったようなのでコード例を載せます。
6
+
7
+ ```C
8
+
9
+ int data_input(Student a[]){
10
+
11
+ ...
12
+
13
+ if ((fp=fopen("score.dat","w"))==NULL){
14
+
15
+ printf("\aファイルをオープンできません。\n");
16
+
17
+ return 0;
18
+
19
+ }
20
+
21
+ else{
22
+
23
+ ...
24
+
25
+ fclose(fp);
26
+
27
+ return i;
28
+
29
+ }
30
+
31
+ }
32
+
33
+
34
+
35
+ void data_output(Student a[], int person){
36
+
37
+ FILE *fp;
38
+
39
+ int i;
40
+
41
+ int average = 0;
42
+
43
+ ...
44
+
45
+ }
46
+
47
+
48
+
49
+ int main(void){
50
+
51
+ ...
52
+
53
+ int nStudents = 0;
54
+
55
+ do{
56
+
57
+ ...
58
+
59
+ if(flag==1)
60
+
61
+ nStudents = data_input(std);
62
+
63
+ else if(flag==2)
64
+
65
+ data_output(std, nStudents);
66
+
67
+ }while(flag != 0);
68
+
69
+ return 0;
70
+
71
+ }
72
+
73
+ ```