第一篇:數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告
數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告
班級(jí):13軟件二班
姓名:殷健 學(xué)號(hào):1345536225
子集和數(shù)問(wèn)題
1:?jiǎn)栴}描述
子集和數(shù)問(wèn)題1:子集和問(wèn)題的為〈W,c〉。其中,W={w1,w2,...,wn}是一個(gè)正整數(shù)的集合,子集和數(shù)問(wèn)題判定是否存在W的一個(gè)子集W1,使得∑W1=c∑W(0 程序中設(shè)計(jì)了函數(shù)void computeSumofSub(int s,int k,int r),其意義是從第k項(xiàng)開(kāi)始,如果s(已經(jīng)決策的和數(shù))和w[k](當(dāng)前元素)之和為和數(shù),就把結(jié)果輸出來(lái),否則如果s與,w[k],w[k+1]之和小于和數(shù),則調(diào)用computeSumofsub(s+w[k],k+1,r-w[k]),意為選擇此結(jié)點(diǎn)的左分支,再判斷s和后面所有元素之和是否不小于M(所有的加起來(lái)都小,必定無(wú)解),并且s+w[k+1]<=M(由于輸入的數(shù)據(jù)要求是從小到大且無(wú)重復(fù)元素,所以若s+w[k+1])>M,也是無(wú)解),若條件符合即調(diào)用computeSumofSub(s,k+1,r-w[k]),即選擇當(dāng)前結(jié)點(diǎn)的右分支。 算法展示: #include int m;int x[M];public: SumOfSub(int a[], int b, int n){ for(int i=0;i };void main(){ int sum=0;int w[M];srand((unsigned)time(NULL)); for(int i=0;i } cout<<“隨機(jī)數(shù)組為:”;cout< cout<<“符合條件的子集為:”;for(int i=0;i<=k;i++){ } cout< } cout<<“數(shù)組元素總和為:”< 復(fù)雜性分析: 對(duì)于不同的輸入結(jié)果,算法的執(zhí)行次數(shù)有所不同,最好情況是n,最壞情況是n*2^n。盡管差異很大,但當(dāng)n很大時(shí),對(duì)某些輸入而言,回溯法仍可在短時(shí)間內(nèi)求解。其它說(shuō)明: 按書中所講的約束條件,程序中所有變量都是整型,輸入的各元素要從小到大輸入,而且不能有重復(fù)的元素。若是想要無(wú)序輸入,可以程序中加入程序1.c的歸并排序算法,對(duì)輸入的數(shù)組排序即可。 拓展一 問(wèn)題描述: 子集和數(shù)問(wèn)題拓展一:子集和問(wèn)題的為〈W,c,p〉。其中,W={w1,w2,...,wn}是一個(gè)正整數(shù)的集合,子集和數(shù)問(wèn)題判定是否存在W的一個(gè)子集W1,使得∑W1=c∑W(0 問(wèn)題分析: 增加一個(gè)數(shù)組p,使得p的每個(gè)元素與w對(duì)應(yīng)元素關(guān)系為pi=Wi+10;最后結(jié)果W子集中元素個(gè)數(shù)越多,則p和最大,但也可以將每個(gè)符合條件子集對(duì)應(yīng)P集合的元素和計(jì)算出做個(gè)比較,然后輸出最大的再對(duì)應(yīng)原W子集。 算法演示 #include int N[M];int max;int j;public: SumOfSub(int a[], int b, int n){ max=0;j=0; for(int i=0;i w[i]=a[i]; p[i]=a[i]+10; } m = b; x[0]=n;} void computeSumOfSub(int s, int k, int r){ x[k] = 1;if(s+w[k] == m){ printResult(k);cout<<“ ”; } else if(s+w[k]+w[k+1] <= m){ computeSumOfSub(s+w[k],k+1,r-w[k]);} if(s+r-w[k]>=m&&s+w[k+1]<= m){ x[k] = 0;computeSumOfSub(s, k+1, r-w[k]);} } void printResult(int k){ int S=0;int i; cout<<“符合條件的子集為:”; for(i=0;i<=k;i++){ if(x[i] == 1){ S=S+p[i]; cout< } cout<<“p和為:”< cout< if(S>max){ max=S; int J=0; for(i=0;i<=k;i++){ if(x[i]==1){ N[J]=w[i]; J++; } } j=J; } } void special(){ cout< for(int i=0;i cout< } cout< for(int i=0;i w[i]=rand(); if(w[i]==0){ w[i]=rand(); } sum=sum+w[i];} cout<<“隨機(jī)數(shù)組為:”;for(i=0;i cout< r += w[i];} sumOfSub.computeSumOfSub(0, 0, r); sumOfSub.special();} 運(yùn)行結(jié)果 復(fù)雜性分析 對(duì)于不同的輸入結(jié)果,算法的執(zhí)行次數(shù)有所不同,最好情況是n,最壞情況是n*2^n。盡管差異很大,但當(dāng)n很大時(shí),對(duì)某些輸入而言,回溯法仍可在短時(shí)間內(nèi)求解。 拓展二 問(wèn)題描述 子集和數(shù)問(wèn)題拓展一:子集和問(wèn)題的為〈W,c,P〉。其中,W={w1,w2,...,wn}是一個(gè)正整數(shù)的集合,子集和數(shù)問(wèn)題判定是否存在W的一個(gè)子集W1,使得∑W1=c∑W(0 問(wèn)題分析 增加一個(gè)數(shù)組隨機(jī)數(shù)組P,每個(gè)符合條件子集對(duì)應(yīng)P集合的元素和計(jì)算出做個(gè)比較,然后輸出最大的再對(duì)應(yīng)原W子集。 算法演示 #include int x[M];int N[M];int max;int j;public: SumOfSub(int a[], int b, int n){ max=0; j=0; cout<<“隨機(jī)數(shù)組p為:”; for(int i=0;i w[i]=a[i]; p[i]=rand(); cout< } cout< m = b; x[0]=n;} void computeSumOfSub(int s, int k, int r){ x[k] = 1;if(s+w[k] == m){ printResult(k);cout<<“ ”; } else if(s+w[k]+w[k+1] <= m){ computeSumOfSub(s+w[k],k+1,r-w[k]);} if(s+r-w[k]>=m&&s+w[k+1]<= m){ x[k] = 0;computeSumOfSub(s, k+1, r-w[k]);} } void printResult(int k){ int S=0;int i; cout<<“符合條件的子集為:”; for(i=0;i<=k;i++){ if(x[i] == 1){ S=S+p[i]; cout< } cout<<“p和為:”< cout< if(S>max){ max=S; int J=0; for(i=0;i<=k;i++){ if(x[i]==1){ N[J]=w[i]; J++; } } j=J; } } void special(){ cout< for(int i=0;i cout< } cout< for(int i=0;i w[i]=rand(); if(w[i]==0){ w[i]=rand(); } sum=sum+w[i];} cout<<“隨機(jī)數(shù)組w為:”;for(i=0;i cout< r += w[i];} sumOfSub.computeSumOfSub(0, 0, r); sumOfSub.special();} 運(yùn)行結(jié)果 復(fù)雜性分析 對(duì)于不同的輸入結(jié)果,算法的執(zhí)行次數(shù)有所不同,最好情況是n,最壞情況是n*2^n。盡管差異很大,但當(dāng)n很大時(shí),對(duì)某些輸入而言,回溯法仍可在短時(shí)間內(nèi)求解。 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)的實(shí)習(xí)報(bào)告怎么寫呀,請(qǐng)求做過(guò)課設(shè)的同學(xué)發(fā)一篇范文過(guò)來(lái)謝謝-_-規(guī)范實(shí)習(xí)報(bào)告的開(kāi)頭應(yīng)給出題目、班級(jí)、姓名、學(xué)號(hào)和完成日期,并包括以下七個(gè)內(nèi)容: 1、需求分析以無(wú)歧義的陳述說(shuō)明程序設(shè)計(jì)的任務(wù),強(qiáng)調(diào)的是程序要做什么?明確規(guī)定:(1)輸入的形式和輸入值的范圍;(2)輸出的形式;(3)程序所能達(dá)到的功能;(4)測(cè)試數(shù)據(jù):包括正確地輸入及其輸出結(jié)果和含有錯(cuò)誤的輸入及其輸出結(jié)果,數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告。 2、概要設(shè)計(jì)說(shuō)明本程序中用到的所有抽象數(shù)據(jù)類型的定義、主程序的流程以及各程序模塊之間的層次(調(diào)用)關(guān)系。 3、詳細(xì)設(shè)計(jì)實(shí)現(xiàn)概要設(shè)計(jì)中定義的所有數(shù)據(jù)類型,對(duì)每個(gè)操作只需要寫出偽碼算法;對(duì)主程序和其他模塊也都需要寫出偽碼算法(偽碼算法達(dá)到的詳細(xì)程度建議為:按照偽碼算法可以在計(jì)算機(jī)鍵盤直接輸入高級(jí)程序設(shè)計(jì)語(yǔ)言程序);畫出函數(shù)的調(diào)用關(guān)系圖。 4、調(diào)試分析內(nèi)容包括:(1)調(diào)試過(guò)程中遇到的問(wèn)題是如何解決的以及對(duì)設(shè)計(jì)與實(shí)現(xiàn)的回顧討論和分析;(2)算法的時(shí)空分析(包括基本操作和其他算法的時(shí)間復(fù)雜度和空間復(fù)雜度的分析)和改進(jìn)思想;(3)經(jīng)驗(yàn)和體會(huì)等,實(shí)習(xí)報(bào)告《數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告》。 5、用戶使用說(shuō)明說(shuō)明如何使用你編寫的程序,詳細(xì)列出每一步操作步驟。 6、測(cè)試結(jié)果列出你的測(cè)試結(jié)果,包括輸入和輸出。這里的測(cè)試數(shù)據(jù)應(yīng)該完整和嚴(yán)格,最好多于需求分析中所列。 7、附錄題目:約瑟夫-實(shí)習(xí)報(bào)告尺寸:約瑟夫-實(shí)習(xí)報(bào)告.doc目錄: 一、需求分析 二、概要設(shè)計(jì) 三、程序具體設(shè)計(jì)及函數(shù)調(diào)用關(guān)系 四、調(diào)試分析 五、測(cè)試結(jié)果原文:實(shí)習(xí)報(bào)告題目:約瑟夫(Joseph)問(wèn)題的一種描述是:編號(hào)為1,2,.,n的n個(gè)人按順時(shí)針?lè)较驀蝗?,每人持有一個(gè)密碼(正整數(shù))。一開(kāi)始任選一個(gè)整數(shù)作為報(bào)數(shù)上限值m,從第一個(gè)人開(kāi)始按順時(shí)針?lè)较蜃?開(kāi)始順序報(bào)數(shù),報(bào)到m時(shí)停止報(bào)數(shù)。報(bào)m的人出列,將他的密碼作為新的m值,從他在順時(shí)針?lè)较蛏系南乱粋€(gè)開(kāi)始重新從1報(bào)數(shù),如此下去,直至年有人全部出列為止。試設(shè)計(jì)一個(gè)程序求出出列順序。班級(jí):姓名:學(xué)號(hào):完成日期: 一、需求分析1.本演示程序中,利用單向循環(huán)鏈表存儲(chǔ)結(jié)構(gòu)存儲(chǔ)約瑟夫環(huán)數(shù)據(jù)(即n個(gè)人的編號(hào)和密碼)。2.演示程序以用戶和計(jì)算機(jī)的對(duì)話方式執(zhí)行,即在計(jì)算機(jī)終端上顯示“提示信息”之后,由用戶在鍵盤上輸入演示程序中需要輸入的數(shù)據(jù),運(yùn)算結(jié)果顯示在其后。3.程序執(zhí)行的命令包括:1)構(gòu)造單向循環(huán)鏈表;2)4.測(cè)試數(shù)據(jù)m的初值為20;n=7,7個(gè)人的密碼依次為:3,1,7,2,4,8,4,首先m值為6(正確的出列順序?yàn)?,1,4,7,2,1,3,5)。 二、概要設(shè)計(jì)1.單向循環(huán)鏈表的抽象數(shù)據(jù)類型定義為:ADT List{數(shù)據(jù)對(duì)象:D={ai|ai∈正整數(shù),I=1,2,.,n,n≥0}數(shù)據(jù)關(guān)系:R1={ai-1,ai|,ai-1,ai∈D,I=1,2,.,n}基本操作:Init List(&L)操作結(jié)果:構(gòu)造一個(gè)空的線性表L。List Insert(&L,i,e)初始條件:線性表L已存在,1≤i≤List Length(L)+1.操作結(jié)果:在L中第i個(gè)位置之前插入新的數(shù)據(jù)無(wú)素e,L長(zhǎng)度加1。List Delete(&L,i,&e)初始條件:線性表L存在非空,1≤i≤List Length(L).操作結(jié)果:刪除L的第i個(gè)元素,并用e返回其值,L長(zhǎng)度減1。2.程序包含四個(gè)模塊:1)主程序模塊:void main(){. 數(shù)據(jù)結(jié)構(gòu)第六次作業(yè)p134 ——11411203張玉 24.template void SeqQueue if(IsFull()==true){ maxSize=2*maxSize; elements[rear]=x; rear=(rear+1)%maxSize; } elements[rear]=x; rear=(rear+1)%maxSize; }; template bool SeqQueue if(rear<=maxSize/4){ maxSize=maxSize/2; x=elements[front]; front=(front+1)%maxSize; } x=elements[front]; front=(front+1)%maxSize; return true; }; 29.// 利用優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn)棧和隊(duì)列 #include template template template class PQueueNode { friend class PQueue friend class Queue public: PQueueNode(T &value, int newpriority, PQueueNode virtual int GetPriority(){ return priority;}//取得結(jié)點(diǎn)優(yōu)先級(jí) virtual PQueueNode virtual void SetData(T& value){ data = value;}//修改結(jié)點(diǎn)數(shù)據(jù) virtual void SetPriority(int newpriority){ priority = newpriority;} //修改結(jié)點(diǎn)優(yōu)先級(jí) virtual void SetLink(PQueueNode T data;//數(shù)據(jù) int priority;//優(yōu)先級(jí) PQueueNode }; //優(yōu)先級(jí)隊(duì)列的類定義 template class PQueue { friend class Stack friend class Queue public: PQueue():front(NULL), rear(NULL){}//構(gòu)造函數(shù) virtual ~PQueue(){ MakeEmpty();}//析構(gòu)函數(shù) virtual void Insert(T &value, int newpriority);//插入新元素value到隊(duì)尾 virtual T Remove();//刪除隊(duì)頭元素并返回 virtual T Get();//讀取隊(duì)頭元素的值 virtual void MakeEmpty();//置空隊(duì)列 virtual int IsEmpty(){ return front == NULL;}//判隊(duì)列空否private: PQueueNode };template void PQueue { //將優(yōu)先級(jí)隊(duì)列置空 PQueueNode while(front!= NULL)//鏈不空時(shí), 刪去鏈中所有結(jié)點(diǎn) { //循鏈逐個(gè)刪除 q = front; front = front->link; delete q; } rear = NULL;//隊(duì)尾指針置空 }template void PQueue { //插入函數(shù) PQueueNode front = rear = q;//隊(duì)列空時(shí)新結(jié)點(diǎn)為第一個(gè)結(jié)點(diǎn) else { PQueueNode while(p!= NULL && p->priority >= newpriority)//隊(duì)列中按優(yōu)先級(jí)從大到小鏈接{ pr = p; p = p->link; } if(pr == NULL) { //插入在隊(duì)頭位置 q->link = front; front = q; } else { q->link = p; pr->link = q;//插入在隊(duì)列中部或尾部 if(pr == rear) rear = q; } } } //刪除隊(duì)頭元素并返回 template T PQueue { if(IsEmpty()) return NULL;PQueueNode front = front->link;//將隊(duì)頭結(jié)點(diǎn)從鏈中摘下 T &retvalue = q->data; delete q; if(front == NULL) rear = NULL;return retvalue; } //讀取隊(duì)頭元素的值 template T PQueue if(IsEmpty()) return NULL; else return front->data; } //(1)棧的定義與實(shí)現(xiàn) template class Stack:public PQueue { //棧類定義 public: Stack():PQueue void Insert(T & value);//插入新元素value到隊(duì)尾 };template void Stack { //插入函數(shù) PQueueNode else { //插入在前端 q->link = front; front = q; } }//--------------------------Queue //(2)隊(duì)列的定義與實(shí)現(xiàn) template class Queue:public PQueue { //隊(duì)列類定義 public: Queue():PQueue void Insert(T & value);//插入新元素value到隊(duì)尾 };template void Queue { //插入函數(shù) PQueueNode if(IsEmpty()) front = rear = q;//隊(duì)列空時(shí)新結(jié)點(diǎn)為第一個(gè)結(jié)點(diǎn) else rear = rear->link = q;//插入在隊(duì)尾位置 void main(){ Stack int n = 1; aStack.Insert(n);aQueue.Insert(n);} 附件: 實(shí)習(xí)報(bào)告格式,如下: 數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告 班級(jí): 姓名: xxx(20121514101) xxx(20121514101) xxx(20121514101) 指導(dǎo)教師: 日期: 題目 一、問(wèn)題描述(把你所選的題目及要求說(shuō)一下) 二、概要設(shè)計(jì)(抽象數(shù)據(jù)類型定義) 三、詳細(xì)設(shè)計(jì)(主要算法和函數(shù)間的調(diào)用關(guān)系) 四、調(diào)試分析(調(diào)式過(guò)程中出現(xiàn)的問(wèn)題及如何改正) 五、心得體會(huì)(組內(nèi)成員的分工及實(shí)習(xí)期間的體會(huì)) 六、用戶手冊(cè)(系統(tǒng)的使用方法介紹) 可參照習(xí)題集上的實(shí)習(xí)報(bào)告格式。 一、概述軟件開(kāi)發(fā)的流程 二、回顧C(jī)語(yǔ)言的基本語(yǔ)法: 1、常量(類型) 2、變量(類型、定義) 3、表達(dá)式(例子:三位數(shù)的拆分) 4、控制語(yǔ)句(if條件語(yǔ)句,例子:餓了嗎?for循環(huán)語(yǔ)句,例子:做好事問(wèn)題求解) 5、數(shù)組(例子:猜數(shù)字游戲) 三、學(xué)生成績(jī)計(jì)算系統(tǒng) 做好事問(wèn)題求解: 某學(xué)校為表?yè)P(yáng)好人好事需核實(shí)一件事,老師找了A、B、C、D三個(gè)學(xué)生,A說(shuō):“不是我?!薄說(shuō):“是C?!?。C說(shuō):“是D?!薄說(shuō):“C胡說(shuō)”。這四個(gè)人中三個(gè)人說(shuō)了實(shí)話。請(qǐng)問(wèn):這件好事是誰(shuí)做的? #include “Stdio.h” #include “Conio.h” void main(void){ char thisman;/*定義變量用來(lái)保存做好事的人*/ int sum=0;/*求和變量*/ /*循環(huán)枚舉做好事的人*/ for(thisman='A';thisman<='D';thisman++){ /*對(duì)四個(gè)人所說(shuō)的話進(jìn)行求和,真話為1,假話為0*/ sum=(thisman!='A')+(thisman=='C')+(thisman=='D')+(thisman!='D');/*判斷和是否為3,真話3,假話1*/ if(sum==3){ /*找到做好事的人,輸出*/ printf(“thisman is %cn”,thisman);} } getch();} 猜數(shù)字: 在計(jì)算機(jī)上設(shè)置一個(gè)沒(méi)有重復(fù)數(shù)字的4位數(shù),不能讓猜得人知道。猜的人就可以開(kāi)始猜。每猜一個(gè)數(shù)字,出數(shù)者就要根據(jù)這個(gè)數(shù)字給出幾A幾B,其中A前面的數(shù)字表示位置正確的數(shù)的個(gè)數(shù),而B(niǎo)前的數(shù)字表示數(shù)字正確而位置不對(duì)的數(shù)的個(gè)數(shù)。 如正確答案為5234,而猜的人猜5346,則是1A2B,其中有一個(gè)5的位置對(duì)了,記為1A,而3和4這兩個(gè)數(shù)字對(duì)了,而位置沒(méi)對(duì),因此記為2B,合起來(lái)就是1A2B。 接著猜的人再根據(jù)出題者的幾A幾B繼續(xù)猜,直到猜中為止。 次數(shù)限制: 有的時(shí)候,這個(gè)游戲有猜測(cè)次數(shù)上的限制。根據(jù)計(jì)算機(jī)測(cè)算,這個(gè)游戲,如果以最嚴(yán)謹(jǐn)?shù)挠?jì)算,任何數(shù)字可以在7次之內(nèi)猜出。而有些地方把次數(shù)限制為6次或更少,則會(huì)導(dǎo)致有些數(shù)可能猜不出來(lái)。而有些地方考慮到人的邏輯思維難以達(dá)到計(jì)算機(jī)的那么嚴(yán)謹(jǐn),故設(shè)置為8次甚至10次。也有的沒(méi)有次數(shù)上的限制。我們今天要做的這個(gè)游戲就是設(shè)定次數(shù)為8次。 #include “Stdio.h” #include “Conio.h” void guess(int b[])/*猜數(shù)字游戲進(jìn)行猜數(shù)的函數(shù),采用數(shù)組作為參數(shù)*/ { int i=0,j=0,s=0,x=0,k1=0,k2=0;/*i、j、s用于進(jìn)行循環(huán),x用記錄猜 數(shù)的次數(shù),k1用于記錄位置相同且數(shù)相同的數(shù)字個(gè)數(shù)、k2記錄數(shù)相同的數(shù)字個(gè)數(shù)*/ int a[4];while(1){ x++;printf(“di %d ci shu ru:”,x);scanf(“%d”,&j);/*輸入要猜的數(shù)放在變量j中*/ for(i=3;i>=0;i--)/*將輸入的4位數(shù)進(jìn)行拆分放到數(shù)組a中*/ { a[i]=j%10;j=j/10;} for(i=0;i<4;i++)/*比較位置和數(shù)字都一致的*/ { if(a[i]==b[i])k1++;} for(i=0;i<4;i++)/*只比較數(shù)字相同不管位置*/ { for(s=0;s<4;s++)if(a[i]==b[s])k2++;} printf(“%dA%dBn”,k1,k2);if(x==8)/*如果已經(jīng)猜了8次還沒(méi)有猜對(duì)那么就要提示并推出這一輪游戲*/ { printf(“your time over back menun”);break;} if(k1==4&&k2==4)/*猜對(duì)了數(shù)字,提示勝利*/ { printf(“win!”);break;} k1=0;/*將計(jì)數(shù)變量清零*/ k2=0;} } void set_num()/*設(shè)置被猜的數(shù)子*/ { printf(“input number:”);scanf(“%d”,&num);/*輸入被猜的數(shù)字,存放在變量num中*/ for(i=3;i>=0;i--)/*將四位數(shù)拆分并按高低位存放在數(shù)組b中*/ { b[i]=num%10;num=num/10;} printf(“ok press any key”);getch();/*等待*/ clrscr();/*清屏*/ } int main(void){ int b[4],num,i,ch=0;while(1)/*條件為1的無(wú)限循環(huán)作為軟件運(yùn)行的主體,等待退出命令*/ { printf(“****menu****n”);printf(“set number input 1n”);printf(“guess number input 2n”);printf(“exit input 3n”);printf(“input your select items:”);scanf(“%d”,&ch);if(ch==1)/*選擇變量為1調(diào)用設(shè)置被猜數(shù)字函數(shù)*/ { set_num();} if(ch==2)/*選擇變量為2調(diào)用猜數(shù)游戲過(guò)程函數(shù)*/ { guess(b);} if(ch==3)/*選擇變量為3退出循環(huán)結(jié)束游戲*/ { break;} } getch();return 0;}第二篇:數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告
第三篇:數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告
第四篇:數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告
第五篇:數(shù)據(jù)結(jié)構(gòu)實(shí)習(xí)報(bào)告