C/명품 C언어 프로젝트(안기수 저)

명품 C언어 프로젝트 2.3장 연습문제

꾸준함. 2017. 6. 2. 23:25

[문제 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언어 프로젝트 안기수 저


반응형