孤殇兮 2022-06-14 11:00 采纳率: 92.9%
浏览 327
已结题

用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
射手座
天秤座
双鱼座
雅典娜

  • 写回答

2条回答 默认 最新

  • 浪客 2022-06-14 16:37
    关注
    供参考
    
    #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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 6月14日

悬赏问题

  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”