设计函数days( )函数实现第1题的计算。由主函数将日期(年月日)传递给days( )函数,计算后将日子数传回主函数输出。要求三种实现方式:
a)用结构体成员作为形式参数。
b)用结构体变量作为形式参数。
c)用指向结构体变量的指针作为形式参数。
思路:
首先定义一个结构体类型Date,包含年、月、日三个成员。
编写函数days( ),用于计算日期距离1900年1月1日的天数。可以使用循环结构,根据年份判断是否是闰年,然后累加月份天数和日数即可。
编写主函数,分别测试三种实现方式。对于第一种方式,直接将结构体成员作为参数传递;对于第二种方式,先定义一个结构体变量,将日期赋值给结构体变量,再将结构体变量作为参数传递;对于第三种方式,先定义一个结构体指针变量,将指针指向结构体变量,再将指针作为参数传递。
示例代码:
#include <stdio.h>
typedef struct Date {
int year;
int month;
int day;
} Date;
// 计算日期距离1900年1月1日的天数
int days(Date date) {
int monthDays[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; // 每个月份的天数
int days = 0;
for (int y = 1900; y < date.year; y++) { // 计算年份之间的天数
if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) { // 判断是否是闰年
days += 366;
} else {
days += 365;
}
}
for (int m = 1; m < date.month; m++) { // 计算月份之间的天数
if (m == 2 && (date.year % 400 == 0 || (date.year % 4 == 0 && date.year % 100 != 0))) { // 判断闰年二月天数
days += 29;
} else {
days += monthDays[m-1];
}
}
days += date.day - 1; // 加上当月的天数
return days;
}
int main() {
// 测试第一种方式:结构体成员作为参数
Date date1 = {2022, 7, 17};
int days1 = days(date1);
printf("%d\n", days1);
// 测试第二种方式:结构体变量作为参数
Date date2 = {2022, 7, 18};
int days2 = days(date2);
printf("%d\n", days2);
// 测试第三种方式:指向结构体变量的指针作为参数
Date date3 = {2022, 7, 19};
Date *pDate = &date3;
int days3 = days(*pDate);
printf("%d\n", days3);
return 0;
}
#include <stdio.h>
struct date {
int year;
int month;
int day;
};
// 使用结构体成员作为形式参数
int days(struct date dt) {
int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int days = 0;
// 计算当前年份之前的所有天数
for (int i = 1; i < dt.year; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
days += 366; // 闰年有366天
} else {
days += 365; // 平年有365天
}
}
// 计算当前年份当前月份之前的所有天数
for (int i = 1; i < dt.month; i++) {
days += days_in_month[i-1];
}
// 如果是闰年并且月份大于等于3月,则2月要加1天
if ((dt.year % 4 == 0 && dt.year % 100 != 0 || dt.year % 400 == 0) && dt.month >= 3) {
days++;
}
// 加上当前月份的天数
days += dt.day;
return days;
}
// 使用结构体变量作为形式参数
int days2(struct date *dt_ptr) {
int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int days = 0;
// 计算当前年份之前的所有天数
for (int i = 1; i < dt_ptr->year; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
days += 366; // 闰年有366天
} else {
days += 365; // 平年有365天
}
}
// 计算当前年份当前月份之前的所有天数
for (int i = 1; i < dt_ptr->month; i++) {
days += days_in_month[i-1];
}
// 如果是闰年并且月份大于等于3月,则2月要加1天
if ((dt_ptr->year % 4 == 0 && dt_ptr->year % 100 != 0 || dt_ptr->year % 400 == 0) && dt_ptr->month >= 3) {
days++;
}
// 加上当前月份的天数
days += dt_ptr->day;
return days;
}
// 使用指向结构体变量的指针作为形式参数
int days3(struct date *dt_ptr) {
int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int days = 0;
// 计算当前年份之前的所有天数
for (int
给定如下定义:
struct date_rec
{
int day ;
int month ;
int year ;
};
写一个函数接收两个日期,
如果两个日期相同,则返回0,
如果第一个日期晚于第二个日期,则返回1,
如果第一个日期早于第二个日期,则返回-1。
并编写main函数测试它。
**输入格式要求:"%d%d%d" 提示信息:“请输入当前日期(年 月 日):”
**输出格式要求:“当前日期:%d年%d月%d日!\n” “第一个日期晚于第二个日期!” “第一个日期早于第二个日期!” “两个日期相同!”
程序运行示例如下:
请输入当前日期(年 月 日):2012 9 10↙
请输入当前日期(年 月 日):2013 7 10↙
当前日期:2012年9月10日!
当前日期:2013年7月10日!
第一个日期早于第二个日期!