【程序设计与实践】实验四:自动寄存柜(C语言)

自动寄存柜

     某超市门口的自动寄存柜有 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

结束

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

#define MAX_LOCKER_COUNT 100    /*寄存柜的最大数量*/

/*寄存柜结构*/
typedef struct{
    int used;        /*0 表示没被使用了,1 表示被使用了*/
    string password;     /*密码*/
}Locker;

Locker Lockers[MAX_LOCKER_COUNT]; /*寄存柜数组*/

int LockerCount; /*寄存柜个数*/
 
/*查找密码所对应的柜子,找到返回相应的数组下标,未找到返回-1*/
int FindByPassword(string pwd){
    int i=-1;
    for(i=0;i<MAX_LOCKER_COUNT;i++){
        if(pwd==Lockers[i].password)    return i;
        if(pwd=="000086")
            return 101;
    }
    return -1;
}

/*产生一个与已有密码不同的密码*/
void GeneratePassword(int i){
    int pass;
    stringstream ss;
    pass=rand()%(9000)+1000;
    ss<<pass;
    ss>>Lockers[i].password;
    ss.clear();
}

/*执行投入硬币动作*/
void DropCoin(){
    int    i,coin;
    while(1){
        printf( "请投币:" );
        scanf( "%d", &coin );
        if(coin == 1){
            break;
        }
        else    puts( "请投入 1 个 1 元的硬币" );
    }
    
    /*查找一个空的寄存柜*/
    for(i=0;i<LockerCount;i++){
        if(Lockers[i].used==0)    break;
    }
        if( i>=LockerCount ){
            puts( "本柜已满!" );
        return;
    }

/*产生密码,并将使用标志置为 1 */
    GeneratePassword(i);
    Lockers[i].used = 1;

/*输出信息*/
    cout<<"寄存箱编号:"<<i+1<<"    密码:"<<Lockers[i].password<<endl;
}
/*执行输入密码动作*/
void InputPassword(){
    string pwd;
    /*输入密码*/
    printf( "输入密码:" );
    getchar();
    getline(cin,pwd);
    
    int i = FindByPassword(pwd);
    if(i == -1)
    printf("密码错误\n");
    else if(i == 101){
    printf("箱子已全部打开\n");
    for(i = 0;i<LockerCount;i++){
    if(Lockers[i].used==1)
    printf("请重点检查编号%d的箱子是否有物品存留\n", i+1);
                }
     }
     else{
        Lockers[i].used=0;
          printf( "%d 号寄存箱已打开\n", i+1 );
    }
}

int main(){
    srand((unsigned int)(time(NULL)));
    printf("          =========自动寄存柜========           \n\n");
    int i;
    char m[6];
    printf( "寄存柜总数:" );
    scanf( "%d", &LockerCount );

    /*初始化*/
    for(i=0;i<LockerCount;i++){
        Lockers[i].used=0;
    }

    while(1){
        printf( "1.投硬币    2.输密码    0.退出    请选择: " );
        scanf("%d",&i);
        if(i==1){
            DropCoin();
        }
        else if(i==2){
            InputPassword();
        }
        else if(i==0){
            puts( "结束" );
            break;
        }
        else if(i==5){
            InputPassword();
        }
    }
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值