C언어 비트단기 7일차(동적할당, 학생관리 시나리오 실습)

============================================================================================

실습 시나리오

  

 학생은 학번, 이름, 체력, 지력, 스트레스, 연속으로 공부한 횟수를 멤버로 갖는다.  

 학번은 순차적으로 부여하며 이름은 생성할 때 입력인자로 전달받는다. 

체력은 초기값이 100이며 0에서 100 사이의 값을 유지한다. 

지력은 초기값이 100이며 0에서 200 사이의 값을 유지한다. 

스트레스는 초기값이 0이며 0에서 100 사이의 값을 유지한다. 

연속으로 공부한 횟수는 초기값이 0이며 0에서 5 사이의 값을 유지한다. 

학생이 공부하면 연속으로 공부한 횟수는 1 증가하며 그 외의 행동을 하면 0으로 리셋한다.

  

 학생이 공부하면 체력이 5 소모하며 지력은 연속으로 공부한 횟수만큼 증가하고 스트레스는 2 감소한다. 

학생이 강의를 받으면 체력은 3 소모하며 지력은 연속으로 공부한 횟수만큼 증가하고 스트레스는 2 증가한다.

  

 학생이 잠을 자면 체력은 10 회복하고 스트레스는 5 감소한다. 

학생이 휴식하면 체력은 3회복하고 스트레스는 10 감소한다.

  

 학생이 음료를 마시면 체력이 10 소모하며 지력은 5 감소하고 스트레스는 2 감소한다. 

학생이 노래하면 체력이 10 소모하며 지력은 1 증가하고 스트레스는 5 감소한다.

  

 추가로 학생 정보를 출력하는 기능을 제공한다.



//Program.c

#include "Student.h"

#include <stdio.h>

void TestStudent(Student *stu);

int main()

{

    Student stu1;

Student *stu2;


printf("--------------%s 학생 테스트 시작--------------\n","홍길동");

Student_Student(&stu1, "홍길동");

TestStudent(&stu1);


printf("--------------%s 학생 테스트 시작--------------\n","강감찬");

stu2 = New_Student("강감찬");

TestStudent(stu2);

Delete_Student(stu2);

    return 0;

}

void TestStudent(Student *stu,  char *name)

{

    View(stu);

    Study(stu);

    View(stu);

    Study(stu);

    View(stu); 

    ListenLecture(stu);

    View(stu);

    Study(stu);

    View(stu);

    Relax(stu);

    View(stu);

    Sleep(stu);

    View(stu);

    Drink(stu);

    View(stu);

    Sing(stu);

    View(stu);    

printf("--------------%s 학생 테스트 종료--------------\n",stu->name);


printf("\n\n\n");

}





//Student.c

#include "Student.h"

#include <stdio.h>

#include <string.h>

#include <stdlib.h>


void Student_SetHP(Student *stu, int hp);

void Student_SetIQ(Student *stu, int iq);

void Student_SetStress(Student *stu, int stress);

void Student_IncreSCnt(Student *stu);


void Student_Student(Student *stu, char *name) //생성자

{

static int last_num;

memset(stu,0,sizeof(Student));

strncpy_s(stu->name, sizeof(stu->name),name,MAX_NAME_LEN);


stu->hp = DEF_HP;

stu->iq = DEF_IQ;

stu->stress = DEF_STRESS;

stu->scnt = DEF_SCNT;


last_num++;

stu->num = last_num;

}


Student *New_Student(char *name)

{

Student *stu = 0;

stu = (Student*)malloc(sizeof(Student));

Student_Student(stu,name);

return stu;

}


void Delete_Student(Student *stu)

{

free(stu);

}


void Study(Student *stu)

{

printf("<%d>, %s 공부하다. \n",stu->num,stu->name);

Student_SetHP(stu,stu->hp-5);

Student_SetIQ(stu,(stu->iq + stu->scnt));

Student_SetStress(stu,stu->stress - 2);

Student_IncreSCnt(stu);

}


void ListenLecture(Student *stu)

{

printf("<%d>, %s 강의받다. \n",stu->num,stu->name);

Student_SetHP(stu,stu->hp-3);

Student_SetIQ(stu,stu->iq + stu->scnt);

Student_SetStress(stu,stu->stress + 2);

stu->scnt = 0;

}


void Sleep(Student*stu)

{

printf("<%d>, %s 잠을 자다. \n",stu->num,stu->name);

Student_SetHP(stu,stu->hp+10);

Student_SetStress(stu,stu->stress - 5);

stu->scnt = 0;

}


void Relax(Student *stu)

{

printf("<%d>, %s 휴식하다. \n",stu->num,stu->name);

Student_SetHP(stu,stu->hp+3);

Student_SetStress(stu,stu->stress - 10);

stu->scnt = 0;

}


void Drink(Student *stu)

{

printf("<%d>, %s 음료수 마시다. \n",stu->num,stu->name);

Student_SetHP(stu,stu->hp-10);

Student_SetIQ(stu,stu->iq -5);

Student_SetStress(stu,stu->stress - 2);

stu->scnt = 0;

}


void Sing(Student *stu)

{

printf("<%d>, %s 노래하다. \n",stu->num,stu->name);

Student_SetHP(stu,stu->hp-10);

Student_SetIQ(stu,stu->iq +1);

Student_SetStress(stu,stu->stress - 5);

stu->scnt = 0;

}


void View(Student *stu)

{

printf("학생 이름 : %s \n",stu->name);

printf("학생 체력 : %d 학생 아이큐 : %d 학생 스트레스 %d\n",stu->hp,stu->iq,stu->stress);

}


void Student_SetHP(Student *stu, int hp)

{

if(MAX_HP < hp)

{

hp = MAX_HP;

}

else if(MIN_HP > hp)

{

hp = MIN_HP;

}

stu->hp = hp;

}

void Student_SetIQ(Student *stu, int iq)

{

if(MAX_IQ < iq)

{

iq = MAX_IQ;

}

else if(MIN_IQ > iq)

{

iq = MIN_IQ;

}

stu->iq = iq;

}

void Student_SetStress(Student *stu, int stress)

{

if(MAX_STRESS < stress)

{

stress = MAX_STRESS;

}

else if(MIN_STRESS > stress)

{

stress = MIN_STRESS;

}

stu->stress = stress;

}

void Student_IncreSCnt(Student *stu)

{

if(stu->scnt < MAX_SCNT)

{

stu->scnt++;

}

}





//Student.h

#pragma once


#define MAX_NAME_LEN 20


typedef struct Student

{

char name[MAX_NAME_LEN];

int hp;

int iq;

int num;

int stress;

int scnt;

}Student;


enum StuConst

{

MIN_HP = 0, MAX_HP = 100, DEF_HP = 100,

MIN_IQ = 0, MAX_IQ = 200, DEF_IQ = 100,

MIN_STRESS = 0, MAX_STRESS = 100, DEF_STRESS = 0,

MIN_SCNT = 0, MAX_SCNT = 5, DEF_SCNT = 0

};


void Student_Student(Student *stu, char *name); //생성자

void Study(Student *stu);

void ListenLecture(Student *stu);

void Sleep(Student*stu);

void Relax(Student *stu);

void Drink(Student *stu);

void Sing(Student *stu);

void View(Student *stu);

Student *New_Student(char *name);

void Delete_Student(Student *stu);




============================================================================================

학생 수를 입력 받아 동적으로 메모리를 할당받아 사용하는 프로그램  



#include <stdio.h>

#include <stdlib.h>


void InputScores(int  *base, int asize);

void ViewScores(int *base, int asize);

int InputScore(int num);


int main(void)

{

int *base = 0;

int max_stu = 0;


printf("최대 관리할 학생 수를 입력하세요 :\n");

scanf_s("%d",&max_stu);


base = (int*)malloc(sizeof(int)*max_stu);


InputScores(base,max_stu);

ViewScores(base,max_stu);

free(base);


return 0;

}


void InputScores(int  *base, int asize)

{

int i = 0;

for(i = 0 ; i < asize; i++)

{

base[i] = InputScore(i+1);

}

}

void ViewScores(int *base, int asize)

{

int i = 0;

for(i = 0 ; i < asize; i++)

{

printf("%d 번 : %d  \n",i+1,*(base+i));

}

}

int InputScore(int num)

{

int score = 0;


printf("%d 번의 성적을 입력하세요 . \n", num);

scanf_s("%d",&score);


return score;

}



============================================================================================

//realloc 함수를 이용하여 동적으로 할당한 메모리의 크기를 확장하는 프로그램 base = (int*)realloc(base,sizeof(int) * asize);


#include <stdlib.h>

#include <stdio.h>


int *base = 0; //저장소의 위치 정보

int asize = 0; //현재 저장소의 용량

int usage = 0; //저장소에 보관한 요소 개수


void Input(int num); //저장소에 보관하기

void Resize(); // 저장소의 용량 변경하기

void View(); //저장소 정보 보기


int main(void)

{

Input(3);

View();


Input(5);

View();


Input(7);

View();


Input(9);

View();

free(base);

return 0;

}


void Input(int num) //저장소에 보관하기

{

if(asize == usage)

{

Resize();

}

base[usage] = num;

usage++;

}

void Resize() // 저장소의 용량 변경하기

{

if(asize == 0)

{

asize = 1;

}

else

{

asize = asize *2;

}

base = (int*)realloc(base,sizeof(int) * asize);

}

void View()//저장소 정보 보기

{

int i = 0;


printf("저장 용량 %d 사용량 %d \n",asize, usage);


for(i = 0 ; i < usage; i++)

{

printf("%d\n",*(base+i));

}

}




============================================================================================

실습 시나리오

  

 학생은 학번, 이름, 체력, 지력, 스트레스, 연속으로 공부한 횟수를 멤버로 갖는다.  

 학번은 순차적으로 부여하며 이름은 생성할 때 입력인자로 전달받는다. 

체력은 초기값이 100이며 0에서 100 사이의 값을 유지한다. 

지력은 초기값이 100이며 0에서 200 사이의 값을 유지한다. 

스트레스는 초기값이 0이며 0에서 100 사이의 값을 유지한다. 

연속으로 공부한 횟수는 초기값이 0이며 0에서 5 사이의 값을 유지한다. 

학생이 공부하면 연속으로 공부한 횟수는 1 증가하며 그 외의 행동을 하면 0으로 리셋한다.

  

 학생이 공부하면 체력이 5 소모하며 지력은 연속으로 공부한 횟수만큼 증가하고 스트레스는 2 감소한다. 

학생이 강의를 받으면 체력은 3 소모하며 지력은 연속으로 공부한 횟수만큼 증가하고 스트레스는 2 증가한다.

  

 학생이 잠을 자면 체력은 10 회복하고 스트레스는 5 감소한다. 

학생이 휴식하면 체력은 3회복하고 스트레스는 10 감소한다.

  

 학생이 음료를 마시면 체력이 10 소모하며 지력은 5 감소하고 스트레스는 2 감소한다. 

학생이 노래하면 체력이 10 소모하며 지력은 1 증가하고 스트레스는 5 감소한다.

  

 추가로 학생 정보를 출력하는 기능을 제공한다.




//Program.c

#include "Student.h"

#include <stdio.h>

void TestStudent(Student *stu);

int main()

{

    Student stu1;

Student *stu2;


printf("--------------%s 학생 테스트 시작--------------\n","홍길동");

Student_Student(&stu1, "홍길동");

TestStudent(&stu1);


printf("--------------%s 학생 테스트 시작--------------\n","강감찬");

stu2 = New_Student("강감찬");

TestStudent(stu2);

Delete_Student(stu2);

    return 0;

}

void TestStudent(Student *stu,  char *name)

{

    View(stu);

    Study(stu);

    View(stu);

    Study(stu);

    View(stu); 

    ListenLecture(stu);

    View(stu);

    Study(stu);

    View(stu);

    Relax(stu);

    View(stu);

    Sleep(stu);

    View(stu);

    Drink(stu);

    View(stu);

    Sing(stu);

    View(stu);    

printf("--------------%s 학생 테스트 종료--------------\n",stu->name);


printf("\n\n\n");

}









//Student.c

#include "Student.h"

#include <assert.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


void Student_SetHP(Student* stu,int hp); //체력 설정

void Student_SetIQ(Student* stu, int iq); //아이큐 설정

void Student_SetSTRESS(Student *stu, int stress); //스트레스 설정

void Student_SetINCE(Student *stu); //학생수 설정


void Student_Student(Student* stu, char *name)//생성자

{

static int last_num; //학생 번호 

memset(stu,0,sizeof(Student));

strncpy_s(stu->name, sizeof(stu->name),name,MAX_LEN);

stu->hp = DEF_HP; //체력 초기화

stu->iq = DEF_IQ; //아이큐 초기화

stu->scnt = DEF_SCNT; //공부한 횟수 초기화

stu->stress = DEF_STRESS; //스트레스 초기화

last_num++; //학생수 증가

stu->num = last_num; //학생수 순서대로 순차적으로 학번 부여

}


Student *New_Student(char *name) //동적 할당일때만 매개변수 Student *stu 받지 않는다.

{

Student *stu = 0;

stu = (Student*)malloc(sizeof(Student));

Student_Student(stu,name);

return stu;

}


void Delete_Student(Student *stu) //동적할당 해제

{

free(stu);

}


void Study(Student* stu)//공부하다

{

printf("%d번 학생 %s 공부하다.\n",stu->num,stu->name);

Student_SetHP(stu,stu->hp - 5);

Student_SetIQ(stu,(stu->iq + stu->scnt));

Student_SetSTRESS(stu,stu->stress - 2);

Student_SetINCE(stu);

}


void ListenLecture(Student *stu)//강의듣다

{

printf("%d번 학생 %s 강의듣다.\n",stu->num,stu->name);

Student_SetHP(stu,stu->hp - 3);

Student_SetIQ(stu,stu->iq + stu->scnt);

Student_SetSTRESS(stu,stu->stress +2);

stu->scnt = 0;

}


void Sleep(Student* stu)//잠을자다

{

printf("%d번 학생 %s 잠을자다.\n",stu->num,stu->name);

Student_SetHP(stu,stu->hp + 10);

Student_SetSTRESS(stu,stu->stress - 5);

stu->scnt  = 0;

}


void Relax(Student* stu)//휴식하다

{

printf("%d번 학생 %s 휴식하다. \n",stu->num, stu->name);

Student_SetHP(stu,stu->hp + 3);

Student_SetSTRESS(stu,stu->stress - 10);

stu->scnt = 0;

}


void Drink(Student* stu)//음료를 마시다

{

printf("%d 번 학생 %s 음료를 마시다.\n",stu->num, stu->name);

Student_SetHP(stu,stu->hp - 10);

Student_SetIQ(stu,stu->iq - 5);

Student_SetSTRESS(stu,stu->stress - 2);

}


void Sing(Student* stu)//노래하다

{

printf("%d 번 학생 %s 노래하다.\n",stu->num,stu->name);

Student_SetHP(stu,stu->hp - 10);

Student_SetIQ(stu,stu->iq + 1);

Student_SetSTRESS(stu,stu->stress  - 5);

stu->scnt = 0;

}


void View(Student* stu)//출력하다

{

printf("학생 이름 : %s \n",stu->name);

printf("학생 체력 : %d 학생 아이큐 : %d 학생 스트레스 : %d\n",stu->hp,stu->iq,stu->stress);

}


void Student_SetHP(Student* stu,int hp)//체력 설정

{

if(MAX_HP < hp)

{

hp = MAX_HP;

}

else if(MIN_HP > hp)

{

hp = MIN_HP;

}

stu->hp = hp;

}

void Student_SetIQ(Student* stu, int iq)//아이큐 설정

{

if(MAX_IQ < iq)

{

iq = MAX_IQ;

}

else if(MIN_IQ > iq)

{

iq = MIN_IQ;

}

stu->iq = iq;

}

void Student_SetSTRESS(Student *stu, int stress)//스트레스 설정

{

if(MAX_STRESS < stress)

{

stress = MAX_STRESS;

}

else if(MIN_STRESS > stress)

{

stress = MIN_STRESS;

}

stu->stress = stress;

}

void Student_SetINCE(Student *stu)//학생번호 설정

{

if(stu->scnt < MAX_SCNT)

{

stu->scnt++;

}

}







//Student.h

#pragma once


#define MAX_LEN 20


typedef struct _Student

{

char name[MAX_LEN]; //이름

int num; //학번

int hp; //체력

int iq; //아이큐

int stress; //스트레스

int scnt; //공부한 횟수

}Student;


enum Student_Infromation

{

MIN_HP = 0, MAX_HP = 100, DEF_HP = 100, 

MIN_IQ = 0, MAX_IQ = 200, DEF_IQ = 100,

MIN_STRESS = 0, MAX_STRESS = 100, DEF_STRESS = 0,

MIN_SCNT = 0, MAX_SCNT = 5, DEF_SCNT = 0

};


void Student_Student(Student* stu, char *name); //생성자

void Study(Student* stu); //공부하다

void ListenLecture(Student *stu); //강의듣다

void Sleep(Student* stu); //잠을자다

void Relax(Student* stu); //휴식하다

void Drink(Student* stu); //음료를 마시다

void Sing(Student* stu); //노래하다

void View(Student* stu); //출력

Student *New_Student(char *name);

void Delete_Student(Student *stu);



============================================================================================

//Program.c

#include "Student.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


int main(void)

{

int _input = 0;

Student *stu1;


while(1)

{

printf("1 : 이름 입력 2 : 국어  3 : 영어 4 : 수학 5 : 평균 6 : 출력\n");

scanf_s("%d",&_input);


switch(_input)

{

case 1:

InputName(stu1);

system("pause");

system("cls");

break;

case 2:

InputKor(stu1);

system("pause");

system("cls");

break;

case 3:

InputEng(stu1);

system("pause");

system("cls");

break;

case 4:

InputMath(stu1);

system("pause");

system("cls");

break;

case 5:

Avg(stu1);

system("pause");

system("cls");

break;

case 6:

Print(stu1);

system("pause");

system("cls");

break;

}

}

}






//Student.c

#include "Student.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


void Student_Constructor(Student *stu, char *name)

{

static int Student_count = 0;

memset(stu,0,sizeof(Student));

strncpy_s(stu->name,(sizeof(stu->name)),name,MAX_NAME_LEN);


stu->kor = DEF_KOR;

stu->eng = DEF_ENG;

stu->grade = DEF_GRADE;

stu->math = DEF_MATH;

stu->avg = DEF_AVG;

}

int InputName(Student *stu)

{

printf("이름을 입력하세요 :\n");

scanf_s(" %s",stu->name,sizeof(stu->name));

}

int InputKor(Student *stu)

{

printf("국어 점수를 입력하세요 :\n");

scanf_s("%d",&stu->kor);


return stu->kor;

}

int InputEng(Student *stu)

{

printf("영어 점수를 입력하세요 :\n");

scanf_s("%d",&stu->eng);


return stu->eng;

}

int InputMath(Student *stu)

{

printf("수학 점수를 입력하세요 :\n");

scanf_s("%d",&stu->math);


return stu->math;

}


double Avg(Student *stu)

{

stu->avg = (double)(stu->kor + stu->eng + stu->math) / 3.0;

return stu->avg;

}

void Print(Student *stu)

{

printf("학생 이름 : %s 입니다.\n",stu->name);

printf("%s학생 국어 점수 : %d점 입니다.\n",stu->kor);

printf("%s학생 영어 점수 : %d점 입니다.\n",stu->eng);

printf("%s학생 수학 점수 : %d점 입니다.\n",stu->math);

printf("%s학생 평균 점수 = %d점 입니다.\n",stu->avg);


}






//Student.h

#pragma once

#define MAX_NAME_LEN 20

typedef struct _Student

{

char name[MAX_NAME_LEN];//이름

int grade; //학년

int kor;

int eng;

int math;

double avg;

}Student;


enum Subject

{

DEF_KOR = 0,DEF_ENG = 0, DEF_MATH = 0,DEF_GRADE = 1,DEF_AVG = 0

};


void Student_Constructor(Student *stu, char *name);

int InputName(Student *stu);

int InputKor(Student *stu);

int InputEng(Student *stu);

int InputMath(Student *stu);

double Avg(Student *stu);

void Print(Student *stu);






728x90

이 글을 공유하기

댓글

Designed by JB FACTORY