내장형 하드웨어/C언어

for문 (초기식과 증감식의 변형, 무한반복문)

동화다아아 2011. 4. 13. 17:19
 for문 (초기식과 증감식의 변형)


//$를 누를 때 까지 키보드로부터 문자를 읽고 출력하는 프로그램


#include<stdio.h>

int main()

{

        char ch;

        int i;


        printf("Please enter any character: ");

        for(i=0;(ch=getchar())!='$';i++)  // getch 대신 getchar를 사용했다.

        {

                printf("\nYou typed: %c\n",ch);

                getchar(); // 예문에 없는 추가한 부분.

                printf("Please enter any character: ");

        }

        putchar ('\n');


        return 0;

}


⇒ 예제 p3_23에서는 #include<conio.h>를 추가로 호출해서 getchar 대신 getch를 사용하였다. 하지만 <conio.h>는 윈도우에서만 사용가능한 명령으로 linux에서는 쓸 수 없다. 따라서 getch 역시 linux에서는 쓸 수 없다.

⇒ getchar → 키보드에서 글자를 하나 읽어온다.(블록된다.) char를 get한다는 뜻.(즉, scanf와는 달리 한 개만 입력 받는다.)

   getch → 비표준이다. <conio.h>는 윈도우에서만 지원한다. 따라서 linux 에서는 쓸 수 없으며 버퍼를 사용하지 않아 입력즉시 동작한다.(표준 C는 버퍼를 사용한다.)

※ getchar를 사용할 때 fflush(stdin)을 쓰면 getch와 같은 기능을 할 수도 있다.(역시 윈도우에서 가능, linux는 차이가 있다.)

⇒ getchar와 getch의 차이는 버퍼를 사용하느냐와 아니냐의 차이가 있다. 즉, 입력을 해도 getchar는 enter를 기다리고 버퍼를 사용하지 않는 getch는 바로 동작한다.

⇒ 위의 예문을 linux 환경에서 작성하고 컴파일 했기에 getch를 사용할 수 없으므로 getchar를 사용하였다.

⇒ 위에서 조건식의 getchar를 호출하면 키보드에서 한글자를 불러와 ch에 아스키 코드가 저장된다.(‘ ’는 정수를 뜻한다.) 입력받은 아스키 코드와 ‘$’의 아스키 코드를 비교해 값이 다르면 참이되어 for문의 내용을 실행하고 아니면 반복문을 빠져 나간다.

 

⇒ 반복문 안에 getchar()를 추가하지 않는다면 반복문 안의 명령이 for문을 거쳐 한번 더 실행된다. 왜냐면 enter가 버퍼에 남아있어 입력이 한 번 더 된 것과 같기 때문이다. %c 부분을 %d로 바꾸어 주면 아스키 코드 값이 출력되는데 반복문 사이 getchar를 넣지 않는다면 enter의 아스키 코드 값 10이 출력되는 것을 볼 수 있다.


- for 문 예제를 while 문으로 바꾸어 보는 실습.

for문 사용

while문 사용

#include<stdio.h>

int main()

{

        int i;

        for(i=1;i<=5;)

        {

                printf("%d\t",i++);

        }

        putchar('\n');

 

        return 0;

}

#include<stdio.h>

int main()

{

        int i;

        i=1;

        while(i<=5)

        {

                printf("%d\t",i);

                ++i;

        }

        putchar('\n');

 

        return 0;

}

⇒ for 문은 while 문으로 while 문은 for 문으로 바꾸어서 사용할 수 있다.

⇒ for 문에서 초기식과 증감식을 끄집어내어 증감식을 while 문내에 초기식을 while 문 앞에 선언하게 되면 위와 같이 같은 동작을 하는 소스가 된다.


#include<stdio.h>

int main()

{

        int iNum=1;

        for(;;) // for문 안을 무한히 반복한다.

        {

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

                ++iNum;

                if(5<=iNum) // iNum이 5보다 작거나 같으면

                {

                        break; // for문을 빠져나간다.

                }

        }

        return 0;

}

⇒ for(;;)과 while(1)은 반복문을 무한히 반복하는 것을 뜻한다.

⇒ while문의 괄호안의 숫자는 0을 제외하면 참이다. 즉, 0을 제외한 어떠한 값을 넣더라도 무한반복문이 된다.

⇒ 무한 반복문 내에 위와 같이 break;를 사용하게 되면 반복에서 빠져나갈 수 있다.