![畢業(yè)論文設(shè)計(jì)-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告_第1頁](http://file4.renrendoc.com/view/f4dcc4ea42d55228c6c1803d716bcaa1/f4dcc4ea42d55228c6c1803d716bcaa11.gif)
![畢業(yè)論文設(shè)計(jì)-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告_第2頁](http://file4.renrendoc.com/view/f4dcc4ea42d55228c6c1803d716bcaa1/f4dcc4ea42d55228c6c1803d716bcaa12.gif)
![畢業(yè)論文設(shè)計(jì)-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告_第3頁](http://file4.renrendoc.com/view/f4dcc4ea42d55228c6c1803d716bcaa1/f4dcc4ea42d55228c6c1803d716bcaa13.gif)
![畢業(yè)論文設(shè)計(jì)-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告_第4頁](http://file4.renrendoc.com/view/f4dcc4ea42d55228c6c1803d716bcaa1/f4dcc4ea42d55228c6c1803d716bcaa14.gif)
![畢業(yè)論文設(shè)計(jì)-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告_第5頁](http://file4.renrendoc.com/view/f4dcc4ea42d55228c6c1803d716bcaa1/f4dcc4ea42d55228c6c1803d716bcaa15.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)學(xué)院名稱:計(jì)算機(jī)工程學(xué)院專業(yè):信息管理與信息系統(tǒng)班級:姓名:2015年1月7日目錄TOC\o"1-3"\h\u1861一、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告要求111730二、第一類題目2136602.1問題陳述22.2.程序代碼22.3.運(yùn)行結(jié)果42.4.設(shè)計(jì)體會與總結(jié)417053三、第二類題目43.1.問題陳述43.2.需求分析53.3.概要設(shè)計(jì)53.4.詳細(xì)設(shè)計(jì)63.5.程序代碼73.6.運(yùn)行結(jié)果與測試183.7.設(shè)計(jì)體會與總結(jié)19317四、第三類題目204.1.問題陳述204.2.需求分析204.3.概要設(shè)計(jì)204.4.詳細(xì)設(shè)計(jì)214.5.程序代碼404.6.運(yùn)行結(jié)果與測試584.7.設(shè)計(jì)體會與總結(jié)65322五、課設(shè)總結(jié)6523723六、參考文獻(xiàn)66一、第一類題目(宋體,四號,加粗)問題陳述(宋體,小四,單倍行距)串的模式匹配:字符串模式匹配算法是入侵檢測系統(tǒng)中的一種重要算法。通過對算法KMP分析,該算法通過每次匹配失敗時(shí)特殊位置上字符的啟發(fā)來獲得字符串向后移動的可能距離,這個(gè)距離由定義的一個(gè)統(tǒng)一函數(shù)求出,取其中的最大值作為字符串向后移動的實(shí)際距離。實(shí)驗(yàn)結(jié)果表明,該算法能減少模式匹配中字符的比較次數(shù)和嘗試次數(shù),提高模式匹配的效率。程序代碼#include"stdio.h"#include"string.h"typedefcharDataType;voidGetNext(DataType*t,int*next,inttlength)//求模式串t的next函數(shù)值并存入數(shù)組next{ inti=1,j=0;//定義整型變量i,j next[1]=0;//初始化存放部分匹配數(shù)組的next的第一項(xiàng)為-1 while(i<tlength)//當(dāng)i小于字符串的長度時(shí),執(zhí)行循環(huán) { if(j==0||t[i]==t[j])//如果j剛開始循環(huán)或者i和j表示的字符相同時(shí) { ++i;++j;//i和j都自增,即增加到next中i位置的后一位,而j的增加也表示與i表示的字符相符的個(gè)數(shù)加1 if(t[i]!=t[j])//如果此時(shí)模式串中的i和j位置的字符不等 next[i]=j;//將j的值賦給next數(shù)組,便于直接比較目標(biāo)串s與t在next[j]處的值 else//如果模式串中的i和j位置的字符仍然相等 next[i]=next[j];//將j的next中的值賦給i所在位置的值,這樣能夠保證后面比較目標(biāo)串和字串時(shí),直接比較t在next[j]處的值,而不需要比較t在j處的值 } else//如果i和j對應(yīng)的字符不相同 j=next[j];//繼續(xù)后續(xù)比較 }}intIndexKmp(DataType*s,DataType*t,intpos,inttlength,intslength,int*next)//利用模式串t的next函數(shù)求t在主串s中第pos個(gè)字符之后的位置{ inti=pos,j=1;//定義整型變量i,j while(i<=slength&&j<=tlength)//當(dāng)i和j都未到達(dá)字符串末端時(shí) { if(j==0||s[i]==t[j])//如果j剛開始比較或者模式串和目標(biāo)串對應(yīng)的字符相等時(shí) { ++i;++j;//i和j均往后移動,比較后續(xù)字符 } else j=next[j];//否則,保持i不變,將j右滑動到下一個(gè)部分匹配位置 } if(j>tlength)//如果j的大小都大于t(模式串)的長度,說明能夠找到匹配的位置 returni-tlength;//返回此時(shí)i的值減去t(模式串)的長度得到t在對應(yīng)的s前方還有幾個(gè)字符,即為它們的匹配位置 else return0;//否則,即為找不到匹配,返回0}intmain(intargc,char*argv[]){ intlocate,tlength,slength;//定義整型變量表示它們的匹配和兩個(gè)字符串的長度 intnext[256];//定義存放它們部分匹配數(shù)值的數(shù)組 DataTypes[256],t[256];//定義字符數(shù)組s,t printf("請輸入第一個(gè)串(母串):"); slength=strlen(gets(s+1));//目標(biāo)串長度 printf("請輸入第二個(gè)串(母串):"); tlength=strlen(gets(t+1));//模式串長度 GetNext(t,next,tlength);//求部分匹配數(shù)組next locate=IndexKmp(s,t,0,tlength,slength,next);//求出它們的具體匹配位置 printf("匹配位置:%d\n",locate); return0;}運(yùn)行結(jié)果(1)能夠找到匹配(2)不能找到匹配位置時(shí)間復(fù)雜度O(m+n)4.設(shè)計(jì)體會與總結(jié)串匹配算法雖然發(fā)展了幾十年,然而非常實(shí)用的算法是近年才出現(xiàn)。串匹配問題的研究存在理論研究和實(shí)際應(yīng)用的脫節(jié)。那些專門從事算法研究的學(xué)者關(guān)心的只是理論上看起來很美妙的算法——具有很好的時(shí)間復(fù)雜度。而本程序運(yùn)用的是KMP算法,即保證其中一個(gè)字符串時(shí)另一個(gè)字符串的子串,利用next數(shù)組保存部分匹配的信息。實(shí)際上,模式串中的部分匹配信息就是真子串。通過觀察串的模式匹配的算法,大致了解他的一般步驟,令s為目標(biāo)串,t為模式串,設(shè)i指針和j指針,若s的i指針和t的j指針指向的字符相同,則指針加1,接著比較后面的字符是否相同,若不相同,則保持i不變,將j指針右移,比較是否相同,知道比較完整個(gè)字符串為止。而且知道KMP算法的時(shí)間復(fù)雜度為O(n+m),所以這種算法不僅時(shí)間復(fù)雜度低,而且便于理解。另外,我們在掌握串的匹配模式時(shí),還應(yīng)該關(guān)注串的一些基本運(yùn)算,理解串的基本概念和特征的基礎(chǔ),了解串的內(nèi)部表示和處理方法。字符串時(shí)一種特殊的線性表。特殊之處在于表中的每一個(gè)元素都是,在串的基本操作中,有聯(lián)接,求串長、求子串、比較串的大小、串的插入、刪除、子串的定位和置換。二、第二類題目(宋體,四號,加粗)1.問題陳述(宋體,小四,單倍行距)給定一個(gè)計(jì)算機(jī)網(wǎng)絡(luò)以及機(jī)器間的雙向連線列表,每一條連線允許兩端的計(jì)算機(jī)進(jìn)行直接的文件傳輸,其他計(jì)算機(jī)間若存在一條連通路徑,也可以進(jìn)行間接的文件傳輸。請寫出程序判斷:任意指定兩臺計(jì)算機(jī),它們之間是否可以進(jìn)行文件傳輸?2.需求分析輸入要求:輸入若干測試數(shù)據(jù)組成。對于每一組測試,第1行包含一個(gè)整數(shù)N(≤10000),即網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù),因而每臺計(jì)算機(jī)可用1到N之間的一個(gè)正整數(shù)表示。接下來的幾行輸入格式為IC1C2或者C或者CC1C2或者S,其中C1和C2是兩臺計(jì)算機(jī)的序號,I表示在C1和C2間輸入一條連線,C表示檢查C1和C2間是否可以傳輸文件,S表示該組測試結(jié)束。當(dāng)N為0時(shí),表示全部測試結(jié)束,不要對該數(shù)據(jù)做任何處理。輸出要求:對每一組C開頭的測試,檢查C1和C2間是否可以傳輸文件,若可以,則在一行中輸出“yes”,否則輸出“no”。當(dāng)讀到S時(shí),檢查整個(gè)網(wǎng)絡(luò)。若網(wǎng)絡(luò)中任意兩機(jī)器間都可以傳輸文件,則在一行中輸出“Thenetworkisconnected.”,否則輸出“Therearekcomponents.”,其中k是網(wǎng)絡(luò)中連通集的個(gè)數(shù)。兩組測試數(shù)據(jù)之間請輸出一空行分隔。概要設(shè)計(jì)設(shè)計(jì)框架mainmainfindInitfindInithebin(1)初始化樹類型的并查集voidinit(intn)(2)查找元素所在集合每棵樹表示一個(gè)集合,樹的根作為集合的“代表元”。對于Find操作,實(shí)際上沿著父指針向上找到根即可。find(inte)//路徑壓縮尋找祖先時(shí)我們一般采用遞歸查找,但是當(dāng)元素很多亦或是整棵樹變?yōu)橐粭l鏈時(shí),每次Find(x)都是O(n)的復(fù)雜度,為減小這個(gè)復(fù)雜度用路徑壓縮,即當(dāng)我們經(jīng)過"遞推"找到祖先節(jié)點(diǎn)后,"回溯"的時(shí)候順便將它的子孫節(jié)點(diǎn)都直接指向祖先,這樣以后再次Find(x)時(shí)復(fù)雜度就變成O(1)了。find(inte)(3)合并分離的兩個(gè)樹對于hebin操作,分別找到A,B的代表元size[A],size[B],如果size[A]=size[B],不進(jìn)行任何操作。否則令parent[B]=A,或parent[A]=B,即可把兩棵樹合并hebin(intA,intB)(4)main()主函數(shù)4.詳細(xì)設(shè)計(jì)原理:在查找祖先時(shí),找到后對路徑上的所有節(jié)點(diǎn),修改其父親,使它直接連接根結(jié)點(diǎn)。正確性證明:設(shè)x所在集合的根結(jié)點(diǎn)為p,在Father(x)的路徑上的某節(jié)點(diǎn)為y,當(dāng)找到p=Father(x)后,因?yàn)橥窘?jīng)y節(jié)點(diǎn)并且,所以必調(diào)用了Father(y)來找p,所以Father(y)必然為p。當(dāng)使fa[y]=p后,F(xiàn)ather(y)仍然是p,所以不會改變y點(diǎn)的基本屬性,這種做法是可行的。(1)初始化并查集A.數(shù)組voidinit(intn){for(inti=1;i<=n;++i){parent[i]=i;size[i]=1;}}B.結(jié)構(gòu)體voidMAKE_SET(UFStreet[],intN){ inti;//定義整型變量 for(i=1;i<=N;i++)//當(dāng)個(gè)數(shù)小于輸入的N時(shí)循環(huán) { t[i].data=i;//數(shù)據(jù)為該人的編號 t[i].rank=0;//秩初始化為0 t[i].parent=i;//雙親初始化指向自己 }}結(jié)構(gòu)體定義typedefstructnode { intdata;//節(jié)點(diǎn)對應(yīng)人的編號 intrank;//節(jié)點(diǎn)對應(yīng)秩 intparent;//定義雙親節(jié)點(diǎn) }UFStree;(2)find(inte)A.數(shù)組每棵樹表示一個(gè)集合,樹的根作為集合的“代表元”。對于Find操作,實(shí)際上沿著父指針向上找到根即可。find(inte)//路徑壓縮{if(e==parent[e])returne;parent[e]=find(parent[e]);returnparent[e];}//這里用遞歸實(shí)現(xiàn),每次查詢的時(shí)間復(fù)雜度是樹的深度,約為O(1)。B.結(jié)構(gòu)體intFIND_SET(UFStreet[],intx)//在x所在的子樹中查找集合編號{if(x!=t[x].parent)//雙親不是自己return(FIND_SET(t,t[x].parent));//遞歸在雙親中找xelse//雙親是自己,即為只有本身一個(gè)元素 returnx;//返回x}(3)hebin(intA,intB)A.數(shù)組對于hebin操作,分別找到A,B的代表元size[A],size[B],如果size[A]=size[B],不進(jìn)行任何操作。否則令parent[B]=A,或parent[A]=B,即可把兩棵樹合并。hebin(intA,intB){if(size[A]>=size[B]){size[A]+=size[B];parent[B]=A;}else{size[B]+=size[A];parent[A]=B;}}B.結(jié)構(gòu)體voidUNION(UFStreet[],intx,inty)//合并x和y所在的子樹 { x=FIND_SET(t,x);//在x所在的子樹中查找集合編號 y=FIND_SET(t,y);//在y所在的子樹中查找集合編號 if(t[x].rank>t[y].rank)//y節(jié)點(diǎn)的秩小于x節(jié)點(diǎn)的秩 t[y].parent=x;//將y連接到x節(jié)點(diǎn)上,x作為y的雙親節(jié)點(diǎn) else//y節(jié)點(diǎn)的秩大于等于x節(jié)點(diǎn)的秩 { t[x].parent=y;//將x連接到y(tǒng)節(jié)點(diǎn)上,y作為x的雙親節(jié)點(diǎn) if(t[x].rank==t[y].rank)//x和y節(jié)點(diǎn)的秩相同 t[y].rank++;//y節(jié)點(diǎn)的秩增加1 } }(4)main主函數(shù)A.數(shù)組intmain(){intn,count;//定義整型變量intu,v,r1,r2;//定義兩臺電腦為u,v,他們的編號為r1,r2charoper;//定義字符型變量printf("請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):");while(scanf("%d",&n)!=EOF)//當(dāng)輸入的n不為-1,執(zhí)行循環(huán){if(n==0)break;//當(dāng)n為0時(shí),全部測試結(jié)束 if(n<1||n>MAX)//網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù)N(≤10000),不在范圍內(nèi)即為越界 { printf("數(shù)據(jù)越界,請重新輸入!"); continue;//結(jié)束本次循環(huán),重新輸入 }init(n);//初始化并查集printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n");while(scanf("%s",&oper)!=EOF)//從鍵盤上輸入字符,當(dāng)不為-1時(shí),執(zhí)行循環(huán) {if(oper!='S'&&oper!='C'&&oper!='I')//如果不為S,C,I中的一個(gè),則命令錯(cuò)誤 { printf("命令錯(cuò)誤,請重新輸入!"); continue;//結(jié)束本次循環(huán),重新輸入 }if(oper=='I')//輸入為I,表示在兩臺計(jì)算機(jī)之間輸入一條連線{printf("請輸入兩臺計(jì)算機(jī)的序號:");scanf("%d%d",&u,&v);//從鍵盤上輸入兩個(gè)計(jì)算機(jī)的編號hebin(u,v);//合并包含A,B元素的集合printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n");}elseif(oper=='C')//當(dāng)輸入為C時(shí),判斷兩個(gè)計(jì)算機(jī)之間能否傳輸文件,即是否連通{printf("請輸入兩臺計(jì)算機(jī)的序號:");scanf("%d%d",&u,&v);//從鍵盤上輸入兩個(gè)計(jì)算機(jī)的編號r1=find(u);//在u所在的子樹中查找集合編號r2=find(v);//在v所在的子樹中查找集合編號if(r1!=r2)//如果集合編號不相同 {printf("no\n");//則表示兩個(gè)計(jì)算機(jī)之間不能傳輸文件printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n"); }else//如果集合編號相同 {printf("yes\n");//則表示兩個(gè)計(jì)算機(jī)之間能夠傳輸文件printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n"); }}elseif(oper=='S')//當(dāng)輸入為S時(shí),表示本組測試結(jié)束{count=0;//初始化count為0for(inti=1;i<=n;++i){if(i==parent[i])//如果在e的值等于雙親數(shù)組中e位置的值,表示集合中只有e一個(gè)元素count++;//則統(tǒng)計(jì)計(jì)算機(jī)數(shù)的count自增}if(count==1)//如果count為1,則表示所有計(jì)算機(jī)在同一個(gè)集合,計(jì)算機(jī)之間連通 {printf("Thenetworkisconnected\n\n");//表示網(wǎng)絡(luò)的計(jì)算機(jī)之間可以互相傳輸文件printf("\n請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):"); }else//如果count的值不為1,則輸出網(wǎng)絡(luò)中有幾個(gè)分離集合樹 {printf("Thereare%dcomponents\n\n",count);//輸出并查集中的分離集合樹的數(shù)目printf("\n請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):"); }break;}}}return0;}B.結(jié)構(gòu)體voidmain(){intn,count;//定義整型變量n,countintu,v,r1,r2;//定義兩臺電腦為u,v,他們的編號為r1,r2charoper;//定義字符型變量 UFStreet[MAX+1];//定義樹類型的并查集printf("請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):");while(scanf("%d",&n)!=EOF)//當(dāng)輸入的n不為-1,執(zhí)行循環(huán){if(n==0)break;//當(dāng)n為0時(shí),全部測試結(jié)束 if(n<1||n>MAX)//網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù)N(≤10000),不在范圍內(nèi)即為越界 { printf("數(shù)據(jù)越界,請重新輸入!"); continue;//結(jié)束本次循環(huán),重新輸入 } MAKE_SET(t,n);//初始化并查集printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n");while(scanf("%s",&oper)!=EOF)//從鍵盤上輸入字符,當(dāng)不為-1時(shí),執(zhí)行循環(huán){ if(oper!='S'&&oper!='C'&&oper!='I')//如果不為S,C,I中的一個(gè),則命令錯(cuò)誤 { printf("命令錯(cuò)誤,請重新輸入!"); continue;//結(jié)束本次循環(huán),重新輸入 }if(oper=='I')//輸入為I,表示在兩臺計(jì)算機(jī)之間輸入一條連線{printf("請輸入兩臺計(jì)算機(jī)C1,C2的序號:");scanf("%d%d",&u,&v);//從鍵盤上輸入兩個(gè)計(jì)算機(jī)的編號UNION(t,u,v);//合并兩個(gè)計(jì)算機(jī)集合printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n");} elseif(oper=='C')//當(dāng)輸入為C時(shí),判斷兩個(gè)計(jì)算機(jī)之間能否傳輸文件,即是否連通{printf("請輸入兩臺計(jì)算機(jī)C1,C2的序號:");scanf("%d%d",&u,&v);//從鍵盤上輸入兩個(gè)計(jì)算機(jī)的編號r1=FIND_SET(t,u);//在x所在的子樹中查找集合編號r2=FIND_SET(t,v);//在y所在的子樹中查找集合編號if(r1!=r2)//如果集合編號不相同 {printf("no\n");//則表示兩個(gè)計(jì)算機(jī)之間不能傳輸文件printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n"); }else//如果集合編號相同 {printf("yes\n");//則表示兩個(gè)計(jì)算機(jī)之間能夠傳輸文件printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n"); }}elseif(oper=='S')//當(dāng)輸入為S時(shí),表示本組測試結(jié)束{count=0;//初始化count為0for(inti=1;i<=n;++i){if(i==t[i].parent)//如果雙親節(jié)點(diǎn)指向自己,則表示根節(jié)點(diǎn)count++;//則統(tǒng)計(jì)計(jì)算機(jī)數(shù)的count自增}if(count==1)//如果count為1,則表示所有計(jì)算機(jī)擁有同一個(gè)根,計(jì)算機(jī)之間連通 {printf("Thenetworkisconnected\n\n");//表示網(wǎng)絡(luò)的計(jì)算機(jī)之間可以互相傳輸文件printf("\n\n請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):"); }else//如果count的值不為1,則輸出網(wǎng)絡(luò)中有幾個(gè)分離集合樹 {printf("Thereare%dcomponents\n\n",count);//輸出并查集中的分離集合樹的數(shù)目printf("\n\n請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):"); }break;}}}}5.程序代碼(1)數(shù)組#include<stdio.h>#defineMAX10001//定義MAX常量intparent[MAX];//定義雙親數(shù)組intsize[MAX];//定義樹的高度數(shù)組//初始化voidinit(intn){for(inti=1;i<=n;++i)//當(dāng)i小于輸入的計(jì)算機(jī)臺數(shù),執(zhí)行循環(huán){parent[i]=i;//將i的值賦給雙親數(shù)組,初始化size[i]=1;//將樹的高度初始化為1}}voidhebin(intA,intB)//元素少的集合合并到元素多的集合中,降低樹的高度{if(size[A]>=size[B])//如果保存A的數(shù)組的大小大于等于保存B的數(shù)組{size[A]+=size[B];//將保存A的數(shù)組大小擴(kuò)大到A和B的數(shù)組之和parent[B]=A;//將A添加到B的雙親數(shù)組中,即將A作為B的雙親}else//如果保存A的數(shù)組的小于等于保存B的數(shù)組{size[B]+=size[A];//將保存B的數(shù)組大小擴(kuò)大到A和B的數(shù)組之和parent[A]=B;//將B添加到A的雙親數(shù)組中,即將B作為A的雙親}}//在集合中找元素intfind(inte)//路徑壓縮{if(e==parent[e])//如果在e的值等于雙親數(shù)組中e位置的值,表示集合中只有e一個(gè)元素returne;//則返回元素e,也是e集合parent[e]=find(parent[e]);//如果,e的值與雙親中e的值不等,表明還有其他元素,遞歸在雙親數(shù)組中找ereturnparent[e];//返回包含元素e的集合}intmain(){intn,count;//定義整型變量intu,v,r1,r2;//定義兩臺電腦為u,v,他們的編號為r1,r2charoper;//定義字符型變量printf("請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):");while(scanf("%d",&n)!=EOF)//當(dāng)輸入的n不為-1,執(zhí)行循環(huán){if(n==0)break;//當(dāng)n為0時(shí),全部測試結(jié)束 if(n<1||n>MAX)//網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù)N(≤10000),不在范圍內(nèi)即為越界 { printf("數(shù)據(jù)越界,請重新輸入!"); continue;//結(jié)束本次循環(huán),重新輸入 }init(n);//初始化并查集printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n");while(scanf("%s",&oper)!=EOF)//從鍵盤上輸入字符,當(dāng)不為-1時(shí),執(zhí)行循環(huán) {if(oper!='S'&&oper!='C'&&oper!='I')//如果不為S,C,I中的一個(gè),則命令錯(cuò)誤 { printf("命令錯(cuò)誤,請重新輸入!"); continue;//結(jié)束本次循環(huán),重新輸入 }if(oper=='I')//輸入為I,表示在兩臺計(jì)算機(jī)之間輸入一條連線{printf("請輸入兩臺計(jì)算機(jī)的序號:");scanf("%d%d",&u,&v);//從鍵盤上輸入兩個(gè)計(jì)算機(jī)的編號hebin(u,v);//合并包含A,B元素的集合printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n");}elseif(oper=='C')//當(dāng)輸入為C時(shí),判斷兩個(gè)計(jì)算機(jī)之間能否傳輸文件,即是否連通{printf("請輸入兩臺計(jì)算機(jī)的序號:");scanf("%d%d",&u,&v);//從鍵盤上輸入兩個(gè)計(jì)算機(jī)的編號r1=find(u);//在u所在的子樹中查找集合編號r2=find(v);//在v所在的子樹中查找集合編號if(r1!=r2)//如果集合編號不相同 {printf("no\n");//則表示兩個(gè)計(jì)算機(jī)之間不能傳輸文件printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n"); }else//如果集合編號相同 {printf("yes\n");//則表示兩個(gè)計(jì)算機(jī)之間能夠傳輸文件printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n"); }}elseif(oper=='S')//當(dāng)輸入為S時(shí),表示本組測試結(jié)束{count=0;//初始化count為0for(inti=1;i<=n;++i){if(i==parent[i])//如果在e的值等于雙親數(shù)組中e位置的值,表示集合中只有e一個(gè)元素count++;//則統(tǒng)計(jì)計(jì)算機(jī)數(shù)的count自增}if(count==1)//如果count為1,則表示所有計(jì)算機(jī)在同一個(gè)集合,計(jì)算機(jī)之間連通 {printf("Thenetworkisconnected\n\n");//表示網(wǎng)絡(luò)的計(jì)算機(jī)之間可以互相傳輸文件printf("\n請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):"); }else//如果count的值不為1,則輸出網(wǎng)絡(luò)中有幾個(gè)分離集合樹 {printf("Thereare%dcomponents\n\n",count);//輸出并查集中的分離集合樹的數(shù)目printf("\n請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):"); }break;}}}return0;}(2)結(jié)構(gòu)體#include<stdio.h>#defineMAX10000typedefstructnode { intdata;//節(jié)點(diǎn)對應(yīng)人的編號 intrank;//節(jié)點(diǎn)對應(yīng)秩 intparent;//定義雙親節(jié)點(diǎn) }UFStree;//定義并查集的節(jié)點(diǎn)類型為樹//初始化并查集樹voidMAKE_SET(UFStreet[],intN){ inti;//定義整型變量 for(i=1;i<=N;i++)//當(dāng)個(gè)數(shù)小于輸入的N時(shí)循環(huán) { t[i].data=i;//數(shù)據(jù)為該人的編號 t[i].rank=0;//秩初始化為0 t[i].parent=i;//雙親初始化指向自己 } } //查找一個(gè)元素所屬的集合,路徑壓縮intFIND_SET(UFStreet[],intx)//在x所在的子樹中查找集合編號{if(x!=t[x].parent)//雙親不是自己return(FIND_SET(t,t[x].parent));//遞歸在雙親中找xelse//雙親是自己,即為只有本身一個(gè)元素 returnx;//返回x}//元素少的集合合并到元素多的集合中,降低樹的高度voidUNION(UFStreet[],intx,inty)//合并x和y所在的子樹 { x=FIND_SET(t,x);//在x所在的子樹中查找集合編號 y=FIND_SET(t,y);//在y所在的子樹中查找集合編號 if(t[x].rank>t[y].rank)//y節(jié)點(diǎn)的秩小于x節(jié)點(diǎn)的秩 t[y].parent=x;//將y連接到x節(jié)點(diǎn)上,x作為y的雙親節(jié)點(diǎn) else//y節(jié)點(diǎn)的秩大于等于x節(jié)點(diǎn)的秩 { t[x].parent=y;//將x連接到y(tǒng)節(jié)點(diǎn)上,y作為x的雙親節(jié)點(diǎn) if(t[x].rank==t[y].rank)//x和y節(jié)點(diǎn)的秩相同 t[y].rank++;//y節(jié)點(diǎn)的秩增加1 } }voidmain(){intn,count;//定義整型變量n,countintu,v,r1,r2;//定義兩臺電腦為u,v,他們的編號為r1,r2charoper;//定義字符型變量 UFStreet[MAX+1];//定義樹類型的并查集printf("請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):");while(scanf("%d",&n)!=EOF)//當(dāng)輸入的n不為-1,執(zhí)行循環(huán){if(n==0)break;//當(dāng)n為0時(shí),全部測試結(jié)束 if(n<1||n>MAX)//網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù)N(≤10000),不在范圍內(nèi)即為越界 { printf("數(shù)據(jù)越界,請重新輸入!"); continue;//結(jié)束本次循環(huán),重新輸入 } MAKE_SET(t,n);//初始化并查集printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n");while(scanf("%s",&oper)!=EOF)//從鍵盤上輸入字符,當(dāng)不為-1時(shí),執(zhí)行循環(huán){ if(oper!='S'&&oper!='C'&&oper!='I')//如果不為S,C,I中的一個(gè),則命令錯(cuò)誤 { printf("命令錯(cuò)誤,請重新輸入!"); continue;//結(jié)束本次循環(huán),重新輸入 }if(oper=='I')//輸入為I,表示在兩臺計(jì)算機(jī)之間輸入一條連線{printf("請輸入兩臺計(jì)算機(jī)C1,C2的序號:");scanf("%d%d",&u,&v);//從鍵盤上輸入兩個(gè)計(jì)算機(jī)的編號UNION(t,u,v);//合并兩個(gè)計(jì)算機(jī)集合printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n");} elseif(oper=='C')//當(dāng)輸入為C時(shí),判斷兩個(gè)計(jì)算機(jī)之間能否傳輸文件,即是否連通{printf("請輸入兩臺計(jì)算機(jī)C1,C2的序號:");scanf("%d%d",&u,&v);//從鍵盤上輸入兩個(gè)計(jì)算機(jī)的編號r1=FIND_SET(t,u);//在u所在的子樹中查找集合編號r2=FIND_SET(t,v);//在v所在的子樹中查找集合編號if(r1!=r2)//如果集合編號不相同 {printf("no\n");//則表示兩個(gè)計(jì)算機(jī)之間不能傳輸文件printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n"); }else//如果集合編號相同 {printf("yes\n");//則表示兩個(gè)計(jì)算機(jī)之間能夠傳輸文件printf("請輸入C(檢查是否可以傳輸文件)、I(輸入一條連線)、S(該組測試結(jié)束)字符:\n"); }}elseif(oper=='S')//當(dāng)輸入為S時(shí),表示本組測試結(jié)束{count=0;//初始化count為0for(inti=1;i<=n;++i){if(i==t[i].parent)//如果雙親節(jié)點(diǎn)指向自己,則表示根節(jié)點(diǎn)count++;//則統(tǒng)計(jì)計(jì)算機(jī)數(shù)的count自增}if(count==1)//如果count為1,則表示所有計(jì)算機(jī)擁有同一個(gè)根,計(jì)算機(jī)之間連通 {printf("Thenetworkisconnected\n\n");//表示網(wǎng)絡(luò)的計(jì)算機(jī)之間可以互相傳輸文件printf("\n\n請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):"); }else//如果count的值不為1,則輸出網(wǎng)絡(luò)中有幾個(gè)分離集合樹 {printf("Thereare%dcomponents\n\n",count);//輸出并查集中的分離集合樹的數(shù)目printf("\n\n請輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù):"); }break;}}}}運(yùn)行結(jié)果與測試(1)輸入的臺數(shù)超過10000和輸入的字符不是C,S,I中的一個(gè)的錯(cuò)誤查找和合并的時(shí)間復(fù)雜度是O()(2)向兩臺計(jì)算機(jī)之間插入一條連線時(shí),能夠保證兩個(gè)計(jì)算機(jī)之間能夠傳輸文件,同時(shí),發(fā)現(xiàn),輸入S,表示本組數(shù)據(jù)測試結(jié)束時(shí),在并查集中有兩個(gè)分離集合樹,因?yàn)?,2序號的兩臺計(jì)算機(jī)已經(jīng)連接,之間可以相互傳輸文件,但網(wǎng)絡(luò)中總共3個(gè)計(jì)算機(jī),而另一個(gè)計(jì)算機(jī)還沒有聲明,所以,不管他是什么,都單獨(dú)作為一個(gè)集合,因此,得到并查集中有兩個(gè)分離的樹第一行,先輸入網(wǎng)絡(luò)中計(jì)算機(jī)的總臺數(shù),然后檢查1,2電腦是否可以傳輸文件,結(jié)果是不可以,然后,在1和2中輸入一條連接,從而連接兩個(gè)電腦,再輸入C判斷兩個(gè)電腦之間可以傳輸文件。再輸入S表示這組測試結(jié)束,發(fā)現(xiàn)這個(gè)網(wǎng)絡(luò)中擁有兩個(gè)部分。第二次,同樣,還是3臺電腦,先在1,3輸入一條連線,然后,在2,3之間輸入一條連線,保證他們之間都能傳輸文件,最后輸入S得到三臺電腦相互之間都能傳輸文件,即網(wǎng)絡(luò)互通。7.設(shè)計(jì)體會與總結(jié)并查集,顧名思義,就是合并A,B所在的集合,反復(fù)查找元素所在集合。兩棵分離集合樹A,B,通過比較他們樹的深度,將深度較小的作為子樹,合并得到的分離集合樹是一棵比較平衡的樹,對應(yīng)的查找與合并的時(shí)間復(fù)雜度也就穩(wěn)定在O(log2n)。通過對并查集的編寫,了解了并查集的初始化,利用遞歸查找一個(gè)元素所屬的集合,合并兩個(gè)元素所屬的集合,也明白并查集的算法是由樹實(shí)現(xiàn)的。因?yàn)椴⒉榧旧聿痪哂薪Y(jié)構(gòu),要借助一定的數(shù)據(jù)結(jié)構(gòu)。并查集反應(yīng)的是一種親戚關(guān)系,本程序先判斷1和2電腦無聯(lián)系,再通過在電腦之間輸入一條連線,即輸入I,建立他們的關(guān)系,然后輸入S,判斷他們有幾個(gè)構(gòu)成部分。并且,本例中,先是1,2建立關(guān)系,后來在3,1之間輸入一條連線,另外,在2,3之間也輸入一條連線,導(dǎo)致存放并查集樹的數(shù)組的的每個(gè)元素,即1,2,3的雙親都指向自己,所以,整個(gè)網(wǎng)絡(luò)都聯(lián)通,也表示他們之間都有關(guān)系。最后,只要控制輸入為S就表示這組測試已經(jīng)結(jié)束,就能夠判斷這個(gè)網(wǎng)絡(luò)的關(guān)系,最后,只要保證輸入的總臺數(shù)為0,從而保證輸入結(jié)束,整個(gè)程序結(jié)束。三、第三類題目(宋體,四號,加粗)1.問題陳述(宋體,小四,單倍行距)針對某一種行業(yè)的庫房的產(chǎn)品進(jìn)銷存情況進(jìn)行管理。(1)采用一定的存儲結(jié)構(gòu)對庫房的貨品及其數(shù)量進(jìn)行分類管理;(2)可以進(jìn)行產(chǎn)品類的添加、產(chǎn)品的添加、產(chǎn)品數(shù)量的添加;(3)能夠查詢庫房每種產(chǎn)品的總量、進(jìn)貨日期、銷出數(shù)量、銷售時(shí)間等;2.需求分析進(jìn)入系統(tǒng)后,管理員就可以對產(chǎn)品的進(jìn)貨,銷售,存貨等方面的信息有個(gè)詳細(xì)的了解。并且可以對產(chǎn)品的類,產(chǎn)品,產(chǎn)品的數(shù)量,產(chǎn)品銷售信息進(jìn)行管理,可以添加新的產(chǎn)品信息。同時(shí)對庫房每種產(chǎn)品的總量、進(jìn)貨日期、銷出數(shù)量、銷售時(shí)間等也可以有詳細(xì)的了解。運(yùn)用鏈表進(jìn)行存儲,同時(shí)用到指針變量,運(yùn)用循環(huán)存儲,對存儲產(chǎn)品的信息要用到日期結(jié)構(gòu)體和產(chǎn)品結(jié)構(gòu)體,對存儲要用到文件指針以及文件法的使用。要找到鏈表的指針變量,對指針變量進(jìn)行修改,然后再進(jìn)行產(chǎn)品的出入。定義一個(gè)查詢函數(shù),對產(chǎn)品類的指針變量進(jìn)行循環(huán)查詢,再對產(chǎn)品的指針變量進(jìn)行循環(huán)查詢,找到產(chǎn)品時(shí),在調(diào)用顯示產(chǎn)品信息函數(shù),顯示查詢到的產(chǎn)品的各項(xiàng)信息。3.概要設(shè)計(jì)為了能夠提高內(nèi)存的利用及各功能的實(shí)現(xiàn),程序主要使用了:線性表的鏈?zhǔn)酱鎯?,分配存儲空間,空間可擴(kuò)展性強(qiáng),方便頻繁的錄入、插入、查找、刪除和排序等而不占用多余的內(nèi)存。(主要應(yīng)用)文件文本的讀取與寫入,為了方便用戶更加快速的執(zhí)行管理操作。結(jié)構(gòu)體的定義,定義了產(chǎn)品結(jié)構(gòu)體和日期結(jié)構(gòu)體。登錄用戶時(shí)的字符串讀取及驗(yàn)證(1)錄入產(chǎn)品函數(shù)LinkListgoods_input()//運(yùn)用鏈?zhǔn)酱鎯Ξa(chǎn)品信息寫入文件的函數(shù)voidfile_write(Node*p)文件中的信息讀出的函數(shù)LinkListfile_read()(2)查找產(chǎn)品函數(shù)voidgoods_find()(3)修改信息函數(shù)voidgoods_change()(4)插入產(chǎn)品函數(shù)voidgoods_insert()(5)刪除產(chǎn)品函數(shù)voidgoods_delete()(6)產(chǎn)品信息排序函數(shù)voidgoods_rank()(7)產(chǎn)品信息統(tǒng)計(jì)函數(shù)voidvoidgoods_tongji()(8)注冊、登陸及密碼保護(hù)函數(shù)voidapply()intload()voidkey()(9)主函數(shù)voidmain()設(shè)計(jì)框架主菜單主菜單統(tǒng)計(jì)產(chǎn)品信息產(chǎn)品信息排序刪除產(chǎn)品信息插入產(chǎn)品信息修改產(chǎn)品信息查找產(chǎn)品信息錄入產(chǎn)品品信息統(tǒng)計(jì)產(chǎn)品信息產(chǎn)品信息排序刪除產(chǎn)品信息插入產(chǎn)品信息修改產(chǎn)品信息查找產(chǎn)品信息錄入產(chǎn)品品信息程序流程圖開始開始修改產(chǎn)品信息查找產(chǎn)品信息錄入產(chǎn)品品信息刪除產(chǎn)品信息插入產(chǎn)品信息根據(jù)a的值選擇相應(yīng)的函數(shù)操作輸入0~7修改產(chǎn)品信息查找產(chǎn)品信息錄入產(chǎn)品品信息刪除產(chǎn)品信息插入產(chǎn)品信息根據(jù)a的值選擇相應(yīng)的函數(shù)操作輸入0~7選0選0退出退出產(chǎn)品信息排序統(tǒng)計(jì)產(chǎn)品信息產(chǎn)品信息排序統(tǒng)計(jì)產(chǎn)品信息結(jié)束結(jié)束4.詳細(xì)設(shè)計(jì)(1)錄入產(chǎn)品函數(shù)LinkListgoods_input()//運(yùn)用鏈?zhǔn)酱鎯?shù)據(jù)錄入是該軟件必備的基本功能當(dāng)鏈表為空時(shí),對產(chǎn)品信息變量“產(chǎn)品號”判斷并進(jìn)行錄入,系統(tǒng)調(diào)用錄入函數(shù),在用戶輸入產(chǎn)品信息后添加到鏈表里,在添加過程中按提示自動插入到相應(yīng)位置。添加成功后,返回主菜單并提示用戶保存到自建的文本中,并可以根據(jù)各個(gè)模塊要求進(jìn)行讀取修改。LinkListgoods_input(){LinkListL;Node*p1,*p2;inti=1;voidfile_write(Node*p);intflag=1;L=p2=(Node*)malloc(sizeof(Node));//為頭節(jié)點(diǎn)分配存儲空間while(flag){ p1=(Node*)malloc(sizeof(Node));printf("請輸入第%d種產(chǎn)品的信息(產(chǎn)品號為0時(shí),結(jié)束產(chǎn)品輸入):\n\n",i++); flushall(); printf("產(chǎn)品號:"); scanf("%ld",&p1->num); if(p1->num!=0) { flushall();//i/o庫函數(shù)清除緩沖 printf("名稱:"); scanf("%s",&p1->name); flushall(); printf("類別:"); scanf("%s",&p1->kind); flushall(); printf("生產(chǎn)日期(年★月★日用空格隔開):"); scanf("%d%d%d",&p1->pro_date.year,&p1->pro_date.month,&p1->pro_date.day); flushall(); printf("保質(zhì)期:"); scanf("%d",&p1->save_day); flushall(); printf("產(chǎn)品總量:"); scanf("%d",&p1->zongliang);flushall(); printf("產(chǎn)品銷量:"); scanf("%d",&p1->xiaoliang); flushall(); printf("進(jìn)價(jià):");scanf("%f",&p1->jinjia); flushall(); printf("售價(jià):"); scanf("%f",&p1->shoujia); flushall();printf("銷售日期(年☆月☆日用空格隔開):"); scanf("%d%d%d",&p1->sale_date.year,&p1->sale_date.month,&p1->sale_date.day); p2->next=p1; p2=p1; } else { flag=0; break; }}p2->next=NULL;file_write(L);free(p1);return(L);}產(chǎn)品信息寫入文件的函數(shù)voidfile_write(Node*p)利用fprintf將信息輸入到文件中,從而進(jìn)行保存。文件是創(chuàng)建在E盤,以文本文檔形式呈現(xiàn)的文件。voidfile_write(Node*p){FILE*fp; intc; printf("是否保存?(保存按1;不保存按0):");scanf("%d",&c); if(c==1) {flushall(); fp=fopen("E:\\產(chǎn)品.txt","w");//文件寫入if(fp==NULL) { printf("\nthisfilecannotbeopen!"); exit(1); }p=p->next; while(p!=NULL) { fprintf(fp,"%ld%s%s%d%d%d%d%d%d%f%f%d%d%d\n",p->num,p->name,p->kind,p->pro_date.year,p->pro_date.month,p->pro_date.day,p->save_day,p->zongliang,p->xiaoliang,p->jinjia,p->shoujia,p->sale_date.year,p->sale_date.month,p->sale_date.day); p=p->next; } fclose(fp); printf("文件保存成功!"); }}文件中的信息讀出的函數(shù)LinkListfile_read()利用fscanf進(jìn)行對文件中信息的讀寫,文件是創(chuàng)建在E盤,以文本文檔形式呈現(xiàn)的文件。LinkListfile_read(){ FILE*fp; LinkListL;Node*p1,*p2; inti,k=0,t=-2; flushall(); printf("請輸入此時(shí)產(chǎn)品的總數(shù):"); scanf("%d",&i);fp=fopen("E:\\產(chǎn)品.txt","r");//文件讀出L=p2=(Node*)malloc(sizeof(Node));//為頭節(jié)點(diǎn)分配存儲空間while(t!=EOF&&k<i) { p1=(Node*)malloc(sizeof(Node)); t=fscanf(fp,"%ld%s%s%d%d%d%d%d%d%f%f%d%d%d",&p1->num,p1->name,p1->kind,&p1->pro_date.year,&p1->pro_date.month,&p1->pro_date.day,&p1->save_day,&p1->zongliang,&p1->xiaoliang,&p1->jinjia,&p1->shoujia,&p1->sale_date.year,&p1->sale_date.month,&p1->sale_date.day); p2->next=p1; p2=p1; k++; } p2->next=NULL; fclose(fp); returnL;}(2)查找產(chǎn)品函數(shù)voidgoods_find()查找產(chǎn)品是信息管理的基本功能,當(dāng)數(shù)據(jù)很多時(shí)怎么快速找到產(chǎn)品對管理員來說很重要,系統(tǒng)調(diào)用查找函數(shù)模塊,顯示查找菜單。根據(jù)提示輸入需要查找的“產(chǎn)品號”進(jìn)行查找,查找成功,用戶會看到查找產(chǎn)品的詳細(xì)信息,如沒有該產(chǎn)品,則查找失敗,查找函數(shù)設(shè)計(jì):voidgoods_find(){ longsnum; intflag=0,t; Node*p0,*p1; p1=p0=file_read(); while(1) { flag=0; printf("請輸入你要查找的產(chǎn)品信息的產(chǎn)品號:"); scanf("%ld",&snum); while(p0->next!=NULL) { p0=p0->next; if(p0->num==snum) { flag=1; break; } } if(flag==1) {printf("☆★該產(chǎn)品的信息如下:\n\n"); printf("產(chǎn)品號名稱類別生產(chǎn)日期保質(zhì)期總量銷量進(jìn)價(jià)售價(jià)銷售日期\n"); printf("%3d%8s%5s%6d-%02d-%02d%5d%5d%6d%8.2f%8.2f%6d-%02d-%02d\n",p0->num,p0->name,p0->kind,p0->pro_date.year,p0->pro_date.month,p0->pro_date.day,p0->save_day,p0->zongliang,p0->xiaoliang,p0->jinjia,p0->shoujia,p0->sale_date.year,p0->sale_date.month,p0->sale_date.day); } else printf("☆★此產(chǎn)品號不存在,查找失敗!★☆\n");p0=p1; printf("結(jié)束查找按0,繼續(xù)查找按1:"); scanf("%d",&t); if(t==0) break; }}(3)修改信息函數(shù)voidgoods_change()主函數(shù)能夠調(diào)用修改函數(shù),先打開E盤中的產(chǎn)品文本,輸入要修改的產(chǎn)品號,如果能夠與文件中的產(chǎn)品號匹配,則用switch又拋出幾個(gè)選項(xiàng),分別修改文件中產(chǎn)品的各項(xiàng)信息。最后,再將修改后的結(jié)果存放在產(chǎn)品文本文檔中。voidgoods_change(){Node*p1,*p0,*p2;intc,flag=0,t; longsnum; p2=p0=file_read(); while(1){ flag=0; p1=p0->next; if(p1==NULL)flag=0; printf("請輸入你要修改的產(chǎn)品信息的產(chǎn)品號:"); scanf("%ld",&snum); while(p1!=NULL) { if(p1->num==snum) { flag=1; break; } p1=p1->next; } if(flag==1) { printf("☆1:產(chǎn)品號;\n"); printf("☆2:產(chǎn)品名稱;\n"); printf("☆3:產(chǎn)品類別;\n");printf("☆4:產(chǎn)品生產(chǎn)日期;\n");printf("☆5:產(chǎn)品保質(zhì)期;\n"); printf("☆6:產(chǎn)品總量\n");printf("☆7:產(chǎn)品銷量\n"); printf("☆8:產(chǎn)品進(jìn)價(jià)\n"); printf("☆9:產(chǎn)品售價(jià)\n"); printf("☆10:產(chǎn)品銷售日期\n"); printf("☆★請選擇修改的內(nèi)容(1~9):"); scanf("%d",&c); while(1) { if(c==1||c==2||c==3||c==4||c==5||c==6||c==7||c==8||c==9||c==10)break; else { printf("\n輸入有誤,請重新輸入!\n清選擇(1~9):");scanf("%d",&c); if(c==1||c==2||c==3||c==4||c==5||c==6||c==7||c==8||c==9||c==10)break; } } switch(c) { case1: { printf("\n輸入修改后的產(chǎn)品號:"); scanf("%ld",&p1->num);break; } case2: { printf("輸入修改后的產(chǎn)品名:"); scanf("%s",&p1->name);break; } case3: { printf("輸入修改后的產(chǎn)品類別:"); scanf("%s",&p1->kind);break; } case4: { printf("輸入修改后的產(chǎn)品生產(chǎn)日期(年★月★日之間用空格隔開):"); scanf("%d%d%d",&p1->pro_date.year,&p1->pro_date.month,&p1->pro_date.day);break; } case5: { printf("輸入修改后的產(chǎn)品保質(zhì)期:"); scanf("%d",&p1->save_day);break; } case6: { printf("輸入修改后的產(chǎn)品總量:"); scanf("%d",&p1->zongliang);break; }case7: { printf("輸入修改后的產(chǎn)品銷量:"); scanf("%d",&p1->xiaoliang);break; } case8: { printf("輸入修改后的產(chǎn)品進(jìn)價(jià):"); scanf("%f",&p1->
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年全球及中國可吸收三氯生涂層抗菌縫合線行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國超寬帶雷達(dá)傳感器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球阻燃聚乙烯膜行業(yè)調(diào)研及趨勢分析報(bào)告
- 飯店房屋租賃合同范文
- 建筑工程掛靠內(nèi)部協(xié)議合同
- 2025佳兆業(yè)集團(tuán)年度低壓柜設(shè)備戰(zhàn)略采購合同
- 虛擬股合伙協(xié)議合同范本
- 2025工程建設(shè)招標(biāo)設(shè)標(biāo)合同條件第1部分
- 直播帶貨商家簽約的合同范本
- 2025房地產(chǎn)委托開發(fā)合同酬金
- 【七上HK數(shù)學(xué)】安徽省蚌埠市固鎮(zhèn)縣2024-2025學(xué)年七年級上學(xué)期1月期末試卷數(shù)學(xué)試題
- 電信網(wǎng)和互聯(lián)網(wǎng)圖像篡改檢測技術(shù)要求與測試方法
- 2025屆江蘇省南京市鹽城市高三一??荚囌Z文試題 課件
- 《水稻生長進(jìn)程》課件
- 2024版企業(yè)高管職務(wù)任命書3篇
- 中國版梅尼埃病診斷指南解讀
- 創(chuàng)業(yè)投資管理知到章節(jié)答案智慧樹2023年武漢科技大學(xué)
- 暨南大學(xué)《經(jīng)濟(jì)學(xué)》考博歷年真題詳解(宏觀經(jīng)濟(jì)學(xué)部分)
- GB/T 8014.1-2005鋁及鋁合金陽極氧化氧化膜厚度的測量方法第1部分:測量原則
- eNSP簡介及操作課件
- 運(yùn)動技能學(xué)習(xí)與控制課件第七章運(yùn)動技能的協(xié)調(diào)控制
評論
0/150
提交評論