You are on page 1of 21

1

2
3
IM1003
4 程式設計 Programming Design
5
6
7
Lab Meeting Week 14
8
9 2023/12/07
10
11
12
13
14
PD.html labMeeting.css

1
2
3
4
5
6
7
01 期末考 討論
8
9 02 GitHub WorkShop
10
11
12
13
14
PD.html labMeeting.css

01 {
1
2
3
4
5
6 [期末考 討論]
7
8
9
10
11

}
12
13
14
1
2
1. (a)
3
4 請實作 getAvgGrade() 這個函數,讓它回傳這個學生的按照學分數加權平均
5 後的平均成績。你可以假設所有已經被存好的 grade 一定都是介於 0 到
6
7 100(包含 0 和 100)的整數。請不要包含 exception handling。請寫
8 下這個函數的程式碼當作你的答案。
9
10 → function 正確性
11
12
13
14
1
2
1. (b)
3
4 撇開排版不考慮,請問目前的程式有沒有任何本課程中教過的錯誤或寫得不好的
5 地方?如果有,就逐一列舉、一一說明問題所在,並且修正它們;如果沒有,就
6
7 說沒有。
8
9
在回答時,請不要嘗試幫本題的程式做更多它目前沒有要做的事。
10
11
12
13
14
1
2
3
4
5
6
7 1. Declare a constant for 200
8
9
10
11
12
13
14
1
2
3
4
5
6
7 2. Course courseGrade → Course*
8
9 3. Initialize courseGrade to
10
11
200 nullptr
12
13
14
1
2
3
4
5
6
7 4. takeCourse
8
9 ● check c.grade & c.credit
10
11
● add c into courseGrades
12 if and only if they are
13
14 valid
1
2
3
5. Course is a weird structure:
4
a natural "course" does not
5
6 contain a grade information.
7
8
9
10
Create a new structure
11 "CourseGrade" to contain a
12
13 Course pointer and grade.
14
1
2
3
4
5
6
7
8
9
6. string → const string&
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12 7. Course c
13
14
→ const Course* c
(→ const Course& c)
1
2
3
4
5
6
7
8
9
10
11
12
13
14 8. + const
1
2
1. (c)
3
4 請幫 getAvgGrade() 和 takeCourse() 在所有合適的地方加入 exception
5 handling。你可以自己決定要拋出哪種 exception,只要是對的就行。你只要修
6
改這兩個函數就好,不用寫呼叫它們的地方要如何處理 exception。請寫下這兩個
7
8 函數的程式碼當作你的答案。
9
10
→ getAvgGrade:要處理學生完全沒修過課(學分 = 0)的情況
11
→ takeCourse:
12
13 要檢查傳入的 c.grade 和 c.credit 的合理性
14 要檢查現在的 courseCnt < 200
1
2
2. (a)
3 請透過繼承去建立一個新的類別以代表大學部學生,在該類別中提供變數和函數
4
以記錄雙主修資訊(如果該學生有的話)。關於第二個主修,只要用一個 C++
5
6 字串記錄該主修的名稱即可。在建立一個大學部學生物件時,該生一定只有一個
7 主修;如果獲得第二個主修,該資訊會在後續加入。請寫下這個類別的程式碼當
8
9
作你的答案。
10
11 → 繼承要先把 private 改成 protected
12 → constuctor 只有一種,且要有更新第二個主修的 function
13
14 → 看程式碼是否符合題目要求(第二個主修用 C++ 字串記錄名稱)
1
2
2. (b)
3 請透過繼承去建立一個新的類別以代表碩士班學生,在該類別中提供變數和函數
4
以記錄碩士論文指導教授資訊(如果該學生有的話)。請假設一位學生最多只會
5
6 有一位指導教授。關於指導教授,只要用一個 C++ 字串記錄其姓名即可。在建
7 立一個碩士班學生物件時,該生當下可能已有或尚未有指導教授。若該生在物件
8
9
建立時還沒有指導教授,則該資訊會在找到指導教授後加入。一位學生也可能換
10 指導教授。請寫下這個類別的程式碼當作你的答案。
11
12 → 要有兩種 constructor,處理建立物件時是否有指導教授的情況
13
14 → 要有更新指導教授的 function
→ 看程式碼是否符合題目要求(指導教授用 C++ 字串記錄名稱)
1
2
2. (c)
3 針對你在前面建立的三個類別,請自行設計一個多型的使用場景,並做相關實
4
作。你首先要說明是怎樣的場景需要使用多型,接著在三個類別中實作或新增必
5
6 要的成員函數或成員變數,最後在使用到相關物件的地方說明如何使用多型。實
7 踐多型後,你應該禁止程式中出現 Student 物件。
8
9
→ 明確說明情境 or 程式碼寫清楚 e.g. 提供情境相關的 main function
10
11 → 實作如果用到前面沒有的部分要明確寫出來
12
→ 要說明 student 會變成 abstract class
13
14
1
2
3. (a)
3 請說明有什麼場合是「必須要」實作 operator overloading 的。請注意這
4
裡問的是「必須」而不是「實作了會比沒實作好」。
5
6
7 → 實作了會比沒實作好:isBiggerThan 不好,要用 > 比較好
8 → 說清楚在某些場合,你一定得用 > 而不是 isBiggerThan
9
我們會按照你的說明去分段給分
10
11
12
13
14
1
2
3. (b)
3 若執行以下程式,在執行到 cout << "test\n"; 以前是一定會出現
4
run-time error(所以「test」一定不會被印出),還是有可能出現
5
6 run-time error(所以「test」可能會被印出)?為什麼?請詳細地說明
7 main function 裡面的每一句敘述被執行時系統內會發生什麼事,進而為你
8
9
的答案提供理由。
10
11
12
13
14
1
2
3. (b)
3 ● 很多人寫 destructor 會重複 delete,但實際
4
5 上還沒執行到 destructor,所以不是我們期待看
6 到的答案
7
8
9 → 沒有 copy constructor,(6) 會 shallow copy
10 → (8) 會把共用的 name 釋放再把 e2.name 指向新空間
11
12 → (10) 會去存取 e1.name,此時可能會也可能不會
13
run-time error,視 e1.name 指向的空間是否已經
14
被分配給其他程式而定
1
2
3. (c)
3 在前一小題的 Time 類別中,呼叫 print() 會印出類似「14:8:4」這樣的字
4
串,而不是「14:08:04」。在不新增 instance function 也不修改
5
6 print() 內的那句指令的前提下,請使用 template 讓 Time 可以視程式
7 設計師需求印出「14:8:4」或「14:08:04」(印出這兩個字串可以是透過使用不
8
9
同物件完成)。在回答本題時,如果使用了上課沒教過的方式,會被酌予扣分。
10
11
12
13
14
1
2
3. (c)
3
4
5 → 把三個 int 換成三個 typename T,
6
在建立物件時用 Time<int> 或
7
8 Time<string>
9 → 看程式碼是否符合題目要求(不新增
10
instance function 也不修改
11
12 print() 、使用 template)
13
14

You might also like