C语言计算生活了多少天(个人练习)

个人思路

前言

这个题目已经被讲到烂了, 但是作为学习者, 不能只听不做, 或者照葫芦画瓢, 这样的学习方法可能收益不大,  学习代码的这个事情, 听完之后, 眼睛会了之后, 自己也要亲自手敲一遍, 才算是完成了这项知识点的学习.

于是我花了差不多半天的时间才做了出来 .........

所以说嘛 一定要自己来一遍 自己手敲一遍

于是我做出了跟老师讲的又不一样的方法 来解决这个问题

核心逻辑

① 计算一共经历了多少年

        闰年 + 366

        非闰年 + 365

② 计算月份部分

       2月份的话

                       闰年 29 天

                      非闰年 28 天

       除了2月份, 其它通通 "多退少补"

③ 计算 日 部分

        多退少补

Debug之路

逻辑很简单对吧

逻辑是很简单, 代码写出来之后, 一般正常人总是会报错 或者 结果不符合预期的

那就慢慢修改 如果不细心 就会跟我一样 修了半天

最简单的Debug方法就是printf 出来啦

代码调试的差不多了 就可以去参考正确答案了

用Excel参考就可以

把日期打算去 用一个日期减去 另外一个日期 即可 

如果答案一模一样 那么任务就完成了

Demo展示

请输入您的生日:
(年 月 日)
如 :2000 1 1
2019 9 1
您的生日为 2019 9 1
今天的日期 2022 12 21
您一共经历了 1207 个日夜
距离今年的生日 111 天

Process finished with exit code 0

代码演练

精简版

#include <stdio.h>
#include <time.h>

int main() {

    int The_Days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int Birthday[3] = {2000, 2, 19};
    int Today[3] = {2022, 9, 22};

    struct tm t;
    time_t now;
    time(&now);
    localtime_s(&t, &now);
    Today[0] = (t.tm_year + 1900);
    Today[1] = (t.tm_mon + 1);
    Today[2] = t.tm_mday;

    int Days = 0;
    int Actual_Days = 0;
    int mark = 0;

    printf("请输入您的生日:\n");
    printf("(年 月 日)\n");
    printf("如 :2000 1 1\n");
    scanf("%d %d %d", &Birthday[0], &Birthday[1], &Birthday[2]);
    printf("您的生日为 %d %d %d\n", Birthday[0], Birthday[1], Birthday[2]);
    printf("今天的日期 %d %d %d\n", Today[0], Today[1], Today[2]);

    if (((0 == Birthday[0] % 4) && (0 != Birthday[0] % 100)) || (0 == Birthday[0] % 400)) {
        if (Birthday[1] > 2) {
            Days += 365;
        } else if (Birthday[1] == 2 && Birthday[2] == 29) {
            Days += 365;
        } else {
            Days += 366;
        }
    }
    else{
        Days += 365;
    }
    for (int i = (Birthday[0] + 1); i < Today[0]; ++i) {
        if (((0 == i % 4) && (0 != i % 100)) || (0 == i % 400)){
            Days += 366;
        }
        else{
            Days += 365;
        }
    }

    if(Birthday[1] < Today[1]){
        for (int j = Birthday[1]; j < Today[1]; ++j) {
            if (j == 2) {
                if (((0 == Today[0] % 4) && (0 != Today[0] % 100)) || (0 == Today[0] % 400)){
                    Actual_Days += (The_Days[j] + 1);
                }
                else{
                    Actual_Days += The_Days[j];
                }
            }
            else{
                Actual_Days += The_Days[j];
            }
        }
    }
    else if(Birthday[1] > Today[1]){
        for (int j = Today[1]; j < Birthday[1]; ++j) {
            if (j == 2) {
                if (((0 == Today[0] % 4) && (0 != Today[0] % 100)) || (0 == Today[0] % 400)){
                    Actual_Days -= (The_Days[j] + 1);
                }
            }
            else{
                Actual_Days -= The_Days[j];
            }
        }
    }
    mark += Actual_Days;
    Days += Actual_Days;
    Actual_Days = 0;

    if(Birthday[2] > Today[2]){
        Actual_Days = Today[2] - Birthday[2];
    }
    else if (Birthday[2] < Today[2]){
        Actual_Days = Today[2] - Birthday[2];
    }
    mark += Actual_Days;
    Days += Actual_Days;
    Actual_Days = 0;

    printf("您一共经历了 %d 个日夜\n", Days);
    printf("距离今年的生日 %d 天\n", mark);

    return 0;
}

原版

#include <stdio.h>
#include <time.h>

int main() {

    int The_Days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int Birthday[3] = {2000, 2, 19};
    int Today[3] = {2022, 9, 22};

//    int Birthday[3] = {2000, 2, 19};
//    int Today[3] = {2022, 1, 22};

//    int Birthday[3] = {2000, 2, 19};
//    int Today[3] = {2022, 2, 22};

//    printf("年:%d\n", t.tm_year + 1900);
//    printf("月:%d\n", t.tm_mon + 1);
//    printf("日:%d\n", t.tm_mday);

//    名为t的tm结构指针?
    struct tm t;   //tm结构指针

//    名为now 类型为time_t的 变量
    time_t now;  //声明time_t类型变量
//    time(&now);// 等同于now = time(NULL)
    time(&now);      //获取系统日期和时间
//    获取咱东八区的日期和时间
    localtime_s(&t, &now);   //获取当地日期和时间
    Today[0] = (t.tm_year + 1900);
    Today[1] = (t.tm_mon + 1);
    Today[2] = t.tm_mday;

    int Days = 0;
    int Actual_Days = 0;
    int mark = 0;

    printf("请输入您的生日:\n");
    printf("(年 月 日)\n");
    printf("如 :2000 1 1\n");
    scanf("%d %d %d", &Birthday[0], &Birthday[1], &Birthday[2]);
    printf("您的生日为 %d %d %d\n", Birthday[0], Birthday[1], Birthday[2]);
    printf("今天的日期 %d %d %d\n", Today[0], Today[1], Today[2]);
//    printf("请输入您出生后的某个日期:\n");
//    printf("年 月 日\n");
//    printf("如 :2000 1 1\n");
//    scanf("%d %d %d", &Today[0], &Today[1], &Today[2]);



//    年
//    --------------------------------------------------------------------------------------
    if (((0 == Birthday[0] % 4) && (0 != Birthday[0] % 100)) || (0 == Birthday[0] % 400)) {
        if (Birthday[1] > 2) {
            Days += 365;
        } else if (Birthday[1] == 2 && Birthday[2] == 29) {
            Days += 365;
        } else {
            Days += 366;
        }
    }
    else{
        Days += 365;
    }
//    以上是头一年的特殊情况 原因是闰年2月份29号
//    ----------------------------------------------------------------
    for (int i = (Birthday[0] + 1); i < Today[0]; ++i) {
        if (((0 == i % 4) && (0 != i % 100)) || (0 == i % 400)){
            Days += 366;
        }
        else{
            Days += 365;
        }
//        printf("年份部分统计得出 %d \n",Days);
    }

//    月
//    --------------------------------------------------------------------------------------
//    当前日期比生日晚了
    if(Birthday[1] < Today[1]){
        for (int j = Birthday[1]; j < Today[1]; ++j) {
            if (j == 2) {
                if (((0 == Today[0] % 4) && (0 != Today[0] % 100)) || (0 == Today[0] % 400)){
                    Actual_Days += (The_Days[j] + 1);
                }
                else{
                    Actual_Days += The_Days[j];
                }
            }
            else{
                Actual_Days += The_Days[j];
            }
//            printf("当前月份比生日月份晚了 %d \n",Actual_Days);
        }
    }

    //    当前日期比生日早了
    else if(Birthday[1] > Today[1]){
        for (int j = Today[1]; j < Birthday[1]; ++j) {
            if (j == 2) {
                if (((0 == Today[0] % 4) && (0 != Today[0] % 100)) || (0 == Today[0] % 400)){
                    Actual_Days -= (The_Days[j] + 1);
                }
            }
            else{
                Actual_Days -= The_Days[j];
            }
//            printf("当前月份比生日月份早了 %d \n",Actual_Days);
        }
    }
    mark += Actual_Days;
    Days += Actual_Days;
//        printf("月份部分统计得出 %d \n",Days);
    Actual_Days = 0;

//    日
//    --------------------------------------------------------------------------------------
    if(Birthday[2] > Today[2]){
        Actual_Days = Today[2] - Birthday[2];
    }
    else if (Birthday[2] < Today[2]){
        Actual_Days = Today[2] - Birthday[2];
    }
//    printf("每日累计得出 %d \n",Actual_Days);
    mark += Actual_Days;
    Days += Actual_Days;
    Actual_Days = 0;
//    printf("累计得出 %d \n",Days);

    printf("您一共经历了 %d 个日夜\n", Days);
    printf("距离今年的生日 %d 天\n", mark);

    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
绝对的练习 计算活过的数(C语言),本人刚刚学,大家多多指教。 #include "stdio.h" int main(void) { int erorr1(); int y/*年*/,m/*月*/,d/*日*/,t1,t2/*头一年活过的数*/,tlife/*活过的总数*/,i/*循环计数器*/,i1=0/*闰年计数器*/,r1/*闰年判断*/; printf("--------------------------------------------------------------------------------"); printf("计算活过的数(更新到2010/3/10)\n"); printf("--------------------------------------------------------------------------------"); printf("输入生日(如1987/3/30):"); scanf("%d/%d/%d",&y,&m,&d);/*输入生日*/ if ((y%4==0 && y%100!=0)||(y%100==0 && y%400==0))/*判断是否是闰年*/ r1=1; else r1=0; switch(m)/*分情况讨论输入的月份*/ { case 1: if(d>0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d<32) /*判断日子是否输入有误*/ { t1=31+28+31+30+31+30+31+31+30+31+30+d; } else { erorr1(); return 0; } break; default:/*避免月份输入有误*/ erorr1(); return 0; } /*通过判断输入的月份来计算头年活过的数*/ t2=365-t1; if (r1==1&&(t1<=59)) t2++;/*闰年活过的头年的数*/ for(i=y+1;i0) printf("你总共活了%d,珍惜生命,因为它不会重来!\n",tlife); else if (tlife<0) printf("你总共活了%d(貌似还没出生)别乱来,生命不能拿来开玩笑!\n",tlife); else printf("你总共活了%d(刚刚出生的宝宝)赶紧喊你妈妈给你喂奶!\n",tlife); printf("--------------------------------------------------------------------------------"); main(); } int erorr1() { printf("生日输入有误!\n按任意键退出..."); getch(); return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CCSBRIDGE

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值