본문 바로가기
카테고리 없음

[예제] C언어로 생년월일을 입력받아 만나이와 별자리를 알려주는 프로그램

by heydayz 2024. 8. 7.

C언어로 생년월일을 입력받아 만나이와 별자리를 알려주는 프로그램 시뮬레이션

C언어로 생년월일을 입력받아 만나이와 별자리를 알려주는 프로그램을 만들기 위해서는 첫번째로 날짜 계산을 하는 법을 코드로 작성하는 것이 중요합니다. 프로그램 사용자에게 생년월일을 입력받을 시에는 가장 중요한 것이 윤년을 처리해야 합니다. 윤년이란 지구가 태양 주위를 한 바퀴 도는 데 걸리는 시간이 365.2422일 정도이기 때문에, 매년 365일로 계산하면 4년마다 약 하루의 차이가 발생합니다. 이러한 오차를 줄이기 위해 4년마다 하루를 더하여 366일로 만든 해를 윤년이라고 합니다. 그렇기 때문에 사용자가 태어난 해가 4로 나누어 떨어지는 해를 윤년이라 보고 계산하는 프로그램을 설정해야 합니다. 또한, 월별 일수 고려하여 별자리 계산해야 합니다. 별자리는 태양의 황도 12궁을 기준으로 생년월일을 매칭을 해야합니다.

코드 구현 및 설명

#include <stdio.h>

// 별자리 정보를 저장하는 구조체
struct Zodiac {
    int start_month, start_day;
    int end_month, end_day;
    char *name;
};

// 별자리 데이터 초기화
void initZodiac(struct Zodiac zodiac[]) {
    // 각 별자리의 시작과 끝 날짜를 설정 (예시)
    zodiac[0] = {1, 20, 2, 18, "물병자리"};
    // ... 나머지 별자리 데이터 추가 ...
}

// 윤년 판별 함수
int isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

// 월별 일수를 반환하는 함수
int daysInMonth(int year, int month) {
    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (month == 2 && isLeapYear(year)) {
        return 29;
    }
    return days[month - 1   
1. github.com 
github.com
];
}

// 만 나이 계산 함수
int calculateAge(int birthYear, int birthMonth, int birthDay, int currentYear, int currentMonth, int currentDay) {
    int age = currentYear - birthYear;
    if (currentMonth < birthMonth || (currentMonth == birthMonth && currentDay < birthDay)) {
        age--;
    }
    retu   
1. github.com 
github.com
rn age;
}

// 별자리 찾기 함수
char* findZodiac(struct Zodiac zodiac[], int birthMonth, int birthDay) {
    for (int i = 0; i < 12; i++) {
        if ((birthMonth >= zodiac[i].start_month && birthMonth <= zodiac[i].end_month) &&
            (birthDay >= zodiac[i].start_day && birthDay <= zodiac[i].end_day)) {
            return zodiac[i].name;
        }
    }
    return "알 수 없는 별자리";
}

int main() {
    struct Zodiac zodiac[12];
    initZodiac(zodiac);

    int birthYear, birthMonth, birthDay;
    printf("생년월일을 입력하세요 (YYYY MM DD): ");
    scanf("%d %d %d", &birthYear, &birthMonth, &birthDay);

    int currentYear = 2024; // 현재 연도 (수정 필요)
    int currentMonth = 12; // 현재 월 (수정 필요)
    int currentDay = 31; // 현재 일 (수정 필요)

    int age = calculateAge(birthYear, birthMonth, birthDay, currentYear, currentMonth, currentDay);
    char *zodiacSign = findZodiac(zodiac, birthMonth, birthDay);

    printf("만 나이는 %d세이며, 별자리는 %s입니다.\n", age, zodiacSign);

    return 0;
}

struct Zodiac : 별자리 정보를 저장하는 구조체를 말합니다.

void initZodiac(struct Zodiac zodiac[]) : 별자리 데이터 초기화를 말합니다.

int calculateAge(int birthYear, int birthMonth, int birthDay, int currentYear, int currentMonth, int currentDay) : 만 나이를 계산하기 위한 함수입니다.

char* findZodiac(struct Zodiac zodiac[], int birthMonth, int birthDay) : 별자리 찾기 함수입니다.

코드 설명

별자리 구조체: 별자리의 시작과 끝 날짜, 이름을 저장하는 구조체를 정의합니다.

별자리 초기화: 각 별자리의 정보를 구조체 배열에 초기화합니다.

윤년 판별: 윤년 여부를 판별하는 함수입니다.

월별 일수: 월별 일수를 반환하는 함수입니다.

만 나이 계산: 생년월일과 현재 날짜를 기반으로 만 나이를 계산하는 함수입니다.

별자리 찾기: 생년월일을 기반으로 해당 별자리를 찾는 함수입니다.

메인 함수: 별자리 데이터 초기화 사용자에게 생년월일 입력 받기 현재 날짜 설정 (수정 필요)

만 나이와 별자리 계산 및 출력 독창성 및 개선점 구조체 활용: 별자리 정보를 효율적으로 관리하기 위해 구조체를 사용했습니다.

윤년 처리: 윤년을 고려하여 정확한 나이 계산이 가능하도록 했습니다.

월별 일수 함수: 월별 일수를 계산하는 함수를 별도로 구현하여 코드 가독성을 높였습니다.

별자리 찾기 함수: 별자리를 찾는 로직을 함수로 분리하여 코드 재사용성을 높였습니다.

현재 날짜 설정: 현재 날짜를 하드코딩하는 대신, 시스템 시간을 이용하여 동적으로 설정할 수 있도록 개선할 수 있습니다. 오류 처리: 사용자가 잘못된 날짜를 입력하는 경우에 대한 오류 처리를 추가할 수 있습니다. 다양한 별자리 체계: 서양 별자리 외에도 동양 별자리 등 다양한 별자리 체계를 지원할 수 있도록 확장할 수 있습니다.