대학교/프로그래밍랩

[프로그래밍 랩] 3주차 - 실행 시간

CodeJin 2021. 9. 18. 21:44

문제 1. 현재 시간

현재 시간을 출력한다.

 

//time_t : 시스템의 현재 시간을 가져온다. (1970년 기준 1초 단위로 증가 값)
//time_t time(time_t *timer);
//timer : 시간이 저장된 포인터의 위치
//반환값 : 1970년 1월 1일부터 경과한 시간을 돌려준다.
//ctime : UTC로 시간을 지역 설정(우리나라 표준시간)에 맞게 시간을 바꾸어 준다. 
//char *ctime(const time_t *timer);
//timer : 시간이 저장된 포인터
// struct tm *localtime(const time_t *timer) : 현재시간

//struct tm { /* a broken-down time */
//int tm_sec; /* seconds after the minute: [0 - 60] */
//int tm_min; /* minutes after the hour: [0 - 59] */
//int tm_hour; /* hours after midnight: [0 - 23] */
//int tm_mday; /* day of the month: [1 - 31] */
//int tm_mon; /* months since January: [0 - 11] */
//int tm_year; /* years since 1900 */
//int tm_wday; /* days since Sunday: [0 - 6] */
//int tm_yday; /* days since January 1: [0 - 365] */
//int tm_isdst; /* daylight saving time flag: <0, 0, >0 */
//};

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>


int main()
{
    time_t now = time(NULL);
    struct tm* tp = localtime(&now);
    char* weeks[] = { "일", "월", "화", "수", "목", "금", "토" };
    now = time(NULL); //time(&now); // 
    printf("now = %d\n", now);
    printf("ctime() : %s", ctime(&now));
    printf("%d년 %d월 %d일 %s요일 %d시 %d분 %d초\n", (tp->tm_year) + 1900, (tp->tm_mon) + 1, tp->tm_mday,
        weeks[tp->tm_wday], tp->tm_hour, tp->tm_min, tp->tm_sec);
    return 0;
}

 

문제 2. 움직이는 시계

문제 1에서 사용한 ctime()을 무한loop를 돌면서 출력하면

과 같이 될 것이다. 이러면 보기가 매우 힘드니

이렇게 출력되도록 바꿔보자.

 

Escape Sequence인 \r을 활용한다

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>

int main()
{
    time_t now;
    struct tm* tp;
    char* weeks[] = { "일", "월", "화", "수", "목", "금", "토" };
    while (1) {
        now = time(NULL);
        tp = localtime(&now);
        printf("%d년 %d월 %d일 %s요일 %d시 %d분 %d초\r", (tp->tm_year) + 1900, (tp->tm_mon) + 1, tp->tm_mday,
            weeks[tp->tm_wday], tp->tm_hour, tp->tm_min, tp->tm_sec);
    }
    return 0;
}

 

문제 3. 실행 시간 측정

특정 코드가 실행되는데 걸리는 시간을 측정하는 기법을 배운다. clock() 함수의 경우 millisec단위로 시간을 측정하는 함수이다. clock() 함수는 다음과 같다.

clock_t clock()

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <time.h> 
void main(void)
{
    clock_t start, finish;
    double duration = 0.;
    int i, j, k=0;
    start = clock();
    // 수행시간을 측정하고자 하는 코드.... 
    for (i = 1; i <= 10000; i++)
        for (j = 1; j <=10000; j++)
            k++;
    finish = clock();
    duration = (double)(finish - start) / CLOCKS_PER_SEC;
    printf("%lf 초입니다.\n", duration);
}

 

문제 4. 시작/종료 및 실행 시간 측정

문제 3의 연장문제. 실행시간을 측정하는데, 이번에는 실행 시작 시간과 종료 시간도 같이 출력해보자.

// Lab3-4 시작/종료 및 실행 시간 측정
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
void main(void ) 
{ 
    clock_t start, finish; 
    double  duration = 0.; 
    int i, j, k = 0;
    time_t now;
    struct tm *tp;
    time(&now);
    printf("시작 : %s", ctime(&now) );
    start = clock();
    for (i=1;i<=100000;i++)
        for (j=1;j<100000;j++)
            k++;
    finish = clock();
    time(&now);
    printf("종료 : %s",ctime(&now));
    duration = (double)(finish - start) / CLOCKS_PER_SEC;
    printf("실행시간 = %lf 초입니다.\n\n", duration); 
    
    // 추가 문제 struct tm 사용
    // 시작 : 시:분:초
    // 종료 : 시:분:초

    time(&now);
    tp = localtime(&now);
    printf("시작 : %d:%d:%d\n", tp->tm_hour, tp->tm_min, tp->tm_sec);
    start = clock();
    for (i = 1; i <= 100000; i++)
        for (j = 1; j < 100000; j++)
            k++;
    finish = clock();
    time(&now);
    tp = localtime(&now);
    printf("종료 : %d:%d:%d\n", tp->tm_hour, tp->tm_min, tp->tm_sec);
    duration = (double)(finish - start) / CLOCKS_PER_SEC;
    printf("실행시간 = %lf 초입니다.\n", duration);
}

 

문제 5. 스톱워치

enter키를 누르면 스톱워치가 시작하고, 경과시간을 계속 출력한다(\r을 활용해서).

hint : conio.h헤더의 kbhit()이라는 함수를 사용한다. kbhit()함수는 키보드가 눌렸다면 1을 반환하는 함수이다.

// Lab3-5 스톱워치
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>
#include <conio.h>

void main(void) 
{ 
    clock_t start=0, now=0; 
    clock_t duration = 0, sec =0, min=0, hour=0, milsec=0;
    printf("Enter 로 시작 아무키나 누르면 종료\n");
    getchar();
    start = clock();
    while (1) {
        now = clock();
        duration = now - start;
        sec = (duration / CLOCKS_PER_SEC);
        milsec = duration % CLOCKS_PER_SEC;
        hour = sec / 3600;
        min = (sec % 3600) / 60;
        sec %= 60;
        printf("%d:%02d:%02d.%03d\r", hour, min, sec, milsec);
        if (kbhit()) // 아무 key나 누르면 종료한다.
            break;
    }
    printf("\n");
}

 

문제 6(과제). 타이머

타이머 시간을 입력받고 남은 시간을 계속 출력한다. 끝나면 알람을 울린다. 문제 5의 연장문제.

// Lab3-6 타이머
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>
#include <conio.h>
void main(void) {
    int timer;
    clock_t start, now, remain;
    clock_t duration, sec, min, hour, milsec;
    printf("Timer 정할 시간(초) 입력 : ");
    scanf("%d", &timer);
    timer *= 1000; // 초 -> 밀리초 변환
    start = clock();
    while (1) {
        now = clock();
        // 지나간 시간
        duration = now - start;
        // 남은 시간
        remain = timer - duration;
        // 남은 시간 출력
        sec = remain / CLOCKS_PER_SEC;
        milsec = remain % CLOCKS_PER_SEC;
        hour = sec / 3600;
        min = (sec % 3600) / 60;
        sec %= 60;
        printf("%d:%02d:%02d.%03d\r", hour, min, sec, milsec);
        if (remain == 0)
            break;
        if (kbhit()) {
            char ch = getch();
            if (ch == ' ') break;
        }
    }
    printf("\n알람!!\a\n");
}

 

문제 7. 백준 10253번

골드 문제를 내는게 말이 됩니까 교수님

https://codejin.tistory.com/74

 

백준 10253번 C언어 풀이

https://www.acmicpc.net/problem/10253 10253번: 헨리 입력 데이터는 표준입력을 사용한다. 입력은 T 개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 개수 T 가 정수로 주어진다. 각

codejin.tistory.com