반응형
[ 1 ~ 6번 ]
[ 13 ~ 21번 ]
* 본문은 Microsoft Visual Studio 2022 버전 17.6.4를 사용하였으므로 다른 버전의 비쥬얼 스튜디오나 다른 C언어 작동 프로그램으로 작동할 경우 오류가 생길 수 있음을 양지해주세요.
7. 반복 루프를 사용하여 다음과 같은 패턴을 출력하는 프로그램을 작성하라. (중첩 반복 구조 / HARD)
*
**
***
****
*****
******
*******
문제 의도
for문의 i와 j값에 따라 공백과 * 문자를 적절히 반복할 수 있는가?
#include <stdio.h>
int main(void) {
int i, j;
for (i = 1; i <= 7; i++) {
for (j = 6; j >= 0; j--) {
if (j >= i) {
printf(" ");
}
else if (i > j) {
printf("*");
}
}
printf("\n");
}
return 0;
}
코드 설명
i는 줄을 반복하는데 관여하는 변수고, j는 해당 줄에 공백 또는 * 문자의 출력을 반복하는 변수다.
i와 j의 범위를 설정할 때, i는 첫째줄에서 일곱째줄까지 반복되므로 1부터 7까지로 설정하고,
j는 i보다 크거나 같을 때 공백을 출력하므로 7부터 시작하면 첫째줄이 모두 공백이 되어버린다.
(7, 6, 5, 4, 3, 2, 1로 j가 감소하는데, i = 1이므로 항상 j >= i를 만족한다.)
그러므로 6으로 시작해서 별이 1개인 상태에서 0이면서 별이 7개일 때까지 반복한다.
8. 중첩 반목문을 사용하여서 다음과 같이 출력하는 프로그램을 작성하여보자. (중첩 반복 구조 / MEDIUM)
정수를 입력하시오: 5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
문제 의도
i줄까지 줄을 반복하면서 하나씩 숫자가 늘어나는 j값을 설정할 수 있는가?
#include <stdio.h>
int main(void) {
int num, i, j;
printf("정수를 입력하시오: ");
scanf_s("%d", &num);
for (i = 1; i <= num; i++) {
j = 1;
while (j <= i) {
printf("%d ", j);
j++;
}
printf("\n");
}
return 0;
}
코드 설명
i = 1일 때 j = 1인데 j <= i일 때 j를 출력하므로 1이 출력된다. 근데, j++로 j = 2가 되므로 while 문의 조건이 거짓이 되므로 while문을 벗어난다. 벗어나고 다시 j = 1로 정의하므로 j는 1이 되고, i = 2이므로 j = 1, j = 2일 때 숫자가 출력된다. 이런식으로 정수 num까지 반복하여 아래와 같은 실행결과가 나타난다.
9. 사용자가 입력한 두 숫자의 최소공배수(LCM)를 계산하는 프로그램을 작성한다. 두 정수의 최소공배수는 가장 적은 공배수인다. 예를 들어, 72와 120의 LCM은 360이다. (반복 구조와 연산자 / MEDIUM)
정수 2개를 입력하시오: 72 120
최소공배수는 360입니다.
문제 의도
최소공배수를 구하도록 설계할 수 있는가?
#include <stdio.h>
int main(void) {
int x, y, LCM;
printf("정수 2개를 입력하시오: ");
scanf_s("%d %d", &x, &y);
if (x > y) {
LCM = x;
}
else if (y > x) {
LCM = y;
}
while (1) {
if (LCM % x == 0 && LCM % y == 0) {
break;
}
LCM++;
}
printf("최소공배수는 %d입니다.", LCM);
return 0;
}
코드 설명
최대공약수는 복잡하지만, 최소공배수는 비교적 간단하다. 일단 x,y 중 큰 수를 LCM으로 정하고, 그 LCM을 ++로 1씩 늘려가면서 LCM을 x와 y로 각각 나눴을 때 나머지가 0인 경우가 최소공배수이므로 그 최소공배수 LCM을 출력한다.
10. 2와 100 사이에 있는 모든 소수(prime number)를 찾는 프로그램을 작성하라. 정수가 소수가 되려면 1과 자기 자신만을 약수로 가져야 한다. (반복 구조와 연산자 / MEDIUM)
2 3 4 7 11 13 17 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
문제 의도
소수를 구하도록 설계할 수 있는가?
#include <stdio.h>
int main(void) {
int i, j, isPrime;
for (i = 2; i <= 100; i++) {
isPrime = 1; // 소수인지를 나타내는 변수
for (j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = 0; // i가 j로 나누어 떨어지면 소수가 아님
break;
}
}
if (isPrime == 1) {
printf("%d ", i);
}
}
return 0;
}
코드 설명
1은 소수가 아니므로 2부터 100까지의 i를 검사한다. 이런 i를 j(j의 범위는 i까지이다. i보다 큰 j로 나눠버리면 반드시 나머지가 나오기 때문에 이상한 수가 출력된다.)로 나눠 나머지가 0이면 isPrime을 0으로 설정해 합성수임을 표시하고 아니라면 isPrime이 초기 정의한대로 1로 유지되기 때문에 출력된다. 물론 엄밀히 j = 2; j <= i가 맞지만, j = i일 때는 반드시 i % j == 0이므로 j < i로 설정해도 상관없다.
11. 자동차의 연료 탱크 프로그램을 시뮬레이션하여보자. 초기값이 100리터이고, 연료 탱크의 최대 용량은 500리터이다. 사용자가 주행을 하면 연료가 줄어든다. 반복문을 사용하여서 사용자로부터 충전 또는 사용한 연료를 입력받아서 연료 탱크에 남아 있는 연료가 20리터 미만이면 경고를 출력한다. (조건제어 반복과 break 이용 / HARD)
현재 연료량: 100
연료 충전은 +, 소모는 -로 입력해주세요: +200
현재 연료량: 300
연료 충전은 +, 소모는 -로 입력해주세요: -200
현재 연료량: 10
(경고) 연료가 20리터 미만입니다.
연료 충전은 +, 소모는 -로 입력해주세요:
문제 의도
지시문대로 프로그래밍 할 수 있는가?
#include <stdio.h>
int main(void) {
int fuel = 100;
int charge;
while (1) {
printf("현재 연료량: %d\n", fuel);
if (fuel < 20) {
printf("(경고) 연료가 20리터 미만입니다.\n");
}
printf("연료 충전은 +, 소모는 -로 입력해주세요: ");
scanf_s("%d", &charge);
fuel += charge;
if (fuel > 500) {
printf("500리터 이상이 주유될 수 없습니다. 다시 입력하십시오.\n");
fuel -= charge;
}
printf("\n");
if (fuel <= 0) {
printf("연료가 소진되어 정지합니다.");
break;
}
}
return 0;
}
코드 설명
교재 난이도상 HARD이지만, if를 활용한 간단한 조건문들이다. 다만 500리터 초과이거나 기름이 소진된 경우를 생각하여 추가했다.
12. 컴퓨터는 막대 그래프를 그리는 데도 사용된다 .사용자로부터 1부터 50사이의 숫자를 입력받아서 숫자만큼의 별표를 출력하는 프로그램을 작성하라. 음수가 입력되면 종료한다. 막대는 세로로 그려지게 된다. (무한 루프와 break 이용 / MEDIUM)
막대의 높이(종료: -1): 10
**********
막대의 높이(종료: -1): 20
********************
막대의 높이(종료:-1):
문제 의도
막대의 높이 대로 * 문자를 출력하고 음수가 입력되면 종료되게 할 수 있는가?
#include <stdio.h>
int main(void) {
int num;
while (1) {
printf("막대의 높이(종료:-1): ");
scanf_s("%d", &num);
if (num <= 0) {
exit(0);
}
for (int i = 0; i < num; i++) {
printf("*");
}
printf("\n");
}
return 0;
}
코드 설명
0을 포함한 음의 정수가 입력되면 exit(0)으로 종료한다. 만약 다른 범위의 수라면 num까지 * 문자를 출력한다. 그리고 줄바꿈을 한다. 이 때 i는 다른 함수에 관여하지 않고 단순히 반복 기능을 수행하는 조건 반복문이므로, i = 1; i <= num으로도 설정 가능하다.
반응형
'C언어 > 쉽게 풀어쓴 C언어 EXPRESS 개정4판' 카테고리의 다른 글
[7下] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 7장 PROGRAMMING (13~21번) (2) | 2023.10.01 |
---|---|
[7上] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 7장 PROGRAMMING (1~6번) (0) | 2023.06.24 |
[6下] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 6장 PROGRAMMING (7~12번) (2) | 2023.06.19 |
[6上] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 6장 PROGRAMMING (1~6번) (0) | 2023.06.18 |
[5下] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 5장 PROGRAMMING (7~12번) (0) | 2023.06.18 |