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