이제 Student.c 소스 파일을 프로젝트에 추가하여 구체적으로 기능을 정의하세요.
먼저 필요한 헤더 파일을 포함하는 구문이 필요하겠죠.
#include "Student.h" #include <memory.h> #include <string.h> #include <stdio.h>
먼저 학생 생성자를 작성하세요.
생성자는 학생 데이터를 초기 설정하는 함수예요.
void Student_Student(Student *stu,const 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; 가장 최근에 부여한 학생 번호를 1 증가한 후에 학생 번호를 설정하세요. last_num++; stu->num = last_num; }
이번에는 “공부하다.” 기능을 구현합시다.
void Student_Study(Student *stu) { 먼저 누가 공부하는지 콘솔 화면에 출력하세요. printf("<%d>:%s 공부하다.",stu->num, stu->name); 그리고 시나리오에 나온 것처럼 학생의 능력치를 변경하세요. //학생이 공부하면 체력이 5 소모하며 지력은 연속으로 공부한 횟수만큼 증가하고 스트레스는 2 감소한다. 주의할 점은 능력치가 최대값과 최소값의 범위를 벗어나지 않게 제어하세요. 이러한 부분은 다른 기능에서도 공통적으로 수행해야 하므로 각 능력치를 설정하는 함수를 별도로 제공하여 구현하면 좋아요. Student_SetHP(stu, stu->hp -5); Student_SetIQ(stu, stu->iq + stu->scnt); Student_SetStress(stu, stu->stress - 2); Student_IncreSCnt(stu); }
학생의 능력치를 설정하는 함수는 Student.c 소스 파일에서만 접근할 함수들이죠.
이들 함수의 선언문은 헤더 파일이 아닌 Student.c 소스의 #include 구문 아래에 작성하세요.
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_ListenLecture(Student *stu) { printf("<%d>:%s 강의받다. \n",stu->num, stu->name); //학생이 강의를 받으면 체력은 3 소모하며 지력은 연속으로 공부한 횟수만큼 증가하고 스트레스는 2 증가한다. Student_SetHP(stu, stu->hp -3); Student_SetIQ(stu, stu->iq + stu->scnt); Student_SetStress(stu, stu->stress + 2); stu->scnt = 0; }
나머지 기능도 같은 방법으로 구현하세요.
void Student_Relax(Student *stu) { printf("<%d>:%s 류식하다. \n",stu->num, stu->name); //학생이 휴식하면 체력은 3회복하고 스트레스는 10 감소한다. Student_SetHP(stu, stu->hp +3); Student_SetStress(stu, stu->stress -10); stu->scnt = 0; } void Student_Sleep(Student *stu) { printf("<%d>:%s 잠을자다. \n",stu->num, stu->name); //학생이 잠을 자면 체력은 10 회복하고 스트레스는 5 감소한다. Student_SetHP(stu, stu->hp + 10); Student_SetStress(stu, stu->stress - 5); stu->scnt = 0; } void Student_Drink(Student *stu) { printf("<%d>:%s 음료를 마시다. \n",stu->num, stu->name); //학생이 음료를 마시면 체력이 10 소모하며 지력은 5 감소하고 스트레스는 2 감소한다. Student_SetHP(stu, stu->hp -10); Student_SetIQ(stu, stu->iq - 5); Student_SetStress(stu, stu->stress - 2); stu->scnt = 0; } void Student_Sing(Student *stu) { printf("<%d>:%s 노래하다. \n",stu->num, stu->name); // 학생이 노래하면 체력이 10 소모하며 지력은 1 증가하고 스트레스는 5 감소한다. Student_SetHP(stu, stu->hp -10); Student_SetIQ(stu, stu->iq + 1); Student_SetStress(stu, stu->stress - 5); stu->scnt = 0; }
학생 정보를 출력하는 함수를 작성하세요.
void Student_View(Student *stu) { 학생 번호와 이름은 중요한 데이터이므로 먼저 출력하는 것이 좋겠죠. printf("<%d>:%s\n",stu->num, stu->name); 그리고 나머지 능력치를 출력하세요. 굳이 연속으로 공부한 횟수는 출력할 필요가 없겠죠. 모든 데이터를 최종 사용자에게 알려줄 필요는 없어요. printf("\t 체력:%d 아이큐:%d 스트레스:%d\n",stu->hp, stu->iq,stu->stress); }
이제 각 능력치를 변경하는 함수를 작성하세요.
void Student_SetHP(Student *stu, int hp) { 입력 인자로 전달받은 값이 최대값을 벗어나면 최대값으로 수정하세요. if(hp > MAX_HP) { hp = MAX_HP; } 마찬가지로 최소값을 벗어나면 최소값으로 수정해야겠죠. if(hp < MIN_HP) { hp = MIN_HP; } 이제 수정한 값으로 학생의 hp를 설정하세요. stu->hp = hp; }
아이큐와 스트레스를 설정하는 함수도 같은 방법으로 구현하세요.
void Student_SetIQ(Student *stu, int iq) { if(iq > MAX_IQ) { iq = MAX_IQ; } if(iq < MIN_IQ) { iq = MIN_IQ; } stu->iq = iq; } void Student_SetStress(Student *stu, int stress) { if(stress > MAX_STRESS) { stress = MAX_STRESS; } if(stress < MIN_STRESS) { stress = MIN_STRESS; } stu->stress = stress; }
연속으로 공부한 회수를 증가하는 함수를 작성하세요.
void Student_IncreSCnt(Student *stu) { 학생의 scnt 값이 최대값보다 작을 때만 1 증가하게 하세요. if(stu->scnt < MAX_SCNT) { stu->scnt++; } }
◈ Student.c
#include "Student.h" #include <memory.h> #include <string.h> #include <stdio.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,const char *name) { static int last_num; memset(stu,0,sizeof(Student)); strncpy(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; } void Student_Study(Student *stu) { printf("<%d>:%s 공부하다. \n",stu->num, stu->name); //학생이 공부하면 체력이 5 소모하며 지력은 연속으로 공부한 횟수만큼 증가하고 스트레스는 2 감소한다. Student_SetHP(stu, stu->hp -5); Student_SetIQ(stu, stu->iq + stu->scnt); Student_SetStress(stu, stu->stress - 2); Student_IncreSCnt(stu); } void Student_ListenLecture(Student *stu) { printf("<%d>:%s 강의받다. \n",stu->num, stu->name); //학생이 강의를 받으면 체력은 3 소모하며 지력은 연속으로 공부한 횟수만큼 증가하고 스트레스는 2 증가한다. Student_SetHP(stu, stu->hp -3); Student_SetIQ(stu, stu->iq + stu->scnt); Student_SetStress(stu, stu->stress + 2); stu->scnt = 0; } void Student_Relax(Student *stu) { printf("<%d>:%s 류식하다. \n",stu->num, stu->name); //학생이 휴식하면 체력은 3회복하고 스트레스는 10 감소한다. Student_SetHP(stu, stu->hp +3); Student_SetStress(stu, stu->stress -10); stu->scnt = 0; } void Student_Sleep(Student *stu) { printf("<%d>:%s 잠을자다. \n",stu->num, stu->name); //학생이 잠을 자면 체력은 10 회복하고 스트레스는 5 감소한다. Student_SetHP(stu, stu->hp + 10); Student_SetStress(stu, stu->stress - 5); stu->scnt = 0; } void Student_Drink(Student *stu) { printf("<%d>:%s 음료를 마시다. \n",stu->num, stu->name); //학생이 음료를 마시면 체력이 10 소모하며 지력은 5 감소하고 스트레스는 2 감소한다. Student_SetHP(stu, stu->hp -10); Student_SetIQ(stu, stu->iq - 5); Student_SetStress(stu, stu->stress - 2); stu->scnt = 0; } void Student_Sing(Student *stu) { printf("<%d>:%s 노래하다. \n",stu->num, stu->name); // 학생이 노래하면 체력이 10 소모하며 지력은 1 증가하고 스트레스는 5 감소한다. Student_SetHP(stu, stu->hp -10); Student_SetIQ(stu, stu->iq + 1); Student_SetStress(stu, stu->stress - 5); stu->scnt = 0; } void Student_View(Student *stu) { printf("<%d>:%s\n",stu->num, stu->name); printf("\t 체력:%d 아이큐:%d 스트레스:%d\n",stu->hp, stu->iq,stu->stress); } void Student_SetHP(Student *stu, int hp) { if(hp > MAX_HP) { hp = MAX_HP; } if(hp < MIN_HP) { hp = MIN_HP; } stu->hp = hp; } void Student_SetIQ(Student *stu, int iq) { if(iq > MAX_IQ) { iq = MAX_IQ; } if(iq < MIN_IQ) { iq = MIN_IQ; } stu->iq = iq; } void Student_SetStress(Student *stu, int stress) { if(stress > MAX_STRESS) { stress = MAX_STRESS; } if(stress < MIN_STRESS) { stress = MIN_STRESS; } stu->stress = stress; } void Student_IncreSCnt(Student *stu) { if(stu->scnt < MAX_SCNT) { stu->scnt++; } }