一遍过,用的笨方法写,部分代码可以优化,逻辑都挺简单的,就是题目要求多且复杂,代码运行时空效率都还可以
#include <stdio.h>
#include <string.h>
#define goods_nums 6//定义商品种数
#define money_nums 4//定义纸币种数
/*规格说明>>*/
char goods_name[goods_nums][4]={"A1","A2","A3","A4","A5","A6"};//规定商品名称
int goods_val[goods_nums]={2,3,4,5,8,6};//规定商品价格
int money_name[money_nums]={1,2,5,10};//规定可接受钱币面值
int goods[goods_nums]={0};//存储各商品数
int money[money_nums]={0};//存储各面值纸币数
/*<<规格说明*/
int balance=0;//投币余额
char name[4]={0};//用于存储购买商品时输入的商品名称
void getname(){//获取想要购买的商品名称
char c;int i=0;
while(scanf("%c",&c)!=EOF){
if(c==' '){
continue;
}
if(c!=';'){
name[i++]=c;
}
else{
break;
}
}
}
int getnums(){//获取数字
char c;int t,number=0;
while(scanf("%c",&c)!=EOF){
if(c>='0' && c<='9'){
t=c-'0';
number=number*10+t;
}
else{
break;
}
}
return number;
}
int getmoney(int* a){//获取存钱盒1元、2元总余额
int n=a[0]+2*a[1];
return n;
}
void Initialization(int* a,int nums){//初始化商品数量或者初始化纸币数
char c,t;int flag=0,i=0;
while(scanf("%c",&c)!=EOF){
if(c>='0' && c<='9'){
if(flag){
flag=0;
a[i++]=(t-'0')*10+c-'0';
}
else{
flag=1;
t=c;
continue;
}
}
if(flag){
flag=0;
a[i++]=t-'0';
}
if(i==nums){
break;
}
}
}
void p(){//投币
char c;int n,flag=0;
while(scanf("%c",&c)!=EOF){
n=getnums();
if(n!=1 && n!=2 && n!=5 && n!=10){
printf("E002:Denomination error\n");
break;
}
if(n>2 && n>=getmoney(money)){
printf("E003:Change is not enough, pay fail\n");
break;
}
for(int i=0;i<goods_nums;i++){
if(goods[i]){
flag=1;
break;
}
}
if(!flag){
printf("E005:All the goods sold out\n");
break;
}
else{
balance+=n;
for(int i=0;i<money_nums;i++){
if(n==money_name[i]){
money[i]++;
break;
}
}
printf("S002:Pay success,balance=%d\n",balance);
break;
}
}
}
void buy(){//购买
int flag=-1;
getname();
for(int i=0;i<goods_nums;i++){
if(strcmp(name,goods_name[i])==0){
flag=i;
memset(name,0,sizeof(name));
break;
}
}
if(flag==-1){
printf("E006:Goods does not exist\n");
return;
}
if(!goods[flag]){
printf("E007:The goods sold out\n");
return;
}
if(balance<goods_val[flag]){
printf("E008:Lack of balance\n");
return;
}
else{
balance-=goods_val[flag];
goods[flag]--;
printf("S003:Buy success,balance=%d\n",balance);
}
return;
}
void repay(){//退币
if(!balance){
printf("E009:Work failure\n");
}
else{
int n[money_nums];
for(int i=money_nums-1;i>-1;i--){//遵循最少退币原则,从最大面值开始退
n[i]=balance/money_name[i];//用于各个面值的存储退币数量
if(n[i]>=1){
if(n[i]<=money[i]){
balance%=money_name[i];
}
else{//存钱盒当前面值货币不足时有多少退多少
n[i]=money[i];
balance-=money_name[i]*n[i];
}
money[i]-=n[i];//更新存钱盒
}
}
for(int i=0;i<money_nums;i++){
printf("%d yuan coin number=%d\n",money_name[i],n[i]);//打印输出
}
balance=0;//清空余额
}
}
void search(){//查询
char c;
scanf("%c",&c);
if(c!=' '){
printf("E010:Parameter error\n");
return;
}
scanf("%c",&c);
if(c=='0'){
int t=0,flag=0,max1,max2=999;
int n[goods_nums]={0};//用于从大到小存储商品出现过的数量
for(int i=0;i<goods_nums;i++){
max1=-1;
for(int j=0;j<goods_nums;j++){
if(max1<goods[j] && goods[j]<max2){
flag=1;
max1=goods[j];
}
}
if(flag){
flag=0;
n[t++]=max1;
max2=max1;
}
}
for(int i=0;i<t;i++){
for(int j=0;j<goods_nums;j++){
if(goods[j]==n[i]){
printf("%s %d %d\n",goods_name[j],goods_val[j],goods[j]);
}
}
}
}
else if(c=='1'){
for(int i=0;i<money_nums;i++){
printf("%d yuan coin number=%d\n",money_name[i],money[i]);//打印输出
}
}
else{
printf("E010:Parameter error\n");
}
}
void cmd(){
char c;
while(scanf("%c",&c)!=EOF){
if(c=='r'){
Initialization(goods,goods_nums);
Initialization(money,money_nums);
printf("S001:Initialization is successful\n");
}
else if(c=='p'){
p();
}
else if(c=='b'){
buy();
}
else if(c=='c'){
repay();
}
else if(c=='q'){
search();
}
}
}
int main(){
cmd();
}

京公网安备 11010502036488号