完成实验四
实验四:自动寄存柜
某超市门口的自动寄存柜有n个寄存箱,并且有一个投币控制器,顾客想要寄存小件物品时,只要在投币控制器中投入一个1元硬币,如果此时有空闲的箱子,寄存柜就会自动打开一个空的箱子,并且打印输出一张小小的密码纸条;如果没有空闲的箱子,则提示“本柜已满”。当顾客离开超市时,用密码纸条上指定的数字密码依次输入到开箱控制器,则顾客所存包的箱子门就会自动打开,顾客取走物品后,关上门。
输入数据时,可先输入寄存箱总数n, 再由用户选择是“投硬币”还是“输密码”。
如果选择“投硬币”,则只有硬币值是1时才开箱。如果有空闲的箱子,则输出箱子编号及密码(4位数字); 如果无空闲的箱子,则提示“本柜已满”。
如果选择“输密码”,若输入的密码与某一箱子密码相符,则显示打开的箱子编号,否则输出提示“密码错误”。
请编写开箱控制程序实现上述过程。
输入输出示例:
寄存箱总数:10
1.投硬币 2.输密码 0.退出 请选择:1
投币值:1
寄存箱编号:1 密码:9342
1.投硬币 2.输密码 0.退出 请选择:2
输入密码:9342
1号寄存箱已打开
1.投硬币 2.输密码 0.退出 请选择:0
结束
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
int N;
int comp(int k);
struct box{
int key;
int used;
}box[100];
int main() {
int choice;
int coin;
int i;
int putkey;
int k = 0;
int q;
printf("寄存箱总数:");
scanf("%d", &N);
//set the box's key
for (i = 0; i < N; i++) {
box[i].key = rand() % (9999 - 1000 + 1) + 1000;
box[i].used = 0;
}
for (i = 0; i < N; i++) {
if (comp(i) == 1)
do {
box[i].key = rand() % (9999 - 1000 + 1) + 1000;
} while (comp(i) == 0);
}
printf(" =========自动寄存柜======== \n\n");
while (1) {
printf(" 1.投硬币 2.输密码 0.退出 请选择:");
scanf("%d", &choice);
if (choice == 1) {
printf("请投币:");
scanf("%d", &coin);
if (coin != 1) printf("无法识别货币");
if (coin == 1) {
for (q = 0; q < N; q++) { if (box[q].used == 0) break; }
if (q >= N) puts("本柜已满!");
if (q < N) {
printf("您的箱子序号是:%d 密码为:%d\n", q+1, box[q].key);
box[q].used = 1;
}
}
}
if (choice == 2) {
printf("请输入密码:");
scanf("%d", &putkey);
for (q = 0; q < N; q++) { if (putkey == box[q].key) break; }
if (q >= N) printf("密码错误\n");
if (q < N) {
printf("%d 号寄存箱已打开\n", q + 1);
box[q].used = 0;
do {
box[q].key = rand() % (9999 - 1000 + 1) + 1000;
} while (comp(q) == 0);
}
}
if (choice == 0) {
puts("欢迎使用本机器\n");
break;
}
}
}
int comp(int k) {
int a;
for (a = k + 1; a < N; ++a) {
if (box[k].key == box[a].key) {
return 1;
break;
}
}
if (a == N) return 0;
}