<プログラムの目的>
20人の学生の「学生番号、名前、3科目の点数」がまとめられたファイルを読み込み、3科目の合計点数が高い上位3人を出力する。なお、上位3位までに同点の生徒がいた場合は全員出力する。
1位、2位、3位が複数いた場合は全員出力。1位が一人、2位が一人、3位が二人の場合は、四人出力。
1位が2人、2位が0、3位が2人の場合は、四人出力。
1位が4人の時は、四人出力。
ファイルは以下の形式。
1001 name 49 50 23
1002 name 22 79 43
......
<質問内容>
3科目の合計点数が高い順に出力まではできました。ただ、同点の生徒がいた場合の処理がわからないです。どうすれば同じ点数の学生を全員出力できるのでしょうか。
c
#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 256 //まずは構造体。 typedef struct { int num;//学生番号 char name[SIZE]; int sub1;//科目1 int sub2;//科目2 int sub3;//科目3 int sum;//3科目の合計 } students; students s[20]; //3科目の合計点数を降順に。 void bubble_sort(int n, students s[]) { students tmp; int i, j; for (i=0; i<n; i++) { for (j=n-1; j>i; j--) { if (s[j].sum > s[j-1].sum) { tmp = s[j]; s[j] = s[j-1]; s[j-1] = tmp; } } } } //最後の出力 void print_students(students s) { printf("%d,%s,%d\n", s.num, s.name, s.sum); } int main(int argc, char *argv[]) { FILE *fp; char line[SIZE], name[SIZE]; int i, sub1, sub2, sub3, num, sum[20]; //エラー処理 if ((fp = fopen(argv[1], "r"))== NULL) { printf("Can't open the file.\n"); return 1; } //配列が空じゃない時に回り続ける。 i = 0; for (; fgets(line, SIZE, fp) != NULL ;) { sscanf(line, "%d %s %d %d %d", &num, name, &sub1, &sub2, &sub3); //値をバンバン代入していく。まずはsum. s[i].sum = sub1 + sub2 + sub3; // printf("%d\n", s[i].sum); //次に、name. strcpy(s[i].name, name); //次に、num. s[i].num = num; i++; } bubble_sort(20, s); //これだと int z = 3; for (i=0; i<z; i++) { print_students(s[i]); if (s[i].sum == s[i+1].sum) { z++; } } fclose(fp);```ここに言語を入力 コード
return 0;
}
まだ回答がついていません
会員登録して回答してみよう