[응용 11.2.1]
/*
바이오리듬 결과 출력 프로그램
*/
#include <stdio.h>
#include <math.h>
#define PI 3.141592
long total_days(int year, int month, int day);
void print_biorhythm(long total, int month);
char bio_status(int val, int mod);
int main(void)
{
int byr, bmon, bday;
int tyr, tmon, tday;
long total = 0;;
printf("특정월의 바이오리듬 계산\n");
printf("첫번째 날짜와 두번째 날짜를 입력하고 Enter 하세요.\n");
printf("첫번째 날짜가 두번째 날짜보다 앞서야 합니다. \n\n");
printf("생년 월일을 입력하세요 (ex: 1983 5 21): ");
scanf("%d%d%d", &byr, &bmon, &bday);
printf("보시고 싶은 년도와 월을 입력하세요. (ex: 2004 11): ");
scanf("%d%d", &tyr, &tmon);
tday = 1;
total = total_days(tyr, tmon, tday) - total_days(byr, bmon, bday);
printf("두 날짜 사이의 날짜수는 %ld일 입니다. \n\n", total);
printf("바이오리듬 결과:\n");
printf("\t 저조기(-), 고조기(+), 위험기(D)\n");
print_biorhythm(total, tmon);
return 0;
}
/*
기준일(1년 1월 1일)로부터 특정일 사이의 날짜 수의 계산 함수 total_days
*/
long total_days(int year, int month, int day)
{
int months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int i;
long total = 0L;
//4로 나누어지는 회수-100으로 나누어지는 횟수(평년)+400으로 나누어지는 횟수
total = (year - 1) * 365L + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;
if (!(year % 4) && year % 100 || !(year % 400)) //윤년일 때만 2월달 일 수 하루 추가
months[1]++;
for (i = 0; i < month - 1; i++)
total += months[i];
total += day;
return total;
}
/*
바이오리듬의 상태를 판단하는 함수 bio_status
*/
char bio_status(int v, int mod)
{
char result;
double r;
r = sin(v*3.141592 / (mod / 2.0));
if (r < -0.2)
result = '-'; //저조기
else if ((-0.2 <= r) && (r <= 0.2))
result = 'D'; //위험기
else
result = '+'; //고조기
return result;
}
/*
바이오리듬의 결과를 출력하는 함수 print_biorhythm
*/
void print_biorhythm(long total, int month)
{
int dayindex;
int physical, emotion, intellect;
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
{
for (dayindex = 1; dayindex <= 31; dayindex++)
{
physical = total % 23;
emotion = total % 28;
intellect = total % 33;
printf("%d월 %2d일", month, dayindex);
printf(" 신체:%2d %c ", physical, bio_status(physical, 23));
printf(" 감정:%2d %c ", emotion, bio_status(emotion, 28));
printf(" 지성:%2d %c\n", intellect, bio_status(intellect, 33));
total++;
}
}
else if (month == 2)
{
for (dayindex = 1; dayindex <= 28; dayindex++)
{
physical = total % 23;
emotion = total % 28;
intellect = total % 33;
printf("%d월 %2d일", month, dayindex);
printf(" 신체:%2d %c ", physical, bio_status(physical, 23));
printf(" 감정:%2d %c ", emotion, bio_status(emotion, 28));
printf(" 지성:%2d %c\n", intellect, bio_status(intellect, 33));
total++;
}
}
else
{
for (dayindex = 1; dayindex <= 30; dayindex++)
{
physical = total % 23;
emotion = total % 28;
intellect = total % 33;
printf("%d월 %2d일", month, dayindex);
printf(" 신체:%2d %c ", physical, bio_status(physical, 23));
printf(" 감정:%2d %c ", emotion, bio_status(emotion, 28));
printf(" 지성:%2d %c\n", intellect, bio_status(intellect, 33));
total++;
}
}
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 명품 C언어 프로젝트 안기수 저
*개선과 확장 문제는 시간나는대로 올리겠습니다
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 11.3장 같은 문자 찾는 게임 (0) | 2017.11.18 |
---|---|
명품 C언어 프로젝트 11.2장 바이오리듬 개선과 확장 (0) | 2017.11.14 |
명품 C언어 프로젝트 11.1장 디지털 주판 (0) | 2017.11.04 |
명품 C언어 프로젝트 10.5장 설문 조사 프로그램 (0) | 2017.10.30 |
명품 C언어 프로젝트 10.4장 교실 내의 자리배치 (0) | 2017.10.09 |