data,txt 에
1111 100 50 90
1112 90 86 54
1113 89 76 20
1114 30 10 97
1115 70 100 74
이렇게 저장을 한후
파일 제일 끝에 최고 평균점수(국/영/수) ,받은 학생의 학생번호와 국/영/수 점수 및 평균 출력하는건데
#include <stdio.h>
#define MAX_STUDENTS 100
/* 학생구조체 선언 */
typedef struct
{
int id;
int kor, eng, math, total;
// 총점
float average;
// 학점
char grade;
// 등수
int rank;
}student;
/* 평균 avrg로부터 학점을 리턴하는 함수 */
char get_grade(float avrg)
{
if (avrg >= 90)
return 'A';
if (avrg >= 80)
return 'B';
if (avrg >= 70)
return 'C';
if (avrg >= 60)
return 'D';
return 'E';
}
int main(void)
{
/* 100 명정도의 학생정보를 읽는다고 가정 */
student stds[MAX_STUDENTS];
FILE* fin, *fout;
/* 라인문자열을 읽어들일 버퍼 */
char line[255];
/* nread : 읽어들인 레코드의 수 */
int i = 0, j, nread;
/* 과목별 총점, 평균 */
int tot_kor = 0, tot_eng = 0, tot_math = 0;
float avrg_kor, avrg_eng, avrg_math;
/* 입력화일 개방하기 */
fin = fopen("data1.txt", "rt");
if (fin == NULL)
{
fprintf(stderr, "지정하신 입력파일을 개방할 수 없습니다.\n");
return 1;
}
/* 첫 라인은 제목줄이므로 읽어낸다 */
fgets(line, 255, fin);
/* 정확하게 저장된 구조체에 속한 필드수 4개를 읽어낸다 */
while (fscanf(fin, "%d%d%d%d%d", stds[i].id, &stds[i].kor, &stds[i].eng, &stds[i].math) == 4)
{
stds[i].total = stds[i].kor + stds[i].eng + stds[i].math;
stds[i].average = stds[i].total / 3.0;
stds[i].grade = get_grade(stds[i].average);
/* 등수를 우선은 모두 1로 설정 */
stds[i].rank = 1;
/* 과목별 총점을 계산 */
tot_kor += stds[i].kor;
tot_eng += stds[i].eng;
tot_math += stds[i].math;
// 다음라인 읽기
i++;
}
/* 읽은 레코드수를 저장 */
nread = i;
/* 등수 구하기 -
정렬하지 아니하고 점수를 비교하여
등수를 결정합니다. */
for (i = 0; i < nread; i++)
{
for (j = 0; j < nread; j++)
{
if (stds[i].average < stds[j].average)
stds[i].rank++;
}
}
/* 과목별 평균 */
avrg_kor = ((float)tot_kor) / nread;
avrg_eng = ((float)tot_eng) / nread;
avrg_math = ((float)tot_math) / nread;
/* 화면에 출력해보기 */
fout = fopen("output.txt", "wt");
if (fout == NULL)
{
fprintf(stderr, "지정하신 출력화일을 개방할 수 없습니다.\n");
return 1;
}
fprintf(stdout, " 성적표 \n");
fprintf(stdout, "------------------------------------------------------\n");
fprintf(stdout, "번호 성명 국어 영어 수학 총점 평균 학점 등수\n");
for (i = 0; i < nread; i++)
{
fprintf(stdout, "M M M M M M %5.1f L M\n", i + 1, stds[i].id, stds[i].kor, stds[i].eng, stds[i].math, stds[i].total, stds[i].average, stds[i].grade, stds[i].rank);
fprintf(stdout, "------------------------------------------------------\n");
}
/*과목별 총점과 평균 출력 */
fprintf(stdout, "\n각 과목별 합계와 평균점수입니다\n");
fprintf(stdout, "\n[국어]\n");
fprintf(stdout, "합계 : %d\t평균 : %.1f\n", tot_kor, avrg_kor);
fprintf(stdout, "\n[영어]\n");
fprintf(stdout, "합계 : %d\t평균 : %.1f\n", tot_eng, avrg_eng);
fprintf(stdout, "\n[수학]\n");
fprintf(stdout, "합계 : %d\t평균 : %.1f\n", tot_math, avrg_math);
/* 화일에 출력하기 */
fprintf(fout, " 성적표 \n");
fprintf(fout, "------------------------------------------------------\n");
fprintf(fout, "번호 성명 국어 영어 수학 총점 평균 학점 등수\n");
for (i = 0; i < nread; i++)
{
fprintf(fout, "M M M M M M %5.1f L M\n", i + 1, stds[i].id, stds[i].kor, stds[i].eng, stds[i].math, stds[i].total, stds[i].average, stds[i].grade, stds[i].rank);
fprintf(fout, "------------------------------------------------------\n");
}
/*과목별 총점과 평균 출력 */
fprintf(fout, "\n각 과목별 합계와 평균점수입니다\n");
fprintf(fout, "\n[국어]\n");
fprintf(fout, "합계 : %d\t평균 : %.1f\n", tot_kor, avrg_kor);
fprintf(fout, "\n[영어]\n");
fprintf(fout, "합계 : %d\t평균 : %.1f\n", tot_eng, avrg_eng);
fprintf(fout, "\n[수학]\n");
fprintf(fout, "합계 : %d\t평균 : %.1f\n", tot_math, avrg_math);
/* 화일닫기 */
fclose(fin);
fclose(fout);
return 0;
}
이렇게 코드 짜고 작동해봤는데... 작동이 중지되네요... 뭐가 문제인거죠?
댓글 0