C 언어 컴퓨터학과 C 언어 ( STS ) (Chap5. Selection-Making Decisions ) C 언어
컴퓨터학과 Chapter 5. Overview Logical Data And Operators Two – Way selection Multiway Selection
C 언어 컴퓨터학과 Logical Data and Operator(*) 지금까지 배운 제어 (control) 흐름은 순서대로 (sequential) 정상적 흐름을 벗어나 어떤 상황에서 판단을 하여 다른 흐름을 만드는 방법이 선택 (selection) 이다. 선택은 논리적 판단에 기반한다. 그러나 전통적으로 C 에는 논리 형 (logical type) 이 없었다. 이에 따라 모든 비트가 ‘0’ 이면 ‘false’, 아니면 ‘true’ 로 보는 방법을 취한다. Boolean 타입이 생겼으므로 Boolean 타입을 사용하는 것이 좋음 정수, 실수 등에서는 0, 문자에서는 ‘\0’ 가 false 에 해당한다.
C 언어 컴퓨터학과 (*) &&(and), ||(or), !(not) not(!) > and (&&) > or(||) 논리 연산자는 두 개 또는 하나의 논리값을 0 이나 1 의 논리값 으로 평가하기 위한 연산자 연산자 && 는 수학에서의 and 를 의미 연산자 || 은 or 를 의미 연산자 &, | 는 and 와 or 로 사용하나 정확히 말하자면 연산 자 & 와 | 는 비트 연산자 연산자 의미연산 기호의미 AND OR NOT op1 && op2 op1 || op2 !op1 연산자의 왼쪽 값 (op1) 과 오른쪽 값 (op2) 의 AND 연산 수행 연산자의 왼쪽 값 (op1) 과 오른쪽 값 (op2) 의 OR 연산 수행 단일 연산자로서 연산자 오른쪽 값 (op1) 의 NOT 연산 수행
C 언어 컴퓨터학과 (*) 논리 연산자의 연산 방법 연산에 참여하는 자료 값은 0 은 거짓 (false) 을 의미하며, 1(0 이 아닌 값 ) 은 참 (true) 을 의미 정수 만을 이용하는 것은 아니고 실수나 다른 유형의 자료 값도 이용이 가능 다만 평가의 결과는 반드시 0(false) 이거나 1(true) xy And 연산자 결과 Or 연산자 결과 Not 연산자 결과 x && yx || y!x (nonzero)
C 언어 컴퓨터학과 (*) 수식평가 결과이유 (5 > 2) && (3 == 2) (5 > 2) || (3 == 2) !(3 == 2) 오른쪽 (3 == 2) 의 결과가 0 이기 때문에 왼쪽 (5 > 2) 의 결과가 1 이기 때문에 연산식 (3 == 2) 이 0 이므로 논리 연산자는 수식에 포함된 그들의 피연산자의 0 이 아닌 값 (true) 과 0 인 값 (false) 에 따라 1 이나 0 으로 평가 결과가 도출 수식평가 결과이유 3 && && 4 1 && 1 (3 > 4) || !(4==1) 0.3 || || 과 4 모두 0 이 아니므로 참인 의미의 1 임 소수 0.0 도 거짓을 의미하는 0 임 !(4==1) 이 1 임 0 이 아닌 것은 모두 참인 의미의 1 임
C 언어 컴퓨터학과 관계연산자 (Relation operator) 두 값의 관계를 비교하여 논리적 결과를 생성하는 연산자로서 다음 의 6 가지 operator 가 존재한다. 다음은 관계연산자로 표현된 expression 의 보완관계 예제들이다. !(x = y !(x >= y) x < y !(x != y) x == y !(x == y) x != y (*)
C 언어 컴퓨터학과 Two-Way Selection 조건문의 결과에 따라 제어 흐름이 바뀌게 된다. 다음은 two-way decision 의 로직이다. Decision condition 이 true 이면 true action 을 취하고 false 이면 false action 을 취한다.
C 언어 컴퓨터학과 (*) if…else 이용 조건문 if 에서 키워드 else 를 사용하여 조건 표현식이 거짓인 경우, else 이 후의 문장을 실행하는 구문을 구성 if…else 문의 statement 는 들여쓰기를 한다. 들여쓰기는 conditional expression 이 true 일 때, 관련되는 statement 를 분류하 고, false 일 때 또한 관련된 statement 를 분류하여, 사람이 코드를 인식하기 쉽게 하여 준다. 컴퓨터는 들여쓰기를 인식하지 못한다.
C 언어 컴퓨터학과 Conditional expression 을 수행 후에 수행하는 statement 가 두 개 이상 일 때는 { } 로 묶어준다.
C 언어 컴퓨터학과 (*) 예제 프로그램 ( 코드 1) – if…else 문의 예 #include int main(void) { int number = 0; printf(" 양의 정수 하나를 입력하세요. "); scanf("%d", &number);// 사용자로부터 임의의 값을 입력 받는다. printf("---> 입력한 수 %d 는 ( 은 ) ", number); if (number % 2 == 0) { // 입력 받은 수를 2 로 나누어 나머지가 0 이면 짝 수 printf(" 짝수 입니다.\n"); } else { printf(" 홀수 입니다.\n"); } return 0; }
C 언어 컴퓨터학과 예제 프로그램 1( 결과 ) 위 예제 프로그램을 컴파일 후, 실행시키면 사용자로부터 입력 받은 값이 2( 짝수 ) 이면 짝수 사용자로부터 입력 받은 값이 3( 홀수 ) 이면 홀수라고 나온다.
C 언어 컴퓨터학과 Nested if Statements if 문장 내부에 다른 if 문이 나오는 문장을 중첩 (nested) 된 if 문이라고 한다. 즉 조건 내에 다른 조건을 넣고 싶을 때 유용한 표현이다. 다음은 nested if 문의 Logic 흐름과 실제 표기법이다.
C 언어 컴퓨터학과 예제 프로그램 ( 코드 2) – Nested if statement 문의 예 #include int main(void) { int number1, number2 = 0; printf(" 양의 정수 두 개를 입력하세요. "); scanf("%d %d", &number1, &number2); // 사용자로부터 임의의 값을 입력 받는다. if (number1 % 2 == 0) // 입력 받은 수를 2 로 나누어 나머지가 0 이면 짝수 if(number2 % 2 == 0) printf(“ 두 수 모두 짝수 입니다.\n"); else printf(“number1 은 짝수, number2 는 홀수 입니다.\n"); else printf(“number1 은 홀수가 확실합니다 !!!\n”); return 0; }
C 언어 컴퓨터학과 예제 프로그램 2( 결과 ) 위 예제 프로그램을 컴파일 후, 실행시키면 사용자로부터 입력 받은 두 수가 모두 짝수, 첫수가 짝수 두 번째 수는 홀수일 때, 그리고 첫수가 홀수일 때 각각 아래와 같이 출력된 다.
C 언어 컴퓨터학과 if…else 구문에서 여러 개의 if 문이 나타난 경우에 else 문이 생 략되면 의미가 불분명해 질 수 있다. 이런 else 는 가장 가까운 if 문의 else 로 생각함으로써 명확히 구별할 수 있다. 이러한 문제 (Dangling else problem) 을 해결하기 위하여 의도 한 if 문을 {} 로 처리해주면 좋다. 또한 들여쓰기를 잘 하면 훨씬 이해하기 쉬워진다.
C 언어 컴퓨터학과 Compiler 는 else 를 가장 가까운 if 문과의 짝으로 생각한다. if(alpha=3) 과 쌍을 이루게 하려면 ….. if(alpha == 3) if(beta ==4) printf(“alpha = 3, beta = 4\n”); else printf(“alpha beta not valid \n”); if(alpha == 3){ if(beta ==4) printf(“alpha = 3, beta = 4\n”); } else printf(“alpha beta not valid \n”);
C 언어 컴퓨터학과 Multiway Selection Multiway selection 에는 크게 switch 문과 else if 문이 존재한다. Switch 문 Expression 과 value 는 반드시 정수나 정수수식이어야 한다. switch 문은 여러 개의 선택을 처리하는 구문으로 switch 이후의 괄 호 () 사이의 표현 식의 값 중에서 case 의 값과 일치하는 것을 처리 하는 문장 Default : 반드시 있어야 하지는 않지만 선택되지 않은 모든 경우를 나타낸다. 다음은 switch 문의 로직이다.
C 언어 컴퓨터학과 switch 문의 실행순서 1. switch 문의 표현식 (expression) 을 평가한다. 2. 위 표현식에서 계산된 값과 일치 하는 상수 값 (constant) 을 갖는 case 의 값을 위에서부터 찾는다. 일치 된 case 값을 만나면 case 내부의 문 장을 실행한다. 3. break 를 만나면 switch 문을 종료한 다. 또는 switch 몸체의 마지막 문 장을 수행하면 switch 문을 종료한 다. 4. 일치된 case 문을 만나지 못하여 default 를 만나면 default 내부의 문 장을 실행한다.
C 언어 컴퓨터학과 (*) 예제 프로그램 ( 코드 3) – switch 문의 예 #include int main(void) { int invalid_operator = 0; char operator; float number1, number2, result; printf(" 두 수를 다음과 같은 형태로 입력하세요.\n"); printf(" 연산자는 네 가지 (+, -, *, /) 중의 하나여야 합니다.\n"); printf("number1 연산자 number2\n"); scanf("%f %c %f", &number1, &operator, &number2);
C 언어 컴퓨터학과 (*) switch( operator ) { case '*' : result = number1 * number2; break; case '/' :result = number1 / number2; break; case '+' : result = number1 + number2;break; case '-' : result = number1 - number2; break; default :invalid_operator = 1; } switch( invalid_operator ) { case 1 : printf(" 연산자가 잘못 입력되었습니다.\n"); break; default : printf("\n>>>>>>>>> 결과는 \n"); printf("%5.2f %c %5.2f = %5.2f\n", number1, operator, number2, result); break; } return 0; }
C 언어 컴퓨터학과 예제 프로그램 3( 결과 ) 위 예제 프로그램을 컴파일 후, 실행시키면 입력 받은 가운데 연산자가 ‘ * ’ 와 ‘ - ’ 일 때 각자 해당되는 연산의 결 과를 출력한다.
C 언어 컴퓨터학과 (*) break 문 switch 문에서 break 문을 만나면 무조건 switch 문을 종료 그러나 switch 문의 case 문 내부에 break 문이 없다면 일치하는 case 문을 실행하고, 계속해서 break 문을 만나기 전까지 무조건 다음 case 문 내부의 문장을 실행 break 이후 실행되는 곳은 지금 빠져 나온 structure 의 바로 뒷 부분 이다. break 문을 주로 사용하는 용도 Loop 으로부터의 탈출 switch structure 에서 나머지 실행문장을 건너 뛰기 위해
C 언어 컴퓨터학과 구문 예 아래 구문에서 변수 month 의 값이 1 이거나 3, 10, 12 중 의 하나이면 case 12: 의 내부 문장 두 개를 실행하고, break 문장을 만나 switch 문 이 종료 month 의 값이 4 이거나 6, 9, 11 중의 하나이면 case 11: 의 내부 문장 두 개를 실행하고, break 문장을 만나 switch 문 이 종료
C 언어 컴퓨터학과 (*) 예제 프로그램 ( 코드 4) – break 문의 예 #include int main(void) { int year = 0, month = 0, maxDay = 30, validinput = 0; printf(" 년과 월을 다음과 같이 입력하면 그 달의 말일을 알려드립니다.\n"); printf("2003 2\n 입력 >"); scanf("%d %d", &year, &month); switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12:maxDay = 31; // 한 달이 31 일인 달들 validinput = 1; break; case 4: case 6: case 9: case 11:maxDay = 30; // 한 달이 30 일인 달들 validinput = 1; break;
C 언어 컴퓨터학과 (*) case 2: if ((year%4 == 0) && (year%100 != 0) || (year%400 == 0)) // 윤년 계산을 위한 문장 maxDay = 29; else maxDay = 28; validinput = 1; break; default: validinput = 0; } if (validinput) printf("%d 년 %d 월의 말일은 %d 일 입니다.\n", year, month, maxDay); else printf(" 입력이 잘못되었습니다.\n"); return 0; }
C 언어 컴퓨터학과 예제 프로그램 4( 결과 ) 위 예제 프로그램을 컴파일 후, 실행시키면 입력된 연과 달에 해당되는 말일을 출력해준다. 31 일인 1,3,5,7,8,10,12 월과 30 일인 4,6,9,11 월은 break 가 없어 같은 결과 값을 가지게 된다.
C 언어 컴퓨터학과 (*) Else-if 문 If(expression) statement else if(expression) statement else if(expression) statement else statement 이 형태의 if 문은 다중판단을 할 경우에 사용 되는 전형적인 문장이다. Expression 은 순서에 의해 계산되며 만일 수식이 참일 경우 그 바로 밑에 있는 statement 가 수행되고, 구문을 끝낸다. 그렇지 않을 경우 다음 수식으로 넘어가는 과정을 반복한다. 마지막 else 는 위쪽 수식이 참일 경우가 하나도 없는 경우 수행되는 statement 를 포함하고 있으며 필요 없으면 생략도 가능하고, 우발적인 실수를 검사하기 위해 사용된다.
C 언어 컴퓨터학과 (*) if (score >= 90) grade = ‘A’; else if (score >= 80) grade = ‘B’; else if (score >= 70) grade = ‘C’; else if (score >= 60) grade = ‘D’; else grade = ‘F’; 다음은 점수 매기는 부분을 if -else 문을 사용한 예제이다.
C 언어 컴퓨터학과 (*) 예제 프로그램 ( 코드 5) – else if 문의 예 #include int main(void) { int score = 0; char grade; printf(“ 점수를 입력하세요. "); scanf("%d", &score); // 사용자로부터 임의의 값을 입력 받는다. if (score >= 90 ) grade = ‘A’; else if( score >= 80 ) grade = ‘B’; else if( score >=70 ) grade = ‘C’; else if( score >= 60 ) grade = ‘D’; else grade = ‘F’; printf(“ 당신의 학점은 %c 입니다 \n”, grade ); return 0; }
C 언어 컴퓨터학과 (*) 예제 프로그램 5( 결과 ) 위 예제 프로그램을 컴파일 후, 실행시키면 입력 받은 점수에 해당되는 Grade 를 출력해준다. 90 점 이상은 A, 80 점 이상은 B, 70 점 이상은 C, 60 점 이상은 D 학 점이고 나머지는 F 학점이다.