鱼C论坛

 找回密码
 立即注册
查看: 765|回复: 19

[已解决]C语言数组03(生命计算器1)

[复制链接]
发表于 2024-1-6 16:14:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 liyifeng295641 于 2024-1-8 10:56 编辑

1. 写一个生命计算器,要求用户输入生日,显示他在这个世界上活了多少天?

程序实现如下图:


                               
登录/注册后可看大图


@FishC这道题不会写,可以给点提示吗?
最佳答案
2024-1-6 16:36:04
#include <iostream>
#include <chrono>
#include <sstream>
#include <iomanip>

using namespace std;

chrono::system_clock::time_point parse_date(const string &date_str) {
    tm tm = {};
    istringstream ss(date_str);
    ss >> get_time(&tm, "%Y-%m-%d");
    return chrono::system_clock::from_time_t(mktime(&tm));
}

int main() {
    string birth_date_str, current_date_str;
    cout << "请输入您的生日(格式:YYYY-MM-DD): ";
    cin >> birth_date_str;

    cout << "请输入当前日期(格式:YYYY-MM-DD): ";
    cin >> current_date_str;

    auto birth_date = parse_date(birth_date_str);
    auto current_date = parse_date(current_date_str);

    auto duration = chrono::duration_cast<chrono::hours>(
                        current_date - birth_date).count() / 24;

    cout << "您在这个世界上活了 " << duration << " 天。" << endl;

    return 0;
}

好了,求最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-6 16:14:43 | 显示全部楼层
当计算一个人活了多少天时,我们需要知道他的出生日期和当前日期。然后,我们可以使用日期函数来计算天数差。

C语言中有各种处理日期和时间的函数库,其中一个常用的是`time.h`。你可以使用其中的`time()`函数来获取当前时间的秒数。然后,你还需要自己写一个函数来获取用户输入的生日。

下面是一个示例代码:

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

// 计算某年某月某日的天数
int daysInYearMonthDay(int year, int month, int day)
{
    int days = 0;
    int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    // 判断是否为闰年
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    {
        months[1] = 29;
    }
    
    for (int i = 0; i < month-1; ++i)
    {
        days += months[i];
    }
    
    return days + day;
}

// 获取用户输入的生日
void getBirthday(int *year, int *month, int *day)
{
    printf("请输入您的生日(格式为YYYY-MM-DD):");
    scanf("%d-%d-%d", year, month, day);
}

int main(void)
{
    int year, month, day;
    int currentYear, currentMonth, currentDay;
    int totalDays = 0;
    time_t t = time(NULL);
    struct tm *currentTime = localtime(&t);
    
    currentYear = currentTime->tm_year + 1900;
    currentMonth = currentTime->tm_mon + 1;
    currentDay = currentTime->tm_mday;
    
    getBirthday(&year, &month, &day);
    
    // 计算年份的天数
    for (int i = year; i < currentYear; ++i)
    {
        totalDays += (isLeapYear(i) ? 366 : 365);
    }
    
    // 计算生日当年的天数
    totalDays += daysInYearMonthDay(year, month, day);
    
    // 计算今年已经过去的天数
    totalDays += daysInYearMonthDay(currentYear, currentMonth, currentDay);
    
    printf("您已经在这个世界上活了 %d 天。\n", totalDays);
    
    return 0;
}

代码中的两个自定义函数`daysInYearMonthDay`和`getBirthday`分别用于计算某年某月某日是该年的第几天和获取用户输入的生日。主函数中,我们首先使用`time()`函数获取当前时间,然后提取出当前的年、月、日。接着通过`getBirthday`函数获取用户的生日,并使用`daysInYearMonthDay`函数计算出生日当年的天数。最后,我们将三个部分的天数相加得到总天数,输出结果。

需要注意的是,在计算年份的天数时,我们使用了一个判断闰年的函数`isLeapYear`,你需要自己实现这样一个函数。另外,我在代码中使用了`scanf`函数来获取用户的输入,但没有对输入是否合法进行判断,你可以进一步完善代码,确保用户输入的日期格式正确。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 16:16:06 | 显示全部楼层
我来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-6 16:17:33 | 显示全部楼层

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

使用道具 举报

发表于 2024-1-6 16:36:04 | 显示全部楼层    本楼为最佳答案   
#include <iostream>
#include <chrono>
#include <sstream>
#include <iomanip>

using namespace std;

chrono::system_clock::time_point parse_date(const string &date_str) {
    tm tm = {};
    istringstream ss(date_str);
    ss >> get_time(&tm, "%Y-%m-%d");
    return chrono::system_clock::from_time_t(mktime(&tm));
}

int main() {
    string birth_date_str, current_date_str;
    cout << "请输入您的生日(格式:YYYY-MM-DD): ";
    cin >> birth_date_str;

    cout << "请输入当前日期(格式:YYYY-MM-DD): ";
    cin >> current_date_str;

    auto birth_date = parse_date(birth_date_str);
    auto current_date = parse_date(current_date_str);

    auto duration = chrono::duration_cast<chrono::hours>(
                        current_date - birth_date).count() / 24;

    cout << "您在这个世界上活了 " << duration << " 天。" << endl;

    return 0;
}

好了,求最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2024-1-6 18:52:11 | 显示全部楼层

《C语言》
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 19:06:41 | 显示全部楼层

C语言可以C++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 19:39:04 | 显示全部楼层


那洛谷 IDE CE 了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 19:42:48 | 显示全部楼层

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

使用道具 举报

发表于 2024-1-6 19:43:24 | 显示全部楼层


第一篇月赛黄题题解!通过了!

洛谷的nr0728是你同学吗,如果不是,你能挂个友链吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 19:48:08 | 显示全部楼层
sfqxx 发表于 2024-1-6 19:43
第一篇月赛黄题题解!通过了!

洛谷的nr0728是你同学吗,如果不是,你能挂个友链吗?


是我同学。我不是把他的链接挂在上面了吗。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 19:48:38 | 显示全部楼层
zhangjinxuan 发表于 2024-1-6 19:48
是我同学。我不是把他的链接挂在上面了吗。

我看他坐标北京hh
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 19:49:19 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2024-1-6 19:51 编辑
sfqxx 发表于 2024-1-6 19:48
我看他坐标北京hh


不是早就回来了吗(他出差去了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 19:52:48 | 显示全部楼层
zhangjinxuan 发表于 2024-1-6 19:49
不是早就回来了吗(他出差去了)

o

对了,你真的有CP吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 19:57:01 | 显示全部楼层
sfqxx 发表于 2024-1-6 19:52
o

对了,你真的有CP吗

头像都一样了难道不是一个 CP 吗(虽然是我先用 chatgpt 的 logo 作头像的)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-6 21:03:36 | 显示全部楼层
FishC 发表于 2024-1-6 16:14
当计算一个人活了多少天时,我们需要知道他的出生日期和当前日期。然后,我们可以使用日期函数来计算天数差 ...
#include <stdio.h>

int main()
{
        long count = 0; // count用于存放一共活了多少天
        int year1, year2; // year1是你的生日年份,year2是今天的年份
        int month1, month2;
        int day1, day2;
        int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        printf("请输入你的生日(如1988-05-20):");
        scanf("%d-%d-%d", &year1, &month1, &day1);

        printf("请输入今年日期(如2016-03-28):");
        scanf("%d-%d-%d", &year2, &month2, &day2);

        while (year1 <= year2)
        {
                days[1] = (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) ? 29 : 28;
                while (month1 <= 12)
                {
                        while (day1 <= days[month1 - 1])
                        {
                                if (year1 == year2 && month1 == month2 && day1 == day2)
                                {
                                        goto FINISH; // 跳出多层循环才被迫用goto语句
                                }
                                day1++;
                                count++;
                        }
                        day1 = 1;
                        month1++;
                }
                month1 = 1;
                year1++;
        }

FINISH: printf("你在这个世界上总共生存了%d天\n", count);

        return 0;
}
这是小甲鱼给的代码,你能给点解析吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 21:04:00 | 显示全部楼层
liyifeng295641 发表于 2024-01-06 21:03
#include

int main()
{
        long count = 0 ...


这段代码是一个计算一个人活了多少天的生命计算器。它首先要求用户输入生日和当前日期,然后通过循环来逐年计算总天数。

但是,在你的代码中,发现了一点小错误。在while循环条件中缺少了一个表达式,导致无法正常结束循环。为了修复这个问题,我给你重新修改了代码如下:
#include <stdio.h>

int main() {
    long count = 0; // count用于存放一共活了多少天
    int year1, year2; // year1是你的生日年份,year2是今天的年份
    int month1, month2;
    int day1, day2;
    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    printf("请输入你的生日(如1988-05-20):");
    scanf("%d-%d-%d", &year1, &month1, &day1);
    printf("请输入今年日期(如2016-03-28):");
    scanf("%d-%d-%d", &year2, &month2, &day2);
    
    while (year1 != year2 || month1 != month2 || day1 != day2) {
        if ((year1 % 4 == 0 && year1 % 100 != 0) || year1 % 400 == 0) {
            days[1] = 29; // 如果是闰年,将2月的天数设置为29
        } else {
            days[1] = 28; // 如果不是闰年,将2月的天数设置为28
        }
        
        count += days[month1 - 1] - day1 + 1; // 计算生日当年剩下的天数
        
        // 计算从下一年开始到当前年的所有年份的天数
        for (int i = year1 + 1; i < year2; i++) {
            if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {
                count += 366; // 闰年有366天
            } else {
                count += 365; // 平年有365天
            }
        }
        
        // 计算今年已经过去的天数
        for (int i = 0; i < month2 - 1; i++) {
            count += days[i];
        }
        count += day2; // 加上今天是今年的第几天
        
        year1 = year2;
        month1 = month2;
        day1 = day2;
        
        printf("请输入今年日期(如2016-03-28):");
        scanf("%d-%d-%d", &year2, &month2, &day2);
    }
    
    printf("您已经在这个世界上活了%ld天。\n", count);
    
    return 0;
}

在这个修改后的代码中,我添加了一个while循环的结束条件,使得当用户输入的当前日期与生日日期相同时,循环结束。在每次循环中,我使用了两个for循环来计算生日当年剩下的天数和今年已经过去的天数。然后,我更新了year1、month1和day1的值,并提示用户输入新的当前日期,进入下一次循环。

希望这段代码能帮助你完成生命计算器的编写!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-6 21:05:43 | 显示全部楼层
FishC 发表于 2024-1-6 21:04
这段代码是一个计算一个人活了多少天的生命计算器。它首先要求用户输入生日和当前日期,然后通过循环来 ...

不要改代码,解析代码!
#include <stdio.h>

int main()
{
        long count = 0; // count用于存放一共活了多少天
        int year1, year2; // year1是你的生日年份,year2是今天的年份
        int month1, month2;
        int day1, day2;
        int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        printf("请输入你的生日(如1988-05-20):");
        scanf("%d-%d-%d", &year1, &month1, &day1);

        printf("请输入今年日期(如2016-03-28):");
        scanf("%d-%d-%d", &year2, &month2, &day2);

        while (year1 <= year2)
        {
                days[1] = (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) ? 29 : 28;
                while (month1 <= 12)
                {
                        while (day1 <= days[month1 - 1])
                        {
                                if (year1 == year2 && month1 == month2 && day1 == day2)
                                {
                                        goto FINISH; // 跳出多层循环才被迫用goto语句
                                }
                                day1++;
                                count++;
                        }
                        day1 = 1;
                        month1++;
                }
                month1 = 1;
                year1++;
        }

FINISH: printf("你在这个世界上总共生存了%d天\n", count);

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

使用道具 举报

发表于 2024-1-6 21:05:57 | 显示全部楼层
liyifeng295641 发表于 2024-01-06 21:05
不要改代码,解析代码!
#include

int main()
{ ...


这段代码是一个用来计算一个人活了多少天的生命计算器。下面是对代码的解析:

1. 首先定义了变量 `count`,用于存放这个人活了多少天的总数。
2. 定义了变量 `year1`、`year2`,分别表示出生年份和当前年份;`month1`、`month2`,分别表示出生月份和当前月份;`day1`、`day2`,分别表示出生日期和当前日期。
3. 定义了数组 `days`,其中存放了每个月份所对应的天数(不考虑闰年)。
4. 使用 `printf` 和 `scanf` 分别提示用户输入生日和当前日期,并将输入的值赋给对应的变量。
5. 进入 `while` 循环,循环条件缺失,无法正确结束循环。
6. 若补充了循环条件,循环体内的代码将会按照以下方式执行:
   - 判断当前年份是否为闰年,若是,则将2月的天数设置为29,否则设置为28。
   - 计算出生日当年剩下的天数,即用该年的总天数减去出生日期,加1(包含出生那天)。
   - 通过两个 `for` 循环来计算从下一年开始到当前年的所有年份的天数,根据年份是否为闰年来决定是加上366还是365。
   - 第一个 `for` 循环用来计算完整年份的天数,第二个 `for` 循环用来计算今年已经过去的天数。
   - 更新变量 `year1`、`month1`、`day1` 的值为当前年份、月份和日期。
   - 通过 `printf` 和 `scanf` 提示用户再次输入当前日期,以进行下一轮循环。
7. 最后使用 `printf` 将计算出的 `count` 值输出,表示在这个世界上活了多少天。

需要注意的是,由于代码缺失了循环条件,导致无法正常结束循环。因此,在运行代码之前,应该将缺失的循环条件补充上,确保代码能够正确执行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 21:56:36 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-13 22:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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