01. 가끔은 일정한 시간 동안 아무 일도 하지 않으면서 시간을 지연시킬 목적으로 반복문을 사용하기도 한다. 사용자에게서 하나의 수를 입력받아서 변수에 저장한다. 반복문을 사용하여 이 변수의 값을 1씩 감소시키면서 이 변수의 값이 0이 될 때까지 반복한다. 반복이 끝나면 벨소리를 낸다.

#include <stdio.h>
int main() {
int sec;
printf("카운터의 초기값을 입력하시오 (단위: 초): ");
scanf("%d", &sec);
for (int i = sec; i > 0; i--) {
printf("%d ", i);
}
}
02. 1부터 100사이의 모든 3의 배수의 합을 계산하여 출력하는 프로그램을 반복 구조를 사용하여 작성하라.
#include <stdio.h>
int main() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 3 == 0) {
sum += i;
}
}
printf("1부터 100 사이의 모든 3의 배수의 합은 %d입니다.", sum);
}
03. 사용자가 입력한 정수 3개의 합을 계산하여 출력한다. 다만 사용자가 음수를 입력하면 이것은 합계에서 제외된다.
#include <stdio.h>
int main() {
int a, i = 0, sum = 0;
while (i < 3) {
printf("숫자를 입력하시오: ");
scanf("%d", &a);
if (a < 0) {
continue;
}
i++;
sum += a;
}
printf("\n합계는 %d입니다.", sum);
}
04. 사용자가 입력한 정수의 모든 약수를 화면에 출력하는 프로그램을 작성하라.
#include <stdio.h>
int main() {
int a;
printf("정수를 입력하시오: ");
scanf("%d", &a);
printf("약수: ");
for (int i = 1; i <= a; i++) {
if (a % i == 0) {
printf("%d ", i);
}
}
}
05. 실수의 거듭 제곱값을 계산하는 프로그램을 작성하여 보자. 사용자로부터 하나의 실수 r와 거듭 제곱 횟수를 나타내는 정수 n을 입력받아서 r^n을 구하여 화면에 출력한다.
#include <stdio.h>
int main() {
double r, n, result = 1;
printf("실수의 값을 입력하시오: ");
scanf("%lf", &r);
printf("거듭 제곱 횟수를 입력하시오: ");
scanf("%lf", &n);
for (int i = 0; i < n; i++) {
result *= r;
}
printf("결과값은 %lf", result);
}
06. 1^2 + 2^2 + 3^2 + ... + n^2의 값을 계산하여 출력하여보자.
#include <stdio.h>
int main() {
int n, result = 0;
printf("n의 값을 입력하시오: ");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
result += i * i;
}
printf("계산값은 %d", result);
}
07. 반복 루프를 사용하여 다음과 같은 패턴을 출력하는 프로그램을 작성하라.

#include <stdio.h>
int main() {
for (int i = 1; i <= 7; i++) {
for (int j = 1; j <= 7 - i; j++) {
printf(" ");
}
for (int j = 1; j <= i; j++) {
printf("*");
}
printf("\n");
}
}
08. 중천 반복문을 사용하여서 다음과 같이 출력하는 프로그램을 작성하여 보자.

#include <stdio.h>
int main() {
int n;
printf("정수를 입력하시오: ");
scanf("%d", &n);
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
printf("%d ", j);
}
printf("\n");
}
}
09. 사용자가 입력한 두 숫자의 최소공배수를 계산하는 프로그램을 작성한다. 두 정수의 최소공배수는 가장 적은 공배수이다. 예를 들어, 72와 120의 LCM은 360이다.

#include <stdio.h>
int main() {
int a, b, r;
printf("정수 2개를 입력하시오: ");
scanf("%d %d", &a, &b);
printf("\n");
r = (a >= b) ? a : b;
while (1) {
if ((r % a == 0) && (r % b == 0)) {
break;
}
r++;
}
printf("\n최소공배수는 %d입니다. ", r);
}
#include <stdio.h>
int main() {
int r;
int a, b;
printf("정수 2개를 입력하시오: ");
scanf("%d %d", &a, &b);
r =(a > b) ? a : b;
while (r % a != 0 || r % b != 0) {
r++;
}
printf("최소공배수는 %d입니다.", r);
}
10. 2와 100 사이에 있는 모든 소수(prime number)를 찾는 프로그램을 작성하라. 정수가 소수가 되려면 1과 자기 자신만을 약수로 가져야 한다.

#include <stdio.h>
int main() {
int a; // 소수인지 아닌지 판단 기준
for (int i = 2; i <= 100; i++) {
a = 1; // 소수
for (int j = 2; j < i; j++) {
if (i % j == 0) {
a = 0; // 소수가 아님
}
}
if (a == 1) {
printf("%d ", i);
}
}
}
11. 자동차의 연료 탱크 프로그램을 시뮬레이션하여보자. 초기값이 100리터이고, 연료 탱크의 최대 용량은 500리터이다. 사용자가 주행을 하면 연료가 줄어든다. 반복문을 사용하여서 사용자로부터 충전 또는 사용한 연료를 입력받아서 연료 탱크에 남아 있는 연료가 20리터 미만이면 경고를 출력한다.

#include <stdio.h>
int main() {
int fuel = 100, a;
while (1) {
printf("현재 연료량: %d \n", fuel);
if (fuel <= 0){
printf("연료가 고갈되었습니다. \n");
break;
}
else if (fuel < 20) {
printf("(경고) 연료가 20리터 미만입니다.\n");
}
printf("연료 충전은 +, 소모는 -로 입력해주세요: ");
scanf("%d", &a);
printf("\n");
fuel += a;
}
}
12. 컴퓨터는 막대 그래프를 그리는 데도 사용된다. 사용자로부터 1부터 50사이의 숫자를 입력받아서 숫자만큼의 별표를 출력하는 프로그램을 작성하라. 막대는 가로로 그려지게 된다.

#include <stdio.h>
int main() {
int a;
while (1) {
printf("막대의 높이(종료:-1): ");
scanf("%d", &a);
if (a < 0) {
break;
}
for (int i = 0; i < a; i++) {
printf("*");
}
printf("\n");
}
}
13. (1+2+3+...+n)가 10000을 넘지 않으면서 가장 큰 값과 그 때의 n의 값을 구하라.

#include <stdio.h>
int main() {
int sum = 0, i = 0;
while (sum < 10000) {
i++;
sum += i;
}
sum -= i;
i--;
printf("1부터 %d까지의 합은 %d입니다.", i, sum);
}
14. 피보나치 수열은 다음과 같이 정의되는 수열이다.
f0=0
f1=1
fi+1=fi+fi-1 for i=1,2,...
피보나치 수열에서는 앞의 2개의 원소를 합하여 뒤의 원소를 만든다. 피보나치 수열은 컴퓨터에서도 탐색 문제 등에 사용되기도 한다. 피보나치 수열을 생성하여 출력하는 프로그램을 작성하여 보자.
#include <stdio.h>
int main() {
int n;
int a = 0, b = 1, c;
printf("몇번째 항까지 구할까요? ");
scanf("%d", &n);
for (int i = 0; i <= n; i++) {
printf("%d, ",a);
c = a + b;
a = b;
b = c;
}
}
15. 서로 다른 n개에서 r개를 택하여 일렬로 나열하는 방법의 수를 순열(permutation)이라 하고, nPr로 표시한다. 순열은 다음과 같은 식을 이용하여 구할 수 있다. 순열을 구하는 프로그램을 작성하라. n과 r은 사용자가 입력할 수 있도록 하라.
nPr=n(n-1)(n-2)...(n-r+1)
#include <stdio.h>
int main() {
int n, r, result = 1;
printf("n의 값: ");
scanf("%d", &n);
printf("r의 값: ");
scanf("%d", &r);
for (int i = n; i >= (n - r + 1); i--) {
result *= i;
}
printf("순열의 값은 %d입니다.", result);
}
#include <stdio.h>
int main() {
int n, r;
printf("n의 값: ");
scanf("%d", &n);
printf("r의 값: ");
scanf("%d", &r);
int result = 1;
for (int i = 0; i < r; i++) {
result *= (n - i);
}
printf("순열의 값은 %d입니다.", result);
}
16. 사용자가 입력한 특정한 정수의 자리수를 반대로 출력하는 프로그램을 작성하라. 예를 들어서 사용자가 정수 1206을 입력하였다면 6021이 출력되어야 한다. do...while 문을 사용하여 보라.

#include <stdio.h>
int main() {
int a;
printf("정수를 입력하시오: ");
scanf("%d", &a);
while (a > 0) {
printf("%d", a % 10);
a /= 10;
}
}
17. 앞장에서 간단한 정수 계산기를 만들어본 적이 있다. 이 계산기 프로그램에 메뉴를 추가하도록 한다. 다음과 같은 메뉴를 화면에 출력하고 사용자가 메뉴 중에서 하나를 선택할 때까지 반복을 계속한다. 만약 사용자가 A, S, M, D, Q가 아닌 다른 문자를 입력하면 "연산을 선택하시오:" 메시지를 계속해서 출력한다. 하나의 메뉴가 선택되면 해당되는 연산을 실행하고 다시 메뉴를 선택할 수 있도록 하라.
#include <stdio.h>
int main() {
char c;
int a, b, result;
do {
printf("***************\n");
printf("A---- Add\n");
printf("S---- Subtract\n");
printf("M---- Multiply\n");
printf("D---- Divide\n");
printf("Q---- Quit\n");
printf("***************\n");
printf("연산을 선택하시오: ");
scanf("%c", &c);
if (c == 'Q') {
break;
}
printf("두 수를 공백으로 분리하여 입력하시오: ");
scanf("%d %d", &a, &b);
if (c == 'A') {
printf("%d \n", a + b);
}
else if (c == 'S') {
printf("%d \n", a - b);
}
else if (c == 'M') {
printf("%d \n", a * b);
}
else if (c == 'D') {
printf("%d \n", a / b);
}
else {
printf("지원되지 않는 연산자입니다. \n");
}
} while (1);
}
18. 사용자로부터 n을 입력받아서 조화 수열의 합을 표시하는 프로그램을 C로 작성해보자. 조화 수열은 각 항의 역수가 등차 수열을 이루는 수열로서 각 항은 점차 작아져서 0에 한없이 가까워지지만, 그 역 수의 합은 무한대가 된다고 알려져 있다. 사실일까? 컴퓨터로 천만개까지 계산해보자. (조건문 초기식 주의)
#include <stdio.h>
int main() {
int n;
double result = 0;
printf("항의 개수: ");
scanf("%d", &n);
for (int i = 1; i <= n; i++) { // 초기식이 i = 0; 이면 안된다
result += 1.0 / i;
}
printf("수열의 합=%lf", result);
}
19. 몬테카를로 시뮬레이션을 이용하여 파이의 값을 계산하여보자. 몬테카를로 시뮬레이션은 난수를 이용하여 수학적인 문제나 물리학적인 문제를 해결하는 기법이다 아래와 같이 사각형과 원을 그리고난수를 생성하여서 그림 위에 찍는다(프로그램에서 실제로 그림을 그리는 것은 아니다.) 원의 반지름은 1이라고 하자. 그러면 원의 면적은 PI이고 사각형의 면적은 4이다. 따라서 점이 원 내부에 찍힐확률은 (원의 면적)/(사각형의 면적)=PI / 4가 된다. 따라서 점을 1,000,000개 정도 찍으면 우리는 파이의 값을 꽤 정확하게 추정할 수 있다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int main() {
int p, p_in = 0;
double x, y, pi;
srand(time(NULL));
printf("반복 횟수: ");
scanf("%d", &p);
for (int i = 0; i < p; i++) {
x = (double)rand() / RAND_MAX * 2.0 - 1.0; // -1과 1 사이의 난수
y = (double)rand() / RAND_MAX * 2.0 - 1.0; // -1과 1 사이의 난수
if (x * x + y * y <= 1.0) { // 점이 원 안에 있는지 확인
p_in++;
}
}
// 파이 추정값 계산
pi = (double)p_in /p * 4.0;
printf("추정된 파이 값: %lf\n", pi);
}
20. NIM 게임을 구현하여보자. 스틱들의 뭉치를 가정한다. 사용자와 컴퓨터는 번갈아서 스틱 뭉치에서 0개에서 3개 사이로 스틱을 가져갈 수 있다. 마지막 스틱을 가져가는 사람이 지는 게임이다. 스틱의 초기 개수는 12개라고 하자. NIM 게임에서는 전략이 있으나 여기서는 전략은 전혀 고려하지 않는다. 컴퓨터는 무조건 0부터 3 사이의 난수를 발생시켜서 스틱을 가져간다. 발생된 난수가 현재 스틱 개수보다 크면 스틱 개수로 제한한다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned)time(NULL));
int stick = 12;
int user, com;
int can_stick = 4;
while (1) {
printf("현재 스틱의 개수: %d \n", stick);
printf("몇개의 스틱을 가져가시겠습니까? : ");
scanf("%d", &user);
if (user < 1 || user > 3) {
printf("1개부터 3개까지 가능합니다. \n");
continue;
}
stick -= user;
if (stick == 0) {
printf("컴퓨터가 승리 했습니다. \n");
break;
}
if (stick < 3) {
can_stick = stick+1; // stick+1 -> 0 ~ stick 범위 / stick -> 0 ~ (stick-1) 범위
}
com = rand() % can_stick;
stick -= com;
printf("컴퓨터는 %d개의 스틱을 가져갔습니다. \n\n", com);
if (stick == 0) {
printf("유저가 승리 했습니다.\n");
break;
}
}
}
21. 우리는 앞에서 컴퓨터가 숨기고 있는 숫자를 사람이 맞히는 프로그램을 살펴보았다. 이번에는 반대로 하여보자. 사용자가 숨기고 있는 숫자를 컴퓨터가 알아맞히는 프로그램을 작성해보자. 게임 도중에 사용자는 숫자를 변경하면 안된다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int com, res;
int max, min;
max = 100;
min = 1;
printf("컴퓨터가 당신이 생각하는 숫자를 알아맞히는 게임입니다.\n");
printf("하나의 숫자를 생각하세요. \n");
printf("컴퓨터가 제시한 숫자보다 정답이 높으면 1, 낮으면 -1라고 하세요. \n");
printf("컴퓨터가 숫자를 맞히면 0라고 하세요. \n\n");
do {
com = (max + min) / 2;
printf("숫자가 %d 인가요? ", com);
scanf("%d", &res);
if (res == 1) {
min = com + 1;
}
else if (res == -1) {
max = com - 1;
}
} while (res != 0);
}
'C' 카테고리의 다른 글
[쉽게 풀어쓴 C언어 Express 개정 4판] 9장 Programming (2) | 2024.10.03 |
---|---|
[쉽게 풀어쓴 C언어 Express 개정 4판] 8장 Programming (1) | 2024.10.03 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 6장 Programming (1) | 2024.10.01 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 5장 Programming (0) | 2024.09.27 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 4장 Programming (1) | 2024.09.27 |