C语言分支练习摘选+解析(会涉及数组)

 本大师来了~


分支:问题 K: 【C1】【多分支】【课外】求年月

题目描述

 输入年份和这一年的第几天,输出具体的年、月、日的信息。(注意闰年的判断!)

输入

输入两个整数分别代表年份和这一年的第几天。(假设数据都在有效范围内)

输出

输出对应的年、月、日。输出的数字之间以一条横线间隔,输出完毕换行。

样例输入 

2011 20

样例输出 

2011-1-20

 提示

非闰年,区分第31天、第59天、第90天、第120天、151天、181天、212天、243天、第273天、第304天、334天。

闰年的话,相应调整。

如果学过数组,比较容易。

没学过数组,用多个if一一枚举,也是可以的。

 思路分析

 讨论点:年份为闰年时二月份的天数不一样,为29;每个月份的天数不一样。

一、耐心进行情况讨论,全部用 if 分支实现

#include<stdio.h>
int main()
{
    int a,b,c,d;
    scanf("%d %d",&a,&b);
    if(((a%4==0)&&(a&100!=0))||(a%400==0))
    {
        if(b<32)
        {
            d=1;
            c=b;
        }
        if((b>31)&&(b<61))
        {
            d=2;
            c=b-31;
        }
        if((b>60)&&(b<92))
        {
            d=3;
            c=b-60;
        }
        if((b>91)&&(b<122))
        {
            d=4;
            c=b-91;
        }
        if((b>121)&&(b<153))
        {
            d=5;
            c=b-121;
        }
        if((b>152)&&(b<183))
        {
            d=6;
            c=b-152;
        }
        if((b>182)&&(b<214))
        {
            d=7;
            c=b-182;
        }
        if((b>213)&&(b<245))
        {
            d=8;
            c=b-213;
        }
        if((b>244)&&(b<275))
        {
            d=9;
            c=b-244;
        }
        if((b>274)&&(b<306))
        {
            d=10;
            c=b-274;
        }
        if((b>305)&&(b<336))
        {
            d=11;
            c=b-305;
        }
        if((b>335)&&(b<367))
        {
            d=12;
            c=b-335;
        }
    }
    else
    {
        if(b<32)
        {
            d=1;
            c=b;
        }
        if((b>31)&&(b<60))
        {
            d=2;
            c=b-31;
        }
        if((b>59)&&(b<91))
        {
            d=3;
            c=b-59;
        }
        if((b>90)&&(b<121))
        {
            d=4;
            c=b-90;
        }
        if((b>120)&&(b<152))
        {
            d=5;
            c=b-120;
        }
        if((b>151)&&(b<182))
        {
            d=6;
            c=b-151;
        }
        if((b>181)&&(b<213))
        {
            d=7;
            c=b-181;
        }
        if((b>212)&&(b<244))
        {
            d=8;
            c=b-212;
        }
        if((b>243)&&(b<274))
        {
            d=9;
            c=b-243;
        }
        if((b>273)&&(b<305))
        {
            d=10;
            c=b-273;
        }
        if((b>304)&&(b<335))
        {
            d=11;
            c=b-304;
        }
        if((b>334)&&(b<366))
        {
            d=12;
            c=b-334;
        }
    }
    printf("%d-%d-%d",a,d,c);
    return 0;
}

二、需掌握数组和循环

1)用空间为12的数组来存储每个月份的对应天数,由于数组下标是从0开始的,我们用下标0表示1月份,下标1表示2月份...

2)在循环里做减法使day控制在一个月份天数以内,同时通过 i 进行月份记录

#include<stdio.h>
main()
{
    int year,day,i=0;
    int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    //用于存储每个月的天数 
    scanf("%d %d",&year,&day);
    if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
        month[1]=29;//如果是闰年则改变2月份的天数
    while(i<12&&day>month[i])
            day-=month[i++];
    printf("%d-%d-%d",year,i+1,day);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值