1.系統(tǒng)分析
1.1課程設(shè)計(jì)內(nèi)容
商場(chǎng)商品信息管理系統(tǒng)
1.2系統(tǒng)功能需求分析
1、問題定義
創(chuàng)建一個(gè)商品信息管理系統(tǒng)。假設(shè)系統(tǒng)中每件商品記錄只包括編碼、價(jià)格、商品名稱等信息。程序的運(yùn)行效果如下圖所示,選擇任意菜單后,實(shí)現(xiàn)相應(yīng)功能。
在問題定義階段要考慮題目的可行性和需求分析,接下來進(jìn)入開發(fā)階段,完成系統(tǒng)設(shè)計(jì)和系統(tǒng)實(shí)現(xiàn)的任務(wù)。
2.系統(tǒng)設(shè)計(jì)
2.1總體設(shè)計(jì)
采用模塊化的程序設(shè)計(jì)方法,即將較大的任務(wù)按照一定的原則分為一個(gè)個(gè)較小的任務(wù),然后分別設(shè)計(jì)各個(gè)小任務(wù)。需要注意的是劃分出來的模塊應(yīng)該相對(duì)獨(dú)立但又相關(guān),且容易理解??梢杂媚K化層次結(jié)構(gòu)圖(即模塊圖)來分析其任務(wù)的劃分,一般從上到下進(jìn)行,最上面一層是主模塊,下面各層是其上一層模塊的逐步細(xì)化描述。
本商品管理系統(tǒng)要求采用數(shù)組實(shí)現(xiàn),如圖2.1所示,它由如下五大功能模塊組成:
- 1.錄入商品基本信息模塊。完成將數(shù)據(jù)存入數(shù)組的工作。定義一個(gè)int型整型變量,該數(shù)組把首地址給menu-item指針變量,并調(diào)用page-title()函數(shù)輸出“錄入商品基本信息”這句話。商品信息記錄由商品的編碼、名字、價(jià)格構(gòu)成。但錄入商品基本信息時(shí)運(yùn)用了for循環(huán)語句。錄入商品的數(shù)量不能為空,否則跳出for循環(huán)。錄入商品信息時(shí),系統(tǒng)將商品信息存儲(chǔ)在數(shù)組中,即void product-new()啟到錄入商品信息的作用。完成錄入信息后,調(diào)用return-confirm()函數(shù),提示是否繼續(xù),否則按任意鍵返回主頁面。
- 2.修改商品基本信息模塊。運(yùn)用了條件判斷語句if語句,在此商品信息管理系統(tǒng)中,完成了對(duì)商品信息記錄的維護(hù)。將修改過的信息重新存入到源數(shù)據(jù)中。其中還調(diào)用了search-num()函數(shù)與之鍵入的商品信息作比較,即鍵入商品信息不能為空。
- 3.刪除商品基本信息模塊。定義一個(gè)int整型變量,再調(diào)用page-title函數(shù)輸出“注銷商品基本信息”這句話,再運(yùn)用if選擇結(jié)構(gòu)語句,判斷條件是輸入的商品不能為空,條件成立即執(zhí)行程序,將此商品信息從源數(shù)據(jù)中刪除。其中調(diào)用了search-num()函數(shù)與之鍵入的商品信息作比較,判斷鍵入的商品信息不能為空,成立既可以刪除。
- 4.瀏覽商品基本信息模塊。該模塊運(yùn)用了for循環(huán)結(jié)構(gòu)語句,內(nèi)嵌套if選擇結(jié)構(gòu)語句,調(diào)用search-num()函數(shù)與之鍵入商品信息作比較,即輸入信息不能為空,否則跳出循環(huán),成立即可瀏覽商品,最后并調(diào)用return-confirm()函數(shù)提示是否繼續(xù)此模塊,“否”按任意鍵返回主界面。
2.2詳細(xì)設(shè)計(jì)
2.2.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
struct product???????????? //定義結(jié)構(gòu)體數(shù)組
{
int num;??????????????? //成員表列
float price;
char name[21];
}products[32];??????????? //變量名表列
定義了一個(gè)結(jié)構(gòu)體數(shù)組product,共有32個(gè)元素,product【0】~product【31】。每個(gè)數(shù)組元素都具有struct product類型。該數(shù)組各元素在內(nèi)存中連續(xù)存放,占用一段連續(xù)的儲(chǔ)存單元。
2.2.2主控流程
主函數(shù):
void main()
{
system("color 0A");
menu: page_title("? 操作選單? ");
printf("請(qǐng)用數(shù)字鍵選擇操作nn");
printf("1 錄入商品基本信息n2 修改商品基本信息n");
printf("3 注銷商品基本信息n4 瀏覽商品");
printf("? 0 退出n");
switch(getch())
{
case '1' : product_new();break;
case '2' : product_edit();break;
case '3' : product_del();break;
case '4' : browser();break;
case '0' : exit(0);
}
goto menu;???????? //跳轉(zhuǎn)到指定的位置,即主頁面
}
主函數(shù)運(yùn)用了函數(shù)為空類型(void):利用選擇結(jié)構(gòu)(switch)實(shí)現(xiàn)在主函數(shù)中的調(diào)用各個(gè)子函數(shù),利用goto函數(shù)實(shí)現(xiàn)返回主菜單的循環(huán)。menu只是一個(gè)標(biāo)號(hào)。switch(getch())也可以定義為:
scanf(“%d”,&c);
switch(c);
調(diào)用system子函數(shù),其中“color 0A”即可改變背景的顏色和字體的顏色。此外,主函數(shù)也調(diào)用了page-title()函數(shù)輸出“操作選單”這句話。
2.2.3錄入商品基本信息模塊
子函數(shù):
(1). 錄入商品信息函數(shù)
Void? product-new();
{
int n;
page_title("錄入商品基本信息");
printf("編號(hào)-名字-價(jià)格n");
for(n=0;n<32;n++)
if(products[n].num==0) break;
printf("編號(hào):");
scanf("%d",&products[n].num);
printf("名字:");
scanf("%s",&products[n].name);
printf("價(jià)格:");
scanf("%f",&products[n].price);
return_confirm();
}
定義一個(gè)整型變量n,n既是商品信息總數(shù)也是循環(huán)變量,確定新的庫存量定義為n<32,輸入的商品信息,用for循環(huán)語句直到輸入商品的庫存量大于等于32,結(jié)束循環(huán)。
???????? 錄入商品基本信息 For(n=0;n<32;n++) 將數(shù)據(jù)存入到成員表列 Return-confirm() |
(2).刪除商品信息函數(shù)
void product_del()
{
int n;
page_title("注銷商品基本信息");
if((n=search_num())!=0) products[n].num=0;
printf("n!該商品已注銷.n");
return_confirm();
}
定義一個(gè)整型變量n,調(diào)用page-title輸出“注銷商品基本信息”這句話,運(yùn)用if選擇結(jié)構(gòu)語句,判斷條件是輸入商品信息不能為空,即調(diào)用search-num()函數(shù)與之比較,條件成立即可注銷該商品。
???????? 注銷商品基本信息 If(n=search-num()!=0) Products【n】.num=0; 該數(shù)據(jù)已從成員表列中刪除
|
(3).編輯商品信息函數(shù)
void product_edit()
{
int n;
page_title("編輯商品基本信息");
if((n=search_num())!=0)
{
printf("n請(qǐng)重新輸入新信息:n編號(hào):");
scanf("%d",&products[n].num);
printf("名字:");
scanf("%s",&products[n].name);
printf("價(jià)格:");
scanf("%f",&products[n].price);
}
return_confirm();
}
定義一個(gè)整型變量n,調(diào)用page-title輸出“編輯商品基本信息”這句話,運(yùn)用if選擇結(jié)構(gòu)語句,判斷條件是輸入商品信息不能為空,即調(diào)用search-num()函數(shù)與之比較,條件成立即可重新編輯該商品信息。最后調(diào)用return-confirm()函數(shù),提示是否繼續(xù)此模塊,“否”按任意鍵返回主界面。
編輯商品基本信息 If(n=search-num()!=0) 請(qǐng)重新輸入新信息: 編號(hào): 名稱: 價(jià)格: Return-confirm()
|
(4).瀏覽商品信息函數(shù)
void browser()
{int n,i;
system("CLS");//清屏
printf("商品列表:n");
for(i=0;i<32;i++)
{
if((n=search_num())!=0);break;
}
return_confirm();
}
定義兩個(gè)整型變量n,i;其中i是商品信息錄入量。運(yùn)用system函數(shù)起到清屏的作用。再運(yùn)用格式化輸出函數(shù)printf,原樣輸出“商品表列”這句話,再運(yùn)用for循環(huán)控制結(jié)構(gòu)查詢商品信息,商品信息庫存量最大不能超過32,內(nèi)嵌套一個(gè)if選擇結(jié)構(gòu)語句,調(diào)用
search-num()? 這個(gè)函數(shù)與輸入信息作比較,兩者是否相等,不相等說明輸入信息有誤查找不到此類商品。
(5).其他子函數(shù)功能描述
- Void page-title(char *menu-item)
定義一個(gè)叫page-title的函數(shù),其形參定義為一個(gè)指針變量menu-item。其中void是函數(shù)類型,page-titile是函數(shù)名,括號(hào)里面char參數(shù)類型,menu-item是參數(shù)名。Printf是原樣輸出括號(hào)里面的內(nèi)容,其中“>”“<”是普通字符原樣輸出,“%s”是格式控制,“menu-item”是指針變量。這是一個(gè)顯示頁眉的函數(shù),同時(shí)通過參數(shù)menu-item指針變量,輸出指針?biāo)赶虻膬?nèi)容,即可以顯示當(dāng)前的狀態(tài)。這個(gè)函數(shù)的作用是在下一頁執(zhí)行指定的操作。
- Void return-confirm()
定義一個(gè)叫return-confirm的函數(shù),其作用是提示是否繼續(xù)執(zhí)行當(dāng)前任務(wù),不繼續(xù)可以按任意鍵返回到主頁面。?? System函數(shù)其存放在#include“Windows.h”函數(shù)庫當(dāng)中。
- Intsearch-num()
定義一個(gè)叫search-num的函數(shù),其功能是查找商品。其???? 通過商品的編號(hào)進(jìn)行查找。首先定義兩個(gè)整型變量n、i,運(yùn)用for循環(huán)語句,確定庫存量定義為n<32,內(nèi)嵌套一個(gè)if選擇結(jié)構(gòu)語句,判斷輸入的商品信息與庫存量商品信息是否一致以及輸入商品不能為空,條件成立即可輸出商品的編號(hào)、名稱、價(jià)格,若條件不成立即會(huì)輸出一句話“輸入錯(cuò)誤或編號(hào)不存在”。
3.系統(tǒng)編碼設(shè)計(jì)
3.1編碼
3.1.1程序預(yù)處理
注:包括加載頭文件,定義結(jié)構(gòu)體、常量和變量,并對(duì)它們進(jìn)行初始化工作。
#include "stdio.h"?? /*標(biāo)準(zhǔn)輸入輸出函數(shù)庫*/
#include "stdlib.h"? /*標(biāo)準(zhǔn)函數(shù)庫*/
#include "string.h"? /*字符串函數(shù)庫*/
#include "conio.h"??? /*屏幕操作函數(shù)庫*/
#include"windows.h"?? //存放清屏、改變字體顏色等函數(shù)//
struct product???????????? //定義結(jié)構(gòu)體數(shù)組
{
int num;??????????????? //成員表列
float price;
char name[21];
}products[32];??????????? //變量名表列
void page_title(char *menu_item)? // 定義一個(gè)頁眉函數(shù)
system("CLS");????? 調(diào)用DOS命令,清屏
printf(">>> 商品管理系統(tǒng) <<<nn- %s -nn",menu_item);
}
void return_confirm()? //按任意鍵返回
{
printf("n按任意鍵返回n");
getch();
system("CLS");?? //調(diào)用DOS命令,清屏
}
void product_new()? //錄入信息函數(shù)
{
int n;
page_title("錄入商品基本信息");
printf("編號(hào)-名字-價(jià)格n");
for(n=0;n<32;n++)
if(products[n].num==0) break;
printf("編號(hào):");
scanf("%d",&products[n].num);
printf("名字:");
scanf("%s",&products[n].name);
printf("價(jià)格:");
scanf("%f",&products[n].price);
return_confirm();
}
int search_num()?? //定義一個(gè)查找信息函數(shù)
{
int n,i;
printf("請(qǐng)輸入商品編號(hào):");
scanf("%d",&i);
system("CLS");??? 調(diào)用DOS命令,清屏
for(n=0;n<32;n++)
{
if(products[n].num==i&&products[n].num!=0)
{
printf("編號(hào):%dn",products[n].num);
printf("名字:%sn",products[n].name);
printf("價(jià)格:%fn",products[n].price);
return n;
}
}
printf("n輸入錯(cuò)誤或編號(hào)不存在.n");
return 0;
}
void product_del()??? //刪除信息函數(shù)
{
int n;
page_title("注銷商品基本信息");
if((n=search_num())!=-1) products[n].num=0;
printf("n!該商品已注銷.n");
return_confirm();??? //按任意鍵返回
}
void product_edit()? //編輯信息函數(shù)
{
int n;
page_title("編輯商品基本信息");
if((n=search_num())!=-1)
{
printf("n請(qǐng)重新輸入新信息:n編號(hào):");
scanf("%d",&products[n].num);
printf("名字:");
scanf("%s",&products[n].name);
printf("價(jià)格:");
scanf("%f",&products[n].price);
}
return_confirm();?? //按任意鍵返回
}
void browser()???? //瀏覽信息函數(shù)
{int n,i;
system("CLS");?? //調(diào)用DOS命令,清屏
printf("商品列表:n");
for(i=0;i<32;i++)
{
if((n=search_num())!=-1);break;
}
return_confirm();??? //按任意鍵返回
}
void main()??? //主函數(shù)
{
system("color 0A");? //設(shè)置界面以及字體顏色
menu: page_title("? 操作選單? ");
printf("請(qǐng)用數(shù)字鍵選擇操作nn");
printf("1 錄入商品基本信息n2 修改商品基本信息n");
printf("3 注銷商品基本信息n4 瀏覽商品");
printf("? 0 退出n");
switch(getch())
{
case '1' : product_new();break;
case '2' : product_edit();break;
case '3' : product_del();break;
case '4' : browser();break;
case '0' : exit(0);
}
goto menu;??? //跳轉(zhuǎn)到指定位置
}
3.2測(cè)試與調(diào)試
一般情況下,為解決一個(gè)問題所編寫的程序代碼較長(zhǎng),可能包括幾百條甚至成千上萬條語句。在檢查并排除所有語法錯(cuò)誤后,還會(huì)有不易發(fā)現(xiàn)的邏輯錯(cuò)誤,因此要對(duì)程序進(jìn)行認(rèn)真仔細(xì)的測(cè)試與調(diào)試。
測(cè)試是通過運(yùn)行程序發(fā)現(xiàn)錯(cuò)誤的過程,常見的錯(cuò)誤有數(shù)據(jù)溢出、數(shù)組越界、進(jìn)入死循環(huán)、語句順序顛倒、多加“;”或少加“{}”等等。調(diào)試則是確定測(cè)試中找到的錯(cuò)誤性質(zhì)并改正錯(cuò)誤的過程。測(cè)試與調(diào)試通常交替進(jìn)行,即測(cè)試——調(diào)試——再測(cè)試——再調(diào)試。
3.2.1主菜單運(yùn)行如下:
輸入0~4其中任何一個(gè)數(shù)字鍵選擇指定的操作,如按“1”,即可進(jìn)入到“錄入商品基本信息”界面。
輸入商品基本信息,編號(hào)、名字、價(jià)格。如下所示:
輸入完商品基本信息后可按任意鍵返回。其錄入商品信息存在成員表列。按“2”即可進(jìn)入“修改商品基本信息”界面。輸入要修改的商品編號(hào)即可修改商品。
重新輸入修改商品的信息
修改完成后可以按任意鍵返回。返回主界面,按“3”可以進(jìn)入“注銷商品信息”界面中。輸入你要注銷的商品編號(hào),如圖所示:
輸入編碼正確即該商品被注銷。
如果輸入編碼不正確,就會(huì)顯示如下:
回到主界面后,按“4”即可進(jìn)入到“瀏覽商品信息界面”中。顯示如下:
輸入你要瀏覽的商品編號(hào),就可以查看商品的編碼、名稱、價(jià)格。
瀏覽完成可以按任意鍵返回主界面。
按“0”即退出系統(tǒng)。
3.3系統(tǒng)維護(hù)
經(jīng)測(cè)試與調(diào)試確認(rèn)軟件無錯(cuò)時(shí),開發(fā)就告一段落,這時(shí)可以交付軟件供用戶使用,但是在軟件的使用過程中還會(huì)面臨更加漫長(zhǎng)的工作,即軟件維護(hù)。一般維護(hù)的工作有:更改使用中發(fā)現(xiàn)的錯(cuò)誤;為適應(yīng)實(shí)際環(huán)境而對(duì)程序進(jìn)行修改;為滿足新的需求而對(duì)程序作必要的改進(jìn)等等。
4.歸納與總結(jié)
4.1開發(fā)經(jīng)驗(yàn)
通過對(duì)本題目的開發(fā),體會(huì)到要掌握以下幾點(diǎn)內(nèi)容。
- 遵循自頂向下的設(shè)計(jì)方法,逐步求精得程序設(shè)計(jì)方法。
- 結(jié)構(gòu)化程序設(shè)計(jì)是在進(jìn)行以模塊功能和處理過程設(shè)計(jì)為主的詳細(xì)設(shè)計(jì)時(shí)應(yīng)遵循的方法和原則。
- 編寫主函數(shù),并進(jìn)行測(cè)試與調(diào)試。當(dāng)被調(diào)函數(shù)又需要調(diào)用其他函數(shù)時(shí),也要遵循逐步細(xì)化的原則。C語言提供豐富的庫函數(shù),編程序時(shí)要善于使用庫函數(shù),避免不必要的勞動(dòng)。
- 定義函數(shù)時(shí),應(yīng)選好參數(shù)的個(gè)數(shù)和數(shù)據(jù)類型。
需要源程序可以在我的資源里下載
需要完整的資料可在我的資源里下載,也可以加入我的紛傳圈子,里面有資源壓縮包的百度網(wǎng)盤下載地址及提取碼。
紛傳?點(diǎn)擊用微信打開即可,過程有點(diǎn)繁瑣請(qǐng)見諒。