[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);
}
}
}
'언어 자료구조 알고리즘 > C언어 예제' 카테고리의 다른 글
균형 원소 찾기, 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 |
[C언어 소스] 두 점 사이의 거리 구하기 (0) | 2016.04.03 |