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

안녕하세요. 오늘은 드디어 조건문의 기본을 배워보고

초보가 할 수 있는 실수에 대해 알아봅시다.

이 초보의 실수라는 건 제가 직접 경험한 ...

만약 우리가 프로그램에 대한 기초적인 지식 쌓기가 아니라

본격적으로 무언가를 만들고자 한다면 조건문에 대한 내용은 필수적입니다.

컴퓨터가 어떻게 돌아간다는 것을 알기 위해선 간단하게 입출력에 대한

기본적인 로직 정도만 익힌다면 충분하겠지만 이것만으로는

프로그래밍적으로 생산적인 무언가를 만들기는 극히 힘듭니다.

가령 게임을 만들려면 단순히 입출력뿐만 아니라

캐릭터가 외부 입력이 어떠할 경우 출력을 어떻게 한다는

"조건"에 따른 반응이 존재해야 합니다.

입력이 뭔지와 관계없이 항상 출력이 일정하다면

굳이 컴퓨터를 쓸 것이 아니라 단순 기계를 사용하겠죠.

오늘의 목표는 C언어를 이용한

사칙연산 계산기 만들기 입니다.

if (조건) //조건 내용 설명

{

행동내용; //조건에 맞을 경우 행동

}

else if (조건)

{

행동내용

}

...

else

{

행동내용

}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

switch (변수) //조건이 될 변수 설정

{

case 숫자 : //변수가(숫자) 일 경우

행동 ; // 행동

break; // 조건문 중지

case 숫자 :

행동 ;

break;

...

default : //어느 것에도 해당하지 않을 경우

행동 ;

}

기본적인 조건문에는 크게 2가지가 존재합니다.

if 문과 switch 문인데요.

두 가지의 조건문을 배우기 앞서서 "조건" 에 들어갈

기본적인 논리 연산자를 배워보도록 합시다.

1. 논리연산자

조건이란 건 어떤 게 있을까요.

가령 어딘가에 로그인을 한다고 해 봅시다.

로그인이 되기 위해서 우리에게 필요한 것은 아이디와 비밀번호가

저장된 데이터베이스 안의 아이디나 비번과 일치해야 한다는 "조건"이 필요합니다.

마찬가지로 자판기에서 음료수를 사 먹는다고 한다면

자판기에 넣은 돈이 가격보다 많고,

사용자가 지정된 버튼을 눌렀다고 하는 "조건"이 필요하죠.

이러한 조건들에는 무엇과 무엇이 같을 때, 혹은 다를 때

어떤 조건과 조건이 동시에 만족하거나 혹은 하나만 만족할 때

등등 다양하게 필요합니다.

만약 논리 연산자를 알지 못한다면 이러한 조건을 제대로 만들어 낼 수가 없습니다.

기껏해야 무엇과 같다라는 = 정도만 가능하겠죠.

앞서 배운 산술연잔자는

요런 것들이 있을 수 있는데요. 사칙연산에 그대로 사용되는 것들이니

이건 쉬우니깐 넘어가고

관계 연산자를 봅시다.

값들의 관계를 나타내는 연산자입니다.

어떠한 것과 어떠한 것이 크다 작다, 뭐 그런 관계를 나타냅니다.

a 와 b 가 같지 않을 때 어떠한 행동을 취해라라는 조건을 만든다면

if (a ! = b) // 조건. (a와 b가 다를 때)

{

행동; //특정한 행동을 취한다.

}

같이 제작할 수 있겠죠.

다음은 논리연산자를 봅시다.

저 같은 경우에 이걸 중학교? 고등학교? 그쯤에 배웠습니다.

그냥 일반 학교였는데 아마 혁신 어쩌고 하면서 컴퓨터 과목이 있었던 거 같네요.

이것 또한 조건문에 넣을 수 있습니다.

행동에서 조건이란 게 굳이 하나만 작성해야 한다면 프로그램의 복잡함을 떠나

아예 구현이 어렵거나 괜스래 여러 개의 조건문을 작성해야 하니

여러 조건이 나올 때 논리연산자가 사용됩니다.

가령 "a와 b 가 같지 않고, a와 c가 같으면" 이라는 조건을 만들고자 한다면

if ( a != b && a == c) //조건. (둘 다 해당하는 경우만)

{

행동 //특정 행동을 취한다.

}

이런 식으로 만들 수 있습니다.

2. if 조건문

이제 본격적으로 조건문에 대해서 배워봅시다.

먼저 if 문을 다루어 보기 위하여

입력한 숫자가 기존의 숫자(10)보다 크기가 어떠한지 구분하는 조건문을 짜 봅시다.

이 기존의 숫자라는 것은 int number = 10을 변경해준다면 10 말고 다른 수도 가능합니다.

#include <stdio.h>

int main()

{

printf ("\n 시작 \n");

int number = 10 ;

int number2 ;

printf(" 숫자를 입력하시오 : " );

scanf("%d",&number2);

if ( number < number2)

{

printf("입력한 숫자는 10보다 큽니다.");

}

else if (number == number2)

{

printf(" 입력한 숫자는 10입니다.");

}

else

{

printf("입력한 숫자는 10보다 작습니다.");

}

return 0;

}

if 문의 조건 방식은

if(조건){}/else if(조건){}//else {} 입니다.

if (조건1) { 행동1; } 은 if조건문을 제작할 때 맨 먼저 작성하는 것입니다.

정확히는 1번 조건과 그에 따른 행동1을 설명하는 것이죠.

행동 내용은 반드시 { ~~ } 와 같이 {} 이 괄호 안에 들어가야 하며

내용은 세미콜론을 붙여야 하지만 조건이나 if문 자체에는

세미콜론을 쓰지 않습니다.

else if (조건2) {행동2;} 은 if문과 반드시 병행되어야 합니다.

정확히는 if문 뒤쪽에 위치해야 합니다. 이는

앞쪽에 위치한 if문의 조건을 제외한 상태에서 (조건2)에 해당할 때

else if 문의 {행동2}을 취하게 됩니다.

else {행동3;} 은 if문 덩어리의 가장 마지막쪽에 위치해야 합니다.

앞쪽에 위치한 모든 if, else if문의 조건에서 어떠한 조건에도 해당하지 않을 때

else 문의 {행동3} 을 취하게 됩니다.

한번 진행해 봅시다.

예시로 15를 넣었는데 정상적으로 작동합니다.

다른 수, 가령 10보다 작거나 같은 수를 넣어도

조건에 맞는 멘트가 출력되는 것을 확인할 수 있습니다.

추가적으로 if문의 조건을 작성할 때

부등호의 활용에서 a < b < c 같은 형식은 사용하시면 안 됩니다.

이게 무슨 소리인가 하면

가령 위의 예시에서 이런 식으로 추가적인 코딩을 했다고 해 봅시다.

위의 것과는 달리 맨 첫 번째 조건문에 있는 조건을 number 이상 20미만이라는 조건을 넣고

그 대신 20 이상일 경우를 하나 더 추가한 것입니다.

첫 번째 조건 문의 조건이 (number < number2 < 20)이 된 것이죠.

언 듯 보기에는 그다지 큰 문제가 없어 보입니다.

수학적으로 봤을 때 틀린 것이 없고 추가된 20 이상에 대한 것도 정상적입니다.

그러나

warning C4804: '<': 연산에 'bool' 형식을 사용하는 것은 안전하지 않습니다.

분명히 22를 넣었지만 나와야 하는 문구는 안 나오고

여전히 첫 번째 조건 문의 행동양식을 출력합니다.

warning C4804: '<': 연산에 'bool' 형식을 사용하는 것은 안전하지 않습니다. 라고 뜨네요

이 경고문의 의미는 ㅁ<ㅇ<O 형식을 사용하면 안 된다는 것입니다.

C언어 논리회로상 ㅁ<ㅇ 만 적용되고 뒤쪽 부분은 정상적으로 작동하지 않은 것으로

첫 번째 if 문의 조건은 여전히 number < number2 로 적용되고 그 때문에

else if를 사용한 두 번째 조건문은 무시당한 것입니다.

만약 이를 정상적으로 적용하려 한다면 위쪽에서 배운

논리연산자를 사용해야 합니다.

조건은 number보다 크고, 20보다 작은 교집합이므로

논리 연산자 "그리고"에 해당하는 &&를 사용하면

이렇게 정상적으로 작동하게 됩니다.

3. switch case 조건문

switch 문은 if 문보다 활용의 폭이 작긴 하지만 그만큼 간단하기 때문에

사용하기엔 간편하기도 합니다.

일단 if 문은 "if(조건)" 이 과정이 시간이 좀 걸리니까요.

괜히 논리연산자가 사용되지도 않으니깐 연산속도도 빠릅니다.

자판기 같은 걸 만들 때 아무래도 하나하나 지정하는 것보다

버튼에 번호를 지정해서 이걸 사용하는 게 더 간편하기도 하고요.

#include <stdio.h>

int main()

{

printf("\n시작 \n");

int number;

printf ("숫자를 입력하시오 : ");

scanf("%d",&number);

switch (number)

{

case 1 :

printf("1입니다.");

break;

case 2 :

printf("2입니다.");

break;

default :

printf("1과 2 모두 아닙니다.");

return 0;

}

switch문에선 변수 하나를 지정하고 이 변수가 어떤 경우냐에 따라

특정한 행동을 취하도록 만들어줍니다.

switch (변수명) { . . . } 는 switch문의 기본 틀입니다.

괄호 안에 들어가는 (변수)는 switch문에서 입력받은 값에 따라 분기되는 기준을 맡습니다.

case 변수 : 는 마찬가지로 switch문의 기본 틀입니다.

직역하면 숫자 의 경우 : 라는 뜻이죠. (변수)가 값과 조건이 일치하는 경우라면

다음과 같은 행동을 취한다는 의미입니다.

세미콜론 (;) 아닙니다. 콜론(:) 이에요.

break; 는 행동을 멈추고 그 구문을 빠져나간다는 의미입니다.

딱히 switch문에서만 사용되는 것은 아니고, 반드시 써줘야 하는 틀도 아니지만

이걸 안써줘도 되는 경우는 극히 드물고

대부분은 사용을 해 줘야 정상적으로 작동합니다.

만약 이것을 사용하지 않는다면 조건에 맞는 case 이후의 모든 내용을

조건에 맞고 안맞고랑 상관없이 출력하게 됩니다.

이에 대한 내용은 밑에서 다루죠.

default : 는 어떤 경우에도 해당하지 않는 경우에 작동합니다.

위쪽의 조건들, 그러니깐 case 숫자 : 들 어디에도 맞지 않는 경우에

이 내용에 해당하는 행동을 이행하게 됩니다.

if 문에서 else 와 비슷한 역활을 하죠.

그럼 한번 직접 해 봅시다.

scanf_S 쓰라는 컴파일러의 잔소리는 일단 무시해 줍니다.

정상적으로 작동하는 것을 볼 수 있습니다.

만약 break;를 사용하지 않는다면 어떻게 될까요??

위쪽에서 말했다시피 break; 는 필수적인 문법 요소가 아닙니다.

우리에게 있어서 필요로 하는 요소지만

컴파일러나 컴퓨터 입장에선 그딴 거 알 바 아니기 때문에

빼먹는다고 해도 아무런 이상 없이 컴파일이 진행됩니다.

그러나 break;를 사용하지 않는다면 조건에 맞는 열에서부터

프로그램이 작동하면서 그 밑의 모든 코드를 전부 이행하게 됩니다.

이게 무슨 말이냐면...

이런 참상이 나옵니다.

분명 숫자 1만 넣었지만

그 밑에 있는 모든 행동 양식을 그대로 이행하는 것이죠.

만약 숫자 2를 넣었다면

" 2입니다. 1과 2 모두 아닙니다. " 라고 떴을 겁니다.

그럼 이제 오늘의 목표인 사칙연산 계산기 제작을 한번 시도해 봅시다.

C언어에서 조건문을 활용한 사칙연산 계산기를 만드는 것은

생각 외로 어렵지 않으면서도 은근히 잡스러운 오류로 실패하는 경우가 많습니다.

먼저 switch 구문을 이용해서 만들어 보겠습니다.

#include <stdio.h>

int main()

{

int a, b;

char ch;

printf("수식을 한 줄로 띄어쓰기 구분하며 입력하시오 : "); // a + b 형식으로 입력

scanf("%d %c %d", &a, &ch, &b);

switch (ch) {

case '+':

printf("%d + %d = %d 입니다. \n", a, b, a + b);

break;

case '-':

printf("%d - %d = %d 입니다. \n", a, b, a - b);

break;

case '*':

printf("%d * %d = %d 입니다. \n", a, b, a*b);

break;

case '/':

printf("%d / %d = %d 입니다. \n", a, b, a / b);

break;

default:

printf("잘못 입력했습니다. \n");

}

}

정상적으로 작동하는 것을 알 수 있습니다.

수식 입력하실 때

scanf("%d %c %d", &a, &ch, &b); 로 코딩을 했기 때문에

반드시 "%d %c %d" 의 형식으로 받아야 합니다.

무슨 뜻이냐 하면

숫자 입력>한칸 띄우고>기호입력>한칸 띄우고>숫자입력

이런 식으로 입력받아야 한다는 뜻이죠.

만약 이것이 걸리 적 거린다 하면 다른 형식으로 scanf를 하시면 됩니다.

이제 위에 한 switch문 사칙연산 계산기를

이번엔 if문으로 교체해서 만들어 보도록 하겠습니다.

#include <stdio.h>

int main()

{

int a, b;

char ch;

printf("수식을 한 줄로 띄어쓰기 구분하며 입력하시오 : ");

scanf("%d %c %d", &a, &ch, &b);

if (ch == '+')

{

printf("%d + %d = %d 입니다. \n", a, b, a + b);

}

else if (ch == '-')

{

printf("%d - %d = %d 입니다. \n", a, b, a - b);

}

else if (ch == '*')

{

printf("%d * %d = %d 입니다. \n", a, b, a*b);

}

else if (ch == '/')

{

printf("%d / %d = %d 입니다. \n", a, b, a / b);

}

else

{

printf("잘못 입력했습니다. \n");

}

마찬가지로 정상적으로 작동합니다..

if 구문에선 만약 행동해야 하는 것이 한 줄 일 경우엔 { } 를 사용하지 않아도 됩니다.

만약 사용하지 않을 경우 자동적으로 다음 줄만 해당하도록 되어 있기 때문에

지금 위에처럼 조건에 의한 행동이 겨우 printf 한 줄이라면 굳이

괄호를 사용하지 않아도 된다는 것이죠.

이런 식으로 해도 정상적으로 작동하는 겁니다.

또한 이 사칙연산 계산기에는 큰 문제가 존재하는데

바로 나눗셈은 소수점 자리는 전부 버림 한다는 것입니다.

이는 %d / %d = %d 형식을 이용했기 때문입니다.

입력값 a 와 b 는 필요에 의하여 정수 형태의 변수로 선언했는데

나눗셈의 결과값은 소수점을 표현해야만 하는 거죠.

이를 해결하기 위해선 결과 값을 새로이 float 변수 선언을 하는 방법과

나눗셈 결과값만을 float형으로 만들어 주는 방법이 있습니다.

새로이 결과값을 변수 C로 선언한다면

사칙연산의 특성상 4가지 연산 방법 모두에 변수 C의 계산을

하나하나 다시 규정하는 방식을 사용해야 하기 때문에 시간이 오래 걸리고

코드 줄도 많아집니다.

나눗셈 결과값만 float형으로 만드는 것이 좋습니다.

방법은 결괏값 출력 부분을 %d 에서 %f 로 바꿔주시고

대입하는 부분의 분모에 (float)를 추가해주시면 됩니다.

보시다시피 정상적으로 소수점까지 연산되는 것을 알 수 있습니다.

#C언어 #조건문 #if #switch

Toplist

최신 우편물

태그