컴퓨터/Projects
#include<stdio.h>
#include<time.h>
#include<Windows.h>
#include<conio.h>
int main() {
while (1) {
//메뉴 입력
system("cls");
printf("\t=== Test Program ==\n\n");
int input;
printf("1.스톱워치\t2.타이머\t3.종료\n\n");
printf("원하는 메뉴를 입력 하세요 : ");
scanf_s("%d", &input);
//메뉴에 따른 제어
if (input > 0 && input < 4) {
if (input == 3) {
printf("프로그램을 종료 합니다.");
break;
}
switch (input)
{
case 1:
/*
* 아래 기능을 포함하여 구현 예정
* 시작 | 기록 | 정지 | 초기화
*/
printf("아무키나 누르면 시작 합니다.");
system("pause");
//clock함수를 이용
clock_t start_time = clock();
while (1) {
/*
clock_t time = clock();
//형식 변환
double time_double = (double)time / 1000;
printf("%.3lf\n", time_double);
system("cls");
if (time_double > 10) break;
*/
clock_t curr_time = clock() - start_time;
double time_double = (double)curr_time / 1000;
printf("%.3lf\n", time_double);
//키 입력을 받았을때 멈추기
if (_kbhit()) {
system("pause");
break;
}
system("cls");
}
printf("1번\n");
system("pause");
break;
case 2:
/*
* 시간 / 분 / 초를 이용한 타이머 카운팅 시작하게 구현 예정
* 최대 100시간 ?
* 입력을 통해 카운팅 시간 설정
* 시작 | 정지 | 초기화
*/
printf("2번\n");
system("pause");
break;
}
}
//예외 처리
else {
while (getchar() != '\n') {}
printf("잘못된 입력입니다.");
system("pause");
}
}
return 0;
}
지난번에는 clock_t와 clock()를 이용하여
프로그램이 시작된 이후부터의 시간을 카운팅 하는 방법을 적용하였습니다. 이제 이것을 잘 적용해서 스톱워치에 진입했을 때를 기준으로 해서 카운팅을 하였습니다.
방법을 정리하자면 아래와 같습니다.
구현 소스코드부분을 자세히 보면 아래와 같습니다.
/*
스톱워치 기능 선택 이후의 동작
*/
//지금까지 프로그램이 작동된 시간을 받습니다. ( ex : 30초)
clock_t start_time = clock();
// start_time = 30000
while (1) {
//반복문을 통해서 계속해서 시간을 카운팅 한다.
//해석하자면 curr_time = 프로그램 작동된 시간 - start_time(30초)
//시작된 순간은 0초 이후부터 계속 카운팅된다.
clock_t curr_time = clock() - start_time;
}
이제 생각하는 것처럼 스톱워치 기능을 누른 이후부터 초단위로 시간을 카운팅 할 수 있게 구현했다.
자, 이제 카운팅을 하기 시작했으니 '원하는 시점에 스톱'을 하는 기능을 구현해야 합니다.
일단 무슨 키든 입력됬다고 컴퓨터가 인지한 순간 스톱워치를 멈추게 하는 기능을 구현하려고 합니다.
console의 in/out에 관련된 내용이 들어있는 라이브러리 헤더를 추가합니다.
#include<conio.h>
이 라이브러리는 표준이 아니며 window에서만 동작합니다. (호환성이 떨어집니다.)
이 라이브러리 안에 __kbhit() 함수를 사용합니다. 이 함수는 '키보드의 입력이 있으면 1 없으면 0을 반환합니다.
함수의 원형은 다음과 같습니다.
int kbhit(void)
//입력이 있으면 return 1
//입력이 없으면 return 0
이 kbhit()을 이용하여 어떤 키가 입력돼도 화면을 멈추고 카운팅을 종료하도록 소스코드를 작성했습니다.
while(1){
/*
연속적으로 카운팅 하는 소스코드
*/
//키 입력을 받았을때 멈추기
if (_kbhit()) {
system("pause");
break;
}
system("cls");
}
/*
화면 클리어 및 메뉴로 이동 ? 이후 소스코드 작성 필요
*/
이 시점에 주의할 점은 키 입력을 받아 화면을 멈추고 종료하는 범위가 화면 클리어하는 영역을 고려해야 됩니다.
논리적 순서가 어긋날 경우 스톱워치는 정상적으로 멈추나 멈춘 결과를 못 보는 경우가 생길 수 있습니다.
(아니면 따로 저장을 해서 다시 출력하는 방법도 있습니다.)
약간 불필요한 주석등을 정리하고, 다음 포스트 목표는 다음과 같습니다.
#include<stdio.h>
#include<time.h>
#include<Windows.h>
#include<conio.h>
int main() {
while (1) {
//메뉴 입력
system("cls");
printf("\t=== Test Program ==\n\n");
int input;
printf("1.스톱워치\t2.타이머\t3.종료\n\n");
printf("원하는 메뉴를 입력 하세요 : ");
scanf_s("%d", &input);
//메뉴에 따른 제어
if (input > 0 && input < 4) {
if (input == 3) {
printf("프로그램을 종료 합니다.");
break;
}
switch (input)
{
case 1:
/*
* 아래 기능을 포함하여 구현 예정
* 시작 | 기록 | 정지 | 초기화
*/
printf("아무키나 누르면 시작 합니다.");
system("pause");
clock_t start_time = clock();
while (1) {
clock_t curr_time = clock() - start_time;
double time_double = (double)curr_time / 1000;
printf("%.3lf\n", time_double);
//키 입력을 받았을때 멈추기
if (_kbhit()) {
break;
}
system("cls");
}
system("pause");
break;
case 2:
/*
* 시간 / 분 / 초를 이용한 타이머 카운팅 시작하게 구현 예정
* 최대 100시간 ?
* 입력을 통해 카운팅 시간 설정
* 시작 | 정지 | 초기화
*/
printf("2번\n");
system("pause");
break;
}
}
//예외 처리
else {
while (getchar() != '\n') {}
printf("잘못된 입력입니다.");
system("pause");
}
}
return 0;
}
C언어로 스톱워치/타이머 만들기5 - 구조 다듬기(함수화) (0) | 2021.12.31 |
---|---|
C언어로 스톱워치/타이머 만들기5 - 기본 구현하기4(타이머기능 개선) (0) | 2021.12.15 |
C언어로 스톱워치/타이머 만들기4 - 기본 구현하기3(타이머기능 구현) (0) | 2021.12.14 |
C언어로 스톱워치/타이머 만들기3 - 기본구현하기2(일시정지/재시작 초기화/디자인) (0) | 2021.12.11 |
C언어로 스톱워치/타이머 만들기1 - 시작 (0) | 2021.12.03 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet