개발 공부/C,C++

C언어 학생성적 관리프로그램

name2965 2022. 6. 15. 22:40
728x90

 

c언어 공부하면서 만든 간단한 프로그램 입니다.

학생의 성적을 관리하는 프로그램입니다. 학생의 수를 정하고 그만큼의 데이터를 저장할수 있습니다. 그리고 저장한 학생의 성적을 검색하거나 파일내에 있는 모든 학생 성적을 출력할수 있습니다.

 

c언어 문서를 보면서 만들었습니다.

c documentation — DevDocs

 

DevDocs — c documentation

 

devdocs.io

 

#define _CRT_SECURE_NO_WARNINGS
#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.bin"

int max_student;
Student* stues;

void Init();
void Run();
void Exit();
int main()
{
	Init();
	Run();
	Exit();
	return 0;
}
void Init()
{
	FILE* fp = fopen(DEF_FNAME, "r");
	if (fp)
	{
		fread(&max_student, sizeof(int), 1, fp);
		stues = (Student*)malloc(sizeof(Student) * max_student);
		fread(stues, sizeof(Student), max_student, fp);
		fclose(fp);
	}
	else
	{
		printf("관리할 학생 수:");
		max_student = getnum();
		stues = (Student*)malloc(sizeof(Student) * max_student);
		memset(stues, 0, sizeof(Student) * max_student);
	}
}

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(&max_student, sizeof(int), 1, fp);
		fwrite(stues, sizeof(Student), max_student, fp);
		fclose(fp);
	}
	free(stues);
}
728x90

'개발 공부 > C,C++' 카테고리의 다른 글

C언어로 구현해본 간단한 웹서버  (0) 2022.04.07