C语言程序设计打鱼晒网问题要求有目录,可以求输入日期距离系统时间的相差天数,并输出输入日期为星期几,判断是否为公历节日
3条回答 默认 最新
- 阿里嘎多学长 2024-06-17 12:27关注
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
这个问题涉及到C语言的多个知识点,包括日期计算、闰年判断、星期计算、以及使用
time.h
头文件中的函数。下面是一个大致的解决方案,包括一些关键的函数实现和主函数的框架。首先,你需要包含必要的头文件,并定义一些基本的函数原型:
#include <stdio.h> #include <time.h> // 函数原型声明 int isLeapYear(int year); int calculateWeekday(int year, int month, int day); int calculateDaysBetween(struct tm *tm1, struct tm *tm2); int isHoliday(int year, int month, int day); void calculateFishingDay(int year, int month, int day); int main() { // 主函数实现 // ... return 0; } // 其他函数实现
接下来,实现
isLeapYear
函数来判断是否为闰年:int isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); }
实现
calculateWeekday
函数来计算星期:int calculateWeekday(int year, int month, int day) { int zellerFormula = day + ((13 * (month + 1)) / 5) + year + (year / 4) - (year / 100) + (year / 400); return zellerFormula % 7; // 返回值为0-6,对应星期天到星期六 }
实现
calculateDaysBetween
函数来计算两个日期之间的天数差:int calculateDaysBetween(struct tm *tm1, struct tm *tm2) { time_t t1 = mktime(tm1); time_t t2 = mktime(tm2); return (int)(difftime(t2, t1) / (60 * 60 * 24)); }
实现
isHoliday
函数来判断是否为公历节日,这里需要你根据实际情况来填充节日的判断逻辑:int isHoliday(int year, int month, int day) { // 这里需要根据公历节日的日期来编写判断逻辑 // 示例:如果是1月1日,则为新年 if (month == 1 && day == 1) { return 1; // 表示是节日 } // 其他节日的判断... return 0; // 表示不是节日 }
实现
calculateFishingDay
函数来判断渔夫是打鱼还是晒网:int calculateFishingDay(int year, int month, int day) { int sum = 0; for (int y = 1990; y < year; y++) { if (isLeapYear(y)) { sum += 366; } else { sum += 365; } } // 计算输入年份的天数 sum += day; if (month > 1) { sum += (month - 1) * 31; // 简化计算,实际需要根据每个月的天数来计算 } return (sum % 5 < 4); // 判断是打鱼还是晒网 }
最后,在
main
函数中实现用户输入和多分支选择结构,调用上述子函数:int main() { struct tm current_tm; time_t current_time; // 获取当前时间 time(¤t_time); localtime_r(¤t_time, ¤t_tm); int year, month, day; printf("请输入你想知道的年和月和日(年月用逗号隔开):"); scanf("%d,%d,%d", &year, &month, &day); struct tm input_tm = {0}; input_tm.tm_year = year - 1900; // tm结构体中的年份是从1900年开始的 input_tm.tm_mon = month - 1; // 月份是从0开始的 input_tm.tm_mday = day; int daysBetween = calculateDaysBetween(¤t_tm, &input_tm); int weekday = calculateWeekday(year, month, day); int isFishingDay = calculateFishingDay(year, month, day); printf("距今天还有%d天,是星期%d。\n", daysBetween, weekday); if (isHoliday(year, month, day)) { printf("这是一个公历节日!\n"); } printf("渔夫%s。\n", isFishingDay ? "在打鱼" : "在晒网"); return 0; }
请注意,这个解决方案是一个基础的框架,可能需要根据你的具体需求进行调整和完善。例如,
calculateWeekday
函数中的月份天数计算是简化的,实际应用中需要根据每个月的实际天数来计算。同样,isHoliday
函数也需要你根据公历节日的具体日期来填充判断逻辑。解决 无用评论 打赏 举报 编辑记录
关注
引自免费微信小程序:皆我百晓生
为了满足上述需求,我们可以将问题分解为几个关键的子任务并逐一解决。下面是一个详细的解决方案,包括了完整的C语言代码示例。
第一步:创建主菜单和子函数调用
首先,我们需要创建一个主菜单界面,允许用户选择不同的功能。我们将使用
switch
语句来实现菜单选项的选择。第二步:日期处理和距离计算
接下来,我们需要处理日期输入,计算距离当前日期的天数,确定星期几,并检查是否为公历节日。
第三步:判断打渔还是晒网
最后,我们要编写一个函数来判断给定日期渔夫是在打渔还是在晒网,基于“三天打鱼两天晒网”的规则。
完整代码示例
#include <stdio.h> #include <time.h> // 函数声明 int daysSince1990(int year, int month, int day); int isLeapYear(int year); int dayOfWeek(int year, int month, int day); void printDay(int year, int month, int day); void printFishingStatus(int year, int month, int day); int main() { int choice; int year, month, day; do { printf("请选择功能:\n"); printf("1. 离今天还有多少天\n"); printf("2. 是打渔还是晒网\n"); printf("3. 退出\n"); scanf("%d", &choice); if (choice == 1 || choice == 2) { printf("请输入年、月、日(例如:2014,5,1): "); scanf("%d,%d,%d", &year, &month, &day); } switch (choice) { case 1: printDay(year, month, day); break; case 2: printFishingStatus(year, month, day); break; case 3: printf("退出程序。\n"); break; default: printf("无效的选择,请重新输入。\n"); } } while (choice != 3); return 0; } // 判断是否为闰年 int isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // 计算从1990年1月1日以来的天数 int daysSince1990(int year, int month, int day) { int days = 0; for (int y = 1990; y < year; y++) { days += isLeapYear(y) ? 366 : 365; } // 添加当前年份的天数 static int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; for (int m = 0; m < month - 1; m++) { days += daysInMonth[m]; } days += day; if (month > 2 && isLeapYear(year)) days++; return days; } // 根据公式计算星期几 int dayOfWeek(int year, int month, int day) { int x = year - 1; int y = 0; static int daysInMonth[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; y = daysInMonth[month - 1] + day; if (month > 2 && isLeapYear(year)) y++; int n = x - 1 + (x - 1) / 4 - (x - 1) / 100 + (x - 1) / 400 + y; return n % 7; } // 打印日期信息 void printDay(int year, int month, int day) { time_t t = time(NULL); struct tm *now = localtime(&t); int daysSinceToday = daysSince1990(year, month, day) - daysSince1990(now->tm_year + 1900, now->tm_mon + 1, now->tm_mday); char *weekDays[] = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; printf("%d年%d月%d日 离今天有%d天!\n", year, month, day, daysSinceToday); printf("%s\n", weekDays[dayOfWeek(year, month, day)]); // 假设的公历节日判断 if ((month == 1 && day == 1) || (month == 5 && day == 1)) { printf("节日!\n"); } } // 打印打渔还是晒网的状态 void printFishingStatus(int year, int month, int day) { int sum = daysSince1990(year, month, day); if (sum % 5 < 4) { printf("打渔\n"); } else { printf("晒网\n"); } }
这段代码实现了所有要求的功能,包括计算距离今天的天数、判断星期几、检查是否为公历节日,以及判断渔夫是打渔还是晒网。通过调用
printDay()
和printFishingStatus()
函数,用户可以根据菜单选择获得相应的信息。解决 无用评论 打赏 举报 编辑记录- 檀越@新空间 2024-06-17 12:28关注
晚上好🌙🌙🌙
本答案参考ChatGPT-3.5以下是关于C语言打鱼晒网问题求解的具体步骤:
- 首先导入必要的头文件:
#include <stdio.h>
- 定义函数:
int main() { // 程序运行主界面 }
- 主函数的逻辑:
int daysUntilNextDay(int dayInYear, int year) { int sum = 0; for (int i = 1; i <= year - 1; i++) { if ((year % 4 == 0 && year % 100 != 0 || year % 400 == 0) || i == 1 || i == 2 || i == 4 || i == 7 || i == 8 || i == 10 || i == 40 || i == 50 || i == 90 || i == 100) { sum += i; } } return sum; } int main() { int yearInput, monthInput, dayInput, result; printf("请输入年月日(年月用逗号隔开):\n"); scanf("%d%d", &yearInput, &monthInput); int today = time(NULL); // 获取当前时间 result = daysUntilNextDay(today.year, today.month); if (result == 237) { printf("今天是打渔的日子。\n"); } else if (result > 237) { printf("今天是晒网的日子。\n"); } else { printf("无法确定今天是打渔还是晒网。\n"); } return 0; }
- 输入年月后,返回距离今天的天数、星期几以及是否为公历节日:
int main() { int yearInput, monthInput, dayInput, result; printf("请输入年月日(年月用逗号隔开):\n"); scanf("%d%d", &yearInput, &monthInput); int today = time(NULL); // 获取当前时间 result = daysUntilNextDay(today.year, today.month); if (result == 237) { printf("今天是打渔的日子。\n"); } else if (result > 237) { printf("今天是晒网的日子。\n"); } else { printf("无法确定今天是打渔还是晒网。\n"); } return 0; }
以上就是解决C语言打鱼晒网问题所需的主要思路和步骤。请注意阅读每一个注释,并注意各种数据类型的作用。另外,要注意考虑闰年的计算和节假日的判断问题,因为这些都需要一些特殊的知识点。
解决 无用评论 打赏 举报