C언어 사칙연산 계산기 - ceon-eo sachig-yeonsan gyesangi

C언어 사칙연산 계산기 - ceon-eo sachig-yeonsan gyesangi

정수형 int x,y,z 를 선언하였다.

정수형 int x,y 에는 계산 할 두 정수의 입력값을, z에는 정수를 계산한 계산값을 저장하고 정수형으로 표현 할 것이다.

또한 char은 문자형으로서 char order에 사칙연산을 대입 할 것이다. 연산기호 또한 문자에 포함된다.

변수의 이름은 사람마다 개인차가 있으며 꼭 예제처럼 변수 이름을 따라 할 필요는 없다.

여담으로 코드가 매우 길어지고 변수를 많이 사용 할 수록 프로그래머가 변수 이름을 무엇으로 정해야할지 많은 고민을 한다고 한다.

printf는 텍스트를 출력해주는 함수이다.

ex) printf("hello world!");

또한 printf("값 : %d", sum)은 풀어쓰자면,

값 : (정수를 표현) , sum(에서 값을 받아옴) 을 의미한다.

만약 sum이 아니라 x를 기입했다면 변수 x의 값을 가져오게 된다.

scanf는 입력을 가능하게 하고, 입력값을 변수에 저장시킬 수 있는 함수이다.

(물론 더 많은 용도로 사용될 수 있다)

ex) scanf("%d",&a);

scanf 다음에 printf와 동일하게 괄호와 큰따옴표를 열고 닫아주어야만 한다.

%d 는 정수를 입력받겠다는 것을 의미하고,

&a는 변수 a의 주소를 의미하는 것이다.

C언어 사칙연산 계산기 - ceon-eo sachig-yeonsan gyesangi

이런 식으로..

if와 else, else if는 "1"(진실) 혹은 "0"(거짓)으로 결과가 달리 나타나는 함수이다.

if (만약에)( a == 10 ) 이면

printf("값은 10이다.",sum)

이런 식으로 표현이 가능하다.

또한 else if는

else if ( a == 1) 이면

1이라는 값을 입력했을 때,

printf("값은 1이다.",sum)

처럼 if와 동일하게 사용이 가능하다.

하지만 주의해야 할 점은 프로그램은 위에서 아래로 실행되고 따라서 if문의 실행 순서는 항상 if 로 시작하게 된다.

else는 if와 else if 모두 거짓인 경우 실행된다.

예제를 예를 들어 설명해보겠다.

만약 char order 변수에 사칙연산이 아닌 다른 값 ?를 입력하였다고 가정하자.

?는 if와 else if 모두 포함되지 않기 때문에 if와 else if 조건이 참이 되지 않기 때문에, 계산을 하지 않는다.

이러할 때 else문을 사용하여

else

printf("지원하는 연산자가 아닙니다")

이런 식으로 표현이 가능하다.

더 자세하게 설명하자면

if ( a == 10) {

printf("값은 10이다.",sum)

}

else if ( a == 1) {

printf("값은 1이다.",sum)

}

else {

printf("known",sum)

}

이런 식으로 구성한다면,

10을 입력하게 된다면 "값은 10이다"라는 텍스트가 출력되고

1을 입력하게 된다면 "값은 1이다"라는 텍스트가 출력된다.

하지만 1과 10이 아닌 모든 수 "ex) 음수 양수 2~9 , 11 ~ inf" 는

"known"이라는 텍스트가 출력 될 것이다.

따라서 예제의 사칙연산 계산기는 if와 else if를 연산자 4개를 사용하였고

그 이외의 다른 기호를 기입하게 된다면 if문이 정상적으로 실행이 되지 않는다.

앞서 설명하였듯이 프로그램은 위에서 아래로 실행되며 if에서 참이 되지 않으면 else if로 넘어가게 되고 else if 또한 참이 되지 않으면 (있다면) 다음 else if문으로 넘어가는 것을 계속 반복한다.

else문은 if와 else if 그 어떠한 경우에도 참이 되지 못하는 경우 실행되는 것이다.

공지 목록

공지글

글 제목작성일

공지 동영상 강좌 할인 이벤트를 진행하고 있습니다.

2022. 11. 21.

(2)

공지 윈도우즈 운영체제에서 프로그램을 개발하려면!

2022. 7. 24.

(2)

공지 프로그래밍으로 사람들에게 인정받고 싶나요?

2022. 8. 24.

(5)

공지 속성 강좌 안내

2019. 3. 7.

[실습] 계산기 만들기 (C, 1)

C언어 사칙연산 계산기 - ceon-eo sachig-yeonsan gyesangi
김성엽2018. 5. 4. 17:28

간단하게 용어를 정리하고 시작하겠습니다. '1 + 2'라는 수식에서 '+'는 연산자(operator)이고 '1'과 '2'는 '+' 연산자에 대한 피연산자(operand)라고 부릅니다.


1. 실습 내용
간단하게 사칙 연산(+, -, *, /)을 수행하는 계산기를 만들어 보겠습니다. 이 계산기는 정숫값 두 개와 연산자를 문자로 입력받아 연산을 수행합니다. 그리고 첫 단계 실습이라서 반복문은 사용하지 않겠습니다. 따라서 연산은 한 번만 하고 프로그램이 종료되도록 만들겠습니다.

그리고 연산자와 피연산자는 scanf_s 함수를 사용하여 입력을 받을 것이고 사용자에게 연산의 결과를 보여줄 때는 printf 함수를 사용하겠습니다.


2. 실습 예제의 출력 결과
실습 예제를 보기 전에 '실습 내용'을 보고 스스로 만들어 보려고 노력하는 것이 공부에 더 도움이 됩니다. 그래서 실습 예제 코드를 보여주기 전에 실습 예제의 출력 결과를 먼저 보여드릴 테니 아래처럼 동작하게 만들어 보세요.

첫 번째 정숫값을 입력 : 2 연산자 입력 (+, -, *, / 가능): * 두 번째 정숫값을 입력 : 8 2 * 8 = 16 계속하려면 아무 키나 누르십시오 . . .




3. 실습 예제 코드

[ 기본 코드 추가 ]
이 프로그램은 사용자에게 연산자와 피연산자를 입력받기 위해 scanf_s 함수를 사용하고 사용자에게 연산의 결과를 보여주기 위해 printf 함수를 사용할 것입니다. 그래서 stdio.h 헤더 파일을 아래와 같이 포함시켰습니다.

#include <stdio.h> // printf, scanf_s 함수를 사용하기 위해! int main() { return 0; }


[ 변수 선언 ]
이 예제에서는 연산자는 문자(char)로 입력받고 피연산자는 정숫값(int)을 입력받아서 사용할 것이기 때문에 아래와 같이 변수를 추가했습니다.

#include <stdio.h> // printf, scanf_s 함수를 사용하기 위해! int main() { // 연산자를 저장할 변수 char op_type; // 피연산자 두 개의 값을 저장할 변수 int num1, num2; return 0; }


[ 사용자에게 연산자와 피연산자 정보 입력받기 ]
2 + 3의 순서로 값을 입력받기 위해서 scanf_s 함수를 총 세 번 사용해서 값을 입력받습니다. 하지만 중간에 연산자를 %c를 사용해서 받기 때문에 줄바꿈 문자 처리에 문제가 발생합니다. 그래서 해당 scanf_s 함수 위, 아래쪽에 표준 입력 버퍼를 초기화하는 rewind(stdin); 함수를 같이 사용했습니다. 이 문제에 대해서는 아래의 링크를 참고하시기 바랍니다.

printf("첫 번째 정숫값을 입력 : "); // 첫 번째 피연산자를 입력 받는다. scanf_s("%d", &num1); // 연산자와 함께 입력된 엔터키 제거 rewind(stdin); printf("연산자 입력 (+, -, *, / 가능): "); // 연산자를 입력 받는다. scanf_s("%c", &op_type, 1); // 연산자와 함께 입력된 엔터키 제거 rewind(stdin); printf("두 번째 정숫값을 입력 : "); // 두 번째 피연산자를 입력 받는다. scanf_s("%d", &num2);


[ 사용자가 입력한 연산자와 피연산자를 사용하여 계산하기 ]
switch 문법을 사용하여 사용자가 입력한 연산자에 따라 연산을 수행하도록 구성했습니다. 다른 특별한 사항은 없지만 나눗셈에서 수를 나눌 때는 0으로 나누면 오류가 발생하기 때문에 num2 변수에 저장된 값이 0이라면 오류가 발생했다고 출력하도록 했습니다.

첫 번째 정숫값을 입력 : 2 연산자 입력 (+, -, *, / 가능): / 두 번째 정숫값을 입력 : 0 오류가 발생했습니다! 0으로 나눌 수 없습니다! 계속하려면 아무 키나 누르십시오 . . .

그리고 나눗셈의 결과는 '%.3f 형식 지정자'를 사용하여 소수점 셋째 자리까지만 출력하도록 했습니다. 그리고 나눗셈 연산을 할 때는 실수 연산이 진행되도록 num2 변수를 double 자료형으로 형 변환을 시켜서 연산을 하도록 했습니다.

switch (op_type) { case '+': // 덧셈 연산을 한다. printf("%d + %d = %d\n", num1, num2, num1 + num2); break; case '-': // 뺄셈 연산을 한다. printf("%d - %d = %d\n", num1, num2, num1 - num2); break; case '*': // 곱셈 연산을 한다. printf("%d * %d = %d\n", num1, num2, num1 * num2); break; case '/': // 나눗셈 연산을 한다. if (num2 == 0) printf("오류가 발생했습니다! 0으로 나눌 수 없습니다!\n"); else printf("%d / %d = %.3f\n", num1, num2, num1 / (double)num2); break; }


[ 완성된 실습 코드 ]
위에서 설명한 코드를 정리해서 하나의 코드로 만들어보면 다음과 같습니다.

아래의 예제 코드는 'Prime Editor'의 Cloud 폴더에 'simple_calc_step1.c'로 저장되어 있습니다.

#include <stdio.h> // printf 함수와 scnaf_s 함수를 사용하기 위하여! int main() { // 연산자를 저장할 변수 char op_type; // 피연산자 두 개의 값을 저장할 변수 int num1, num2; printf("첫 번째 정숫값을 입력 : "); // 첫 번째 피연산자를 입력 받는다. scanf_s("%d", &num1); // 연산자와 함께 입력된 엔터키 제거 rewind(stdin); printf("연산자 입력 (+, -, *, / 가능): "); // 연산자를 입력 받는다. scanf_s("%c", &op_type, 1); // 연산자와 함께 입력된 엔터키 제거 rewind(stdin); printf("두 번째 정숫값을 입력 : "); // 두 번째 피연산자를 입력 받는다. scanf_s("%d", &num2); switch (op_type) { case '+': // 덧셈 연산을 한다. printf("%d + %d = %d\n", num1, num2, num1 + num2); break; case '-': // 뺄셈 연산을 한다. printf("%d - %d = %d\n", num1, num2, num1 - num2); break; case '*': // 곱셈 연산을 한다. printf("%d * %d = %d\n", num1, num2, num1 * num2); break; case '/': // 나눗셈 연산을 한다. if (num2 == 0) printf("오류가 발생했습니다! 0으로 나눌 수 없습니다!\n"); else printf("%d / %d = %.3f\n", num1, num2, num1 / (double)num2); break; } return 0; }


[ 추가 실습 코드 ]
위에서 보여드린 실습 코드는 switch 문법으로 연산자별 작업을 수행하고 있는데 이것을 if 조건문으로 변경해서 작업하는 코드로 만들어보면 다음과 같습니다.

아래의 예제 코드는 'Prime Editor'의 Cloud 폴더에 'simple_calc_step2.c'로 저장되어 있습니다.

#include <stdio.h> // printf 함수와 scnaf_s 함수를 사용하기 위하여! int main() { // 연산자를 저장할 변수 char op_type; // 피연산자 두 개의 값을 저장할 변수 int num1, num2; printf("첫 번째 정숫값을 입력 : "); // 첫 번째 피연산자를 입력 받는다. scanf_s("%d", &num1); // 연산자와 함께 입력된 엔터키 제거 rewind(stdin); printf("연산자 입력 (+, -, *, / 가능): "); // 연산자를 입력 받는다. scanf_s("%c", &op_type, 1); // 연산자와 함께 입력된 엔터키 제거 rewind(stdin); printf("두 번째 정숫값을 입력 : "); // 두 번째 피연산자를 입력 받는다. scanf_s("%d", &num2); if (op_type == '+') { // 덧셈 연산을 한다. printf("%d + %d = %d\n", num1, num2, num1 + num2); } else if(op_type == '-') { // 뺄셈 연산을 한다. printf("%d - %d = %d\n", num1, num2, num1 - num2); } else if (op_type == '*') { // 곱셈 연산을 한다. printf("%d * %d = %d\n", num1, num2, num1 * num2); } else if (op_type == '/') { // 나눗셈 연산을 한다. if (num2 == 0) printf("오류가 발생했습니다! 0으로 나눌 수 없습니다!\n"); else printf("%d / %d = %.3f\n", num1, num2, num1 / (double)num2); } return 0; }


[ 연산자와 피연산자의 입력 형식을 바꾼 실습 코드 ]
사용자에게 피연산자1, 연산자, 피연산자2 순서로 값을 입력 받는 것이 아니라 연산자, 피연산자1, 피연산자2 순서로 값을 입력 받는 형태로 입력을 변경해보겠습니다. 즉, 연산자만 아래와 같이 구별해서 입력을 받고 두 정숫값은 같이 입력 받는 형태로 수정한다는 뜻입니다.

연산자 입력 : * 두 개의 연산할 값 입력 : 2 5 2 * 5 = 10 계속하려면 아무 키나 누르십시오 . . .

이렇게 하면 전체적으로 소스는 비슷하지만 scanf_s를 사용하는 부분만 달라지게 됩니다. 그리고 scanf_s 함수가 통합되어 rewind 함수는 이제 한 번만 사용하면 됩니다.

#include <stdio.h> // printf 함수와 scnaf_s 함수를 사용하기 위하여! int main() { // 연산자를 저장할 변수 char op_type; // 피연산자 두 개의 값을 저장할 변수 int num1, num2; printf("연산자 입력 : "); // 연산자를 입력 받는다. scanf_s("%c", &op_type, 1); // 연산자와 함께 입력된 엔터키 제거 rewind(stdin); printf("두 개의 연산할 값 입력 : "); // 피연산자를 두 개 입력 받는다. scanf_s("%d %d", &num1, &num2); switch (op_type) { case '+': // 덧셈 연산을 한다. printf("%d + %d = %d\n", num1, num2, num1 + num2); break; case '-': // 뺄셈 연산을 한다. printf("%d - %d = %d\n", num1, num2, num1 - num2); break; case '*': // 곱셈 연산을 한다. printf("%d * %d = %d\n", num1, num2, num1 * num2); break; case '/': // 나눗셈 연산을 한다. if (num2 == 0) printf("오류가 발생했습니다! 0으로 나눌 수 없습니다!\n"); else printf("%d / %d = %.3f\n", num1, num2, num1 / (double)num2); break; } return 0; }

위 코드에서 정수가 아닌 실수를 연산하도록 변경하고 사칙 연산을 별도의 함수를 만들어서 사용하도록 재구성해보면 다음과 같습니다.

#include <stdio.h> // printf 함수와 scnaf_s 함수를 사용하기 위하여! float Add(float x, float y) { return x + y; // x, y를 더한 결과를 반환한다! } float Sub(float x, float y) { return x - y; // x, y를 뺀 결과를 반환한다! } float Mul(float x, float y) { return x * y; // x, y를 곱한 결과를 반환한다! } float Div(float x, float y) { if (y == 0) { // 0으로 나누는 것을 방지한다! printf("[오류] : 0으로 나누면 안됩니다!\n"); return 0; } return x / y; // x에 y를 나눈 몫 값을 반환한다! } int main() { // 연산자를 저장할 변수 char op_type; // 피연산자 두 개의 값을 저장할 변수 float num1, num2; printf("연산자 입력 : "); // 연산자를 입력 받는다. scanf_s("%c", &op_type, 1); // 연산자와 함께 입력된 엔터키 제거 rewind(stdin); printf("두 개의 연산할 값 입력 : "); // 피연산자를 두 개 입력 받는다. scanf_s("%f %f", &num1, &num2); switch (op_type) { case '+': // 덧셈 연산을 한다. printf("%g + %g = %g\n", num1, num2, Add(num1, num2)); break; case '-': // 뺄셈 연산을 한다. printf("%g - %g = %g\n", num1, num2, Sub(num1, num2)); break; case '*': // 곱셈 연산을 한다. printf("%g * %g = %g\n", num1, num2, Mul(num1, num2)); break; case '/': // 나눗셈 연산을 한다. printf("%g / %g = %.3f\n", num1, num2, Div(num1, num2)); break; } return 0; }

만약, 연산 기능 자체를 함수화하고 싶다면 아래와 같이 구현해도 됩니다. 출력쪽은 단순화 시켰습니다. 만약 위와 같은 출력을 하고 싶다면 출력자체를 연산쪽으로 옮겨야 합니다.

#include <stdio.h> // printf 함수와 scnaf_s 함수를 사용하기 위하여! float ProcessOP(float a_num1, float a_num2, char a_op_type) { float result; switch (a_op_type) { case '+': // 덧셈 연산을 한다. result = a_num1 + a_num2; break; case '-': // 뺄셈 연산을 한다. result = a_num1 - a_num2; break; case '*': // 곱셈 연산을 한다. result = a_num1 * a_num2; break; case '/': // 나눗셈 연산을 한다. if (a_num2 == 0) { // 0으로 나누는 것을 방지한다! printf("[오류] : 0으로 나누면 안됩니다!\n"); return 0; } result = a_num1/a_num2; break; default: result = 0; } return result; } int main() { // 연산자를 저장할 변수 char op_type; // 피연산자 두 개의 값을 저장할 변수 float num1, num2, result; printf("연산자 입력 : "); // 연산자를 입력 받는다. scanf_s("%c", &op_type, 1); // 연산자와 함께 입력된 엔터키 제거 rewind(stdin); printf("두 개의 연산할 값 입력 : "); // 피연산자를 두 개 입력 받는다. scanf_s("%f %f", &num1, &num2); result = ProcessOP(num1, num2, op_type); printf("result : %g\n", result); return 0; }