導航:首頁 > 軟體知識 > 如何修改自動售貨機程序

如何修改自動售貨機程序

發布時間: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;

閱讀全文

與如何修改自動售貨機程序相關的資料

熱點內容
日照怎麼弄大數據獲客軟體 瀏覽:841
毛輔酒的代理怎麼樣 瀏覽:515
淡水二手車交易市場在哪裡 瀏覽:950
曲阜批發市場蘋果多少錢一箱 瀏覽:330
頭條怎麼沒有自己的小程序 瀏覽:36
滴滴小程序如何拉黑司機 瀏覽:489
阜外醫院室壁瘤手術技術如何 瀏覽:122
劍網3如何卸載程序 瀏覽:401
提檔二手車市場交易費多少 瀏覽:800
柱形圖如何看數據顯示 瀏覽:904
律師如何代理民事再審 瀏覽:83
共享廣告代理怎麼做 瀏覽:294
驅動程序更新需要多久 瀏覽:627
神經元如何實現接收刺激整合信息 瀏覽:373
浙江省有哪些參茸補品市場 瀏覽:399
哪裡成人汽車維修技術培訓 瀏覽:639
凈值產品理財是什麼意思 瀏覽:287
公園里的文玩市場都有什麼 瀏覽:466
護理頭發什麼產品好 瀏覽:704
什麼叫壓屏機需要技術 瀏覽:220