![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)+數(shù)據(jù)匯總(超市)_第1頁(yè)](http://file4.renrendoc.com/view/69ffc3fd2523a1b8a03e0a691fdfc20b/69ffc3fd2523a1b8a03e0a691fdfc20b1.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)+數(shù)據(jù)匯總(超市)_第2頁(yè)](http://file4.renrendoc.com/view/69ffc3fd2523a1b8a03e0a691fdfc20b/69ffc3fd2523a1b8a03e0a691fdfc20b2.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)+數(shù)據(jù)匯總(超市)_第3頁(yè)](http://file4.renrendoc.com/view/69ffc3fd2523a1b8a03e0a691fdfc20b/69ffc3fd2523a1b8a03e0a691fdfc20b3.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)+數(shù)據(jù)匯總(超市)_第4頁(yè)](http://file4.renrendoc.com/view/69ffc3fd2523a1b8a03e0a691fdfc20b/69ffc3fd2523a1b8a03e0a691fdfc20b4.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)+數(shù)據(jù)匯總(超市)_第5頁(yè)](http://file4.renrendoc.com/view/69ffc3fd2523a1b8a03e0a691fdfc20b/69ffc3fd2523a1b8a03e0a691fdfc20b5.gif)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 部編初中歷史八下第1課中華人民共和國(guó)成立教案
- 2025年全球及中國(guó)大型不銹鋼鑄件行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球化妝品級(jí)枯草菌脂肽鈉行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球光纖導(dǎo)管靜脈激光治療行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)銅纜高速連接器行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025國(guó)際(非獨(dú)占)商標(biāo)使用許可合同
- 2025農(nóng)業(yè)種植生產(chǎn)產(chǎn)銷合同書
- 餐飲業(yè)合同年
- 2025室內(nèi)裝修設(shè)計(jì)合同范本
- 房屋租賃續(xù)簽合同模板
- 2025年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招高職單招英語(yǔ)2016-2024歷年頻考點(diǎn)試題含答案解析
- 醫(yī)保政策與健康管理培訓(xùn)計(jì)劃
- 策略與博弈杜塔中文版
- 無(wú)人化農(nóng)場(chǎng)項(xiàng)目可行性研究報(bào)告
- 2024屆上海市金山區(qū)高三下學(xué)期二模英語(yǔ)試題(原卷版)
- 學(xué)生春節(jié)安全教育
- 2024-2025年校長(zhǎng)在教研組長(zhǎng)和備課組長(zhǎng)會(huì)議上講話
- 2025屆江蘇省常州市高級(jí)中學(xué)高三第二次模擬考試語(yǔ)文試卷含解析
- 高三日語(yǔ)一輪復(fù)習(xí)助詞「で」的用法課件
- 2024-2030年中國(guó)銣銫及其化合物行業(yè)深度調(diào)研及投資戰(zhàn)略分析報(bào)告
- 散貨物流行業(yè)市場(chǎng)調(diào)研分析報(bào)告
評(píng)論
0/150
提交評(píng)論