北郵小學期c 實驗報告

2021-04-09 02:41:44 字數 5785 閱讀 7076

物件導向程式設計與實踐

c++實驗總結報告

——網路工程14班饒思哲

——學號:2013211574

實驗一簡單c++程式設計

1. 猜**遊戲

編寫c++程式完成以下功能:

(1) 假定有一件商品,程式用隨機數指定該商品的**(1-1000的整數);

(2) 提示使用者猜**,並輸入:若使用者猜的**比商品**高或低,對使用者作出相應的提示;

(3) 直到猜對為止,並給出提示。

題目1-1總結:

1) 本題需要隨機生成整數,我開始只使用rand(),即price=rand();來生成隨機整數

但這樣只是乙個偽隨機函式,每一次重新開啟程式生成的數都是一致的。

因此加入時間隨機種子:srand((unsigned)time(null))

2) 個人改進1:定義最大值最小值,在每次猜測數字時顯示應猜的數字範圍,作為提示。

想到這個是因為有一次猜了很多遍都沒猜到,一時突然忘記猜到什麼範圍,然後往前翻猜過的數字和大小感覺相當麻煩,所以就添上了應猜範圍,方便再一次猜數。

3) 個人改進2:本來有乙個判斷條件判斷生成的隨機數是不是1~1000範圍內,而後更進為隨機生成整數對1000取餘得到0~999整數,再+1得到1~1000的整數。

實驗二類與物件

1. 矩形

編寫c++程式完成以下功能:

(1) 定義乙個point類,其屬性包括點的座標,提供計算兩點之間距離的方法;

(2) 定義乙個矩形類,其屬性包括左上角和右下角兩個點,提供計算面積的方法;

(3) 建立乙個矩形物件,提示使用者輸入矩形左上角和右下角的座標;

(4) 觀察矩形物件以及point類成員的建構函式與析構函式的呼叫;

(5) 計算其面積,並輸出。

題目2-1總結:

1) 這一題是第一次用到class類的題目,開始並不明白為何要定義class,然後還需要區分public和private。而後來去圖書館借了書看到c++最大特色就是可以封裝,定義私有屬性和公有函式,以確保有些函式和引數不會被輕易訪問到,降低錯誤率。

2) class類在最起初定義時總是在class rectangle那一行報錯,經查書發現class定義最後乙個大括號後有分號,開始並沒有加上。

3) 起初在呼叫class中函式時用c呼叫的方式,沒有跟面向的物件結合,導致編譯出錯,而後從distance()改為p.distance()就正確了。

4) 計算兩點距離和面積運用開方和絕對值函式,前面若沒有加標頭檔案math.h則會報錯。

5) 輸入左上角右下角座標時,若輸入不當,可能會出現面積為負值的情況,所以加上絕對值函式保證面積非負。

6) 起初不知道建構函式和析構函式的定義和用法,經翻閱書籍和執行程式得知建構函式在建立物件時呼叫,可以有多個。而析構函式則在釋放物件時呼叫,一般每乙個class中都只有乙個預設析構函式。且建構函式與類名稱一致,析構函式則在類名稱前加~。

2. 友元

編寫c++程式完成以下功能:

(1) 定義乙個boat和car兩個類,他們都具有私用屬性——重量;

(2) 編寫乙個函式,計算兩者的重量和。double totalweight(boat& b, car& c);

題目2-3總結:

1) 友元函式:在兩個物件中都使用到時,可以使用友元函式,並在類外單獨定義。

友元函式是允許在類外訪問類中的任何成員的。開始在類外單獨定義時跟類的成員函式單獨定義混淆,寫成了double boat::totalweight(),導致編譯錯誤,而後發現友元函式直接用函式名和函式返回值型別定義即可,不需要加上class類的名稱。

2) 起初定義完class boat和class car後發現編譯錯誤,在友元函式的宣告那一行出錯,而後發現在這行之前沒有定義car類,於是將其在最開頭宣告出來,通過。

3) 起初並沒有加上boat和car類的建構函式和析構函式,可是經上網查閱,預設建構函式和析構函式可以系統自動生成,但析構函式只能刪除成員指標,並不能釋放指標指向的空間,所以若沒有申請動態記憶體,析構函式可不寫出,若申請,則需自行在析構函式中delete。

實驗三陣列與指標

1. 矩陣(一)

編寫c++程式完成以下功能:

(1) 假定矩陣大小為4×5(整型陣列表示);

(2) 定義矩陣初始化函式,可以從cin中輸入矩陣元素;

(3) 定義矩陣輸出函式,將矩陣格式化輸出到cout;

(4) 定義矩陣相加的函式,實現兩個矩陣相加的功能,結果儲存在另乙個矩陣中;

(5) 定義矩陣相減的函式,實現兩個矩陣相減的功能,結果儲存在另乙個矩陣中;

(6) 定義三個矩陣:a1、a2、a3;

(7) 初始化a1、a2;

(8) 計算並輸出:a3 = a1加a2,a3 = a1減a2。

題目3-1總結:

1) 起初在矩陣相加相減的賦值中所用語句為:m.matrix[i][j]=a.matrix[i][j]+b.matrix[i][j]

但是執行程式發現m矩陣所有元素都是0。經單步除錯,發現並沒有賦值成功。經查閱書籍,了解到this指標是指向類的物件的位址,便改用this->matrix[i][j]作為賦值物件,最後程式正確。

2) 個人改進:將行數列數在檔案開頭用define定義,可以隨時更改。

3) 經多次除錯後,程式執行結果正確,但矩陣看起來非常混亂,因為並沒有行列對齊,於是在列印矩陣中每列直接用table空格隔開,保證美觀。

2. 矩陣(二)

編寫c++程式完成以下功能:

(1) 假定矩陣大小為4×5(整型);

(2) 矩陣空間採用new動態申請,儲存在指標中;

(3) 定義矩陣初始化函式,可以從cin中輸入矩陣元素;

(4) 定義矩陣輸出函式,將矩陣格式化輸出到cout;

(5) 定義矩陣相加的函式,實現兩個矩陣相加的功能,結果儲存在另乙個矩陣中;

(6) 定義矩陣相減的函式,實現兩個矩陣相減的功能,結果儲存在另乙個矩陣中;

(7) 動態申請三個矩陣:a1、a2、a3;

(8) 初始化a1、a2;

(9) 計算並輸出a3 = a1加a2,a3 = a1減a2;

(10) 釋放矩陣空間。

題目3-2總結:

1) 與3-1題目的區別在int main中用new函式動態申請記憶體,然後析構函式需要釋放申請的空間而不只是自動刪除指向空間的指標。析構函式如圖。

一開始並不知道該怎麼動態申請記憶體,在c中使用malloc可是c++中並不一樣。經查閱書籍,發現c++中申請釋放記憶體用new和delete非常簡便。

2) 指標呼叫類成員函式一開始不知道該怎麼寫,寫成a1.input()結果編譯錯誤。經查閱書籍,得知指標呼叫成員函式需寫成a1->input()的形式。

3) 在釋放動態記憶體時,用到delete函式。但開始的時候寫delete matrix時候會出問題。上網查詢後得到以下delete用法。

delete用法:當釋放內部型別,如int double型時,直接delete a 即可。若是釋放自己定義的class型別,需用deletematrix來釋放記憶體。

3. 矩陣(三)

編寫c++程式完成以下功能:

(1) 用類來實現矩陣,定義乙個矩陣的類,屬性包括:

● 矩陣大小,用 lines, rows(行、列來表示);

● 存貯矩陣的陣列指標,根據矩陣大小動態申請(new)。

(2) 矩陣類的方法包括:

● 建構函式,引數是矩陣大小,需要動態申請存貯矩陣的陣列;

● 析構函式,需要釋放矩陣的陣列指標;

● 拷貝建構函式,需要申請和複製陣列;

● 輸入,可以從cin中輸入矩陣元素;

● 輸出,將矩陣格式化輸出到cout;

● 矩陣相加的函式,實現兩個矩陣相加的功能,結果儲存在另乙個矩陣類,但必須矩陣大小相同;

● 矩陣相減的函式,實現兩個矩陣相減的功能,結果儲存在另乙個矩陣類,但必須矩陣大小相同。

(3) 定義三個矩陣:a1、a2、a3;

(4) 初始化a1、a2;

(5) 計算並輸出a3 = a1加a2,a3=a1減a2;

(6) 用new動態建立三個矩陣類的物件:pa1、pa1、pa3;

(7) 初始化pa1、pa2;

(8) 計算並輸出pa3=pa1加pa2,pa3=pa1減pa2;

(9) 釋放pa1、pa1、pa3。

題目3-3總結:

1) 拿到這道題我認為要定義乙個矩陣類物件,其中包括3-1和3-2一樣的input函式,print函式,plus函式,subtract函式,還有新增的建構函式析構函式。一上來我認為class中屬性不再是之前的某行某列的數值,而是行數和列數還有矩陣的頭指標。根據輸入的行數列數來申請記憶體,再將數值存入不同的位置。

然後在主函式中分為兩個部分,乙個是直接建立物件,另乙個是建立矩陣陣列指標。

2) 第一部分跟前兩題類似,所以很快就除錯完成並且得到了正確的結果,但是指標部分一直出現問題。最開始是三個矩陣分別申請記憶體,這樣的後果就是要輸入三次行數和列數的數值,有可能出現行列數不相等的情況,給之後的加減操作帶來麻煩。因此想到讓a1矩陣申請記憶體,而讓a2、a3矩陣都與a1相等,就可以避免多次輸入行列數,且保證了矩陣大小相等。

但這樣輸入第乙個矩陣數值後,矩陣元素獲取正常。可當輸入第二個矩陣的數值以後,a1和a2矩陣的元素都變為第二個矩陣的元素,即第乙個矩陣的元素被覆蓋掉。導致和矩陣為第二個矩陣的2倍,差矩陣都是零。

經過反覆除錯,曾經試過將含參建構函式中輸入行列數改到主函式中,再給a1申請動態記憶體。但是因為a2和a3還是初始化跟a1相等,結果並沒有改變,還是錯誤的。而後想到用含參建構函式來申請動態記憶體,輸入固定的行列數後,用確定的行列數來new matrix(x,y),這樣一來不僅矩陣大小相等,而且也不會存在前乙個矩陣的值被後乙個覆蓋掉的問題。

經過除錯,終於得到了正確的結果。

3) 除錯過程中我了解到指標初始化和賦值過程中是容易發生樹脂覆蓋的,所以盡量不要將指標初始化成跟某個指標相等。

實驗四繼承與派生

1、 形狀(一)

編寫c++程式完成以下功能:

(1) 宣告乙個基類shape(形狀),其中包含乙個方法來計算面積;

(2) 從shape派生兩個類矩形和圓形;

(3) 從矩形派生正方形;

(4) 分別實現派生類建構函式、析構函式和其他方法;

(5) 建立派生類的物件,觀察建構函式、析構函式呼叫次序;

(6) 不同物件計算面積。

題目4-1總結:

1) 這一題主要是函式的派生方法使用,經過查閱書籍,得知在class定義後加上:: public(基類名稱)便是作為乙個派生類的定義,可以沿用基類中的成員函式。

2) 並且經過對建構函式和析構函式呼叫,得知是先呼叫基類的建構函式,再呼叫派生類的建構函式建立派生類物件,在程式結束時,先呼叫派生類的析構函式釋放派生類物件,再呼叫基類的析構函式釋放基類物件。

2、 形狀(二)——虛函式

(1) 將【形狀(一)】中的基類計算面積的方法定義為虛函式,比較與【形狀(一)】程式的差異;

(2) 將【形狀(一)】中的基類定義抽象類,比較與【形狀(一)】程式的差異。

題目4-2總結:

1) 起初並不知道虛函式的作用,後來經過查閱書籍得知在基類中定義虛函式,是為了在派生類中定義這一函式的不同操作方式。並且起初只改變了基類中area函式,在其前面加了virtual,但並沒有體現出虛函式的運用。而後看到書上虛函式的應用,發現虛函式是可以讓乙個基類指標呼叫派生類相應函式的。

於是經過改進,在主函式中定義了3個基類指標,分別指向派生矩形類物件、派生圓形類物件、派生正方形物件,然後並非通過物件名稱呼叫成員函式,而是用基類指標呼叫派生類中的area函式,充分體現出對虛函式的應用。

2) 這一題雖然跟上一題相似,但卻因為運用了虛函式而變得不同。這一題讓我對虛函式有了更加深入的了解。也了解到呼叫類中的成員函式不一定非要用物件名或者物件指標呼叫,也可以用其基類的指標通過虛函式呼叫。

北郵計算機c 小學期程式設計實驗報告全

猜 遊戲 編寫c 程式完成以下功能 1 假定有一件商品,程式用隨機數指定該商品的 1 1000的整數 2 提示使用者猜 並輸入 若使用者猜的 比商品 高或低,對使用者作出相應的提示 3 直到猜對為止,並給出提示 矩形編寫c 程式完成以下功能 1 定義乙個point類,其屬性包括點的座標,提供計算兩點...

北郵通訊原理實驗報告

北京郵電大學 學院 資訊與通訊工程學院 班級 姓名 姓名 1 了解dsb sc am訊號的產生以及相干解調的原理和實現方法。2 了解dsb sc am訊號波形以及振幅頻譜特點,並掌握其測量方法。3 了解在傳送dsb sc am訊號加導頻分量的條件下,收端用鎖相環提取載波的原理及其實現方法。4 掌握鎖...

北郵移動通訊技術實驗報告

班級姓名 學號班內序號 這是我們第一次走出校園進行專業課實驗,來到了位於海淀區的大唐電信科技股份 公司的大樓前花團錦簇,更加襯托出大唐的輝煌業績。我想大家心中,都有一種由衷的嚮往之情。進入公司內部,我感受到了濃厚的工作氛圍,實驗室裡還有幾個埋頭工作的人,對著電腦偶爾相互討論交流。而我們有序地在電腦前...