20140317 (break, continue, switch, debug)

21일차

 

---------------------

break, contine

---------------------

- break

반복문에서 빠져나가는 제어문

- continue

반복문을 계속 진행하는 제어문

ex) 예제 소스

#include <stdio.h>

int main()
{
  int iNum;
  
  // 30에서 50사이 값 입력
  while(1)
  {
    printf("30에서 50사이 값을 입력하세요 : ");
    scanf("%d"&iNum);

    if(30 > iNum)
    {
      continue;
    }

    if(50 < iNum)
    {
      continue;
    }

    break;
  }

  printf("입력하신 값은 %d입니다. \n", iNum);

  return 0;
}

 

예제 소스를 보면 continue가 실행되면

그 밑에 명령은 실행하지 않고 바로 반복문 맨 위로 간다.

break를 만나면 그 밑에 명령도 실행하지 않고

반복문을 빠져나간다.

for ( ; ; )
{
  if( )
  {
    break;
    ++iNum;  //  절대 실행되지 못 할 코드
  }
  if( )
  {
    continue;
    ++iNum;  //  절대 실행되지 못 할 코드
  }
}

 

---------------

switch

---------------

 

- if문과 유사하다

switch ( 정수형 변수 )

{

case 상수형 정수:

break;

case 상수형 정수:

break;

default:

break;

}

사용법은 위와 같다. 참고로 default에는 break;를 안 넣어 줘도 되지만

왠만하면 보기 좋게? 넣으면 좋겠다.

ex) 예제 소스

#include <stdio.h>

int main()
{
  int iNum;

  printf("숫자를 입력하세요 : ");
  scanf("%d"&iNum);

  switch(iNum)
  {
    case 1:
      printf("1을 입력하셨습니다. \n");
      break;
    case 2:
      printf("2를 입력하셨습니다. \n");
      break;
    case 3:
      printf("3을 입력하셨습니다. \n");
      break;
    case 4:
      printf("4를 입력하셨습니다. \n");
      break;
    case 5:
      printf("5를 입력하셨습니다. \n");
      break;
    default:
      printf("왜 %d를.... \n", iNum);
      break;
  }

  return 0;
}

 

if문과 비슷하다.

허나 다른점이 있는데 아래 소스를 보자.

 

#include <stdio.h>

int main()
{
  int iNum = 0;  //초기화를 꼭 해줘야 합니다.

  printf("문자를 입력하세요 : ");
  scanf("%c"&iNum);

  switch(iNum)
  {
    case 'A':
    case 'a':
      printf("A?!! \n");
      break;
    case 'B':
    case 'b':
      printf("B?!! \n");
      break;
    case 'C':
    case 'c':
      printf("C?!! \n");
      break;
    case 'D':
    case 'd':
    case 'E':
    case 'e':
    case 'F':
    case 'f':
      printf("DEF중에 하나 \n");
      break;
    default:
      printf("잘했어요! \n");
      break;
  }

  return 0;
}

 

위에서 보면 A를 입력시 그냥 case 'a'로 넘어가서

A, a 중 아무거나 입력하면 같은 결과가 나온다!!

 

또 이건 여담으로 int iNum0으로 초기화 해주지 않으면

scanf("%c", &iNum); 에서 쓰래기값과 함께 겹쳐버린다는 것!!

예를 들어 iNum에 처음 쓰래기값으로 20122359라는 정보가 저장 되어있었다면

scanf("%c", &iNum); 로 문자하나 크기 (1byte) 만 입력 받기 때문에 A (65) 입력시

20122365 로 나오기 때문에 초기화를 잊지 말아야 한다.

 

 

- if 문과 switch 문 비교

#include <stdio.h>

int main()
{
  int iScore;

  printf("점수를 0~100 중 입력하세요\n : ");
  scanf("%d"&iScore);

  switch(iScore/10)
  {
    case 10:
    case 9:
      printf("점수 : A \n");
      break;
    case 8:
      printf("점수 : B \n");
      break;
    case 7:
      printf("점수 : C \n");
      break;
    case 6:
      printf("점수 : D \n");
      break;
    default:
      printf("점수 : F \n");
      break;
    
  }
/*
  if(90 <= iScore)
  {
    printf("점수 : A \n");
  }
  else if(80 <= iScore)
  {
    printf("점수 : B \n");
  }
  else if(70 <= iScore)
  {
    printf("점수 : C \n");
  }
  else if(60 <= iScore)
  {
    printf("점수 : D \n");
  }
  else
  {
    printf("점수 : F \n");
  }
*/

  
  return 0;
}

같은 결과가 나온다

어떤 구간에 대한 ( 3 < x < 100 ) 것은 if 문이 좋고

정확한 몇개의 값에 대한 ( 3, 4, 5, 6 )  것은 switch 문이 유리하다.

 

 

------------

debug

------------

컴파일에서 잡지 못하는 오류를 잡을때 쓴다.

 

 break point를 걸면 건 곳에서 프로그램이 멈춘다.

 그리고 디버깅을 시작.

 한 줄씩 실행이 가능하고 프로시저 단위로도 실행 가능하다.

 보시다 시피 변수의 값이 변하는 것을 추척할 수 있다.

그리고 조사식1이 선택되어 있는데 지역을 보는 것을 추천한다.

조사식은 내가 보고 싶은 것만 추척하여 볼 수 있다.

 

 

 

 

 

설정

트랙백

댓글

20140314 (for, if, 삼항연산자)

20일차

 

---------------

for 문

---------------

- 반복문이다.

for ( 초기식 ; 조건 ; 반복식 )

{

명령

}

이런 형태이고 재미있는 것은 초기식과 반복식에

다중으로, 생략으로 선언이 가능하다.

ex) 예제 소스

#include <stdio.h>

int main()
{
  int iNum1;
  int iNum2;
  int iNum3;

//  - 5  명령이 한 줄일 경우 중괄호 생략 가능
  for(iNum1 = 0, iNum2 = 0 ; 5 > iNum1 ; iNum1 = iNum1 + 1, iNum2 = iNum2 + 2)
    printf("iNum1 = %d\tiNum2 = %d \n", iNum1, iNum2);

//  - 4
  iNum1 = 0;
  iNum2 = 0;

  while5 > iNum1 )
  {
    printf("iNum1 = %d\tiNum2 = %d \n", iNum1, iNum2);
    iNum1 = iNum1 + 1;
    iNum2 = iNum2 + 2;
  }


//  - 3
  iNum1 = 0;
  iNum2 = 0;

  for( ; 5 > iNum1 ; )
  {
    printf("iNum1 = %d\tiNum2 = %d \n", iNum1, iNum2);
    iNum1 = iNum1 + 1;
    iNum2 = iNum2 + 2;
  }

//  - 2
  iNum2 = 0;

  for(iNum1 = 0 ; 5 > iNum1 ; iNum1 = iNum1 + 1)
  {
    printf("iNum1 = %d\tiNum2 = %d \n", iNum1, iNum2);
    iNum2 = iNum2 + 2;
  }

//  - 1
  for(iNum1 = 0, iNum2 = 0 ; 5 > iNum1 ; iNum1 = iNum1 + 1, iNum2 = iNum2 + 2)
  {
    printf("iNum1 = %d\tiNum2 = %d \n", iNum1, iNum2);
  }

  return 0;
}

 

1, 2, 3, 4, 5번은 다 같은 식이다.

int main()
{
  unsigned int uiCnt = 0;

//  while(1)
  for( ; ; ) // 조건을 생략하면 무한루프가 된다
  {
    printf("%u \n", uiCnt);  // %u = unsigned int
    ++uiCnt;
  }

  return 0;
}

또 while문과 같이 프로그래머의 의도하에 위와 같이 무한루프도 가능하다.

 

 

--------------------

if문 (흐름의 분기)

--------------------

- 흐름을 분기하는 제어문

if ( 조건 )

{  A  }

이런 형태이고 조건이 참이면 괄호의 A를 실행하고

거짓이면 그냥 넘어간다.

그리고 밑에 한 명령만 할 경우 괄호를 생략 가능한데

가독성에 도움을 주기 위해 왠만하면 붙여주자.

ex)예제 소스

#include <stdio.h>

int main()
{
  int iOpt;
  double dNum1;
  double dNum2;

  printf("1.덧셈 2.뺄셈 3.곱셈 4.나눗셈 \n");
  printf(" : ");
  scanf("%d"&iOpt);

  printf("연산하실 두 숫자 입력 \n : ");
  scanf("%lf %lf"&dNum1, &dNum2);

  if(1 == iOpt)
    printf("%.3lf + %.3lf = %.3lf \n", dNum1, dNum2, dNum1 + dNum2);
  if(2 == iOpt)
    printf("%.3lf + %.3lf = %.3lf \n", dNum1, dNum2, dNum1 - dNum2);
  if(3 == iOpt)
    printf("%.3lf + %.3lf = %.3lf \n", dNum1, dNum2, dNum1 * dNum2);
  if(4 == iOpt)
    printf("%.3lf + %.3lf = %.3lf \n", dNum1, dNum2, dNum1 / dNum2);

  return 0;
}

 

- if ( 조건)

{  A  }

else

{  B  }

이것은 앞서 배웠던 if문에 else가 붙었는데

조건이 참일 경우 A ,

조건이 거짓일 경우 B 를 실행한다.

ex) 예제 소스

#include <stdio.h>

int main()
{
  int iNum;

  printf("숫자를 입력하세요 : ");
  scanf("%d"&iNum);

  if(0 < iNum)
  {
    printf("%d 는 0보다 큽니다 \n", iNum);
  }
  else
  {
    printf("%d 는 0보다 작습니다 \n", iNum);
  }

  return 0;
}

 

- if ( 조건 )

{  A  }

else if ( 조건 )

{  B  }

else

{  C  }

이건 조건이 여러개일 경우 위와 같이 갔다 붙이면 된다.

ex) 예제 소스

#include <stdio.h>

int main()
{
  int iOpt;
  double dNum1;
  double dNum2;

  printf("1.덧셈 2.뺄셈 3.곱셈 4.나눗셈 \n : ");
  scanf("%d"&iOpt);

  printf("두 개의 실수 입력 : ");
  scanf("%lf %lf"&dNum1, &dNum2);

  if(1 == iOpt)
  {
    printf("%.3lf + %.3lf = %.3lf \n", dNum1, dNum2, dNum1 + dNum2);
  }
  else if(2 == iOpt)
  {
    printf("%.3lf - %.3lf = %.3lf \n", dNum1, dNum2, dNum1 - dNum2);
  }
  else if(3 == iOpt)
  {
    printf("%.3lf * %.3lf = %.3lf \n", dNum1, dNum2, dNum1 * dNum2);
  }
  else if(4 == iOpt)
  {
    printf("%.3lf / %.3lf = %.3lf \n", dNum1, dNum2, dNum1 / dNum2);
  }
  else
  {
    printf("Error!! \n");
  }

  return 0;
}

이것 같은 경우 처음 if문 예제소스와 같은 기능인데

처음 if문의 경우 일일이 if문 조건을 만날 때마다 다 확인하고

넘어가지만

else if문의 경우 참인 조건을 만나면 명령을 실행하고

한 방에 다 빠져나가버린다

그러니 if문을 여러개 쓰는 것 보다 효율이 좋다.

또한 조건을 넣을 때 가능하면 확률이 가장 높은 순서대로

위에서부터 나열해 오면 더 높은 효율을 볼 것이다.

 

 

--------------

삼항연산자

--------------

- 조건 ? A : B

if문과 똑같은 역할을 한다.

참이면 A

뻥이면 B

그냥 예제를 보자

ex) 예제 소스

#include <stdio.h>

int main()
{
  int iNum;

  printf("숫자를 입력하세요 \n :");
  scanf("%d"&iNum);
  
/*
// if문을 쓴 경우

  printf("입력하신 숫자는 100보다 ");

  if(100 < iNum)
  {
    printf("큼");
  }
  else
  {
    printf("작습");
  }

  printf("니다. \n");
*/


// 삼항 연산자를 쓴 경우

  printf("입력하신 숫자는 100보다 %s니다 \n"100 < iNum ? "큼" : "작습" );

  return 0;
}

if 문과 삼항연산자의 속도는 똑같다

다만 그 안에 들어가는 명령어에 따라

삼항연산자가 훨씬 좋은 효율을 낼 경우가 있다.

자주는 쓰지 말되 위와 같은 상황에만 쓸 것.....

 

 

 

 

 

 

 

 

설정

트랙백

댓글

20140313 (while, do while, 중첩 while)

19일차

 

-----------------

제     어     문

(반     복     문)

-----------------

 

-------

while

-------

반복시키는 제어문이다.

while(조건) //조건이 참일 경우 아래 중괄호 실행, 거짓이면 탈출.

{

(명령문)

}

ex) 예제 소스코드

#include <stdio.h>

int main()
{
  int iNum = 0;

  while(5 > iNum)                   // 처음에 iNum이 0이므로 조건이 참이다
  {
    printf("Hello World! \n");
    ++iNum;                             // iNum을 증가시켜 1이 되고 다시 조건으로 올라가고
  }                                        // 조건이 거짓이 될 때까지 반복한다.

  return 0;
}

결과 화면

 

- 순서도

- while 문 조건은 참, 거짓으로 판별하기 때문에

참이면 1을, 거짓이면 0을 나타내므로

0을 제외한 나머지 값은 다 참으로 인식한다.

while1 )  // 조건이 계속 참이므로 무한 반복.
{
// 명령
}

while( -1 ) // 이것도 조건이 0이 아니니 참이므로 무한 반복
{
// 명령
}

while0 ) // 조건이 0이므로 거짓이므로
{             //  괄호 안에 명령은 절대로 실행되지 않는다.
// 명령(세계 정복)
}


------------

do while문

------------

while문과 똑같지만 하나가 다르다

while문은 조건을 검사하고 괄호 내용을 실행하지만

do while문은 우선 괄호 안을 먼저 실행하고 조건 확인 후

계속 실행할지 여부를 판단한다.

 

do

{

명령

} while(조건);

 

한가지 빼먹지 말아야 하는 것은 while(조건) 뒤에 꼭 " ; "을 붙여줘야 된다.

ex) 예제 소스 코드

#include <stdio.h>

int main()
{
  int iNum;
  int iTotal;

  iTotal = 0;
  iNum = 0;

  do
  {
    iNum = iNum + 2;
    iTotal = iTotal + iNum;
  } while(100 > iNum);

  printf("%d \n", iTotal);

  return 0;
}

결과 화면

  2550 

 

또 생각해야 할 것이 while문과 다르게 먼저 실행을 한 번하고 나서 반복하니

조건을 기입할 때 한 번 실행했다는 것을 생각하고 조건을 대입해야 한다.

 

-----------

중첩 while

-----------

while 문을 중첩 시킨 것인데 음....

그냥 밑에 예제를 보자.

#include <stdio.h>

int main()
{
  int iCnt1;
  int iCnt2;

  iCnt1 = 0;

  while(5 > iCnt1)
  {
    iCnt2 = iCnt1;

    while(0 < iCnt2)
    {
      printf("O");
      --iCnt2;
    }

    printf("* \n");
    ++iCnt1;
  }

  return 0;
}

출력 화면

필요에 따라 몇 번이고 중첩 시키면 되는데

중첩을 시키면 시킬수록 헷갈리게 되니 생각을 잘해서 쓰는게 좋겠다.

 

 

 

 

오늘 배운 마지막은 순서도인데 아까 위에서 보았던 그것이다.

나중에 쓸 일이 생길거라고 꼭 알아두시라고 알려주셨다

순서도를 소스코드로 만들 줄 알아야 하고

소스코드도 순서도로 만들 줄 알아야 한다.

작성하기 쉬운 프로그램으로는 엑셀과 파워포인트이고

여기서 작성한 도형들?을 복사해서 그림판에 그대로 붙여 넣을 수 있다.

예제)

 

 

 

 

 

 

 

 

 

 

설정

트랙백

댓글