吉林大学2021年C语言题库:日期计算与数组排序算法

5 下载量 64 浏览量 更新于2024-08-04 3 收藏 156KB DOCX 举报
本资源是一份2021年吉林大学C语言题库文档,包含了两个部分:程序填空和程序改错。以下是对这两个部分知识点的详细解析: **程序填空** 这部分代码旨在实现一个计算给定日期是当年第几天的功能。首先,定义了一个名为`date`的结构体,包含年(y)、月(m)和日(d)三个成员。然后,通过`scanf`函数获取用户输入的年、月、日。 - `f` 变量用于判断是否为闰年,根据闰年的规则(每4年一闰,但百年不闰,四百年再闰),这里使用条件运算符 (`?`) 进行逻辑判断。闰年条件为:`da.y % 4 == 0 && (da.y % 100 != 0 || da.y % 400 == 0)`。 - 接下来,检查月份是否合法,`if` 语句中使用了另一个逻辑运算符 (`?`),当`da.m < 1` 或者`da.d > 12` 时,程序会退出。闰年情况下,二月的天数可能会增加1天,所以`a[11]` 会被加上闰年修正值`f`。 - 最后,通过`for`循环计算到给定日期之前的总天数(`n`),`p` 从1开始,逐月累加前一个月的天数。循环结束后,`n` 就是目标日期是当年的第几天,输出结果为`n`。 **程序改错** 这部分题目要求编写一个名为`fun`的函数,接收用户输入的三个数,将其中最大的数存入`a`,中间的数存入`b`,最小的数存入`c`。这是一个基础的数组排序和变量交换问题。然而,题目没有给出完整的函数实现,但可以推测函数可能包含如下步骤: 1. 初始化`a`、`b`、`c`为用户输入的第一个数; 2. 遍历剩下的两个数,每次遍历时与当前`a`、`b`、`c`进行比较,更新相应的变量; 3. 遍历结束后,`a`、`b`、`c`将分别存储最大、中间和最小的数。 正确实现可能如下: ```c double fun(int num1, int num2, int num3) { double a = num1, b = num2, c = num3; if (num1 > num2) { if (num1 > num3) a = num1; else c = num1; } else { if (num2 > num3) b = num2; else c = num2; } // 同理处理num2与num3之间的关系 return a, b, c; } ``` 通过调用这个函数并传入三个整数,即可得到预期的结果。注意,这个函数返回的是三个值,而不是直接修改原始参数,这与题目描述中的“把……放在……中”略有出入,但根据一般习惯,这种设计更常见。