#include <stdio.h> // 定义一个结构体 condition,用于存储输入的条件 struct condition { int obj1; // 存储条件中的第一个字符-'A'的值 int obj2; // 存储条件中的第二个字符-'A'的值 int num; // 存储数字 int ret; // 是否是等于号,0表示不是,1表示是 } condition[20]; // 存储20个条件 // 判断值班日期与输入的条件是否符合 int judge(int *a, int n) { int i = 0; int ret = 1; // 默认符合条件 // 遍历所有条件 for (i = 0; i < n; i++) { // 如果是等于号,判断值班日期和条件日期-1是否相等 if (condition[i].ret) { if (a[condition[i].obj1] != condition[i].num - 1) ret = 0; break; } // 否则,判断两个日期之间的差是否等于条件中的数字 else if (a[condition[i].obj1] + condition[i].num != a[condition[i].obj2]) { ret = 0; break; } } return ret; }
时间: 2024-02-14 16:16:08 浏览: 65
c语言基础加实例解析版.pdf
这段代码已经是一份非常简洁的代码了,但还是可以进行一些优化。下面是我对代码的优化和注释:
```c
#include <stdio.h>
// 定义结构体 Condition,用于存储输入的条件
typedef struct {
int obj1; // 条件中的第一个字符-'A'的值
int obj2; // 条件中的第二个字符-'A'的值
int num; // 条件中的数字
int is_eq; // 是否为等于号,0表示不是,1表示是
} Condition;
// 判断值班日期与输入的条件是否符合
int judge(int *date, int n) {
int ret = 1; // 默认符合条件
// 遍历所有条件
for (int i = 0; i < n; i++) {
const Condition c = condition[i];
// 如果是等于号,判断值班日期和条件日期-1是否相等
if (c.is_eq) {
if (date[c.obj1] != c.num - 1) {
ret = 0;
break;
}
}
// 否则,判断两个日期之间的差是否等于条件中的数字
else if (date[c.obj1] + c.num != date[c.obj2]) {
ret = 0;
break;
}
}
return ret;
}
int main() {
// 存储输入的条件
Condition condition[20] = {};
int n = 0;
// 循环读取输入的条件
while (scanf("%d,%d,%d,%d", &condition[n].obj1, &condition[n].obj2, &condition[n].num, &condition[n].is_eq) != EOF) {
n++;
}
// 枚举所有可能的值班日期,找到符合条件的日期
for (int i = 0; i < 31; i++) {
int date[5] = {i, i + 1, i + 2, i + 3, i + 4};
if (judge(date, n)) {
printf("%d", i);
break;
}
}
return 0;
}
```
这份代码主要功能是根据输入的条件,寻找符合条件的值班日期。下面是对代码的优化和注释:
1. 定义结构体 Condition
将结构体 condition 改为首字母大写的结构体 Condition,增加代码的可读性。同时,将成员变量 ret 改为 is_eq,表示是否为等于号。
2. 函数 judge 的优化
将函数 judge 的参数名 a 改为更加明确的 date,同时将循环变量 i 的定义和初始化放到 for 循环中,减少代码量。在循环体中,使用 const 修饰符将条件结构体定义为只读,增加代码的安全性。如果条件不符合,将 ret 设为 0 并跳出循环,减少了代码量。
3. 主函数 main 的优化
将存储条件的数组 condition 的初始化改为 {},表示将所有元素初始化为 0。在循环读取输入的条件时,使用 while 循环将 scanf 的返回值与 EOF 进行比较,可以简化代码。在枚举所有可能的值班日期时,使用 for 循环将循环变量 i 的定义和初始化放到 for 循环中,减少了代码量。通过定义一个长度为 5 的数组 date,来存储每个可能的值班日期。如果该日期符合条件,输出该日期并跳出循环。
总的来说,这份代码已经非常简洁、易读了,但也许还有其他可以优化的地方。
阅读全文