Creative Code

main.c(구조체 포인터,파일 입출력 사용 성적순 정렬) 본문

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;
}

'C Programming' 카테고리의 다른 글

atoi.c(문자열을 숫자로 출력)  (0) 2023.08.07
main.c(문자열 라이브러리)  (0) 2023.08.07
score.dat(점수 데이터)  (0) 2023.08.07
name.c( 문자열 포인터로 입력)  (0) 2023.08.07
name.c(scanf로 문자열 입력받기)  (0) 2023.08.07