언어 자료구조 알고리즘/디딤돌 C언어

[C언어] 79. 사용자 정의 형식 실습 - 기능 구현

언제나휴일 2016. 4. 17. 16:29
반응형




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

반응형