본문 바로가기
c언어

c언어 구조체, typedef를 이용하여 여러가지 문제 풀어보기(2차원 공간 상의 점을 구조체로 표현하기, 사각형을 구조체로 나타내기, 벡터 연산하기, 2차원 공간 상의 점을 typedef를 이용해서 정의..

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

c언어 구조체, typedef를 이용하여 여러 가지 문제 풀어보기(2차원 공간 상의 점을 구조체로 표현하기, 사각형을 구조체로 나타내기, 벡터 연산하기, 2차원 공간 상의 점을 typedef를 이용해서 정의하기, 성적 우수자 찾기)

네 안녕하세요, 이번 포스팅에서는 지난 시간에 배웠던 구조체와 typedef를 이용하여 여러 가지 문제들을 풀어보도록 하겠습니다.

구조체와 typedef는 프로그래밍을 할 때 정말 많이 쓰이고,

최소한 이 정도 까지는 알아야 프로그램다운 프로그램을 만들 수 있습니다.

그렇기 때문에 연습이 정말 많이 필요합니다.

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

 

1. 2차원 공간 상의 점을 구조체로 표현하기

제일 먼저 해볼 일은 2차원 공간 상의 점을 구조체를 이용해서 표현을 해보는 것입니다.

그리고 이를 이용해서 두 점 사이의 거리 까지 구해보도록 하겠습니다.

'point'라는 구조체로 정의를 하여 나타낼 것인데,

지금부터 풀어보도록 하겠습니다.

#include <stdio.h>

struct point
{
    int x;
    int y;
};

int main()
{
    struct point p1, p2;
    int xp, yp;
    double distance;

    printf("점의 좌표를 입력하세요(x, y) : ");
    scanf("%d %d", &p1.x, &p1.y);

    printf("점의 좌표를 입력하세요(x, y) : ");
    scanf("%d %d", &p2.x, &p2.y);

    xp = p1.x - p2.x;
    yp = p1.y - p2.y;

    distance = sqrt((double)(xp * xp + yp * yp)); // 두 점 사이의 거리 공식
    printf("거리는 %lf 입니다.\n", distance);

    return 0;
}

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

점의 좌표를 나타내는 식을 이용하여 좌표를 나타내고,

이를 이용하여 두 점 사이의 거리도 구해봤습니다.

그럼 결과를 보여드리도록 하겠습니다.

점의 좌표를 입력하세요(x, y) : 10 10
점의 좌표를 입력하세요(x, y) : 20 20 
거리는 14.142136 입니다.

결과도 문제 없이 잘 나온 것을 볼 수가 있습니다.

 

2. 사각형을 구조체로 나타내기

이번에는 이걸 좀 더 활용해서 사각형을 구조체로 표현하여 나타내보도록 하겠습니다.

그리고 이를 이용해서 넓이와 둘레까지 구하는 프로그램을 작성해 보도록 하겠습니다.

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

#include <stdio.h>

struct point
{
    int x;
    int y;
};

struct rectangle
{
    struct point p1;
    struct point p2;
};

int main()
{
    struct rectangle r;
    int w, h, area, perimeter;

    printf("좌측 상단의 좌표를 입력하세요(x, y) : ");
    scanf("%d %d", &r.p1.x, &r.p1.y);

    printf("우측 상단의 좌표를 입력하세요(x, y) : ");
    scanf("%d %d", &r.p2.x, &r.p2.y);

    w = r.p2.x - r.p1.x;
    h = r.p2.y - r.p1.y;
    area = w * h;
    perimeter = 2 * (w + h);
    
    printf("면적은 %d 이고, 둘레는 %d 입니다.\n", area, perimeter);

    return 0;
}

이렇게 작성을 했습니다.

기존에 썼던 point 구조체를 사각형을 나타내는 rectangle 구조체의 멤버로 넣어서 문제를 풀었습니다.

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

좌측 상단의 좌표를 입력하세요(x, y) : 10 10
우측 상단의 좌표를 입력하세요(x, y) : 20 20
면적은 100 이고, 둘레는 40 입니다.

결과도 잘 나온 것을 확인할 수 있습니다.

반응형

 

3. 벡터 연산하기

이번에는 벡터 연산을 해보도록 하겠습니다.

이번에는 vector 구조체를 선언한 후에,

벡터의 합을 구하는 사용자 정의 함수를 하나 만들어서 문제를 풀어보도록 하겠습니다.

그럼 바로 보시죠.

#include <stdio.h>

struct vector
{
    float x;
    float y;
};

struct vector get_vector_sum(struct vector a, struct vector b);

int main()
{
    struct vector a = {2.0, 3,0};
    struct vector b = {5.0, 6.0};
    struct vector sum;

    sum = get_vector_sum(a, b);

    printf("벡터의 합은 (%f, %f) 입니다.\n", sum.x, sum.y);

    return 0;
}

struct vector get_vector_sum(struct vector a, struct vector b)
{
    struct vector result;

    result.x = a.x + b.x;
    result.y = a.y + b.y;

    return result;
}

벡터의 값은 정수 값이 아닌 실수이기 때문에 int형 대신 float형을 써서 표현을 했습니다.

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

벡터의 합은 (7.000000, 9.000000) 입니다.

결과도 문제 없이 잘 나온 것을 볼 수가 있습니다.

 

4. 2차원 공간 상의 점을 typedef를 이용하여 정의하기

이번에는 typedef를 이용해서 2차원 공간 상의 점을 정의해 보도록 하겠습니다.

typedef를 이용하여 정의하는 것도 크게 어려울 것은 없습니다.

typedef를 이용해서 POINT라는 하나의 새로운 구조체 변수를 만들어서 소스 코드를 작성할 것입니다.

그럼 바로 해보도록 하겠습니다.

#include <stdio.h>

typedef struct point
{
    int x;
    int y;
} POINT;

POINT translate(POINT p, POINT delta);

int main()
{
    POINT p = {2, 3};
    POINT delta = {10, 10};
    POINT result;

    result = translate(p, delta);

    printf("새로운 점의 좌표는 (%d, %d) 입니다.\n", result.x, result.y);

    return 0;
}

POINT translate(POINT p, POINT delta)
{
    POINT new_p;

    new_p.x = p.x + delta.x;
    new_p.y = p.y + delta.y;

    return new_p;
}

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

점의 위치를 나타내어주는 함수를 하나 새롭게 작성을 했고,

그를 이용해서 좌표를 구했습니다.

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

새로운 점의 좌표는 (12, 13) 입니다.

결과도 문제 없이 잘 나온 것을 볼 수 있습니다.

 

5. 성적 우수자 찾기

이번에는 구조체를 이용하여 성적 우수자를 찾는 프로그램을 만들어보도록 하겠습니다.

프로그램은 간단하게 짤 건데,

3명의 학생 정보를 입력해 초기화시키고, 그중에서 성적 우수자를 찾을 것입니다.

그럼 지금부터 프로그램을 작성해보도록 하겠습니다.

#include <stdio.h>

struct student
{
    int number;
    char name[100];
    double grade;
};

struct student list[] = {
    {20230001, "홍길동", 3.0},
    {20230002, "김철수", 3.8},
    {20230003, "김영희", 3.9}
};

int main()
{
    struct student superior;
    int i, size;

    size = sizeof(list) / sizeof(list[0]); // 배열의 크기 계산

    superior = list[0];

    for(i = 1; i < size; i++)
    {
        if(list[i].grade > superior.grade)
        {
            superior = list[i];
        }
    }

    printf("평점이 가장 높은 학생은 (학번 : %d, 이름 : %s, 성적 : %.2lf) 입니다.\n", superior.number, superior.name, superior.grade);

    return 0;
}

이렇게 작성을 했습니다.

여기서 추가가 된 한 가지는, 배열에 있는 원소의 최댓값을 구하는 for문을 넣은 겁니다.

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

평점이 가장 높은 학생은 (학번 : 20230003, 이름 : 김영희, 성적 : 3.90) 입니다.

이렇게 문제 없이 잘 나오는 것을 볼 수 있습니다.

 

여기까지 구조체와 typedef를 이용하여 여러 가지 문제들을 풀어봤는데요,

다음 포스팅 부터는 여러 가지 포인터를 활용하는 방법에 대하여 알아보도록 하겠습니다.

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

반응형

댓글