C언어로 스톱워치/타이머 만들기5 - 구조 다듬기(함수화)

컴퓨터/Projects

728x90
반응형

Github - 그간의 행적 확인

 

GitHub - Gon-91/Timer

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

github.com

이전 포스트

 

 

C언어로 스톱워치/타이머 만들기5 - 기본 구현하기4(타이머기능 개선)

Github - 그간의 행적 확인 GitHub - Gon-91/Timer Contribute to Gon-91/Timer development by creating an account on GitHub. github.com 이전 포스트 C언어로 스톱워치/타이머 만들기4 - 기본 구현하기3(타이..

blog-of-gon.tistory.com


오늘의 목표

  • 소스코드 정리하기
  • 함수화 시키기

소스코드 정리하기

일단 함수화에 앞서, 조금 지저분한 부분의 소스코드를 정리하여 통으로 만들어진 소스코드를 정리해 보겠습니다.

  • 프로그램 틀 소스 부분
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) {....}
		//예외 발생 시 
		else {
			while (getchar() != '\n') {}
			printf("잘못된 입력입니다.");
			system("pause");
		}
	}
	return 0;
}
  • 스톱워치 부분
case 1:
	printf("===== 스톱워치 =====\n");
	printf("아무키나 누르면 시작 합니다.");
	system("pause");


	clock_t start_time = clock();
	while (1) {
		// 시간 계산 및 시간 포맷 만들기
		clock_t curr_time = clock() - start_time;
		double time_double = (double)curr_time / 1000;
		int trans;
		int undersec;
		int sec;
		int min;
		int hour;
		trans = (int)time_double;
		undersec = curr_time%1000;
		sec = trans % 60;
		min = trans /60%60;
		hour = trans /60/60;
		//시간 포맷으로 출력
		printf("\n\n\t%d:%d:%d.%d\n\n", hour,min,sec, undersec);
					
		//키 입력을 받았을때 멈추기(일시정지)
		if (_kbhit()) {
						
			//일시정지 후 질의 선택
			printf("1.재시작\t2.초기화\t3.종료\n");
			printf("원하는 기능을 선택 하세요 : ");
			scanf_s("%d", &input);

			//1. 재시작 선택시 스톱워치가 이어서 진행
			if (input == 1) {
				start_time = clock() - curr_time;
				continue;
			}
			//2. 초기화 선택시 스톱워치가 초기화 후 진행
			if (input == 2) {
				start_time = clock();
				continue;
			}
			else {
				break;
			}

		}
		system("cls");
	}
	system("pause");
	break;
  • 타이머 부분
//타이머
case 2:
	//타이머 설정 입력 
	int set_total = 0;
	while (1) {
		system("cls");
		set_total = 0;
		printf("시간을 입력해 주세요 : ");
		scanf_s("%d", &input);
		system("cls");
		set_total = input * 60 * 60;
		printf("분을 입력해 주세요 : ");
		scanf_s("%d", &input);
		system("cls");
		set_total += input * 60;
		printf("초를 입력해 주세요 : ");
		scanf_s("%d", &input);
		system("cls");
		set_total += input;


		//시간 설정 확인
		printf("설정 시간 %d:%d:%d\n", set_total / 60 / 60, set_total / 60 % 60, set_total % 60);
		printf("1. 시작\t2. 재설정\n");
		printf("설정 시간을 확인 해 주세요. : ");
		scanf_s("%d", &input);
		if (input == 1) {
			printf("아무키나 누르면 타이머가 실행됩니다.\n");
			system("pause");

			break;
		}
		else {
			printf("아무키나 누르면 타이머가 초기설정화면으로 돌아갑니다.\n");
			system("pause");
		}
	}





	// 시간 카운팅 시작 값
	clock_t start_time2 = clock();
	while (1) {
		system("cls");
		// 0초로 맞춤과 설정 시간 - 소모시간 출력
		clock_t curr_time = clock() - start_time2;
		double time_double = (double)curr_time / 1000;
		int curr_sec = (int)time_double;
		int target = set_total - curr_sec;
		printf("\n\n\t%d:%d:%d\n\n", target / 60 / 60, target / 60 % 60, target % 60);

		//키입력시 일시정지
		if (_kbhit()) {
			system("pause");
			printf("1. 이어하기\t2. 재설정\t 3. 종료\n");
			printf("설정 시간을 확인 해 주세요. : ");
			scanf_s("%d", &input);

			//이어하기시
			if (input == 1) {
				printf("아무키나 누르면 타이머가 실행됩니다.\n");
				system("pause");
				clock_t stop_time = clock() - (curr_time + start_time2);
				double stop_time_double = (double)stop_time / 1000;
				int stop_time_sce = (int)stop_time_double;
				set_total = set_total + stop_time_sce;
				start_time2 = clock();
			}

			//다시 설정시
			else if(input == 2){
				while (1) {
					system("cls");
					set_total = 0;
					printf("시간을 입력해 주세요 : ");
					scanf_s("%d", &input);
					system("cls");
					set_total = input * 60 * 60;
					printf("분을 입력해 주세요 : ");
					scanf_s("%d", &input);
					system("cls");
					set_total += input * 60;
					printf("초를 입력해 주세요 : ");
					scanf_s("%d", &input);
					system("cls");
					set_total += input;


					//시간 설정 확인
					printf("설정 시간 %d:%d:%d\n", set_total / 60 / 60, set_total / 60 % 60, set_total % 60);
					printf("1. 시작\t2. 재설정\n");
					printf("설정 시간을 확인 해 주세요. : ");
					scanf_s("%d", &input);
					if (input == 1) {
						printf("아무키나 누르면 타이머가 실행됩니다.\n");
						system("pause");
						start_time2 = clock();
						break;
					}
					else {
						printf("아무키나 누르면 타이머가 초기설정화면으로 돌아갑니다.\n");
						system("pause");
					}
				}
			}
			else {
				break;
			}

		}

		//시간 소모시 탈출
		if (target == 0) {
			printf("설정하신 시간이 모두 소모되었습니다.\n");
			system("pause");
			break;

		}
	}

}

함수화 하기

일단, 아래와 같이 함수화로 소스코드를 쪼개려고 합니다.

  • 입력받기 함수화 
  • 스톱워치 부분
  • 타이머 부분

기능 함수화 하기 - 입력 받기 함수화

입력받는 기능은 계속해서 해당 프로그램에서 사용합니다. 따라서 함수화를 통해 반복성을 향상하고 손쉽게 예외처리를 하기 위해 만들었습니다.

int Intinput(int min, int max) {
	int input;
	while (1) {
		scanf_s("%d", &input);
		if (input >= min && input <= max) {
			return input;
		}
		else {
			while (getchar() != '\n') {}
			printf("잘못된 입력입니다. 다시 입력해주세요. : ");
		}
	}
}

스톱워치 & 타이머 부분

나중에 소스코드의 접근 및 수정이 원할하도록 내용 그대로를 함수화 하여 2가지로 나누었습니다.

추가로 위에서 만든 입력받기 함수를 통해 예외에 조금 더 유연하게 대응할 수 있도록 수정하였습니다.

현 상태에서는 소스코드를 그대로 밖으로 빼서 함수화 한 것 밖에 없지만 메인 함수를 보면 조금 더 쉽게 프로그램의 흐름을 파악할 수 있습니다.

int main() {

	//프로그램 시작
	while (1) {
		//메인 화면 부분
		system("cls");
		printf("\t=== Test Program ==\n\n");
		int input;
		printf("1.스톱워치\t2.타이머\t3.종료\n\n");
		printf("원하는 메뉴를 입력 하세요 : ");
		input = Intinput(1, 3);
		//메뉴 입력 후 동작하기
		//정상적인 입력이면
		if (input > 0 && input < 4) {
			//종료 입력시
			if (input == 3) {
				printf("프로그램을 종료 합니다.");
				break;
			}
			//스톱워치 또는 타이머 부분
			switch (input)
			{
			//스톱워치
			case 1:
				StopWatch();
				break;
			//타이머
			case 2:
				Timer();
				break;
			}
		}
		//예외 발생 시 
		else {
			while (getchar() != '\n') {}
			printf("잘못된 입력입니다.");
			system("pause");
		}
	}
	return 0;
}

 

전체 소스코드

더보기
#include<stdio.h>
#include<time.h>
#include<Windows.h>
#include<conio.h>

// 기능 - 예외처리 메뉴 입력
int Intinput(int min, int max) {
	int input;
	while (1) {
		scanf_s("%d", &input);
		if (input >= min && input <= max) {
			return input;
		}
		else {
			while (getchar() != '\n') {}
			printf("잘못된 입력입니다. 다시 입력해주세요. : ");
		}
	}
}
// 구조 - 스톱워치 부분
void StopWatch() {
	printf("===== 스톱워치 =====\n");
	printf("아무키나 누르면 시작 합니다.");
	system("pause");


	clock_t start_time = clock();
	while (1) {
		// 시간 계산 및 시간 포맷 만들기
		clock_t curr_time = clock() - start_time;
		double time_double = (double)curr_time / 1000;
		int trans;
		int undersec;
		int sec;
		int min;
		int hour;
		trans = (int)time_double;
		undersec = curr_time % 1000;
		sec = trans % 60;
		min = trans / 60 % 60;
		hour = trans / 60 / 60;
		//시간 포맷으로 출력
		printf("\n\n\t%d:%d:%d.%d\n\n", hour, min, sec, undersec);

		//키 입력을 받았을때 멈추기(일시정지)
		if (_kbhit()) {

			//일시정지 후 질의 선택
			printf("1.재시작\t2.초기화\t3.종료\n");
			printf("원하는 기능을 선택 하세요 : ");
			int input = Intinput(1, 3);

			//1. 재시작 선택시 스톱워치가 이어서 진행
			if (input == 1) {
				start_time = clock() - curr_time;
				continue;
			}
			//2. 초기화 선택시 스톱워치가 초기화 후 진행
			if (input == 2) {
				start_time = clock();
				continue;
			}
			else {
				break;
			}

		}
		system("cls");
	}
	system("pause");
}
// 구조 - 타이머 부분
void Timer() {
	//타이머 설정 입력 
	int set_total = 0;
	int input;
	while (1) {
		system("cls");
		set_total = 0;
		printf("시간을 입력해 주세요 : ");
		input = Intinput(0, INT_MAX);
		system("cls");
		set_total = input * 60 * 60;
		printf("분을 입력해 주세요 : ");
		input = Intinput(0, INT_MAX);
		system("cls");
		set_total += input * 60;
		printf("초를 입력해 주세요 : ");
		input = Intinput(0, INT_MAX);
		system("cls");
		set_total += input;


		//시간 설정 확인
		printf("설정 시간 %d:%d:%d\n", set_total / 60 / 60, set_total / 60 % 60, set_total % 60);
		printf("1. 시작\t2. 재설정\n");
		printf("설정 시간을 확인 해 주세요. : ");
		input = Intinput(1,2);
		if (input == 1) {
			printf("아무키나 누르면 타이머가 실행됩니다.\n");
			system("pause");

			break;
		}
		else {
			printf("아무키나 누르면 타이머가 초기설정화면으로 돌아갑니다.\n");
			system("pause");
		}
	}





	// 시간 카운팅 시작 값
	clock_t start_time2 = clock();
	while (1) {
		system("cls");
		// 0초로 맞춤과 설정 시간 - 소모시간 출력
		clock_t curr_time = clock() - start_time2;
		double time_double = (double)curr_time / 1000;
		int curr_sec = (int)time_double;
		int target = set_total - curr_sec;
		printf("\n\n\t%d:%d:%d\n\n", target / 60 / 60, target / 60 % 60, target % 60);

		//키입력시 일시정지
		if (_kbhit()) {
			system("pause");
			printf("1. 이어하기\t2. 재설정\t 3. 종료\n");
			printf("설정 시간을 확인 해 주세요. : ");
			input = Intinput(1, 3);

			//이어하기시
			if (input == 1) {
				printf("아무키나 누르면 타이머가 실행됩니다.\n");
				system("pause");
				clock_t stop_time = clock() - (curr_time + start_time2);
				double stop_time_double = (double)stop_time / 1000;
				int stop_time_sce = (int)stop_time_double;
				set_total = set_total + stop_time_sce;
				start_time2 = clock();
			}

			//다시 설정시
			else if (input == 2) {
				while (1) {
					system("cls");
					set_total = 0;
					printf("시간을 입력해 주세요 : ");
					scanf_s("%d", &input);
					system("cls");
					set_total = input * 60 * 60;
					printf("분을 입력해 주세요 : ");
					scanf_s("%d", &input);
					system("cls");
					set_total += input * 60;
					printf("초를 입력해 주세요 : ");
					scanf_s("%d", &input);
					system("cls");
					set_total += input;


					//시간 설정 확인
					printf("설정 시간 %d:%d:%d\n", set_total / 60 / 60, set_total / 60 % 60, set_total % 60);
					printf("1. 시작\t2. 재설정\n");
					printf("설정 시간을 확인 해 주세요. : ");
					scanf_s("%d", &input);
					if (input == 1) {
						printf("아무키나 누르면 타이머가 실행됩니다.\n");
						system("pause");
						start_time2 = clock();
						break;
					}
					else {
						printf("아무키나 누르면 타이머가 초기설정화면으로 돌아갑니다.\n");
						system("pause");
					}
				}
			}
			else {
				break;
			}

		}

		//시간 소모시 탈출
		if (target == 0) {
			printf("설정하신 시간이 모두 소모되었습니다.\n");
			system("pause");
			break;

		}
	}
}
int main() {

	//프로그램 시작
	while (1) {
		//메인 화면 부분
		system("cls");
		printf("\t=== Test Program ==\n\n");
		int input;
		printf("1.스톱워치\t2.타이머\t3.종료\n\n");
		printf("원하는 메뉴를 입력 하세요 : ");
		input = Intinput(1, 3);
		//메뉴 입력 후 동작하기
		//정상적인 입력이면
		if (input > 0 && input < 4) {
			//종료 입력시
			if (input == 3) {
				printf("프로그램을 종료 합니다.");
				break;
			}
			//스톱워치 또는 타이머 부분
			switch (input)
			{
			//스톱워치
			case 1:
				StopWatch();
				break;
			//타이머
			case 2:
				Timer();
				break;
			}
		}
		//예외 발생 시 
		else {
			while (getchar() != '\n') {}
			printf("잘못된 입력입니다.");
			system("pause");
		}
	}
	return 0;
}

다음 포스트 목표

  • 함수로 나눈 스톱워치 및 타이머 조금 더 다듬기
  • 프로그램 아키텍쳐 그려보기

 

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

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

TODAY :

YESTER DAY :

TOTAL :