单种物品的库存变动
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题意:
保管员管理一种物品,记录其名称和当前库存。
每次给出一个有符号整数 ,表示本次库存变动量:
- 表示入库;
- 表示出库;
- 表示库存不变。
如果执行本次操作后库存仍然非负,则执行操作;否则拒绝本次操作,库存保持不变。变动量为 时,操作成功。
本题采用函数接口提交方式(Template)。系统已提供下面的结构体定义:
struct item {
char name[21];
long long stock;
int ok;
};
其中:
name表示物品名称;stock表示当前库存;ok表示最近一次操作是否成功,1表示成功,0表示失败。
请选择 C 语言,只提交下面函数的完整定义:
struct item change(struct item a, long long d);
其中,参数 a 表示操作前的物品记录,参数 d 表示本次库存变动量。函数应返回操作后的完整记录。
函数需要满足以下要求:
- 如果
a.stock + d非负,则将库存更新为a.stock + d,并将ok设为1。 - 如果
a.stock + d为负数,则库存保持不变,并将ok设为0。 - 无论操作是否成功,
name都应保持不变。 - 本次操作是否成功只由当前库存和本次变动量决定,与传入的
ok值无关。
首次调用 change 前,系统会将 ok 初始化为 1。之后系统会按照输入顺序反复调用 change,并将每次返回的结构体作为下一次调用的参数。
系统会将你提交的函数定义插入下面代码的指定位置,再进行编译和运行:
#include <stdio.h>
struct item {
char name[21];
long long stock;
int ok;
};
struct item change(struct item a, long long d);
/* 在此处插入你提交的函数定义。 */
int main(void) {
struct item a;
int q;
scanf("%20s%lld%d", a.name, &a.stock, &q);
a.ok = 1;
for (int i = 0; i < q; i++) {
long long d;
scanf("%lld", &d);
a = change(a, d);
if (a.ok) {
printf("OK %lld\n", a.stock);
} else {
printf("FAIL %lld\n", a.stock);
}
}
printf("%s %lld\n", a.name, a.stock);
return 0;
}
因此,你只需要实现 change 函数,不需要读入数据或输出结果,不要重复定义 struct item,也不要提交 main 函数。
输入格式:
以下输入由系统提供的外部代码读入。
第一行依次给出物品名称 、初始库存 和操作次数 (,,)。
名称仅由小写英文字母组成, 表示名称的字符个数。
接下来 行,每行一个整数 (),表示本次库存变动量。
输出格式:
以下输出由系统提供的外部代码完成。
对于每次操作:
- 如果操作成功,输出
OK stock; - 如果操作失败,输出
FAIL stock。
其中,stock 表示本次操作处理后的实际库存。
全部操作结束后,再输出一行物品名称和最终库存,以一个空格分隔。
当 时,只输出物品名称和初始库存。
样例:
样例输入:
camera 3 4
-4
-3
5
0
样例输出:
FAIL 3
OK 0
OK 5
OK 5
camera 5
样例解释:
初始库存为 。
第一次操作的变动量为 ,执行后库存将变为 ,因此拒绝本次操作,库存仍为 。
第二次操作的变动量为 ,执行后库存变为 ,操作成功。
第三次操作的变动量为 ,库存变为 。
第四次操作的变动量为 ,库存仍为 ,该操作仍然视为成功。
C Programming Practice Round 6
- 状态
- 已结束
- 规则
- XCPC
- 题目
- 11
- 开始于
- 2026-10-8 0:00
- 结束于
- 2026-10-15 0:00
- 持续时间
- 168 小时
- 主持人
- 参赛人数
- 11