컴퓨터/Projects
일단 함수화에 앞서, 조금 지저분한 부분의 소스코드를 정리하여 통으로 만들어진 소스코드를 정리해 보겠습니다.
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;
}
C언어로 스톱워치/타이머 만들기6 - 소스코드 나누기 및 배포 (1) | 2022.01.05 |
---|---|
C언어로 스톱워치/타이머 만들기5 - 구조 다듬기(함수화2) (0) | 2022.01.03 |
C언어로 스톱워치/타이머 만들기5 - 기본 구현하기4(타이머기능 개선) (0) | 2021.12.15 |
C언어로 스톱워치/타이머 만들기4 - 기본 구현하기3(타이머기능 구현) (0) | 2021.12.14 |
C언어로 스톱워치/타이머 만들기3 - 기본구현하기2(일시정지/재시작 초기화/디자인) (0) | 2021.12.11 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet