鱼C论坛

 找回密码
 立即注册
查看: 1496|回复: 11

[已解决]假定已知年月日,计算出这是该年的第几天,求友友指点代码

[复制链接]
发表于 2023-3-15 20:14:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
         //假定已知年月日,计算出这是该年的第几天
int main(){
    int year;
    int month;
    int day;
   
    printf("请输入年月日:");
    scanf("%d%d%d",&year,&month,&day);
   
    if((year%4==0&&year%100!=0)||year%400==0)
        printf("%d是闰年",year);
        else
        printf("%d不是闰年",year);//此前为判断闰否年
       
        int sum=0;
        int i=month;
        int j=day;
       
        while(!(month==i&&day==j)){
           
        while(month==1||month==3||month==5||month==7||month==8||month==10||month==12){//这些月份为31天
                 sum++;
                if(day==31)
                break;
             }
            while(month==4||month==6||month==9||month==11){
                 sum++;
                if(day==30)
                break;
            }
        }
       
        printf("这是%d年的第%d天",year,sum);
       
    return 0;
}
最佳答案
2023-3-15 20:17:23
你的代码存在一些问题。首先,你需要确定计算每个月份的总天数,而不是仅仅增加天数。其次,在循环中使用 while 似乎并不适当。此外,你还需要考虑闰年二月的情况。我已经修改了你的代码,修复了这些问题:
#include <stdio.h>

int main() {
    int year, month, day;
    
    printf("请输入年月日:");
    scanf("%d%d%d", &year, &month, &day);
    
    int is_leap_year = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    int days_in_month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    if (is_leap_year) {
        days_in_month[2] = 29;
    }
    
    int days_passed = 0;
    for (int i = 1; i < month; i++) {
        days_passed += days_in_month[i];
    }
    days_passed += day;
    
    printf("这是%d年的第%d天\n", year, days_passed);
    
    return 0;
}
这个修改后的代码应该可以正确地计算给定年月日是该年的第几天。

请注意,我使用了一个数组 days_in_month 来存储每个月的天数,如果是闰年,就更新二月的天数。

最后,使用一个 for 循环累加已过去的天数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-15 20:17:23 | 显示全部楼层    本楼为最佳答案   
你的代码存在一些问题。首先,你需要确定计算每个月份的总天数,而不是仅仅增加天数。其次,在循环中使用 while 似乎并不适当。此外,你还需要考虑闰年二月的情况。我已经修改了你的代码,修复了这些问题:
#include <stdio.h>

int main() {
    int year, month, day;
    
    printf("请输入年月日:");
    scanf("%d%d%d", &year, &month, &day);
    
    int is_leap_year = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    int days_in_month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    if (is_leap_year) {
        days_in_month[2] = 29;
    }
    
    int days_passed = 0;
    for (int i = 1; i < month; i++) {
        days_passed += days_in_month[i];
    }
    days_passed += day;
    
    printf("这是%d年的第%d天\n", year, days_passed);
    
    return 0;
}
这个修改后的代码应该可以正确地计算给定年月日是该年的第几天。

请注意,我使用了一个数组 days_in_month 来存储每个月的天数,如果是闰年,就更新二月的天数。

最后,使用一个 for 循环累加已过去的天数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2023-3-15 20:47:50 | 显示全部楼层
isdkz 发表于 2023-3-15 20:17
你的代码存在一些问题。首先,你需要确定计算每个月份的总天数,而不是仅仅增加天数。其次,在循环中使用 w ...

大神,17和20行有点不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-15 20:54:17 | 显示全部楼层
啊这啧啧啧 发表于 2023-3-15 20:47
大神,17和20行有点不懂


第17行:for (int i = 1; i < month; i++) {

这是一个 for 循环,它的目的是遍历从1到给定的 month - 1(不包含 month 本身)的所有月份。

这里的变量 i 用作月份的计数器。循环的执行顺序是从1开始(即1月),递增到 month - 1(即输入的月份的前一个月份)。



第18行:days_passed += days_in_month[i];

这行代码是在循环中执行的。它将 days_in_month[i](即第 i 个月的天数)累加到 days_passed(已经过去的天数)。

因此,当循环结束时,days_passed 将包含从1月到 month - 1 月(不包含 month 本身)的所有月份的天数总和。



第20行:days_passed += day;

这行代码在循环外执行。在完成对之前月份的天数累加后,我们需要将输入的当月的天数(即 day)加入已过去的天数。

因此,days_passed 现在包含了从年初到输入日期的总天数。



简而言之,这段代码的目的是计算从年初到输入日期(包括输入的月和日)的总天数。它首先累加输入月份之前所有月份的天数,然后加上输入的当月天数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2023-3-15 21:09:55 | 显示全部楼层
isdkz 发表于 2023-3-15 20:54
第17行:for (int i = 1; i < month; i++) {

这是一个 for 循环,它的目的是遍历从1到给定的 month  ...

好的好的,为什么我运行出来的结果不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-16 11:29:40 | 显示全部楼层
本帖最后由 两手空空儿 于 2023-3-16 11:31 编辑
啊这啧啧啧 发表于 2023-3-15 21:09
好的好的,为什么我运行出来的结果不对


有没有可能是你输入的不对,导致结果不对? 输入的时候你并没有设置分隔符
输入完以后输出一下年月日验证一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-16 20:39:17 | 显示全部楼层
两手空空儿 发表于 2023-3-16 11:29
有没有可能是你输入的不对,导致结果不对? 输入的时候你并没有设置分隔符
输入完以后输出一下年月日 ...

输出都是29天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-16 22:02:23 | 显示全部楼层
#include <stdio.h>

int main(void) {
        int year, month, day, days = 0;
        printf("请输入年月日:");
        scanf("%d%d%d", &year, &month, &day);
        days += day;
        for (int m = 1; m < month; ++m) {
                days += m == 2 ? 28 : (m < 8 && m & 1) || (m > 7 && !(m & 1)) ? 31 : 30;
        }
        days += ((!(year % 4) && (year % 100)) || !(year % 400));
        printf("这是%d年的第%d天", year, days);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-17 10:11:18 | 显示全部楼层
我用2楼的代码加了个循环,输出完全没有问题,你再检查一下自己的输入吧
00110.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-17 22:57:35 | 显示全部楼层
两手空空儿 发表于 2023-3-17 10:11
我用2楼的代码加了个循环,输出完全没有问题,你再检查一下自己的输入吧

唉,好像是的哎。不过,为什么用,或者;就有点问题呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-18 09:08:54 | 显示全部楼层
啊这啧啧啧 发表于 2023-3-17 22:57
唉,好像是的哎。不过,为什么用,或者;就有点问题呢

scanf("%d%d%d",&year,&month,&day);

没有指定分隔符号,默认是空格或换行

scanf("%d,%d,%d",&year,&month,&day);   这样是用“,”分隔,输入的时候要用“,”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-3-18 12:30:04 | 显示全部楼层
两手空空儿 发表于 2023-3-18 09:08
scanf("%d%d%d",&year,&month,&day);

没有指定分隔符号,默认是空格或换行

好的好的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 17:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表