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

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

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

[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();
int main(void)
{    
 
    Initialize();
//학생 데이터 초기화
    Run();
    free(stues);
    
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);//메모리 초기화
 
 
    
for(i=0;i<max_student;i++)
    {
        
for(s=0;s<MAX_SUBJECT;s++)
        {
            stues[i].scores[s] = -1; 
//성적을 -1 설정
        }
    }
}
 
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].num)//이미 번호를 설정한 상태일
    {
        printf(
"이미 추가하였습니다\n");
        
return;
    }
 
    
//stues에는 1 학생 데이터를 관리하는 메모리 주소
    
//따라서 stues+(num-1) num 학생 데이터를 관리하는 메모리 주소
    stu = stues + (num-1);
    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;
    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].num==0)//번호를 설정한 상태가 아닐
    {
        printf(
"데이터가 없습니다.\n");
        
return;
    }
 
    stu = stues + (num-1);
    strcpy_s(stu->name,
sizeof(stu->name),"");
    stu->num = 0;
    
for(s=0;s<MAX_SUBJECT;s++)
    {    
        stu->scores[s]=-1;
    }
 
    printf(
"삭제하였습니다.\n");
}
void ViewStuData(Student *stu);
void FindStudent()
{
    
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].num==0)//번호를 설정한 상태가 아닐
    {
        printf(
"데이터가 없습니다.\n");
        
return;
    }
 
    stu = stues + (num-1);
    ViewStuData(stu);
}
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].num)
        {
            ViewStuData(stues+i);
        }
    }
}

 

반응형