본문 바로가기
컴퓨터/코딩

(제3판)C언어 콘서트 CHAPTER 8. Programming 문제 개인풀이

by 혼란한물범 2022. 8. 2.
반응형

개정3판 8장 프로그래밍 문제

개인풀이이기 때문에 출제자가 의도한 정답과 다를 수 있다.

 

 

Visual Studio로 실행해보고 싶은 사람들은 아래 링크에서 해당 문제를 찾아 복사 - 붙여넣기 하자 (다운받지 않아도 된다)

https://mega.nz/file/VPkxhLjb#mI4kTP1ZDA4KieF3FWmaVSOHItO_EtbX4ShjeZeCy4A

 

1. f(x, y) = 1.5*x+3.0*y를 계산하는 함수를 작성하고 테스트하여 본다.

#include <stdio.h>

double f(float x, float y)
{
double sum;
sum = 1.5 * x + 3.0 * y;

return sum;
}

int main(void)
{
float x = 1.0, y = 2.0;
printf("x=%f, y=%f, f(x,y)=%lf\n", x, y, f(x, y));

x = 2.0;
y = 0.0;
printf("x=%f, y=%f, f(x,y)=%lf\n", x, y, f(x, y));

x = 2.0;
y = 1.0;
printf("x=%f, y=%f, f(x,y)=%lf", x, y, f(x, y));

return 0;
}

 

 

2. 두 수 중에서 더 큰 수를 반환하는 함수 get_bigger()를 다음과 같이 작성하고 이것을 이용해서 사용자로부터 받은 실수 두 개 중에서 더 큰 수를 출력하는 프로그램을 작성하여 본다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

double get_bigger(float x, float y)
{
double max = x;
if (x < y)
max = y;

return max;
}

int main(void)
{
float x, y;

printf("실수를 입력하시오: ");
scanf("%f", &x);
printf("실수를 입력하시오: ");
scanf("%f", &y);

printf("더 큰 수는 %lf입니다.", get_bigger(x, y));

return 0;
}

 

 

3. 다음과 같이 화면에 *****************를 출력하는 함수를 작성하고 이것을 호출하여서 다음과 같은 출력을 만들어 보자.

#include <stdio.h>

void draw_stars(void) {
printf("*****************\n");
}

int main(void)
{
draw_stars();
printf("Hellow World!\n");
draw_stars();

return 0;
}

 

 

4. 주어진 정수의 약수를 모두 찾아내는 함수 get_divisor()를 작성하여 보라. 만약 8이 주어지면 1, 2, 4, 8을 화면에 출력하여야 한다. 이 함수를 테스트하기 위한 main()를 작성하라.

#include <stdio.h>

void get_divisor(int x)
{
printf("%d의 약수: ", x);
for (int i = 1; i <= x; i++) {
if (x % i == 0)
printf("%d ", i);
}
printf("\n");
}

int main(void)
{
get_divisor(8);

return 0;
}

 

 

5. 본문에 등장한 소수(prime number)인지를 검사하는 함수 check_prime()를 사용하여 1부터 100 사이에 존재하는 소수들을 모두 출력하는 프로그램을 작성한다.

#include <stdio.h>

int check_prime(int n)
{
for (int i = 2; i < n; i++) {
if (n % i == 0)
return 0;
}
return 1;
}

int main(void)
{
for (int i = 2; i <= 100; i++) {
if (check_prime(i) == 1)
printf("%d ", i);
}
return 0;
}

 

 

6. 본문에 등장한 거듭제곱 계산 함수 power()를 호출하여 3⁰부터 3¹⁰까지의 값을 출력하는 프로그램을 작성하라.

#include <stdio.h>

long power(int x, int y) {
long result = 1;

for (int i = 0; i < y; i++)
result *= x;

return result;
}

int main(void)
{
for (int i = 0; i <= 10; i++)
printf("%d ", power(3, i));

return 0;
}

 

 

7. 두 점 사이의 거리를 계산하는 함수를 작성하여 보자. 2차원 공간에서 두 점 (x₁, y₁)와 (x₂, y₂) 사이의 거리를 계산하는 dist_2d()를 작성하시오. 다음과 같은 두 점 사이의 거리를 계산하는 공식을 사용하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>


double dist_2d(float x1, float y1, float x2, float y2) {
double result;

result = sqrt(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2)));
return result;
}

int main(void)
{
float x1, x2, y1, y2;

printf("첫번째 점의 좌표를 입력하시오:(x, y)");
scanf("%f %f", &x1, &y1);
printf("두번째 점의 좌표를 입력하시오:(x, y)");
scanf("%f %f", &x2, &y2);

printf("두점 사이의 거리는 %lf입니다.", dist_2d(x1, y1, x2, y2));

return 0;
}

 

 

8. 2차 방정식의 근을 계산하는 함수 quad_eqn()를 작성하라. quad_eqn()함수는 a, b, c를 나타내는 double형의 3개의 인수를 받는다. 판별식이 양수인 경우에만 근을 출력하라. 만약 판별식의 값이 음수이면 근이 없다는 메시지를 출력하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>


double quad_eqn(double a, double b, double c) {
double result1, result2;
double judge;

judge = b * b - (4 * a * c);

if (judge < 0) {
printf("근이 존재하지 않습니다.\n");
return 0;
}
else {
result1 = (-b + sqrt(b * b - (4 * a * c))) / (2 * a);
result2 = (-b - sqrt(b * b - (4 * a * c))) / (2 * a);
printf("첫 번째 근=%lf\n", result1);
printf("두 번째 근=%lf", result2);
}
}

int main(void)
{
double a, b, c;

printf("2차 방정식의 계수를 입력하시오:\n");
printf("a: ");
scanf("%lf", &a);
printf("b: ");
scanf("%lf", &b);
printf("c: ");
scanf("%lf", &c);

quad_eqn(a, b, c);

return 0;
}

 

 

9. 난수 생성 함수를 이용하여 컴퓨터로 여러 가지 문제를 시뮬레이션하는 것을 흔히 몬테 까를로(Monte Carlo) 시뮬레이션이라고 한다. 간단한 동전 던지기 게임을 시뮬레이션하여 보자. 컴퓨터가 동전을 던지고 사용자는 앞뒤를 말한다. 컴퓨터는 난수 생성 함수를 이용하여 난수를 생성한 후에 난수가 짝수이면 동전의 앞면으로 간주하고 홀수이면 동전의 뒷면으로 간주한다. 이것을 여러 번 반복하여 승패를 기록한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>


int Monte_Carlo() {
srand(time(NULL));
return rand() % 2;
}

int main(void)
{
int select;

while (1) {
printf("앞(0) 또는 뒤(1)를 선택하시오(종료는 -1): ");
scanf("%d", &select);

if (select < 0) {
printf("게임을 종료합니다.");
break;
}
else if (select == Monte_Carlo())
printf("컴퓨터가 이겼습니다.\n");
else if (select != Monte_Carlo())
printf("당신이 이겼습니다.\n");
else
printf("잘못된 입력입니다.\n");
}

return 0;
}

 

 

10. 사용자와 컴퓨터가 주사위 게임을 한다고 하자. 주사위를 각 3번씩 굴려서 주사위 점수를 합한다. 합친 점수가 높은 쪽이 이긴다고 하자.

#include <stdio.h>
#include <stdlib.h>


int dice_roller() {
srand(time(NULL));
return (rand() % 6) + 1;
}

int main(void)
{
int human, computer;
int first, second, third;

first = dice_roller();
second = dice_roller();
third = dice_roller();

while (1) {
if (first == second)
second = dice_roller();
else if (first == third)
third = dice_roller();
else if (second == third)
third = dice_roller();
else
break;
}

printf("사용자 주사위=(%d, %d, %d)=", first, second, third);
human = first + second + third;
printf("%d\n", human);

first = dice_roller();
second = dice_roller();
third = dice_roller();

while (1) {
if (first == second)
second = dice_roller();
else if (first == third)
third = dice_roller();
else if (second == third)
third = dice_roller();
else
break;
}

printf("컴퓨터 주사위=(%d, %d, %d)=", first, second, third);
computer = first + second + third;
printf("%d\n", computer);

if (human > computer)
printf("사용자 승리");
else if (human == computer)
printf("비겼습니다");
else
printf("컴퓨터 승리");

return 0;
}

 

 

11. 덧셈, 뺄셈, 곱셈, 나눗셈을 지원하는 계산기 프로그램을 작성하여 보자. 이번에는 각 연산들이 몇 번씩 계산되었는지를 기억하게 하자. 각 연산을 지원하는 함수들은 자신이 호출된 횟수를 화면에 출력한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int x, y;
char a;

void calculate(int x, char a, int y) {
int result = 0;
static int plus = 0, minus = 0, multiple = 0, division = 0;

if (a == '+') {
result = x + y;
plus++;
printf("덧셈은 총 %d번 호출되었습니다\n", plus);
}
else if (a == '-') {
result = x - y;
minus++;
printf("뺄셈은 총 %d번 호출되었습니다\n", minus);
}
else if (a == '*') {
result = x * y;
multiple++;
printf("곱셈은 총 %d번 호출되었습니다\n", multiple);
}
else if (a == '/') {
result = x / y;
division++;
printf("나눗셈은 총 %d번 호출되었습니다\n", division);
}

printf("연산 결과:%d\n", result);
}

int main(void)
{
while (1) {
printf("연산을 입력하시오(종료는 Ctrl-Z):");
scanf("%d %c %d", &x, &a, &y);

if (x == EOF || a == NULL || y == EOF)
break;

calculate(x, a, y);
}

return 0;
}

 

 

12. 돈만 생기면 저금하는 사람을 가정하자. 이 사람을 위한 함수 save(int amount)를 작성하여 보자. 이 함수는 저금할 금액을 나타내는 하나의 인수 amount만을 받으며 save(100)과 같이 호출된다. save()는 현재까지 저축된 총액을 기억하고 있으며 한번 호출될 때마다 총 저축액을 화면에 출력한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int amount, total = 0;

void draw(int amount) {
total += amount;
}
void save(int amount) {
if (amount > 0)
total += amount;
else if (amount < 0)
draw(amount);

printf("지금까지의 저축액은 %d입니다.\n", total);
}

int main(void)
{
while (1) {
printf("얼마를 저축하시겠습니까?(종료는 -1): ");
scanf("%d", &amount);

if (amount == -1)
break;
else
save(amount);
}
printf("프로그램을 종료합니다.");

return 0;
}

 

 

 

13. 순환 호출을 이용하여 정수의 각 자리수를 출력하는 함수 show_digit(int x)를 작성하고 테스트하라. 즉 정스가 1234이면 화면에 1 2 3 4와 같이 출력한다. 함수는 일의 자리를 출력하고 나머지 부분을 대상으로 다시 같은 함수를 재귀 호출한다. 예를 들어서 1234의 4를 출력하고 나머지 123을 가지고 다시 삭ㅌ은 함수를 재귀 호출한다. 1234를 10으로 나누면 123이 되고 4는 1234를 10으로 나눈 나머지이다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void show_digit(int x) {
if (x < 1) return;

show_digit(x / 10);
printf("%d ", x % 10);
}

int main() {
int x;

printf("정수를 입력하시오: ");
scanf("%d", &x);

if (x == 0) {
printf("0");
return 0;
}
else if (x < 0) {
x = -x;
printf("- ");
show_digit(x);
}
else
show_digit(x);

return 0;
}

 

 

14. 다음을 계산하는 순환적인 프로그램을 작성하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

long factorial(int n) {
long sum = 1;

if (n == 1)
return sum;
sum *= (n * n * n) + factorial(n - 1);


}

int main(void){
int x;

printf("정수를 입력하시오: ");
scanf("%d", &x);

printf("%ld\n", factorial(x));

return 0;
}

반응형

댓글