<C프로그래밍-새내기를 위한 첫 C 언어 책>연습문제 chapter 5 (24,25,26)

24. 자연수 두 개를 입력받은 후, 최대 공약수를 구하는 프로그램을 while문을 이용해 작성하시오.

#include <stdio.h>
int main(void)
{ 
    int x, y, r; 
    printf("두 개의 정수를 입력하시오: "); 
    scanf_s("%d %d", &x, &y); 

    while (y != 0) 
    {
        r = x % y; 
        x = y; 
        y = r; 
    } 

    printf("최대 공약수는 %d입니다.\n", x); return 0; 
}

 

유클리드 호제법이다. 모든 방법이 책에 있으므로 어렵지 않다.

 

25. 

구간 $[a,b]$ 에서 연속인 함수 $f(x)=x^{2}(f(x)\ge 0)$ 에 대해 $x=a,x=b,y=f(x)$ 로 둘러싸인 넓이(정적분)는 다음과 같이 정의된다. $$S(x)=\int_{b}^{a}f(x)dx=\int_{b}^{x}x^{2}dx$$ 구분구적법을 이용하여 $f(x)$ 의 정적분 값을 계산하시오.

 

이 책을 중 1때 샀는데, 왜 다른 책으로 갈아탔는지 알 것 같다. 연습문제로 구분구적법이 나오면 중1이 어떻게 풀겠어...

 

우선 정적분의 정의를 살펴보자.

etc-image-0

etc-image-1

여기에 조건대로 하나하나 대입하면 된다.

#include <stdio.h>

int main(void)
{
    double a, b, dx, sum = 0, res, y;
    int k, n;

    printf("적분 구간 시작은? ");
    scanf_s("%lf", &a);
    printf("적분 구간 끝은? ");
    scanf_s("%lf", &b);
    printf("n(적분 구간의 개수)는? ");
    scanf_s("%d", &n);

    dx = (b - a) / n;
    

    for (k = 1; k <= n; k++)
    {
        y = (a + k * dx) * (a + k * dx);
        res = dx * y;
        sum += res;
    }

    printf("f(x) = x^2의 [%.1lf, %.1lf]구간의 적분 근사치는 %lf입니다.\n", a, b, sum);

    return 0;
}
 

수식 속 기호는 코드에서 다음과 같이 바꾸어 사용했다.

etc-image-2dx

 

etc-image-3y

 

etc-image-4 = res

 

etc-image-5sum

 

정적분의 정의대로 하면 된다. 구분구적법이므로 n을 무한대로 보내진 않고 개수를 입력받아 계산한다.

 

26. 다음 조건을 만족시켜 369게임 프로그램을 작성하시오(sprintf(), strchr() 함수 이용)

①1부터 999까지의 진행결과만 출력한다.

②숫자가 3의 배수이거나 숫자에 3이 들어간 경우에는 박수를 친다.

③한 행에 열한 개를 출력한다.

④박수를 쳐야 할 위치에서는 대문자 P를 출력한다.

 

#include <stdio.h>
#include <string.h>

int main(void)
{
    int i;
    char str[10];
    int count = 0;
    for (i = 1; i <= 999; i++)
    {
        sprintf_s(str, "%d", i);
        char* ptr = strchr(str, '3');
        char* ptr1 = strchr(str, '6');
        char* ptr2 = strchr(str, '9');

        if (ptr != NULL)
            printf("P\t");
        else if (ptr1 != NULL)
            printf("P\t");
        else if (ptr2 != NULL)
            printf("P\t");
        else    
            printf("%s\t", str);

        count++;
        if (count % 11 == 0)
        {
            printf("\n");
            count = 0;
        }
    }
    return 0;    
}
1.JPG

sprint나 strchr은 써본 적이 없어서 난감했다. 배열과 포인터를 알아야 쓸 수 있는 함수다. 교재에서 배열은 7장에, 포인터는 10장에 나온다. 왜 이런 문제를 냈는지 모르겠다. 조건문과 반복문으로도 369를 구현할 수 있다. 

 

그리고 369게임 프로그램을 작성하라더니 조건이 이상하다. 3, 6, 9가 들어가면 박수를 치는 게임인데 3의 배수가 왜 튀어 나왔을까. 그냥 조건 무시하고 내가 아는 369게임 프로그램을 만들었다. 

 

sprintf로 str에 수를 입력한다.

str에 3이 있으면 ptr1이 가리키도록 하고, 6이 있으면 ptr2가 가리키도록 하고, 9가 있으면 ptr3이 가리키도록 한다. 없으면 각 포인터는 NULL을 가리킨다.

 

포인터가 NULL이 아니라면 3 또는 6 또는 9가 있다는 소리다. 각 경우에 대해 P를 출력하도록 if else문을 작성하고, 아닌 경우엔 문자열을 출력한다. 

 

출력 후 count를 증가시킨다. count가 11이 되면 줄을 바꾼다.