[C언어 소스] 사용자 정의 형식 실습 - 학생
실습 시나리오
학생은 학번, 이름, 체력, 지력, 스트레스, 연속으로 공부한 횟수를 멤버로 갖는다.
학번은 순차적으로 부여하며 이름은 생성할 때 입력인자로 전달받는다.
체력은 초기값이 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 감소한다.
추가로 학생 정보를 출력하는 기능을 제공한다.
//Student.h
#pragma once
#define MAX_NAME_LEN 20
typedef struct _Student Student;
struct _Student
{
char name[MAX_NAME_LEN + 1];//이름
int num; //번호
int hp; //체력
int iq; //지력
int stress; //스트레스
int scnt; //연속으로 공부한 횟수
};
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, const char *name); //생성자
void Student_Study(Student *stu);//공부하다.
void Student_ListenLecture(Student *stu);//강의받다.
void Student_Relax(Student *stu);//휴식하다.
void Student_Sleep(Student *stu);//잠자다.
void Student_Drink(Student *stu);//음료를 마시다.
void Student_Sing(Student *stu);//노래하다.
void Student_View(Student *stu);//자신의 정보를 출력하다.
//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));
strcpy_s(stu->name,MAX_NAME_LEN, name);
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++;
}
}
//디딤돌 C언어 http://ehpub.co.kr
//사용자 정의 형식 실습
#include "Student.h"
#include <stdio.h>
void TestStudent(Student *stu, const char *name);
int main()
{
Student stu1;
Student stu2;
TestStudent(&stu1, "홍길동");
TestStudent(&stu2, "강감찬");
return 0;
}
void TestStudent(Student *stu, const char *name)
{
printf("--------------%s 학생 테스트 시작--------------\n", name);
Student_Student(stu, name);
Student_View(stu);
Student_Study(stu);
Student_View(stu);
Student_Study(stu);
Student_View(stu);
Student_ListenLecture(stu);
Student_View(stu);
Student_Study(stu);
Student_View(stu);
Student_Relax(stu);
Student_View(stu);
Student_Sleep(stu);
Student_View(stu);
Student_Drink(stu);
Student_View(stu);
Student_Sing(stu);
Student_View(stu);
printf("--------------%s 학생 테스트 종료--------------\n", name);
}
실행 결과
--------------홍길동 학생 테스트 시작--------------
<1>:홍길동
체력:100 아이큐:100 스트레스:0
<1>:홍길동 공부하다.
<1>:홍길동
체력:95 아이큐:100 스트레스:0
<1>:홍길동 공부하다.
<1>:홍길동
체력:90 아이큐:101 스트레스:0
<1>:홍길동 강의받다.
<1>:홍길동
체력:87 아이큐:103 스트레스:2
<1>:홍길동 공부하다.
<1>:홍길동
체력:82 아이큐:103 스트레스:0
<1>:홍길동 류식하다.
<1>:홍길동
체력:85 아이큐:103 스트레스:0
<1>:홍길동 잠을자다.
<1>:홍길동
체력:95 아이큐:103 스트레스:0
<1>:홍길동 음료를 마시다.
<1>:홍길동
체력:85 아이큐:98 스트레스:0
<1>:홍길동 노래하다.
<1>:홍길동
체력:75 아이큐:99 스트레스:0
--------------홍길동 학생 테스트 종료--------------
--------------강감찬 학생 테스트 시작--------------
<2>:강감찬
체력:100 아이큐:100 스트레스:0
<2>:강감찬 공부하다.
<2>:강감찬
체력:95 아이큐:100 스트레스:0
<2>:강감찬 공부하다.
<2>:강감찬
체력:90 아이큐:101 스트레스:0
<2>:강감찬 강의받다.
<2>:강감찬
체력:87 아이큐:103 스트레스:2
<2>:강감찬 공부하다.
<2>:강감찬
체력:82 아이큐:103 스트레스:0
<2>:강감찬 류식하다.
<2>:강감찬
체력:85 아이큐:103 스트레스:0
<2>:강감찬 잠을자다.
<2>:강감찬
체력:95 아이큐:103 스트레스:0
<2>:강감찬 음료를 마시다.
<2>:강감찬
체력:85 아이큐:98 스트레스:0
<2>:강감찬 노래하다.
<2>:강감찬
체력:75 아이큐:99 스트레스:0
--------------강감찬 학생 테스트 종료--------------
본문
[디딤돌 C언어] 77. 사용자 정의 형식 - 시나리오
[디딤돌 C언어] 78. 사용자 정의 형식 – 형식 정의
[디딤돌 C언어] 79. 사용자 정의 형식 – 기능 구현
'C언어 > 디딤돌 C언어 예제' 카테고리의 다른 글
[C언어 소스] n명의 학생 성적 입력받아 출력(malloc 함수 사용) (0) | 2016.12.01 |
---|---|
[C언어 소스] malloc 함수 사용 (기본 형식 메모리 동적 할당) (0) | 2016.12.01 |
[C언어 소스] 성별을 표현할 수 있는 Gender 열거형 정의 (0) | 2016.11.30 |
[C언어 소스] 공용체 하나의 멤버를 변경하면 다른 멤버의 값에 영향 (0) | 2016.11.30 |
[C언어 소스] 공용체와 구조체의 메모리 크기 비교 (0) | 2016.11.30 |