관리 메뉴

Kim's Programming

C언어 - 제어문! 소스 일부를 통제한다!(1/2) 본문

Programming/C

C언어 - 제어문! 소스 일부를 통제한다!(1/2)

Programmer. 2015. 7. 15. 19:54

이번 포스팅에서는 C언어의 제어문에 대해서 알아보겠습니다. C언어에서의 제어문이라 함은 조건문, for문, while문, switch문 그리고 기타 제어문들이 있습니다. for문 부터 차례 차례 알아보도록 하겠습니다.

 

1. IF문.

 

 IF문이란 조건에 따라서 실행을 하르게 하는 알고리즘을 만들 수 있는 문장입니다. 지금까지 작성하였던 포스트에서는 단순하게 소스에 넣은 모든 소스를 읽고 실행 시켰지만 IF문을 이용하면은 다양한 상황을 판단하여 다르게 작동하도록 만들 수 있습니다. 이런 조건문의 경우는 실생활에서도 많은 경우가 있습니다. 중국집에 전화를 걸어서 무엇을 시켜먹을 것인가? 라는 생각을 하면 우리는 짜장면을 선택하거나 짬뽕을 선택하듯이 프로그래밍에도 그런 효과를 줄 수 있습니다.

 

IF문의 구조는 IF(조건) 명령;의 형태를 가지게 됩니다.(if 조건의 괄호가 닿힌 다음과 명령의 끝에 중괄호를 붙여도 상관은 없습니다.) if문에서 비교하는 연산자를 먼저 알아보겠습니다. 비교 연산자는 조건을 비교할때 이용하게됩니다.

 

 비교 연산자

 판단

비고 

 ==

 좌변과 우변이 같음을 판단

 

 !=

 좌변과 우변이 다름을 판단

 

 >

 좌변이 우변보다 큼을 판단

 

 <

 과변이 우변보다 작음을 판단

 

 >=

 좌변이 우변보다 크거나 같음을 판단

 

 <=

 좌변이 우변보다 작거나 같음을 판단

 

 

살펴보시게 되면 일반적으로 사용하는 수학기호와 크게 다름이 없음을 알 수 있습니다. 좀 헷갈리는 경우가 !=의 경우가 순서를 헷갈리는 경우가 많이 있던 것 같은데. 영어로 쓰이는 것 처럼 Not End(같지 않다)로 알아두시면 쉽게 외울 수 있습니다. (추가로 해서 연산자에서는 !의 의미는 부정을 의미 합니다. 우선은 이 부분에 대해서는 나중에 설명하도록 하겠습니다.) 연산자의 순서는 항상 일치해야 됩니다. 크거나 같다, 작거나 같다로 써야하지 같고 크다 같고 작다로 =>, =<로 입력을 하면 컴퓨터가 읽지를 못합니다. 비교 연산자를 이용한 짧은 예시 몇 개만 들어 보겠습니다.

1
2
3
if(i==5)        //i가 5라면 조건을 실행
if(i!=3)        //i가 3이 아니라면 조건을 실행
if(i>2)         //i가 2보다 크면 조건을 실행
cs

 

if문은 다음과 같이 입력을 한 뒤에 명령을 작성해주면 시용을 할 수 있습니다. 그럼 간단한 알고리즘과 간단한 프로그램을 이용하여 예시를 들어보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
 
int main()
{
    int i = 0;
    printf("변수 i에 입력할 조건을 입력해주세요\n");
    scanf("%d"&i);
 
    if (i > 4)//i가 4보다 큰지 판단, 아니라면 통과
        printf("4보다 큰 값이 입력되었습니다\n");
    if (i <= 4)//i가 4보다 작거나 같은지 판단, 아니라면 통과
        printf("4보다 작거나 같은 값이 입력되었습니다.\n");
}
cs

다음을 알고리즘 다이어그램으로 살펴보게 되면 다음과 같습니다.

 

 

숫자를 입력받고 나면 판단을 하고 판단 조건에 따라서 다른 값을 출력하게 되는 형태 입니다. if문에 붙는 뒤에 명령을 쓸때 지금은 한개만 썼습니다. 하지만 2줄도 가능할 까요? 정답은 불가능 하다입니다. if문을 작성하게 되면 처음 한줄 명령줄의 ;(세미콜론)까지만 명령문으로 인지하고 그 다음 줄 부터는 조건문 밖에 있는 것 으로 판단하게 됩니다. 그렇기 때문에 IF문을 사용할때 2줄 이상의 명령문을 넣기 위해서는 중괄호를 이용하여 명령문들을 묶어주어야 합니다.

 

ELSE문

 

IF문을 이용할때 else문도 함께 사용이 가능합니다. if 문은 어떠한 조건이 만족 될 때의 특정 명령의 실행을 하는 형태인데 else를 이용하면 그 조건이 만족되지 않는 그 나머지의 경우의 명령을 줄 수 있습니다. 위에서의 조건문은 4보다 작을때와 4보다 작거나 같다 등으로 if문 2개를 써서 조건문을 형성하였지만 else 문을 이용하면 더 간단하게 처리 할 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
 
int main()
{
    int i = 0;
    printf("변수 i에 입력할 조건을 입력해주세요\n");
    scanf("%d"&i);
 
    if (i > 4)//i가 4보다 큰지 판단, 아니라면 통과
        printf("4보다 큰 값이 입력되었습니다\n");
    else//if 조건이 맞지 않다면 else문의 명령을 실행
        printf("4보다 작거나 같은 값이 입력되었습니다.\n");
}
cs

이렇게 소스를 구성하면 따로 4보다 작거나 같은 값일때의 if 와 조건을 따로 쓸 필요 없이 간편하게 else 하나만 작성 함으로써 위와의 같은 효과를 낼 수 있게 됩니다. 물론 소스는 다르지만 위의 알고리즘 다이어그램은 같은 형태입니다.

 

else문을 하나만 쓰는것이 아니라 if문과 조합해서도 사용이 가능합니다. 조합을 해서 사용하게 되면 여러 개의 조건에 대해 만족하는 명령을 선택 할때 사용 합니다. 위에서는 2가지 까지의 판단을 할 수 있다면 if와 else를 조합하게 되면 여러가지 조건을 더 따질 수 있게 됩니다. 우선 간단한 소스와 알고리즘을 이용하여 설명을 하도록 하겠습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
 
int main()
{
    int i = 0;
    printf("변수 i에 입력할 조건을 입력해주세요\n");
    scanf("%d"&i);
 
    if (i == 7)
        printf("행운의 숫자입니다\n");
    else if (i == 13)
        printf("불행한 숫자입니다.\n");
    else
        printf("7도 13도 아닌 숫자입니다.\n");
}
cs

 

글로 표현하기는 너무 길고 복잡할 수 있기때문에 알고리즘 다이어그램으로 설명 하도록 하겠습니다.

 

 

먼저 값을 입력을 받은뒤에 입력 받은 값이 7인지를 판단을 합니다. 7이라면 "행운의 숫자입니다"를 출력을 하고 아니라면 다음 판단을 시작합니다. 다음 판단에서 입력받은 값이 7은 아니고 13이라면 "불행의 숫자입니다"를 출력을 합니다. 입력 받은 값이 7도 13도 아닌 경우에는 "13도 7도 아닌 숫자입니다."를 출력합니다. 이와 같이 여러조건을 만족하는 값을 출력 할 수 있습니다. if와 else는 더 많이 조합을 할 수 있습니다.

 

ps. 위의 경우에는 if문 다음 명령문을 그냥 썼는데 if문 다음에 쓰는 명령들을 중괄호로 묶어서 명령부분을 구별해 주는 것이 좋습니다. 왜냐하면 if문안의 명령이 2줄이상 되는 경우에 매우 헷갈 릴 수 있습니다. 엔터로 구분을 할 수도 있으나 중괄호로 해주는 것이 가장 덜 헷갈립니다.

 

2. FOR문

 

for문은 비슷한 명령문을 여러번 실행하는 때에 이용하는 조건문입니다. 예를 들면 어떤 숫자 집합 30개의 평균을 구할때는 물론 (num_1+num_2+ …… +num_29+num_30)/30 따위로 구하는 경우도 있긴 하지만, 일일이 다 치는데 너무 불편하고 길이도 쓸데없이 너무 길어지게 됩니다. 이럴 때 이용 할 수 있는 조건문이 for문을 작성하여 한 명령을 반복하게 한 다음 30번 반복하게 하는 편이 더 짧고 간편한 명령어가 될 것입니다. 이렇게 프로그래밍에서 반복하는 것을 루프라고 칭합니다. 루프를 구성하는 방법은 여러가지가 있지만 C언어에서는 for문이 가장 기본적인 방법입니다. 

 

FOR문의 구조는 다음과 같습니다.

 

for( 초기식 ; 조건 ; 증감) 명령;

 

- 초기식 : 초기식에서는 반복의 기준이 되는 변수의 초기값을 입력 해주는 곳입니다. 이 초기식은 for문이 시작할 때 한번만 실행하게 됩니다. 변수를 for문의 초기식 부분에서 선언하는 것도 가능합니다.

- 조건 : 반복의 조건을 나타나게 됩니다. 조건은 반복문의 반복이 언제까지 지속될 것 인가를 지정하는 것입니다. 조건을 나타나기 때문에 if문에서 사용되었던 비교 연산자 >, < 따위가 사용되게 됩니다. 조건부분에 들어간 식이 거짓이 될 때 까지 반복합니다.

- 증감 : 초기식이 조건식까지 가는데 증가로 갈 것인지 감소로 갈 것인지 또 얼마나 증가시킬것인지 얼마나 감소시킬 것 인지를 설정 할 수 있는 부분입니다.

 

for문에서는 초기식이든 조건이든 증감이든 무엇이든 하나가 없어도 2개가 없어도 전부 없어도 작동할 수 있는 조건문입니다. 세미콜론만 정확하게 표기를 하여 비워놓기만 한다면 for문은 그에 맞게 루프를 구성하게 됩니다.

 

for문은 IF문 보다는 복잡한 형태를 띄고 있지만 예시를 통해서 기본적인 for문을 알아 보고 확인을 하면 간단하다는 것을 확인해보겠습니다.

1
2
3
4
5
6
7
#include<stdio.h>
 
int main()
{
    for (int i = 0; i < 10; i++)
        printf("%d번째 숫자 : %d\n",i, i);
}
cs

역시 이번에도 알고리즘 다이어그램을 통해서 나타내 보겠습니다.

 

 

for문은 다이어그램에서 볼 수 있듯이 초기식이 실행되고 나서 i 값이 조건을 만족할 때 까지 증가를 시켜서 조건이 부정이 될 때까지 반복을 하게 됩니다. 실제로 출력은 다음과 같이 됩니다.

 

이렇게 반복하는 for문을 이용한 또 다른 예제를 보여드리겠습니다. 다음으로 보이는 소스는 1부터 100까지의 숫자를 모두 더하는 소스입니다.

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
 
int main()
{
    int count = 0;
    for (int i = 1; i <= 100; i++)
    {
        count = count + i;
    }//count값에 i를 반복시키며 1부터 100까지의 숫자를
     //반복 저장하면서 더함
    printf("1부터 100까지의 숫자를 다 더한 값은 %d입니다.\n", count);
}
cs

다음 예제는 count라는 변수를 이용 i가 반복되는 값들을 count에 차례 차례 더해주는 과정을 반복하여 1부터 100까지 더하는 과정을 반복하는 소스입니다.

 

결과는 다음과 같이 됩니다.

 

 

 

for문으로 무한루프 표현하기

 

무한 루프란 의미는 무한정 명령부를 반복하는 것입니다. for문으로 무한루프를 구성하는 방법은 초기식, 조건, 증감칸을 비우고 for(;;)와 같이 놔둔 뒤 명령 부분에 반복할 행위를 넣어주면 됩니다. 무한 루프를 이용하여 1부터 10까지의 숫자를 입력받아서 그중에 자신이 지정된 숫자를 맞추는 업다운(보통 술자리 게임이죠 ^^;)를 만들어 보겠습니다. 맞는 숫자를 입력할 때 까지 계속해서 반복하는 소스입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
 
int main()
{
    int number=0;
    for (;;)
    {
        printf("제가 값을 얼마를 선택했을까요?(1~10)\n");
        scanf("%d"&number);//number라는 변수에 값을 받는 행위를 무한 반복
        if (number == 7)//number가 7일때 무한푸프를 끝낸다
        {
            break;
        }
    }
    printf("숫자를 맞추셨습니다!!! 축하합니다.\n");
}
cs

위의 소스중에서 아직 못보던 것이 보일 것입니다. if(num == 7)까지는 알겠는데 다음에 있는 break; 무슨 의미 인지 모르겠을 수 있습니다. break란 무한루프가 되고 있는 것을 깨뜨리는 역할을 합니다. break;에 대해서는 뒤에서 더 알아 보도록 하겠습니다. 위의 소스를 실행시키면 맞는 값을 입력할 때까지 무한정 반복을 하게 됩니다.

 

for문을 이용한 다중루프 구성

 

다중루프라고 함은 2개 이상의 루프가 겹쳐 있는 형태를 칭하는 말입니다. 구조가 어떤 루프안의 명령부에 또 다른 루프가 들어가있는 형태를 가진것을 다중루프라고 합니다. 음.. 반복안에 반복이 있는것 반복을 반복하는 형태입니다. 구구단을 통해서 이중루프를 구성해보도록 하겠습니다. 길이가 길이이기때문에 숫자 4까지 4단 까지만 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
 
int main()
{
    for (int  i =; i < ; i++)
    {
        for (int j = 1; j < 5; j++)
        {
            printf("%d X %d = %d\n", i, j, i*j);
        }
        printf("\n");
    }
}
cs

다음과 같이 2중 구조로 돌게 됩니다. 안쪽에 있는 for문이 완전히 끝까지 진행되기 전까지 즉, 밖에 쪽 초기값을 증감을 시키려면 안쪽에 있는 for문의 루프가 완전히 돌아야 하는 것을 이용하는 것입니다. 위의 소스를 이용한 다음의 결과는 다음과 같습니다.

 

 

 

다음 포스팅에서 제어문을 마저 알아보도록 하겠습니다.