문제 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
'대학교 > 프로그래밍랩' 카테고리의 다른 글
[프로그래밍 랩] 6주차 - 행렬, 구조체, 포인터 (0) | 2021.10.07 |
---|---|
[프로그래밍 랩] 5주차 - 난수, 확률, 통계 (0) | 2021.09.30 |
[프로그래밍 랩] 4주차 - 재귀 (0) | 2021.09.26 |
[프로그래밍 랩] 2주차 - C언어 복습 2 (0) | 2021.09.11 |
[프로그래밍 랩] 1주차 - C언어 복습 1 (0) | 2021.09.10 |