C언어로 스톱워치/타이머 만들기2 - 기본 구현하기

컴퓨터/Projects

728x90
반응형

Github - 그간의 행적 확인

 

GitHub - Gon-91/Timer

Contribute to Gon-91/Timer development by creating an account on GitHub.

github.com

이전 포스트

 

C언어로 스톱워치/타이머 만들기 - 시작

배경 효율적인 C언어 공부를 하기 위해서 시작하는 첫 프로젝트 아닌 프로젝트. 목표는 어찌 되든 배포 파일까지 만들어 결과를 만들어 보기. 필요한 공부 내용들을 정리하며 프로젝트 일지를

blog-of-gon.tistory.com


오늘의 목표

  • 스톱워치를 원하는 시점부터 카운팅을 하게 구현하기
  • 스톱워치를 키 입력을 받았을 때 멈추기 

전체 소스코드

#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()를 이용하여 

프로그램이 시작된 이후부터의 시간을 카운팅 하는 방법을 적용하였습니다. 이제 이것을 잘 적용해서 스톱워치에 진입했을 때를 기준으로 해서 카운팅을 하였습니다.

방법을 정리하자면 아래와 같습니다.

  1. clock() 함수를 사용하면 프로그램이 시작된 순간부터 지금까지 작동한 시간을 호출한다.
  2. 그렇다면 clock() 함수를 사용해서 스톱워치 기능을 들어가는 순간의 시간을 저장한다.
  3. 이후 반복문을 통해서 그 시간을 기준점과 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;
            
    }

이제 생각하는 것처럼 스톱워치 기능을 누른 이후부터 초단위로 시간을 카운팅 할 수 있게 구현했다.

 

스톱워치 기능 구현 - 스톱

자, 이제 카운팅을 하기 시작했으니 '원하는 시점에 스톱'을 하는 기능을 구현해야 합니다.

일단 무슨 키든 입력됬다고 컴퓨터가 인지한 순간 스톱워치를 멈추게 하는 기능을 구현하려고 합니다.

  • #include <conio.h>

console의 in/out에 관련된 내용이 들어있는 라이브러리 헤더를 추가합니다.

#include<conio.h>

이 라이브러리는 표준이 아니며 window에서만 동작합니다. (호환성이 떨어집니다.)

 

  • __kbhit()

이 라이브러리 안에 __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언어로 스톱워치/타이머 만들기3 - 기본구현하기2(일시정지/재시작 초기화/디자인)

Github - 그간의 행적 확인 GitHub - Gon-91/Timer Contribute to Gon-91/Timer development by creating an account on GitHub. github.com 이전 포스트 C언어로 스톱워치/타이머 만들기 - 시작 배경 효율적인 C..

blog-of-gon.tistory.com

 

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :