數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)+數(shù)據(jù)匯總(超市)_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)+數(shù)據(jù)匯總(超市)_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)+數(shù)據(jù)匯總(超市)_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)+數(shù)據(jù)匯總(超市)_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)+數(shù)據(jù)匯總(超市)_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論