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