2010. 7. 8. 18:42
제 9장 흐름의 분기 - 2




조건 연산자(3(삼)항 연산자)

 - if ~ else 문을 간결히 표현하는데 사용 될 수 있음.
  ※ tip: 간단하고 실용적이라 그냥 외우는 편이 좋습니다.

 (조건) ? A : B
  → 조건이 '참'인 경우 A를 반환
  → 조건이 '거짓'인 경우 B를 반환

ex_1) int a = 3;
       c = (a>0) ? 10 : 20;
    // 만약에 a>0가 참인경우 c = 10 이다
    // 만약에 a>0가 거짓이면 c = 20 이다.
    // 결과적으로 3은 0보다 크므로  참이다,
    // c 에는 10이 반환된다.

ex_2) c = (a>0) ? a*3+1 : a/3;
   해석해보세요

예제)===============================================

#include <stdio.h>

int main()
{
int num;
char ch;

printf("정수 입력 : ");
scanf("%d", &num);

ch = (num < 0) ? '-': '+';   // num 값이 0보다 작으면 ch = '-'가되고
                                       // num 값이 0보다  크면 ch = '+'가 되다.

(ch == '-')? printf("음수 \n"):printf("양수 \n");
// ch 가 '-'면 printf("음수\n")를 실행하고 그게 아니라면 printf("양수\n")가 실행된다.

printf("절대 값 : %d \n", (num<0) ? (-1)*num : num);
// num값이 음수(0보다 작으면)면 num*(-1)을 %d에 대입하고,
// 아니라면 그대로 num값이 %d에 대입된다.

return 0;
}

====================================================

break 문(탈출문안에서 사용된다)
 - 반복문을 나올때 사용(빠져나올때)

while(1)
{
if(num < 0)
break;
}


● continue : 나머지 부분을 건너뛰고 다시 루프반복
           다시 조건검사를 하러 바로 간다.
whie(1)
{
if(x<100)
continue;
}


예제-break문)===============================================

#include <stdio.h>

int main()
{
int sum = 0;
int val = 0;

while(1)             // for(;;)
{
sum = sum + val;// sum+=val;
if(sum>100)        // sum값이 100보다 클때
break;              // while(반복)문을 빠져나오겠다

val++;               // val값이 1씩 증가.
}

printf("sum = %d \n", sum);
printf("val = %d \n", val);

return 0;
}

예제-continuek문)===============================================


#include <stdio.h>

int main(void)
{
int val;

puts("시작 ! ");

for(val=0; val < 10; val++) // val값이 0부터 1씩 증가하면서 9까지..(10번반복)
{ // tip : OR연산자(||) ; 두 조건중 하나만 '참'이어도 실행
if(val%2==0 || val%3 ==0)  // val값이 2로 나누어 떨어지거나, 3으로 나누어떨어지면
continue; // 다시 반복설정 바로 점프한다. 즉, 밑에 printf 함수로 안내려감

printf("%d \n", val);
}
// 즉, 0~9까지 2, 3으로 나눠 떨어지는 수를 제외한 수를 출력한다.
// 2와 3의 배수
printf("끝 !");

return 0;
}


● switch~case문

 - 수식(정수값)과 일치하는case문을 찾아서 실행

 - if문과 달리 실행문이 여러개 있더라도 '{  }'으로 묶지 않음

 - case뒤에는 break를 사용해 탈출조건을 만들어준다

 - 만일 break문이 없으면 다음 case문이 실행된다

 - 반드시, 정수값만 수식으로 입력받아 처리한다..

 - 비교연산을 인자로 받을수가 없다.

 - default : case에 만족된 값이 없을때 실행하는 수식문

 - 우리가 레스토랑에 갔을때, 메뉴판을 보고 골라 선택하여
   주문을 하게 됩니다.(즉, 메뉴번호를 선택하여, 그 메뉴를 정한다)

 - 예제로 바로 들어가서 주석으로 설명 드릴게요

예제- switch-case 문)===============================================

#include <stdio.h>

int main()
{

int grade;

puts("학점판별프로그램입니다");
printf("점수를 입력하세요(0~100): ");
scanf("%d", &grade);

grade /= 10;       // grade = grade % 10;
        // grade 값은 0~10까지의 값이 들어간다.

switch(grade) // 정수 grade을 기준으로
{
case 10 :     // 정수값이 10이면
    // break문이 없으면 다음 case문이 실행된다
case 9 :            // 정수값이 9이면
puts("학점은 A입니다"); // 실행
break;        // break 문으로 switch문 전체를 빠져나온다

case 8 :        // 정수값이 8이면
puts("학점은 B입니다");
break;

case 7 :       //...
puts("학점은 C입니다");
break;

case 6 :
puts("학점은 D입니다");
break;

default :
puts("학점은 F입니다");
break;    // default 에서는 break 생략가능
}

return 0;
}

예제- switch-case 문)===============================================

#include <stdio.h>

int main()
{
char ch;
printf("인사를 해볼까요?  \n");
printf("다음 글자를 입력하세요 \n");
printf("아침(M), 점심(A), 저녁(E), 종료(Q) : ");


scanf("%c", &ch); // %c = 문자 하나를 입력받을때 

switch(ch)
{
case 'M':              // 하나의 문자이기에 ''를 해준다.
case 'm':
printf("Good Mornig~!\n");
break;

case 'A':
case 'a':
printf("Good Afternoon~!\n");
break;

case 'E':
case 'e':
printf("Good Evening~! \n");
break;

case 'Q':
case 'q':
printf("Quit Program! switch_case \n");
break;

default :
printf("input wrong word! \n");

}

return 0;
}

// 다음프로그램은 사용자의 입력방식에 따라서
// 프로그램을 유연성있게 하기위해서 break문의
// 적절한 사용을 예로 나타낸것입니다.
// 대/소문자 구분없이 프로그램이 영향을 받지 않게 만든것

if~else 문은 가독성을 떨어뜨리기때문에
필요에 따라서 적절히 구분해서 쓴다.

사실, 객관적으로도 구분하기가 switch문이 사용이 편하다
if~else문을 써도 상관은 없지만, 객관적인 입장을 추구해서
보기편하게, 즉, 가독성을 위해서 구분해서 쓰도록 한다.





goto 문- 점프문

프로그램의 흐름을 복잡하게 한다.
되도록 사용마세요(스파게티코드가 되기쉽다)

goto AA;(이동할 위치)
...
...
...

AA;(이동할 위치로 돌아가게 한다)

왠만하면사용을 사용을 아예 하지마시요, 

Posted by 토실토실천재