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

下載本文檔

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

文檔簡介

1/1數(shù)據(jù)結構課程設計+數(shù)據(jù)匯總(超市)

信電工程學院課程設計報告

數(shù)據(jù)匯總系統(tǒng)

課程:高級語言程序設計

班級:12軟件1

學號:

姓名:潘煥燚

指導老師:丁賓

2023年7月1日

名目

1程序目標及功能1

1.1課題背景1

1.2系統(tǒng)功能3

1.3設計要求32程序功能模塊組成及流程圖4

2.2系統(tǒng)功能模塊4

2.3各模塊流程圖53程序主要數(shù)據(jù)結構及函數(shù)列表8

3.1程序中使用的數(shù)據(jù)結構8

3.2函數(shù)列表104程序代碼及運行結果145總結與體會32

題目:數(shù)據(jù)匯總

題目內容:

在數(shù)據(jù)處理中常常需要對大量數(shù)據(jù)進行匯總,將相同關鍵字記錄的某些數(shù)據(jù)項的值疊加起來,生成一個分類匯總表。

假設某超級市場銷售有m種商品(假設商品的編號為1,2,3,┅┅,m),有n臺前臺收款機(假設收款機的編號為1,2,3,┅┅,n)進行收款,以記錄的形式供應給計算機,每個記錄表示某臺收款機的一種商品一次交易的數(shù)量和銷售額。記錄由4個域組成:收款機編號、商品編號、銷售數(shù)量、銷售金額。構造一個結構體類型,每次銷售數(shù)據(jù)以一個結構體變量保存在一個數(shù)據(jù)文件中。

本人完成的工作:

(1)編寫實現(xiàn)將數(shù)據(jù)記錄插入到數(shù)據(jù)文件的最終的函數(shù);

⑵編寫以收款機為單位的數(shù)據(jù)分類處理函數(shù)。構造n個單鏈表,每個鏈表保存一臺收款機的銷售記錄,這n個單鏈表的頭指針存放在一個指針數(shù)組中,通過數(shù)組的下標就可以知道是哪臺收款機。讀取數(shù)據(jù)文件的記錄,將全部的銷售記錄(數(shù)據(jù)文件中的全部記錄)分解插入到n個單鏈表;

(3)編寫以商品為單位的數(shù)據(jù)分類處理函數(shù)。構造m個單鏈表,每個鏈表保存一種商品的銷售記錄,這m個單鏈表的頭指針存放在一個指針數(shù)組中,通過數(shù)組的下標就可以知道是哪種商品。讀取數(shù)據(jù)文件的記錄,將全部的銷售記錄(數(shù)據(jù)文件中的全部記錄)分解插入到m個單鏈表;

(4)統(tǒng)計每臺收款機的銷售總額;

(5)以收款機為單位,將全部收款機按銷售總額的遞增挨次構造一個單鏈表并輸出。

(6)以商品為單位,統(tǒng)計每種商品的銷售總額。

(7)以商品為單位,將全部銷售的商品按銷售總額的遞增挨次構造一個單鏈表并輸出。

-3-

(8)設計一個菜單,具有插入數(shù)據(jù)記錄、按收款機統(tǒng)計銷售總額、按商品統(tǒng)計銷售總額、退出系統(tǒng)等最基本的功能。

所采納的數(shù)據(jù)結構:單鏈表

銷售商品數(shù)據(jù)記錄結構定義:

typedefstructGoods

{

intregNum;//收款機編號

intgoodsNum;//商品編號

intsalesVol;//銷售數(shù)量

doublesalesAmount;//銷售單價

}Goods;

typedefstructGoodsElemType;//用于鏈表里的數(shù)據(jù)類型

單鏈表結點定義:

typedefstructNode

{

ElemTypedata;//鏈表所存的數(shù)據(jù)

structNode*next;//指向下一個結點的指針

}*LNode,*LinkList;

所設計的函數(shù):

[1].將數(shù)據(jù)記錄插入到文件data.dat最終的函數(shù)

intAddrecord(Goods*goods)

算法思想:首先推斷參數(shù)是否非法,非法則返回FAIL,否則以以二進制的append方式打開文件data.dat;文件指針為空則打開失敗返回FAIL,否則將數(shù)據(jù)記錄寫入文件,然后關閉文件,返回SUCCESS。

流程圖:

[2].以收款機為單位的數(shù)據(jù)分類處理函數(shù)

LinkList*SortByReg(intn)

算法思想:推斷打開文件是否勝利,失敗則打印“打開文件失敗”并返回FAIL,否則安排鏈表指針數(shù)組;然后推斷內存是否充分,不足則打印“內存不足”并返回FAIL,否則初始化n個收款機鏈表,并讀相應記錄,存到對應的收款機鏈表中的末尾結點,最終關閉文件,返回鏈表數(shù)組。

流程圖:

-5-

[3]統(tǒng)計每臺收款機的銷售總額

double*SumByReg(intn)

算法思想:申請一個數(shù)組存儲各臺收款機的銷售總額,申請不勝利則打印“內存不足”并返回FAIL,否則調用SortByReg(n)函數(shù)得到分類好的收款機鏈表指針數(shù)組,推斷指針數(shù)組是否為空,是則釋放之前時申請的內存空間并返回NULL,否則初始化總額數(shù)組,并進行累計分析,之后釋放收款機的鏈表內存,釋放鏈表指針的內存,釋放總額數(shù)組,返回總額amount

流程圖:

-7-

[4].以商品為單位的數(shù)據(jù)分類處理函數(shù)

LinkList*SortByGoods(intm)

算法思想:推斷打開文件是否勝利,失敗則打印“打開文件失敗”并返回FAIL,否則安排鏈表指針數(shù)組;然后推斷內存是否充分,不足則打印“內存不足”并返回FAIL,否則初始化m個商品鏈表,并讀相應記錄,存到對應的商品鏈表中的末尾結點,最終關閉文件,返回鏈表數(shù)組。

流程圖:

[5].以商品為單位,統(tǒng)計每種商品的銷售總額

double*SumByGoods(intm)

算法思想:申請一個數(shù)組存儲各種商品的銷售總額,申請不勝利則打印“內存不足”并返回FAIL,否則調用SortByGoods(m)函數(shù)得到分類好的各種商品的鏈表指針數(shù)組,推斷指針數(shù)組是否為空,是則釋放之前時申請的內存空間并返回NULL,否則初始化總額數(shù)組,并進行累計分析,之后釋放收款機的鏈表內存,釋放鏈表指針的內存,釋放總額數(shù)組,返回總額amount

-9-

流程圖:

[6].設計一個菜單,具有插入數(shù)據(jù)記錄、按收款機統(tǒng)計銷售總額voidRunMenu(void)

算法思想:清除以前的無關輸入,打印菜單,依據(jù)選擇的菜單項進行相應的操作。

-11-

[7].用于輸入一條新的記錄

[8].GOODS的輸出函數(shù)

-13-

程序運行結果:

1:主程序運行,菜單打印

2插入數(shù)據(jù)記錄

3.按收款機統(tǒng)計銷售總額

4.按商品統(tǒng)計銷售總額

-15-

5.按商品銷售記錄排序

6按收款機收款紀錄排序

7退出系統(tǒng)

源程序:

#include

#include

#include

#defineSUCCESS1//操作勝利

#defineFAIL0//操作失敗

#defineallRegisters15

#defineallGoods30

//銷售的商品數(shù)據(jù)記錄

typedefstructGoods

{

intregNum;//收款機編號

intgoodsNum;//商品編號

intsalesVol;//銷售數(shù)量

doublesalesAmount;//銷售單價

}Goods;

typedefstructGoodsElemType;//用于鏈表里的數(shù)據(jù)類型

typedefstructNode

{

ElemTypedata;//鏈表所存的數(shù)據(jù)

structNode*next;//指向下一個結點的指針

}*LNode,*LinkList;

//構造一個空的線性表

LinkListInitList(void)

{

LNodeHead;

Head=(LNode)malloc(sizeof(structNode));//為鏈表的頭結點安排空間if(!Head)

{

printf("Outofspace!");

returnNULL;

}

Head->next=NULL;

-17-

returnHead;//返回頭結點,第一個結點head是不存任何數(shù)據(jù)的

}

//初始條件:線性表L已存在。操作結果:返回線性表L的最終一個結點(尾結點)。LNodeIsLast(LinkListL)

{

LNodeP=L->next;

if(P)

{

while(P->next!=NULL)//遍歷線性表L

P=P->next;

returnP;//返回線性表L的最終一個結點

}

else

returnL;//鏈表只有頭結點,而它不存數(shù)據(jù)的

}

//初始條件:線性表L已存在。操作結果:返回線性表L結點的個數(shù)。

intListLength(LinkListL)

{

LNodeP=L->next;

intnum=0;

while(P)//累積線性表L結點的個數(shù)

{

num++;

P=P->next;

}

returnnum;//返回線性表L結點的個數(shù)

}

//構造一個數(shù)據(jù)域為X的新結點

LNodeNewLNode(ElemTypeX)

{

LNodeS;

S=(LNode)malloc(sizeof(structNode));//為新結點安排空間if(!S)

{

printf("Outofspace!");

returnNULL;

}

S->data=X;

S->next=NULL;

returnS;//返回新結點

}

//初始條件:線性表L已存在。操作結果:銷毀線性表L。

voidDestroyList(LinkList*L)

{

LNodeHead,P;

if(*L)//若線性表L已存在

{

Head=*L;

P=Head->next;

while(P!=NULL)//把鏈表中除頭結點外的全部結點釋放

{

free(Head);

Head=P;

P=Head->next;

}

free(Head);//釋放頭結點

}

*L=NULL;

}

//初始條件:線性表L中結點P已找到,新結點S已構造。。操作結果:在該結點之后插入新結點X。

voidListInsert(LNodePre,LNodeS)

{

S->next=Pre->next;

Pre->next=S;

}

//用于輸入一條新的記錄

//缺點就是沒對輸入的數(shù)據(jù)各種檢查

//一旦輸入字母就不行了

Goods*Newrecord(Goods*goods)

{

printf("\n"

"請輸入商品信息:\n");

-19-

//收款臺號,保證錄入正確的數(shù)據(jù)

while(1)

{

fflush(stdin);

printf("收款機編號(1--%d):#",allRegisters);

scanf("%d",

if(goods->regNum>0

}

//商品號

while(1)

{

fflush(stdin);

printf("商品編號(1--%d):#",allGoods);

scanf("%d",

if(goods->goodsNum>0

}

//銷售量

printf("銷售數(shù)量:n=");

scanf("%d",

//銷量單價

printf("商品銷售單價:$");

scanf("%lf",

//清除可能輸入緩沖區(qū)

fflush(stdin);

returngoods;

}

//專為GOODS而寫的輸出函數(shù)

voidListPrint(LinkListL,doubleamount)

{

LNodenode;

inti;

intcount=ListLength(L);

if(L==NULL)

return;

//第一個結點不存記錄,所以從其次個開頭

node=L->next;

if(node==NULL)

return;

//打印出表頭

printf("留意:每打印5個記錄,將會暫停,按enter連續(xù)!!\n");

printf("收款機No(R).|商品No(G).|單價($)|銷售數(shù)量(n)\n");

//將全部記錄按格式打印出來

i=0;

while(idata.regNum,node->data.goodsNum,node->data.salesAmount,node->data.salesVol);

if((i+1)%5==0)

getch;

i++;

node=node->next;

}

//這個就是打出總額了,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;

//以二進制的append方式打開文件data.dat

if((ofp=fopen("data.dat","ab"))==NULL)

{

printf("Openfail!\n");

returnFAIL;

}

//把記錄寫入文件中

fwrite(goods,sizeof(structGoods),1,ofp);

//關閉文件

fclose(ofp);

returnSUCCESS;

-21-

//[2].編寫以收款機為單位的數(shù)據(jù)分類處理函數(shù)

LinkList*SortByReg(intn)

{

inti,count;

FILE*ifp;

Goodstemp;

LinkList*regArr;//收款機的鏈表數(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個收款機鏈表初始化

for(i=0;inext;

//鏈表是空的

if((recs=ListLength(regArr[i]))==0)

continue;

//遍歷一個收款機鏈表里有的全部記錄

while(recs-->0)

{

//將該臺收款機銷售的商品記錄的總額進行累加

amount[i]+=node->data.salesAmount*node->data.salesVol;

node=node->next;

}

}

-23-

//釋放收款機的鏈表內存

for(i=0;inext;

//鏈表是空的

if((recs=ListLength(regArr[i]))==0)

continue;

//遍歷一個收款機鏈表里有的全部記錄

while(recs-->0)

{

//將該臺收款機銷售的商品記錄的總額進行累加

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");

//釋放收款機的鏈表內存

for(i=0;inext;

//鏈表是空的

if((recs=ListLength(goodsArr[i]))==0)

continue;

//遍歷一個商品鏈表里有的全部記錄

while(recs-->0)

{

//將某種商品的銷售記錄的總額進行累加

amount[i]+=node->data.salesAmount*node->data.salesVol;

node=node->next;

}

}

//釋放商品的鏈表內存

for(i=0;inext;

//鏈表是空的

if((recs=ListLength(goodsArr[i]))==0)

continue;

//遍歷一個商品鏈表里有的全部記錄

while(recs-->0)

{

//將某種商品的銷售記錄的總額進行累加

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");

//釋放商品的鏈表內存

for(i=0;i<m;i++)

{

//鏈表存在的話

if(goodsArr[i]==NULL)

continue;

//打印出后再釋放內存

ListPrint(goodsArr[i],amount[i]);

DestroyList(

}

//釋放鏈表指針頭的內存

free(goodsArr);

//釋放總額數(shù)組

free(amount);

returnamount;

}

//[6].設計一個菜單,具有插入數(shù)據(jù)記錄、按收款機統(tǒng)計銷售總額

voidRunMenu(void)

-29-

{

intselete;

Goodsgoods;

double*amount=NULL;

while(1)

{

//清除以前的一些無關輸入,避開被影響

fflush(stdin);

//打出菜單

printf("\n歡迎使用超市數(shù)據(jù)匯總基本操作程序

\n");

printf("\n學號:16姓名:潘煥燚班級:12軟件1\n");

printf("系統(tǒng)主菜單

\n");

溫馨提示

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

評論

0/150

提交評論