
Unit 29. do while 반복문으로 최소 한 번은 실행하기
초기식
do // ↓ 루프 본체(loop body) 및 변화식
{
반복할 코드
변화식
} while (조건식);
// ↑ 루프 선언문(loop statement)
먼저 초기식의 값과는 상관 없이 do { } 부분의 코드와 변화식을 무조건 실행한다. 그 다음 조건식을 판별하여 참이면 코드를 계속 반복하고 거짓이면 반복문을 끝낸 뒤 다음 코드를 실행한다.
즉, do while은 while과 달리 코드를 최소 한 번은 실행한다.
29.1 do while 반복문 사용하기
#include <stdio.h>
int main()
{
int i = 0;
do // 처음 한 번은 아래 코드가 실행됨
{
printf("Hello, world! %d\n", i); // Hello, world!와 i의 값을 함께 출력
i++; // i를 1씩 증가시킴
} while (i < 100); // i가 100보다 작을 때 반복. 0부터 99까지 증가하면서 100번 반복
return 0;
}
먼저 반복문에 사용할 변수를 선언한 뒤 0으로 초기화한다. 그리고 do 아래에 중괄호를 열고 반복할 코드와 변화식을 넣는다. 마지막으로 중괄호를 닫은 뒤 while에 조건식을 지정하고 세미콜론을 붙여주면 된다.
do while은 처음 한 번은 실행해야 하며 그 이후에는 조건에 따라 반복해야 하는 코드를 간단하게 표현할 수 있다.
* 초깃값을 1로 지정해서 100보다 같거나 작을 때까지 100번 반복할 수도 있다.
* 초깃값을 크게 주고, 변수를 감소시키면서 반복할 수도 있다.
29.4 입력한 횟수대로 반복하기
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
int count;
scanf("%d", &count); // 값을 입력받음
do // 처음 한 번은 아래 코드가 실행됨
{
printf("Hello, world! %d\n", count); // Hello, world!와 i의 값을 함께 출력
count--; // count를 1씩 감소시킴
} while (count > 0); // count가 0보다 클 때 반복
return 0;
}
다음은 초깃값을 받은 뒤 초깃값만큼 출력한 것이다.
여기서는 i를 선언하지 않고 count를 바로 사용하므로 변화식은 count--로 지정하여 반복문이 실행될 때마다 count를 감소시킨다. 마지막으로 while에서 조건식을 count > 0과 같이 지정하여 count에 들어있는 값만큼 반복하도록 하였다.
29.5 반복 횟수가 정해지지 않은 경우
다음은 do while 반복문 안에서 무작위로 정수를 생성한 뒤 3이 나오면 반복을 끝낸다.
#include <stdio.h>
#include <stdlib.h> // srand, rand 함수가 선언된 헤더 파일
#include <time.h> // time 함수가 선언된 헤더 파일
int main()
{
srand(time(NULL)); // 현재 시간값으로 시드 설정
int i = 0;
do
{
i = rand() % 10; // rand 함수를 사용하여 무작위로 정수를 생성한 뒤 10 미만의 숫자로 만듦
printf("%d\n", i);
} while (i != 3); // 3이 아닐 때 계속 반복
return 0;
}
실행 결과는 다음과 같다.
1
5
6
3
↑ 무작위 생성이므로 실행할 때마다 달라짐
do 부분에서 최소 한 번은 무작위로 정수를 생성하여 출력한다. 그 다음에 조건식 i != 3에 따라 i가 3이 아니면 계속 반복한다.
while 반복문과 마찬가지로 do while 반복문도 반복 횟수가 정해지지 않았을 때 주로 사용한다. 단, while 반복문과는 달리 최소 한 번은 실행된다는 점이 차이가 있다.
* while문과 마찬가지로 조건식에 1을 지정하면 무한히 반복하는 무한 루프가 만들어진다.
* while에 조건식 대신 0을 지정하면 코드를 한번 만 실행할 수 있게 된다.
Unit 30. break, continue로 반복문 제어하기
break는 for, while, do while, switch 문법에서 제어흐름을 벗어나기 위해 사용한다.
continue는 제어흐름(반복)을 유지한 상태에서 코드의 실행만 건너뛰는 역할을 한다.
30.1 break로 반복문 끝내기
#include <stdio.h>
int main()
{
int num1 = 0;
while (1) // 무한 루프
{
num1++; // num1을 1씩 증가시킴
printf("%d\n", num1);
if (num1 == 100) // num1이 100일 때
break; // 반복문을 끝냄. while의 제어흐름을 벗어남
}
return 0;
}
while에 1을 지정하여 무한 루프를 만들고 그 안에서 num1을 1씩 증가시키고 if를 이용하여 num1이 100이 될 때 break를 실행한다. 이렇게 하면 무한 루프라도 1부터 100까지만 화면에 출력한다.
30.2 continue로 코드 실행 끝내기
#include <stdio.h>
int main()
{
for (int i = 1; i <= 100; i++) // 1부터 100까지 증가하면서 100번 반복
{
if (i % 2 != 0) // i를 2로 나누었을 때 나머지가 0이 아니면 홀수
continue; // 아래 코드를 실행하지 않고 건너뜀
printf("%d\n", i);
}
return 0;
}
for를 사용하여 1부터 100까지 반복한다. 그리고 if를 사용하여 i가 짝수이면 printf가 실행되어 숫자가 출력되고, 홀수이면 continue가 실행되어 printf를 실행하지 않는다.
30.3 입력한 횟수대로 반복하기
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
int count;
scanf("%d", &count); // 값을 입력받음
int i = 1;
while (1) // 무한 루프
{
printf("%d\n", i);
if (i == count) // i가 입력받은 값과 같을 때
break; // 반복문을 끝냄
i++;
}
return 0;
}
scanf 함수로 입력 값을 받아서 count 변수에 저장했다. 그리고 while에 1을 지정하여 무한 루프로 만든 뒤 반복문 안에서는 i의 값을 출력하고, i가 count의 값과 같으면 break를 실행해 반복문을 빠져나온다.
Unit 31. 계단식으로 별 출력하기
31.1 중첩 루프 사용하기
반복문 안에 반복문이 들어가는 형태를 중첩 루프(다중 루프)라고 한다.
i를 사용하는 바깥쪽 루프는 세로 방향을 처리하고, j를 사용하는 안쪽 루프는 가로 방향을 처리한다.
31.2 사각형으로 별 출력하기
#include <stdio.h>
int main()
{
for (int i = 0; i < 5; i++) // 5번 반복. 바깥쪽 루프는 세로 방향
{
for (int j = 0; j < 5; j++) // 5번 반복. 안쪽 루프는 가로 방향
{
printf("*"); // 별 출력
}
printf("\n"); // 가로 방향으로 별을 다 그린 뒤 다음 줄로 넘어감
}
return 0;
}
위 소스 코드의 실행 결과는 다음과 같다.
*****
*****
*****
*****
*****
바깥쪽의 for (int i = 0; i < 5; i++) 반복문은 안쪽 for (int j = 0; j < 5; j++) 반복문을 실행하면서 별을 5개씩 그린다. 그리고 printf로 제어 문자 \n을 출력한 뒤 다음 줄에서 다시 별을 5개씩 그린다. 이렇게 반복하면서 별을 5개씩 5줄 쌓아나간다.
31.3 계단식으로 별 출력하기
#include <stdio.h>
int main()
{
for (int i = 0; i < 5; i++) // 5번 반복. 세로 방향
{
for (int j = 0; j < 5; j++) // 5번 반복. 가로 방향
{
if (j <= i) // 세로 방향 변수만큼
printf("*"); // 별 출력
}
printf("\n"); // 가로 방향으로 별을 다 그린 뒤 다음 줄로 넘어감
}
return 0;
}
위 소스 코드의 실행 결과는 다음과 같다.
*
**
***
****
*****
계단식으로 출력할 때는 별을 출력하지 않는 부분이 있으므로 조건문으로 printf를 제어해야 한다.
이때, 별의 개수는 세로 방향인 줄의 위치에 비례하므로 조건식도 세로 방향 변수 i에 맞추어 작성한다.
즉, 조건식은 if (j <= i)와 같이 작성하여 가로 방향(j)으로 별을 출력할 때는 세로 방향(i)의 변수만큼 출력하면 된다.
31.4 대각선으로 별 출력하기
#include <stdio.h>
int main()
{
for (int i = 0; i < 5; i++) // 5번 반복. 세로 방향
{
for (int j = 0; j < 5; j++) // 5번 반복. 가로 방향
{
if (j == i) // 세로 방향 변수와 같을 때
printf("*"); // 별 출력
else // 세로 방향 변수와 다를 때
printf(" "); // 공백 출력
}
printf("\n"); // 가로 방향으로 별을 다 그린 뒤 다음 줄로 넘어감
}
return 0;
}
위 소스 코드의 실행 결과는 다음과 같다.
*
*
*
*
*
가로 방향 변수와 세로 방향 변수가 같을 때만 별을 출력하면 왼쪽 위에서 오른쪽 아래 방향으로 별이 출력될 것이다.
그런데, 콘솔에서는 문자 출력을 하지 않으면 다음 문자는 이전 위치에 출력되므로 모두 왼쪽으로 몰리게 된다.
따라서 별을 출력하지 않는 부분에서 printf로 공백을 출력해주어야한다.
-> 가로 방향과 세로 방향의 변수 값이 같을 때 별을 출력하고, 같지 않을 때는 공백을 출력하였다.
'Programming Languages > C' 카테고리의 다른 글
[P4C] CodeUp 1079 : [기초-종합] 원하는 문자가 입력될 때까지 반복 출력하기 (0) | 2021.02.25 |
---|---|
[P4C] C언어 코딩 도장 : UNIT 32 ~ UNIT 33 (0) | 2021.02.21 |
[P4C] C언어 코딩 도장 : UNIT 26 ~ UNIT 28 (0) | 2021.02.20 |
[P4C] C 언어 코딩 도장 : 문제 풀이3 (0) | 2021.02.19 |
[P4C] C언어 코딩 도장 : UNIT 23 ~ UNIT 25 (0) | 2021.02.19 |