有些代码看不懂,想问一下友友
#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; //请问?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;
} 这段代码是一个简单的计算你在这个世界上生存了多少天的程序。你需要输入你的生日和当前日期,程序会计算出你活了多少天。
关于你的问题,?29:28 是C语言中的条件运算符(也称三元运算符),它的形式为:condition ? expression_if_true : expression_if_false。
在这个代码中,days = (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) ? 29 : 28; 这一行是判断输入的年份是否是闰年。如果是闰年,则二月份有29天,否则就是28天。具体的规则如下:
1、如果年份能被400整除,那么它是闰年(如2000年)。
2、如果年份能被4整除但不能被100整除,那么它也是闰年(如2020年)。
如果 year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0) 这个条件为真(即是闰年),则 days 被赋值为29,否则赋值为28。
程序中的循环结构用于遍历输入的生日到当前日期之间的每一天,累加计算总天数。当遍历到输入的当前日期时,使用 goto FINISH; 语句跳出多层循环。最后,程序将输出你在这个世界上生存的总天数。 好像都有点看不懂{:10_266:} 啊这啧啧啧 发表于 2023-3-25 14:00
好像都有点看不懂
那你还是得回去巩固巩固一下语法呀{:10_277:} #include <stdio.h>
int main()
{
long count = 0; // 用于存放一共活了多少天的变量
int 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) { // 遍历年份
// 计算闰年的 2 月份天数
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; // 跳出多层循环,到 FINISH 标签处继续执行
}
day1++; // 将日期加 1
count++; // 总天数加 1
}
day1 = 1; // 日期重新从 1 开始
month1++; // 月份加 1
}
month1 = 1; // 月份重新从 1 开始
year1++; // 年份加 1
}
FINISH:
printf("你在这个世界上总共生存了%d天\n", count); // 输出总天数
return 0;
}
------------------------------------------------------------------------------------
代码可以优化一下,下面是优化的写法
#include <stdio.h>
// 判断是否为闰年,返回二月份天数
int days_in_feb(int year)
{
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
return 29; // 是闰年,二月份有29天
} else {
return 28; // 不是闰年,二月份有28天
}
}
int main()
{
long count = 0; // 计数器,用于统计生存天数
int year1, year2, month1, month2, day1, day2;
// 输入生日日期
printf("请输入你的生日(如1988-05-20):");
scanf("%d-%d-%d", &year1, &month1, &day1);
// 输入今天日期
printf("请输入今年日期(如2016-03-28):");
scanf("%d-%d-%d", &year2, &month2, &day2);
// 遍历年份,从生日所在年份到今天所在年份
for (int year = year1; year <= year2; year++) {
int days_in_month; // 当前月份的天数
// 遍历月份,从1月到12月
for (int month = 1; month <= 12; month++) {
// 根据月份判断当前月份的天数
if (month == 2) { // 二月份需要判断是否为闰年
days_in_month = days_in_feb(year);
} else {
days_in_month = (month == 4 || month == 6 || month == 9 || month == 11) ? 30 : 31;
}
// 遍历日期,从1号到当月最后一天
for (int day = 1; day <= days_in_month; day++) {
// 判断当前日期是否在生日和今天之间
if (year == year1 && month < month1) { // 生日月份之前,跳过循环
continue;
}
if (year == year1 && month == month1 && day < day1) { // 生日当月,但日期在生日之前,跳过循环
continue;
}
if (year == year2 && month > month2) { // 今天月份之后,终止循环
break;
}
if (year == year2 && month == month2 && day > day2) { // 今天当月,但日期在今天之后,终止循环
break;
}
count++; // 统计生存天数
}
}
}
// 输出生存天数
printf("你在这个世界上总共生存了%ld天\n", count);
return 0;
}
在优化后的代码中,将计算闰年的逻辑封装成了一个名为 days_in_feb 的函数。该函数接受一个年份作为参数,并返回该年份二月份的天数。
在主函数中,使用 for 循环来遍历日期。首先遍历年份,在每个年份中遍历月份,在每个月份中遍历日期。
在遍历日期时,使用 if 语句来判断是否需要跳过或终止循环。如果当前日期比生日早,则跳过;如果当前日期比今天晚,则终止循环。如果当前日期是要计算的日期,则将计数器加 1。
这样,就避免了使用 goto 语句,使代码更加清晰和易读。同时,将计算闰年的逻辑封装成了函数,使代码更加模块化和可维护。
------------------------------------------------------------------------------------
这样写代码可以代码少一点,修改的时候比较方便
#include <stdio.h>
int main()
{
long count = 0; // 定义一个计数器,用于计算生存天数
int year1, year2, month1, month2, day1, day2; // 定义变量,分别存储生日和今天的年月日
printf("请输入你的生日(如1988-05-20):");
scanf("%d-%d-%d", &year1, &month1, &day1); // 获取生日输入
printf("请输入今年日期(如2016-03-28):");
scanf("%d-%d-%d", &year2, &month2, &day2); // 获取今天日期输入
for (int year = year1; year <= year2; year++) { // 遍历从生日年份到今天年份之间的所有年份
for (int month = 1; month <= 12; month++) { // 遍历每个月份
// 计算当前月份的天数
int days_in_month = (month == 2) ? ((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) ? 29 : 28) : ((month == 4 || month == 6 || month == 9 || month == 11) ? 30 : 31);
// 计算当前月份的开始日期和结束日期
int start_day = (year == year1 && month == month1) ? day1 : 1;
int end_day = (year == year2 && month == month2) ? day2 : days_in_month;
// 累加当前月份的生存天数
count += end_day - start_day + 1;
}
}
printf("你在这个世界上总共生存了%ld天\n", count); // 输出生存天数
return 0;
} 不二猫猫 发表于 2023-3-25 15:52
------------------------------------------------------------------------------------
代码可以优 ...
宝,我运行出来有点问题。还有19-22行代码有点不太明白 isdkz 发表于 2023-3-25 14:00
这段代码是一个简单的计算你在这个世界上生存了多少天的程序。你需要输入你的生日和当前日期,程序会计算出 ...
okok,明白了 三目运算符:也叫三元运算符。这个运算符的符号是: ? :
语法:
表达式1 ? 表达式2 : 表达式3;
语义:
先执行表达式1,执行完毕,表达式1的结果如果为真,那么执行表达式2,并且这个整体的运算式的结果是表达式2的结果,否则执行表达式3,运算式的结果是表达式3的结果
页:
[1]