啊这啧啧啧 发表于 2023-3-15 20:14:19

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

#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;
}

isdkz 发表于 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 = 29;
    }
   
    int days_passed = 0;
    for (int i = 1; i < month; i++) {
      days_passed += days_in_month;
    }
    days_passed += day;
   
    printf("这是%d年的第%d天\n", year, days_passed);
   
    return 0;
}
这个修改后的代码应该可以正确地计算给定年月日是该年的第几天。

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

最后,使用一个 for 循环累加已过去的天数。

啊这啧啧啧 发表于 2023-3-15 20:47:50

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

大神,17和20行有点不懂{:10_269:}

isdkz 发表于 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;

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

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



第20行:days_passed += day;

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

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



简而言之,这段代码的目的是计算从年初到输入日期(包括输入的月和日)的总天数。它首先累加输入月份之前所有月份的天数,然后加上输入的当月天数。

啊这啧啧啧 发表于 2023-3-15 21:09:55

isdkz 发表于 2023-3-15 20:54
第17行:for (int i = 1; i < month; i++) {

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

好的好的,为什么我运行出来的结果不对{:10_266:}

两手空空儿 发表于 2023-3-16 11:29:40

本帖最后由 两手空空儿 于 2023-3-16 11:31 编辑

啊这啧啧啧 发表于 2023-3-15 21:09
好的好的,为什么我运行出来的结果不对

有没有可能是你输入的不对,导致结果不对? 输入的时候你并没有设置分隔符
输入完以后输出一下年月日验证一下

啊这啧啧啧 发表于 2023-3-16 20:39:17

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

输出都是29天{:10_266:}

傻眼貓咪 发表于 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;
}

两手空空儿 发表于 2023-3-17 10:11:18

我用2楼的代码加了个循环,输出完全没有问题,你再检查一下自己的输入吧

啊这啧啧啧 发表于 2023-3-17 22:57:35

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

唉,好像是的哎。不过,为什么用,或者;就有点问题呢{:10_269:}

两手空空儿 发表于 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);   这样是用“,”分隔,输入的时候要用“,”

啊这啧啧啧 发表于 2023-3-18 12:30:04

两手空空儿 发表于 2023-3-18 09:08
scanf("%d%d%d",&year,&month,&day);

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


好的好的
页: [1]
查看完整版本: 假定已知年月日,计算出这是该年的第几天,求友友指点代码