[C언어 소스] 성적 관리 프로그램 - 학생 데이터 동적 메모리 할당
성적 관리 프로그램 (학생 데이터 동적 메모리 할당).c
//성적 관리 프로그램 - 배열을 동적 메모리 할당
//학생 번호 순으로 동적 배열에 보관
//학생 데이터도 동적으로 할당
//최대 학생 수를 프로그림 시작 시에 사용자가 결정
//입력 오류에 관한 예외 처리 없음
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NLEN 20 //최대 이름 길이
#define MAX_SUBJECT 3 //과목 수
typedef struct {//학생 구조체 정의
char name[MAX_NLEN + 1];//이름
int num; //번호
int scores[MAX_SUBJECT];//국,영,수 성적
}Student;
const char *stitles[MAX_SUBJECT] = { "국어","영어","수학" };
Student **stues;
int max_student;
void Initialize();//학생 데이터 초기화
void Run();
void Exit();//종료하기 전에 할당한 메모리 해제
int main(void)
{
Initialize();//학생 데이터 초기화
Run();
Exit();//종료하기 전에 할당한 메모리 해제
return 0;
}
void Initialize()
{
int i = 0;
int s = 0;
printf("최대 학생 수: ");
scanf_s("%d", &max_student);
stues = (Student **)malloc(sizeof(Student *)*max_student);//동적 배열 메모리 할당
memset(stues, 0, sizeof(Student *)*max_student);//메모리 초기화
}
int SelectMenu();//메뉴 출력 및 선택
void AddStudent();//학생 데이터 입력
void RemoveStudent();//학생 데이터 삭제
void FindStudent();//학생 검색
void ListStudent();//목록 보기
void Run()
{
int key = 0;
while ((key = SelectMenu()) != 0)//선택한 메뉴가 0이 아니면 반복
{
switch (key)//선택한 키에 따라 기능 수행
{
case 1: AddStudent(); break;
case 2: RemoveStudent(); break;
case 3: FindStudent(); break;
case 4: ListStudent(); break;
default: printf("잘못 선택하였습니다.\n"); break;
}
}
printf("프로그램 종료\n");
}
int SelectMenu()
{
int key = 0;
printf("성적 관리 프로그램 0:종료\n");
printf("1: 학생 데이터 입력 2: 학생 데이터 삭제 3: 학생 검색 4: 목록 보기 \n");
scanf_s("%d", &key);
return key;
}
int IsAvailNum(int num);//유효한 번호인지 판별
int IsAvailScore(int score);//유효한 성적인지 판별
void AddStudent()
{
int num = 0;
Student *stu = 0;
int s = 0;
printf("추가할 학생 번호(1~%d): ", max_student);
scanf_s("%d", &num);
if (IsAvailNum(num) == 0)//유효한 번호가 아닐 때
{
printf("범위를 벗어난 학생 번호입니다.\n");
return;
}
if (stues[num - 1])//학생 데이터가 있다면
{
printf("이미 추가하였습니다\n");
return;
}
stu = (Student *)malloc(sizeof(Student));//학생 구조체 동적 메모리 할당
stues[num - 1] = stu;//할당한 메모리 주소를 배열에 설정
stu->num = num;
printf("이름: ");
scanf_s("%s", stu->name, sizeof(stu->name));
for (s = 0; s<MAX_SUBJECT; s++)
{
printf("%s 성적:", stitles[s]);
scanf_s("%d", stu->scores + s);
if (IsAvailScore(stu->scores[s]) == 0)//유효한 성적이 아닐 때
{
stu->scores[s] = -1;
printf("입력한 성적이 유효하지 않아서 %s 성적은 입력 처리하지 않았습니다.\n", stitles[s]);
}
}
}
int IsAvailNum(int num)
{
return (num >= 1) && (num <= max_student);
}
int IsAvailScore(int score)
{
return (score >= 0) && (score <= 100);
}
void RemoveStudent()
{
int num = 0;
printf("삭제할 학생 번호(1~%d): ", max_student);
scanf_s("%d", &num);
if (IsAvailNum(num) == 0)//유효한 번호가 아닐 때
{
printf("범위를 벗어난 학생 번호입니다.\n");
return;
}
if (stues[num - 1] == 0)//학생 데이터가 없을 때
{
printf("데이터가 없습니다.\n");
return;
}
free(stues[num - 1]);//메모리 해제
stues[num - 1] = 0;
printf("삭제하였습니다.\n");
}
void ViewStuData(Student *stu);
void FindStudent()
{
int num = 0;
printf("검색할 학생 번호(1~%d): ", max_student);
scanf_s("%d", &num);
if (IsAvailNum(num) == 0)//유효한 번호가 아닐 때
{
printf("범위를 벗어난 학생 번호입니다.\n");
return;
}
if (stues[num - 1] == 0)//학생 데이터가 없을 때
{
printf("데이터가 없습니다.\n");
return;
}
ViewStuData(stues[num - 1]);
}
void ViewStuData(Student *stu)
{
int i = 0;
int s = 0;
printf("%4d %10s ", stu->num, stu->name);
for (s = 0; s<MAX_SUBJECT; s++)
{
printf("%4d ", stu->scores[s]);
}
printf("\n");
}
void ListStudent()
{
int i = 0;
int s = 0;
printf("%4s %10s ", "번호", "이름");
for (s = 0; s<MAX_SUBJECT; s++)
{
printf("%4s ", stitles[s]);
}
printf("성적이 -1인 곳은 미입력\n");
for (i = 0; i<max_student; i++)
{
if (stues[i])
{
ViewStuData(stues[i]);
}
}
}
void Exit()
{
int i = 0;
for (i = 0; i<max_student; i++)
{
if (stues[i])
{
free(stues[i]);
}
}
free(stues);
}
'C언어 > C언어 예제' 카테고리의 다른 글
[C언어 소스] 디지털 시계 (0) | 2016.04.13 |
---|---|
[C언어 소스] 성적 관리 프로그램 - 이중 연결리스트 (0) | 2016.04.12 |
[C언어 소스] 성적 관리 프로그램 - 동적 메모리 할당 (0) | 2016.04.12 |
[C언어 소스] 성적 관리 프로그램 - 전역 변수 사용 (0) | 2016.04.12 |
[C언어 소스] 대소문자 변환 (0) | 2016.04.12 |