<プログラムの目的>
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
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define SIZE 256 6 7//まずは構造体。 8typedef struct { 9 int num;//学生番号 10 char name[SIZE]; 11 int sub1;//科目1 12 int sub2;//科目2 13 int sub3;//科目3 14 int sum;//3科目の合計 15} students; 16 17students s[20]; 18 19//3科目の合計点数を降順に。 20void bubble_sort(int n, students s[]) { 21 students tmp; 22 int i, j; 23 24 for (i=0; i<n; i++) { 25 for (j=n-1; j>i; j--) { 26 if (s[j].sum > s[j-1].sum) { 27 tmp = s[j]; 28 s[j] = s[j-1]; 29 s[j-1] = tmp; 30 } 31 } 32 } 33} 34 35//最後の出力 36void print_students(students s) { 37 printf("%d,%s,%d\n", s.num, s.name, s.sum); 38} 39 40int main(int argc, char *argv[]) { 41 FILE *fp; 42 char line[SIZE], name[SIZE]; 43 int i, sub1, sub2, sub3, num, sum[20]; 44 45 46 //エラー処理 47 if ((fp = fopen(argv[1], "r"))== NULL) { 48 printf("Can't open the file.\n"); 49 return 1; 50 } 51 //配列が空じゃない時に回り続ける。 52 i = 0; 53 for (; fgets(line, SIZE, fp) != NULL ;) { 54 sscanf(line, "%d %s %d %d %d", &num, name, &sub1, &sub2, &sub3); 55 56 //値をバンバン代入していく。まずはsum. 57 s[i].sum = sub1 + sub2 + sub3; 58 // printf("%d\n", s[i].sum); 59 60 //次に、name. 61 strcpy(s[i].name, name); 62 63 //次に、num. 64 s[i].num = num; 65 i++; 66 67 } 68 69 bubble_sort(20, s); 70 71//これだと 72 int z = 3; 73 for (i=0; i<z; i++) { 74 print_students(s[i]); 75 if (s[i].sum == s[i+1].sum) { 76 z++; 77 } 78 } 79 80 fclose(fp);```ここに言語を入力 81コード
return 0;
}
回答9件
あなたの回答
tips
プレビュー