[C언어 소스] 학생 성적 관리 프로그램 (전역 변수, 학생 구조제, 파일 입출력)

안녕하세요. 언제나 휴일입니다.

이번 게시글은 학생 성적 관리 프로그램 소스입니다.

50명의 학생 성적을 관리하는 콘솔 응용 프로그램으로 학생 추가, 성적 입력, 삭제, 검색, 전체 보기 기능을 제공합니다.

그리고 프로그램 종료할 때 학생 데이터를 파일에 기록하고 프로그램 시작할 때 파일에 내용을 로딩합니다.

#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>

#define MAX_NAME_LEN	20

enum Subject
{
	KOREAN, ENGLISH, MATH, MAX_SUBJECT
};
const char *stitle[MAX_SUBJECT] = { "국어","영어","수학" };

typedef struct _Student Student;
struct _Student
{
	int num;
	char name[MAX_NAME_LEN];
	int scores[MAX_SUBJECT];
};

#define DEF_FNAME	"data.stu"

#define MAX_STUDENT	50
Student stues[MAX_STUDENT];

void Init();
void Run();
void Exit();
int main()
{
	Init();
	Run();
	Exit();
	return 0;
}
void Init()
{
	FILE *fp = fopen(DEF_FNAME, "r");
	if (fp)
	{
		fread(stues, sizeof(Student), MAX_STUDENT, fp);
		fclose(fp);
	}
}

int SelectMenu();
void AddStudent();
void AddScore();
void RemoveStudent();
void FindStudent();
void ViewAll();
void Run()
{
	int key = 0;
	while ((key = SelectMenu()) != 0)
	{
		switch (key)
		{
		case 1: AddStudent(); break;
		case 2: AddScore(); break;
		case 3: RemoveStudent(); break;
		case 4: FindStudent(); break;
		case 5: ViewAll(); break;
		default: printf("잘못 선택하였습니다.\n"); break;
		}
	}
}
int getnum();
int SelectMenu()
{	
	printf("학생 성적 관리 프로그램 0:종료\n");
	printf("1:학생 추가 2:성적 입력 3: 삭제 4: 검색 5: 전체 보기\n");	
	return getnum();
}
int getnum()
{
	int num = 0;
	if (scanf_s("%d", &num) == 0)
	{
		char buf[256];
		gets_s(buf, sizeof(buf));
	}
	return num;
}

void InitScore(Student *stu);
void AddStudent()
{
	int num = 0;
	Student *stu = 0;
	
	printf("추가할 학생 번호(1~%d):",MAX_STUDENT);
	num = getnum();
	if ((num < 1) || (num > MAX_STUDENT))
	{
		printf("범위를 벗어났습니다.\n");
		return;
	}

	stu = stues + (num - 1);
	if (stu->num)
	{
		printf("이미 자료가 있습니다.\n");
		return;
	}

	stu->num = num;
	printf("이름:");
	scanf_s("%s",stu->name, MAX_NAME_LEN);
	InitScore(stu);
}
void InitScore(Student *stu)
{
	int s = 0;
	for (s = 0; s < MAX_SUBJECT; s++)
	{
		stu->scores[s] = -1;
	}
}
void InputScore(Student *stu);
void AddScore()
{
	int num = 0;
	Student *stu = 0;

	printf("성적 입력할 학생 번호(1~%d):", MAX_STUDENT);
	num = getnum();
	if ((num < 1) || (num > MAX_STUDENT))
	{
		printf("범위를 벗어났습니다.\n");
		return;
	}

	stu = stues + (num - 1);
	if (stu->num==0)
	{
		printf("추가하지 않은 학생 자료입니다. 먼저 학생 자료를 추가하세요.\n");
		return;
	}
	InputScore(stu);	
}
void InputScore(Student *stu)
{
	int s = 0;
	int score=0;
	for (s=0;s<MAX_SUBJECT;s++)
	{
		printf("%s :", stitle[s]);
		score = getnum();
		if ((score < 0) || (score > 100))
		{
			score = -1;
		}
		stu->scores[s] = score;
	}
}

void RemoveStudent()
{
	int num = 0;
	Student *stu = 0;

	printf("삭제할 학생 번호(1~%d):", MAX_STUDENT);
	num = getnum();
	if ((num < 1) || (num > MAX_STUDENT))
	{
		printf("범위를 벗어났습니다.\n");
		return;
	}

	stu = stues + (num - 1);
	if (stu->num==0)
	{
		printf("추가하지 않은 학생 자료입니다. 먼저 학생 자료를 추가하세요.\n");
		return;
	}
	memset(stu, 0, sizeof(Student));
}

void ViewStudent(Student *stu);
void FindStudent()
{
	int num = 0;
	Student *stu = 0;

	printf("검색할 학생 번호(1~%d):", MAX_STUDENT);
	num = getnum();
	if ((num < 1) || (num > MAX_STUDENT))
	{
		printf("범위를 벗어났습니다.\n");
		return;
	}

	stu = stues + (num - 1);
	if (stu->num == 0)
	{
		printf("추가하지 않은 학생 자료입니다. 먼저 학생 자료를 추가하세요.\n");
		return;
	}
	ViewStudent(stu);
}

void ViewScore(Student *stu);
void ViewStudent(Student *stu)
{	
	printf("=== 번호:%d 이름:%s\n", stu->num, stu->name);
	ViewScore(stu);
}
void ViewScore(Student *stu)
{
	int s = 0;	
	for (s = 0; s<MAX_SUBJECT; s++)
	{
		if (stu->scores[s] == -1)
		{
			printf("%s : 미입력\n", stitle[s]);
		}
		else
		{
			printf("%s :%d\n", stitle[s], stu->scores[s]);
		}
	}
}

void ViewAll()
{
	int i = 0;
	for (i = 0; i < MAX_STUDENT; i++)
	{
		if (stues[i].num)
		{
			ViewStudent(stues + i);
		}
	}

}
void Exit()
{
	FILE *fp = fopen(DEF_FNAME, "w");
	if (fp)
	{
		fwrite(stues, sizeof(Student), MAX_STUDENT, fp);
		fclose(fp);
	}
}