본문 바로가기

Programming languages/C

5. C언어(반복문)

728x90
반응형

반복문은 동일한 처리과정을 되풀이하기 위해 필요하다. 만약의 30명의 성적의 평균을 구하려면 최소 30번 이상의 연산이 필요하다. 이때 반복문이 없다면 우리는 최소 30줄 이상이 필요하다. 이는 코드의 가독성을 떨어뜨린다. 따라서 우리는 반복문을 사용할 수 있다.

 

while)

while은 ~할 때까지 라는 뜻을 가지고 있다. 즉 while문 안에 조건식에 대해서 참일 때만 작동한다.

만약 while(i<3) 이면 i가 3 미만일 때만 작동한다.

#include <stdio.h>

int main()
{
    int meter=0;
    int i = 0;

    while(i <= 10) //i의 범위 지정
    {
        meter = i*1609;
        printf("%d마일은 %d미터 입니다.\n",i,meter);
        i++;//i의 값 증가
    }
    return 0;
}

위의 문장에서 i가 증가할때 10보다 커지게 되면 조건식에 거짓이 되기 때문에 반복문을 탈출한다.

#include <stdio.h>

int main()
{
    int n = 0;
    printf("n을 입력하시오: ");
    scanf("%d",&n);

    int i = 1;
    int s = 0;
    while (i <=n)
    {
        s = s + i;
        i++;
    }
    printf("1부터 n까지의 합은: %d",s);

    return 0;
}

위는 1부터 n까지의 연속된 숫자의 합이다.

#include <stdio.h>

int main()
{
    int n = 0;

    int s = 0;

    while (n >= 0)
    {
        printf("음수를 입력하면 종료합니다.\n");
        printf("더하고자 하는 n을 입력하시오: ");
        scanf("%d",&n);

        if (n>=0)
            s = s + n;
    }
    printf("입력받은 수의 합은: %d",s);

    return 0;
}

위 프로그램에 센티넬 이라는 보초 값을 넣어줘서 특정 조건일 때 반복문을 탈출할 수 있게 만든 것이다.

위는 음수를 입력 받으면 반복문을 종료하는 형태이다. 다만 위의 형태보다는 조건문을 만족하면 break로 탈출하는 형태를 조금 더 선호한다. 그게 본인은 덜 헷갈리기 때문이다.

 

#include <stdio.h>

int main()
{
    int n = 0;

    int min_value = 999999;

    printf("수를 입력하세요, 종료는 command + d 입니다.\n");
    while(scanf("%d",&n) != EOF)
    {
        if(n<min_value)
            min_value = n;

    }

    printf("입력 받은 수의 최소값은: %d",min_value);
    return 0;
}

while의 조건문 안에 scanf를 넣는 것도 가능하고 EOF는 End of file의 약자로 특정 키 조합을 누르면 더 이상 파일을 입력받지 않겠다는 지정된 명령어이다. 맥북에서는 command + d 윈도에서는 ctrl + z로 알고 있다. 다만 현재 내 m1 pro 맥북 + Clion 조합에서는 EOF를 받은 순간 프로세스 자체가 죽어버리는 issue가 있는 듯하다.

do - while)

do while 문과 while 문의 차이는 조건을 어디서 검사하냐의 차이이다. 즉 프로세스에서 처음으로 do while문이 실행될 때 조건 없이 한 번은 실행할 수 있다는 것이다.

ㅁㅇ

#include <stdio.h>

int main()
{
    int ans = 0;
    printf("정답을 입력하세요: ");
    scanf("%d",&ans);

    int n = 0;
    do{
        printf("숫자를 추측해 보세요: ");
        scanf("%d",&n);

        if(n>ans)
            printf("정답은 추측한 숫자보다 더 작습니다.\n");
        else if(n<ans)
            printf("정답은 추측한 숫자보다 더 큽니다.\n");

    }while (n != ans);
    printf("정답입니다!");

    return 0;
}

위 코드는 술 게임의 일종인 업다운 게임이다. 특정 정답 숫자를 정하고 해당 숫자의 대소 관계를 알려줘서 정답에 수렴하게 하는 것이다.

이때 주의해야 할 점은 조건문을 확인하는 while문에 세미콜론이 들어간다는 것이다. 

for)

for문은 조건에 따라 반복을 하는 것이긴 하지만 아주 제한적이다. 정해진 횟수만큼만 반복하는 구조이다.

while문은 ~할 때까지 반복해라, do while은 해보고 맞으면 반복해라, for문은 n번 반복해라 라는 의미이다.

for문의 구조는 while의 조건식처럼 괄호 안에 변수 선언 및 초기식 설정, 조건식, 증감식을 넣어주면 된다.

 

#include <stdio.h>

int main()
{
    int n = 0;
    printf("숫자를 입력하세요: ");
    scanf("%d",&n);
    int ans = 0;

    for(int i = 1; i <=n; i++)
    {
        ans = ans + i;
    }

    printf("1부터 %d의 합: %d",n,ans);

    return 0;
}

위 코드는 1부터 n까지의 숫자의 합을 나타낸 것이다. 해당 코드는 n번만 실행하면 되기 때문에 for문을 이용하는 것이 적당하다.

for문은 이중,삼중으로 사용하는 것도 가능하지만, time complexity가 지수 scale로 증가하기 때문에 꼭 필요한 상황이거나 데이터의 개수가 적은 것이 아니라면 지양하는 것이 좋다.

위를 보면 for문을 while문으로 바꾸는 것도, while문을 for문으로 바꾸는 것도 가능하다.

위처럼 증감 수식에 다양한 형태로 수식 입력이 가능하고 다양한 형태로 for문을 사용하는 것이 가능함을 볼 수 있다.

break문은 반복문을 탈출할 때 사용된다.

continue문은 특정 문장을 실행했을 때 반복문을 멈추고 싶지만 탈출하고 싶지 않을 때 사용한다.

 

 

728x90
반응형

'Programming languages > C' 카테고리의 다른 글

6. C언어(함수 & 변수)  (0) 2022.08.14
4. C언어(조건문)  (0) 2022.08.09
3. C언어(수식과 연산자)  (0) 2022.08.09
2. C언어(변수와 자료형)  (0) 2022.08.09
1. C언어(기본,함수,자료형)  (0) 2022.08.09