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;
}
- 출력
*
**
***
****
*****