作者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)