79. 사용자 정의 형식 실습 – 기능 구현

이제 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++;
    }
}