C语言【问题描述】编写一个程序,该程序的功能: (1)从标准输入中读取一组日历日期并将其存储到结构体数组中 (2)按时间顺序对它们进行排序并打印排序后的列表 (3)将标准输入读取一个currentDate日期,可将(1)中读取的日期分成2个数组,一个数组仅包含currentDate之前的日期,一个数组仅包含currentDate之后的日期。如果currentDate比数组日历日期都大或都小,则无需分组,具体可见样例输入。
时间: 2023-06-27 12:01:45 浏览: 157
下面是一份 C 代码,实现了你的需求,可以参考一下:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_NUM_DATES 100
struct date {
int year;
int month;
int day;
};
void print_date(struct date d) {
printf("%04d-%02d-%02d\n", d.year, d.month, d.day);
}
int compare_date(struct date d1, struct date d2) {
if (d1.year < d2.year) {
return -1;
} else if (d1.year > d2.year) {
return 1;
} else {
if (d1.month < d2.month) {
return -1;
} else if (d1.month > d2.month) {
return 1;
} else {
if (d1.day < d2.day) {
return -1;
} else if (d1.day > d2.day) {
return 1;
} else {
return 0;
}
}
}
}
void sort_dates(struct date dates[], int num_dates) {
int i, j;
struct date temp;
for (i = 0; i < num_dates - 1; i++) {
for (j = i + 1; j < num_dates; j++) {
if (compare_date(dates[i], dates[j]) > 0) {
temp = dates[i];
dates[i] = dates[j];
dates[j] = temp;
}
}
}
}
int main() {
struct date dates[MAX_NUM_DATES];
int num_dates = 0;
char line[100];
while (fgets(line, sizeof(line), stdin) != NULL) {
if (strlen(line) >= 10) {
sscanf(line, "%d-%d-%d", &dates[num_dates].year, &dates[num_dates].month, &dates[num_dates].day);
num_dates++;
}
}
sort_dates(dates, num_dates);
struct date current_date;
scanf("%d-%d-%d", ¤t_date.year, ¤t_date.month, ¤t_date.day);
printf("Before:\n");
int i;
for (i = 0; i < num_dates; i++) {
if (compare_date(dates[i], current_date) < 0) {
print_date(dates[i]);
}
}
printf("After:\n");
for (i = 0; i < num_dates; i++) {
if (compare_date(dates[i], current_date) >= 0) {
print_date(dates[i]);
}
}
return 0;
}
```
这份代码首先定义了一个 `struct date` 结构体,用来表示日历中的某一天。然后实现了三个函数:
- `print_date()`:用来打印一个日期;
- `compare_date()`:用来比较两个日期的大小,如果第一个日期比第二个日期早,则返回 -1;如果两个日期相等,则返回 0;否则返回 1;
- `sort_dates()`:用来对一个日期数组进行排序,采用冒泡排序算法,按照从早到晚的顺序排序。
接下来的 `main()` 函数读入输入数据,将它们存储到日期数组中,然后调用 `sort_dates()` 函数进行排序。最后读入一个 `current_date`,并且将日期数组分成两个部分,一个是 `current_date` 之前的日期,一个是 `current_date` 之后的日期,并分别打印输出。
注意,这份代码假设输入数据格式正确,没有做太多的错误检查。如果需要更加健壮的代码,还需要进行更多的错误检查和异常处理。