먼저 학번과 성적이 저장된 파일이 존재해야한다. /*
목적 : 파일을 읽어 각 반의 학생의 성적과 합계, 평균을
구하고 각 과목의 반평균을 구한다.
작성날짜 : 2013.09.23
*/
#include <stdio.h>
#include <stdlib.h>
// 상수들
#define PEPLE_NUM 181 // 총학생수 정의
void openFile(FILE* fp);
void printClass(int class);
// 학생 정보를 저장하기 위한 구조체 선언
typedef struct student{
char class_st[10];
int class[3];
int score[5];
int total;
float average;
} Student;
// 모든 함수에서 사용하기 위해 전역부에 선언
Student stu[PEPLE_NUM];
int main(int argc, char *argv[]) {
FILE* fp = fopen("scr2013.txt", "r");
if (fp == NULL) {
printf(" File is null.\n");
return -1;
}
openFile(fp);
fclose(fp);
printf("┌──────────────────────┐\n");
printf("│ 초등학교 1학년 성적 일람표 출력하기. │\n");
printf("└──────────────────────┘\n");
while(1) {
int in = 0;
printf(" 어느 반을 출력할 것입니까?(exit=0) : ");
scanf("%d", &in);
if(in == 0) {
printf("program exit...\n");
break;
}
// 성적일람표 출력 함수 실행
printClass(in);
} // while
return 0;
}
/* =============== openFile ======================================
파일을 읽어서 구조체 배열에 저장하고 총점, 평균 구하는 함수
사전조건 : main에서 읽은 파일을 배열에 입력하기 위해서
매개변수 fp로 받아온다.
사후조건 : 구조체 배열에 점수를 입력하고 총점, 평균을 구한다.
*/
void openFile(FILE* fp) {
// 지역정의
int temp;
int i;
// 문장들
// 파일 읽어서 구조체 배열에 입력하기
for(i=0; i < PEPLE_NUM; i++) {
fscanf(fp, "%s %d %d %d %d %d", &(stu[i]).class_st, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2], &stu[i].score[3], &stu[i].score[4]);
// 입력받은 문자열인 학번을 integer로 변환하기 위해 atoi함수를 사용했다.
temp = atoi(stu[i].class_st);
stu[i].class[0] = temp / 10000;
stu[i].class[1] = (temp - (stu[i].class[0] * 10000)) / 100;
stu[i].class[2] = (temp - (stu[i].class[0] * 10000) - (stu[i].class[1] * 100)) / 1;
}
// 입력받은 점수로 총점, 평균 계산하기
for(i = 0; i < PEPLE_NUM; i++) {
stu[i].total = stu[i].score[0] + stu[i].score[1] + stu[i].score[2] + stu[i].score[3] + stu[i].score[4];
stu[i].average = stu[i].total / 5.0;
}
} // openFile
//================= openFile End =================================
/* =============== printClass ===================================
출력하고자 하는 반을 주어진 틀에 맞게 출력하는 함수.
사전조건 : 출력하고자하는 반을 매개변수로 받는다.
사후조건 : 헤더를 출력하고 학생들의 정보를 모두 출력한다.
모두 출력하고 난뒤에 각 과목의 반평균을 출력한다.
*/
void printClass(int class) {
// 지역정의
int i;
int count = 0;
float kor = 0;
float math = 0;
float social = 0;
float science = 0;
float pe = 0;
// 문장들
printf("\n 1 학년 %2d 반 성적일람표\n", class);
printf(" 학번 국어 산수 사회 과학 체육 총점 평균 \n");
printf("------------------------------------------------\n");
// 학생 출력.
for(i = 0; i < PEPLE_NUM ;i++ ) {
if(stu[i].class[1] == class) {
printf("%5s %3d %3d %3d %3d %3d %3d %3.1f \n", stu[i].class_st, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].score[3], stu[i].score[4], stu[i].total, stu[i].average);
kor += stu[i].score[0];
math += stu[i].score[1];
social += stu[i].score[2];
science += stu[i].score[3];
pe += stu[i].score[4];
count++;
}
}
// 학생이 없을 경우 출력.
if(count == 0) {
printf(" 자료가 없습니다.\n\n");
return;
}
printf("------------------------------------------------\n");
printf("반평균 %3.1f %3.1f %3.1f %3.1f %3.1f \n\n", kor/(float)count, math/count, social/count, science/count, pe/count);
} // printClass
//================= printClass End ===============================