【程序设计与实践】实验四:自动寄存柜

【程序设计与实践】实验四:自动寄存柜

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

/*产生一个与已有密码不同的密码*/ 
void GeneratePassword(int i){
	int pass;
	stringstream ss;
	pass=rand()%(9999-1000+1)+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 ) {
		Lockers[i].used=0;
  		printf( "%d 号寄存箱已打开\n", i+1 ); 
	} 
	else {
		printf( "密码错误\n" );
	}
} 

int main(){ 
	srand((unsigned int)(time(NULL)));
	printf("          =========自动寄存柜========           \n\n");
	int i; 

	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; 
		} 
	} 
	return 0;
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值