C Study 0005

C언어 공부 0005

반복문

  • 같은 연산을 여러 번 수행할 때, 만약 반복과 같은 기능이 없다면 같은 구문을 수행하려는 만큼 작성해야할 것이다.
  • 따라서, 같은 구문을 반복할 때 이용하는 것이 반복문이다.
  • 그리고 조건문, 반복문, 배열과 포인터 영역이 처음 프로그래밍 언어로 C언어를 공부하는 사람들이 가장 어려워 하는 부분이기에, 조금 더 자세히 다뤄보고자 한다.

while문

  • 주어진 조건식이 만족되는 동안 반복을 실행하는 구문이다.
  • 형태
while(조건식)
{
    수행할 내용
}
#include <stdio.h>

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

    while(i <= 3)
    {
        meter = i * 1609;
        printf("%d mile is %d meters.\n", i, meter);
        i++;
    }
        return 0;
}

Sentinal

  • Sentinal은 보초값이라고 하며, 입력되는 데이터의 끝을 알리는 특수한 값이다.
    • 예를 들어, 자연수만이 입력되는 반복의 환경에서 음수나 0을 이용하여 반복을 멈춘다면, 이는 sentinal이다.
#include <stdio.h>

int main()
{
    int grade = 0, n = 0;
    float sum = 0, average = 0;

    printf("성적 입력을 종료하려면 음수를 입력하시오\n");

    while(grade >= 0)
    {
        printf("성적을 입력하시오: ");
        scanf("%d", &grade);

        sum += grade;
        n++;
    }

    sum -= grade; // 마지막 데이터를 제거
    n--; // 마지막 데이터를 제거했으므로, 데이터의 수를 1 감소

    average = sum / n;

    printf("성적의 평균은 %f입니다.\n", average);

    return 0;
}

do-while문

  • while문과 달리 우선 반복하고자 하는 내용을 한 번 먼저 실행한 후에 조건을 검사하여 반복여부를 결정
  • 형태
do
{
    수행할 내용
} while(조건식);
#inlcude <stdio.h>

int main()
{
    int n = 0;

    do
    {
      printf("%d\n", n);
      n += 3;
    } while(n < 10);

    return 0;
}

for문

  • 조건식(주로 횟수와 관련)이 만족되는 동안 반복을 실행하며, 반복 횟수의 조절을 위해 증감이 사용된다.
  • 형태
for(초기식; 조건식; 증감식)
{
    수행할 내용
}
#include <stdio.h>

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

    for(i = 1; i <= 10; i++)
    {
        sum += i;
    }

    printf("Summation from 1 to 10 is %d\n", sum);

    return 0;
}

break와 continue

  • break;는 반복 루프를 빠져 나오는데 사용된다.
for(i = 1; i <= 10; i++)
{
    printf("%d ", i);

    if(i == 5)
    {
        break;
    }
}
  • continue;는 현재의 반복을 중단하고 다음 반복을 시작하게 한다.
for(i = 1; i <= 10; i++)
{
    if(i % 2 == 0)
    {
        continue;
    }

    printf("%d ", i);
}

Infinite Loop

  • 반복을 제어하는 조건식이 항상 만족을 하게 된다면, 반복은 끝없이 실행된다.
    • 사실, 영원한 반복을 하기는 거의 불가능 할 것이며, 메모리 에러로 실행이 중단된다.
  • 자주 사용되는 무한반복의 형태
while(1)
{
    실행할 내용
}

Nested Loop

  • 반복문은 중첩하여 사용할 수 있다.
for(i = 0; i < 3; i++)
{
    for(j = 0; j < 3; j++)
    {
        printf("(%d, %d) ", i, j);
    }

    printf("\n");
}

예제를 통한 반복문 연습

1부터 n까지 정수의 합 구하기

  • 코드
#include <stdio.h>

int main()
{
    int sum = 0; // 합이 저장될 변수
    int n = 5;
    int i = 1;

    while(i <= n)
    {
        sum = sum + i;
        i++;
    }

    printf("Summation 1 to %d is %d.\n", n, sum);

    return 0;
}
  • 출력
15

1부터 100까지의 정수 중, n의 배수와 그 개수 구하기

  • 코드
#include <stdio.h>

int main()
{
    int n = 23;
    int i = 1;
    int div = 0;
    int divCount = 0;

    while(div <= 100)
    {
        div = i * n;
        printf("%d ", div);
        divCount++, i++;
    }

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

    return 0;
}
  • 출력
23 46 69 92
4

구구단 n단 출력하기

  • 코드
#include <stdio.h>

int main()
{
    int n = 4;
    int i = 1;

    while(i <= 9)
    {
        printf("%d x %d = %d\n", n, i, n * i);
    }

    return 0;
}
  • 출력
4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36

n!(factorial) 구하기

  • 코드
#include <stdio.h>

int main()
{
    int n = 4;
    int factorial = 1;
    int i = 1;

    while(i <= n)
    {
        factorial = factorial * i;
    }

    printf("%d! = %d\n", n, factorial);

    return 0;
}
  • 출력
24

잔고가 원금의 두 배가 되는 해 구하기

  • 코드
#include <stdio.h>

int main()
{
    float initial = 100;
    float initial_x2;
    float rate = 3.2;
    int year = 0;

    initial_x2 = initial * 2;

    while(initial_x2 >= initial)
    {
        initial = initial * (1.0 + rate / 100.0);
        year++;
    }

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

    return 0;
}
  • 출력
23

주어진 값이 소수인지 검사하기

  • 코드
#include <stdio.h>

int main()
{
    int n = 23;
    int i = 2;

    while(i <= n - 1)
    {
        if(n % i == 0)
        {
            printf("%d is not prime number.");
            return 1; // 프로그램 실행을 마침
        }

        i++;
    }

    printf("%d is prime number.");

    return 0;
}
  • 출력
23 is prime number.

피보나치 수열의 n번째 값 구하기

  • 코드
#include <stdio.h>

int main()
{
    int n = 6;
    int fib1 = 1;
    int fib2 = 1;
    int fibN;
    int i = 3;

    if(n == 1 || n == 2)
    {
        printf("%d\n", fibN);
        return 1; // 프로그램 실행을 마침
    }
    while(i <= n)
    {
        fibN = fib1 + fib2;
        fib1 = fib2;
        fib2 = fibN;
        i++;
    }

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

    return 0;
}
  • 출력
8

월의 시작일의 요일과 마지막 날이 주어지면 달력을 출력하기

  • 코드
#include <stdio.h>

int main()
{
    int wd_start = 3; // 시작요일 / 0: M, 1: T, 2: W, 3: T, 4: F, 5: S, 6: S
    int last_date = 30; // 마지막 날

    int i = 1 - wd_start;
    int j = wd_start; // 줄 바꿈을 위한 변수

    printf("  M  T  W  T  F  S  S\n");

    while(i <= last_date)
    {
        if(i <= 0) // 날짜가 -인 경우는 없음
        {
            printf("   "); // 공백 출력
        }
        else
        {
            printf("%3d", i);
            j++;
        }

        if(j % 7 == 0) // 7개의 날짜를 출력한 경우
        {
            printf("\n"); // 줄 바꿈
        }

        i++;
    }

    return 0;
}
  • 출력
  M  T  W  T  F  S  S
           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

*을 이용하여 오른쪽으로 한 칸씩 올라가는 최대 n칸 높이의 계단 출력하기

  • 코드
#include <cstdio>

int main()
{
	int n = 5;
    int i, j;

	for(i = 0; i < n; i++)
	{
		for(j = 0; j < n; j++)
		{
			if(j < n - i - 1)
			{
				printf(" ");
			}
			else
			{
				printf("*");
			}
		}
		printf("\n");
	}

    return 0;
}
  • 출력
    *
   **
  ***
 ****
*****

Reference

0%