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 토실토실천재
2010. 7. 8. 18:41
9장, 조건에 따른 흐름의 분기


// 강의에 앞서, 이제는 논리가 필요해요, 조건을 유심히 보면서, 참과 거짓을 
// 판별할 수 있는 눈이 필요해요

● 흐름의 분기가 필요한 이유

 - 사용자에 따라서 필요한 연산을 선택실행 할 수 있게 하기 위하여

 - 짜여진 각본이 아닌, 프로그램이 유연성을 갖게 끔 한다.



● if문에 의한 조건적 실행

 - 조건이 만족되는 경우에 한해서 실행

 ex) if(실행의 조건)
     {
        실행하고자 하는 내용
     }  // tip : 한문장이면 { } 를 생략가능

    ; 실행의 조건이 만족이 되면
      실행하고자 하는 내용을 실행한다.


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

// if(조건) : 만약에 (조건)이 이면 실행된다

#include <stdio.h>

int main()
{
int val;
printf("정수를 하나 입력하세요 : ");
scanf("%d", &val);

if(val < 0) // val값이 0보다 작을때 (조건이 참이면 밑을 실행한다.)
printf("입력값은 0보다 작다 \n");

if(val > 0) // val값이 0보다 큰 조건이 참이면
printf("입력값은 0보다 크다 \n");

if(val == 0) // val값이 0과 같으면
printf("입력값은 0이다 \n");

return 0;
}
// 조건검사를 3번한다.

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

#include <stdio.h>

int main()
{
int input;
float num1, num2;
float result;

puts("1. 덧셈  2. 뺄셈  3. 곱셈  4. 나눗셈");
printf("선택하여 입력 : ");   scanf("%d", &input);

printf("두개의 실수 입력 : ");
scanf("%f %f", &num1, &num2); // scanf 입력수를 복수이상 입력 가능
// tip : 정수 입력시, space키나  enter키로  구분하여 입력한다

if(input==1) // 만약 input이 1이면 실행
{
result = num1 + num2;
printf("결과 : %f \n", result);
}

if(input==2) // 만약 input이 2이면 실행
{
result = num1 - num2;
printf("결과 : %f ", result);
}

if(input==3) // 만약 input이 3이면
{
result = num1 * num2;
printf("결과 : %f \n", result);
}

if(input==4) // 만약 input이 4이면
{
result = num1 / num2;
printf("결과 : %f \n", result);
}
return 0;
}

// printf("결과 : %f \n", result); 값이 공통적으로 중복된다.
  ↓↓↓↓
보완한 결과) ====================================
#include <stdio.h>

int main()
{
int input;
float num1, num2;
float result;

puts("1. 덧셈  2. 뺄셈  3. 곱셈  4. 나눗셈 ");
printf("선택하여 입력 : ");
scanf("%d", &input);

printf("두개의 실수 입력 : ");
scanf("%f %f", &num1, &num2);

if(input==1) 
result = num1 + num2;

if(input==2) 
result = num1 - num2;

if(input==3)
result = num1 * num2;

if(input==4)
result = num1 / num2;

printf("결과 : %f \n", result);

return 0;
}
    중복된 코드를 좀더 수정해서 
==> 코드가 좀더 간결해졌다.

응용예제)==========================================

// 반복문(for문) 안에도 if가 올수 있다.

#include <stdio.h>

int main()
{
int loop;
for(loop=1; loop<100; loop++)
     // loop가 1부터 1씩증가해서 99가 될때까지 반복한다.
{
if(loop%3==0 && loop%4==0)
               // tip : (&&) : AND연산자 ( a조건 && b조건) ; 둘다 참이여야 실행
{
              // 만약에 loop 가 3으로 나누어 떨어지고, 4로도 나누어 떨어지면
printf("3의 배수이자 4의 배수");
printf("3, 4로 동시에 나눠어 떨어지는 수 : %d \n", loop);
}// tip : 문장이 한개인경우 '{}' 생략가능

}

return 0;
}

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

※ 근데 여기서 잠깐!!
  >> if문만 쓰게 된다면 일일이 if문이 나올경우
      불필요한 연산을 다 하게 된다.
    
   else문을 더해서 if문의 조건이 맞지 않을경우 실행하게 분기를 둔다.

if(조건)
{
조건이 만족시 실행
}
else
{
if의 조건의 맞지 않을때
이 문장이 실행된다
}

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

#include <stdio.h>

int main()
{
int val;

printf("정수를 한개만 입력하세요 : ");
scanf("%d", &val);

if(val < 0) // val 값이 0보다 작으면 밑에 printf문이 실행
printf("입력값은 0보다 작습니다 \n");
else      // if문의 조건이 거짓이면, 무조건 else 문이 실행된다.
printf("입력값은 0이거나 그보다 크다\n");

return 0;
}

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

else if() : if문의 조건이 아닌경우 다른 조건을 만족시키고 싶을때
설명보다는 예를 들어 설명하는 편이 훨씬 쉬울듯하네요

if(조건 1)
{
조건 1 만족시 실행
}

else if(조건 2)
{
조건 1이 만족되지 않고
조건 2가 만족되면 실행
}

else if(조건 3)
{
조건 1, 2이 만족되지 않고
조건 3이 만족되면 실행
}

else if(조건 4)
{
조건 1, 2, 3이 만족되지 않고
조건 4가 만족되면 실행
}

else
{
모든 조건(1, 2, 3, 4)가 만족되지 않으면
else 가 무조건 실행된다

// 만약에 조건 2을 만족하는 조건이라면
// if(조건1)을 검사한뒤
// else if(조건 2)를 실행하고, else if(조건3) else을 건너뛴 뒤
// 프로그램이 종료된다.

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

tip1 : else if는 얼마든지 갯수를 많이해서 사용할수 있다.

tip2 : else if 사용시 무조건 if가 있어야 쓸수있다


#include <stdio.h>

int main()
{
int input;
float num1, num2;
float result;

puts("1. 덧셈  2. 뺄셈  3. 곱셈  4. 나눗셈 ");
printf("선택하여 입력 : ");
scanf("%d", &input);

printf("두개의 실수 입력 : ");
scanf("%f %f", &num1, &num2);

if(input==1) // 만약 input이 1이면 밑에 프로그램이 실행
{
result = num1 + num2;
printf("결과 : %f \n", result);

}

else if(input==2) // input가 1이 아니고 2라면 실행
{
result = num1 - num2;
printf("결과 : %f ", result);
}

else if(input==3) // input값이 1, 2가 아니고, 3일때 실행
{
result = num1 * num2;
printf("결과 : %f \n", result);

}

else if(input==4) // input값이 1, 2, 3이 아니고 4일때 실행
{
result = num1 / num2;
printf("결과 : %f \n", result);
}

else // 모든 경우가 거짓일때 실행한다.
printf("적절한 값의 입력이 아닙니다 \n");

return 0;


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

  @ if ~ else 문은 하나의 문장이다.
  @ if ~ else 문은 중첩사용가능하다.

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

#include <stdio.h>

int main(void)
{
int val;
printf("정수를 하나 입력하세요 : ");
scanf("%d", &val);

if(val < 0) // val 값이 0보다 작다면 
printf("입력한 수는 0보다 작습니다 \n");

else
{              // vall값이 0보다 작지 않다면(0보다 크거나, 0과 같다는 조건이 남게된다)
if(val > 0) // val값이 0보다 크면
printf("입력한 수는 0보다 큽니다 \n");

else // 그게 아니라면 (즉, val값이 0과 같다면이라는 조건이 남게된다)
printf("입력한 수는 0입니다 \n");
}
return 0;
}

Posted by 토실토실천재
2010. 7. 8. 18:40
< 8장, 여러형태의 반복문 >



/* 이번장은 좀 생각을 많이 필요해요, 재밌게 해봅시다.(많이 중요해요) */

반복문이란?

- 반복문의 기능
> 특정 영역을 특정 조건이 만족하는 동안에 반복실행하기 위한 문장


반복문의 세가지 형태?
  (이 중에 한개만 이해하면 나머지는 아무것도 아닙니당)

- while문에 의한 반복 : while()

- do ~ while문에 의한 반복 : do while()

- for문에 의한 반복 for( ; ;)



● while문의 기본 원리와 의미

=============================
- while문의 구성 : 반복조건의 만족되는 동안 반복내용을 반복해서 실행하라

while(반복조건)
{

반복내용
}
==============================
// 예제 참고

문장이 2줄이상이면 { } 를 넣어준다.
하지만 콤마 연산자(,)를 사용해서 한줄로 나타낼수 있다
그렇다면{}를 없애도 된다.(한줄은 문장은 {}를 생략가능하다)

// 구구단 프로그램 연습하기
#include <stdio.h>

int main()
{
int i = 1;

printf("구구단 2단 입니다 ");

while(1)  //무한반복하란의미, 즉 ()안의 조건이 '1', 즉 항상 참이기때문
{
printf(" %d × %d = %d ", 2, i, 2*i); 
i++;              // 반복문이 실행이 될때마다 i값을 1씩 증가
if(i>9) break; // 만약에 i가 9보다 크면 break문을 써서 반복문을 빠져나온다
}
system("PAUSE");
return 0;
}

※ while(1)은 어떻게 될까요?
= > 0이 아닌 모든 숫자는 참이다
= > 항상 참이기때문에 무한반복이된다.
- 일반적으로 1을 쓴다 (프로그래머와의 약속) - 0이 아닌 어떤수를 넣어도 된다
    ex) 컴퓨터를 검색할때 쓰인다.

★ while문의 중괄호
: 반복하고자 하는 영역이 둘 이상의 문장으로 구성되는 경우 필수
 - 여러분이 이것저것 숫자 바꿔보고 연습해야함


● while문의 중첨
 > 여러분에게 있어서 고비 일수도 있습니다.

- while문안에 while문을 포함시킨다는 뜻

- 반복 구조내에서 또 하나의 반복 구조 형성

- 연습장 가지고 나름대로 그림그려가면서 공부하면 더 좋다.

- 백문이 불여일견, 백문이 불여일타

while문 안에 while문을 포함시킨다는 뜻
- 반복구조내에서 또하나의 반복구조 형성

예제=====================================
#include <stdio.h>
#include <windows.h>
using namespace std;

int main(void)
{
 int k, j;
 k = j = 0;
 int num=0;

 while(k < 3)
 {
 printf("**** 현재는 k = %d ", k);
 
   while(j < 3)
   {
    printf("현재 j는 %d ", j);
    num++;
    j++;
   }
   k++;
   j=0;
}
 system("PAUSE");
 return 0;
}
=========================================

오늘것만 이해하신거면 완전 성공한거
알쏭달쏭하다면 반 성공
전혀 모르겠다 => 더 잘됐다 이런분들이 더 빠질수 있다

※ do ~ while문과 while문의 차이점
  - do while문은 일단 한번 실행하고 나서 조건 검사를 진행

do{

반복내용

} while(반복의조건);

자 먼저 do내용을 먼저 한번 실행하고
while 반복조건을 검색한다

- while문은 한번도 실행이 안될수 있다   (조건검사를 먼저 하기때문)
- do ~ while문은 한번은 먼저 실행되고 조건을 검색하고 다시 반복된다.
>> 한번 먼저 실행하고 반복검사를 하면 프로그램을 더 좋을때가 많다.
>> 일반적으로 while문이 많이 쓰인다.


====================================================
/* 구구단출력 프로그램 */
#include <stdio.h>
#include <windows.h>
using namespace std;

int main(void)
{

int i = 2;          // i는 2부터 시작하니,
int j = 0;       

while(i<10)  // i가 10보다 작을때까지, 즉 9까지
{
j = 1;
while(j<10) // j는 10보다 작을때까지, 즉 9까지
{
printf("%d * %d = %d ", i, j , i*j); 
j++;
}
i++;  
}

====================================================
/* 입력한수 계속 더하기 */

#include <stdio.h>

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

do
{
printf("숫자 입력 ( 0 : quit) :");
scanf("%d", &val);
total+=val;
}
while(val!=0);
printf("Total : %d ", total);

system("PAUSE");
return 0;
}
====================================================

/*  원한는 단을 출력하는 구구단프로그램  */

#include <stdio.h>
#include <windows.h>

int main()
{
int val ;
int i = 1;

printf("출력하고자 하는 구구단, 몇 단? :");
scanf("%d", &val);

do
{
printf("%d * %d = %d ", val, i, val*i);
i++;
}
while(i<10);

return 0;
}


● for문의 기본 원리와 의미

 - 초기문 , 조건문, 증감문 모두를 기본적으로 포함
 - 가장 많이 사용되는 반복문

for(초기문; 조건문; 증감문)
{
반복하고자 하는 내용
}

 - 초기문 : 반복을 하고자하는 변수를 초기화 (딱한번만 실행)
 - 조건문 : 반복조건을 확인하는 문장
 - 증감문 : 반복의 조건을 어느시점에서 무너뜨리기 위한 증감

 ※ 대부분 반복문들은 잘 관찰하면 이 세가지가 항상 등장한다.


===========================================================
/* 0부터 입력한수까지의 합 구하는 프로그램 */

#include <stdio.h>
#include <windows.h>

int main(void)
{
int total = 0;
int i, n;

printf("0부터 n까지의 덧셈, n은? ");
scanf("%d", &n);

for(i=0; i<=n; i++) // i는 0부터시작해서 입력한 수 n보다 같거나 작을때까지
{                            // i는 1씩 증가
total += i;
}
printf("0부터 %d까지의 덧셈결과는 : %d", n, total);

system("PAUSE");
return 0;
}
===========================================================

이해하고 익숙해지면 for문이 더 이해하기 쉽다
- 초기문, 조건문, 증감문을 한눈에 볼수 있다

※ while문 do~while, for문으로 서로 막 바꿔가면서 연습을 해보세요

===========================================================
/* 양의정수를 입력을 반복하여 더해 평균을 구하는 프로그램 */
#include <stdio.h>
#include <windows.h>

int main(void)
{
float total = 0.0;
float input = 0.0;
int count = 0;

for(;input >=0.0;) // 이건 초기문, 증감문이 없다.
                       //  단, input값이 0.0보다 클때 라는 조건만 있따.
{
total += input; // 아
printf("양의 실수 입력(minus to quit) :");
scanf("%f", &input);
count++;
}

printf("지금까지의 평균 : %f ", total/count-1); // count는 한번더 +1을 하므로 -1을 해줌
return 0;
}

// for문의 초기문 증감문은 필요에 따라서 다른곳에 적어준다

// for(;;) = while(1) 즉, 무한루프를 의미

===========================================================
/* for문의 중첩반복을 통한 이해를 돕는 */

#include <stdio.h>
#include <windows.h>

int main(void)
{
int i, j;

for(i=0; i<3; i++)
{
printf("현재 i 는 %d *** ", i);

for(j=0; j<2;j++)
{
printf("현재 j는 %d ", j);
}
i++;
}
system("PAUSE");
return 0;
}


숙제 ===========================================================

다음과 같은 프로그램이 동작하도록
코드를 작성하세요


임의적으로 10을 입력


정답은 첨부파일참조

Posted by 토실토실천재