版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1/1數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)+數(shù)據(jù)匯總(超市)
信電工程學(xué)院課程設(shè)計(jì)報(bào)告
數(shù)據(jù)匯總系統(tǒng)
課程:高級(jí)語(yǔ)言程序設(shè)計(jì)
班級(jí):12軟件1
學(xué)號(hào):
姓名:潘煥燚
指導(dǎo)老師:丁賓
2023年7月1日
名目
1程序目標(biāo)及功能1
1.1課題背景1
1.2系統(tǒng)功能3
1.3設(shè)計(jì)要求32程序功能模塊組成及流程圖4
2.2系統(tǒng)功能模塊4
2.3各模塊流程圖53程序主要數(shù)據(jù)結(jié)構(gòu)及函數(shù)列表8
3.1程序中使用的數(shù)據(jù)結(jié)構(gòu)8
3.2函數(shù)列表104程序代碼及運(yùn)行結(jié)果145總結(jié)與體會(huì)32
題目:數(shù)據(jù)匯總
題目?jī)?nèi)容:
在數(shù)據(jù)處理中常常需要對(duì)大量數(shù)據(jù)進(jìn)行匯總,將相同關(guān)鍵字記錄的某些數(shù)據(jù)項(xiàng)的值疊加起來(lái),生成一個(gè)分類匯總表。
假設(shè)某超級(jí)市場(chǎng)銷售有m種商品(假設(shè)商品的編號(hào)為1,2,3,┅┅,m),有n臺(tái)前臺(tái)收款機(jī)(假設(shè)收款機(jī)的編號(hào)為1,2,3,┅┅,n)進(jìn)行收款,以記錄的形式供應(yīng)給計(jì)算機(jī),每個(gè)記錄表示某臺(tái)收款機(jī)的一種商品一次交易的數(shù)量和銷售額。記錄由4個(gè)域組成:收款機(jī)編號(hào)、商品編號(hào)、銷售數(shù)量、銷售金額。構(gòu)造一個(gè)結(jié)構(gòu)體類型,每次銷售數(shù)據(jù)以一個(gè)結(jié)構(gòu)體變量保存在一個(gè)數(shù)據(jù)文件中。
本人完成的工作:
(1)編寫實(shí)現(xiàn)將數(shù)據(jù)記錄插入到數(shù)據(jù)文件的最終的函數(shù);
⑵編寫以收款機(jī)為單位的數(shù)據(jù)分類處理函數(shù)。構(gòu)造n個(gè)單鏈表,每個(gè)鏈表保存一臺(tái)收款機(jī)的銷售記錄,這n個(gè)單鏈表的頭指針存放在一個(gè)指針數(shù)組中,通過(guò)數(shù)組的下標(biāo)就可以知道是哪臺(tái)收款機(jī)。讀取數(shù)據(jù)文件的記錄,將全部的銷售記錄(數(shù)據(jù)文件中的全部記錄)分解插入到n個(gè)單鏈表;
(3)編寫以商品為單位的數(shù)據(jù)分類處理函數(shù)。構(gòu)造m個(gè)單鏈表,每個(gè)鏈表保存一種商品的銷售記錄,這m個(gè)單鏈表的頭指針存放在一個(gè)指針數(shù)組中,通過(guò)數(shù)組的下標(biāo)就可以知道是哪種商品。讀取數(shù)據(jù)文件的記錄,將全部的銷售記錄(數(shù)據(jù)文件中的全部記錄)分解插入到m個(gè)單鏈表;
(4)統(tǒng)計(jì)每臺(tái)收款機(jī)的銷售總額;
(5)以收款機(jī)為單位,將全部收款機(jī)按銷售總額的遞增挨次構(gòu)造一個(gè)單鏈表并輸出。
(6)以商品為單位,統(tǒng)計(jì)每種商品的銷售總額。
(7)以商品為單位,將全部銷售的商品按銷售總額的遞增挨次構(gòu)造一個(gè)單鏈表并輸出。
-3-
(8)設(shè)計(jì)一個(gè)菜單,具有插入數(shù)據(jù)記錄、按收款機(jī)統(tǒng)計(jì)銷售總額、按商品統(tǒng)計(jì)銷售總額、退出系統(tǒng)等最基本的功能。
所采納的數(shù)據(jù)結(jié)構(gòu):?jiǎn)捂湵?/p>
銷售商品數(shù)據(jù)記錄結(jié)構(gòu)定義:
typedefstructGoods
{
intregNum;//收款機(jī)編號(hào)
intgoodsNum;//商品編號(hào)
intsalesVol;//銷售數(shù)量
doublesalesAmount;//銷售單價(jià)
}Goods;
typedefstructGoodsElemType;//用于鏈表里的數(shù)據(jù)類型
單鏈表結(jié)點(diǎn)定義:
typedefstructNode
{
ElemTypedata;//鏈表所存的數(shù)據(jù)
structNode*next;//指向下一個(gè)結(jié)點(diǎn)的指針
}*LNode,*LinkList;
所設(shè)計(jì)的函數(shù):
[1].將數(shù)據(jù)記錄插入到文件data.dat最終的函數(shù)
intAddrecord(Goods*goods)
算法思想:首先推斷參數(shù)是否非法,非法則返回FAIL,否則以以二進(jìn)制的append方式打開(kāi)文件data.dat;文件指針為空則打開(kāi)失敗返回FAIL,否則將數(shù)據(jù)記錄寫入文件,然后關(guān)閉文件,返回SUCCESS。
流程圖:
[2].以收款機(jī)為單位的數(shù)據(jù)分類處理函數(shù)
LinkList*SortByReg(intn)
算法思想:推斷打開(kāi)文件是否勝利,失敗則打印“打開(kāi)文件失敗”并返回FAIL,否則安排鏈表指針數(shù)組;然后推斷內(nèi)存是否充分,不足則打印“內(nèi)存不足”并返回FAIL,否則初始化n個(gè)收款機(jī)鏈表,并讀相應(yīng)記錄,存到對(duì)應(yīng)的收款機(jī)鏈表中的末尾結(jié)點(diǎn),最終關(guān)閉文件,返回鏈表數(shù)組。
流程圖:
-5-
[3]統(tǒng)計(jì)每臺(tái)收款機(jī)的銷售總額
double*SumByReg(intn)
算法思想:申請(qǐng)一個(gè)數(shù)組存儲(chǔ)各臺(tái)收款機(jī)的銷售總額,申請(qǐng)不勝利則打印“內(nèi)存不足”并返回FAIL,否則調(diào)用SortByReg(n)函數(shù)得到分類好的收款機(jī)鏈表指針數(shù)組,推斷指針數(shù)組是否為空,是則釋放之前時(shí)申請(qǐng)的內(nèi)存空間并返回NULL,否則初始化總額數(shù)組,并進(jìn)行累計(jì)分析,之后釋放收款機(jī)的鏈表內(nèi)存,釋放鏈表指針的內(nèi)存,釋放總額數(shù)組,返回總額amount
流程圖:
-7-
[4].以商品為單位的數(shù)據(jù)分類處理函數(shù)
LinkList*SortByGoods(intm)
算法思想:推斷打開(kāi)文件是否勝利,失敗則打印“打開(kāi)文件失敗”并返回FAIL,否則安排鏈表指針數(shù)組;然后推斷內(nèi)存是否充分,不足則打印“內(nèi)存不足”并返回FAIL,否則初始化m個(gè)商品鏈表,并讀相應(yīng)記錄,存到對(duì)應(yīng)的商品鏈表中的末尾結(jié)點(diǎn),最終關(guān)閉文件,返回鏈表數(shù)組。
流程圖:
[5].以商品為單位,統(tǒng)計(jì)每種商品的銷售總額
double*SumByGoods(intm)
算法思想:申請(qǐng)一個(gè)數(shù)組存儲(chǔ)各種商品的銷售總額,申請(qǐng)不勝利則打印“內(nèi)存不足”并返回FAIL,否則調(diào)用SortByGoods(m)函數(shù)得到分類好的各種商品的鏈表指針數(shù)組,推斷指針數(shù)組是否為空,是則釋放之前時(shí)申請(qǐng)的內(nèi)存空間并返回NULL,否則初始化總額數(shù)組,并進(jìn)行累計(jì)分析,之后釋放收款機(jī)的鏈表內(nèi)存,釋放鏈表指針的內(nèi)存,釋放總額數(shù)組,返回總額amount
-9-
流程圖:
[6].設(shè)計(jì)一個(gè)菜單,具有插入數(shù)據(jù)記錄、按收款機(jī)統(tǒng)計(jì)銷售總額voidRunMenu(void)
算法思想:清除以前的無(wú)關(guān)輸入,打印菜單,依據(jù)選擇的菜單項(xiàng)進(jìn)行相應(yīng)的操作。
-11-
[7].用于輸入一條新的記錄
[8].GOODS的輸出函數(shù)
-13-
程序運(yùn)行結(jié)果:
1:主程序運(yùn)行,菜單打印
2插入數(shù)據(jù)記錄
3.按收款機(jī)統(tǒng)計(jì)銷售總額
4.按商品統(tǒng)計(jì)銷售總額
-15-
5.按商品銷售記錄排序
6按收款機(jī)收款紀(jì)錄排序
7退出系統(tǒng)
源程序:
#include
#include
#include
#defineSUCCESS1//操作勝利
#defineFAIL0//操作失敗
#defineallRegisters15
#defineallGoods30
//銷售的商品數(shù)據(jù)記錄
typedefstructGoods
{
intregNum;//收款機(jī)編號(hào)
intgoodsNum;//商品編號(hào)
intsalesVol;//銷售數(shù)量
doublesalesAmount;//銷售單價(jià)
}Goods;
typedefstructGoodsElemType;//用于鏈表里的數(shù)據(jù)類型
typedefstructNode
{
ElemTypedata;//鏈表所存的數(shù)據(jù)
structNode*next;//指向下一個(gè)結(jié)點(diǎn)的指針
}*LNode,*LinkList;
//構(gòu)造一個(gè)空的線性表
LinkListInitList(void)
{
LNodeHead;
Head=(LNode)malloc(sizeof(structNode));//為鏈表的頭結(jié)點(diǎn)安排空間if(!Head)
{
printf("Outofspace!");
returnNULL;
}
Head->next=NULL;
-17-
returnHead;//返回頭結(jié)點(diǎn),第一個(gè)結(jié)點(diǎn)head是不存任何數(shù)據(jù)的
}
//初始條件:線性表L已存在。操作結(jié)果:返回線性表L的最終一個(gè)結(jié)點(diǎn)(尾結(jié)點(diǎn))。LNodeIsLast(LinkListL)
{
LNodeP=L->next;
if(P)
{
while(P->next!=NULL)//遍歷線性表L
P=P->next;
returnP;//返回線性表L的最終一個(gè)結(jié)點(diǎn)
}
else
returnL;//鏈表只有頭結(jié)點(diǎn),而它不存數(shù)據(jù)的
}
//初始條件:線性表L已存在。操作結(jié)果:返回線性表L結(jié)點(diǎn)的個(gè)數(shù)。
intListLength(LinkListL)
{
LNodeP=L->next;
intnum=0;
while(P)//累積線性表L結(jié)點(diǎn)的個(gè)數(shù)
{
num++;
P=P->next;
}
returnnum;//返回線性表L結(jié)點(diǎn)的個(gè)數(shù)
}
//構(gòu)造一個(gè)數(shù)據(jù)域?yàn)閄的新結(jié)點(diǎn)
LNodeNewLNode(ElemTypeX)
{
LNodeS;
S=(LNode)malloc(sizeof(structNode));//為新結(jié)點(diǎn)安排空間if(!S)
{
printf("Outofspace!");
returnNULL;
}
S->data=X;
S->next=NULL;
returnS;//返回新結(jié)點(diǎn)
}
//初始條件:線性表L已存在。操作結(jié)果:銷毀線性表L。
voidDestroyList(LinkList*L)
{
LNodeHead,P;
if(*L)//若線性表L已存在
{
Head=*L;
P=Head->next;
while(P!=NULL)//把鏈表中除頭結(jié)點(diǎn)外的全部結(jié)點(diǎn)釋放
{
free(Head);
Head=P;
P=Head->next;
}
free(Head);//釋放頭結(jié)點(diǎn)
}
*L=NULL;
}
//初始條件:線性表L中結(jié)點(diǎn)P已找到,新結(jié)點(diǎn)S已構(gòu)造。。操作結(jié)果:在該結(jié)點(diǎn)之后插入新結(jié)點(diǎn)X。
voidListInsert(LNodePre,LNodeS)
{
S->next=Pre->next;
Pre->next=S;
}
//用于輸入一條新的記錄
//缺點(diǎn)就是沒(méi)對(duì)輸入的數(shù)據(jù)各種檢查
//一旦輸入字母就不行了
Goods*Newrecord(Goods*goods)
{
printf("\n"
"請(qǐng)輸入商品信息:\n");
-19-
//收款臺(tái)號(hào),保證錄入正確的數(shù)據(jù)
while(1)
{
fflush(stdin);
printf("收款機(jī)編號(hào)(1--%d):#",allRegisters);
scanf("%d",
if(goods->regNum>0
}
//商品號(hào)
while(1)
{
fflush(stdin);
printf("商品編號(hào)(1--%d):#",allGoods);
scanf("%d",
if(goods->goodsNum>0
}
//銷售量
printf("銷售數(shù)量:n=");
scanf("%d",
//銷量單價(jià)
printf("商品銷售單價(jià):$");
scanf("%lf",
//清除可能輸入緩沖區(qū)
fflush(stdin);
returngoods;
}
//專為GOODS而寫的輸出函數(shù)
voidListPrint(LinkListL,doubleamount)
{
LNodenode;
inti;
intcount=ListLength(L);
if(L==NULL)
return;
//第一個(gè)結(jié)點(diǎn)不存記錄,所以從其次個(gè)開(kāi)頭
node=L->next;
if(node==NULL)
return;
//打印出表頭
printf("留意:每打印5個(gè)記錄,將會(huì)暫停,按enter連續(xù)!!\n");
printf("收款機(jī)No(R).|商品No(G).|單價(jià)($)|銷售數(shù)量(n)\n");
//將全部記錄按格式打印出來(lái)
i=0;
while(idata.regNum,node->data.goodsNum,node->data.salesAmount,node->data.salesVol);
if((i+1)%5==0)
getch;
i++;
node=node->next;
}
//這個(gè)就是打出總額了,Total則是記錄的條數(shù)
printf("銷售總額=%lf,記錄條數(shù)=%d\n",amount,i);
}
//[1].將數(shù)據(jù)記錄插入到文件data.dat最終的函數(shù)
intAddrecord(Goods*goods)
{
FILE*ofp;
//非法參數(shù)
if(goods==NULL)
returnFAIL;
//以二進(jìn)制的append方式打開(kāi)文件data.dat
if((ofp=fopen("data.dat","ab"))==NULL)
{
printf("Openfail!\n");
returnFAIL;
}
//把記錄寫入文件中
fwrite(goods,sizeof(structGoods),1,ofp);
//關(guān)閉文件
fclose(ofp);
returnSUCCESS;
-21-
//[2].編寫以收款機(jī)為單位的數(shù)據(jù)分類處理函數(shù)
LinkList*SortByReg(intn)
{
inti,count;
FILE*ifp;
Goodstemp;
LinkList*regArr;//收款機(jī)的鏈表數(shù)組
if((ifp=fopen("data.dat","rb"))==NULL)
{
printf("OpenFail.\n");
returnFAIL;
}
//安排鏈表指針數(shù)組
regArr=(LinkList*)malloc(n*sizeof(LinkList));
if(regArr==NULL)
{
printf("Notenoughmemory\n");
returnFAIL;
}
//n個(gè)收款機(jī)鏈表初始化
for(i=0;inext;
//鏈表是空的
if((recs=ListLength(regArr[i]))==0)
continue;
//遍歷一個(gè)收款機(jī)鏈表里有的全部記錄
while(recs-->0)
{
//將該臺(tái)收款機(jī)銷售的商品記錄的總額進(jìn)行累加
amount[i]+=node->data.salesAmount*node->data.salesVol;
node=node->next;
}
}
-23-
//釋放收款機(jī)的鏈表內(nèi)存
for(i=0;inext;
//鏈表是空的
if((recs=ListLength(regArr[i]))==0)
continue;
//遍歷一個(gè)收款機(jī)鏈表里有的全部記錄
while(recs-->0)
{
//將該臺(tái)收款機(jī)銷售的商品記錄的總額進(jìn)行累加
amount[i]+=node->data.salesAmount*node->data.salesVol;
node=node->next;
}
}
for(k=0;kamount[l])
temp=amount[k];
amount[k]=amount[l];
amount[l]=temp;
}
printf("排序后的數(shù)組為\n");
//釋放收款機(jī)的鏈表內(nèi)存
for(i=0;inext;
//鏈表是空的
if((recs=ListLength(goodsArr[i]))==0)
continue;
//遍歷一個(gè)商品鏈表里有的全部記錄
while(recs-->0)
{
//將某種商品的銷售記錄的總額進(jìn)行累加
amount[i]+=node->data.salesAmount*node->data.salesVol;
node=node->next;
}
}
//釋放商品的鏈表內(nèi)存
for(i=0;inext;
//鏈表是空的
if((recs=ListLength(goodsArr[i]))==0)
continue;
//遍歷一個(gè)商品鏈表里有的全部記錄
while(recs-->0)
{
//將某種商品的銷售記錄的總額進(jìn)行累加
amount[i]+=node->data.salesAmount*node->data.salesVol;
node=node->next;
}
}
for(k=0;kamount[l])
temp=amount[k];
amount[k]=amount[l];
amount[l]=temp;
}
printf("排序后的數(shù)組為\n");
//釋放商品的鏈表內(nèi)存
for(i=0;i<m;i++)
{
//鏈表存在的話
if(goodsArr[i]==NULL)
continue;
//打印出后再釋放內(nèi)存
ListPrint(goodsArr[i],amount[i]);
DestroyList(
}
//釋放鏈表指針頭的內(nèi)存
free(goodsArr);
//釋放總額數(shù)組
free(amount);
returnamount;
}
//[6].設(shè)計(jì)一個(gè)菜單,具有插入數(shù)據(jù)記錄、按收款機(jī)統(tǒng)計(jì)銷售總額
voidRunMenu(void)
-29-
{
intselete;
Goodsgoods;
double*amount=NULL;
while(1)
{
//清除以前的一些無(wú)關(guān)輸入,避開(kāi)被影響
fflush(stdin);
//打出菜單
printf("\n歡迎使用超市數(shù)據(jù)匯總基本操作程序
\n");
printf("\n學(xué)號(hào):16姓名:潘煥燚班級(jí):12軟件1\n");
printf("系統(tǒng)主菜單
\n");
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025教師個(gè)人工作計(jì)劃總結(jié)
- 9月份營(yíng)銷工作計(jì)劃范文
- 關(guān)于每日工作計(jì)劃模板錦集
- 2025春季學(xué)期幼兒園食堂工作計(jì)劃
- 食堂后勤管理個(gè)人工作計(jì)劃
- 4科技綜治和平安建設(shè)工作計(jì)劃
- 4寧夏:某年教育民生計(jì)劃發(fā)布
- 《大孔樹(shù)脂分離技術(shù)》課件
- 《多元函數(shù)》課件
- 《型材料的研制》課件
- 2024預(yù)防流感課件完整版
- 科學(xué)認(rèn)識(shí)天氣智慧樹(shù)知到期末考試答案2024年
- 2023-2024學(xué)年貴州省貴陽(yáng)市八年級(jí)(上)期末數(shù)學(xué)試卷
- 公共體育(三)學(xué)習(xí)通課后章節(jié)答案期末考試題庫(kù)2023年
- 數(shù)學(xué)新課標(biāo)研究論文:小學(xué)數(shù)學(xué)“教學(xué)評(píng)一體化”的解讀與探究
- 成人哮喘生命質(zhì)量評(píng)分表
- 數(shù)字油畫-社團(tuán)活動(dòng)記錄課件
- 燃?xì)饧t外線輻射采暖技術(shù)交底
- 液壓系統(tǒng)課件(完整)課件
- 驗(yàn)收合格證明(共9頁(yè))
- 一級(jí)公路畢業(yè)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論