數據結構課程設計數據匯總(超市)_第1頁
數據結構課程設計數據匯總(超市)_第2頁
數據結構課程設計數據匯總(超市)_第3頁
已閱讀5頁,還剩30頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、得分:信電工程學院課程設計報告數據匯總系統課程:咼級語言程序設計班級:12軟件1學號:20120510116姓名:潘煥燚指導教師:丁賓2013年7月1日目錄1程序目標及功能 11.1課題背景 11.2 系統功能 31.3 設計要求 32 程序功能模塊組成及流程圖 42.2系統功能模塊 42.3各模塊流程圖 53 程序主要數據結構及函數列表 83.1 程序中使用的數據結構 83.2 函數列表 104 程序代碼及運行結果 145 總結與體會 32題目:數據匯總題目內容:在數據處理中經常需要對大量數據進行匯總,將相同關鍵字記錄的某些 數據項的值疊加起來,生成一個分類匯總表。假設某超級市場銷售有 m種

2、商品(假設商品的編號為1, 2, 3, , m),有n臺前臺收款機(假設收款機的編號為 1, 2, 3, n)進行收款,以記 錄的形式提供給計算機, 每個記錄表示某臺收款機的一種商品一次交易的數量和 銷售額。記錄由 4 個域組成:收款機編號、商品編號、銷售數量、銷售金額。構 造一個結構體類型,每次銷售數據以一個結構體變量保存在一個數據文件中。本人完成的工作:(1) 編寫實現將數據記錄插入到數據文件的最后的函數; 編寫以收款機為單位的數據分類處理函數。 構造 n 個單鏈表, 每個鏈表 保存一臺收款機的銷售記錄,這n個單鏈表的頭指針存放在一個指針數組中, 通 過數組的下標就可以知道是哪臺收款機。

3、讀取數據文件的記錄, 將所有的銷售記 錄 ( 數據文件中的全部記錄 ) 分解插入到 n 個單鏈表;(3) 編寫以商品為單位的數據分類處理函數。構造 m個單鏈表,每個鏈表 保存一種商品的銷售記錄,這 m 個單鏈表的頭指針存放在一個指針數組中,通 過數組的下標就可以知道是哪種商品。 讀取數據文件的記錄, 將所有的銷售記錄 ( 數據文件中的全部記錄 ) 分解插入到 m 個單鏈表;(4) 統計每臺收款機的銷售總額;(5) 以收款機為單位, 將所有收款機按銷售總額的遞增順序構造一個單鏈表 并輸出。(6) 以商品為單位,統計每種商品的銷售總額。( 7)以商品為單位, 將所有銷售的商品按銷售總額的遞增順序構

4、造一個單鏈 表并輸出(8) 設計一個菜單,具有插入數據記錄、按收款機統計銷售總額、按商 品統計銷售總額、退出系統等最基本的功能。所采用的數據結構:單鏈表銷售商品數據記錄結構定義:typedef struct Goodsint regNum;/ 收款機編號int goodsNum;/ 商品編號int salesVol;/ 銷售數量double salesAmount;/ 銷售單價Goods;typedef struct Goods ElemType; / 用于鏈表里的數據類型 單鏈表結點定義:typedef struct NodeElemType data;/ 鏈表所存的數據struct Nod

5、e *next;/ 指向下一個結點的指針 *LNode, *LinkList;所設計的函數:1. 將數據記錄插入到文件 data.dat 最后的函數int Addrecord(Goods *goods)算法思想:首先判斷參數是否非法,非法則返回FAIL,否則以以二進制的append 方式打開文件data.dat ;文件指針為空則打開失敗返回 FAIL,否則將數據記錄 寫入文件,然后關閉文件,返回 SUCCESS流程圖:2.以收款機為單位的數據分類處理函數LinkList* SortByReg(int n)算法思想:判斷打開文件是否成功,失敗則打印“打開文件失敗”并返回 FAIL, 否則分配鏈表

6、指針數組;然后判斷內存是否充足,不足則打印“內存不足”并返 回FAIL,否則初始化n個收款機鏈表,并 讀相應記錄,存到對應的收款機鏈表中的末 尾結點,最后關閉文件,返回鏈表數組。流程圖: 統計每臺收款機的銷售總額double* SumByReg(int n)算法思想:申請一個數組存儲各臺收款機的銷售總額,申請不成功則打印“內存不足” 并返回FAIL,否則調用SortByReg(n)函數得到分類好的收款機鏈表指針數組,判斷指針數 組是否為空,是則釋放之前時申請的內存空間并返回NULL,否則初始化總額數組,并進行累計分析,之后釋放收款機的鏈表內存,釋放鏈表指針的內存,釋放總額數組,返回總額amou

7、nt流程圖:開始結束4. 以商品為單位的數據分類處理函數LinkList* SortByGoods(int m)算法思想: 判斷打開文件是否成功,失敗則打印“打開文件失敗”并返回 FAIL, 否則分配鏈表指針數組;然后判斷內存是否充足,不足則打印“內存不足”并返 回FAIL,否則初始化m個商品鏈表,并 讀相應記錄,存到對應的商品鏈表中的末尾結 點,最后關閉文件,返回鏈表數組。流程圖:5.以商品為單位,統計每種商品的銷售總額double* SumByGoods(i nt m)算法思想:申請一個數組存儲各種商品的銷售總額,申請不成功則打印“內存不足”并 返回FAIL,否則調用SortByGoods

8、(m)函數得到分類好的各種商品的鏈表指針數組,判斷指 針數組是否為空,是則釋放之前時申請的內存空間并返回NULL ,否則初始化總額數組,并進行累計分析,之后釋放收款機的鏈表內存,釋放鏈表指針的內存,釋放總額數組,返回總額 amount流程圖:ri開始初始化參數i=0申請一個數組 儲存各種商品的 銷 售總額返回“ FAIL初始化總額結束.設計一個菜單,具有插入數據記錄、按收款機統計銷售總額void Ru nMen u(void)算法思想: 清除以前的無關輸入,打印菜單,根據選擇的菜單項進行相應的操作。.用于輸入一條新的記錄8. GOOD的輸出函數程序運行結果:1:主程序運行,菜單打印2插入數據記

9、錄U叵 23-歡迎便用超市數據匯基本摸作程序一“學號仆姓笹賀 班級 2軟件系統主萊單請輸入你的選擇f: 13.按收款機統計銷售總額歡迎使用超市數據匯總慕本操作程序學呂;苴it名;潘博緘 班締I堆軟禪丄;轉銷亀展5勰款機收款記錄系統千菓堂2飛翩砌評擬灌翱序瓏鯛請換人俚的選擇! 注音I 包土丁匚ni-Zzim 收較機NoRX :商品NoCCX :B*1G*1舗售000000,記靈條數=1汪意.唇打印5個記錄,秦汪訓- :2 打印丘個記錄,特會暫哼,nceft1 :銷售數量$1.00n=l4.按商品統計銷售總額E序ill觀評爭JJA|B |將會暫停9橈繼績H:商品NZS.;單價 ;梢售數量5G1$1

10、.03n=lU1$2.0n=2G3$3.00n=3 =14-000000,記錄gJ-3 宀爵7打印5個記錄,將會皆停,榜社肚竝續M 收款機Nu.:商品No(G).:單彳介 :精售數量R*2G2$2.39n=2銷售總額-4,000009.記錄條數現學號* 姓名.潘煥懺 班級.C軟件丄, 系統主榮單潯筲總款記親請筮入你的選扌郛1 _&? 汪屆.: 收慧機R1R*18Ffc5.按商品銷售記錄排序7號=1丘妊自 番煥滋班級| 121,11售記 錄銷款 記就 隹昴機 鶴匚朗觸 入商收 ffif系績王菜單、2 gm機統計勢告忌額桃出K:爲停.收斂機Ng I商品卜 !銷售數量$1.00$2.00!商品Ho(

11、G. ! O !銷售數號 G*3$?.陰9肖售左靱=;肌I血圖”記錄殺數=i6按收款機收款紀錄排序n、n-1訂戸2ri =2學號必 姓名:清煥犠 班級:空軟件L 事人銷售1爆系統主菜單x m |=I聶軟勰魏橐排序魂出I汪意每打印5個記錄,將會暫停,槪M繼續ft收款機No. !育品NoG), !單彳介 !犒售數重G*1$1.03n-1G*1$2.09G*3$3.09Cl-6; 5R*1R1R*i趙噺冷記加 收歉機No. I商P*2銷售總額討五 Na(G. !C*2=4.000000,記錄條數=1n=3停嚼常釋備數量&2.Hn=27退出系統源程序:#include #include #includ

12、e #define SUCCESS 1 / 操作成功 #define FAIL 0 / 操作失敗 #define allRegisters 15#define allGoods 30/ 收款機編號/ 商品編號/ 銷售數量 銷售單價/ 銷售的商品數據記錄 typedef struct Goods int regNum;int goodsNum;int salesVol;double salesAmount; / Goods;typedef struct GoodsElemType; / 用于鏈表里的數據類型typedef struct Node/ 鏈表所存的數據/ 指向下一個結點的指針ElemT

13、ype data; struct Node *next; *LNode, *LinkList;/ 構造一個空的線性表 LinkList InitList(void)為鏈表的頭結點分配空間LNode Head;Head = (LNode)malloc(sizeof(struct Node); / if(!Head)printf(Out of space!);return NULL;Head-next = NULL;return Head;/ 返回頭結點,第一個結點 head 是不存任何數據的/ 初始條件:線性表 L 已存在。 操作結果:返回線性表 L 的最后一個結點(尾結點) LNode IsL

14、ast(LinkList L)LNode P = L-next;if(P) while(P-next != NULL) / 遍歷線性表 LP = P-next;return P; /返回線性表 L 的最后一個結點 elsereturn L;/ 鏈表只有頭結點,而它不存數據的/ 初始條件:線性表 L 已存在。 操作結果:返回線性表 L 結點的個數。 int ListLength(LinkList L)LNode P = L-next;int num = 0;while(P) /累積線性表 L 結點的個數 num+; P = P-next;return num; /返回線性表 L 結點的個數/ 構

15、造一個數據域為 X 的新結點LNode NewLNode(ElemType X)LNode S;S = (LNode)malloc(sizeof(struct Node);/ 為新結點分配空間 if(!S)printf(Out of space!); return NULL;S-data = X;S-next = NULL;return S;/ 返回新結點/ 初始條件:線性表 L 已存在。 操作結果:銷毀線性表L。void DestroyList(LinkList *L)LNode Head, P;if(*L)/ 若線性表 L 已存在Head = *L;P = Head-next;while(

16、P != NULL) / 把鏈表中除頭結點外的所有結點釋放 free(Head); Head = P; P = Head-next;free(Head); / 釋放頭結點*L = NULL;/初始條件:線性表 L中結點P已找到,新結點S已構造。操作結果:在該結點之后 插入新結點 X。void ListInsert(LNode Pre, LNode S)S-next = Pre-next; Pre-next = S;/ 用于輸入一條新的記錄/ 缺點就是沒對輸入的數據各種檢查/ 一旦輸入字母就不行了Goods *Newrecord(Goods *goods)printf(n 請輸入商品信息 :n)

17、;/ 收款臺號 , 保證錄入正確的數據while (1) fflush(stdin); printf( 收款機編號 (1-%d): #, allRegisters); scanf(%d,&goods-regNum);if (goods-regNum 0 & goods-regNum goodsNum);if (goods-goodsNum 0 & goods-goodsNum salesVol);/ 銷量單價printf( 商品銷售單價 : $); scanf(%lf,&goods-salesAmount);/ 清除可能輸入緩沖區 fflush(stdin);return goods; /專為

18、GOOD而寫的輸出函數void ListPrint(LinkList L, double amount) LNode node;int i;int count = ListLength(L);if (L = NULL)return;/ 第一個結點不存記錄,所以從第二個開始node = L-next;if (node = NULL)return;繼續 !n); 銷售數量 (n) n);node-data.salesAmount,/ 打印出表頭printf( 注意:每打印 5 個記錄,將會暫停,按 enterprintf( 收款機 No(R). | 商品 No(G). | 單價 ($) | / 將

19、全部記錄按格式打印出來i = 0;while (i data.regNum, node-data.goodsNum, node-data.salesVol);if (i+1)%5 = 0)getch();i+;node = node-next;/ 這個就是打出總額了, Total 則是記錄的條數printf( 銷售總額 =%lf, 記錄條數 =%dn, amount, i);/ 1. 將數據記錄插入到文件 data.dat 最后的函數 int Addrecord(Goods *goods)FILE *ofp;/ 非法參數if (goods = NULL)return FAIL;/ 以二進制的

20、append 方式打開文件 data.datif (ofp=fopen(data.dat, ab) = NULL)printf(Open fail!n);return FAIL;/ 把記錄寫入文件中fwrite(goods, sizeof(struct Goods), 1, ofp);/ 關閉文件fclose(ofp);return SUCCESS;/ 2. 編寫以收款機為單位的數據分類處理函數LinkList* SortByReg(int n)int i,count;FILE *ifp;Goods temp;LinkList *regArr; / 收款機的鏈表數組if (ifp=fopen(

21、data.dat, rb) = NULL) printf(Open Fail.n); return FAIL;/ 分配鏈表指針數組regArr = (LinkList*)malloc(n * sizeof(LinkList);if (regArr = NULL) printf(Not enough memoryn); return FAIL;/ n 個收款機鏈表初始化for (i=0; in; i+) regArri = NULL;/ 開始根據收款機的編號將所讀的記錄進行分類/ 注意數組下標是從 0開始,而收款機是從 1 開始數的 while (1)/ 讀相應的記錄 , 正確讀取時 count

22、 為所讀的字節數 count = fread(&temp, sizeof(struct Goods), 1, ifp);/ 出錯或是到文件尾了if (count != 1)break;/ 第一次要初始化鏈表if (regArrtemp.regNum-1 = NULL) regArrtemp.regNum-1 = InitList();/ 存到對應的收款機鏈表中的末尾結點 ListInsert(IsLast(regArrtemp.regNum-1), NewLNode(temp);/ 關閉文件 fclose(ifp);return regArr;/ 3 統計每臺收款機的銷售總額 double*

23、SumByReg(int n)int i, recs; double *amount; LNode node;LinkList *regArr;/ 申請一個數組存儲各臺收款機的銷售總額if (amount=(double*)malloc(n*sizeof(double) = NULL) printf(Not enough memory!n); return FAIL;/ 得到了分類好的收款機鏈表指針數組 regArr = SortByReg(n);if (regArr = NULL) free(amount); / 釋放之前申請的內存 return NULL;/ 初始化總額數組 for (i=

24、0; in; i+) amounti = 0;/ 進行分析累加 for (i=0; inext;/ 鏈表是空的if (recs = ListLength(regArri) = 0) continue;/ 遍歷一個收款機鏈表里有的所有記錄 while (recs- 0)/ 將該臺收款機銷售的商品記錄的總額進行累加amounti += node-data.salesAmount * node-data.salesVol; node = node-next;/ 釋放收款機的鏈表內存 for (i=0; in; i+) if (regArri = NULL) continue;/ 打印出后再釋放內存

25、ListPrint(regArri, amounti); DestroyList(®Arri);/ 釋放鏈表指針頭的內存 free(regArr);/ 釋放總額數組 free(amount); return amount;/4 排序收款機銷售總額 double* PaixuByReg(int n) int i, recs,k,l,temp; double *amount;LNode node; LinkList *regArr;/ 申請一個數組存儲各臺收款機的銷售總額if (amount=(double*)malloc(n*sizeof(double) = NULL) printf(No

26、t enough memory!n); return FAIL;/ 得到了分類好的收款機鏈表指針數組 regArr = SortByReg(n);if (regArr = NULL) free(amount); / 釋放之前申請的內存 return NULL;/ 初始化總額數組 for (i=0; in; i+) amounti = 0;/ 進行分析累加 for (i=0; inext;/ 鏈表是空的if (recs = ListLength(regArri) = 0)continue;/ 遍歷一個收款機鏈表里有的所有記錄while (recs- 0)/ 將該臺收款機銷售的商品記錄的總額進行累

27、加amounti += node-data.salesAmount * node-data.salesVol; node = node-next;for(k=0;ki-1;k+) for(l=k+1;lamountl) temp=amountk; amountk=amountl; amountl=temp;printf( 排序后的數組為 n);/ 釋放收款機的鏈表內存for (i=0; in; i+)if (regArri = NULL) continue;/ 打印出后再釋放內存ListPrint(regArri, amounti);DestroyList(®Arri);/ 釋放鏈表指針

28、頭的內存 free(regArr);/ 釋放總額數組free(amount);return amount;/ 5. 編寫以商品為單位的數據分類處理函數LinkList* SortByGoods(int m) int i, count=0;FILE *ifp;各種商品的鏈表數組Goods temp;LinkList *goodsArr; /if (ifp=fopen(data.dat, rb) = NULL)printf(Open Fail.n); return FAIL;/ 分配鏈表指針數組goodsArr = (LinkList*)malloc(m * sizeof(LinkList);if

29、 (goodsArr = NULL)printf(Not enough memoryn); return FAIL;/ m 種商品的鏈表初始化for (i=0; im; i+)goodsArri = NULL;/ 開始根據商品的編號將所讀的記錄進行分類/ 注意數組下標是從 0開始,而商品編號是從 1 開始數的 while (1)/ 讀相應的記錄count = fread(&temp, sizeof(struct Goods), 1, ifp);/ 出錯或是到文件尾了if (count != 1)break;/ 第一次要初始化鏈表if (goodsArrtemp.goodsNum-1 = NUL

30、L) goodsArrtemp.goodsNum-1 = InitList();/ 存到對應的商品鏈表中的末尾結點 ListInsert(IsLast(goodsArrtemp.goodsNum-1), NewLNode(temp);/ 關閉文件fclose(ifp);return goodsArr;/ 6. 以商品為單位,統計每種商品的銷售總額double* SumByGoods(int m)int i, recs;double *amount;LNode node;LinkList *goodsArr;/ 申請一個數組存儲各種商品的銷售總額if (amount=(double*)mallo

31、c(m*sizeof(double) = NULL) printf(Not enough memory!n); return FAIL;/ 得到了分類好的各種商品的鏈表指針數組 goodsArr = SortByGoods(m);if (goodsArr = NULL) free(amount); / 釋放之前申請的內存 return NULL;/ 初始化總額數組 for (i=0; im; i+) amounti = 0;/ 進行分析累加for (i=0; inext;/ 鏈表是空的if (recs = ListLength(goodsArri) = 0) continue;/ 遍歷一個商品

32、鏈表里有的所有記錄 while (recs- 0)/ 將某種商品的銷售記錄的總額進行累加 amounti += node-data.salesAmount * node-data.salesVol; node = node-next;/ 釋放商品的鏈表內存for (i=0; im; i+)/ 鏈表存在的話 if (goodsArri = NULL) continue;/ 打印出后再釋放內存 ListPrint(goodsArri, amounti); DestroyList(&goodsArri);/ 釋放鏈表指針頭的內存 free(goodsArr);/ 釋放總額數組 free(amount

33、);return amount;/7 以商品為單位,排序每種商品的銷售總額 double* PaixuByGoods(int m)int i, recs,k,l,temp; double *amount;LNode node; LinkList *goodsArr;/ 申請一個數組存儲各種商品的銷售總額if (amount=(double*)malloc(m*sizeof(double) = NULL) printf(Not enough memory!n); return FAIL;/ 得到了分類好的各種商品的鏈表指針數組 goodsArr = SortByGoods(m);if (good

34、sArr = NULL)free(amount); / 釋放之前申請的內存 return NULL;/ 初始化總額數組 for (i=0; im; i+) amounti = 0;/ 進行分析累加for (i=0; inext;/ 鏈表是空的if (recs = ListLength(goodsArri) = 0) continue;/ 遍歷一個商品鏈表里有的所有記錄while (recs- 0)/ 將某種商品的銷售記錄的總額進行累加 amounti += node-data.salesAmount * node-data.salesVol; node = node-next; for(k=0;ki-1;k+) for(l=k+1;lamountl) temp=amountk; amountk=amountl; amountl=temp;printf( 排序后的數組為 n);/ 釋放商品的鏈表內存for (i=0; im; i+)/ 鏈表存在的話if (goodsArri = NULL) contin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論