본문 바로가기
c언어

c언어 여러가지 포인터와 인수로 문제 풀기(프로그램 인수 사용하기, qsort() 함수 사용하기, 이분법으로 근 구하기)

by 개발자 L 2023. 2. 11.
반응형

c언어 여러 가지 포인터와 인수로 문제 풀기(프로그램 인수 사용하기, qsort() 함수 사용하기, 이분법으로 근 구하기)

네 안녕하세요, 이번 포스팅에서는 이전 포스팅까지 배웠던 여러 가지 포인터들과 인수로 문제들을 풀어보는 시간을 가지려 합니다.

포인터와 인수는 정말 중요한 만큼, 잘 알아두셔야 합니다.

그럼 지금부터 시작하도록 하겠습니다.

 

1. 프로그램 인수 사용하기

제일 먼저 해볼 것은 프로그램의 인수를 사용하는 것입니다.

프로그램은 간단하게 마일을 킬로미터로 변환하는 것인데,

예전에는 scanf()를 이용해서 우리가 수를 입력해서 주소를 받는 원리로 했었죠?
이번에는 인수를 받아서 출력을 해볼 것입니다.

그럼 한 번 해보도록 하겠습니다.

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

int main(int argc, char *argv[])
{
    double mile, km;

    if(argc != 2)
    {
        printf("사용 방법 : mile2km 거리 : ");
        return 1;
    }

    mile = atof(argv[1]);
    km = 1.609 * mile;

    printf("입력된 거리는 %lf km 입니다.\n", km);

    return 0;
}

이렇게 입력을 했습니다.

이걸 일반적으로 실행을 하게 되면 이런 식으로 뜹니다.

사용 방법 : mile2km 거리 : 
C:\c, c++ folder>

그냥 이렇게 제일 처음에 있던 출력문자가 나오죠.

그 이유는 인자를 받지 않고 실행했기 때문입니다.

그러면 인자를 받으면 어떻게 나오나 봅시다.

입력된 거리는 1.609000 km 입니다.

저는 1을 입력했는데,

이렇게 잘 나오는 것을 확인할 수 있습니다.

반응형

 

2. qsort() 함수 사용하기

이번에는 qsort() 함수를 사용해보도록 하겠습니다.

c언어를 사용하면서 정렬을 이용할 때 가장 많이 사용하는 함수가 바로 qsort() 함수입니다.

qsort() 함수가 받는 것들은 이러합니다.

  • 배열의 시작 주소 : base
  • 배열 원소의 개수 : nitems
  • 원소 하나의 크기 : size
  • 비교 함수 : compar

이러한 것들을 받을 수 있고, 범용 정렬 함수이기 때문에 자료형은 알 수 없습니다.

그래서 직접 비교 방식이 아닌 함수 호출 방식으로 비교를 합니다.

그리고 여기서 compar() 함수는 비교이기 때문에 원소를 2개를 받아야 한다는 점 잊지 마세요.

그럼 qsort() 함수를 이용해서 원소를 정렬해 보도록 하겠습니다.

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

int values[] = {100, 25, 8, 98, 2};

int compare(const void *a, const void *b);

int main()
{
    int n;

    qsort(values, 5, sizeof(int), compare);

    printf("정렬한 후 배열 : ");

    for(n = 0; n < 5; n++)
    {
        printf("%d", values[n]);
    }

    printf("\n");

    return (0);
}

int compare(const void *a, const void *b)
{
    return (*(int *)a) - (*(int *)b);
}

이제 결과를 보도록 하겠습니다.

정렬한 후 배열 : 2 8 25 98 100

정렬도 순서대로 잘 된 것을 확인할 수 있습니다.

 

3. 이분법으로 근 구하기

이번에는 이분법을 이용해서 근을 구해보도록 하겠습니다.

이분법이란 어떤 구간 [a, b]에서 함숫값 f(a)와 f(b)가 서로 다른 부호를 가질 때 이 구간에서 근을 갖는다는 사실을

가지고서 접근하는 풀이법입니다.

그래서 이걸 c언어를 이용해서 구현을 해보려 합니다.

그럼 한 번 코드를 작성해 보도록 하겠습니다.

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

#define EPSILON 0.0001

double func(double x);
void bisection(double a, double b);

int main()
{
    double a = -200, b = 200;

    bisection(a, b);

    return 0;
}

double func(double x)
{
    return x * x * x - x * x + 2; // 함수 식
}

void bisection(double a, double b)
{
    if(func(a) * func(b) >= 0)
    {
        printf("적절한 a와 b가 아닙니다.\n");
        return;
    }

    double c = a;

    while((b - a) >= EPSILON)
    {
        c = (a + b) / 2;

        if(func(c) * func(a) < 0)
        {
            b = c;
        }

        else
        {
            a = c;
        }
    }

    printf("최종 근 = %lf\n", c);
}

이렇게 작성을 해봤습니다.

그럼 결과롤 보도록 하겠습니다.

최종 근 = -0.999928

결과도 무리 없이 잘 나왔습니다.

 

여기까지 포인터와 인수들을 이용해서 여러 가지 문제들을 풀어봤습니다.

다음 포스팅부터는 스트림과 파일 입출력에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글