|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
各位大佬,初学这个,看到下面这个程序,不知道怎么办,能不能给个思路,不会用链表。。。
自动寄存柜
某超市门口的自动寄存柜有n个寄存箱,并且有一个投币控制器,顾客想要寄存小件物品时,只要在投币控制器中投入一个1元硬币,如果此时有空闲的箱子,寄存柜就会自动打开一个空的箱子,并且打印输出一张小小的密码纸条;如果没有空闲的箱子,则提示“本柜已满”。当顾客离开超市时,用密码纸条上指定的数字密码依次输入到开箱控制器,则顾客所存包的箱子门就会自动打开,顾客取走物品后,关上门。
输入数据时,可先输入寄存箱总数n, 再由用户选择是“投硬币”还是“输密码”。
如果选择“投硬币”,则只有硬币值是1时才开箱。如果有空闲的箱子,则输出箱子编号及密码(4位数字); 如果无空闲的箱子,则提示“本柜已满”。
如果选择“输密码”,若输入的密码与某一箱子密码相符,则显示打开的箱子编号,否则输出提示“密码错误”。
万能密码:假定有一个密码000086,该密码用于营业结束后整理寄存柜。先在菜单中输入隐藏的选项5,然后提示请输入万能密码,密码输入后,打开所有的箱子,如有箱子中客户没有取走东西,则提示:请重点检查某编号的箱子是否有物留存。
请编写开箱控制程序实现上述过程。
输入输出示例:
寄存箱总数:10
1.投硬币 2.输密码 0.退出 请选择:1
投币值:1
寄存箱编号:1 密码:9342
1.投硬币 2.输密码 0.退出 请选择:2
输入密码:9342
1号寄存箱已打开
1.投硬币 2.输密码 0.退出 请选择:5
请输入万能密码:000086
箱子已经全部打开,请重点检查编号1,编号7的箱子是否有物留存
1.投硬币 2.输密码 0.退出 请选择:0
结束
本帖最后由 Cool_Breeze 于 2020-8-24 15:28 编辑
# 当练习题做了 - /*
- # 还有许多功能没有写!
- # BY Cool_Breeze
- # 2020/08/24
- # GCC .c
- */
- #include<stdio.h>
- #include<malloc.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- #define N 10 // 格子数量
- uchar ABLE = 0; //可用箱子数量
- typedef struct GRID
- {
- uchar id;
- uchar status;
- uint password;
- struct GRID* next;
- }GRIDV,*GRIDP;
- // 初始化储物柜格子
- GRIDP __init__(void);
- // 打印格子信息
- // check = 1 只打印可用数量
- // check = 2 打印格子信息和可用数量
- // check = 0 检查可用格子数量
- void print_grid(GRIDP grid, uchar check);
- // 操作菜单
- uchar operation_menu(GRIDP head);
- // 存物品
- void store_items(GRIDP);
- // 取物品
- uchar get_items(GRIDP head, int* passwd);
- // 管理员
- void adminstrator(GRIDP grid);
- int main(void)
- {
- //system("chcp 936");
- GRIDP locker = __init__();
- print_grid(locker, 1);
- operation_menu(locker);
-
- return 0;
- }
- GRIDP __init__(void)
- {
- uchar i = 0;
- GRIDP head, cnter, grid;
-
- for (; i<N; i++)
- {
- grid = (GRIDP)malloc(sizeof(GRIDV));
- if (i == 0)
- {
- head = cnter = grid;
- grid->id = i + 1;
- grid->status = 0;
- grid->password = 0;
- grid->next = NULL;
- }
- else
- {
- cnter->next = grid;
- grid->id = i + 1;
- grid->status = 0;
- grid->password = 0;
- grid->next = NULL;
- cnter = grid;
- }
- }
-
- return head;
- }
- void print_grid(GRIDP grid, uchar check)
- {
- ABLE = 0;
- uchar i = 0;
- for (; i<N; i++)
- {
- if (grid->status == 0) ABLE++;
- if (check == 2)
- printf("格子号:%d\t物品状态:%d\n", grid->id, grid->status);
- grid = grid->next;
- }
- if (check) printf("可用格子数量为:%d\n", ABLE);
- }
- uchar operation_menu(GRIDP head)
- {
- uchar i = 0;
- uchar number = 0;
- uchar ad_passwd[6] = {0};
- uchar ad_pd_ok[6] = {'0','0','0','0','8','6'}; // 管理员密码
- uint passwd[2] = {0};
- while (1)
- {
- printf("\n1. 投硬币\t2. 取走物品\t3.查询可用格子数量\t0. 退出\n请选择:");
- scanf("%d", &number);
- getchar();
- switch (number)
- {
- case 1:
- print_grid(head, 0);
- if (!ABLE)
- {
- printf("储物柜已满!\n");
- break;
- }
- else
- {
- store_items(head);
- break;
- }
- case 2:
- while (1)
- {
- *passwd = 0;
- *(passwd+1) = 0;
- printf("请输入格子号:");
- scanf("%d", passwd);
- getchar();
- printf("请输入密码:");
- scanf("%d", passwd+1);
- getchar();
- if (get_items(head, passwd))
- {
- printf("输入密码或者格子号错误!请重新选择\n");
- break;
- }
- break;
- }
- break;
- case 3:
- print_grid(head, 1);
- break;
- case 5:
- printf("请输入管理员密码:");
- scanf("%s", ad_passwd);
- getchar();
- for (i=0; i<6; i++)
- {
- if (*(ad_passwd + i ) == *(ad_pd_ok + i ))
- continue;
- else
- {
- printf("管理员密码错误!请重新选择\n");
- break;
- }
- }
- if (i == 6)
- {
- adminstrator(head);
- break;
- }
- break;
- case 0:
- return 0;
- }
- }
- return 0;
- }
- void store_items(GRIDP grid)
- {
- // 密码就不写了
- uchar i = 0;
- for (; i<N; i++)
- {
- if (grid->status == 0)
- {
- grid->status = 1;
- grid->password = 9342;
- printf("格子号:%d\t密码:%d\n", grid->id, 9342);
- break;
- }
- grid = grid->next;
- }
- }
- uchar get_items(GRIDP grid, int* passwd)
- {
- uchar i = 0;
- for (; i<N; i++)
- {
- if (grid->id == *passwd && grid->password == *(passwd+1))
- {
- grid->status = 0;
- printf("格子号:%d 已打开\n", grid->id);
- return 0;
- }
- grid = grid->next;
- }
- return 1;
- }
- void adminstrator(GRIDP grid)
- {
- GRIDP head = grid;
- uchar i = 0;
- for (; i<N; i++)
- {
- if (grid->status)
- {
- printf("请检查格子号:%d 是否存在物品\n", grid->id);
- }
- grid = grid->next;
- }
- printf("储物柜格子已经全部打开!\n");
-
- // 默认管理员会清空全部格子
- grid = head;
- for (i=0; i<N; i++)
- {
- grid->status = 0;
- grid = grid->next;
- }
- }
复制代码
|
|