




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
..1.需求分析在某個(gè)大型生活服務(wù)區(qū)內(nèi),有三個(gè)超市,每個(gè)超市中的商品包括:商品號(hào),商品名稱,商品價(jià)格,庫(kù)存數(shù)量,每種商品總數(shù),生產(chǎn)日期等基本信息,假設(shè)三個(gè)超市的商品信息分別是用單鏈L1,L2,L3取存儲(chǔ)的,請(qǐng)寫一個(gè)程序?qū)崿F(xiàn)下列任務(wù)要求:知識(shí)點(diǎn):線性表操作[任務(wù)要求]當(dāng)超市有新的商品購(gòu)入是能添加到單鏈表中;能查找出三個(gè)超市中具有相同商品名稱的商品信息;在超市商品信息L1中刪除那些與其他兩個(gè)超市都有的商品信息;能修改各超市商品基本信息,如價(jià)格等。能查找比較超市中相同商品的銷售情況,能統(tǒng)計(jì)每個(gè)超市中每種商品的銷售量及銷售額。能輸出每個(gè)超市的所有商品信息;[測(cè)試數(shù)據(jù)]自行設(shè)定,注意測(cè)試將活區(qū)刪空等特殊情況。2.概要設(shè)計(jì)2.1必要算法1.當(dāng)超市有新的商品購(gòu)入是添加到單鏈表中算法概要:運(yùn)用單鏈表的基本操作——插入一個(gè)新結(jié)點(diǎn),即分配一個(gè)新的儲(chǔ)存空間,然后依次輸入結(jié)點(diǎn)所含的數(shù)據(jù),再插入到原結(jié)點(diǎn)的尾部即可。此算法時(shí)間復(fù)雜度為O<1>。2.查找出三個(gè)超市中具有相同商品名稱的商品信息算法概要:1.尋找相同商品名稱算法:先比較前兩個(gè)鏈表〔超市l(wèi)1,l2,運(yùn)用比較字符串的strcmp〔方法找出兩個(gè)鏈表中含有相同的商品名稱,然后將兩個(gè)鏈表中具有相同商品名稱的商品信息存儲(chǔ)到新建鏈表fs中,再比較鏈表fs和l3,重復(fù)上述步驟,找出鏈表l1,l2,l3中都具有相同商品名稱的商品,將其商品信息存儲(chǔ)在鏈表fs中。此算法時(shí)間復(fù)雜度為O<n>。2.輸出相同商品的商品信息:訪問fs中每個(gè)結(jié)點(diǎn)中的商品名稱,根據(jù)商品名稱分別遍歷原鏈表l1,l2,l3的商品信息找出原結(jié)點(diǎn),然后將其信息輸出。此算法時(shí)間復(fù)雜度為O<n>。3.在超市商品信息L1中刪除那些與其他兩個(gè)超市都有的商品信息算法概要:首先運(yùn)用上述的尋找相同商品名稱算法,找出l1中那些與其他兩個(gè)超市都有的商品名稱,再根據(jù)其名稱遍歷鏈表l1,找出其結(jié)點(diǎn)刪除并釋放——單鏈表的基本操作。此算法時(shí)間復(fù)雜度為O<n>。4修改各超市商品基本信息,如價(jià)格等算法概要:首先交互輸入需要修改信息的商品號(hào),排除超市中沒有的商品后,定位到改商品的結(jié)點(diǎn),然后選擇需要修改的信息,比如價(jià)格,庫(kù)存數(shù)量等,或者全部修改即可修改信息。此算法時(shí)間復(fù)雜度為O<1>。5.查找比較超市中相同商品的銷售情況,統(tǒng)計(jì)每個(gè)超市中每種商品的銷售量及銷售額。算法概要:首先通過尋找相同商品名稱算法找出相同的商品,若沒有相同商品,則返回,若有〔多個(gè)相同商品,通過交互輸入商品號(hào)分別定位到3個(gè)鏈表中的相應(yīng)結(jié)點(diǎn)然后輸出其銷售信息,包括銷售量和銷售額,統(tǒng)計(jì)每個(gè)超市中每種商品的銷售量及銷售額是在輸出程序中一并輸出。此算法時(shí)間復(fù)雜度為O<n>。6.輸出每個(gè)超市的所有商品信息算法概要:遍歷3個(gè)鏈表的所有結(jié)點(diǎn),然后分別輸出每個(gè)結(jié)點(diǎn)的所有信息。此算法時(shí)間復(fù)雜度為O<n>。2.2輔助程序1.單鏈表存儲(chǔ)結(jié)構(gòu):為3個(gè)超市分別創(chuàng)建單鏈表,鏈表中每個(gè)結(jié)點(diǎn)含有7個(gè)數(shù)據(jù),分別是:整型的商品號(hào),字符數(shù)組型的商品名稱,整型的庫(kù)存數(shù)量,整型的商品總數(shù),整型的生產(chǎn)日期,整型的銷售數(shù)量。還有一個(gè)next指針。2.超市商品信息初始化:在每個(gè)鏈表當(dāng)中交互輸入每個(gè)結(jié)點(diǎn)的所有信息作為超市商品信息的初始化。3.銷售算法:銷售算法為了方便統(tǒng)計(jì)銷售信息而存在,實(shí)現(xiàn)思路是:輸入賣出的商品編號(hào)定位到鏈表中的相應(yīng)結(jié)點(diǎn),然后輸入銷售數(shù)量保存但結(jié)點(diǎn)中,同時(shí)該結(jié)點(diǎn)庫(kù)存數(shù)量相應(yīng)地減少。此算法時(shí)間復(fù)雜度為O<1>。2.3主程序主程序概要:主程序中首先創(chuàng)建3個(gè)鏈表然后初始化,再輸出所需的操作信息供選擇,通過交互式輸入選擇所要進(jìn)行的操作,直到輸入退出程序按鈕。詳細(xì)設(shè)計(jì)3.1必要算法1.當(dāng)超市有新的商品購(gòu)入時(shí)添加到單鏈表中l(wèi)inklist*purchase<linklist*l,ints>//超市有新的商品購(gòu)入是添加到單鏈表中{ linklist*p,*q,*r,*head; intn; head=l; r=l; p=l->next; //輸入購(gòu)入商品的基本信息 q=<linklist*>malloc<sizeof<linklist>>; printf<"請(qǐng)依次輸入超市%d此次購(gòu)入新商品的商品號(hào)、商品名稱、〔出售價(jià)格、購(gòu)入量、生產(chǎn)日期:\n",s>; scanf<"%d",&q->gno>; scanf<"%s",&q->name>; scanf<"%f",&q->price>; scanf<"%d",&q->amount>; scanf<"%d",&q->date>; q->QuantityInStock=q->amount; q->sold=0; printf<"購(gòu)入成功!\n">; //將新結(jié)點(diǎn)插入到表尾 q->next=NULL; while<p!=NULL>{ r=p; p=p->next; } r->next=q; r=r->next; returnhead;}2.查找出三個(gè)超市中具有相同商品名稱的商品信息算法1:尋找3個(gè)鏈表中具有相同商品名稱的商品linklist*findSame<linklist*l1,linklist*l2,linklist*l3>//尋找3個(gè)鏈表中具有相同商品名稱的商品{ linklist*p1=l1->next,*p2,*p3,*fs,*q,*p; fs=<linklist*>malloc<sizeof<linklist>>;//分配一個(gè)新的存儲(chǔ)空間用來保存相同商品的信息 fs->next=NULL; q=fs; intflag; //尋找l1,l2中具有相同商品名稱的商品 while<p1>{ p2=l2->next; while<p2>{ flag=strcmp<p1->name,p2->name>; if<flag==0>{ p=<linklist*>malloc<sizeof<linklist>>; strcpy<p->name,p1->name>; p->next=NULL; q->next=p; q=q->next; } p2=p2->next; } p1=p1->next; } //尋找l2,l3中具有相同商品名稱的商品 p=fs; while<p->next>{ p3=l3; while<p3->next>{ flag=strcmp<p->next->name,p3->next->name>; if<flag==0>break; if<p3->next==NULL>{ q=p->next; p->next=q->next; } p3=p3->next; } p=p->next; } returnfs;}算法2:輸出3個(gè)鏈表中具有相同商品名稱的商品信息voidoutputSame<linklist*l1,linklist*l2,linklist*l3>//輸出3個(gè)鏈表中具有相同商品名稱的商品信息{ linklist*p1=l1->next,*p2=l2->next,*p3=l3->next,*fs,*p; intflag; fs=findSame<l1,l2,l3>; p=fs->next; printf<"************************************3個(gè)超市中具有相同名稱的商品信息***********************************\n">; while<p>{ //遍歷鏈表l1 while<p1>{ flag=strcmp<p1->name,p->name>; if<flag==0>{ printf<"商品號(hào)\t商品名稱\t商品價(jià)格\t庫(kù)存數(shù)量\t商品總數(shù)\t售出數(shù)量\t生產(chǎn)日期\n">; printf<"超市1:%d\t%s\t\t%5.2f\t\t%d\t\t%d\t\t%d\t\t%d\n", p1->gno,p1->name,p1->price,p1->QuantityInStock,p1->amount,p1->amount-p1->QuantityInStock,p1->date>; } p1=p1->next; } //遍歷鏈表l2 while<p2>{ flag=strcmp<p2->name,p->name>; if<flag==0>{ printf<"超市2:%d\t%s\t\t%5.2f\t\t%d\t\t%d\t\t%d\t\t%d\n", p2->gno,p2->name,p2->price,p2->QuantityInStock,p2->amount,p2->amount-p2->QuantityInStock,p2->date>; } p2=p2->next; } //遍歷鏈表l3 while<p3>{ flag=strcmp<p3->name,p->name>; if<flag==0>{ printf<"超市3:%d\t%s\t\t%5.2f\t\t%d\t\t%d\t\t%d\t\t%d\n", p3->gno,p3->name,p3->price,p3->QuantityInStock,p3->amount,p3->amount-p3->QuantityInStock,p3->date>; } p3=p3->next; } p=p->next; } }3.在超市商品信息L1中刪除那些與其他兩個(gè)超市都有的商品信息voiddelSame<linklist*l1,linklist*l2,linklist*l3>//L1中刪除那些與其他兩個(gè)超市都有的商品信息{ intflag; linklist*p,*s,*q,*fs; fs=findSame<l1,l2,l3>; p=fs; while<p->next>{ q=l1; while<q->next>{ flag=strcmp<q->next->name,p->next->name>; if<flag==0>{ s=q->next; q->next=s->next; free<s>; printf<"\n成功刪除超市1中與其他兩個(gè)超市都有的商品信息!">; return; } q=q->next; } p=p->next; }}4.能修改各超市商品基本信息,如價(jià)格等voidupdate<linklist*l>//修改商品信息{linklist*p=l,*q=l,*s=l->next;intgno,m,price,QuantityInStock,amount,date,n=0,location=0,flag=0;if<l==NULL>{//鏈表為空printf<"鏈表為空!\n">;return;}printf<"請(qǐng)輸入需要修改價(jià)格的商品號(hào):">;scanf<"%d",&gno>; while<s>{ if<s->gno==gno>{ flag=1; } s=s->next; } if<!flag>{//找不到此商品 printf<"沒有此商品!\n">; return; }while<q->gno!=gno>{ location++; q=q->next; } printf<"請(qǐng)選擇需要修改的商品信息:\n">; printf<"1.商品價(jià)格2.庫(kù)存數(shù)量3.商品總數(shù)4.生產(chǎn)日期5.全部修改\n">; //選擇需要修改的信息 scanf<"%d",&m>; switch<m>{ case1: printf<"請(qǐng)輸入新的價(jià)格:">; scanf<"%d",&price>; while<p>{ if<location==n>{ p->price=price; return; } else{ p=p->next; n++; } } break; case2: printf<"請(qǐng)輸入新的庫(kù)存數(shù)量:">; scanf<"%d",&QuantityInStock>; while<p>{ if<location==n>{ p->QuantityInStock=QuantityInStock; return; } else{ p=p->next; n++; } } break; case3: printf<"請(qǐng)輸入新的商品總數(shù):">; scanf<"%d",&amount>; while<p>{ if<location==n>{ p->amount=amount; return; } else{ p=p->next; n++; } } break; case4: printf<"請(qǐng)輸入新的生產(chǎn)日期:">; scanf<"%d",&date>; while<p>{ if<location==n>{ p->date=date; return; } else{ p=p->next; n++; } } break; case5: printf<"請(qǐng)輸入新的價(jià)格:">; scanf<"%d",&price>; printf<"請(qǐng)輸入新的庫(kù)存數(shù)量:">; scanf<"%d",&QuantityInStock>; printf<"請(qǐng)輸入新的生產(chǎn)日期:">; scanf<"%d",&date>; printf<"請(qǐng)輸入新的商品總數(shù):">; scanf<"%d",&date>; while<p>{ if<location==n>{ p->price=price; p->QuantityInStock=QuantityInStock; p->amount=amount; p->date=date; return; } else{ p=p->next; n++; } } break; }}5.查找比較超市中相同商品的銷售情況voidsoldInformation<linklist*l1,linklist*l2,linklist*l3>//查找比較超市中相同商品的銷售情況{ linklist*q1=l1,*p1=l1,*q2=l2,*p2=l2,*q3=l3,*p3=l3,*s;intgno,n1=0,location1=0,n2=0,location2=0,n3=0,location3=0;s=findSame<l1,l2,l3>;if<s->next==NULL>{ printf<"3個(gè)超市沒有相同商品!">; return;}printf<"請(qǐng)輸入需要查詢銷售信息的商品號(hào):">;scanf<"%d",&gno>;while<q1->gno!=gno>{ location1++; q1=q1->next; } //遍歷l1 while<p1>{if<location1==n1>{while<q2->gno!=gno>{ location2++; q2=q2->next; } //遍歷l2 while<p2>{ if<location2==n2>{ while<q3->gno!=gno>{ location3++; q3=q3->next; } //遍歷l3 while<p3>{ if<location3==n3>{ printf<"************商品%s的銷售信息**************\n",q1->name>; printf<"\t商品\t銷售量\t銷售額\n">; printf<"\t超市1:%s\t%d\t%5.0f\n",q1->name,q1->sold,q1->sold*q1->price>; printf<"\t超市2:%s\t%d\t%5.0f\n",q2->name,q2->sold,q2->sold*q2->price>; printf<"\t超市3:%s\t%d\t%5.0f\n",q3->name,q2->sold,q3->sold*q3->price>; return; } else{ p3=p3->next; n3++; } } if<!p3>{ printf<"沒有此商品!">; return; } } else{ p2=p2->next; n2++; } } if<!p2>{ printf<"沒有此商品!">; return; }}else{p1=p1->next;n1++;}}if<!p1>{ printf<"沒有此商品!">; return; }}6.輸出每個(gè)超市的所有商品信息〔包括銷售量、銷售額voidoutput<linklist*l>//輸出每個(gè)超市的所有商品信息〔包括銷售量、銷售額{linklist*p; p=l->next;printf<"*********************************************商品信息輸出***************************************************\n">; printf<"商品號(hào)\t商品名稱\t商品價(jià)格\t庫(kù)存數(shù)量\t商品總數(shù)\t銷售量\t銷售額\t生產(chǎn)日期\n">; while<p>{ printf<"%d\t%s\t\t%5.2f\t\t%d\t\t%d\t\t%d\t%5.2f\t%d\n", p->gno,p->name,p->price,p->QuantityInStock,p->amount,p->sold,p->sold*p->price,p->date>; p=p->next; }}4.調(diào)試分析 4.1初始數(shù)據(jù)圖1調(diào)試過程分析:直接分別按順序輸入每個(gè)超市的每個(gè)商品的商品號(hào)、商品名稱、商品價(jià)格、庫(kù)存數(shù)量、生產(chǎn)日期即可存在的問題:在這里遇到的問題在于輸入數(shù)據(jù)的時(shí)候非常繁瑣,一不小心輸入錯(cuò)誤就要重新運(yùn)行程序重新輸入,而且一下子輸入商品所有信息容易出現(xiàn)類型錯(cuò)誤或者不能對(duì)應(yīng)的上相應(yīng)的信息。改進(jìn)設(shè)想:本來想改成一次輸入一個(gè)數(shù)據(jù),但是這樣在初始化數(shù)據(jù)時(shí)會(huì)有很長(zhǎng)的一段程序,于是否決了這個(gè)想法。4.2各模塊測(cè)試1.當(dāng)超市有新的商品購(gòu)入時(shí)添加到單鏈表中圖2圖3調(diào)試過程分析:當(dāng)有新商品購(gòu)入時(shí),如圖2所示,對(duì)超市1進(jìn)行操作,依次輸入其信息并保存在鏈表末尾,再顯示超市1中的所有商品信息,如圖3所示,新購(gòu)入的商品已添加進(jìn)超市1中。存在的問題:這里所說的問題是后面所有調(diào)試程序中都存在的問題,就是每次操作中都所有的操作選項(xiàng)都會(huì)出現(xiàn),這樣會(huì)占用大量的位置,用戶體驗(yàn)不佳。改進(jìn)設(shè)想:在主程序中選擇需要的操作時(shí)不帶上操作選項(xiàng),操作選項(xiàng)僅在第一次出現(xiàn)。2.查找出三個(gè)超市中具有相同商品名稱的商品信息圖4調(diào)試過程分析:根據(jù)初始數(shù)據(jù),3個(gè)超市中具有的相同商品名稱是a,因此如圖4所示,分別顯示了3個(gè)超市名為a的商品的商品信息。存在的問題:無改進(jìn)設(shè)想:無3.在超市商品信息L1中刪除那些與其他兩個(gè)超市都有的商品信息調(diào)試過程分析:選擇刪除l1中那些與其他兩個(gè)超市都有的商品信息選項(xiàng),即可完成操作,如圖5,這里l1中已刪除商品a。圖5存在的問題:無改進(jìn)設(shè)想:無4.修改各超市商品基本信息,如價(jià)格等。圖6調(diào)試過程分析:如圖6,在超市1中修改商品號(hào)為2的商品信息,在這里僅修改價(jià)格,再顯示超市1中的商品信息,可見2號(hào)商品價(jià)格已經(jīng)改變。存在的問題:這個(gè)算法非常冗長(zhǎng),每一個(gè)修改信息都占據(jù)幾行代碼。改進(jìn)設(shè)想:構(gòu)建一個(gè)函數(shù)專門用于修改一個(gè)信息,這樣每次修改信息之需調(diào)用該函數(shù)即可,不過暫時(shí)未能實(shí)現(xiàn)此想法。5查找比較超市中相同商品的銷售情況圖7圖8圖9圖10調(diào)試過程分析:首先需要對(duì)每個(gè)超市進(jìn)行售出操作,圖7,8,9分別是對(duì)超市1,2,3進(jìn)行售出,售出的是商品號(hào)為1,即商品a。再顯示每個(gè)超市中商品a的銷售量和銷售信息,如圖10所示。存在的問題:輸出需要查詢的銷售信息的商品號(hào)時(shí)并不知道有哪些商品是3個(gè)超市都有的,一旦有許多商品時(shí)容易混亂。改進(jìn)設(shè)想:在此算法中插入輸出3個(gè)超市具有相同商品的商品信息算法即可解決,但考慮到這里所測(cè)試的信息量少,沒有插入的必要。6輸出每個(gè)超市的所有商品信息,統(tǒng)計(jì)每個(gè)超市中每種商品的銷售量及銷售額。圖11調(diào)試過程分析:對(duì)超市1進(jìn)行操作,選擇輸出所有商品信息的選項(xiàng),即可顯示所有商品信息,包括銷售量和銷售額。存在的問題:無改進(jìn)設(shè)想:無5.總結(jié)5.1課程設(shè)計(jì)過程的收獲當(dāng)我決定選擇超市商品處理這個(gè)題目時(shí),一開始想運(yùn)用3個(gè)鏈表及指針來完成,但是在慢慢琢磨之后,覺得完全可以用一個(gè)鏈表即可,只要3個(gè)超市在初始化商品時(shí)調(diào)用一個(gè)函數(shù)即可。還有就是主程序中用了很多的循環(huán),因此對(duì)于循環(huán)的控制要十分小心,糾結(jié)了好久用while還是do—while,最后選擇用while,因?yàn)檫壿嫼?jiǎn)單,當(dāng)然缺點(diǎn)就是每次都會(huì)出現(xiàn)所有操作的選項(xiàng),顯得冗長(zhǎng)繁瑣。這次的程序?qū)嵲O(shè)計(jì)實(shí)驗(yàn)是對(duì)我們進(jìn)入大學(xué)以來學(xué)習(xí)程序設(shè)計(jì)語言結(jié)果的一次大檢驗(yàn)。自己動(dòng)手,自己發(fā)現(xiàn)和解決問題。發(fā)現(xiàn)了自己的許多不足。平時(shí)沒有掌握好的知識(shí)在這次實(shí)驗(yàn)中徹底暴露出來,最主要就是單鏈表的頭結(jié)點(diǎn)和尾結(jié)點(diǎn)的判定,經(jīng)過不斷思考,不斷查閱資料和上機(jī)運(yùn)行,解決其中大部分問題,當(dāng)然還存在一些問題沒有解決。我相信在以后的學(xué)習(xí)能夠解決好它們。總的來說,收獲還是不小的,我不僅對(duì)C語言的操作有了進(jìn)一步的掌握,還了解到了程序設(shè)計(jì)的書寫風(fēng)格及其注釋的格式,可以說,這是我第一次為程序?qū)懽⑨尅?.2程序調(diào)試能力的思考在程序調(diào)試方面,這次的課程設(shè)計(jì)中,我最主要是感悟到了一種調(diào)試程序的方法,就是逐行分析,原理很簡(jiǎn)單,在出現(xiàn)錯(cuò)誤的函數(shù)中插入一個(gè)printf語句,從頭開始,一行一行或者在每個(gè)循環(huán)中插入printf語句,如果printf語句的信息沒有顯示,說明此循環(huán)出現(xiàn)問題了,而且在這個(gè)課題中,編譯時(shí)的錯(cuò)誤解決不難,難的是邏輯上的錯(cuò)誤,在這里程序調(diào)試最大的問題就是不知道問題出在哪里了,所以這不失為一種好方法。5.3對(duì)數(shù)據(jù)結(jié)構(gòu)課程的認(rèn)識(shí)與思考這個(gè)學(xué)期數(shù)據(jù)結(jié)構(gòu)主要學(xué)習(xí)了,線性結(jié)構(gòu)〔包括棧和隊(duì)列、樹形結(jié)構(gòu)、圖狀結(jié)構(gòu)。線性結(jié)構(gòu)包括順序表、鏈表、棧、隊(duì)列等,棧和隊(duì)列是操作受限的線性表,表中的數(shù)據(jù)元素本身也是一個(gè)數(shù)據(jù)結(jié)構(gòu)。除了線性表以外,棧是重點(diǎn),因?yàn)闂:瓦f歸緊密相連,遞歸是程序設(shè)計(jì)中很重要的一種工具。樹狀結(jié)構(gòu)中的重點(diǎn)自然是二叉樹和哈弗曼樹了。對(duì)于二叉樹的很多操作都是基于對(duì)二叉樹的遍歷,掌握了如何遍歷,很多問題也就迎刃而解了,比如對(duì)二叉樹結(jié)點(diǎn)的查找訪問、統(tǒng)計(jì)二叉樹中葉子結(jié)點(diǎn)的數(shù)目、求二叉樹的深度等。哈弗曼編碼也有著很廣泛的應(yīng)用。對(duì)于圖狀結(jié)構(gòu),主要學(xué)習(xí)圖的存儲(chǔ)結(jié)構(gòu)及圖的遍歷。要學(xué)好數(shù)據(jù)結(jié)構(gòu),最主要的就是要注重對(duì)算法的掌握。對(duì)于一個(gè)算法,如果我們不是很理解的話,可以手動(dòng)將算法走一遍,慢慢理解該算法的思想。學(xué)習(xí)這門課程的最終目的,還是要學(xué)會(huì)如何設(shè)計(jì)算法,這需要我們長(zhǎng)期的練習(xí)和思考。數(shù)據(jù)結(jié)構(gòu)是一門既重視理論,又重視實(shí)踐的課程,而在我的學(xué)習(xí)中,理論占了絕大多數(shù)的時(shí)間,在更多時(shí)候,我過分注重一些算法的實(shí)現(xiàn)原理,但是卻很少自己編寫算法,這點(diǎn)在這次課程設(shè)計(jì)中就暴露了許多問題。因此以后學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的時(shí)候一定要舉一反三,對(duì)一個(gè)算法,不僅僅只弄懂這個(gè)算法是怎么來的,也要思考用其他方法實(shí)現(xiàn)此算法的功能,這樣才會(huì)讓自己的編程能力和解決問題能力得到提高。6.程序源代碼#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<string.h>#defineMAXNUM20typedefstructnode{ intgno; charname[MAXNUM]; floatprice; intQuantityInStock; intamount; intdate; intsold; structnode*next;}linklist;linklist*create<ints>//初始化商品信息{ linklist*head,*p,*r; inti,n; head=<linklist*>malloc<sizeof<linklist>>; head->next=NULL; r=head; printf<"\n*********************超市%d商品初始化**********************\n",s>; printf<"\n請(qǐng)輸入超市%d初始的商品種類數(shù):",s>; scanf<"%d",&n>; for<i=0;i<n;i++>{ p=<linklist*>malloc<sizeof<linklist>>; printf<"請(qǐng)依次輸入超市%d初始商品%d的商品號(hào)、商品名稱、〔出售價(jià)格、庫(kù)存數(shù)量、生產(chǎn)日期:\n",s,i+1>; scanf<"%d",&p->gno>; scanf<"%s",&p->name>; scanf<"%f",&p->price>; scanf<"%d",&p->amount>; scanf<"%d",&p->date>; p->QuantityInStock=p->amount; p->sold=0; p->next=NULL; r->next=p; r=r->next; } returnhead;}linklist*purchase<linklist*l,ints>//超市有新的商品購(gòu)入是添加到單鏈表中{ linklist*p,*q,*r,*head; intn; head=l; r=l; p=l->next; //輸入購(gòu)入商品的基本信息 q=<linklist*>malloc<sizeof<linklist>>; printf<"請(qǐng)依次輸入超市%d此次購(gòu)入新商品的商品號(hào)、商品名稱、〔出售價(jià)格、購(gòu)入量、生產(chǎn)日期:\n",s>; scanf<"%d",&q->gno>; scanf<"%s",&q->name>; scanf<"%f",&q->price>; scanf<"%d",&q->amount>; scanf<"%d",&q->date>; q->QuantityInStock=q->amount; q->sold=0; printf<"購(gòu)入成功!\n">; //將新結(jié)點(diǎn)插入到表尾 q->next=NULL; while<p!=NULL>{ r=p; p=p->next; } r->next=q; r=r->next; returnhead;}voidsold<linklist*l>{ linklist*p=l,*q=l;intgno,sold,n=0,location=0;if<l==NULL>{printf<"鏈表為空!\n">; return;}printf<"請(qǐng)輸入售出的商品號(hào):">;scanf<"%d",&gno>;while<q->gno!=gno>{ location++; q=q->next; } printf<"請(qǐng)輸入售出數(shù)量:">; scanf<"%d",&sold>; if<p->QuantityInStock<=sold>{ printf<"此商品庫(kù)存量不足!">; return; }while<p>{if<location==n>{p->sold+=sold;p->QuantityInStock-=sold;printf<"售出成功!\n">;return;}else{p=p->next;n++;}if<p->QuantityInStock==0>{ printf<"此物品已售完!">; return; }}}linklist*findSame<linklist*l1,linklist*l2,linklist*l3>//尋找3個(gè)鏈表中具有相同商品名稱的商品{ linklist*p1=l1->next,*p2,*p3,*fs,*q,*p; fs=<linklist*>malloc<sizeof<linklist>>;//分配一個(gè)新的存儲(chǔ)空間用來保存相同商品的信息 fs->next=NULL; q=fs; intflag; //尋找l1,l2中具有相同商品名稱的商品 while<p1>{ p2=l2->next; while<p2>{ flag=strcmp<p1->name,p2->name>; if<flag==0>{ p=<linklist*>malloc<sizeof<linklist>>; strcpy<p->name,p1->name>; p->next=NULL; q->next=p; q=q->next; } p2=p2->next; } p1=p1->next; } //尋找l2,l3中具有相同商品名稱的商品 p=fs; while<p->next>{ p3=l3; while<p3->next>{ flag=strcmp<p->next->name,p3->next->name>; if<flag==0>break; if<p3->next==NULL>{ q=p->next; p->next=q->next; } p3=p3->next; } p=p->next; } returnfs;}voidoutputSame<linklist*l1,linklist*l2,linklist*l3>//輸出3個(gè)鏈表中具有相同商品名稱的商品信息{ linklist*p1=l1->next,*p2=l2->next,*p3=l3->next,*fs,*p; intflag; fs=findSame<l1,l2,l3>; p=fs->next; printf<"************************************3個(gè)超市中具有相同名稱的商品信息***********************************\n">; while<p>{ //遍歷鏈表l1 while<p1>{ flag=strcmp<p1->name,p->name>; if<flag==0>{ printf<"商品號(hào)\t商品名稱\t商品價(jià)格\t庫(kù)存數(shù)量\t商品總數(shù)\t售出數(shù)量\t生產(chǎn)日期\n">; printf<"超市1:%d\t%s\t\t%5.2f\t\t%d\t\t%d\t\t%d\t\t%d\n",p1->gno,p1->name,p1->price,p1->QuantityInStock,p1->amount,p1->amount-p1->QuantityInStock,p1->date>; } p1=p1->next; } //遍歷鏈表l2 while<p2>{ flag=strcmp<p2->name,p->name>; if<flag==0>{ printf<"超市2:%d\t%s\t\t%5.2f\t\t%d\t\t%d\t\t%d\t\t%d\n", p2->gno,p2->name,p2->price,p2->QuantityInStock,p2->amount,p2->amount-p2->QuantityInStock,p2->date>; } p2=p2->next; } //遍歷鏈表l3 while<p3>{ flag=strcmp<p3->name,p->name>; if<flag==0>{ printf<"超市3:%d\t%s\t\t%5.2f\t\t%d\t\t%d\t\t%d\t\t%d\n", p3->gno,p3->name,p3->price,p3->QuantityInStock,p3->amount,p3->amount-p3->QuantityInStock,p3->date>; } p3=p3->next; } p=p->next; } }voiddelSame<linklist*l1,linklist*l2,linklist*l3>//L1中刪除那些與其他兩個(gè)超市都有的商品信息{ intflag; linklist*p,*s,*q,*fs; fs=findSame<l1,l2,l3>; p=fs; while<p->next>{ q=l1; while<q->next>{ flag=strcmp<q->next->name,p->next->name>; if<flag==0>{ s=q->next; q->next=s->next; free<s>; printf<"\n成功刪除超市1中與其他兩個(gè)超市都有的商品信息!">; return; } q=q->next; } p=p->next; }}voidupdate<linklist*l>//修改商品信息{linklist*p=l,*q=l,*s=l->next;intgno,m,price,QuantityInStock,amount,date,n=0,location=0,flag=0;if<l==NULL>{//鏈表為空printf<"鏈表為空!\n">;return;}printf<"請(qǐng)輸入需要修改價(jià)格的商品號(hào):">;scanf<"%d",&gno>; while<s>{ if<s->gno==gno>{ flag=1; } s=s->next; } if<!flag>{//找不到此商品 printf<"沒有此商品!\n">; return; }while<q->gno!=gno>{ location++; q=q->next; } printf<"請(qǐng)選擇需要修改的商品信息:\n">; printf<"1.商品價(jià)格2.庫(kù)存數(shù)量3.商品總數(shù)4.生產(chǎn)日期5.全部修改\n">; //選擇需要修改的信息 scanf<"%d",&m>; switch<m>{ case1: printf<"請(qǐng)輸入新的價(jià)格:">; scanf<"%d",&price>; while<p>{ if<location==n>{ p->price=price; return; } else{ p=p->next; n++; } } break; case2: printf<"請(qǐng)輸入新的庫(kù)存數(shù)量:">; scanf<"%d",&QuantityInStock>; while<p>{ if<location==n>{ p->QuantityInStock=QuantityInStock; return; } else{ p=p->next; n++; } } break; case3: printf<"請(qǐng)輸入新的商品總數(shù):">; scanf<"%d",&amount>; while<p>{ if<location==n>{ p->amount=amount; return; } else{ p=p->next; n++; } } break; case4: printf<"請(qǐng)輸入新的生產(chǎn)日期:">; scanf<"%d",&date>; while<p>{ if<location==n>{ p->date=date; return; } else{ p=p->next; n++; } } break; case5: printf<"請(qǐng)輸入新的價(jià)格:">; scanf<"%d",&price>; printf<"請(qǐng)輸入新的庫(kù)存數(shù)量:">; scanf<"%d",&QuantityInStock>; printf<"請(qǐng)輸入新的生產(chǎn)日期:">; scanf<"%d",&date>; printf<"請(qǐng)輸入新的商品總數(shù):">; scanf<"%d",&date>; while<p>{ if<location==n>{ p->price=price; p->QuantityInStock=QuantityInStock; p->amount=amount; p->date=date; return; } else{ p=p->next; n++; } } break; }}voidsoldInformation<linklist*l1,linklist*l2,linklist*l3>//查找比較超市中相同商品的銷售情況{ linklist*q1=l1,*p1=l1,*q2=l2,*p2=l2,*q3=l3,*p3=l3,*s;intgno,n1=0,location1=0,n2=0,location2=0,n3=0,location3=0;s=findSame<l1,l2,l3>;if<s->next==NULL>{ printf<"3個(gè)超市沒有相同商品!">; return; }printf<"請(qǐng)輸入需要查詢銷售信息的商品號(hào):">;scanf<"%d",&gno>;while<q1->gno!=gno>{ location1++; q1=q1->next; } //遍歷l1 while<p1>{if<location1==n1>{while<q2->gno!=gno>{ location2++; q2=q2->next; } //遍歷l2 while<p2>{ if<location2==n2>{ while<q3->gno!=gno>{ location3++; q3=q3->next; } //遍歷l3 while<p3>{ if<location3==n3>{ printf<"************商品%s的銷售信息**************\n",q1->name>; printf<"\t商品\t銷售量\t銷售額\n">; printf<"\t超市1:%s\t%d\t%5.0f\n",q1->name,q1->sold,q1->sold*q1->price>; printf<"\t超市2:%s\t%d\t%5.0f\n",q2->name,q2->sold,q2->sold*q2->price>; printf<"\t超市3:%s\t%d\t%5.0f\n",q3->name,q3->sold,q3->sold*q3->price>; return; } else{ p3=p3->next; n3++; } } if<!p3>{ printf<"沒有此商品!">; return; } } else{ p2=p2->next; n2++; } } if<!p2>{ printf<"沒有此商品!">; return; }}else{p1=p1->next;n1++;}}if<!p1>{ printf<"沒有此商品!">; return; }}voidoutput<linklist*l>//輸出每個(gè)超市的所有商品信息〔包括銷售量、銷售額{linklist*p; p=l->next; printf<"***************************************商品信息輸出********************************************\n">; printf<"商品號(hào)\t商品名稱\t商品價(jià)格\t庫(kù)存數(shù)量\t商品總數(shù)\t銷售量\t銷售額\t生產(chǎn)日期\n">; while<p>{ printf<"%d\t%s\t\t%5.2f\t\t%d\t\t%d\t\t%d\t%5.2f\t%d\n", p->gno,p->name,p->price,p->QuantityInStock,p->amount,p->sold,p->sold*p->price,p->date>; p=p->next; }}intmain<>{ ints,c; linklist*L1,*L2,*L3,*same; //初始化3個(gè)鏈表 L1=create<1>; L2=create<2>; L3=create<3>; while<1>{ printf<"\n請(qǐng)選擇你要管理的超市序號(hào)〔1/2/3:">; scanf<"%d",&s>; switch<s>{ //管理超市1 case1: printf<"\n********************超市%d商品管理***********************\n",s>; printf<"|------------------------------------------------------|\n">; printf<"|1.購(gòu)入商品|\n">; printf<"|2.售出商品|\n">; printf<"|3.查找3個(gè)超市中具有的相同商品名稱的商品信息|\n">; printf<"|4.刪除l1中與其他兩個(gè)超市都有的商品信息|\n">; printf<"|5.修改商品信息|\n">; printf<"|6.比較各超市相同商品的銷售情況|\n">; printf<"|7.輸出超市所有商品的信息|\n">; printf<"|8.退出程序|\n">; printf<"|------------------------------------------------------|\n">; printf<"請(qǐng)輸入你的選擇:">; scanf<"%d",&c>; switch<c>{ case1: L1=purchase<L1,1>; break; case2: sold<L1>; break; case3: outputSame<L1,L2,L3>; break; case4: delSame<L1,L2,L3>; break; case5: update<L1>; break; case6: soldInformation<L1,L2,L3>; break; case7: output<L1>; break; case8: exit<0>; default: printf<"選擇錯(cuò)誤,請(qǐng)重新選擇\n!">; } break; //管理超市2 case2: printf<"\n**********
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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年健康科學(xué)基礎(chǔ)知識(shí)考試試卷及答案
- 設(shè)計(jì)公司年度總結(jié)報(bào)告
- 健康產(chǎn)業(yè)課件背景
- 數(shù)據(jù)庫(kù)設(shè)計(jì)核心要素與方法
- 咖啡廳局部設(shè)計(jì)
- T/SPSTS 007-2018電動(dòng)汽車充換電用鋰離子動(dòng)力蓄電池包和系統(tǒng)安全規(guī)范
- 機(jī)械設(shè)計(jì)創(chuàng)新大賽答辯
- T/SHSOT 010-2023化妝品中黃芩苷、黃芩素和漢黃芩素的檢測(cè)液相色譜法
- T/SHPTA 081-2024消費(fèi)電子用消費(fèi)后回收聚碳酸酯/丙烯腈-丁二烯-苯乙烯(PC/ABS-PCR)專用料
- 冬季農(nóng)村疾病預(yù)防要點(diǎn)與措施
- 游泳館衛(wèi)生許可證申請(qǐng)書
- 工序報(bào)驗(yàn)申請(qǐng)表
- 物質(zhì)安全數(shù)據(jù)表(MSDS)84消毒液
- 物業(yè)監(jiān)控室視頻圖像點(diǎn)信息采集表
- 三相異步電動(dòng)機(jī)的正反轉(zhuǎn)
- hec教程用戶手冊(cè)中文版
- 救護(hù)車急診出診轉(zhuǎn)運(yùn)風(fēng)險(xiǎn)相關(guān)事項(xiàng)告知書
- 六輥軋機(jī)軋輥裝置的設(shè)計(jì)
- 初中學(xué)生綜合素質(zhì)表現(xiàn)評(píng)價(jià)檔案
- 常用音樂術(shù)語大全含詳細(xì)速度值
- 心經(jīng)注音版(打印版)
評(píng)論
0/150
提交評(píng)論