먼저 학번과 성적이 저장된 파일이 존재해야한다.
/*
    목적 : 파일을 읽어 각 반의 학생의 성적과 합계, 평균을
   		  구하고 각 과목의 반평균을 구한다.
    작성날짜 : 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 ===============================


+ Recent posts