c언어 연습문제 #7 (국비8일차)

문제 1

 다음 실행 결과를 보고 함수 abs()를 구현하세요. 이 함수는 키보드를 통해서 입력받는 값의 절댓값을 구하는 프로그램입니다.

실행 결과
정수를 입력하세요 : -43
절댓값은 : 43입니다.

A:

#include <stdio.h>
int abs(int x);
void output(int x);

void main()
{
int num1;
printf("정수를 입력하세요 : ");
scanf_s("%d", &num1);

int result;
result = abs(num1);
output(result);
}

int abs(int x)
{
if (x >= 0) return x;
else return -x;
}

void output(int x)
{
printf("절대값은 : %d입니다.\n", x);
}

etc-image-0

 

문제 2

 다음 프로그램은 사칙 연산을 위해 각각 plus, minus, multiply, divide 함수를 선언하고 사용한 코드입니다. 제시한 실행 결과가 나오게 선언한 함수들을 직접 구현하세요.

#include <stdio.h>
int plus(int i, int j);
int minus(int i, int j);
int multiply(int i, int j);
float divide(int i, int j);

void main()
{
int a, b;
int result;
double result2;

printf("input two numbers : ");
scanf_s("%d %d", &a, &b);
result = plus(a, b);
printf("a + b = %d \n", result);
result = minus(a, b);
printf("a - b = %d \n", result);
result = multiply(a, b);
printf("a * b = %d \n", result);
result2 = divide(a, b);
printf("a / b = %lf \n", result2);
}

A:

int plus(int i, int j)
{
return i + j;
}

int minus(int i, int j)
{
return i - j;
}

int multiply(int i, int j)
{
return i * j;
}

float divide(int i, int j)
{
return (float)i / (float)j;
}

etc-image-1

 

 

문제 3

 1부터 n까지의 합을 구하는 간단한 재귀 함수를 작성해 보세요. 간단히 반복문으로도 간단히 구현할 수 있지만, 반드시 재귀 함수를 통해 구련해 보세요. 팩토리얼의 계산과 크게 다르지 않습니다.

실행 결과
input your number = 10
1부터 10까지의 합 = 55

 

A:

#include <stdio.h>

int allPlus(int a);

void main()
{
int num;
printf("input your number = ");
scanf_s("%d", &num);

int result;
result = allPlus(num);
printf("1부터 %d까지의 합 = %d", num, result);

}

int allPlus(int a)
{
if (a <= 1) return;

else
{
return a + allPlus(a - 1);
}

}

etc-image-2

 

문제 4

세 개의 정수를 인자로 전달받아서 그 중 가장 큰 수를 반환하는 함수와 가장 작은 수를 반환하는 함수를 정의해 보자. 그리고 이 함수를 호출하는 적절한 main함수도 작성해보자.

 

A:

int max(int a, int b, int c);

void main()
{
int num1, num2, num3;

//정수 3개 입력
num1 = input();
num2 = input();
num3 = input();

int result;
result = max(num1, num2, num3);
printf("가장 큰 수는 : %d입니다.\n", result);
result = min(num1, num2, num3);
printf("가장 작은 수는 : %d입니다.\n", result);

}

int input()
{
int a;
printf("input : ");
scanf_s("%d", &a);
return a;
}

int max(int a, int b, int c)
{
if (a >= b)
{
if (a >= c) return a;
else return c;
}
else if (a < b)
{
if (b < c) return c;
else return b;
}
else return a;
}

int min(int a, int b, int c)
{
if (a >= b)
{
if (b >= c) return c;
else return b;
}
else if (a < b)
{
if (a < c) return a;
else return c;
}
else return a;
}

 

etc-image-3

 

문제 5

섭씨(Celsius)온도를 입력하면 화씨(Fahrenheit)온도를 반환하는 CelToFah라는 이름의 함수와 그 반대로 화씨 온도를 입력하면 섭씨 온도를 반환하는 FahToCel라는 이름의 함수를 정의하고 이 두 함수를 호출하는 예제를 완성해 보자. 참고로 섭씨와 화씨간의 온동변환의 공식은 다음과 같다.

   Fah=1.8*Cel+32

A:

#include <stdio.h>
void FahToCel(int a);
void CelToFah(int a);

void main()
{
printf("섭씨와 화씨를 변환해주는 프로그램\n\n");

char ch;
printf("섭씨를 화씨로 바꿀려면 c를 입력하고, 그 반대의 경우 f를 눌러주세요. :");
scanf_s("%c", &ch);

int num;

if (ch == 'c')
{
printf("변환할 섭씨 온도 : ");
scanf_s("%d", &num);
CelToFah(num);
}
else
{
printf("변환할 화씨 온도 : ");
scanf_s("%d", &num);
FahToCel(num);
}

}

void CelToFah(int a)
{
double result;
result = 1.8 * a + 32;
printf("섭씨 a도는 화씨 %lf도 입니다.\n", result);
}

void FahToCel(int a)
{
double result;
result = (a - 32) / 1.8;
printf("화씨 a도는 섭씨 %lf도 입니다.\n", result);
}

etc-image-4
etc-image-5

 

문제 6

인자로 전달된 수 만큼의 피보나치 수열을 출력하는 함수를 정의해보자. 예를 들어서 프로그램 사용자가 5를 입려하면 0에서부터 시작해서 총 5개의 피보나치 수열을 출력해야 한다. 참고고 피보나치 수열은 다음과 같다.

  0,1,1,2,3,5,8,13,21,34

 이렇듯 피보나치 수열은 0과 1에서 시작한다. 그리고 세번째 이후의 수열부터는 이전의 두 값의 합으로 구성된다. 즉, 세번째 수는 0과 1의 합으로 이뤄져서 1이되고, 네번째 수는 1과 1의 합으로 이뤄져서 2가 된다.
 (* 재귀함수호출을 이용해보는 것도 고려해보자.)

A:

생각보다 어려웠다. 그리고 피보나치의 결과 값과 for문을 이용해 한번에 printf를 하는 함수를 만들려고 하니 오히려 에러만 났다.

#include <stdio.h>
int xxx(int x);

void main()
{
int num;
printf("출력할 피보나치 수열 갯수를 입력 : ");
scanf_s("%d", &num);
int output;

for (int i = 1; i < num + 1; i++)
{
output = xxx(i);
printf(" %d,", output);

}

}

int xxx(int x)
{

if (x == 1) return 0;
else if (x == 2) return 1;
else
{
return  xxx(x - 1) + xxx(x - 2);
}
}

 

etc-image-6

 

 

 

문제 7

 다음은 프로그램 사용자가 입력하는 값을 누적하여 그 합계를 출력하는 예제이다.

 #include <stdio.h>

int AddToTotal(int num);

void main(void)
{
       int num,i;
       for(i=0;i<3;i++)
       {
               printf("입력%d:  ", i+1);
               scanf_s("%d",&num);
               printf("누적: %d \n", AddToTotal(num));
       }
}

 본 예제를 완성하기 위한 AddToTotal 함수를 정의해서 프로그램을 완성해 보자.
단, static변수를 사용해서 함수를 만들어보자.

 

A:

int AddToTotal(int num)
{
    static int total = 0;
    total += num;
}

etc-image-7

 

문제 8

프로그램 사용자로부터 두개의 정수를 입력 받아서 구구단을 출력하는 프로그램을 작성해 보자. 예를 들어서 프로그램 사용자가 3과 5를 입력하면 3단,4단,5단이 출력되어야 하고, 2와 6을 입력하면 2단,3단,4단,5단,6단이 출력되어야 한다.
단 한가지 조건이 있다. 사용자는 두개의 숫자를 입력 할 때에 입력 순서에 자유로워야 한다. 즉, 3과5을 입력하건 5와 3을 입력하건 프로그램은 같은 결과를 출력해야 한다.
- 문제 해결 Guide-
 두 개의 정수를 인자로 전달받아서 두 수 사이의 구구단을 출력하는 함수를 정의하고,
main함수에서 이 함수를 출력하는 형태로 구현해 보자.

 

A:

#include <stdio.h>
int input();
void dan(int x, int y);

void main()
{
printf("정수 2개를 입력하면 그 사이의 단이 출력되는 프로그램\n\n");

//정수 입력
int num1, num2;
num1 = input();
num2 = input();

//2개 정수 사이 구구단 출력하는 프로그램
dan(num1, num2);

}

int input()
{
int num;
printf("정수 1개 입력 : ");
scanf_s("%d", &num);
return num;
}

void dan(int x, int y)
{
if (x >= y)
{
for (; y<=x;y++)
{
for (int i = 1; i < 10; i++)
{
printf("%d * %d = %d\n", y, i, y * i);
}
printf("\n");
}
}
else
{
for (; x <= y; x++)
{
for (int i = 1; i < 10; i++)
{
printf("%d * %d = %d\n", x, i, x * i);
}
printf("\n");
}
}
}

etc-image-8