언어 자료구조 알고리즘/C언어 예제

[C언어 소스] 성적 관리 프로그램 - 학생 데이터 동적 메모리 할당

언제나휴일 2016. 4. 3. 15:20
반응형

[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);
}

반응형