IT 과학/C언어

C언어 | 제어 구조

곰뚱 2019. 12. 17.

 

 

 

1. 제어 구조와 구조화된 프로그래밍

(1) 제어 구조란

이제까지 공부한 대부분의 프로그램은 프로그램의 문장들의 실행 순서가 문장들의 순서와 그대로 일치하였다. 즉, 특정 문장이 실행되다가 임의의 위치에 있는 문장으로 실행 순서가 바뀌는 흐름의 분기와 되돌아오는 반복 수행 없이 프로그램의 위에 위치한 문장에서 아래에 위치한 문장으로 차례로 실행되는 순차적인 실행이 중심이었다. 그러나 약간 복잡한 프로그램은 프로그램의 흐름(문장들의 실행 순서)을 제어하는 조건 판단과 반복이라고 하는 제어 구조가 필요하게 된다. 이와 같은 문장들의 실행 순서를 조절하는 문장을 제어문 (control statement)이라고 하며 if 문, while 문, for 문 등이 있다.

 

(2) 구조화된 프로그래밍

아마 사용해본 경험이 거의 없을 BASIC이나 FORTRAN에서는 GOTO문이 자주 사용된다. GOTO문에 의해 제어의 흐름(실행 순서)이 여러 곳으로 나뉘어지면, 즉 프로그램이 여러 라인으로 분기하면 프로그램의 흐름은 대단히 복잡해진다. 구조화된 프로그래밍의 개념에서는 GOTO문을 배제하고 아래에 제시하는 기본 제어 구조만을 사용하여 프로그램을 작성하도록 한다. 그렇게 되면, 신뢰성이 높고 유지보수가 용이한 프로그램을 작성할 수 있게 된다. C는 구조화된 프로그램을 작성하는데 필요한 6개의 제어 구조를 제공한다.

 

  연속 (sequence)

  선택 (if else)

  선행 조건 판단 반복 (while)

  후행 조건 판단 반복 (do while)

  다방향 분기 (switch case)

  지정 횟수 반복 (for)

728x90

 

 

2. 조건 판단

(1)  if-else 문

일반적으로 if-else 문의 형식은 다음과 같다.

 

       if (조건식)
                문장1;  /* 또는 { 문장1.1; 문장1.2; ...; 문장1.n } */
        else
                문장2;  /* 또는 { 문장2.1; 문장2.2; ...; 문장2.n } */

 

if-else 문에서는 ( )안의 조건식을 판단하여 식의 계산 결과가 참이면 문장 1, 거짓이면 문장2를 각각 선택하여 실행한다. 또, else 절에 위치시킬 문이 없으면 else 절은 생략해도 된다.

 

if문의 사용 예는 다음과 같다. 어떤 의미인가 각자 생각해 보자.

 

        예)     if (age < 0)
                        printf("Error\");       /* simple statement */

                if (age > 60) { /* compound statement */
                        printf("He is too old");
                        printf("and hard to get a job.\n");
                }

 

예제 1. 입력한 정수값이 0 이상이면 plus, 그렇지 않으면 minus라고 출력하라.

 

● 프로그램

#include <stdio.h>

main()
{
        int a;
        printf("정수를 입력하세요!\n");
        scanf("%d", &a);
        if (a >= 0)
            printf("plus\n");
        else
            printf("minus\n");
}

 

● 결과
정수를 입력하세요!
56
plus

 

예제 2: 입력된 line의 수를 세는 program

#include <stdio.h>

main()
{
        int ch;
        int linecount = 0;

        while ( (ch = getchar()) != EOF )
                if (ch == '\n') linecount++;
        printf("I counted %d lines.\n", linecount);

}

 

이 프로그램은 키보드 입력을 처리하기위해서 EOF 문자를 나타낼 수 있는 키가 있어 야 합니다. EOF라고 일일이 E자, O자, F자를 쳐도안되고 -1이라고 쳐도 안됩니다(-1은 EOF 문자의 ASCII 코드값과 같지만 EOF 문자 자체는 아닙니다). 자신이 사용하는 시스템의 컴파일러가 EOF을 어떤 문자로 사용하고 있는지 알아보아야 합니다. 예를 들어 대부분의 UNIX나 LINUX의 C 컴파일러는 [control]-d를 EOF 문자로 받아들입니다. Turbo C를 포함한 대부분의 PC 용 컴파일러는 [control]-z 혹은 [control]-c를 EOF 문자로 사용합니다. 하지만 Visual C++에서는 정상적으로 실행되지 않을 것입니다.

 

응용문제 1: 위 프로그램을 입력된 line 의 수 및 문자 수를 세는 program으로 수정하라.


예제 3: 간단한 암호화 program

#include <stdio.h>

main()
{
        int ch;

        while ( (ch = getchar()) != EOF ) {
                if (ch == '\n') putchar(ch);
                else putchar(ch+1);
        }
}


확인문제 1

/* 공백 문자는 그대로 출력하고, 비 공백 문자는 하나 더 큰 문자로 출력 */

#include <stdio.h>
main( )
{
     char ch;

     while( (ch = getchar() ) != EOF) /* EOF가 나올 때 까지 문자를 읽음 */
     {
        if( ch == '\n' || ch == '\t' || ch == ' ')
            putchar( ch );         /* 공백문자인 경우 그대로 출력 */
        else
            putchar( ch + 1 );     /* 비 공백 문자는 하나 더 큰 문자 출력 */
     }
}


(2) 복잡한 조건 판단식

예를 들어, 변수 a가 0 과 100 사이에 들어가는가를 판단하는 조건식을

 

         0 <= a <= 100

 

라고 기술하면 안되고 다음과 같이 작성해야 한다. 즉, &&는 연산자 AND에 해당한다.

 

        0 <= a && a <= 100

 

문자 변수 c의 내용이 알파벳인지를 판단하는 조건식은 다음과 같다. 즉, ||는 연산자 OR에 해당한다.

 

         ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')

 

(3) if 문의 중첩

흔히 사용되지는 않지만 if 문 안에 if 문이 중첩되는 경우가 있다.

 

          if (a == b){             /* ① */
             if (b == c)                  /* ②  */
                 printf("a = b = c");
          }
          else
             printf("a != b");

 

위의 예문은 a==b 인지를  ①의 if-else 문으로 판단하고, 또 a==b일 때는  ②의 if 문으로 b==c인가를 판단한다.

 

※ if-else는 중첩될 수 있으며, 이 때 else는 가장 가까운 if와 match된다.

 

(4) 참 (yes)과 거짓 (no)의 값

C를 처음 공부하는 사람들은 a가 0인가를 판단하는데는

 

         if (a == 0)

 

로 해야 하는 경우에

 

         if (a = 0)

 

로 사용하는 경우가 있다. 후자의 경우 a=0은 대입식이므로 값은 항상 0이고, 조건식으로 잘못된 것이다. 그러나 C 컴파일러는 후자와 같은 식도 정상적으로 컴파일한다. 그 결과 C에서는 이 식도 값을 가지며 이 식의 값이 0이면 거짓이고, 0이외의 값을 가지면 참으로 처리된다. 따라서 a=0은 0이라는 값을 가지게 되고 이것이 거짓으로 처리되기 때문에 문법적으로는 타당한 것이다. 그러나 a==0과 같은 조건식은 조건을 만족하는 경우 참(1), 조건을 만족하지 못하는 경우 거짓(0)이라는 값을 가진다.

 

예제 4: 관계-논리 연산 결과의 true, false값

#include <stdio.h>

main()
{
        int true, false;

        true = (5 > 0); /*조건식의 결과가 참이므로 true에는 1이 지정된다.*/
        false = (5 == 3); /*조건식의 결과가 거짓이므로 false에는 0이 지정된다.*/
        printf("true = %d, false = %d\n", true, false);

        if (1) printf("1 means true.\n");
        if (0) printf("0 means true.\n"); /*조건식의 결과가 0(거짓)이므로
                                                     아무 것도 출력되지 않는다.*/
        if (25) printf("25 is true.\n");
        if (-7) printf("-7 is true.\n");
}

 

● 결과

true = 1, false = 0

1 means true.

25 is true

-7 is true

 

※ 0 이외의 모든 값은 true로 간주한다.

        if (i != 0)     <----->      if (i)
                .....                   .....

        if (i == 0)    <----- >    if (!i)
                .....                   .....

        if (i = 10)     /* 주의 */
                .....

 

확인문제 2

/* C 언어에서의 참(true)과 거짓(false)의 확인 */

 

#include <stdio.h>
main( )
{
      int a = 123, *p;
      p = &a;

      if( 0 )       printf("%d is true\n", 0);
        else        printf("%d is false\n", 0);
      if( 0.0 )     printf("%.1f is true\n", 0.0);
        else        printf("%.1f is false\n", 0.0);
      if( 1 )       printf("%d is true\n", 1);
        else        printf("%d is false\n", 1);
      if( -1 )      printf("%d is true\n", -1);
        else        printf("%d is false\n", -1);
      if( p )       printf("%u is true\n", p);
        else        printf("%u is false\n", p);
      if( '\0')     printf("%c is true\n", '\0');
        else        printf("%c is false\n", '\0');
      if( 'A')     printf("%c is true\n", 'A');
        else        printf("%c is false\n", 'A');
      p = NULL;
      if( p )       printf("%u is true\n", p);
        else        printf("%u is false\n", p);
      if( 0.00002 ) printf("%.4f is true\n", 0.00002);
        else        printf("%.4f is false\n", 0.00002);
      if( 0.1e-12 ) printf("%e is true\n", 0.1e-12);
        else        printf("%e is false\n", 0.1e-12);
}

 

 

 

3. 반복

(1) while문

while 문의 형식은 다음과 같다.                        
                                                                
                                                                            
       while (식) {                                           
            문  /* 또는 { 문장1; 문장2; ...; 문장n } */
      }

 

while문에서는 먼저 ( ) 속의 식이 평가되고, 그것이 참이면 { }로 싸여진 문을 실행하며 다시 식을 평가하여 같은 과정을 반복한다. 즉 ( ) 안의 식이 참인 동안에는 { }안의 문을 한다. 식이 거짓이면 while문에서 빠져 나온다.

 

다음 프로그램은 sum으로 합계를 구해 가고, sum 이 100을 넘을 때까지 { }안을 반복한다.

 

      sum = 0
      while (sum<100)) {
             
      }

        int i = 0;                                   |       int i = 0;
                                                      |
        while (i < 5)   /* 무한 loop */        |       while (i++ < 5)
                printf("Good morning\n");   |               printf("Good morning\n");
        int i = 0, sum = 0;                      |       int i = 0, sum = 0;
                                                      |
        while (i++ < 10) sum += i;           |       while (i < 10) {
        printf("sum = %d\n", sum);          |               i++;
                                                      |               sum += i;
                                                      |       }
                                                      |       printf("sum = %d\n", sum);

 

확인문제 3

/* while 문을 사용한 문자 출력 프로그램의 예 */

 

#include <stdio.h>
main( )
{
      char ch;

      printf("Type a message and Enter Key: ");
      while((ch = getchar( )) != '\n')
          putchar(ch);
      printf("\nPROGRAM SUCCESS\n");
}

 

확인문제 4

/* 데이타의 선두의 공백 문자와 숫자를 제외한 문자의 수를 세는 프로그램 */

#include <stdio.h>
main( )
{
      int ch, count = 0;

      printf("Type in a phrase: ");
      while(scanf("%d", &ch) == 1)
      ;
      while((ch = getchar( )) != '\n')
      {
          putchar(ch);
          count++;
      }
      putchar('\n');
      printf("Number of inputed characters: %d\n", count);
}

 

scanf() 함수는 정상적인 데이터 입력을 실행할 경우 정상적으로 입력된 데이터의 항목의 수를 정수 값으로 반환하기 때문에 만약 위의 while 문에서 입력한 데이터의 선두에 공백 문자나 숫자가 입력되면 정수형이므로 정상적인 입력이 되어 그 반환값은 1이 되고, 루프의 몸체를 실행하지만 몸체가 공백문이므로 다시 while문의 조건식인 scanf()를 실행합니다. 즉, 비정상적인 입력(문자의 입력)이 발생했을 때까지 while 문은 계속됩니다. 공백 문자나 숫자가 아닌 문자가 입력되면 비정상적인 입력이므로 while문은 종료되고 두번째 while문이 실행되어 문자를 읽어 들입니다.

 

확인문제 5

/* 입력된 문자로 부터 문자, 단어, 줄 수를 세는 예제 프로그램 */

#include <stdio.h>
#define TRUE 1
#define FALSE  0
main( )
{
       char ch;
       int line_cnt=1, word_cnt=0, word_flag;
       long char_cnt = 0L;

       word_flag = FALSE;
       printf("Type a some of string:\n");
       while( (ch = getchar() ) != EOF )
       {
           /* 공백 문자를 제외한 문자의 수를 세는 부분 */
           if( ch != ' ' && ch != '\n' && ch != '\t') char_cnt++;
           if( ch == '\n' ) line_cnt++; /* 줄 수를 세는 부분 */
           /* 단어를 세는 부분 */
           if( ch != ' ' && ch != '\n' && ch != '\t'&& word_flag == FALSE )
           {
                word_flag = TRUE;
                word_cnt++;
           }
           if( (ch==' ' || ch == '\n' || ch == '\t' ) && word_flag == TRUE )
                 word_flag = FALSE;
       }
       printf("charaters = %ld, words = %d, lines = %d\n",
               char_cnt, word_cnt, line_cnt);
}

 

long char_cnt = 0L;

터보 씨를 예로 들어 설명합니다. int형 범위에 포함되는 작은 크기의 정수를 long형으로 저장해야 하는 경우도 있습니다. 예를 들면, 컴파일러에서 제공하는 파일 입/출력 함수나 그 외의 어떤 함수는 전달 인수로 반드시 long형을 요구하기도 합니다. 따라서 이와 같은 경우는 int형에 충분히 저장될 수 있는 작은 정수형 상수라 할지라도 long형으로 저장해야 합니다.

 

컴파일러가 자동적으로 int형으로 저장할 -32786에서 32767 범위에 포함되는 상수 값을 long형으로 저장하고자 한다면 프로그램에서 명시적으로 현재 사용하는 상수가 long형이라는 것을 표시해야 하는데, 이를 위해 상수의 마지막 끝에 영문자 l 또는 L을 붙이면 됩니다. 일반적으로 영문자 l은 숫자 1과 혼동할 우려가 있으므로 영문자 L을 사용하는 것이 바람직합니다.

 

참고:  /* 공백 문자를 제외한 문자의 수를 세는 부분 */

while문은 키보드로부터 EOF가 입력될 때까지 getchr()를 이용하여 문자를 읽어 들입니다.

while( (ch = getchar()) != EOF )

변수 ch에 읽어 들인 문자가 화면에 출력되지 않는 공백 문자인지 확인하여 공백 문자가 아니라면 char_cnt를 1 증가시킵니다.

/*공백 문자를 제외한 문자의 수를 세는 부분 */

if (ch != ' ' && ch != '\n' && ch != '\t') char_cnt++;

키보드로부터 Enter 키('\n')가 입력되면 줄바꿈이 발생하고 이는 새로운 줄로 이동합니다. 따라서 줄 수를 세기 위해서 다음의 if 문이 필요합니다.

if (ch == '\n') line_cnt++; /*줄 수를 세는 부분 */

 

입력된 문자에 공백 문자가 존재하면 이는 하나의 단어가 됩니다. 즉, 단어와 단어는 공백 문자를 이용하여 구분하는데, 만약 최초의 공백 문자가 아닌 문자가 입력되고 word_cnt가 FALSE이면 word_cnt를 1 증가시키고 나서 다음 공백 문자가 나올 때까지 연속된 문자를 한 단어로 취급하도록 word_flag를 TRUE로 설정하여 변수 erd_cnt가 증가하지 않도록 합니다.

if(ch != ' ' && ch != '\n' && ch != '\t' && word_flag == FALSE)
{
word_flag = TRUE;
word_cnt++;
}

 

즉, 위의 if문은 입력된 문자가 공백 문자가 아니고 아직 단어 수를 세는 동작을 하지 않았다면, 세는 동작을 시작하고 wod_cnt를 1 증가시킨다는 것입니다. 단어 세는 동작이 다음 공백 문자가 입력될 때까지 실행되지 않도록 이제 word_flag를 TRUE로 설정합니다.

 

공백 문자가 포함되지 않는 문자들이 연속적으로 입력되다가 공백 문자가 입력되면 다음 단어가 시작됩니다. 단어가 시작되면 다시 word_cnt를 1만큼 증가시켜야 하는데, 앞에서 word_cnt를 증가시키지 않도록 word_flag를 TRUE로 설정해 놓았기 때문에 이를 해제하기 위해서 먼저 word_flag를 FALSE로 설정해서 word_cnt를 증가시킬 수 있도록 합니다.

if (ch != ' ' || ch == '\n' || ch == '\t') && word_flag == TRUE)
word_flag = FALSE;

따라서 위의 if문은 변수 ch에 저장된 문자가 공백 문자이면서 word_flag가 TRUE이면 다음 단어를 셀 수 있도록 word_flag를 FALSE로 설정합니다.

 

(2) 데이터의 종결과 EOF

데이터를 입력해서 실행하는 경우, 입력되는 데이터 개수를 미리 알고 있으면 뒤에서 설명하는 for문을 사용하면 된다. 그러나 일반적으로 데이터 개수를 모르는 경우가 많다. 이러한 경우에는 데이터의 끝을 표시하고 그것을 종료 조건으로 한다. 이러한 경우 반복 루프로 while문이 사용된다. 일반적인 방법은 ^Z 의 입력이나 어떤 결정값을 판정 조건으로 사용하는 것이다.

 

scanf( ), getchar( ) 등의 입력 함수는 ^Z(CTRL+Z)가 입력되면 -1이라는 값이 리턴되도록 작성되어 있다. 또 일반적으로 파일의 종료(데이터의 종료)를 표시하는 기호로서 EOF(End Of File)가 사용되며 stdio.h 내에서 다음과 같이 -1로 정의되어 있다.

 

     # define EOF -1

 

따라서 stdio.h를 include로 해 두면 EOF 라는 기호를 사용하여 파일(데이터)의 종결을 감지하게 된다.

 

한 문자를 입력해서 출력하는 것을 반복하는 프로그램을 작성하는 경우, 데이터의 종결로 ^Z을 사용하는 방법과 슬래시(/)와 같은 어떤 결정된 문자를 사용하는 예는 다음과 같다.

 

      while((c=getchar( )) ! =EOF /*^z 는 종결 조건 */
           putchar(c);

      while((c=getchar( )) ! ='/') /* '/' 는 종결 조건 */
       putchar(c) ;

 

위의 예에서 ((c=getchar( )) ! =EOF)라는 조건식은, C의 특징으로 이런 식을 사용할 수 있는 함수는 getchar( )이고 c=getchar( )는 대입식으로 값을 가지고 있다. 만약 이와 같이 C 특유의 표현 방법을 사용하지 않으면 위의 프로그램은 다음과 같이 작성된다.

 

      c=getchar( );
      while(c ! =EOF){
           putchar(c);
           c=getchar( );
      }

 

즉 while 문에 들어가기 전에 한번 getchar( )를 실행하고 while문 안에서도 getchar( )을 실행해야 한다. 이것을 2중 중복이라고 한다. 특히 초보자들이 실수하기 쉬운 것은

 

 while(c=getchar( ) != EOF)

 

라고 하는 것이다. 이 표시는 =와 !=의 연산자의 우선 순위는 !=의 쪽이 높기 때문에 getchar()!=EOF 가 먼저 실행되고 그 결과가 c에 대입되기 때문에 조건식은 생각한 의도와 전혀 달라지게 된다.

 

예제 5. 정수 데이터를 입력하여 합과 평균을 계산하여 표시하여라. 데이터의 종료 기호는 ^Z로 하여라. (Visual C++에서는 정상적으로 실행되지 않는다)

● 프로그램

#include <stdio.h>
main(  )
{
     int dat, sum, n, Ave;
     sum = n = Ave = 0;
     while (scanf("%d", &dat) != EOF) {
             sum= sum + dat;
             n = n + 1;
     }
     Ave = sum / n;
     printf("Tot = %d\n", sum);
     printf("Ave = %d\n", Ave);
}

 

● 결과

1
2
3
4
5
^Z                 입력 종결 기호
Tot = 15
Ave = 3

 

나눗셈 연산에 사용되는 두 피연산자가 모두 정수형이라면, 그 결과값은 정수입니다. 즉, 나머지 값을 반올림하는 것이 아니라 잘라버리고 정수값을 취한다는 것입니다. 두 개의 피연산자가 모두 부동형 수인 경우와 하나는 정수형이고 다른 하나는 부동형 수(실수)인 경우는 그 결과값은 항상 double 형입니다. 따라서 몫과 나머지를 결과값으로 산 출하게 되는데, 이 때 만약 결과값을 정수형 변수에 저장한다면, 소수점 이하의값(나머지 값)은 저장되지 않고 잘려지게 되므로, 소수 부분까지 모두가 필요한 연산이라면 반드시 부동형 변수에 저장해야 합니다.

 

(3) scanf( )에서 기존 값을 종결 조건으로 사용하는 방법

 scanf("%d", &a); 의 리턴값은 키보드에서 scanf( )의 인수로 입력된 데이터의 개수이고 입력된 데이터의 값은 아니다. 즉, 키보드에서 50을 입력할 때 변수 a에는 50이 대입되지만, scanf(  )의 값은 입력 데이터 개수인 1이다. 따라서 scanf( )로 데이터를 입력하고 있고 어떤 값(예로 -9999)을 데이터의 종결 조건으로 하려는 데는 단순히 scanf("%d",&a)!=-9999라고 해서는 안 된다. 따라서 C에서는 이와 같은 때에 다음 예와 같이 콤마 연산자를 사용하면 된다.

 

      while (scanf("%d",&a), a ! =-9999) {
            
      }

 

먼저 scanf("%d", &a)에 의하여 a 에는 데이터가 입력되고 입력된 값은 while 문의 조건식으로 된다. 콤마 연산자로 구별된 식들은 제일 나중의 식이 전체식을 대표하게 된다.

 

예제 6. 정수 데이터를 입력하여 그 중에서 최대, 최소를 구하여라.

● 연구

최대값의 변수를 max, 최소값의 변수를 min으로 하고, 첫 번째 입력된 데이터가 최대값인 동시에 최소값이라 하고, 이후의 입력된 데이터가 max보다 크면 max로 그 값을 위치시키고 입력된 데이터가 min보다 작으면 min으로 위치시키는 과정을 계속하면 된다. (Visual C++에서는 정상적으로 실행되지 않는다)

 

● 프로그램

#include <stdio.h>
main( )
{
   int dat, max, min;
   scanf("%d", &dat);
   max = min = dat;
   while (scanf("%d", &dat) != EOF) {
           if (dat > max)
           max = dat;
           if (dat < min)
           min = dat;
   }
   printf("max = %d\n", max);
   printf("min = %d\n", min);
}

 

● 결과

5
66
35
89
25
^Z
max = 89
min = 5

 

(4) for문

for문의 전형적인 사용 방법은 반복의 횟수를 미리 결정하는 것이지만, 그 밖에도 상당히 융통성있는 표현이 가능하다.

 

for 문의 형식은 다음과 같다.

 

        for (초기화; 수식; 변경부)
                문장;           /* 또는 { 문장1; 문장2; ...; 문장n } */

 

초기화는 for 루프가 시작될 때 한 번 실행되는 초기화 과정이고, 수식은 while문의 수식과 동일한 것으로 계속 반복할 것인지를 검사한다. 또한 변경부는 for 루프의 몸체를 실행한 후에 실행해 주는 문장이다. 이들 각각은 세미콜론으로 구분한다.

 

for문을 while문으로 변환하려면

 

      식1;
      while(식2){
           문
           식3;
       }

 

로 표시할 수 있다.

 

for 문의 전형적인 사용 방법은 다음 예와 같다.

 

      for(i=0; i<=10; i++){
            
      }

 

이 예문은 i를 0에서 시작하여 i값을 +1씩 증가시키고 i가 10이 될 때까지 반복한다는 것이다.

 

for 문에서 사용되고 있는 변수는 일반적인 것과 같지만 제어 변수라고 부른다. 이 제어 변수의 값은 for 문이 제어하고 있기 때문에 for 루프 내에서 사용자가 그 값을 임의대로 바꾸어서는 안 된다. 제어 변수는 int 형 이외에도 다른 기본형 (char 형, double 형 등)이 사용된다. 또 변화시키는 값도 +1만이 아닌 임의의 값을 지정할 수 있다.

 

확인문제 6

/* for문을 사용한 1부터 100까지의 합을 구하는 프로그램 */

#include <stdio.h>
main( )
{
      int count, sum;

      for(count = 1, sum = 0; count <= 100; count++)
      {
          sum += count;
          if( count % 10 == 0)
              printf("count %3d = %d\n", count, sum);
      }
}

 

예제 7: 1부터 n까지의 합을 구하는 두 가지 방식

#include <stdio.h>                                 #include <stdio.h>
                                                      
main()  /* sum of 1 to n */                       main()    /* sum of 1 to n */
{                                                           {
        int i, n;                                                int i, n;
        long sum=0;                                        long sum=0;

        printf("Input a integer : ");                      printf("Input a integer : ");
        scanf("%d", &n);                                  scanf("%d", &n);
        for (i=1; i <= n; i++)                               for (i=n; i > 0; i--)
                sum += i;                                            sum += i;       
        printf("sum of 1 to n = %ld\n", sum);    printf("sum of 1 to n = %ld\n",
}                                                                     sum);                                

 

확인문제 7

/* for문을 사용한 합, 평균, 최대값, 최소값을 구하는 프로그램의 예제 */

 

#include <stdio.h>
main( )
{
      long count, max, min, data;
      float avg, sum;

      printf("Type a data and Type the q to quit\n");
      if(scanf("%ld", &data) == 1)
      {
          sum = max = min = avg = data;
          printf("count   sum     max  min     avg   data\n");
          printf("---------------------------------------\n");
          printf("%3ld %8.2f %6ld %4ld %7.2f %5ld\n",
                   1L, sum, max, min, avg, data);

          for(count = 2; scanf("%ld", &data) == 1; count++)
          {
              sum += data;
              if( max < data) max = data;
              else if( min > data) min = data;
              avg = sum / count;
              printf("%3ld %8.2f %6ld %4ld %7.2f %5ld\n",
                      count, sum, max, min, avg, data);
          } /* end of for */
       } /* end of if */
       else
           printf("Incorrect data entered\n");
}

 

이 프로그램은 먼저 위와 같은 if문의 조건식에 scanf() 함수를 사용하여 데이터를 입력받습니다. 정상적으로 데이터를 입력받으면 scanf() 함수의 반환값이 1이므로 조건식은 참이 되어 if 블록을 수행하는데, 블록 내부에서 먼저 if 문의 조건식으로 사용되는 scanf() 함수가 읽어 들인 첫번째 데이터를 처리하고 두번째 데이터로부터 for문을 사용하여 데이터를 입력받아 원하는 연산을 실행하는데,

 

for(count =2; scanf("%ld, &data) == 1; count++)

{

...

} /*end of for */

 

for문의 조건식 역시 scanf() 함수를 사용하여 키보드로부터 비 정수 데이터가 입력될 때까지 (여기서는 문자 'q'를 사용) 데이터를 입력받아 합(sum), 최대값(max), 최소값(min), 평균(avg)을 계산하여 매번 for 문을 반복할 때마다 그 결과를 출력합니다. 만약 처음 if 문에서 정수형 데이터가 입력되지 않으면 scanf() 함수는 0을 반환하므로 else문에 연관된 prinf() 함수를 이용하여 'Incorrect data entered"라는 메시지를 출력하고 프로그램을 종료합니다.

 

for문의 융통성

  1. 증감부에서 증가(++), 감소(--) 연산자 사용 가능. 증감 단위는 1뿐 아니라 2 또는 10 등 원하는대로 가능

 

  2. 숫자 대신 문자 사용 가능

         for (ch = ' '; ch <= 'z'; ch++)

         printf("ASCII value for %c = 0x%x\n", ch, ch);

 

  3. 조건검사 수식은 계산결과로 참/거짓을 판별할 수 있는 아무 수식이나 가능

         for (n = 1; n*n*n <= 1000; n++) ...

 

  4. 초기화, 수식, 증감부는 비어있어도 된다.

         ( 초기화, 수식, 변경부는 모두 생략할 수도 있다. )

         for (;;) ;              /* 무한 loop : null 문장 */

         while (1) ;     /* while문은 '수식' 생략 불가 */

 

  5. 초기화, 증감부는 comma 연산자 사용 가능

         for (i=1, sum=0; i <= n; i++) ...
 

※ for문은 while문을 일반화한 것이다  ---> 모든 while문은 for문으로 변환 가능

 

예제  8 ASCII 코드 32 ~ 127에 대응하는 문자와 16진수 코드를 표시하여라.

● 프로그램

#include <stdio.h>

main( )
{
   int i;
   for (i = 32; i < 128; i++) {
        if (i % 8 == 0)
        printf("\n");
        printf("%2x %c ", i, i);
   }  
}

● 결과

     20      21  !    22 “    23  #    24  $     25  %    26  &    27  '  

     28 (    29  )    2a  *    2b  +    2c  ,     2d  -    2e       2f  /

     30 0    31  1    32  2    33  3    34  4     35  5    36  6    37  7

     38 8    39  9    3a  :   3b  ;    3c  <     3d  =    3e  >    3f  ?

     40 ⓐ   41  A    42  B    43  C    44  D     45  E    46  F    47  G

     48 H    49  I    4a  J    4b  K    4c  L     4d  M    4e  N    4f  O

     50 P    51  Q    52  R    53  S    54  T     55  U    56  V    57  W

     58 X    59  Y    5a  Z    5b  [    5c  \    5d  ]    5e  ^    5f  _

     60     61  a    62  b    63  c    64  d     65  e    66  f    67  g

     68 h    69  I    6a  j    6b  k    6c  l     6d  m    6e  n    6f  o

     70 p    71  q    72  r    73  s    74  t     75  u    76  v    77  w

     78 x    79  y    7a  z    7b  {    7c        7d  }    7e  ~     7f   □

 

예제 9 100부터 1010까지 구하여라.

● 프로그램

#include <stdio.h>

main( )
{
   int i;
   double x=1.0;
   for (i=0; i<=10; i++) {
         printf("10^%2d = %12.0f\n", i, x);
         x = x * 10;
   }
}

 

● 결과

10^0 =                   1

10^1 =                 10

10^2 =                100

10^3 =              1000

10^4 =            10000

10^5 =           100000

10^6 =         1000000

10^7 =        10000000

10^8 =      100000000

10^9 =    1000000000

10^10 = 10000000000

 

<예> 알고리즘과 의사 코드

     알고리즘 : 문제를 해결하는 과정 (프로그램의 개략적인 내용)

        사용자가 선택한 임의의 숫자를 알아 맞추는 프로그램:

         알고리즘-1

                1. 사용자에게 숫자를 선택하게 한다.

                2. 컴퓨터는 1을 그 수로 추측하고

                3. 추측이 틀리면 값을 1씩 증가시키면서 확인한다.

 

           알고리즘-2

                1. 최소값을 1, 최대값을 100으로 한다.

                2. 사용자가 숫자를 선택하게 한다.

                3. 추측값 = (최소값 + 최대값) / 2 로 하여 사용자에게 확인.

                4. 추측이 틀리면 다음 과정을 반복하여 실행한다.

                        4.1 추측값이 크면, 최대값 = 추측값 - 1

                        4.2 추측값이 작으면, 최소값 = 추측값 + 1

                        4.3 새추측값 = (최소값 + 최대값) / 2

 

(5) do while문

do while문은 while문과 유사한 방법으로 사용된다. while문은 while 다음의 조건식을 검사하여 조건식이 참이면 반복되는 몸체를 수행하지만 do while문은 먼저 반복문의 몸체를 수행한 다음에 조건식을 검사한다. 즉, while문의 조건식이 그대로 사용되지만 먼저 조건식을 검사하는 것이 아니라 반복되는 루프의 몸체를 수행한 후에 조건식을 검사한다는 것이 while문과 다르다.

 

do while문의 일반적인 형식은 다음과 같다.

 

         do{   
              문   
           } while (식);   

 

식이 참인 동안 문장을 반복한다. 문장이 하나이면 { }는 생략해도 된다. do while은 문을 실행한 후 식을 판정하게 되므로 루프가 최소한 한번은 반드시 수행된다.

 

※ 아래 두 문장의 차이점을 생각해 보라.
                do {                            ch = getchar();
                        ch = getchar();         while ( ch != '\n' ) {
                        putchar(ch);                    putchar(ch);
                } while ( ch != '\n' );                 ch = getchar();

 

예제 10. 문자열의 내용을 대문자로 바꾸는 함수 upr을 작성하여라.

● 프로그램

#include <stdio.h>
void upr(char a[], char b[]); /* 함수 프로토타입: 함수에 관한 정보 */

main( )
{
   char dat[80], result[80];
   scanf("%s", dat);
   upr(dat, result);   /* ① */
   printf("%s\n", result);
   getch();
}

void upr(char a[], char b[])
{
   int i = 0;
   do{
        if('a' <= a[i] && a[i] <= 'z')
             b[i] = a[i] - ('a' - 'A');   /* ②  */
        else
             b[i] = a[i];   /* ③   */
   } while (a[i++] != 0);   /* ④ */
}

 

● 해설

  ① dat의 문자열을 대문자로 바꾸어 result로 리턴한다.

  ② 소문자의 경우는 대문자로 바꾸어 복사한다.

  ③ 그 이외의 경우는 그대로 복사한다.

  ④ '\0'을 복사한 후에 종결 판정을 하므로 루프 이탈 후에 '\0'을 부가할 필요가 없다.

 

● 결과

Hyolee

HYOLEE

 

●추가 설명

 b[i] = a[i] - ('a' - 'A');   /* ②  */의 의미

a[i]는 소문자입니다. 문자 'a'라고 가정합시다. 문자 'a'의 ASCII 코드( 각 문자를 컴퓨터에 저장하고 표현하기 위한 약속입니다)는 97(10진수) 입니다. 16진수로는 61입니다. (예제 8-2를 참고하세요.)

 

그렇다면 'a'-'A'의 의미는 무엇일까요? 'a'의 ASCII 코드는 97이라고 했지요? 'A'의 ASCII 코드는 65입니다. 'a'-'A'의값은 97-65=32랍니다. 이 표현은 해당 알파벳 소문자와 대문자의 값 차이이지요. 다시 말하면, 동일 문자의 소문자의 ASCII 코드는 대문자의 ASCII 코드보다 32 더 크군요.

 

이를 이용하면, 특정 소문자를 대문자로 바꾸려면 해당 소문자의 ASCII 코드에서 32 만큼 빼면 되지요. 질문한 문장에서 b[i] = a[i] - 32;라고 하면 되지만, 구태여 소문자와 대문자 코드값의 차이를 외울 필요가 없으니, b[i] = a[i] - ('a' - 'A'); 의 표현을 쓰는 것입니다.

 

위의 문장을 b[i] = a[i] - ('z' - 'Z');라고 표현해도 마찬가지 입니다.

대문자를 소문자로 변환하는 것은 어떻게 하면 될까요?

a[i]가 대문자라면 a[i] + ('a' - 'A');라고 하면 되겠지요?

 

확인문제 8

/* do-while문을 이용한 문자 찾기 프로그램 */

#include <stdio.h>
main( )
{
      char ch;

      do
      {
           printf("\nType in a character from 'a' to 'e': ");
          while((ch = getche( )) != 'c')
          {
              printf("\nSorry, %c is incorrect.", ch);
              printf("\nTry again.\n");
          }
          printf("\nThat's it!");
          printf("\nPlay again? (y or n): ");
      }while((ch = getche( )) == 'y');
      printf("\nThanks for playing!!\n");
}

 

(6) else if 문

else if 문은, if else 문의 else 절에 if 문이 중첩된 것으로 일반적인 형식은 다음과 같다.

        if (식1)
           문1
        else if (식2)
            문2
             
        else if (식n)
            문n
       else
            문

식1부터 식n 까지가 평가되어 일치하는 곳의 문을 실행하고 else if 문을 끝낸다. 일치하는 조건이 없을 때에는 else 절이 실행되지만, else 절을 생략해도 된다.

 

확인문제 9

/* 연산자에 따라 덧셈, 뺄셈, 곱셈, 정수 나눗셈을 실행하는 프로그램 */

#include <stdio.h>
main( )
{
     char op;
     int data1, data2;

     printf("Type number operator number: ");
     while( scanf("%d %c %d", &data1, &op, &data2) == 3)
     {
        if( op == '+')
         printf("%d + %d = %d\n", data1, data2, data1 + data2);
        else if( op == '-')
         printf("%d - %d = %d\n", data1, data2, data1 - data2);
        else if( op == '*')
         printf("%d * %d = %d\n", data1, data2, data1 * data2);
        else if( op == '/')
           {
               if( data2 == 0 )
                   printf("Can't divide by zero\n");
               else if( data1 < data2)
                   printf("remainder is zero \n");
               else
                   printf("%d / %d = %d\n", data1, data2, data1 / data2);
           }
        else
            printf("Invalid oprator: %c!!\n", op);
        printf("Type number operator number: ");
     }
}

 

(7) switch ~ case 문

if-else 문은 두 방향의 분기이지만, 복수의 다방향 분기를 판단하는 문이 있다. 그 대표적 문이 switch ~ case 문이다. switch ~ case 문에서는 판정하는 수식이 char, int, enum만 인정되고 이외의 경우에는 else if 문을 사용한다. switch ~ case 문의 형식은 다음과 같다.

 

        switch (수식) {                 switch (ch) {
        case 값1:                        case 'A':
                문장;                           printf("Apple\n");
                break;                         break;
        case 값2:                        case 'B':
                문장;                           printf("Banana\n");
                break;                         break;
        ......                                case 'C':
        case 값n:                            printf("Coconut\n");
                문장;                           break;
                break;                     default:
        default:                                printf("Watermelon\n");
                .....                              break;
        }                                     }

 

switch ( )의 식과 case 값1 ~ 값n이 비교되어 일치하는 case에 있는 문을 실행시키고 break로 switch 문을 끝낸다. 만약에 break가 없으면 무조건 다음의 case에 있는 문으로 실행이 진행된다. 또, 일치하는 case가 없고 default가 정의되었으면 default문이 실행된다. default에 실행시킬 문이 없으면 생략해도 된다. switch 문의 식에 쓰여질 수 있는 형은 char, int, enum 이다.

 

확인문제 10

/* switch 문을 이용한 덧셈, 뺄셈, 곱셈, 정수 나눗셈 프로그램 */

#include <stdio.h>
main( )
{
     char op;
     int data1, data2;

     printf("Type number operator number: ");
     while( scanf("%d %c %d", &data1, &op, &data2) == 3)
     {
         switch(op)
         {
             case '+': printf("%d + %d = %d\n", data1, data2, data1 + data2);
                       break;
             case '-': printf("%d - %d = %d\n", data1, data2, data1 - data2);
                       break;
             case '*': printf("%d * %d = %d\n", data1, data2, data1 * data2);
                       break;
             case '/': {
                           if( data2 == 0 )
                               printf("Can't divide by zero\n");
                           else if( data1 < data2)
                               printf("remainder is zero \n");
                           else
                               printf("%d / %d = %d\n",
                                       data1, data2, data1 / data2);
                           break;
                       }
              default : printf("Invalid operator: %c!!\n", op);
         }
         printf("Type number operator number: ");
     }
}

 

확인문제 11

/* switch 문을 사용한 각 모음과 공백 문자의 입력 횟수를 세는 프로그램 */

#include <stdio.h>
main( )
{
     char ch;
     int  a_ch_cnt, e_ch_cnt, i_ch_cnt, o_ch_cnt, u_ch_cnt,
        white_ch_cnt, other_ch_cnt;

     a_ch_cnt = e_ch_cnt = i_ch_cnt = o_ch_cnt = u_ch_cnt = 0;
     white_ch_cnt = other_ch_cnt = 0;

     printf("Enter some text, enter Ctrl+Z(EOF) to quit: ");
     while( (ch = getchar() ) != EOF )
     {
        switch( ch )
        {
         case 'a' :
         case 'A' : a_ch_cnt++;
                    break;
         case 'e' :
         case 'E' : e_ch_cnt++;
                    break;
         case 'i' :
         case 'I' : i_ch_cnt++;
                    break;
         case 'o' :
         case 'O' : o_ch_cnt++;
                    break;
         case 'u' :
         case 'U' : u_ch_cnt++;
                    break;
         case '\n':
         case '\t':
         case ' ' : white_ch_cnt++;
                    break;
         default :  other_ch_cnt++;
        }
     }
     printf("number of each characters:");
     printf(" A    E    I    O    U    White    Other\n");
     printf("                         ");
     printf("-----------------------------------------\n");
     printf("                        %4d %4d %4d %4d %4d %6d %8d\n",
            a_ch_cnt, e_ch_cnt, i_ch_cnt, o_ch_cnt, u_ch_cnt,
            white_ch_cnt, other_ch_cnt);
}

 

확인문제 12

/* 중첩된 switch 문을 사용한 성적 처리 프로그램 예제 */

main( )
{
      int score;

      printf("Input a score: ");
      while(scanf("%d", &score) == 1)
      {
        switch(score / 10)
        {
            case 10: printf("Grade is A+\n");
                     break;

            case  9: switch( score % 10 )
                     {
                         case 9: case 8: case 7: case 6:
                         case 5: printf("Grade is A+\n");
                         break;
                         case 4: case 3: case 2: case 1:
                         case 0: printf("Grade is A\n");
                     }
                     break;

            case  8: switch( score % 10 )
                     {
                         case 9: case 8: case 7: case 6:
                         case 5: printf("Grade is B+\n");
                         break;
                         case 4: case 3: case 2: case 1:
                         case 0: printf("Grade is B\n");
                     }
                     break;

            case  7: switch( score % 10 )
                     {
                         case 9: case 8: case 7: case 6:
                         case 5: printf("Grade is C+\n");
                         break;
                         case 4: case 3: case 2: case 1:
                         case 0: printf("Grade is C\n");
                     }
                     break;

            case  6: switch( score % 10 )
                     {
                         case 9: case 8: case 7: case 6:
                         case 5: printf("Grade is D+\n");
                         break;
                         case 4: case 3: case 2: case 1:
                         case 0: printf("Grade is D\n");
                     }
                     break;

            default : printf("Grade is F\n");
        }
          printf("Input a score: ");
      }
}

 

(8) 다중 루프

루프가 다른 루프 속에 완전히 포함되는 경우가 있다. 이와 같은 구조를 중첩(nested) 루프 또는 다중 루프라고 한다. 특히 for 문은 다음과 같은 다중 루프에 이용되는 경우가 자주 있다

 

    for(i=1; i<=9 ; i++) {
          for(j=1; j<=9; j++) {
               printf('%4d", i * j);
         }
         printf("\n");
     }

 

다중 루프를 중첩시킨 경우에는 안쪽의 루프를 먼저 실행한다. 위의 프로그램은 구구단표를 작성하는데, 먼저 i = 1로 안쪽 루프에 들어가 j 를 1∼9까지 반복하고 그때마다 i * j 의 값을 화면의 가로 방향으로 표시한다. j의 반복이 끝나면 printf("\n")을 실행하고 다시 바깥쪽 루프를 실행하고 i = 2로 다시 같은 과정을 반복해서 i 가 9가 될 때까지 반복한다.

 

예제 11 *로 삼각형 모양을 출력하여라.

● 프로그램

#include <stdio.h>

main( )
{
   int j, k;
   for (j=0; j<10; j++) {
         for (k=0; k<j; k++)     /* ① */
         printf("*");
         printf("\n");    /* ② */
   }
}

 

● 해설

①  *표를 가로로 j 개 표시. 안쪽 루프의 반복 횟수가 같은 수의 바깥쪽 루프 변수인 j에 의존.

②  개행 문자가 없으면 *은 가로 방향으로 연속해서 표시.

 

● 결과

*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *

 

예제 12 직각삼각형의 성립 조건을 구하여라.

●  연구

직각삼각형의 성립 조건은 a²= b²+ c²이다. 각 변을 1 부터 n 까지 전부 조사해서 이 조건을 만족하는 a, b, c 의 값을 표시하면 되는데, 실제로는 1 ~n 개의 전부를 조사하면 중복되는 것이 생기므로 b, c는 a보다 작다라는 조건식과 c는 b보다 크다라는 조건식을 붙인다.

 

● 프로그램

#include <stdio.h>

main( )
{
   int a, b, c, n;
   printf("max ? ");
   scanf("%d", &n);
   printf("A \tB \tC \n");
   for (a=1; a<=n; a++) {
         for (b=1; b<=a; b++) {
               for (c=b; c<=a; c++) {
                     if (a*a == b*b+c*c)
                          printf("%d \t%d \t%d \n", a, b, c);
               }  
         }
   }
}

 

● 결과

max ? 10

A      B      C

5       3      4

10      6      8

 

확인문제 13

/* 2개의 for 문을 사용한 구구단 프로그램 */

#include <stdio.h>
main( )
{
      int i, j;
      for( i = 2; i <= 9; i++)
      {
          for(j = 1; j <= 9; j++)
              printf("%d*%d=%2d  ", i, j, i * j);
          if( j == 10 ) putchar('\n');
      }
}

 

확인문제 14

/* 중첩된 for 문을 사용한 예제 */

#include <stdio.h>
main( )
{
      int i, j, k, temp;

      printf("       i      i^2     i^3     i^4\n");
      printf("     -----------------------------\n");
      for( i = 1; i <= 9; i++)      /* 1에서 9까지 계산 */
      {
        for( j = 1; j <= 4; j++)    /* 1승에서 4승까지 반복 */
        {
            temp = 1;
            for( k = 0; k < j; k++) /* 지수승 값을 구하는 곱셈 연산을 제어 */
                temp *= i;
            printf("%8d", temp);
        }
        printf("\n"); /* 각 단계의 줄 바꿈 */
      }
}


또한 for 문 이외에 while, do-while 문도 중첩이 가능하다.

 

예제 13 sn = 1 + (1+2) + (1+2+3) + ... + (1+2+...+n)을 구하기 위한 프로그램의 부분

        int i, j, n;
        long si, sn;

        printf("Input n : ");
        scanf("%d", &n);
        for (i=1, sn=0; i <= n; i++) {
                for (j=1, si=0; j <= i; j++) si += j;
                sn += si;
        }

 

예제 14 1부터 n까지 사이에 있는 모든 prime number를 출력하는 알고리즘

1. 정수 i가 prime number인지를 판별하는 program

        for (divisor = 2; i % divisor != 0; divisor++)
                ;       /* number를 2,3,4,...로 나누어 나머지가 0인 숫자를 구함 */
        if (divisor == i)
                printf("%d is a prime number.\n", i);
        else
                printf("%d is NOT a prime number.\n", i);

 

2. 1부터 n까지 prime number 판별 및 출력

        for (i = 2; i <= n; i++) {              /* for (i = 1; i <= n; i += 2) { */
                for (divisor = 2; i % divisor != 0; divisor++)
                        ;
                if (divisor == i)
                        printf("%d is a prime number.\n", i);
        }

 

3. 1부터 n까지 prime number를 한 줄에 5개씩 출력

                if (divisor == i)
                        printf("%d is a prime number.\n", i);
        ===>
                if (divisor == i) {
                        printf(" %5d", number);
                        if (++count % 5 == 0) putchar('\n');  /* count=0으로 초기화 */
                }

 

(9) 기타 제어문: break, continue, goto

 break문 --- 가장 안쪽 loop를 빠져 나간다.

                while ( (ch = getchar()) != EOF ) {
                        if ( ch == '\n' )
                                break;          /* 개행 문자가 입력되면 loop exit */
                        putchar(ch);
                }

 

확인문제 15

/* 사용자가 생각하는 숫자를 찾아내는 프로그램 */

#include <stdio.h>
main( )
{
      float guess, incr;
      char ch;

      printf("Think of a number between 1 and 99, and\n");
      printf("I'll guess what it is. Type 'e' for equals,\n");
      printf("'g' for greater than, and 'l' for less than.\n");

      incr = guess = 50;
      while( incr > 1.0 )
      {
          printf("\nIs your number greater or less than %.0f?\n", guess);
          incr = incr / 2;
          if((ch = getche( )) == 'e')
              break;
          else if( ch == 'g')
              guess += incr;
          else
              guess -= incr;
      }
      printf("\nThe number is %.0f.", guess);
}

 

확인문제 16

/* 사각형의 면적을 구하는 프로그램 */
#include <stdio.h>
main( )
{
      float length, width, rectangle;

      printf("Enter the length and the width of the rectangle: ");
      while(scanf("%f %f", &length, &width) == 2)
      {
          printf("length = %.2f, width = %.2f\n", length, width);
          if( length <= 0.0 || width <= 0.0 )
          {
              printf("Can't calculate !!\n");
              break;
          }
          rectangle = length * width;
          printf("The area of the rectangle: %.2f\n", rectangle);
          printf("Enter the length and the width of the rectangle: ");
      }
      puts("END");
}


continue문 --- loop의 조건검사 부분으로 jump
                continue문 이후의 나머지 부분을 실행하지 않고 loop 계속

                while ( (ch = getchar()) != EOF ) {
                        if ( ch == '\n' )
                                continue;               /* 개행문자면 나머지는 건너뜀 */
                        putchar(ch);
                }

 

확인문제 17

/* continue문을 사용하여 사각형의 면적을 구하는 프로그램 */
#include <stdio.h>
main( )
{
      float length, width, rectangle;

      printf("Enter the length and the width of the rectangle: ");
      while(scanf("%f %f", &length, &width) == 2)
      {
        printf("length = %.2f, width = %.2f\n", length, width);
        if( length <= 0.0 || width <= 0.0 )
        {
            printf("Input Error !!\n");
            printf("Input more than one !!\n");
            printf("Enter the length and the width of the rectangle: ");
            continue;
        }
        rectangle = length * width;
        printf("The area of the rectangle: %.2f\n", rectangle);
        printf("Enter the length and the width of the rectangle: ");
      }
      puts("END");
}


goto문 --- label이 붙은 문장으로 jump

                        goto next;
                           ......
                next:   /* label은 :으로  */
                        printf("Next process begins.\n");

※ goto문은 가급적 사용하지 않는 것이 좋다 ( goto-less programming )

※ 중첩된 loop를 모두 빠져나갈 때는 유용하게 사용됨.

 

 

그리드형

댓글