내용 정리

 

※ 조건문(if, switch)

 

 

if문과 switch문의 사용 방법은 간단하므로 생략하고

자주 실수하는 사항에 대해서만 정리하려 한다.

 


if문
if 와 else 쌍에 주의한다. 괄호가 필요하다.

 

1
2
3
4
5
6
scanf("%d",&x);
if(x>0)
    if(x%2 == 0)
        printf("양의 짝수 입니다.\n");
else
    printf("음수입니다.\n");

 

위처럼 작성하면 위의 맨 마지막 else문은

컴파일러는 바로 위의 if 문과 쌍으로 생각한다.

 

결국 else문은 (x>0) && (x%2 !=0) 일 때 조건으로 생각된다.

 

 

따라서 아래와 같이 괄호를 사용하여

컴파일러가 알 수 있게 확실히 명시한다.

 

1
2
3
4
5
6
7
8
scanf("%d",&x);
if(x>0)
{
    if(x%2 == 0)
        printf("양의 짝수 입니다.\n");
}
else
    printf("음수입니다.\n");

 

다시 정리하자면

컴파일러는 else와 짝을 이루는 if를 찾을 때 들여쓰기를 무시하고

else와 짝을 이루지 않는 상위의 if들 중 가장 가까운 if와 짝이 된다고 해석한다.

→ 괄호 사용 습관화

 

 

switch문

 

간단한 실수 이지만 break문을 빼고 자주 사용한다.

오류가 발견될 때 보통 입력받은 케이스 이후 케이스가 동작한다면

break문을 빠트린 것을 알 수 있다.

 

아래는 오류 케이스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
 
int main()
{
    int a;
    scanf("%d"&a);
    switch (a)
    {
    case 1printf("입금하기 화면으로 이동합니다.\n");
    case 2printf("출금하기 화면으로 이동합니다.\n");
    case 3printf("송금하기 화면으로 이동합니다.\n");
    default:printf("잘못된 입력입니다.\n");
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

2를 입력하면

 

입력받은 케이스 case2 이외의 3, default 경우까지 모두 실행이 된다.

이 경우 break 문이 빠진것을 알 수 있으며

break문 case끝마다 추가해 주어야 한다.

 

아래와 같이 수정하면 문제없이 동작한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
 
int main()
{
    int a;
    scanf("%d"&a);
    switch (a)
    {
    case 1printf("입금하기 화면으로 이동합니다.\n"); break;
    case 2printf("출금하기 화면으로 이동합니다.\n"); break;
    case 3printf("송금하기 화면으로 이동합니다.\n"); break;
    default:printf("잘못된 입력입니다.\n");
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

case2의 break문이 실행되어 switch문을 벗어나게 된다.

 

 

 

※ 반복문(for, while, do~while)

 

 

for, while, do~while을 어떠한 경우에 사용해야 하는지 헷갈리는 경우가 많았다.

사용 방법은 간단하지만 많은 알고리즘 문제를 해결하다 보면 자연스럽게 익혀진다.

 

for와 while문의 차이를 자세히 알아보면

 

for문: 반복 횟수가 명확할 때 이용하면 편리

while문: 반복 횟수는 모르지만 어떤 조건은 만족 할 때까지 반복할지 아는 경우

do~while문: 무조건 한번은 실행하고, 조건 검사

 


 

연습 문제

 

11, 15, 22, 23, 24번을 풀어보겠다.

 

 

문제 11: 양의 정수 하나를 입력받고, 입력받은 수가 소수(prime number)인지 판단하는 프로그램을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int main()
{
    int num;
    int i;
    printf("양의 정수:");
    scanf("%d"&num);
 
    for (i = 2; i < num; i++)
    {
        if (num%i == 0)
        {
            printf(">>%d는 소수가 아닙니다.\n", num);
            break;
        }
    }
    if (num == i)
        printf(">>%d는 소수입니다.\n", num);
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

2~자기자신까지 나누어 봐서 0으로 나누어 떨어지면

그 순간 소수 아니라고 판단하고, 종료.

만약 모두 0으로 나머지가 나누어 떨어지지 않는다면

소수.

 

 

 

문제 15: 어떤 수를 입력받고 입력받은 수보다 작은 소수를 전부 출력하는 프로그램을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
int main()
{
    int max;
    int n = 2;
    int i;
 
    printf("최대 몇까지의 소수를 출력?");
    scanf("%d"&max);
 
    while (n < max)
    {
        for (i = 2; i < n; i++)
        {
            if ((n%i) == 0)
                break;
        }
        if (n == i)
            printf("%d ", n);
        n++;
    }
    return 0;
}

 

앞의 11번과 유사, 반복문 하나 더 추가

 

 

문제 22: 반복문을 이용해 다음과 같은 패턴을 출력하는 프로그램을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//1번
#include <stdio.h>
 
int main()
{
    int i,j;
    
    for (i = 1; i <= 9; i++)
    {
        if ((i == 1|| (i == 9))
        {
            for (j = 1; j <= 9; j++)
            {
                printf("*");
            }
            printf("\n");
        }
        else
        {
            for (j = 1; j <= 9; j++)
            {
                if ((j == 1|| (j == 9))
                    printf("*");
                else
                    printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//2번
#include <stdio.h>
 
int main()
{
    int i, j;
    
    for (i = 1; i <= 5; i++//1~5줄
    {
        for (j = 4; j >= i; j--)
        {
            printf(" ");
        }
        
        for (j = 1; j <= i * 2 - 1; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    
    for (i = 1; i <= 4; i++//6~9줄
    {
        for (j = 1; j <= i; j++)
        {
            printf(" ");
        }
 
        for (j = 1; j <= 9- (i * 2) ; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//3번
#include<stdio.h>
 
int main()
{
    int i, j;
    for (i = 1; i <= 9; i++)
    {
        for (j = 1; j <= i; j++)
        {
            printf("%d", j);
        }
        printf("\n");
    }
    return 0;
}
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//4번
#include <stdio.h>
 
int main()
{
    int i, j;
    for (i = 9; i >= 1; i--)
    {
        for (j = 1; j <= i; j++)
        {
            printf("%d", j);
        }
        printf("\n");
    }
    return 0;
}

 

 

문제 23: 원하는 피보나치의 개수를 입력해서 그 개수만큼 수열이 출력되는 프로그램을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
 
int main()
{
    int num,i;
    int fibo;
    int fibo_1 = 0;
    int fibo_2 = 1;
 
    printf("피보나치 개수 입력:");
    scanf("%d"&num);
 
    printf("\n*** 피보나치 수열 ***\n");
 
    printf("%d,%d", fibo_1, fibo_2);
 
    for (i = 2; i < num; i++)
    {
        fibo = fibo_1 + fibo_2;  //앞의 두 피보나치값 더해서 현재 피보나치 구함
        printf(",%d", fibo);
        fibo_1 = fibo_2;  //앞의 피보나치를 구할 때 2번째 값을 1번째 값으로 변경
        fibo_2 = fibo;  //현재 피보나치 값을 다음 피보나치를 구하기 위한 2번째 값으로 변경
    }
    printf("입니다.\n");
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

 

 

문제 24: 자연수 두 개 입력받은 후, 최대 공약수를 구하는 프로그램을 while문을 이용해 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main()
{
    int x, y, r, temp;
    printf("두 개의 정수를 입력하시오:");
    scanf("%d %d"&x, &y);
 
    if (x < y) //y가 더 크면 큰 수를 x로 변경
    {
        temp = x;
        x = y;
        y = temp;
    }
    while (1)
    {
        if (y == 0)
        {
            printf("최대 공약수는 %d입니다.", x);
            break;
        }
        r = x % y;
        x = y;
        y = r;
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

 

무한루프 사용해서 y값이 0이 될때까지 x와 y값을 조절하여

y==0일 때 x값이 최대공약수, 무한루프 탈출

+ Recent posts