1100: C语言程序设计教程(第三版)课后习题11.1--定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天。【两种方法】

题目描述

定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。

输入

年月日

输出

当年第几天

样例输入

2000 12 31

样例输出

366

提示

来源

两种方法:

第一种方法理解起来比较容易,但是代码好像比较长,具体实现起来就是把截止到每一个月份末的天数都保存在一个数组里,然后用switch语句进行分支判断。

#include<stdio.h>
struct
{
    int y;
    int m;
    int d;
}d;
void main()
{
    int a[11]={31,59,90,120,151,181,212,243,273,304,334};//非闰年
    int b[11]={31,59+1,90+1,120+1,151+1,181+1,212+1,243+1,273+1,304+1,334+1};//闰年
    scanf("%d %d %d",&d.y,&d.m,&d.d);
    if(d.y%100==0)
    {
        if(d.y%400==0)
        {
            switch(d.m)
            {
                case 1:printf("%d",d.d);break;
                case 2:printf("%d",d.d+b[0]);break;
                case 3:printf("%d",d.d+b[1]);break;
                case 4:printf("%d",d.d+b[2]);break;
                case 5:printf("%d",d.d+b[3]);break;
                case 6:printf("%d",d.d+b[4]);break;
                case 7:printf("%d",d.d+b[5]);break;
                case 8:printf("%d",d.d+b[6]);break;
                case 9:printf("%d",d.d+b[7]);break;
                case 10:printf("%d",d.d+b[8]);break;
                case 11:printf("%d",d.d+b[9]);break;
                case 12:printf("%d",d.d+b[10]);break;
            }
        }
        else
        {
            switch(d.m)
            {
                case 1:printf("%d",d.d);break;
                case 2:printf("%d",d.d+a[0]);break;
                case 3:printf("%d",d.d+a[1]);break;
                case 4:printf("%d",d.d+a[2]);break;
                case 5:printf("%d",d.d+a[3]);break;
                case 6:printf("%d",d.d+a[4]);break;
                case 7:printf("%d",d.d+a[5]);break;
                case 8:printf("%d",d.d+a[6]);break;
                case 9:printf("%d",d.d+a[7]);break;
                case 10:printf("%d",d.d+a[8]);break;
                case 11:printf("%d",d.d+a[9]);break;
                case 12:printf("%d",d.d+a[10]);break;
            }
        }
    }
    else
    {
        if(d.y%4==0)
        {
            switch(d.m)
            {
                case 1:printf("%d",d.d);break;
                case 2:printf("%d",d.d+b[0]);break;
                case 3:printf("%d",d.d+b[1]);break;
                case 4:printf("%d",d.d+b[2]);break;
                case 5:printf("%d",d.d+b[3]);break;
                case 6:printf("%d",d.d+b[4]);break;
                case 7:printf("%d",d.d+b[5]);break;
                case 8:printf("%d",d.d+b[6]);break;
                case 9:printf("%d",d.d+b[7]);break;
                case 10:printf("%d",d.d+b[8]);break;
                case 11:printf("%d",d.d+b[9]);break;
                case 12:printf("%d",d.d+b[10]);break;
            }
        }
        else
        {
            switch(d.m)
            {
                case 1:printf("%d",d.d);break;
                case 2:printf("%d",d.d+a[0]);break;
                case 3:printf("%d",d.d+a[1]);break;
                case 4:printf("%d",d.d+a[2]);break;
                case 5:printf("%d",d.d+a[3]);break;
                case 6:printf("%d",d.d+a[4]);break;
                case 7:printf("%d",d.d+a[5]);break;
                case 8:printf("%d",d.d+a[6]);break;
                case 9:printf("%d",d.d+a[7]);break;
                case 10:printf("%d",d.d+a[8]);break;
                case 11:printf("%d",d.d+a[9]);break;
                case 12:printf("%d",d.d+a[10]);break;
            }
        }
    }
}


/**************************************************************
    Problem: 1100
    User: 171530425
    Language: C
    Result: 正确
    Time:0 ms
    Memory:1092 kb
****************************************************************/

我们也可以对上面的if判断做下优化,把所有闰年的情况放在一个if判断语句的判断体中,这样的话代码就少了一点儿

#include<stdio.h>
struct
{
    int y;
    int m;
    int d;
}d;
void main()
{
    int a[11]={31,59,90,120,151,181,212,243,273,304,334};//非闰年
    int b[11]={31,59+1,90+1,120+1,151+1,181+1,212+1,243+1,273+1,304+1,334+1};//闰年
    scanf("%d %d %d",&d.y,&d.m,&d.d);
    if((d.y%100==0&&d.y%400==0)||(d.y%4==0&&d.y%100!=0))
    {
        switch(d.m)
        {
            case 1:printf("%d",d.d);break;
            case 2:printf("%d",d.d+b[0]);break;
            case 3:printf("%d",d.d+b[1]);break;
            case 4:printf("%d",d.d+b[2]);break;
            case 5:printf("%d",d.d+b[3]);break;
            case 6:printf("%d",d.d+b[4]);break;
            case 7:printf("%d",d.d+b[5]);break;
            case 8:printf("%d",d.d+b[6]);break;
            case 9:printf("%d",d.d+b[7]);break;
            case 10:printf("%d",d.d+b[8]);break;
            case 11:printf("%d",d.d+b[9]);break;
            case 12:printf("%d",d.d+b[10]);break;
        }
    }
    else
    {
        switch(d.m)
        {
            case 1:printf("%d",d.d);break;
            case 2:printf("%d",d.d+a[0]);break;
            case 3:printf("%d",d.d+a[1]);break;
            case 4:printf("%d",d.d+a[2]);break;
            case 5:printf("%d",d.d+a[3]);break;
            case 6:printf("%d",d.d+a[4]);break;
            case 7:printf("%d",d.d+a[5]);break;
            case 8:printf("%d",d.d+a[6]);break;
            case 9:printf("%d",d.d+a[7]);break;
            case 10:printf("%d",d.d+a[8]);break;
            case 11:printf("%d",d.d+a[9]);break;
            case 12:printf("%d",d.d+a[10]);break;
        }
    }
}


第二种实现方法可能不太好理解,但是却实现起来却比较简单,我们不用提前算截至每一月末的天数了,并且代码也比较短

#include<stdio.h>
struct ri
{
    int y,m,d;
}p;
int main()
{
    int i,j,s=0,a=31,b=30,c=29;
    scanf("%d%d%d",&p.y,&p.m,&p.d);
    for(i=1;i<p.m;i++)//注意这里一定是小于p.m,因为我们要算的是截止上个月末的天数,当前月还没过完呢,并且给的有当前月的天数,保存在p.d中

    {
        if(i==1||i==3||i==5||i==7||i==8||i==10)
        {
            s+=a;
        }
        else if(i==4||i==6||i==9||i==11)
        {
            s+=b;
        }
        else if(i==2)
        {
            s+=c;
        }
    }
    s=s+p.d;
    if((p.y%4==0&&p.y%100!=0)||(p.y%400==0&&p.y%100==0))
    {
        if(p.m==1)
        {
            printf("%d",p.d);
        }
        else
        {
            printf("%d",s);
        }
    }
    else
    {
        if(p.m==1)
        {
            printf("%d",p.d);
        }
        else
        {
            printf("%d",s-1);
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

COCO56(徐可可)

建议微信红包:xucoco56

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值