liyifeng295641 发表于 2024-1-6 16:14:26

C语言数组03(生命计算器1)

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

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

程序实现如下图:

https://xxx.ilovefishc.com/forum/201603/29/024239mlfspysge3t3pipa.png

@FishC这道题不会写,可以给点提示吗?

FishC 发表于 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 = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
   
    // 判断是否为闰年
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    {
      months = 29;
    }
   
    for (int i = 0; i < month-1; ++i)
    {
      days += months;
    }
   
    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 小助理,如未能正确解答您的问题,请继续追问。

sfqxx 发表于 2024-1-6 16:16:06

我来看看

liyifeng295641 发表于 2024-1-6 16:17:33

sfqxx 发表于 2024-1-6 16:16
我来看看

鸡哥,{:10_254:}

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

好了,求最佳

zhangjinxuan 发表于 2024-1-6 18:52:11

sfqxx 发表于 2024-1-6 16:36
好了,求最佳

《C语言》

sfqxx 发表于 2024-1-6 19:06:41

zhangjinxuan 发表于 2024-1-6 18:52
《C语言》

C语言可以C++

zhangjinxuan 发表于 2024-1-6 19:39:04

sfqxx 发表于 2024-1-6 19:06
C语言可以C++

那洛谷 IDE CE 了。

sfqxx 发表于 2024-1-6 19:42:48

zhangjinxuan 发表于 2024-1-6 19:39
那洛谷 IDE CE 了。

$6$

sfqxx 发表于 2024-1-6 19:43:24

zhangjinxuan 发表于 2024-1-6 19:39
那洛谷 IDE CE 了。

第一篇月赛黄题题解!通过了!{:10_298:}

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

zhangjinxuan 发表于 2024-1-6 19:48:08

sfqxx 发表于 2024-1-6 19:43
第一篇月赛黄题题解!通过了!

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

是我同学。我不是把他的链接挂在上面了吗。

sfqxx 发表于 2024-1-6 19:48:38

zhangjinxuan 发表于 2024-1-6 19:48
是我同学。我不是把他的链接挂在上面了吗。

我看他坐标北京hh

zhangjinxuan 发表于 2024-1-6 19:49:19

本帖最后由 zhangjinxuan 于 2024-1-6 19:51 编辑

sfqxx 发表于 2024-1-6 19:48
我看他坐标北京hh

不是早就回来了吗(他出差去了)

sfqxx 发表于 2024-1-6 19:52:48

zhangjinxuan 发表于 2024-1-6 19:49
不是早就回来了吗(他出差去了)

o

对了,你真的有CP吗{:10_255:}

zhangjinxuan 发表于 2024-1-6 19:57:01

sfqxx 发表于 2024-1-6 19:52
o

对了,你真的有CP吗

头像都一样了难道不是一个 CP 吗(虽然是我先用 chatgpt 的 logo 作头像的)。

liyifeng295641 发表于 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 = (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) ? 29 : 28;
                while (month1 <= 12)
                {
                        while (day1 <= days)
                        {
                              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;
}
这是小甲鱼给的代码,你能给点解析吗?

FishC 发表于 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 = 29; // 如果是闰年,将2月的天数设置为29
      } else {
            days = 28; // 如果不是闰年,将2月的天数设置为28
      }
      
      count += days - 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;
      }
      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 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 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 = (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) ? 29 : 28;
                while (month1 <= 12)
                {
                        while (day1 <= days)
                        {
                              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;
}

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

15945179970 发表于 2024-1-6 21:56:36

{:5_107:}
页: [1]
查看完整版本: C语言数组03(生命计算器1)