作者SuperBEAR (bear)
看板NTUBIME96-HW
標題[解答] 計程期中考解答
時間Thu Nov 27 18:57:33 2003
╔═════════════╗
║九十二學年度期中考試題解答║
╚═════════════╝
【第一題】
A = 9
B = 0
C = 0
D = 2
E = 160
【第二題】
2 (換行) 5
3 (換行) 5
4 (換行) 5
3 (換行) 5
1 (換行) 5
P.S. 這題有一大票人因為那個 5 掛蛋.......
雖然很同情,但是填充題就是這樣....
【第三題】
0000000000
++++++++++
0000000000
++++++++++
0000000000
P.S. 怎麼很多人寫 0+0+0+.... 呢? @@
【第四題】
a = 10
a = 30
a = 10
a = 5
a = 5
a = 15
a = 16
a = 5
a = 16
a = 17
P.S. 基本上像這種題目,如果中間有哪個不會的話,
最好寫個「a = 」然後空下來,讓閱卷的人知道你只有這個不會,
而不是後面一整串都搞錯。
否則的話,就好像答案卡畫錯格一樣,那扣下來是很傷的...
這次我是根據你考卷上計算的痕跡來判斷,
不過如果你考卷白白的超乾淨,那就..........
【第五題】
#include <iostream>
#include <cmath>
using namespace std;
void main()
{
int i = 1;
// 計數器
while(i <= 10)
cout << pow(2, i++) << " ";
// 帶入 power function,印出值,然後把計數器加 1
cout << endl;
}
P.S. 老師特別規定要用 while,用 for 的人我酌扣兩分。
【第六題】
#include <iostream>
using namespace std;
float my_exp(int n);
// 計算指數函數的函式
void main()
{
// 呼叫函式並印出值
for(int i=1; i<=10; i++)
cout << "my_exp(" << i << ") = " << my_exp(i) << endl;
}
float my_exp(int n)
{
float e = 1;
// 指數函數的值,第一項為 1
float temp = 1;
// 計算個別項的變數
// 計算後面 19 項
for(int i=1; i<20; i++)
{
temp *= float(n) / i;
// 連乘以達到次方與階乘的效果
e += temp;
// 累計各項次
}
return e;
}
P.S. 看清楚,第 20 項是 (x^19 / 19!) 喔!
另外,請注意 temp *= float(n) / i; 這一行。
因為 n 和 i 都是 int type,所以程式會以 int 下去運算,
那出來就變整數了。是故一定要先轉成 float 再去除 i,
算出來的質才會是小數。這是很常見的 bug 來源,
請務必要特別小心。
(又,我看到有些人寫 float(n/i),這樣是沒用的。)
【第七題】
#include <iostream>
#include <iomanip>
using namespace std;
void main()
{
int a1 = 0;
// 第 n-2 項
int a2 = 1;
// 第 n-1 項
int a3;
// 第 n 項
// 先印出首二項
cout << setw(5) << a1 << "," << setw(5) << a2 << ",";
// 然後是剩下的 18 項
for(int i=2; i<20; i++)
{
// 計算這一項應該是多少
a3 = a1 + a2;
// 每一項都是前兩項的和
a1 = a2;
// 前進一項
a2 = a3;
// 前進一項
// 算完了就印出來
cout << setw(5) << a3 << ",";
// 每五項換個行
if((i+1)%5 == 0)
cout << endl;
}
}
P.S. 我發現很多人喜歡用遞迴,的確它在某些地方是很方便,
但是切記它會佔用大量的記憶體,並造成程式效能低落。
基本上,如果能不用的話,就最好不要用。
【第八題】
#include <iostream>
using namespace std;
int find_GCD(int, int);
// 找出 GCD 的函式
void main()
{
int int1, int2;
// 給人家輸入用
cout << "Please input two intergers : ";
cin >> int1 >> int2;
cout << "(" << int1 << ", " << int2 << ") = "
<< find_GCD(int1, int2) << endl;
}
int find_GCD(int a, int b)
{
int c = 0;
// 暫存器
while(1)
{
// 輾轉相除法
c = a % b;
// 看看餘數是多少
if(c == 0)
// 除盡了,那除數就是 GCD
return b;
// 沒除盡,把除數拿來當下次的被除數,餘數當下次的除數
a = b;
b = c;
}
}
【第九題】
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstdio>
using namespace std;
int two_dice();
// 擲骰子函式
void main()
{
cout << "這是一個閒閒擲骰子的程式..........\n"
<< "每次丟兩顆,共丟一萬次,\n"
<< "我會把每次的結果都印出來,\n"
<< "希望你有足夠的動態視力去看它.........\n"
<< "最後我還會把這一萬次的平均值告訴你,\n"
<< "可以順便複習一下機率.........@@\n\n";
cout << "隨便按個鍵,要開始丟了........\n";
getchar();
int d = 0;
// 這次的結果
float avg = 0;
// 平均值
for(int i=0; i<10000; i++)
{
d = two_dice();
// 丟啊...
cout << "第 " << i << " 次擲骰的結果是:" << d << endl;
avg += d;
// 累加
}
avg /= 10000.0f;
// 平均
cout << "\n丟完了,平均值是 " << avg << "\n";
}
int two_dice()
{
int d1 = rand()%6 + 1;
// 第一顆骰子
int d2 = rand()%6 + 2;
// 第二顆骰子
return d1+d2;
// 兩顆加起來傳回去
}
最後說一下評分標準:
1. 語法錯誤一次扣一分。
2. 邏輯錯誤視情況而定,從 2 分到 8、9 分都有可能。
3. 如果老師有特別要求(比如說要寫成函式什麼的)而沒有達到,扣兩分。
4. include 和 using 我不會特別去挑你有沒有漏掉,
說實在要去記哪個函式在哪個標頭檔也是滿無聊的。
然而有兩個情形例外,我還是會扣分:
a) 你有寫但是寫錯了,這種算在語法錯誤的帳上。
b) 你什麼都沒寫,那我會開始懷疑你是不是根本不知道有這回事.....
※ 有件事要特別提一下:
有幾位同學提出質問,他們引用的時候寫成這樣:
#include "iostream
.h"
然後不寫 using,為什麼我扣了一分?
的確這樣 compile 會過,但是那並不代表你應該這樣寫。
這要牽扯到 C++ 的演革,早期的 C++ 是沒有 namespace 的,
此一觀念一直到了第三版才被列入標準。
在新標準中,名稱空間的標示是必須的,
你如果不想每次都寫 abc::ooxx,那就請加個 using。
然而有許多程式是在第三版 C++ 誕生前就已經存在,
為了能夠與這些程式共存,所以制定出沒有 .h 的 header file,
讓編譯器以此為依據而達到向下相容的目的--這就是你能通過檢查的原因。
但是,namespace 之所以會被加入標準,就是因為名稱衝突實在太容易發生了,
我自己就遇到過許多遍........相信我,當你花了許多時間去 debug,
到頭來卻發現是這種問題的時候,要有強烈的自制力才不會去砸電腦.........
就如同許多 C++ 與 C 的差異一樣,這個規則有其必要性,是應該要去遵守的。
尤其現在是在學習的階段,我認為應該要養成習慣使用新的規則,
這是我扣分的理由。
最後,如果你仍然對你的成績有疑問,
歡迎下來農機館地下 105 實驗室,找個姓熊的理論。
(什麼?為什麼是 105?
呃,因為 405 太小了,所以每年都要有倒楣鬼被放逐......)
bear
--
這次的經典:
有位仁兄在第六題給我這樣寫:
e = 1+x+x*x/2+x*x*x/2*3+x*x*x*x/2*3*4+x*x*x*x*x/2*3*4*5
+x*x*x*x*x*x/2*3*4*5*6+...........(我沒力了....)
真是好樣的......
比起來那些在第七題用 cout 印 20 個數字的人真是太和藹可親了..........
--
你不也是獵人嗎?
來抓我啊!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.94.173
※ 編輯: SuperBEAR 來自: 140.112.94.173 (11/27 19:02)