C언어 실무 프로젝트

C언어 성적 처리 프로그램 (파일 입출력, 함수, 구조체, 포인터 이용)

C's everything! 2022. 4. 23. 10:28
반응형

함수 단위로 기능을 세분화하였습니다. 프로그램 뿐만 아니라 파일에도 성적을 입출력할 수 있게 구성하였습니다.

포인터로 Call by Reference 기능을 구현하였습니다.

학생 수 입력
성적 처리 화면
scoreProcess.exe
0.01MB

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>  // exit(1)


typedef struct Score {   // 성적 처리를 위한 구조체 학생 정보 데이터
	char hakbun[15];
	char name[10];
	int kor, eng, tot;
	double avg;
}score;

void print_start(FILE *in);	// 시작문 출력 (파일에도)

int count_data();		// 성적 처리할 학생 수 입력

score input_data(score people[]);		//  입력한 학생의 점수를 반환.

score total_data(score total, score people[]);	//  총합 점수를 반환

void swap1(score *n, score *m);				//  총점에 따른 입력 데이터 내림차순 정렬

void input_output(FILE *in, score people);	//  입력한 학생의 점수 출력 (파일에도)

void print_sentence(FILE *in, score total, int count);	//  성적의 총합 출력 (파일에도)

int main(int argc, char * argv[]) {	// 명령행 인자

	if (argc != 2) {
		puts("프로그램 사용법:(실행파일) (내용이 저장될 파일)"), exit(1);

		// 명령 프롬프트에서 프로그램을 실행할 때, 매개변수가 2개가 아니면 프로그램을 비정상적으로 종료한다.
	}

	FILE *in;
	in = fopen(argv[1], "wt");
	if (in == NULL)puts("쓸 파일이 없습니다.");

	score people[20];			// 학생 데이터 처리를 위한 구조체 배열 20개
	score total = { "","",0,0,0,0. };	// 학생 데이터의 총합
	int count;				// 입력하려는 학생 수
	int i, j;				// for문 반복 변수

	count = count_data();   // 성적 처리할 학생 수 입력

	for (i = 0; i < count; i++) {
		printf("%d 번째 학생의 정보: ", i + 1);
		people[i] = input_data(people + i);	// 입력 데이터 반환 (구조체를 리턴해서 한 번에 대입한다.)
		total = total_data(total, people + i);// 출력 데이터 반환 (구조체를 리턴해서 한 번에 대입한다.)
	}

	for (i = 0; i < count - 1; i++) {
		for (j = i + 1; j < count; j++) {
			if (people[i].tot < people[j].tot)
				swap1(&people[i], &people[j]);	// 총점에 따른 입력 데이터 내림차순 정렬
		}						// Call by Reference
	}

	print_start(in);  // 시작문 출력 

	for (i = 0; i < count; i++) {
		input_output(in, people[i]);	// 각 학생의 입력 정보 출력	
	}

	print_sentence(in, total, count);		// 총합 정보 출력

	fclose(in);
	return 0;  // 성공!
}
void print_start(FILE *in) {

	printf("\n\n");
	printf("------------------------------------------------------------\n");
	printf("	학번\t   이름	     국어    영어    총점     평균\n");
	printf("------------------------------------------------------------\n");

	fprintf(in, "------------------------------------------------------------\n");
	fprintf(in, "	학번\t   이름	     국어    영어    총점     평균\n");
	fprintf(in, "------------------------------------------------------------\n");
}

int count_data() {

	int count;
	printf("성적 처리할 학생이 몇명입니까? ");

	while (1) {
		scanf(" %d", &count);

		if (count > 10 || count < 1)
		{
			printf("1 ~ 10명 사이의 수를 입력해줬으면 해. 나 힘들단 말이야! ");
			continue;
		}
		else
			break;
	}

	system("cls");
	return count;
}

score input_data(score people[]) {	//  배열 요소 1개의 주소를 입력받는다.

	scanf(" %s %s %d %d", &(people->hakbun), &(people->name), &(people->kor), &(people->eng));	// 주소로 멤버 접근(->)
	people->tot = people->kor + people->eng;
	people->avg = people->tot / 2.;

	return *people; // score형 배열 요소의 주소로 가서 score형 값을 가져와서 리턴
}

score total_data(score total, score people[]) {
	// 매개변수로 배열을 설정하면, 배열 요소의 주소를 입력받는다.

	total.kor += people->kor;	// 주소로 멤버에 접근한다.
	total.eng += people->eng;
	total.tot += people->tot;
	total.avg += people->avg;

	return total;
}

void swap1(score *n, score *m) {	// n과 m의 주소로 가서 값을 바꾼다.
	score temp;
	temp = *n;
	*n = *m;
	*m = temp;
}

void input_output(FILE *in, score people) {

	// score형 배열의 요소 1개를 매개변수로 받아서 파일 포인터가 가리키는 곳에 출력한다.

	printf("%12s %12s %7d %7d %7d  %7.2f\n", people.hakbun, people.name, people.kor, people.eng, people.tot, people.avg);
	fprintf(in, "%12s %12s %7d %7d %7d  %7.2f\n", people.hakbun, people.name, people.kor, people.eng, people.tot, people.avg);
}

void print_sentence(FILE *in, score total, int count) {	// 파일 포인터가 가리키는 곳에 총합 점수를 출력한다.
	printf("------------------------------------------------------------\n");
	fprintf(in, "------------------------------------------------------------\n");

	printf("%12s %12s %7d %7d %7d  %7.2f\n", total.hakbun, total.name, total.kor, total.eng, total.tot, total.avg);
	fprintf(in, "%12s %12s %7d %7d %7d  %7.2f\n", total.hakbun, total.name, total.kor, total.eng, total.tot, total.avg);

	if (count >= 2) {		//  2명 이상일 경우에 총점과 총점 평균, 과목 총점을 출력한다. 

		printf("%12s %12s %7.2f %7.2f %7.2f  %7.2f\n", total.hakbun, total.name, total.kor / (double)count, total.eng / (double)count, total.tot / (double)count, total.avg / (double)count);
		fprintf(in, "%12s %12s %7.2f %7.2f %7.2f  %7.2f\n", total.hakbun, total.name, total.kor / (double)count, total.eng / (double)count, total.tot / (double)count, total.avg / (double)count);
	}
}
반응형