用C语言编写十二星座程序

一个人出生日期不同,就会处于不同的星座,星座与出生日期之间的对应关系如下:
白羊座:3月21日——4月19日
金牛座:4月20日——5月20日
双子座:5月21日——6月21日
巨蟹座:6月22日——7月22日
狮子座:7月23日——8月22日
处女座:8月23日——9月22日
天秤座:9月23日——10月23日
天蝎座:10月24日——11月22日
射手座:11月23日——12月21日
摩羯座:12月22日——1月19日
水瓶座:1月20日——2月18日
双鱼座:2月19日——3月20日

Input
第一行是一个正整数n,表示后续有n行数据。后面的n行中,每一行都有三个整数,中间用一个空格分开,表示一个人的出生日期,三个部分分别是出生日期的年、月、日。
Output
每个日期所属的星座,如果日期是不合法的,则输出雅典娜。

Sample Input
4
1976 11 26
1978 10 3
1979 3 14
1980 4 31
Sample Output
射手座
天秤座
双鱼座
雅典娜

供参考

#include <stdio.h>

typedef struct
{
    int year, month, day;
} DATE;

typedef struct
{
    char name[10];
    int sM;
    int sD;
    int eM;
    int eD;
} STARTS;

STARTS starts[] = {{""}, {"水瓶座", 1, 20, 2, 18}, {"双鱼座", 2, 19, 3, 20}, {"白羊座", 3, 21, 4, 19}, {"金牛座", 4, 20, 5, 20}, {"双子座", 5, 21, 6, 21}, {"巨蟹座", 6, 22, 7, 22}, {"狮子座", 7, 23, 8, 22}, {"处女座", 8, 23, 9, 22}, {"天秤座", 9, 23, 10, 23}, {"天蝎座", 10, 24, 11, 22}, {"射手座", 11, 23, 12, 21}, {"摩羯座", 12, 22, 1, 19}};

int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int Err(int y, int m, int d)
{
    int err = 0;
    int leap = (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0));

    if (y < 1 || m > 12 || m < 1 || d < 1)
        err = 1;
    if (m != 2 && d > month[m])
        err = 1;
    if (m == 2)
    {
        if (leap && d > month[m] + 1)
            err = 1;
        if (!leap && d > month[m])
            err = 1;
    }
    return err;
}

void con(DATE date)
{
    int m = date.month;

    if (date.day < starts[m].sD)
    {
        if (m == 1)
            m = 12;
        else
            m--;
    }

    printf("%s\n", starts[m].name);
}

int main()
{

    int n;
    scanf("%d", &n);
    DATE *date = (DATE *)malloc(n * sizeof(DATE));
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d%d", &date[i].year, &date[i].month, &date[i].day);
    }
    for (int i = 0; i < n; i++)
    {
        if (Err(date[i].year, date[i].month, date[i].day))
        {
            printf("雅典娜\n");
            continue;
        }
        con(date[i]);
    }

    system("pause");
    return 0;
}

感觉用swith-case比较简单:

#include <stdio.h>

char* star(int y,int m,int d)
{
    int s, leap = (m==2)*((y%4==0 && y%100!=0) || y%400==0);
    int month[13] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    s = (y<1||m<1||d<1||m>12||d>month[m-1]+leap)?0:m*100 + d;
    switch(s){
        case 321 ... 419:return (char*)"白羊座";
        case 420 ... 520:return (char*)"金牛座";
        case 521 ... 621:return (char*)"双子座";
        case 622 ... 722:return (char*)"巨蟹座";
        case 723 ... 822:return (char*)"狮子座";
        case 823 ... 922:return (char*)"处女座";
        case 923 ... 1023:return (char*)"天秤座";
        case 1024 ...1122:return (char*)"天蝎座";
        case 1123 ...1221:return (char*)"射手座";
        case 1222 ...1231:
        case 101 ... 119:return (char*)"摩羯座"; 
        case 120 ... 218:return (char*)"水瓶座";
        case 219 ... 320:return (char*)"双鱼座";
        default:
            return (char*)"雅典娜";
    }
}

int main() 
{ 
    int n;
    scanf("%d", &n);
    int date[n][3];
    for (int i = 0; i < n; i++){
        scanf("%d%d%d", &date[i][0], &date[i][1], &date[i][2]);
    }
    for (int i = 0; i < n; i++){
        printf("%s\n",star(date[i][0],date[i][1],date[i][2])); 
    }
    return 0; 
}