C Programming
main.c(구조체 포인터,파일 입출력 사용 성적순 정렬)
빛하루
2023. 8. 7. 11:09
#include <stdio.h>
typedef struct student {
char name[21];
int kor;
int eng;
int mat;
int total;
double average;
int rank;
}Student;
int main(void)
{
FILE *fin, *fout;
fin = fopen("score.dat","r"); // 읽기용
fout = fopen("score.out","w"); //쓰기용
Student students[10];
int board[10];
for (int i = 0; i<10; i++){
fscanf(fin,"%20s %d %d %d",
students[i].name, &students[i].kor, &students[i].eng,&students[i].mat);
// name은 배열의 첫번째에 들어가므로 &을 쓰지 않아도 된다.
}
// total, average, rank
for (int i = 0; i<10; i++){
students[i].total = students[i].kor + students[i].eng +students[i].mat;
students[i].average = (double)students[i].total/3.0;
students[i].rank = 1;
}
int count = 0;
for (int i = 0; i<9; i++) {
for (int j = i+1; j<10; j++){
if (students[i].total > students[j].total){
students[j].rank ++;
} else if (students[i].total<students[j].total){
students[i].rank ++;
}
}
}
// selection sorting
Student *table[10];
for (int i = 0; i<10; i++){
table[i] = &students[i];
}
for (int i = 0; i<9; i++){
for (int j = i+1; j<10; j++){
if (table[i]->total < table[j]->total){
Student *tmp = table[i];
table[i] = table[j];
table[j] = tmp;
}
}
}
fprintf(fout,"---------------------------------------------------------------------\n");
fprintf(fout," name kor eng mat sum avg rnk\n");
fprintf(fout,"---------------------------------------------------------------------\n");
for (int i = 0; i<10; i++){
fprintf(fout,"%-20s %3d %3d %3d %3d %6.2f %2d\n",
//students[i].name,students[i].kor, students[i].eng,
//students[i].mat, students[i].total, students[i].average,
//students[i].rank);
table[i]->name,table[i]->kor,table[i]->eng,table[i]->mat,
table[i]->total,table[i]->average,table[i]->rank);
}
fclose(fin);
fclose(fout);
return 0;
}