久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

數據結構課程設計報告

時間:2019-05-14 04:31:35下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《數據結構課程設計報告》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《數據結構課程設計報告》。

第一篇:數據結構課程設計報告

正文要求:對每一個題目,正文必須包括以下幾個方面 知識點回顧: 實驗要求:

實驗過程:包括設計思路,算法描述,程序清單,調試等等; 實驗小結:

注意:(1)正文中字體用小四號宋體,行間距1.25倍行距;

(2)頁碼居中;

(3)A4紙雙面打印,在紙的左側裝訂。

(4)上交的課程設計報告控制在10頁以內。

齊魯工業大學

理學院

信計11-1

鄭橋

一、提示:對于單窗口的服務系統知識點回顧如下:

1、什么是負指數分布?

又稱指數分布。泊松事件流的等待時間(相繼兩次出現之間的間隔)服從指數分布。用于描述非老化性元件的壽命(元件不老化,僅由于突然故障而毀壞)。常假定排隊系統中服務器的服務時間和Petri網中變遷的實施速率符合指數分布。

2、用C語言如何產生隨機序列? double rd_MN1(double m,double n){ double r;if(m>n){r=n;n=m;m=r;};r =((double)rand()/((double)(RAND_MAX)+(double)(1)));r = m+ r*(n-m);return r;}

3、用C語言如何產生負指數分布的時間序列? double expntl(double x){ double z;do { z =((double)rand()/ RAND_MAX);} while((z == 0)||(z == 1));return(-x * log(z));//z相當于1-x,而x相當于1/lamda。} 其中的x相當于1/λ

4、排隊論簡單敘述;

排隊系統主要有:X/Y/Z,其中X表示到達時間間隔的分布,Y表示服務時間的分布,Z表示并列的服務設備的數目。表示相繼到達的時間間隔或服務時間的分布的符號是:

M——負指數分布,D——確定性,Ek——k階Erlang,GI——相互獨立的一般隨機分布,G——一般的隨機分布。

例如:M/M/1表示達到時間間隔為負指數分布,服務時間為負指數分布,單服務設備的排隊系統。

這里我們用靜態仿真的思想來實現M/M/1仿真。在排隊系統中的每一個動態實體的狀態可以有三個量來反映:與前一個實體到達的時間間隔,在排到自己服務前的等待時間以及服務時間。其中服務時間和到達時間間隔服從指數分布,不受別的因素的影響。開始服務前的等待時間則受到排在前面的動態實體的狀態的影響。其更新算法如下:

即:如果某個實體到達以后,發現處在它前面的動態實體已經結束服務,所以這個實體就不用等待,直接接受服務;反之,處在它前面的動態實體如果沒有結束服務(包括沒有開始服務),則這個實體的等待時間就是它前一實體結束服務的時刻減去它到達的時刻。

5、如何得到每個顧客的到達時刻,服務時間,等待時間和離開時刻; 到達時間=前面各個到達時間之和; 服務時間就是負指數隨機生成的時間;

等待時刻:如果前一個人的離開時間小于這個人的到達時間,等待時間=0;

如果不是,則等待時間=該人的離開時間-他的到達時間-服務時間

6、如何排隊,排隊的主要算法思想? 排隊就是來到的人數多于離開的人數;

如果下一個人到達時前一個人依舊在接受服務,則此人就要排隊。

7、如何求隊長?以及最大的隊長?

假設以5分鐘為一個時間段,則在第5分鐘時用這5分鐘內來到的人數減去這5分鐘內離開的人數即是排隊人數

8、如何求平均等待時間?

求平均等待時間首先要求出總的等待時間與接受服務的人數;

總的等待時間=每個人的等待時間之和;接受服務的人數由時間540分鐘來控制,如果在540分鐘之后才到達的人則不再算入接受服務的人數之內。

9、用C語言如何將得到的數據輸出到文件?

在C語言中用fopen函數打開文件,然后把數據輸出比如用fprintf函數,最后fclose。

利用ofstream fcout(“d:arr_time.txt”);語句來實現C++中的輸出文件

10、如何用已學的數學語言程序(如:Mathematica, Matlab)把C語言得到的數據文件畫出其相應的圖像?

11、如果是兩個窗口的服務系統,則該怎么修改程序?

12、如果到達時間間隔,服務時間服從泊松分布或者其他分布,該程序該如何改進?

二、數據結構課程設計題目

單窗口的排隊模型的數值仿真(參考課本上第四章的離散事件模擬)要求如下:(1)要求相鄰兩個顧客的到達時間間隔服從負指數分布;且每個顧客接受服務的時間也服從負指數分布;

(2)求出各個時刻的隊長(以五分鐘為一時間單位,即求零時刻的隊長,五分鐘時的隊長,十分鐘時的隊長,依次類推);

(3)一個工作日內的顧客總數,約定8:30上班,17:30下班,中午不休息;(4)求平均等待時間(顧客總等待時間除以總人數);

(5)畫出顧客的到達,離開圖像(橫坐標是顧客圖,縱坐標是到達時刻,和離開時刻);

(6)畫出隊長變換圖像(橫坐標是時刻圖,縱坐標是隊長個數);(7)求出一個工作日內的最大隊長;

三、設計思路:

1)把8::30記做第0分鐘,17:30記做第540分鐘。

2)首先利用C++隨機生成200個服從負指數分布的到達時間與200個服務時間 然后根據隨機生成的數計算到達的時刻,即到達時間的逐步加和,然后計算離開的時刻;

3)根據到達時刻與離開時刻來計算等待時刻,于是便可得到平均等待時間; 同時根據這兩個時刻求出每5分鐘到達人數與離開的人數,于是便得出每5分鐘的隊長,同時也可求出最大隊長。4)再利用MATLAB畫出相應的圖像。

四、算法描述:

1)首先將8:30這個時刻化為0時刻,17:30化為第540分鐘這個時刻,全體單位為分鐘。

2)定義到達時間間隔arr_time[200],服務時間ser_time[200],到達時刻arr_time1[200],離開時間lea_time[200],等待時間sta_time[200],離開人數lea_num[200],到達人數arr_num[200]等變量。3)根據負指數函數

來利用C++程序生成隨機到達時間間隔與服務時間。

4)利用到達時刻與離開時刻之間的關系來求出等待時間。同時將這540分鐘劃分為5分鐘間隔的108個時間段來求出在每個時間段到達人數與離開人數,再求出隊長。

5)利用已知的服務人數,平均到達時間與平均離開時間來做出圖像。(借助MATLAB軟件。)

五、總結

(1)求出各個時刻的隊長(以五分鐘為一時間單位,即求零時刻的隊長,五分鐘時的隊長,十分鐘時的隊長,依次類推);見程序清單中數據部分對長。(2)求平均等待時間(顧客總等待時間除以總人數);根據程序可得,平均等待時間為21.6分鐘。

(3)畫出顧客的到達,離開圖像(橫坐標是顧客圖,縱坐標是到達時刻,和離開時刻);

***0100806040200 0Arrive curveleave curve***600

(6)畫出隊長變換圖像(橫坐標是時刻圖,縱坐標是隊長個數);

25Queue Length Curve 20151050 ***0600

(7)求出一個工作日內的最大隊長: 最大對長為16個人在排隊。

六、程序清單:

求隨機產生負指數 #include #include #include #include #include

#include using namespace std;

void main(){ long int i,k;double m,n;//m,n控制時間間隔

double r;double a,s,sum;//arr為到達時間,ser為服務時間

double LAM=1.2;

//f(x)=LAM*exp(-LAM*x);double arr_time[200];double ser_time[200];ofstream fcout(“d:arr_time.txt”);ofstream fscout(“d:ser_time.txt”);m=2.0;n=5.0;srand((unsigned)time(NULL));

k=0;loop: r=((double)rand()/((double)(RAND_MAX)+(double)(1)));

a =-log(r)/LAM;if(a >= m && a <= n){

arr_time[k]=a;

k++;};if(k < 200)goto loop;

// 產生200個指數分布隨機數

for(i=0;i<200;i++){

fcout<

//cout<

if(i!=0 && i%5==0)

//cout<

fcout<

s =-log(r)/LAM;if(s >= m && s <= n){ ser_time[k]=s;k++;};if(k < 100)goto loop1;

// 產生200個指數分布隨機數 m=3.0;n=5.5;

srand((unsigned)time(NULL));k=100;loop2: r=((double)rand()/((double)(RAND_MAX)+(double)(1)));

s =-log(r)/LAM;if(s >= m && s <= n){ ser_time[k]=s;k++;};if(k < 200)goto loop2;

// 產生200個指數分布隨機數

for(i=0;i<200;i++){

fscout<

//cout<

if(i!=0 && i%5==0)

//cout<

fscout< #include #include #include #include

#include using namespace std;void main(){ //下面求離開時間、等待時間 int i;double lea_time[200];//離開時間

double sta_time[200];//等待時間

double arr_time[200];//隨機生成到達時間

double ser_time[200];//隨機生成服務時間

double arr_time1[200];//到達時間

ifstream fcin(“d:arr_time.txt”);ifstream fscin(“d:ser_time.txt”);ofstream fcout(“d:arr_time1.txt”);ofstream flcout(“d:lea_time.txt”);ofstream fscout(“d:sta_time.txt”);

//求到達的時間

for(i=0;i<200;i++){

fcin>>arr_time[i];

arr_time1[i]=arr_time[i];} double sum=0.0;for(i=0;i<200;i++){

sum+=arr_time1[i];

arr_time1[i]=sum;} for(i=0;i<200;i++){

fcout<

if(i!=0 && i%5==0)

fcout<

//求離開時間

fscin>>ser_time[0];lea_time[0]=arr_time1[0]+ser_time[0];for(i=1;i<200;i++){

fscin>>ser_time[i];

if(lea_time[i-1]>arr_time1[i])

{lea_time[i]=lea_time[i-1]+ser_time[i];}

else

{lea_time[i]=arr_time1[i]+ser_time[i];} }

for(i=0;i<200;i++){

flcout<

if(i!=0 && i%5==0)

flcout<

sta_time[i]=lea_time[i]-arr_time1[i]-ser_time[i];//

if(sta_time[i]<0)

{

sta_time[i]=0;

} } for(i=0;i<200;i++){

fscout<

if(i!=0 && i%5==0)

fscout<

sta_sum+=sta_time[i];}

//求平均等待時間

double ave;int peo_sum;for(i=0;i<200;i++){

if(lea_time[i]<540)

peo_sum=i;} cout<<“總的服務人數為:”<

求離開人數和到達人數 #include #include #include #include #include

#include using namespace std;void main(){ //求離開人數和到達人數

int i,j;

int arr_num[200];//到達人數arr int lea_num[200];//lea離開人數

int arr_jian=0;//時間間隔

double arr_time1[200];double lea_time[200];int peo_sum;int count=0;int count1=0;ifstream fcin(“d:arr_time1.txt”);ifstream flcin(“d:lea_time.txt”);ofstream fcout(“d:arr_num.txt”);ofstream flcout(“d:lea_num.txt”);for(i=0;i<200;i++){

fcin>>arr_time1[i];

flcin>>lea_time[i];} for(i=0;i<200;i++){

if(lea_time[i]<540)

peo_sum=i;} while(arr_jian<540){

for(i=0;i

{

if(arr_time1[i]>arr_jian)

{

arr_num[count]=i;

count++;

//cout<

break;

}

}

for(j=0;j

{

if(lea_time[j]>arr_jian)

{

lea_num[count1]=j;

count1++;

break;

}

}

arr_jian=arr_jian+5;} for(i=0;i<108;i++){

fcout<

//cout<

if(i!=0 && i%5==0)

//cout<

fcout<

for(i=0;i<108;i++){

flcout<

//cout<

if(i!=0 && i%5==0)

//cout<

flcout<

求對長

#include #include using namespace std;int main(){

int i;int max;int que[200];int arr_num[200];int lea_num[200];ifstream fcin(“d:arr_num.txt”);ifstream flcin(“d:lea_num.txt”);ofstream fcout(“d:que.txt”);

for(i=0;i<200;i++){

fcin>>arr_num[i];

//cout<

flcin>>lea_num[i];

//cout<

for(i=0;i<200;i++){

que[i]=arr_num[i]-lea_num[i];

//cout<

} for(i=0;i<200;i++){

fcout<

if(i!=0 && i%5==0)

{

fcout<

} } max=que[0];for(i=1;i<200;i++)

{

if(que[i]>max)

{

max=que[i];

//cout<

} }

cout<<“最大對長是”<

畫圖: function[maxque,mwait_t,mstay_t,queue_l,use_rate]=MM1queue(mean_arr,mean_lea,peo_num)status=zeros(3,peo_num);

%用一個3行矩陣表示每個顧客的狀態;

%到達時間間隔,服務時間,等待時間;status(1,:)=exprnd(mean_arr,1,peo_num);

%按照指數分布隨機生成各顧客的到達間隔;status(2,:)=exprnd(mean_lea,1,peo_num);

%按照指數分布隨機生成各顧客的服務時間;for i=2:peo_num

if status(1,i)<=status(2,i-1)+status(3,i-1)

status(3,i)=status(2,i-1)+status(3,i-1)-status(1,i);

else

status(3,i)=0;

end;

%對狀態進行更新; end;arr_time=cumsum(status(1,:));status(1,:)=arr_time;lea_time=sum(status);stairs([0 arr_time],0:peo_num);

%繪出各顧客的到達時間圖;

hold on;stairs([0 lea_time],0:peo_num,'r');

%繪出各顧客的離去時間圖;legend('Arrive curve','leave curve',0)hold off figure;plot(1:peo_num,status(3,:),'r:',1:peo_num,status(2,:)+status(3,:),'k-');

%繪出每個顧客的等待時間和停留時間;legend('Wait Time','Stay Time',0);n1=1;n2=1;mstay_t=(sum(status(2,:))+sum(status(3,:)))/peo_num;mwait_t=mean(status(3,:));

%求平均停留時間和等待時間;queue_num=zeros(1,2*peo_num+1);queue_time=zeros(1,2*peo_num+1);n3=1;

%while循環求每個時間隊列的長度;while n1<=peo_num

n3=n3+1;

if arr_time(n1)

queue_num(1,n3)=n1-n2+1;

queue_time(1,n3)=arr_time(n1);

n1=n1+1;

else

queue_num(1,n3)=n1-n2-1;

queue_time(1,n3)=lea_time(n2);

n2=n2+1;

end;end;while n2<=peo_num

n3=n3+1;

queue_num(1,n3)=peo_num-n2;

queue_time(1,n3)=lea_time(n2);

n2=n2+1;end;figure;stairs(queue_time,queue_num,'k');

%繪出隊列長度的時間變化曲線, stairs 是Matlab的函數

legend('Queue Length Curve',0);hold off;temp=diff(queue_time);overtime=max(queue_time);queue_l=sum(temp.*queue_num(2:(2*peo_num+1)))/overtime;use_rate=sum(temp(find(queue_num)))/overtime;maxque=max(queue_num);% 最大隊長

在MATLAB中命令窗口中輸入MM1queue(2.86,3.22,175)數據結果:

隨機到達時間arr_time 2.2218 2.91038 2.70151 3.20392 2.20729 2.23954 2.27037 2.12161 2.97105 2.59537 2.05195 2.33276 2.40885 2.54536 3.18395 4.34619 2.9621 4.03687 2.56005 4.3556 2.59767 2.6854 2.2156 2.35007 2.01546 3.16558 2.51725 2.4227 3.00499 2.68796 2.57445 2.29238 2.04275 3.56593 4.12181 3.14539 4.60806 2.85305 2.18215 4.15836 2.75386 2.45691 3.15095 3.84449 3.29556 2.35349 2.88082 2.96656 2.60517 3.09175 3.77562 2.12649 2.17347 2.28761 2.91709 2.59767 2.20084 3.64077 2.09167 2.30401 2.89137 2.78563 2.35564 2.60401 3.47721 2.31212 2.2892 2.26189 2.71001 3.23541 3.15543 4.04989 2.33905 2.60575 2.93069 2.63466 2.33025 2.67211 2.13304 2.46765 2.01119 2.66026 2.17867 4.26591 2.56115 2.84451 3.37485 2.22326 2.3109 3.08451 2.75872 3.02393 2.32155 2.37607 2.43489 3.70764 3.07631 2.56943 2.81941 2.81567 2.18215 3.78511 2.72393 2.02062 2.28013 2.03219 2.9324 4.02088 2.83606 2.01804 2.82241 2.23062 2.38448 2.15369 4.07996 2.02407 2.77847 2.93584 4.92381 4.07996 2.52143 2.10523 3.29291 2.34922 2.60807 2.83989 3.77091 2.4652 2.12096 2.36601 4.23257 2.29039 2.03278 3.42756 3.04233 2.80972 4.46149 2.04867 3.6673 2.04363 3.56409 4.8267 4.40435 3.60347 2.01375 4.41955 2.28406 2.49971 2.85853 2.11547 2.29079 2.2037 3.0078 2.43726 2.43963 3.82172 2.26189 3.14207 3.02297 2.39612 2.26381 3.59773 2.454 4.98197 3.60539 3.04233 3.21228 2.48553 2.16591 2.17244 2.25882 2.11773 3.77326 2.1113 3.15319 2.4011 2.66648 3.58261 3.36182 2.74012 2.16046 2.53464 2.21742 2.48754 2.86484 2.45837 2.4213 2.81047 4.02405 2.08667 2.24179 2.17971 3.1465 2.96925 2.07709 2.6139 3.48217 4.50565 3.25667 2.71528

隨機服務時間ser_time 1.36266 1.25234 1.19953 1.81288 1.7025 1.49777 1.18475 1.2005 2.2218 2.91038 1.69353 1.06181 1.95277 1.86629 1.35603 1.36501 1.98628 1.05845 1.48635 2.70151 1.56285 1.7392 1.00964 1.69024 1.23548 1.68311 3.20392 2.20729 2.23954 1.0431 1.986 1.09644 2.27037 1.53367 2.12161 2.97105 1.68177 2.59537 2.05195 1.54594 1.24156 1.42946 2.33276 1.06994 2.40885 1.9069 2.54536 3.18395 4.34619 2.9621 1.09313 4.03687 2.56005 1.01332 1.97996 1.76143 1.26501 1.34689 1.66416 4.3556 1.6471 1.46631 2.59767 2.6854 1.92952 1.51985 1.85138 1.04044 2.2156 1.30726 1.1663 1.16661 5.21173 2.35007 1.3357 1.00973 2.01546 3.16558 2.51725 1.27905 2.4227 1.04284 1.69508 1.63761 1.13783 1.05052 1.94433 1.53127 3.00499 2.68796 2.57445 2.29238 1.40015 1.2112 1.64527 2.04275 1.29598 1.29286 3.56593 1.07538 3.20392 3.18395 4.34619 4.03687 4.3556 5.21173 3.16558 3.00499 3.56593 4.12181 3.14539 4.60806 4.15836 3.15095 3.84449 3.29556 5.29513 3.09175 3.77562 3.64077 3.47721 3.23541 3.15543 4.04989 4.26591 3.37485 3.08451 3.02393 3.70764 3.07631 3.78511 4.02088 4.07996 4.92381 4.07996 3.29291 3.77091 4.23257 3.42756 3.04233 4.46149 3.6673 3.56409 4.8267 4.40435 3.60347 4.41955 3.0078 3.82172 3.14207 3.02297 3.59773 4.98197 3.60539 3.04233 3.21228 3.77326 3.15319 3.58261 3.36182 5.0445 4.02405 3.1465 3.48217 4.50565 3.25667 4.85208 4.16211 4.13261 3.21952 3.46087 3.74548 4.5463 3.72969 3.29423 3.0804 3.08657 3.47556 4.09022 3.17586 5.29513 3.75694 3.74548 3.30222 3.01725 3.18627 3.40305 4.12539 3.49556 3.02777 3.87053 3.39703 3.51433 3.67983 3.27072 4.11115 4.22444 4.08337 3.37339 5.03375

到達時刻:arr_time1 2.2218 5.13218 7.83369 11.0376 13.2449 15.4844 17.7548 19.8764 22.8475 25.4428 27.4948 29.8276 32.2364 34.7818 37.9657 42.3119 45.274 49.3109 51.8709 56.2265 58.8242 61.5096 63.7252 66.0753 68.0907 71.2563 73.7736 76.1963 79.2012 81.8892 84.4637 86.756 88.7988 92.3647 96.4865 99.6319 104.24 107.093 109.275 113.434 116.187 118.644 121.795 125.64 128.935 131.289 134.17 137.136 139.741 142.833 146.609 148.735 150.909 153.196 156.113 158.711 160.912 164.553 166.644 168.948 171.84 174.625 176.981 179.585 183.062 185.374 187.664 189.925 192.635 195.871 199.026 203.076 205.415 208.021 210.952 213.586 215.917 218.589 220.722 223.189 225.201 227.861 230.039 234.305 236.867 239.711 243.086 245.309 247.62 250.705 253.463 256.487 258.809 261.185 263.62 267.327 270.404 272.973 275.793 278.608 280.79 284.575 287.299 289.32 291.6 293.632 296.565 300.586 303.422 305.44 308.262 310.493 312.877 315.031 319.111 321.135 323.913 326.849 331.773 335.853 338.374 340.48 343.773 346.122 348.73 351.57 355.341 357.806 359.927 362.293 366.525 368.816 370.849 374.276 377.318 380.128 384.59 386.638 390.306 392.349 395.913 400.74 405.144 408.748 410.762 415.181 417.465 419.965 422.823 424.939 427.23 429.433 432.441 434.878 437.318 441.14 443.402 446.544 449.567 451.963 454.227 457.824 460.278 465.26 468.866 471.908 475.12 477.606 479.772 481.944 484.203 486.321 490.094 492.205 495.359 497.76 500.426 504.009 507.371 510.111 512.271 514.806 517.023 519.511 522.376 524.834 527.255 530.066 534.09 536.176 538.418 540.598 543.744 546.714 548.791 551.405 554.887 559.393 562.649 565.364

離開時刻:lea_time 3.58446 6.38452 9.03322 12.8505 14.9474 16.9822 18.9396 21.0769 25.0693 28.3532 30.0467 31.1086 34.1892 36.6481 39.3217 43.6769 47.2603 50.3693 53.3573 58.928 60.4909 63.2488 64.7348 67.7655 69.3262 72.9394 76.9775 79.1848 81.4408 82.9323 86.4497 87.8525 91.0692 93.8984 98.6081 102.603 105.922 109.688 111.74 114.979 117.429 120.074 124.128 126.71 131.344 133.251 136.715 140.32 144.666 147.628 148.722 152.772 155.332 156.345 158.325 160.472 162.177 165.9 168.308 173.304 174.951 176.417 179.579 182.27 184.992 186.894 189.515 190.966 194.851 197.178 200.193 204.243 210.627 212.977 214.313 215.322 217.932 221.754 224.271 225.551 227.973 229.016 231.735 235.943 238.004 240.762 245.03 246.84 250.625 253.393 256.038 258.78 260.209 262.396 265.265 269.37 271.7 274.266 279.358 280.434 283.994 287.759 292.106 296.142 300.498 305.71 308.875 311.88 315.446 319.568 322.713 327.322 331.48 334.631 338.475 341.771 347.066 350.158 353.933 357.574 361.051 364.287 367.442 371.492 375.758 379.133 382.217 385.241 388.949 392.025 395.81 399.831 403.911 408.835 412.915 416.208 419.979 424.211 427.639 430.681 435.143 438.81 442.374 447.201 451.605 455.209 459.628 462.636 466.458 469.6 472.623 476.22 481.202 484.808 487.85 491.062 494.836 497.989 501.572 504.933 509.978 514.002 517.148 520.631 525.136 528.393 533.245 537.407 541.54 544.759 548.22 551.966 556.512 560.242 563.536 566.616 569.703 573.178 577.269 580.444 585.74 589.496 593.242 596.544 599.561 602.748 606.151 610.276 613.772 616.799 620.67 624.067 627.581 631.261 634.532 638.643 642.867 646.951 650.324 655.358

到達人數:peo_num 0 1 3 5 8 9 12 14 15 16 18 19 21 23 25 27 29 31 33 34 36

39 40 42 43 45 47 49 50 52 54 56 58 60 62 64 65 68 69 71

74 76 78 80 82 84 86 87 89 91 93 95 96 98 100 102 104 106 107 109 111 113 115 117 118 119 121 123 125 126 129 130 132 134 135 137 138 140 141 142 144 145 148 150 152 154 155 157 159

161 162 163 165 166 167 169 170 171

173174 175 177 離開人數:lea_num 0 1 3 5 7 8 10 13 15 16 17 19 20 23 25 26 28 30 32 34 35

38 40 41 43 44 46 47 49 51 52 55 57 59 61 63 65 67 69 70

72 75 77 79 82 83 85 86 88 90 92 94 96 98 99 101 102 103 104 105 107 108 110 111 112 114 115 116 117 119 120 122 123 124

127 129 130 132 133 134 135 137 138 139 140 142 143 144

147 148 150 151 152 154 155 157 158 160 161 162

隊長que 0 0 0 0 1 1 2 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 2 1 1 2 1 1 1 1 1 0 1 0 1 0 2 1 1 1 0 1 1 1 1 1 1 0 0 1 1 2 3 3 4 4 5 5 6 6 5 6 7 8 7 9 8 9 10

0 10 9 10 9 9 10 10 11 12 13 14 13 14 15 16 15 15 15 15

0 0 0 0 0 0 0 0

605040302010Wait TimeStay Time***401601800 0

第二篇:數據結構課程設計報告

數據結構課程設計

散列表的應用:插隊買票

專業 計算機科學與技術(網絡技術)

金玲 計算機131 1310704114 張靜林 2015年1月23日 學生姓名 班學級 號

指導教師 完成日期

目錄概述……………………………………………………………………………………1 1.1 課程設計目的……………………………………………………………………….1 1.2 課程設計內容……………………………………………………………………….1 2 系統需求分析……………………………………………………………………….1 2.1 主體功能…………………………………………………………………………....2 3系統概要設計…………………………………………………………………………2 3.1 系統流程圖………………………………………………………………………….2 4 系統詳細設計…………………………………………………………………………3 5 測試……………………………………………………………………………………5 5.1 測試方案…………………………………………………………………………….5 5.2 測試結果…………………………………………………………………………….5 6 小結……………………………………………………………………………………5 參考文獻…………………………………………………………………………………5 附錄………………………………………………………………………………………7 附錄1 源程序清單……………………………………………………………………...7 概述

1.1 課程設計目的

數據結構課程設計是為數據結構課程獨立開設的實踐性教學環節。數據結構課程設計對于鞏固數據結構知識,加強學生的實際動手能力和提高學生綜合素質是十分必要的。課程設計的目的:

1.要求學生達到熟練掌握C語言的基本知識和技能。

2.了解并掌握數據結構與算法的設計方法,具備初步的獨立分析和設計能力。3.提高程序設計和調試能力。學生通過上機實習,驗證自己設計的算法的正確性。學會有效利用基本調試方法,迅速找出程序代碼中的錯誤并且修改。

4.培養算法分析能力。分析所設計算法的時間復雜度和空間復雜度,進一步提高程序設計水平。

5.初步掌握軟件開發過程的問題分析、系統設計、程序編碼、測試等基本方法和技能。

1.2課程設計內容

本課程設計的任務是寫一個程序模擬這種情況。每個隊伍都允許插隊。如果你在排隊,有一個以上的朋友要求插隊,則你可以安排他們的次序。每次一個人入隊,并且如果這個入隊的人發現隊伍中有自己的朋友,則可以插入到這個朋友的后面;當隊伍中的朋友不止一個的時候,這個人會排在最后一個朋友的后面;如果隊伍中沒有朋友,則他只能夠排在這個隊伍的最后面。每一個入隊的人都先進行上述的判斷。當隊伍前面的人買到車票之后,依次出隊。系統需求分析

2.1 主體功能

程序從“input.txt”文件讀入測試用例,一個文件可包含多個測試用例。每個用例的第一行是朋友組的數目n(1<=n<=1000)。對于一個朋友組以朋友的數目j(1<=j<=1000)開始,由朋友的個數以及他們的名字組成,一個空格后接該組朋友的名字,以空格分開,并且每個人的名字都不同。每個名字不超過四個字母,由{A,B,...,Z,a,b,...,z}組成。一個朋友組最多有1000個人,每個人只屬于一個朋友組。n=0時,測試數據結束。

下面是一些具體命令:.ENQUEUE——X入隊;.DEQUEUE——排隊頭的人買票,離開隊伍,即出隊;.STOP——一個測試用例結束。

測試結果輸出到“output.txt”文件中。每個測試用例第一行輸出“Scenario#k”,k是測試用例的序號(從1開始)。對每一個出隊命令,輸出剛買票離開隊伍的人名。兩個測試試用例 之間隔一空行,最后一個用例結束不輸出空行。系統概要設計

3.1 系統流程圖 系統詳細設計

本題目主要解決兩個問題:一是怎么存放和查找大量數據(主要是姓名);二是怎么操作“ENQUEUE”和“DEQUEUE”命令。

用散列表來存放和查找數據。由于最多有1000個朋友組,每組最多有1000人,使用平方探測法解決沖突,則表的大小是2*(1000*1000),所以選擇TableSize=2000003(2000003是大于2000000的最小素數)。同一個組內的都是朋友,所以每個人除了記錄他的名字name,還要記錄他屬于哪個組group,另外用info來表示該單元是否被占用,數據結構如圖4.1所示。散列函數是根據Honer法則計算一個以64為階的多項式,如圖4.2所示。沖突解決方法采用平方探測法,如圖4.3所示。

#define TabSize 2000003 typedef struct hashtab *PtrToHash;struct hashtab

/*散列表數據結構*/ { char name[5];

/*名字*/ int group;

/*屬于哪個朋友組*/ char info;

/*標志位,該單元是否被占用*/ };圖4.1數據結構:散列表

Int Hash(char *key,int TableSize){

Int HashVal=0;

While(key!=NULL)

HashVal=(HashVal<<6)+*key;

Return HashVal%TableSize;} 圖4.2散列函數

Long int Find(PtrToHash hash,char *c){

key=c;

CurrentPos=Hash(key,TableSize);

CollisionNum=0;

While((單元被占用)and(單元內的名字與查找的名字不同))

{

CurrentPos+=2*(++CollisionNum)-1;

If(CurrentPos>=TabSize)

CurrentPos=TabSize;

}

Return CurrentPos;} 圖4.3用平方探測法解決沖突

第二個問題是關于怎么操作“ENQUEUE”和“DEQUEUE”命令。這可以用隊列來模擬。由于有插隊現象的存在,不能單純的用一個數組來表示隊列,因為這樣的話,插入一個朋友,則他后面的人都要往后移一個單位,刪除一個人,則他后面的人都要前移一個,會降低效率。所以,采用一個Index標記來表示當前元素的后繼元素,最后一個單元的后繼元素是第0個,形成環,數據結構如圖4.4所示。不用鏈表是因為鏈表存放指針也需要空間,并且鏈表插入、刪除的效率沒有數組高。

typedef struct Que *PtrToQue;struct Que

/*隊列數據結構*/ { long int HashVal;

/*散列值*/ long int Index;

/*在中的隊列序號*/ };圖4.4數據結構:隊列

輸入ENQUEUE命令,如果隊伍里有朋友,則排在朋友后面;如果沒有朋友,則排在隊尾。入隊時,用一個數組記錄每個朋友組的最后一位,以便下一個朋友到來時排到他后面,這個數組被稱為“插隊數組”。

輸入DEQUEUE命令,則根據“先進先出”,按照各個元素和它后繼元素的先后順序,每次刪除隊列重的第一個。程序結構如圖4.5所示。

While(讀測試文件){

if(輸入”ENQUEUE”)

{

讀入名字;

插入散列表;

插入隊列;

}

else if(輸入”DEQUEUE”)

{

刪除隊列第一個名字;

將該名字輸出到文件;

}

else stop;} 圖4.5入隊、出隊操作 測試

5.1 測試方案 按輸入要求輸入正常測試數據,測試程序是否能正確解決問題,得到正確答案。應注意邊界測試。例如,將n,j分別取為1的用例和n為1000的用例。n,j比較大時需寫程序生成測試用例。

不按輸入要求輸入數據,測試程序能否對輸入內容進行數據合法性檢測并進行相應的異常處理。例如,將n或j取為小于1或大于1000的數,名字超過4個字母等情況下的測試用例。5.2 測試結果 小結

在前面的學習過程中我們學到了很多知識而這次課程設計又是對我們所學的 一次總結,剛開始,可以說是沒有頭緒,于是就去圖書館找資料,找到了一些關于程序方面的,可這遠遠不夠,這只是小小的開始。我們必須掌握很多已學的知識才能很好的完成本次的課程設計。在這次課程設計中,總的感覺是我遇到了很多困難這主要是由于我編寫代碼的經驗不足,有時雖然是一個很小的問題但解決起來卻花費了我不少的時間,值得欣慰的是,當自己苦思冥想或者和其它同學一起探討把問題解決的時候我還是覺得獲益非淺,這就是在摸索中尋求到的知識。在設計時也免不了存在著些不足,所以在今后的學習中我會努力取得更大的進步。雖然對著電腦做程序,有些累,可當看到勞動成果時,卻有另一番滋味。

參考文獻

[1]范策,周世平,胡曉琨.《算法與數據結構(C語言版)》[M].北京:機械工業出版社,2004 [2]嚴蔚敏.《數據結構(C語言版)》.北京:清華大學出版社,2004 [3]許卓群,楊冬青,唐世渭,張銘.《數據結構與算法》.北京:高等教育出版社,2004 [4]徐孝凱.《數據結構實用教程(第二版)》.北京:清華大學出版社,2006

附錄

附錄1 源程序清單

#include #include #include #define TabSize 2000003

/*散列表大小TabSize 是大于表最大空間的素數*/ #define Max 1000001

/*隊列空間最大值*/ struct hashtab;typedef struct hashtab *PtrToHash;struct hashtab

/*散列表數據結構*/ { char name[5];

/*名字*/ int group;

/*屬于哪個朋友組*/ char info;

/*標志位,該單元是否被占用*/ };struct Que;typedef struct Que *PtrToQue;struct Que

/*隊列數據結構*/ { long int HashVal;

/*散列值*/ long int Index;

/*在中的隊列序號*/ };

int hashedx=0;

/*標記元素是否已經在散列表里*/ long int Find(PtrToHash hash,char *c)/*查找在散列表中的位置*/ { char *key;long int CurrentPos,CollisionNum;

key=c;for(CurrentPos=0;*key;++key)

/*散列函數,計算散列值*/

CurrentPos=(CurrentPos<<6)+*key;CurrentPos%=TabSize;

/*散列值*/ CollisionNum=0;/*如果當前單元被占用:單元內的元素與當前操作的名字不同,使用平方探測法解決沖突;與當前操作的名字相同,則直接返回在散列中的位置*/ while((hash[CurrentPos].info)&&(strcmp(hash[CurrentPos].name,c)))

{

/*平方探測法*/

CurrentPos+=2*(++CollisionNum)-1;

if(CurrentPos>=TabSize)

CurrentPos-=TabSize;}

if((hash[CurrentPos].info)&&(strcmp(hash[CurrentPos].name,c)==0))

/*元素已經在散列表里*/

hashedx=1;else /*元素不在散列表里*/

hashedx=0;return CurrentPos;/*返回在散列表中的位置*/ }

int main(){ long int Find(PtrToHash hash,char *c);

/*查找在散列表中的位置*/

PtrToHash hash;

/*散列表*/ PtrToQue queue;

/*隊列*/ int *grouppos;

/*記錄每個朋友組的最后一位,即插隊數組*/ int n;

/*測試用例數目*/ int num;

/*當前測試用例序號*/ long int i,ii,j,key,temp;long int head,last;

/*隊列的頭和尾*/ char c[8],tempc[8];

/*名字*/ FILE *fpin,*fpout;

/*輸入、輸出文件指針*/

if(!(fpin=fopen(“input.txt”,“r”)))

/*打開測試文件*/ {

printf(“fopen error!”);

/*文件打開錯誤*/

return-1;} if(!(fpout=fopen(“output.txt”,“w”)))

/*打開輸出文件*/ {

printf(“fopen error!”);

return-1;}

hash=(PtrToHash)malloc(sizeof(struct hashtab)*TabSize);/*為散列表申請空間*/ queue=(PtrToQue)malloc(sizeof(struct Que)*Max);/*為隊列申請空間*/ grouppos=(int *)malloc(sizeof(int)*1000);/*申請空間記錄每個朋友組的最后一位*/ for(i=0,j=1;i

queue[i].Index=j;queue[i-1].Index=0;/*最后一個單元的后繼單元是第0個,形成環*/ num=0;for(fscanf(fpin,“%d”,&n);n;fscanf(fpin,“%d”,&n))/*輸入當前測試用例的朋友組數*/ {

if(n<1||n>1000)

/*處理異常輸入n*/

{

fprintf(fpout,“n is out of rangen”);

return-1;

}

num++;

if(num!=1)

/*兩個測試用例間輸入一空行*/

fprintf(fpout,“n”);

for(i=0;i

hash[i++].info=0;

/*初始化散列表,標記位置0*/

for(i=0;i

/*對每一組朋友*/

{

fscanf(fpin,“%d”,&j);

/*當前組里的人數*/

if(j<1||j>1000)

/*處理異常輸入j*/

{

fprintf(fpout,“j is out of rangen”);

return-1;

}

for(;j;--j)

{

fscanf(fpin,“%s”,c);

/*輸入名字*/

for(ii=0;ii

tempc[ii]='

主站蜘蛛池模板: 亚洲综合网站色欲色欲| 久久久久人妻啪啪一区二区| 熟女人妻一区二区三区免费看| 国产精品99久久久久久宅男| 免费无码不卡视频在线观看| 国产成人欧美一区二区三区| 欧美日韩亚洲中文字幕二区| 日本黄网站免费| 亚洲日产精品一二三四区| 人妻妺妺窝人体色www聚色窝| 久久久一本精品99久久精品66| 久久精品人妻无码一区二区三区| 国产精品久久久久久久免费看| 三上悠亚精品一区二区久久| 国产免费人成视频在线观看| 又大又粗欧美黑人aaaaa片| 国产人妻777人伦精品hd| 性做爰高清视频在线观看视频| 在线а√天堂中文官网| 国产av国片精品jk制服丝袜| 人妻丰满熟妇a无码区| 国产aⅴ爽av久久久久久| 国产呦交精品免费视频| 久久久午夜精品福利内容| 亚洲AV秘?无码一区二区三动图| 国产无遮挡裸体美女视频| 亚洲色av影院久久无码| 国产亚洲欧美精品久久久| 18禁区美女免费观看网站| 国产精品久久久久久久久久直播| 亚洲精品喷潮一区二区三区| 久久久久久久97| 国产成人亚洲综合无码品善网| 日本精品aⅴ一区二区三区| 久久国内精品自在自线观看| 中文成人无码精品久久久不卡| 精品国产综合成人亚洲区2022| 亚洲人成网站18禁止大| 人妻忍着娇喘被中进中出视频| 中文字幕有码无码人妻av蜜桃| 成年午夜无码av片在线观看|