物品庫(kù)存管理課程設(shè)計(jì)報(bào)告_第1頁
物品庫(kù)存管理課程設(shè)計(jì)報(bào)告_第2頁
物品庫(kù)存管理課程設(shè)計(jì)報(bào)告_第3頁
物品庫(kù)存管理課程設(shè)計(jì)報(bào)告_第4頁
物品庫(kù)存管理課程設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、南京理工大學(xué)紫金學(xué)院VC+課程設(shè)計(jì)報(bào)告課 程:VC+課程設(shè)計(jì)系 別:計(jì)算機(jī)系班 級(jí):計(jì)科一班學(xué) 號(hào):120601105姓 名:付瑞課題名稱:物品庫(kù)存管理起止時(shí)間:2013.11.262013.12.11指導(dǎo)教師:朱 俊2013年 12 月1 程序功能介紹用文件系統(tǒng)實(shí)現(xiàn)的物品庫(kù)存管理程序。一種商品的品種里面包括(<10個(gè))品牌,以品種為單位,可以實(shí)現(xiàn)商品品種的添加、刪除、查找、顯示,以及商品的進(jìn)貨,出貨等功能。2 課程設(shè)計(jì)要求(1)組成商品品種的品牌不限數(shù)量,設(shè)置一個(gè)最大值(比如10),增加一個(gè)成員變量指示品牌的具體數(shù)量。商品品種的數(shù)量是每個(gè)品牌的數(shù)量之和。(2)設(shè)計(jì)輸出每日進(jìn)貨與出貨的統(tǒng)

2、計(jì)表,要求進(jìn)貨與出貨分別為兩個(gè)文本文件,清單上列有進(jìn)出貨物的時(shí)間、品種描述,具體品牌的進(jìn)出貨數(shù)量,如果是出貨清單,在每筆出貨的清單后還要有該次提取貨物的總價(jià)格。(3)商品品種以品種代碼的順序存放。3 對(duì)課程題目的分析該設(shè)計(jì)比較復(fù)雜,要對(duì)原程序做較大的修改,首先是數(shù)據(jù)的存放形式,因?yàn)橐髷?shù)據(jù)按代碼的順序存放,并且進(jìn)出貨時(shí)對(duì)數(shù)據(jù)的各個(gè)組成成員都要做較大的修改。如果要用文件的形式存放,那么文件的讀寫就非常頻繁,而且要使用大量的臨時(shí)文件,因此建議使用鏈表的形式存放數(shù)據(jù),在程序開始運(yùn)行時(shí)讀取固定文件中的數(shù)據(jù),程序運(yùn)行時(shí)全部數(shù)據(jù)都在內(nèi)存進(jìn)行操作。在程序運(yùn)行結(jié)束前再將鏈表中的數(shù)據(jù)存放在原來的文件中,供下次運(yùn)

3、行程序時(shí)讀取。建議首先將文件讀取這部分程序調(diào)試好,這樣在調(diào)試程序時(shí)就不用每次都從鍵盤輸入數(shù)據(jù)了,可以節(jié)省大量的時(shí)間。同時(shí),對(duì)鏈表中結(jié)點(diǎn)的操作有很多典型的程序可以參考,不同的結(jié)點(diǎn)只是數(shù)據(jù)部分類型不同,所以只要在上面稍加修改就可以使用。4 程序設(shè)計(jì)和說明(說明算法思想、設(shè)計(jì)思路,給出重要的、關(guān)鍵的代碼)(1)類的封裝由于數(shù)據(jù)的存放形式使用鏈表的形式,所以對(duì)于程序的很多操作實(shí)際上都是要求對(duì)鏈表進(jìn)行一系列處理。其中吧Citem類作為一個(gè)結(jié)點(diǎn),因此包含了大量對(duì)鏈表進(jìn)行操作的函數(shù),為了滿足程序的完整性與可讀性,應(yīng)將對(duì)鏈表操作的所有程序封裝在一起。 class Brand /品牌類 . friend cla

4、ss CItem; /定義品種類為友元類; class CNode /結(jié)點(diǎn)類 . friend class CList; /定義鏈表類為友元類; class coustomer /客戶類 .;(2)程序功能菜單的設(shè)置 程序主題采用菜單選項(xiàng)的形式,輸入相應(yīng)的菜單選項(xiàng)后程序可以反復(fù)運(yùn)行,而其中還要求3.4.5.6.8.9.項(xiàng)各有一個(gè)菜單,分別是:按照商品品種名稱和按照商品代碼進(jìn)行操作。 * * ¥歡迎使用物品庫(kù)存管理系統(tǒng)¥ * * * * 設(shè)計(jì)者 付瑞 * * * * 指導(dǎo)老師 朱俊 * * * * 詳細(xì)目錄 1. 添加商品品種 2. 顯示商品品種 3. 查詢商品 4. 刪除商品 5. 商品出庫(kù)

5、6. 商品進(jìn)庫(kù) 7. 添加客戶 8. 刪除客戶 9. 查詢客戶 10.顯示客戶資料 0. 退出系統(tǒng) 輸入選擇: int CItem:SetItem(int n) /置品種數(shù)據(jù),正確返回1,當(dāng)n為1時(shí),是新進(jìn)貨物,輸出至出清單文件cout<<"n輸入商品名稱:"Flush(cin);cin.getline(Item_name,20);cout<<"n輸入商品代碼:"cin>>Item_code;cout<<"n輸入商品顏色:"Flush(cin);cin.getline(colour,20

6、);cout<<"n輸入品牌數(shù):"<<"(不超過"<<MAXNUM<<"個(gè))"cin>>nBrnd;/循環(huán)實(shí)現(xiàn)品牌數(shù)據(jù)的輸入,count為商品總數(shù)for(int i=0,count=0;i<nBrnd;i+)cout<<"n輸入品牌"<<i+1<<"的數(shù)據(jù)n"cout<<"n輸入品牌名稱:"Flush(cin);cin.getline(brndi.brnd_nam

7、e,20);cout<<"n輸入品牌代碼:"cin>>brndi.Brand_code;cout<<"n輸入數(shù)量:"cin>>brndi.quantity;cout<<"n輸入價(jià)格:"cin>>brndi.brnd_price;count+=brndi.quantity;quantity=count;if(n=1)ofstream file("進(jìn)貨清單.txt",ios:out|ios:ate);if(!file)cout<<&qu

8、ot;錯(cuò)誤,不能打開文件."getch();exit(1);timer=time(NULL);file<<ctime(&timer);file<<"品種"<<"t"<<"代碼"<<"t"<<"顏色"<<"n"file<<Item_name<<"t"<<Item_code<<"t"<&

9、lt;colour<<"n"file<<"品牌"<<"t"<<"代碼"<<"t"<<"數(shù)量"<<"t"<<"價(jià)格"<<"n"for(int i=0;i<nBrnd;i+)file<<brndi.brnd_name<<"t"<<brndi.Brand_

10、code<<"t"<<brndi.quantity<<"t"<<brndi.brnd_price<<"n"file<<"n"();return 1; 此函數(shù)的兩個(gè)功能:第一個(gè)是在添加商品時(shí)從鍵盤輸入商品的各種數(shù)據(jù),調(diào)用這個(gè)功能時(shí)利用n的缺省值,在調(diào)用時(shí)不給n賦值;第二個(gè)是在進(jìn)貨時(shí)如果進(jìn)的是新的品種,那么也要從鍵盤輸入這個(gè)品種的各種數(shù)據(jù),這部分與第一個(gè)功能相同,但是進(jìn)貨要輸出進(jìn)貨清單,所以進(jìn)貨功能調(diào)用該函數(shù)時(shí)n設(shè)置為1,函數(shù)在運(yùn)行時(shí)增加一個(gè)判斷語

11、句,若n為1時(shí),將所鍵入的數(shù)據(jù)輸出至進(jìn)貨清單。void CItem:Show()/顯示品種數(shù)據(jù)cout<<"品種"<<"t"<<"代碼"<<"t"<<"顏色"<<"n"cout<<Item_name<<"t"<<Item_code<<"t"<<colour<<"n"cout&

12、lt;<"品牌"<<"t"<<"代碼"<<"t"<<"數(shù)量"<<"t"<<"價(jià)格"<<"n"for(int i=0;i<nBrnd;i+)cout<<brndi.brnd_name<<"t"<<brndi.Brand_code<<"t"<<br

13、ndi.quantity<<"t"<<brndi.brnd_price<<"n"cout<<"nn"<<flush;system("pause");cout<<"n"這個(gè)函數(shù)也是與出貨功能有關(guān),與InModify()的函數(shù)類似。因?yàn)槭菐?kù)中的商品出貨,所以商品品種必須存在,若不存在,則輸出提示信息,出貨失敗。還有一種可能是商品品種曾經(jīng)存在,但已經(jīng)全部出完了,這時(shí),該品種的各種數(shù)據(jù)還存在,只是數(shù)量為零。所以,在函數(shù)開始執(zhí)行時(shí)要判

14、斷庫(kù)存量是否為零,若為零,則輸出提示信息,出貨失敗。在出貨成功結(jié)束時(shí)同樣要將本品種的各種品牌的出貨數(shù)據(jù)輸出到出貨清單中。同樣,該函數(shù)也是對(duì)鏈表中所存在的結(jié)點(diǎn)的數(shù)據(jù)部分的修改。void CItem:OutModify()/出貨,修改結(jié)點(diǎn)中的數(shù)據(jù)部分int choice,count,chuhuo,price=0;/chuhuo為出貨量,price為總價(jià)格int *num;num=new intnBrnd;if(quantity=0)cout<<"數(shù)量為0."exit(1);for(int i=0;i<nBrnd;i+)/儲(chǔ)存原來的數(shù)量numi=brndi.qu

15、antity;cout<<"品牌"<<"t"<<"代碼"<<"t"<<"數(shù)量"<<"t"<<"價(jià)格"<<"n"for(i=0;i<nBrnd;i+)cout<<i+1<<"."<<brndi.brnd_name<<"t"<<brndi.B

16、rand_code<<"t"<<brndi.quantity<<"t"<<brndi.brnd_price<<"n"cout<<"nn"cout<<"輸入數(shù)字選擇出貨商品或按0退出.n"cin>>choice;while(choice>=1&&choice<=nBrnd)cout<<"輸入商品數(shù)量:"cin>>count;whil

17、e(count>brndchoice-1.quantity)cout<<"庫(kù)存不足,重新輸入:"cin>>count;brndchoice-1.quantity-=count;cout<<"出貨成功,按0退出或按數(shù)字繼續(xù)出貨.n"cin>>choice;ofstream file("出貨清單.txt",ios:out|ios:ate);if(!file)cout<<"錯(cuò)誤,不能打開文件."getch();exit(1);timer=time(NULL

18、);file<<ctime(&timer);file<<"品種"<<"t"<<"代碼"<<"t"<<"顏色"<<"n"file<<Item_name<<"t"<<Item_code<<"t"<<colour<<"nn"file<<"品

19、牌"<<"t"<<"代碼"<<"t"<<"價(jià)格"<<"t"<<"出貨量"<<"n"for(i=0;i<nBrnd;i+)if(chuhuo=numi-brndi.quantity)price=chuhuo*brndi.brnd_price;file<<brndi.brnd_name<<"t"<<brnd

20、i.Brand_code<<"t"<<brndi.brnd_price<<"t"<<chuhuo<<"n"file<<"總價(jià)格為:"<<price<<"nn"delete num;();InModify()同樣也與進(jìn)貨功能有關(guān)。因?yàn)樗M(jìn)的品種可能是也有的品種,只是增加其中的數(shù)量而已。所以,在輸入進(jìn)貨品種或品種代碼時(shí)要判斷是否是庫(kù)中已有的品種,若是就調(diào)用這個(gè)函數(shù),只從鍵盤輸入具體的品牌數(shù)量或新增品牌數(shù)據(jù)

21、即可,而不用在鍵入品種的各種數(shù)據(jù),同時(shí),新鍵入的各種數(shù)據(jù)也輸出到進(jìn)貨清單。實(shí)際上該函數(shù)是對(duì)鏈表中所存在的結(jié)點(diǎn)的數(shù)據(jù)部分的修改。此函數(shù)先判斷出貨量是不是大于庫(kù)存量,如果大于將顯示“庫(kù)存不足,重新輸入”。如果小于的話將會(huì)繼續(xù)程序,通過brndchoice-1.quantity-=count;把原有量減去省下剩余量。void CItem:InModify()/已有商品,再次進(jìn)貨,修改結(jié)點(diǎn)中的數(shù)據(jù)部分char name20;char choice;int count,jinhuo=0;int prenBrnd=nBrnd; /原先品牌數(shù)int n=1;/用于判斷是否繼續(xù)進(jìn)貨int flag=0;/用于

22、判斷是否新品牌int * num;num=new intprenBrnd;for(int i=0;i<nBrnd;i+)/儲(chǔ)存原來的數(shù)量numi=brndi.quantity;while(n)cout<<"nn輸入品牌名稱:"Flush(cin);cin.getline(name,20);for(int i=0;i<nBrnd;i+)if(strcmp(brndi.brnd_name,name)=0)cout<<"nn輸入進(jìn)貨數(shù)量:"cin>>count;brndi.quantity+=count;quan

23、tity+=count;flag=1;break;if(flag=0)strcpy(brndnBrnd.brnd_name,name);cout<<"n輸入品牌代碼:"cin>>brndnBrnd.Brand_code;cout<<"n輸入數(shù)量:"cin>>brndnBrnd.quantity;cout<<"n輸入價(jià)格:"cin>>brndnBrnd.brnd_price;quantity+=brndnBrnd.quantity;nBrnd+;cout<&l

24、t;"n繼續(xù)進(jìn)貨:y/n "cin>>choice;if(choice='y'|choice='Y')n=1;else n=0;ofstream file("進(jìn)貨清單.txt",ios:out|ios:ate);if(!file)cout<<"錯(cuò)誤,不能打開文件."getch();exit(1);timer=time(NULL);file<<ctime(&timer);file<<"品種"<<"t"

25、;<<"代碼"<<"t"<<"顏色"<<"n"file<<Item_name<<"t"<<Item_code<<"t"<<colour<<"nn"file<<"品牌"<<"t"<<"代碼"<<"t"<<

26、;"價(jià)格"<<"t"<<"進(jìn)貨量"<<"n"for(i=0;i<prenBrnd;i+)if(jinhuo=brndi.quantity-numi)file<<brndi.brnd_name<<"t"<<brndi.Brand_code<<"t"<<brndi.brnd_price<<"t"<<jinhuo<<"

27、;n"if(nBrnd>prenBrnd)for(i=prenBrnd;i<nBrnd;i+)file<<brndi.brnd_name<<"t"<<brndi.Brand_code<<"t"<<brndi.brnd_price<<"t"<<brndi.quantity<<"n"file<<"nn"delete num;(); void add()這個(gè)函數(shù)實(shí)現(xiàn)添加客戶

28、資料功能。創(chuàng)建了一個(gè)“客戶資料”文件,從鍵盤輸入客戶資料,再將客戶的資料傳到文件中,從而實(shí)現(xiàn)添加的功能。void customer:add() /加入客戶資料 ofstream file( "客戶資料.txt", ios:out |ios:ate ); if(!file) cout<<"錯(cuò)誤,無法打開文件" getch(); exit(1); customer p2; p2.getdata(); /從鍵盤輸入客戶資料 /將該客戶的資料傳到文件中 (reinterpret_cast <char *> (&p2),sizeof

29、(customer);/reinterpret_cast將其他類型的數(shù)據(jù)轉(zhuǎn)換為字符指針 void showab()這個(gè)函數(shù)實(shí)現(xiàn)的是顯示客戶資料的功能。首先以輸入方式打開文件,讀取“客戶資料”文件,再讀取,從而實(shí)現(xiàn)顯示的功能。void customer:showab() /全部顯示ifstream file( "客戶資料.txt" ,ios:in); /以輸入方式打開文件 if(!file)cout<<"錯(cuò)誤,無法打開文件"getch(); exit(1); customer p2;(reinterpret_cast <char *>

30、; (&p2),sizeof(customer);/讀取文件內(nèi)容while(!()/讀入正確,顯示,接著讀取p2.showdata();getch();(reinterpret_cast <char *> (&p2),sizeof(customer); void search()這個(gè)函數(shù)實(shí)現(xiàn)的是查詢客戶資料的功能。增加了一個(gè)子菜單,選擇是按客戶名稱查詢,或者是按客戶代碼查詢,亦或者是退出。同樣的,我們所需的數(shù)據(jù)是要從“客戶資料”文件中讀取的。void customer:search() /搜索char name110; int code; int choice; c

31、out<<"nn1. 按客戶名稱查詢 "cout<<"nn2. 按客戶代碼查詢 "cout<<"nn0. 退出 "cout<<"nn輸入選擇: " cin>>choice; switch(choice) case 1:cout<<"nn輸入客戶名稱: " cin>>name1; code=0;break; case 2:cout<<"nn輸入客戶代碼: " cin>>c

32、ode; strcpy(name1,"null");break;fstream file( "客戶資料.txt" ,ios:in); if(!file)cout<<"錯(cuò)誤,無法打開文件" getch();exit(1); char flag='a' customer p2; (reinterpret_cast<char *>(&p2),sizeof(customer); while( !() ) if(strcmp(p2.customer_name,name1)=0) | (p2.cus

33、tomer_code=code) p2.showdata(); getch(); flag='z' break; (reinterpret_cast<char *> (&p2),sizeof(customer); if(flag !='z') cout<<("nn客戶未找到nn"); getch(); void remove()這個(gè)函數(shù)實(shí)現(xiàn)的是刪除客戶資料的功能。和search函數(shù)一樣,也是添加了一個(gè)子菜單,打開文件,若文件存在,則刪除原文件,否則顯示,“錯(cuò)誤 文件無法打開”,依次讀取文件內(nèi)容,將未刪除的文件寫

34、入temp中,然后再將temp文件中的內(nèi)容寫回file1中。void customer:remove() /刪除客戶 char name110; int code; int choice; cout<<"nn1. 按客戶名稱刪除 " cout<<"nn2. 按客戶代碼刪除 " cout<<"nn0. 退出 " cout<<"nn輸入選擇: " cin>>choice; if(choice=1) cout<<"nn輸入客戶名稱: &qu

35、ot; cin>>name1; code=0; else cout<<"nn輸入客戶代碼: " cin>>code; strcpy(name1,"null"); ifstream file( "客戶資料.txt" ,ios:in ); ofstream temp( "delete2.txt", ios:trunc); if( !) cout<<"n無法打開文件n" getch(); exit(1); (0); temp.seekp(0); cust

36、omer p2; (reinterpret_cast<char *> (&p2),sizeof(customer); while( !() ) if( (strcmp(name1,p2.customer_name)=0) | (code=p2.customer_code) (reinterpret_cast<char *> (&p2),sizeof(customer); else temp.write(reinterpret_cast<char *>(&p2),sizeof(customer);/將未刪除的文件寫入temp中 (rei

37、nterpret_cast<char *> (&p2),sizeof(customer); (); temp.close(); ifstream temp1("delete2.txt",ios:in); ofstream file1("客戶資料.txt", ios:trunc); temp1.seekg(0); (0); temp1.read( reinterpret_cast<char *> (&p2),sizeof(customer) ); while( !temp1.eof() )/將temp文件中的內(nèi)容寫回

38、file1 ( reinterpret_cast<char *> (&p2),sizeof(customer) ); temp1.read( reinterpret_cast<char *> (&p2),sizeof(customer) ); temp1.close(); (); 5 課程設(shè)計(jì)中遇到的問題及解決方法問題1: 怎么設(shè)置按任意見鍵繼續(xù)。解決辦法:通過百度知道,getch()那么就是按下就起效,按下的字符不可見,而getchar()就是按了以后還要再敲回車才會(huì)起效,并且按下的字符是可見的。 if(!outfile)cout<<&qu

39、ot;錯(cuò)誤,不能打開文件"getch();exit(1);問題2: 怎樣解決如果初始儲(chǔ)存器中含有數(shù)據(jù)對(duì)程序的影響問題?解決辦法:在實(shí)際操作中,可能會(huì)因錯(cuò)誤而輸入錯(cuò)誤的字符,這時(shí)可能會(huì)對(duì)程序的正常運(yùn)行造成影響,所以必須刷新輸入流清除儲(chǔ)存器中的數(shù)據(jù),經(jīng)過翻閱C語言方面的資料發(fā)現(xiàn)使用以下函數(shù)就可實(shí)現(xiàn)。inline istream & Flush(istream & stream) stream.clear();int chars_to_skip=stream.rdbuf()->in_avail();return stream.ignore(chars_to_skip);問題3: 怎樣做到商品品種以品種代碼的順序存放?解決辦法: 一開始我想到用文件的形式存放,那么文件的讀寫就非常頻繁,而且要使用大量的臨時(shí)文件。所以后來就考慮到可以使用鏈表的形式存放數(shù)據(jù),在程序開始運(yùn)行時(shí)讀取固定文件中的數(shù)據(jù),程序運(yùn)行時(shí)全部數(shù)據(jù)都在內(nèi)存進(jìn)行操作。在程序運(yùn)行結(jié)束前再將鏈表中的數(shù)據(jù)存放在原來的文件中,供下次運(yùn)行程序時(shí)讀取。只要將文件讀取這部分程序調(diào)試好,在調(diào)試程序時(shí)就不用每次都從鍵盤輸入數(shù)據(jù)了,可以節(jié)省大量的時(shí)間。問題4:為保證程序界面的美觀,如何清屏?解決辦法:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論