[C언어 소스] 성적 관리 프로그램 - 학생 데이터 동적 메모리 할당
성적 관리 프로그램 (학생 데이터 동적 메모리 할당).c
학생 구조체 배열을 동적으로 할당하고 번호 - 1 인덱스에 학생 데이터를 관리하는 기본적인 프로그램
학생 데이터 추가할 때도 학생 데이터를 관리할 메모리를 동적 할당
학생 데이터 삭제할 때 학생 데이터 메모리 해제
프로그램 종료할 때 할당한 모든 메모리 해제
//성적 관리
프로그램 - 배열을 동적
메모리
할당
//학생 번호
순으로
동적
배열에
보관
//학생 데이터도
동적으로
할당
//최대 학생
수를
프로그림
시작
시에
사용자가
결정
//입력 오류에
관한
예외
처리
없음
#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언어 소스 (2) | 2016.04.03 |
---|---|
균형 원소 찾기, C언어 소스 (0) | 2016.04.03 |
[C언어 소스] 로또 발생기 (0) | 2016.04.03 |
[C언어 소스] 디지털 시계 (0) | 2016.04.03 |
[C언어 소스] 학생 성적 관리 프로그램 - 이중 연결리스트 (0) | 2016.04.03 |
[C언어 소스] 성적 관리 프로그램 - 동적 메모리 할당 (0) | 2016.04.03 |
[C언어 소스] 성적 관리 프로그램 - 전역 변수 사용 (0) | 2016.04.03 |
[C언어 소스] 대소문자 변환 (0) | 2016.04.03 |
[C언어 소스] 적분 공식을 이용한 파이 계산 (0) | 2016.04.03 |
[C언어 소스] 두 점 사이의 거리 - 구조체 정의 (0) | 2016.04.03 |