cCcode

[부록] 산술 연산 계산기 (완성본) 본문

C Language Basic

[부록] 산술 연산 계산기 (완성본)

cCcode 2021. 6. 19. 21:59
#include <stdio.h>
#include <Windows.h>

int log_i_one_1 = 0;
char log_c_one = '?';
int log_i_one_2 = 0;

int log_i_two_1 = 0;
char log_c_two = '?';
int log_i_two_2 = 0;

int log_i_three_1 = 0;
char log_c_three = '?';
int log_i_three_2 = 0;

int log_i_four_1 = 0;
char log_c_four = '?';
int log_i_four_2 = 0;

int record_count = 0;

char circle_one = 127;
char circle_two = 6;

char* blank_one = " ";
char* blank_two = " ";
char* blank_three = " ";
char* blank_four = " ";
char* blank_five = " ";

int One_digit = 0;
int Two_digit = 0;

void PRINT_CALCULATION(int one, char operand, int two);
void PRINT_CALCULATION_transfer_log(int one, char operand, int two, int sum);
void PRINT_TITLE(void);
void PRINT_CIRCLE(void);
void CIRCULATING_CIRCLE(void);
void CHANGE_TEXT_COLOR(int color_number);
void JUDGE_DIGIT(int one, int two);

int main()
{
	int One, Two;
	char Operand;
	int sum;
	char decide[30] = { 0, };

	system("mode con cols=70 lines=25");

	while (1)
	{
		exception:
		CHANGE_TEXT_COLOR(15);
		PRINT_TITLE();
		printf("Helper : Hello, i will help you,\n"
			"Please follow my direction.\n\n");
		printf("Helper : Please Enter the Number and Operand.\n\n");
		printf("%c ", 26);

		scanf_s("%d %c %d", &One, &Operand, (unsigned char)sizeof(Operand), &Two);
		printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6);

		if (One / 1 >= 10000 || Two / 1 >= 10000)
		{
			CHANGE_TEXT_COLOR(4);
			printf("\nHelper : Too many inputs!\n");

			printf("\nHelper : Prevent from calculator made of letters moving\n");
			printf("Helper : Please enter the under 10000 number\n");
			Sleep(3000);
			system("cls");

			goto exception;
		}

		switch (Operand)
		{
		case '+': sum = One + Two; break;
		case '-': sum = One - Two; break;
		case '*': sum = One * Two; break;
		case '/': sum = One / Two; break;
		default: CHANGE_TEXT_COLOR(4); printf("\nHelper : Wrong input! Try again!"); Sleep(1500); system("cls"); goto exception;
		}

		JUDGE_DIGIT(One, Two);
		
		PRINT_CALCULATION(One, Operand, Two);
		Sleep(1500);
		system("cls");

		PRINT_TITLE();
		PRINT_CALCULATION_transfer_log(One, Operand, Two, sum);

		printf("\nHelper : Do you want to continue?		(yes / no)\n");
		printf("%c ", 26);
		scanf_s("%s", decide, (unsigned char)sizeof(decide));

		printf("\nHelper : Okay.");
		Sleep(1500);
		system("cls");

		if (decide[0] == 'N' || decide[0] == 'n' && decide[1] == 'O' || decide[1] == 'o') break;
	}

	CHANGE_TEXT_COLOR(9);
	CIRCULATING_CIRCLE();
	CHANGE_TEXT_COLOR(15);

	return 0;

}

void JUDGE_DIGIT(int one, int two)
{
	int count = 0;

	while (one != 0)
	{
		one = one / 10;
		count += 1;
	}

	One_digit = count;
	count = 0;

	while (two != 0)
	{
		two = two / 10;
		count += 1;
	}

	Two_digit = count;
}

void CIRCULATING_CIRCLE(void)
{
	int i;
	for (i = 0; i < 10; i++)
	{
		int temple;

		temple = circle_one;
		circle_one = circle_two;
		circle_two = temple;

		PRINT_CIRCLE();

		Sleep(500);
		system("cls");
	}
}

void CHANGE_TEXT_COLOR(int color_number)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color_number);
}

void PRINT_CIRCLE(void)
{
	printf("             %c %c %c %c %c %c %c %c %c\n", circle_one, circle_two, circle_one, circle_two, circle_one, circle_two, circle_one, circle_two, circle_one);
	printf("	   %c                   %c\n", circle_two, circle_two);
	printf("	  %c                    %c\n", circle_one, circle_one);
	printf("   	  %c                    %c\n", circle_two, circle_two);
	printf("   	  %c       B Y E        %c\n", circle_one, circle_one);
	printf("   	  %c                    %c\n", circle_two, circle_two);
	printf("   	  %c                    %c\n", circle_one, circle_one);
	printf("   	  %c      M A D E       %c\n", circle_two, circle_two);
	printf("   	  %c                    %c\n", circle_one, circle_one);
	printf("   	  %c        in          %c\n", circle_two, circle_two);
	printf("   	  %c                    %c\n", circle_one, circle_one);
	printf("	  %c      bo - il       %c\n", circle_two, circle_two);
	printf("   	  %c                    %c\n", circle_one, circle_one);
	printf("             %c %c %c %c %c %c %c %c %c\n", circle_two, circle_one, circle_two, circle_one, circle_two, circle_one, circle_two, circle_one, circle_two);
}

void PRINT_CALCULATION(int one, char operand, int two)
{
	CHANGE_TEXT_COLOR(14);
	if (One_digit == 4 && Two_digit == 2 || One_digit == 2 && Two_digit == 4)
		blank_one = " ";
	else if (One_digit <= 3 && Two_digit < 3 || One_digit < 3 && Two_digit <= 3 || One_digit == 1 && Two_digit == 4 || One_digit == 4 && Two_digit == 1)
		blank_one = "         ";
	else
		blank_one = " ";

	JUDGE_DIGIT(log_i_one_1, log_i_one_2);
	if (One_digit == 4 && Two_digit == 2 || One_digit == 2 && Two_digit == 4)
		blank_two = " ";
	else if (One_digit <= 3 && Two_digit < 3 || One_digit < 3 && Two_digit <= 3 || One_digit == 1 && Two_digit == 4 || One_digit == 4 && Two_digit == 1)
		blank_two = "         ";
	else
		blank_two = " ";

	JUDGE_DIGIT(log_i_two_1, log_i_two_2);
	if (One_digit == 4 && Two_digit == 2 || One_digit == 2 && Two_digit == 4)
		blank_three = " ";
	else if (One_digit <= 3 && Two_digit < 3 || One_digit < 3 && Two_digit <= 3 || One_digit == 1 && Two_digit == 4 || One_digit == 4 && Two_digit == 1)
		blank_three = "         ";
	else
		blank_three = " ";

	JUDGE_DIGIT(log_i_three_1, log_i_three_2);
	if (One_digit == 4 && Two_digit == 2 || One_digit == 2 && Two_digit == 4)
		blank_four = " ";
	else if (One_digit <= 3 && Two_digit < 3 || One_digit < 3 && Two_digit <= 3 || One_digit == 1 && Two_digit == 4 || One_digit == 4 && Two_digit == 1)
		blank_four = "         ";
	else
		blank_four = " ";

	JUDGE_DIGIT(log_i_four_1, log_i_four_2);
	if (One_digit == 4 && Two_digit == 2 || One_digit == 2 && Two_digit == 4)
		blank_five = " ";
	else if (One_digit <= 3 && Two_digit < 3 || One_digit < 3 && Two_digit <= 3 || One_digit == 1 && Two_digit == 4 || One_digit == 4 && Two_digit == 1)
		blank_five = "         ";
	else
		blank_five = " ";
	
	printf("%c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c\n", 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127);
	printf("%c                               %c\n", 127, 127);
	printf("%c                               %c\n", 127, 127);
	printf("%c %c    %d %c %d	       %s%c\n", 127, 26, one, operand, two, blank_one, 127);
	printf("%c %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c               %c\n", 127, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 127);
	printf("%c                               %c\n", 127, 127);
	printf("%c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c\n", 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127);
	printf("%c                               %c\n", 127, 127);
	printf("%c                               %c\n", 127, 127);
	printf("%c %c    %d %c %d	       %s%c\n", 127, 26, log_i_one_1, log_c_one, log_i_one_2, blank_two, 127);
	printf("%c %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c               %c\n", 127, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 127);
	printf("%c %c    %d %c %d	       %s%c\n", 127, 26, log_i_two_1, log_c_two, log_i_two_2, blank_three, 127);
	printf("%c %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c               %c\n", 127, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 127);
	printf("%c %c    %d %c %d	       %s%c\n", 127, 26, log_i_three_1, log_c_three, log_i_three_2, blank_four, 127);
	printf("%c %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c               %c\n", 127, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 127);
	printf("%c %c    %d %c %d	       %s%c\n", 127, 26, log_i_four_1, log_c_four, log_i_four_2, blank_five, 127);
	printf("%c %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c               %c\n", 127, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 127);
	printf("%c	                        %c\n", 127, 127);
	printf("%c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c\n", 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127);
	
	CHANGE_TEXT_COLOR(15);
}

void PRINT_CALCULATION_transfer_log(int one, char operand, int two, int sum)
{
	CHANGE_TEXT_COLOR(14);

	if (record_count == 0)
	{
		log_i_one_1 = one;
		log_c_one = operand;
		log_i_one_2 = two;
	}

	else if (record_count == 1)
	{
		log_i_two_1 = log_i_one_1;
		log_c_two = log_c_one;
		log_i_two_2 = log_i_one_2;

		log_i_one_1 = one;
		log_c_one = operand;
		log_i_one_2 = two;
	}

	else if (record_count == 2)
	{
		log_i_three_1 = log_i_two_1;
		log_c_three = log_c_two;
		log_i_three_2 = log_i_two_2;

		log_i_two_1 = log_i_one_1;
		log_c_two = log_c_one;
		log_i_two_2 = log_i_one_2;

		log_i_one_1 = one;
		log_c_one = operand;
		log_i_one_2 = two;
	}

	else
	{
		log_i_four_1 = log_i_three_1;
		log_c_four = log_c_three;
		log_i_four_2 = log_i_three_2;

		log_i_three_1 = log_i_two_1;
		log_c_three = log_c_two;
		log_i_three_2 = log_i_two_2;

		log_i_two_1 = log_i_one_1;
		log_c_two = log_c_one;
		log_i_two_2 = log_i_one_2;

		log_i_one_1 = one;
		log_c_one = operand;
		log_i_one_2 = two;
	}

	if (sum >= 1000000)
		blank_one = " ";
	else
		blank_one = "         ";

	JUDGE_DIGIT(log_i_one_1, log_i_one_2);
	if (One_digit == 4 && Two_digit == 2 || One_digit == 2 && Two_digit == 4)
		blank_two = " ";
	else if (One_digit <= 3 && Two_digit < 3 || One_digit < 3 && Two_digit <= 3 || One_digit == 1 && Two_digit == 4 || One_digit == 4 && Two_digit == 1)
		blank_two = "         ";
	else
		blank_two = " ";

	JUDGE_DIGIT(log_i_two_1, log_i_two_2);
	if (One_digit == 4 && Two_digit == 2 || One_digit == 2 && Two_digit == 4)
		blank_three = " ";
	else if (One_digit <= 3 && Two_digit < 3 || One_digit < 3 && Two_digit <= 3 || One_digit == 1 && Two_digit == 4 || One_digit == 4 && Two_digit == 1)
		blank_three = "         ";
	else
		blank_three = " ";

	JUDGE_DIGIT(log_i_three_1, log_i_three_2);
	if (One_digit == 4 && Two_digit == 2 || One_digit == 2 && Two_digit == 4)
		blank_four = " ";
	else if (One_digit <= 3 && Two_digit < 3 || One_digit < 3 && Two_digit <= 3 || One_digit == 1 && Two_digit == 4 || One_digit == 4 && Two_digit == 1)
		blank_four = "         ";
	else
		blank_four = " ";

	JUDGE_DIGIT(log_i_four_1, log_i_four_2);
	if (One_digit == 4 && Two_digit == 2 || One_digit == 2 && Two_digit == 4)
		blank_five = " ";
	else if (One_digit <= 3 && Two_digit < 3 || One_digit < 3 && Two_digit <= 3 || One_digit == 1 && Two_digit == 4 || One_digit == 4 && Two_digit == 1)
		blank_five = "         ";
	else
		blank_five = " ";

	printf("%c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c\n", 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127);
	printf("%c                               %c\n", 127, 127);
	printf("%c                               %c\n", 127, 127);
	printf("%c %c      %d	       %s%c\n", 127, 26, sum, blank_one, 127);
	printf("%c %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c               %c\n", 127, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 127);
	printf("%c                               %c\n", 127, 127);
	printf("%c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c\n", 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127);
	printf("%c                               %c\n", 127, 127);
	printf("%c                               %c\n", 127, 127);
	printf("%c %c    %d %c %d	       %s%c\n", 127, 26, log_i_one_1, log_c_one, log_i_one_2, blank_two, 127);
	printf("%c %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c               %c\n", 127, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 127);
	printf("%c %c    %d %c %d	       %s%c\n", 127, 26, log_i_two_1, log_c_two, log_i_two_2, blank_three, 127);
	printf("%c %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c               %c\n", 127, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 127);
	printf("%c %c    %d %c %d	       %s%c\n", 127, 26, log_i_three_1, log_c_three, log_i_three_2, blank_four, 127);
	printf("%c %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c               %c\n", 127, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 127);
	printf("%c %c    %d %c %d	       %s%c\n", 127, 26, log_i_four_1, log_c_four, log_i_four_2, blank_five, 127);
	printf("%c %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c               %c\n", 127, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 127);
	printf("%c	                        %c\n", 127, 127);
	printf("%c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c\n", 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127);

	record_count += 1;

	CHANGE_TEXT_COLOR(15);
}

void PRINT_TITLE(void)
{
	printf("+---- Calculation Program 2 ----+\n\n");
}

// made in jeong boil(cCcode)

산술 연산을 하는 계산기입니다.

생기부 첨부 목적으로 작성된 코드이며, 따라서

코드를 사용하실 경우 자료의 출처명시해주시기 바랍니다.

 

우선 프로그램을 실행시키면 

처음 나오는 문구

연산자 숫자들을 입력해주라는 문구가 출력됩니다. 이 때, 10000 이상의 숫자% 연산자를 사용할 경우 다시 입력하라는 메세지와 함께 입력 화면으로 돌아오게 됩니다.

10000 이상의 숫자가 입력 될 경우
산술 연산자가 아닐 경우

제가 mod 연산자등을 막은 이유는 첫 째 산술 연산(+, -, *, /)에 충실한 계산기를 만들기 위함도 있지만 솔직히 귀찮았습니다. 그리고 10000 이상의 숫자를 막은 이유는 프로그램진행 하시다보면 계산기 그림을 보실 수 있을텐데 그게 아스키코드로 그린것으로 입력되는 에 따라 위치가 달라집니다. 제가 1000 자릿수까지는 어떻게 하든 공백 문자열로 맞출 수 있겠는데 그 이상은 .. 

 

계산기

을 제대로 입력하실 경우 계산기 그림에 가장 상단부에 그 값이 그려집니다.

 

계산기 - 2

보시면 아시다시피 본식이 적혀있던 위치에는 산술연산의 결과가 그리고 그 아래 0 ? 0 으로 적혀있던 위치에는 산술 연산 본식위치하게 됩니다. 저 부분은 일종의 로그처럼 어떤 산술 연산을 수행했는지 기록하는 역할을 하기 위해 만들었습니다.

음수 결과값

음수끼리의 연산 또한 가능합니다.

 

이대로 끝내면 아쉬워서 "Do you want to continue?" 라는 질문에 "no"라고 입력하여 종료될 때 OS가 종료할 때 나타나는 로딩 바 같은 그림을 구현했습니다. 움직임까지는 구현했으나, 그림이 좀 어수룩해 아쉽네요.

종료 로딩 바

이처럼 간단한 계산기를 만드는 데도 많은 양의 코드가 필요하다는 걸 보고 현직 개발자분들이 존경스럽다 느꼈습니다.

'C Language Basic' 카테고리의 다른 글

C Language [핵심정리] - 32  (0) 2021.06.27
C Language [핵심정리] - 31  (1) 2021.06.21
C Language [핵심정리] - 29  (0) 2021.06.15
C Language [핵심정리] - 28  (0) 2021.06.15
C Language [핵심정리] - 27(수정)  (0) 2021.06.11
Comments