[C언어 소스] 가장 가까운 친구를 찾아라. 구조체 배열 사용하기

안녕하세요. 언제나 휴일입니다.

이번에는 제일 가까운 친구를 찾는 프로그램을 만들어 보기로 할게요.

제일 먼저 n명(매크로 상수)의 친구 정보를 입력 받습니다.

그리고 자신의 위치를 입력받습니다.

마지막으로 자신의 위치에서 제일 가까운 친구를 찾아 친구 정보를 출력합니다.

매크로 상수 및 구조체 정의하기

위치를 표현하기 위해 x, y 좌표로 구성한 구조체를 정의합니다.

//좌표 구조체 형식 정의
typedef struct _Position
{
    int x;
    int y;
}Position;

회원 정보를 표현하기 위해 회원 이름과 좌표로 구성한 구조체를 정의합니다.

//회원 구조체 정의
#define MAX_NAME_LEN    256 //최대 이름 길이
typedef struct _MemberInfo {
    char name[MAX_NAME_LEN];
    Position position;
}MemberInfo;

작성할 함수 결정하기

n 명의 회원 정보를 입력 받는 함수가 필요하겠죠.

void InputMembers(MemberInfo *base, int n);//n명 회원 정보 입력

현재 위치를 입력 받는 함수도 정의합시다.

void InputNowPosition(Position* pnow);//현재 위치 입력

특정 위치에서 가장 가까운 친구를 찾는 함수도 필요하겠네요.

MemberInfo* FindNearest(MemberInfo* base, int n, Position* pnow);//pnow에서 가장 가까운 친구 위치 찾기

가장 가까운 친구를 찾는 과정에서 거리를 계산하는 함수를 사용해야 할 거예요.

double GetDistance(Position* p1, Position* p2);//p1~p2 거리 계산

함수 정의하기

InputMembers 만들기

n명의 회원 정보를 입력 받는 함수를 정의합시다.

void InputMembers(MemberInfo* base, int n)
{

for 문을 이용하여 n번 반복합니다.

    int i = 0;
    for (i = 0; i < n; i++)
    {

이름, x좌표, y좌표 순으로 입력 받습니다.

        printf("<%d>번째 멤버 정보를 입력해 주세요.\n", i + 1);
        printf("이름:");
        scanf_s("%s", base[i].name, MAX_NAME_LEN);
        printf("x좌표:");
        scanf_s("%d", &(base[i].position.x));
        printf("y좌표:");
        scanf_s("%d", &(base[i].position.y));
    }
}

InputNowPosition 만들기

현재 위치를 입력 받는 함수를 정의합시다.

void InputNowPosition(Position* pnow)
{

x좌표, y좌표 순으로 입력 받습니다.

    printf("현재 좌표를 입력해 주세요. \n");
    printf("x좌표:");
    scanf_s("%d", &(pnow->x));
    printf("y좌표:");
    scanf_s("%d", &(pnow->y));
}

FindNearest 만들기

특정 위치에서 가장 가까운 친구를 찾는 함수를 정의합시다.

MemberInfo* FindNearest(MemberInfo* base, int n, Position* pnow)
{

맨 앞에 있는 친구가 제일 가깝다고 초기화합니다.

    MemberInfo* nearest = base;//맨 앞에 있는 친구가 제일 가깝다고 초기화

인덱스 1 위치부터 마지막 위치의 친구와 거리를 계산합니다.

만약 nearest 친구보다 더 가까운 친구가 있으면 nearest를 변경합니다.

    double distance1, distance2;
    int i = 0;
    for (i = 1; i < n; i++)
    {
        distance1 = GetDistance(pnow,&(nearest->position));
        distance2 = GetDistance(pnow, &(base[i].position));        
        if (distance1 > distance2) //distance2가 더 가까울 때
        {
            nearest = base + i;//가장 가까운 친구 위치 변경
        }
    }

가장 가까운 친구 위치를 반환합니다.

    return nearest;//가장 가까운 친구 위치 반환
}

GetDistance 만들기

거리를 계산하는 함수를 정의합시다.

math.h 에서는 지수를 계산하는 pow 함수와 제곱근을 계산하는 sqrt 함수를 제공합니다.

이를 이용하여 두 좌표의 거리를 계산하여 반환합니다.

double GetDistance(Position* p1, Position* p2)
{
    return sqrt(pow(p1->x - p2->x, 2) + pow(p1->y - p2->y, 2));
}

main 함수 구현

이제 main 함수를 구현합시다.

최대 회원 수는 main함수 외부에 매크로 상수로 정의할게요.

#define MAX_MEMBER      5 //최대 회원 수

main 함수 시작 부분에서 회원 배열을 선언합시다.

int main()
{
    MemberInfo members[MAX_MEMBER]={0};

n명의 회원 정보를 입력 받는 함수를 호출합니다.

    InputMembers(members, MAX_MEMBER);//MAX_MEMBER명 회원 정보 입력

현재 위치를 기억할 변수를 선언하고 위치를 입력 받습니다.

    Position nowposition = { 0,0 };
    InputNowPosition(&nowposition); //현재 위치 입력

가장 가까운 친구를 찾는 함수를 호출합니다.

MemberInfo* nearest_member = FindNearest(members, MAX_MEMBER ,&nowposition);//가장 가까운 친구 찾기

가장 가까운 친구의 정보와 거리를 출력한 후 프로그램을 종료합니다.

    printf("가장 가까운 친구는 %s이며 (%d,%d)에 있습니다.\n", nearest_member->name, nearest_member->position.x, nearest_member->position.y);
    printf("현재 위치에서 %.2lf 떨어진 곳에 있습니다.\n", GetDistance(&nowposition, &(nearest_member->position)));
    return 0;
}

전체 소스 코드

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

//좌표 구조체 형식 정의
typedef struct _Position
{
    int x;
    int y;
}Position;


//회원 구조체 정의
#define MAX_NAME_LEN    256 //최대 이름 길이
typedef struct _MemberInfo {
    char name[MAX_NAME_LEN];
    Position position;
}MemberInfo;


#define MAX_MEMBER      5 //최대 회원 수
void InputMembers(MemberInfo *base, int n);//n명 회원 정보 입력
void InputNowPosition(Position* pnow);//현재 위치 입력
MemberInfo* FindNearest(MemberInfo* base, int n, Position* pnow);//pnow에서 가장 가까운 친구 위치 찾기
double GetDistance(Position* p1, Position* p2);//p1~p2 거리 계산


#define MAX_MEMBER      5 //최대 회원 수
int main()
{
    MemberInfo members[MAX_MEMBER]={0};
    InputMembers(members, MAX_MEMBER);//MAX_MEMBER명 회원 정보 입력

    Position nowposition = { 0,0 };
    InputNowPosition(&nowposition); //현재 위치 입력

    MemberInfo* nearest_member = FindNearest(members, MAX_MEMBER ,&nowposition);//가장 가까운 친구 찾기

    printf("가장 가까운 친구는 %s이며 (%d,%d)에 있습니다.\n", nearest_member->name, nearest_member->position.x, nearest_member->position.y);
    printf("현재 위치에서 %.2lf 떨어진 곳에 있습니다.\n", GetDistance(&nowposition, &(nearest_member->position)));
    return 0;
}
void InputMembers(MemberInfo* base, int n)
{
    int i = 0;
    for (i = 0; i < n; i++)
    {
        printf("<%d>번째 멤버 정보를 입력해 주세요.\n", i + 1);
        printf("이름:");
        scanf_s("%s", base[i].name, MAX_NAME_LEN);
        printf("x좌표:");
        scanf_s("%d", &(base[i].position.x));
        printf("y좌표:");
        scanf_s("%d", &(base[i].position.y));
    }
}
void InputNowPosition(Position* pnow)
{
    printf("현재 좌표를 입력해 주세요. \n");
    printf("x좌표:");
    scanf_s("%d", &(pnow->x));
    printf("y좌표:");
    scanf_s("%d", &(pnow->y));
}

MemberInfo* FindNearest(MemberInfo* base, int n, Position* pnow)
{
    MemberInfo* nearest = base;//맨 앞에 있는 친구가 제일 가깝다고 초기화
    double distance1, distance2;
    int i = 0;
    for (i = 1; i < n; i++)
    {
        distance1 = GetDistance(pnow,&(nearest->position));
        distance2 = GetDistance(pnow, &(base[i].position));        
        if (distance1 > distance2) //distance2가 더 가까울 때
        {
            nearest = base + i;//가장 가까운 친구 위치 변경
        }
    }
    return nearest;//가장 가까운 친구 위치 반환
}
double GetDistance(Position* p1, Position* p2)
{
    return sqrt(pow(p1->x - p2->x,2) + pow(p1->y - p2->y,2));
}