导航:首页 > 软件知识 > 如何修改自动售货机程序

如何修改自动售货机程序

发布时间:2023-04-14 13:37:32

1. 自动售货机的程序代码怎么写 C语言大作业要交的,大路大神帮帮忙٩( 'ω' )و

整个程序的功能 :

商品入库 补货

商品购买 找零

还有乱七八糟的一堆验证

数据只有结构链表存储,退出不保存,你要写文件或数据库保存,你自己写吧,写不动了。

演示看下图:

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#definenameSize21//商品名称数组大小可修改
typedefstructautoMA
{
char*spName;//商品名
intspNum;//商品数量
floatspValue;//商品价格
structautoMA*next;
}AMA;

AMA*amaNEW,*amaP1,*amaSelect;//定义一个新节点指针首节点指针查找用指针
intcontStrplen(char*p);
inteqStr(char*str1,char*str2);//比较字符串是否相等,相等返回1否则返回0
AMA*selectSP(AMA*AMAhead,char*spName);//通过名称查找商品有返回节点地址没有返回NULL
voidinsertSP(AMA*AMAhead,AMA**AMAtail,char*VSPname,intVSPnum,floatVSPvalue);//添加商品如果已有该商品,数量+如果没有新增
float*buySP(AMA*AMAhead,char*name,intnum,floatpay);//购买返回float数组[2]

intmain()
{
AMA*AMAtail,*AMAhead;//定义一个头节点指针尾节点指针
float*b,value;
intnum,answer;
charname[nameSize];
amaSelect=(AMA*)malloc(sizeof(AMA));
AMAhead=(AMA*)malloc(sizeof(AMA));
AMAtail=(AMA*)malloc(sizeof(AMA));
AMAhead->next=NULL;

mu:answer=0;
memset(name,0,nameSize);
num=0;
value=0;
printf("=====系统菜单==== ");
printf("补充库存,输入1 ");
printf("购买商品,输入2 ");
scanf("%d",&answer);
if(answer==2&&AMAhead->next==NULL)
{
printf("当前没有商品库存,请先补充库存 ");
gotomu;
}
if(answer==1)
{
printf("输入ESC00返回菜单 ");
while(1)
{
printf(" 请录入补充的商品名称(名称小于%d个字符,每项空格分隔):",(nameSize-1)/2);
scanf("%s",name);
printf("请录入补充的数量:");
scanf("%d",&num);
printf("请录入单价:");
scanf("%f",&value);
if(!eqStr(name,"ESC")||num!=0||value!=0)
{
insertSP(AMAhead,&AMAtail,name,num,value);
}
else
{
printf(" 录入结束返回主菜单 ");
gotomu;
}
}

}
if(answer==2&&AMAhead->next!=NULL)
{
tb:memset(name,0,nameSize);
num=0;
value=0;
printf("输入ESC00返回菜单 ");
while(1)
{
printf(" 请输入要购买的商品名称(名称小于%d个字符):",(nameSize-1)/2);
scanf("%s",name);
printf("请输入要购买的数量:");
scanf("%d",&num);
printf("请输入支付金额:");
scanf("%f",&value);
if(!eqStr(name,"ESC")||num!=0||value!=0)
{
b=buySP(AMAhead,name,num,value);
switch((int)b[0])
{
case1:
printf(" 购买商品成功,找回零钱%.2f元 ",b[1]);
break;
case2:
printf(" 商品库存不足,当前剩余数量%d,请重新选择商品 ",(int)b[1]);
gototb;
break;
case3:
printf(" 支付金额不足,还需支付%.2f元 ",b[1]);
gototb;
break;
default:
printf(" 发生错误!交易失败! ");
break;
}
free(b);
b=NULL;
}
else
{
printf(" 购买结束返回主菜单 ");
gotomu;
}
}
}return0;
}
intcontStrplen(char*p)//计算字符串指针指向空间的字符串长度并返回长度
{
intlen=0,i=0;
while(p[i]!='')
{
len++;
i++;
}
returnlen;
}
inteqStr(char*str1,char*str2)//比较字符串是否相等,相等返回1否则返回0
{
inti;
if(strlen(str1)!=strlen(str2))
return0;
for(i=0;i<strlen(str1);i++)
{
if(str1[i]!=str2[i])
return0;
}
return1;
}
AMA*selectSP(AMA*AMAhead,char*spName)//通过名称查找商品有返回节点地址没有返回NULL
{
if(AMAhead->next==NULL)
{
returnNULL;
}

else
{
AMAhead->next=amaP1;//遍历查询前将头节点链表指针重置到首节点为下次查询准备
while(AMAhead->next!=NULL)
{
if(eqStr(AMAhead->next->spName,spName))
{
returnAMAhead->next;
}
AMAhead=AMAhead->next;
}
}
returnNULL;
}
voidinsertSP(AMA*AMAhead,AMA**AMAtail,char*VSPname,intVSPnum,floatVSPvalue)//添加商品如果已有该商品,数量+如果没有新增
//参数:头结点指针地址尾节点指针地址商品名称
{
amaSelect=selectSP(AMAhead,VSPname);
if(amaSelect!=NULL)//商品已存在数量++核实价格
{
printf(" 商品%s已存在库存%d个,现添加%d个,现在共有库存%d个 ",amaSelect->spName,amaSelect->spNum,VSPnum,(amaSelect->spNum)+VSPnum);
(amaSelect->spNum)=(amaSelect->spNum)+VSPnum;
if(amaSelect->spValue!=VSPvalue)
{
printf("--该录入的价格与原价格不一致,保留原价格,如要更新价格,请在【更新商品信息】功能中修改(该功能暂未实现) ");

}
}
else//新增商品
{
amaNEW=(AMA*)malloc(sizeof(AMA));
amaNEW->spName=(char*)malloc(sizeof(char)*(contStrplen(VSPname)+1));//按照输入字符串长度申请内存空间大小
strcpy(amaNEW->spName,VSPname);
amaNEW->spNum=VSPnum;
amaNEW->spValue=VSPvalue;
amaNEW->next=NULL;

if(AMAhead->next==NULL)//首次新增该节点为首节点头结点链表指针和尾节点指针均指向该节点首地址
{
amaP1=amaNEW;
AMAhead->next=amaP1;
*AMAtail=amaP1;
}
else//添加到链表
{
(*AMAtail)->next=amaNEW;
*AMAtail=amaNEW;
}
printf(" 商品%s,数量%d个,价格%.1f元已添加到贩卖机中 ",VSPname,VSPnum,VSPvalue);
}

}
float*buySP(AMA*AMAhead,char*name,intnum,floatpay)//购买返回float数组[2]
//购买商品成功返回[0]=1[1]=找还金额
//失败库存不足返回[0]=2[1]=当前库存
//失败金额不足返回[0]=3[1]=还需支付金额
//失败货物不存在(一般不可能出现)[0]=4[1]=4
{
float*err=(float*)malloc(sizeof(float)*2);
amaSelect=selectSP(AMAhead,name);
if(amaSelect!=NULL)//商品已存在核实数量和价格
{
if((amaSelect->spNum)<num)
{
err[0]=2;
err[1]=(float)(amaSelect->spNum);
}
if((amaSelect->spNum)>=num&&num*(amaSelect->spValue)>pay)
{
err[0]=3;
err[1]=num*(amaSelect->spValue)-pay;
}
if((amaSelect->spNum)>=num&&num*(amaSelect->spValue)<=pay)
{
err[0]=1;
err[1]=pay-num*(amaSelect->spValue);
amaSelect->spNum=amaSelect->spNum-num;
}
}
else
{
err[0]=4;
err[1]=4;
}
returnerr;
}

2. 用VHDL语言编写自动售货机程序

自动售货机VHDL程序
(1)自动售货机VHDL程序如下:
--文件名:pl_auto1.vhd。

--功能:货物信息存储,进程控制,硬币处理,余额计算,显示等功能。

--说明:显示的钱数coin的以5角为单位。

library ieee;

use ieee.std_logic_arith.all;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity PL_auto1 is

port ( clk:in std_logic; --系统时钟
set,get,sel,finish: in std_logic; --设定、买、选择、完成信号
coin0,coin1: in std_logic; --5角硬币、1元硬币
price,quantity :in std_logic_vector(3 downto 0); --价格、数量数据

item0 , act:out std_logic_vector(3 downto 0); --显示、开关信号

y0,y1 :out std_logic_vector(6 downto 0); --钱数、商品数量显示数据

act10,act5 :out std_logic); --1元硬币、5角硬币

end PL_auto1;

architecture behav of PL_auto1 is

type ram_type is array(3 downto 0)of std_logic_vector(7 downto 0);

signal ram :ram_type; --定义RAM

signal item: std_logic_vector(1 downto 0); --商品种类

signal coin: std_logic_vector(3 downto 0); --币数计数器

signal pri,qua:std_logic_vector(3 downto 0); --商品单价、数量

signal clk1: std_logic; --控制系统的时钟信号

begin

com:process(set,clk1)

variable quan:std_logic_vector(3 downto 0);

begin

if set='1' then ram(conv_integer(item))<=price & quantity;act<="0000";

--把商品的单价、数量置入到RAM

elsif clk1'event and clk1='1' then act5<='0'; act10<='0';

if coin0='1' then

if coin<"1001"then coin<=coin+1; --投入5角硬币,coin自加1

else coin<="0000";

end if;

elsif coin1='1' then

if coin<"1001"then coin<=coin+2; --投入1元硬币,coin自加2

else coin<="0000";

end if;

elsif sel='1' then item<=item+1; --对商品进行循环选择

elsif get='1' then --对商品进行购买

if qua>"0000" and coin>=pri then coin<=coin-pri;quan:=quan-1;

ram(conv_integer(item))<=pri & quan;

if item="00" then act<="1000"; --购买时,自动售货机对4种商品的操作

elsif item="01" then act<="0100";

elsif item="10" then act<="0010";

elsif item="11" then act<="0001";

end if;

end if;

elsif finish='1' then --结束交易,退币(找币)

if coin>"0001" then act10<='1';coin<=coin-2; --此IF语句完成找币操作

elsif coin>"0000" then act5<='1'; coin<=coin-1;

else act5<='0'; act10<='0';

end if;

elsif get='0' then act<="0000";

for i in 4 to 7 loop

pri(i-4)<=ram (conv_integer(item))(i); --商品单价的读取

end loop;

for i in 0 to 3 loop

quan(i):=ram(conv_integer(item))(i); --商品数量的读取

end loop;

end if;

end if;

qua<=quan;

end process com;

m32:process(clk) --此进程完成对32Mhz的脉冲分频

variable q: std_logic_vector( 24 downto 0);

begin

if clk'event and clk='1' then q:=q+1;

end if;

if q="111111111111111111111111" then clk1<='1';

else clk1<='0';

end if;

end process m32;

code0:process(item) --商品指示灯译码

begin

case item is

when "00"=>item0<="0111";

when "01"=>item0<="1011";

when "10"=>item0<="1101";

when others=>item0<="1110";

end case;

end process;

code1: process (coin) --钱数的BCD到七段码的译码

begin

case coin is

when "0000"=>y0<="0000001";

when "0001"=>y0<="1001111";

when "0010"=>y0<="0010010";

when "0011"=>y0<="0000110";

when "0100"=>y0<="1001100";

when "0101"=>y0<="0100100";

when "0110"=>y0<="0100000";

when "0111"=>y0<="0001111";

when "1000"=>y0<="0000000";

when "1001"=>y0<="0000100";

when others=>y0<="1111111";

end case;

end process;

code2: process (qua) --单价的BCD到七段码的译码

begin

case qua is

when "0000"=>y1<="0000001";

when "0001"=>y1<="1001111";

when "0010"=>y1<="0010010";

when "0011"=>y1<="0000110";

when "0100"=>y1<="1001100";

when "0101"=>y1<="0100100";

when "0110"=>y1<="0100000";

when "0111"=>y1<="0001111";

when "1000"=>y1<="0000000";

when "1001"=>y1<="0000100";

when others=>y1<="1111111";

end case;

end process;

end behav;

阅读全文

与如何修改自动售货机程序相关的资料

热点内容
提档二手车市场交易费多少 浏览:800
柱形图如何看数据显示 浏览:904
律师如何代理民事再审 浏览:83
共享广告代理怎么做 浏览:294
驱动程序更新需要多久 浏览:627
神经元如何实现接收刺激整合信息 浏览:373
浙江省有哪些参茸补品市场 浏览:399
哪里成人汽车维修技术培训 浏览:638
净值产品理财是什么意思 浏览:287
公园里的文玩市场都有什么 浏览:465
护理头发什么产品好 浏览:703
什么叫压屏机需要技术 浏览:220
日本什么丰胸产品 浏览:687
马鞍山职业技术学院地址在哪里 浏览:262
手机应用程序怎么备份到新手机 浏览:352
数据线如何导出图片 浏览:438
调查顾客的哪些信息 浏览:569
蜻蜓代理商怎么样 浏览:749
做程序员哪个星座最多 浏览:779
产品为什么要标注上市日期 浏览:669