01 가끔은 일정한 시간 동안 아무 일도 하지 않으면서 시간을 지연시킬 목적으로 반복문을 사용하기도 한다. 사용자에게서 하나의 수를 입력받아서 변수에 저장한다. 반복문을 사영하여 이 변수의 값을 1씩 감소시키면서 이 변수의 값이 0이 될 때까지 반복한다. 반복이 끝나면 벨소리를 낸다.
#include <stdio.h>
int main()
{
int count;
printf("카운터의 초기값을 입력하시오: ");
scanf("%d", &count);
for (; count >= 0; count--)
{
printf("%d ", count);
}
printf("\a\n");
return 0;
}
꼭 for 문 내에서 int i 를 선언/초기화할 필요는 없다.
02 1부터 100사이의 모든 3의 배수의 합을 계산하여 출력하는 프로그램을 반복 구조를 사용하여 작성하라.
#include <stdio.h>
int main()
{
int sum = 0;
for (int i = 0; i < 100; i++)
{
if ( i % 3 == 0)
sum += i;
}
printf("1부터 100 사이의 모든 3의 배수의 합은 %d입니다.\n", sum);
}
i를 3씩 늘려도 되고, 위처럼 3으로 나누어 떨어지는지 확인하는 로직을 사용해도 된다.
03 사용자가 입력한 정수의 모든 약수를 화면에 출력하는 프로그램을 작성하라.
#include <stdio.h>
int main()
{
int num, i = 0;
printf("정수를 입력하시오: ");
scanf("%d", &num);
printf("약수: ");
do
{
i++;
if (num % i == 0)
printf("%d ", i);
} while (i <= num);
printf("\n");
return 0;
}
2번와 사실상 똑같은 문제. 다만, 차별화를 위해 do-while로 풀이했다.
04 반복 루프를 사용하여 다음과 같은 패턴을 출력하는 프로그램을 작성하라.
#include <stdio.h>
int main()
{
int num = 6;
for (int i = 0; i <= num; i++)
{
for (int j = num - i; j > 0; j--)
{
printf(" ");
}
for (int k = 0; k <= i; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
라인 번호 | 공백 | 별 |
0 | 6 | 1 |
1 | 5 | 2 |
2 | 4 | 3 |
3 | 3 | 4 |
4 | 2 | 5 |
5 | 1 | 6 |
6 | 0 | 7 |
출력된 코드에 사용되는 문자들의 갯수를 분석하면 위 테이블과 같다.
이렇게 표를 만들면 패턴이 보이고, 이를 고려하면 어떻게 코딩을 해야될지 보이기 때문에 이런 방법을 추천한다.
05 중첩 반복문을 사용하여서 다음과 같이 출력하는 프로그램을 작성하여 보자.
#include <stdio.h>
int main()
{
int num;
printf("정수를 입력하시오: ");
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
for (int j = 0; j <= i; j++)
{
printf("%d ", j + 1);
}
printf("\n");
}
return 0;
}
06 앞장에서 간단한 정수 계산기를 만들어본 적이 있다. 이 계산기 프로그램에 메뉴를 추가하도록 한다. 다음과 같은 메뉴를 화면에 출력하고 사용자가 메뉴 중에서 하나를 선택할 때까지 반복을 계속한다. do...while 반복문을 사용하여 사용자가 적절한 선택을 했는지를 검사하도록 하라. 만약 사용자가 A, S, M, D, Q가 아닌 다른 문자를 입력하면 "연산자를 선택하시오:" 메시지를 계속해서 출력한다. 하나의 메뉴가 선택되면 해당되는 연산을 실행하고 다시 메뉴를 선택할 수 있도록 하라. 반복을 종료하는 메뉴인 Q는 break 문을 이용하여 구현하도록 하라.
#include <stdio.h>
int main()
{
char op;
int n1, n2;
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", &op);
if (op == 'Q')
{
break;
}
else if (op == 'A' || op == 'S' || op == 'M' || op == 'D')
{
printf("두수를 공백으로 분리하여 입력하시오: ");
scanf("%d %d", &n1, &n2);
}
switch (op)
{
case 'A': printf("%d\n", n1 + n2); break;
case 'S': printf("%d\n", n1 - n2); break;
case 'M': printf("%d\n", n1 * n2); break;
case 'D': printf("%d\n", n1 / n2); break;
default: printf("\n");
}
} while (1);
return 0;
}
switch 문을 적절하게 활용하면 코드를 깔끔하고 직관적으로 작성할 수 있다.
07 2와 100 사이에 있는 모든 소수(prime number)를 찾는 프로그램을 작성하라. 정수가 소수가 되려면 1과 자기 자신만을 약수로 가져야 한다.
#include <stdio.h>
int main()
{
int i, j;
for (i = 2; i <= 100; i++)
{
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
break;
}
}
if (i == j)
{
printf("%d ", i);
}
}
return 0;
}
머리가 아플 수도 있는 문제.
나누어 떨어지는 횟수를 카운트하여 2번이상인 경우는 소수가 아니라고 결론을 내리는 방법도 존재한다.
08 컴퓨터는 막대 그래프를 그리는 데도 사용된다. 사용자로부터 1부터 50사이의 숫자를 입력받아서 숫자만큼의 별표를 출력하는 프로그램을 작성하라. 막대는 가로로 그려지게 된다.
#include <stdio.h>
int main()
{
int input;
do
{
printf("막대의 높이(종료: -1): ");
scanf("%d", &input);
if (input == -1)
{
break;
}
else
{
for (int i = 0; i < input; i++)
printf("*");
}
printf("\n");
} while (1);
return 0;
}
09 (1+2+3+...+n)가 10000을 넘지 않으면서 가장 큰 값과 그 때의 n의 값을 구하라.
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
while(1)
{
i++;
sum += i;
if (sum >= 10000)
{
sum -= i--;
break;
}
}
printf("1부터 %d값은 %d\n", i, sum);
return 0;
}
등차수열 공식을 사용하면 n은 140, 총합은 9870가 나와야한다.
코드가 자동으로 계산은 해주겠지만, 적어도 결과가 올바르게 나오는지 확인은 해야한다.
10 실수의 거듭 제곱값을 계산하는 프로그램을 작성하여 보자. 사용자로부터 하나의 실수 r와 거듭 제곱 횟수를 나타내는 정수 n을 입력받아서 r^n을 구하여 화면에 출력한다.
#include <stdio.h>
int main()
{
double input;
double result = 1.0;
int r;
printf("실수의 값을 입력하시오: ");
scanf("%lf", &input);
printf("거듭제곱횟수를 입력하시오: ");
scanf("%d", &r);
for (int i = 1; i <= r; i++)
{
result *= input;
}
printf("결과값은 %lf\n", result);
return 0;
}
11 1^2 + 2^2 + 3^2 + ...n^2의 값을 계산하여 출력하여 보자.
#include <stdio.h>
int main()
{
int n;
int result = 0;
printf("n의 값을 입력하시오: ");
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
result += i * i;
}
printf("계산값은 %d입니다.\n", result);
return 0;
}
12 피보나치 수열은 다음과 같이 정의되는 수열이다.
#include <stdio.h>
int main()
{
int n, c;
int a = 0;
int b = 1;
printf("몇번째 항까지 구할까요? ");
scanf("%d", &n);
for (int i = 0; i <= n; i++)
{
printf("%d, ", a);
c = a + b;
a = b;
b = c;
}
return 0;
}
복잡하기 때문에 직접 손으로도 계산하여 검증해보는 것을 권장한다.
13 서로 다른 n개에서 r개를 택하여 일렬로 나열하는 방법의 수를 순열(permutation)이라고 하고, nPr로 표시한다. 순열은 다음과 같은 식을 이용하여 구할 수 있다. 순열을 구하는 프로그램을 작성하라. n과 r은 사용자가 입력할 수 있도록 하라.
#include <stdio.h>
int main()
{
int n, r;
int nPr = 1;
printf("n의 값: ");
scanf("%d", &n);
printf("r의 값: ");
scanf("%d", &r);
for (int i = n; i >= (n - r - 1); i--)
{
nPr *= i;
}
printf("순열의 값은 %d입니다.\n", nPr);
return 0;
}
14 사용자가 입력한 특정한 정수의 자리수를 반대로 출력하는 프로그램을 작성하라. 예를 들어서 사용자가 정수 1206을 입력하였다면 6021 이 출력되어야 한다. do...while문을 사용하여 보라.
#include <stdio.h>
int main()
{
int num;
printf("정수를 입력하시오: ");
scanf("%d", &num);
do
{
printf("%d", num % 10);
num /= 10;
} while (num > 0);
printf("\n");
return 0;
}
'Drill > 프로그래밍언어' 카테고리의 다른 글
[프로그래밍언어]쉽게 풀어쓴 C언어 Express 7장 반복문 Exercise (0) | 2025.03.01 |
---|---|
[프로그래밍언어]쉽게 풀어쓴 C언어 Express 6장 조건문 Programming (0) | 2025.01.28 |
[프로그래밍언어]쉽게 풀어쓴 C언어 Express 6장 조건문 Exercise (0) | 2025.01.27 |
[프로그래밍언어]쉽게 풀어쓴 C언어 Express 5장 수식과 연산자 Programming (0) | 2025.01.15 |
[프로그래밍언어]쉽게 풀어쓴 C언어 Express 5장 수식과 연산자 Exercise (0) | 2025.01.14 |