[문제 1]
/*
[예제 2.3.2]를 참고하여 현재의 연도와 월을 반환하는 int 형 함수 year와 month를 작성하시오
*/
#include <stdio.h>
#include <time.h>
int year(struct tm *d)
{
return d->tm_year + 1900;
}
int month(struct tm *d)
{
return d->tm_mon + 1;
}
int main(void)
{
time_t curr;
struct tm *d;
curr = time(NULL);
d = localtime(&curr);
printf("현재의 연도:%d\n", year(d));
printf("현재의 월:%d\n", month(d));
return 0;
}
[문제 2]
/*
[예제 2.3.2]를 참고하여 현재의 시간과 분을 반환하는 int형 함수 hour와 minute을 작성하시오
*/
#include <stdio.h>
#include <time.h>
int hour(struct tm *d)
{
return d->tm_hour;
}
int minute(struct tm *d)
{
return d->tm_min;
}
int main(void)
{
time_t curr;
struct tm *d;
curr = time(NULL);
d = localtime(&curr);
printf("현재의 시간:%d\n", hour(d));
printf("현재의 분:%d\n", minute(d));
return 0;
}
[문제 3]
/*
[예제 2.3.6]을 참고하여 특정일의 요일을 숫자로 반환하는 함수 weekday를 작성하시오
함수 weekday의 결과가 1이면 월요일을 의미합니다
*/
#include <stdio.h>
#include <time.h>
int weekday(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;
//윤년횟수
total = (year - 1) * 365L + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;
if (!(year % 4) && year % 100 || !(year % 400))
months[1]++;
for (i = 0; i < month - 1; i++)
total += months[i];
total += day;
return total % 7;
}
int main(void)
{
char *week[] = { "일","월","화","수","목","금","토" };
int year, month, day;
printf("무슨 요일인지 알고 싶은 날짜를 적으세요:");
scanf("%d %d %d", &year, &month, &day);
printf("오늘은 %s요일입니다\n", week[weekday(year, month, day)]);
return 0;
}
[문제 4]
/*
세계 주요도시의 현재 시간을 출력하는 프로그램을 작성하시오.
아래의 표는 나라를 기준으로 하는 세계 주요도시의 시차를 나타냅니다
*/
#include <stdio.h>
#include <time.h>
void Seoul(void)
{
int year, month, day, hour, min, sec;
time_t curr;
struct tm *d;
curr = time(NULL);
d = localtime(&curr);
year = d->tm_year + 1900;
month = d->tm_mon + 1;
day = d->tm_mday;
hour = d->tm_hour;
min = d->tm_min;
sec = d->tm_sec;
printf("%d년 %d월 %d일 서울, 동경의 현재 시각은 %d시 %d분 %d초입니다\n", year, month, day, hour, min, sec);
}
void London(void)
{
int year, month, day, hour, min, sec;
time_t curr;
struct tm *d;
curr = time(NULL);
d = localtime(&curr);
year = d->tm_year + 1900;
month = d->tm_mon + 1;
day = d->tm_mday;
hour = d->tm_hour-9;
if (hour <= 0) //전날일 경우
{
hour = 24 + hour;
day = day - 1;
}
min = d->tm_min;
sec = d->tm_sec;
printf("%d년 %d월 %d일 런던의 현재 시각은 %d시 %d분 %d초입니다\n", year, month, day, hour, min, sec);
}
void Paris(void)
{
int year, month, day, hour, min, sec;
time_t curr;
struct tm *d;
curr = time(NULL);
d = localtime(&curr);
year = d->tm_year + 1900;
month = d->tm_mon + 1;
day = d->tm_mday;
hour = d->tm_hour - 8;
if (hour <= 0)
{
hour = 24 + hour;
day = day - 1;
}
min = d->tm_min;
sec = d->tm_sec;
printf("%d년 %d월 %d일 로마, 파리의 현재 시각은 %d시 %d분 %d초입니다\n", year, month, day, hour, min, sec);
}
void Bangkok(void)
{
int year, month, day, hour, min, sec;
time_t curr;
struct tm *d;
curr = time(NULL);
d = localtime(&curr);
year = d->tm_year + 1900;
month = d->tm_mon + 1;
day = d->tm_mday;
hour = d->tm_hour-2;
if (hour <= 0)
{
hour = 24 + hour;
day = day - 1;
}
min = d->tm_min;
sec = d->tm_sec;
printf("%d년 %d월 %d일 방콕의 현재 시각은 %d시 %d분 %d초입니다\n", year, month, day, hour, min, sec);
}
void Hongkong(void)
{
int year, month, day, hour, min, sec;
time_t curr;
struct tm *d;
curr = time(NULL);
d = localtime(&curr);
year = d->tm_year + 1900;
month = d->tm_mon + 1;
day = d->tm_mday;
hour = d->tm_hour-1;
if (hour <= 0)
{
hour = 24 + hour;
day = day - 1;
}
min = d->tm_min;
sec = d->tm_sec;
printf("%d년 %d월 %d일 홍콩, 베이징의 현재 시각은 %d시 %d분 %d초입니다\n", year, month, day, hour, min, sec);
}
void Sydney(void)
{
int year, month, day, hour, min, sec;
time_t curr;
struct tm *d;
curr = time(NULL);
d = localtime(&curr);
year = d->tm_year + 1900;
month = d->tm_mon + 1;
day = d->tm_mday;
hour = d->tm_hour+2;
if (hour > 24) //다음날일 경우
{
hour = hour - 24;
day = day + 1;
}
min = d->tm_min;
sec = d->tm_sec;
printf("%d년 %d월 %d일 시드니, 멜버른의 현재 시각은 %d시 %d분 %d초입니다\n", year, month, day, hour, min, sec);
}
void LosAngeles(void)
{
int year, month, day, hour, min, sec;
time_t curr;
struct tm *d;
curr = time(NULL);
d = localtime(&curr);
year = d->tm_year + 1900;
month = d->tm_mon + 1;
day = d->tm_mday;
hour = d->tm_hour-17;
if (hour <= 0)
{
hour = 24 + hour;
day = day - 1;
}
min = d->tm_min;
sec = d->tm_sec;
printf("%d년 %d월 %d일 엘에이의 현재 시각은 %d시 %d분 %d초입니다\n", year, month, day, hour, min, sec);
}
void NewYork(void)
{
int year, month, day, hour, min, sec;
time_t curr;
struct tm *d;
curr = time(NULL);
d = localtime(&curr);
year = d->tm_year + 1900;
month = d->tm_mon + 1;
day = d->tm_mday;
hour = d->tm_hour-14;
if (hour <= 0)
{
hour = 24 + hour;
day = day - 1;
}
min = d->tm_min;
sec = d->tm_sec;
printf("%d년 %d월 %d일 뉴욕의 현재 시각은 %d시 %d분 %d초입니다\n", year, month, day, hour, min, sec);
}
int main(void)
{
printf("세계 주요도시의 현재 시간 출력\n");
London();
Paris();
Bangkok();
Hongkong();
Seoul();
Sydney();
LosAngeles();
NewYork();
return 0;
}
[문제 5]
/*
특정일로부터 n일 후가 언제인지를 계산하는 함수를 작성하시오
*/
#include <stdio.h>
#include <time.h>
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;
total = (year - 1) * 365L + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;
if (!(year % 4) && year % 100 || !(year % 400))
months[i]++;
for (i = 0; i<month - 1; i++)
total += months[i];
total += day;
return total;
}
void WhatDay(int year, int month, int day, long n)
{
int months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int nextYear = total_days(year, 12, 31) - total_days(year, month, day); //다음해가 되기까지의 일 수
//printf("%d\n", nextYear);
int original = n; //기존 n일 후
int i;
int after;
if (n > nextYear) //n일이 다음 해를 넘기면
{
n -= nextYear;
year++;
after = n;
if (!(year % 4) && year % 100 || !(year % 400)) //윤년 횟수
after--;
for (i = 0; i < (n / 365); i++)
{
after -= 365; //일년씩 빼끼
year++;
if (!(year % 4) && year % 100 || !(year % 400))
after--;
}
if (!(year % 4) && year % 100 || !(year % 400))
months[1]++;
for (i = 0; after > months[i]; i++)
after -= months[i];
month = i + 1;
day = after;
}
else //n일이 다음해를 안 넘기면
{
after = n;
if (!(year % 4) && year % 100 || !(year % 400))
months[1]++;
if (day + after < months[month - 1]) //일 수를 더해도 그 달을 못 넘으면
{
day = day + after;
}
else
{
after = after - (months[month - 1] - day);
//printf("%d\n", after);
month++;
for (i = month - 1; after > months[i]; i++)
{
after = after - months[i];
month++;
}
day = after;
}
}
printf("기준일로부터 %d일 후의 날짜는 %d년 %d월 %d일입니다\n", original, year, month, day);
return 0;
}
int main(void)
{
int year, month, day;
long n;
printf("원하는 날짜 입력(년 월 일):");
scanf("%d %d %d", &year, &month, &day);
printf("몇일 후의 날짜를 원하십니까?");
scanf("%ld", &n);
WhatDay(year, month, day, n);
return 0;
}
[문제 6]
/*
n분 후 또는 n초 후에 알람이 울리는 타이머(timer) 함수를 작성하시오.
알람소리출력은 확장 문자열(escape sequence)을 이용하여 printf("\a");로 나타냅니다
*/
#include <stdio.h>
#include <time.h>
#include <Windows.h> //Sleep
void alarm(int sec)
{
Sleep(sec*1000);
printf("\a");
}
int main(void)
{
int sel;
int min, sec;
printf("1:n분 후 알람\t2:n초 후 알람:");
scanf("%d", &sel);
switch (sel)
{
case 1:
printf("몇 분 후 알람이 울리도록 하시겠습니까?");
scanf("%d", &min);
min *= 60; //초 단위로 환산
alarm(min);
break;
case 2:
printf("몇 초 후 알람이 울리도록 하시겠습니까?");
scanf("%d", &sec);
alarm(sec);
break;
}
return 0;
}
[문제 7]
/*
현재 날짜와 시간을 다양한 방법으로 출력하는 프로그램을 작성하시오
(영어권 표시법, 오전 오후 표시 등)
*/
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t curr;
struct tm *d;
curr = time(NULL);
d = localtime(&curr);
char *AMPM[] = { "오전", "오후" };
printf("영어권 표기법\n");
printf("%d일 %d월 %d년, %d시 %d분 %d초\n", d->tm_mday, d->tm_mon + 1, d->tm_year + 1900, d->tm_hour, d->tm_min, d->tm_sec);
printf("오전오후 표시\n");
if (d->tm_hour > 12)
printf("%d년 %d월 %d일 %s %d시 %d분 %d초\n", d->tm_year + 1900, d->tm_mon + 1, d->tm_mday, AMPM[1], d->tm_hour-12, d->tm_min, d->tm_sec);
else
printf("%d년 %d월 %d일 %s %d시 %d분 %d초\n", d->tm_year + 1900, d->tm_mon + 1, d->tm_mday, AMPM[0], d->tm_hour, d->tm_min, d->tm_sec);
return 0;
}
[문제 8]
/*
특정한 년과 월을 입력받아 해당 월의 달력을 출력하는 방법에 대해서 논의하시오
*/
#include <stdio.h>
#include <time.h>
int main(void)
{
int year, month, day;
int months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int lastyear;
printf("몇년 몇월의 달력을 출력하시겠습니까?");
scanf("%d %d", &year, &month);
if (!(year % 4) && year % 100 || !(year % 400)) //윤년이라면 2월 29일
months[1]++;
lastyear = year - 1; //작년말까지 진행된 요일 계산 위해
//1년이 지날때마다 요일이 한칸씩 앞으로
//윤년 같은 경우 요일이 두칸씩 앞으로(작년까지 있던 윤년을 더한다)
//1년 1월 1일은 월요일이므로 1을 더함
day = (lastyear + (lastyear / 4) - (lastyear / 100) + (lastyear / 400) + 1) % 7;
for (int i = 0; i < month - 1; i++)
day += months[i];
day %= 7; //전 달의 마지막날이 무슨 요일인지 판별
printf("\n\t\t\t%d년\t%d일\t\t\t\n", year, month);
printf("\n 일\t 월\t 화\t 수\t 목\t 금\t 토");
for (int i = -day; i < months[month]; i++)
{
if ((i + day) % 7 == 0) //토요일까지 출력하고 개행
printf("\n");
if (i < 0) //i가 0일경우 그 전 달 일 수이기 때문에 출력 X
printf("\t");
else
printf("%3d\t", i + 1);
}
printf("\n");
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 명품 C언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 3.2장 연습문제 (0) | 2017.06.09 |
---|---|
명품 C언어 프로젝트 3.1장 연습문제 (0) | 2017.06.07 |
[C언어] 시간과 날짜와 관련된 함수들 (4) | 2017.06.02 |
명품 C언어 프로젝트 2.2장 연습문제 (0) | 2017.05.31 |
명품 C언어 프로젝트 2.1장 연습문제 (7) | 2017.05.28 |