資料結構課程實習報告

2021-10-04 00:21:52 字數 3331 閱讀 6882

課程名稱

指導老師

學生姓名

班級學號

實習題一

1. 需求規格說明

【問題描述】

大數運算——計算n的階乘(n大於等於20)

【基本要求】

資料的表示和儲存:累積運算的中間結果和最終的計算結果的資料型別要求是整型,試設計合適的儲存結構,要求每個元素或結點最多儲存資料的 3 位數值。

資料的操作及其實現: 基於設計的儲存結構實現乘法操作,要求從鍵盤上輸入n 值;在螢幕上顯示最終計算結果。

2. 總體分析與設計

【設計思想】

因為大數的階乘算出來的數值比較大,位數遠遠超過乙個int或double行的位數,為了精確性的考慮,階乘後的結果要用一種儲存結構來儲存並且累加和處理。所以要設計乙個這樣的資料結構實現對資料的儲存,例如讓每個儲存單元只儲存一部分的數值,在也運算的時候採用算數運算的進製方法來運算。

【設計表示】

抽象資料型別 chain;

定義乙個chainnode模板類來表示鍊錶類的成員變數,其主要包含兩個資料域,data和link,data表示節點的數值域,link表示鏈結域。,insert用來新增節點,delete用來刪除節點,first永遠指向鍊錶的頭指標,以儲存這個鍊錶的完整性。

在主函式中加一些**來實現大數的階乘過程中煉表的操作,在進製時,如果沒有高位,就insert乙個節點並且將進製的資料插到生成的節點當中,當向高位進製的時候,如果有高位就將僅為的數值和原高位相加,判斷是否需要在進製,迴圈上述判斷。

3. 編碼

開始做的時候每乙個節點中的數值運算不太好處理,畢竟不是int,乘法的時候進製的判斷和加法,迴圈等十分複雜,判斷語句很難實現好。解決方法就是除錯了乙個星期,把每個判斷與迴圈做好注釋,在跟蹤的時候看哪個判斷出了問題,在注意解決,這題還比較簡單,所以比較好調。

4. 程式及演算法分析

在main函式開頭輸入運算階乘的資料number,然後從2開始做乘法運算,如果超過10就向前進製,如果沒有前節點就insert,如果有就加在前節點的data域上面,如果加了之後有大於10,就迴圈前面的步驟,然後將鍊錶的數值乙個個給陣列,倒過來輸出就是結果了。

鍊錶的insert是往前面插,所以輸出的時候有點麻煩,所以我引進了乙個中間的陣列來幫助輸出,要是做的鍊錶是向後插的話就比較好輸出,這是值得改進的。還有就是在main裡寫**不是太好,所以吧那部分放到乙個函式裡就比較簡潔了。體會是想清楚了控制判斷,把程式寫出來還是比較容易的。

需要花時間、

5.附錄

【**】

#include "stdafx.h"

#include "iostream.h"

template

class chain;

template

class chainnode

;template

class chain

~chain();

chain& delete(int k,t& x);

chain& insert(int k,const t& x);

chainnode* first;

};template

chain::~chain()

}template

chain& chain::delete(int k,t& x)

else

p=q->link;

q->link=p->link;

}x=p->data;

delete p;

return *this;

}template

chain& chain::insert(int k,const t& x)

if(k>0 &&!p)

else

return *this;

}int main(int argc, char* ar**)

currentfirst=chain.first;

rest=0;//清零,不然下次加的時候受上次運算的影響

total=0;

}currentfirst=chain.first;

for (i=0;i<=j;i++)

//輸出

for (i=0;i<=j;i++)

cout< return 0;

}【輸出】

實習題二

1.需求規格說明

【問題描述】

對乙個合法的中綴表示式求值

假設表示式只包含+,-,*,/四個雙目運算子,並且運算子本身不具有二義性。

【基本要求】

1. 正確的解釋表示式;

2. 符合四則運算法則;

3. 輸出後計算結果;

2.總體分析與設計

【設計思想】

為每乙個運算子設定乙個優先順序,然後根據輸入的中序表示式將其變成後序表示式,在根據後序表示式求得表示式的值。

【設計表示】

抽象資料型別 stake

頂點i的入度

先寫級函式,這裡寫的是level函式,傳入的是操然後返回其優先順序,左括號『(』的優先順序最大。設定為2,右括號『)』和『#』的優先順序最小,設定為-1.在就是加法還有減法的優先順序相同為0乘法和除法的優先順序比加減法大為1.

這是所有比較的依據,最基本的寒素,然後是比較函式,在入棧和出棧過程中頻繁呼叫,其傳入的是兩個運算子(char型),然後呼叫level函式,判斷其返回值的大小,如果前乙個的優先順序大就返回1,否則返回0,如果相等也返回0,但是如果傳入的值有『(』或『)』,則再加特殊判斷。然後是後續表示式函式,這裡是postpix函式。將使用者輸入的字元型陣列傳入,然後將後續表示式的陣列傳出。

中間根據棧的一系列特性和運算子優先順序關係進行出棧和入棧操作,最後儲存在結果陣列中。最後一步就是將後續表示式傳入計算函式這裡是calculate函式,將後續表示式也通過運算和棧操作實現計算值的功能。

在詳細設計表示主要講calculate函式和postpix函式,postpix函式有兩個傳入引數,char str和char strresult,其中前者是使用者輸入的陣列,後者是需要得到的結果字尾表示式陣列。首先在自定義的棧中壓入『#』,因為開始的時候棧中是沒有符號的,也就沒有優先順序的分別,這裡把『#』壓倒裡面去就是為了後面可以比較符號優先順序。然後優先順序高的壓棧,優先順序低的直接放到結果陣列中,如果是數字也是直接放到結果陣列中。

如果有括號,出棧或者入棧但是不放到結果陣列中,因為他們不需要操作。這樣就得到了字尾表示式。calculata則是乙個根據得到的字尾表示式求值的函式,其函式引數是字尾表示式和乙個浮點數的變數的引用。

在strresult傳入函式中去之後將結果儲存在result中,當然,在用這個函式的時候是要在函式體外宣告這樣乙個引數的。然後從左到右依次掃瞄表示式的個單詞,如果是運算元,存入棧中,如果是運算子,就提取前面的兩個運算元(從棧中彈出兩個數)進行運算,中間結果同樣存入棧中作為下乙個運算的運算元。如此反覆直到表示式處理完畢。

資料結構課程設計實習報告

球 include include class point二維座標點類 protected double x,y,z public point 預設建構函式 point double px,double py,double pz 帶引數的建構函式 double getx void move doub...

資料結構實習報告

接著猜的人再根據出題者的幾a幾b繼續猜,直到猜中為止。次數限制 有的時候,這個遊戲有猜測次數上的限制。根據計算機測算,這個遊戲,如果以最嚴謹的計算,任何數字可以在7次之內猜出。而有些地方把次數限制為6次或更少,則會導致有些數可能猜不出來。而有些地方考慮到人的邏輯思維難以達到計算機的那麼嚴謹,故設定為...

資料結構實習報告

實習報告 題目 編制解決約瑟夫環問題的程式 班級 09052713 姓名 張靜 學號 09052304 完成日期 2010.11.20 一 需求分析 1.利用單向迴圈鍊錶儲存結構模擬此過程,按照出列的順序印出各人的編號。2.演示程式以使用者和計算機的對話方式執行,即在計算機上顯示 提示資訊 之後,由...