鱼C论坛

 找回密码
 立即注册
查看: 1968|回复: 2

c语言课后作业 数组 生命计算器

[复制链接]
发表于 2022-10-7 21:24:37 | 显示全部楼层 |阅读模式

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

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

x

下面是我写的代码,不知道为什么用vscode运行结果老有问题而且数据还会变,用dec运行就没问题

=============================================================
#include <stdio.h>

int main()
{
    int total;
    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int year1, month1, day1, year2, month2, day2;
    int d1;
    int spy; //闰年储存
    int k = 1, i, j=1;
int Y, D1,D2;
first:
    printf("请输入你的生日(如1988-05-20):");
    scanf("%d-%d-%d", &year1, &month1, &day1);
   
    if(month1>12||day1>days[month1-1])
{
            printf("输入有错,请重新输入!\n");
            goto first;
        }
        
    printf("请输入今天的日期(如2016-03-28):");
    scanf("%d-%d-%d", &year2, &month2, &day2);


    if (year2 > year1)
    {
        Y = year2 - year1 - 1;
        if(month2>12||day2>days[month2-1])
        {printf("输入有错,请重新输入!\n");
            goto first;
                }
    }
    else if (year1 == year2)
    {
        Y = 0;
        if (month1 > month2||month2>12)
        {
            printf("输入有错,请重新输入!\n");
            goto first;
        }
        else if (month1 == month2)
        {
            if (day1 > day2||day2>days[month2-1])
            {
                printf("输入有错,请重新输入!\n");
                goto first;
            }
            else if (day1 == day2)
            {
                goto final;
            }
        }
    }
    else
    {
        printf("输入有错,请重新输入!\n");
        goto first;
    } //计算中间年

    if (year1 % 400 == 0 || year1 % 4 == 0 && year1 % 100 != 0)
    {
        days[1] = 29;

        while (k < month1)
        {
            D1 = D1 + days[k - 1];
            k++;
        }
        if (k == month1)
        {
            D1 = D1 + day1;
        }
        d1=D1;
        D1 = 366 - D1;
    } //头年为闰计算天数
    else
    {
        days[1] = 28;

        while (k < month1)
        {
            D1 = D1 + days[k - 1];
            k++;
        }
        if (k == month1)
        {
            D1 = D1 + day1;
        }
        d1=D1;
        D1 = 365 - D1;
    }//头年为平计算天数

        if (year2 % 400 == 0 || year2 % 4 == 0 && year2 % 100 != 0)
    {
        days[1] = 29;

        while (j < month2)
        {
            D2 = D2 + days[j - 1];
            j++;
        }
        if (j == month2)
        {
            D2 = D2 + day2;
        }
      
    } //尾年为闰计算天数
    else
    {
        days[1] = 28;

        while (j < month2)
        {
            D2 = D2 + days[j - 1];
            j++;
        }
        if (j == month2)
        {
            D2 = D2 + day2;
        }
    }//尾年为平计算天数

    if (Y > 0)
    {
        for (i = 1; year1 + i < year2; i++)
        {
            if ((year1 + i) % 400 == 0 || (year1 + i) % 4 == 0 && (year1 + i) % 100 != 0)
            {
                spy++;
               
            }
        }
    } //计算中间闰年

    total=D1+D2+365*Y+spy;

    if(year1==year2)
    {
        total=total-D1-d1;
    }
    printf("D1=%d,D2=%d.d1=%d\n",D1,D2,d1);
final:
    printf("你在这个世界上总共生存了%d天\n", total);
    return 0;
}
======================================================================
dev结果:
请输入你的生日(如1988-05-20):2021-10-7
请输入今天的日期(如2016-03-28):2022-10-7
D1=85,D2=280.d1=280
你在这个世界上总共生存了365天
======================================================================
vscode结果:
请输入你的生日(如1988-05-20):2021-10-7
请输入今天的日期(如2016-03-28):2022-10-7
D1=84,D2=33038.d1=281
你在这个世界上总共生存了33691天
======================================================================
为什么会这样,是编译器的问题吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-7 22:07:42 | 显示全部楼层
本帖最后由 桃花飞舞 于 2022-10-7 22:08 编辑

dev的结果是正确的,你可以自己计算下,vscode的D2=33038的值明显的不对d1=281的值比280多了1也不对不过误差不大,这要看你的D2是干什么的了,暂时没看懂你的D2是什么值?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-7 23:07:39 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-8 00:39 编辑

        试试这个代码,看看有没有差别
#include <stdio.h>
#include <time.h>

void today(int * year , int * month , int * day)
{
        time_t T                                                                                                      ;
        struct tm * TM                                                                                                ;
        time(& T)                                                                                                     ;
        TM = localtime(& T)                                                                                           ;
        * year   = TM -> tm_year + 1900                                                                               ;
        * month  = TM -> tm_mon  + 1                                                                                  ;
        * day    = TM -> tm_mday                                                                                      ;
}

int leapyear(int y)
{
        return ((! (y % 4) && y % 100) || ! (y % 400)) ? 1 : 0                                                        ;
}

int monthdays(int y , int m)
{
        int r , md[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}                                               ;
        r = 0                                                                                                         ;
        if(y >= 1900 && y <= 2999 && m > 0 && m < 13) {
                r = md[m - 1]                                                                                         ;
                if(leapyear(y) && m == 2) r += 1                                                                      ;
        }
        return r                                                                                                      ;
}

int check(int y , int m , int d)
{
        int e , r                                                                                                     ;
        r = 0                                                                                                         ;
        if(y >= 1900 && y <= 2999 && m > 0 && m < 13 && d >= 1 && d <= monthdays(y , m)) r = 1                        ;
        return r                                                                                                      ;
}

int days(int y[] , int m[] , int d[])
{
        int a , b , ds                                                                                                ;
        ds = 0                                                                                                        ;
        if(y[1] > y[0] || (y[1] == y[0] && m[0] < m[1]) || (y[1] == y[0] && m[0] == m[1]) && d[0] <= d[1]) {
                if(y[0] == y[1] && m[0] == m[1]) {
                        ds = d[1] - d[0]                                                                              ;
                } else if(y[0] == y[1]) {
                        ds = monthdays(y[0] , m[0]) - d[0]                                                            ;
                        for(b = m[0] + 1 ; b < m[1] ; b ++) ds += monthdays(y[0] , b)                                 ;
                        ds += d[1]                                                                                    ;
                } else {
                        ds = monthdays(y[0] , m[0]) - d[0]                                                            ;
                        for(b = m[0] + 1 ; b < 13 ; b ++) ds += monthdays(y[0] , b)                                   ;
                        for(a = y[0] + 1 ; a < y[1] ; a ++) ds += (leapyear(a)) ? 366 : 365                           ;
                        for(b = 1 ; b < m[1] ; b ++) ds += monthdays(y[1] , b)                                        ;
                        ds += d[1]                                                                                    ;
                }
        }
        return ds + 1                                                                                                 ;
}

int years(int y[] , int m[] , int d[])
{
        int ys , a                                                                                                    ;
        ys = 0                                                                                                        ;
        if(y[1] > y[0]) {
                ys = y[1] - y[0]                                                                                      ;
                if(m[0] > m[1] || (m[0] == m[1] && d[0] > d[1])) ys --                                                ;
        }
        return ys                                                                                                     ;
}

int main(void)
{
        int y[2] , m[2] , d[2]                                                                                        ;
        today(& y[1] , & m[1] , & d[1])                                                                               ;
        printf("今天是 : %4d-%02d-%02d\n" , y[1] , m[1] , d[1])                                                       ;
        printf("输入您的出生日期 (y-m-d) : ")                                                                         ;
        scanf("%d-%d-%d" , & y[0] , & m[0] , & d[0])                                                                  ;
        if(check(y[0] , m[0] , d[0]) && (y[0] < y[1] || (y[0] == y[1] && m[0] < m[1]) || (y[0] == y[1] && m[0] == m[1] && d[0] <= d[1]))) {
                printf("今天是阁下生命中的第 【%5d】 天!\n" , days(y , m , d))                                        ;
                if(m[1] == m[0] && d[1] == d[0]) {
                        printf("     今天是阁下 【%2d】 周岁的生辰!\n" , years(y , m , d))                            ;
                        printf("                   祝阁下生日快乐!\n")                                                ;
                } else {         
                        printf("           阁下已经 【%2d】 周岁了!\n" , years(y , m , d))                            ;
                }
        } else {
                printf("日期输入错误!")                                                                              ;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 14:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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