作者SuperBEAR (bear)
看板NTUBIME96-HW
标题[解答] 计程期末考解答
时间Wed Jan 21 03:40:37 2004
突然想起来还没 po....@@
第一题:(10分)
写出下列 C++ 语法中 keyword 的定义或用途:
1. const
当宣告前面加上这个关键字时,表示所修饰的物件或变数不可被改变。
以这种方式宣告的话,必须要给定初始值。另外,若是一成员函式的後
面接上 const 关键字,则表示该函式不会变动成员中的物件。
2. static
表示所修饰的物件或变数为静态,此意义为其生命周期与程式相同,会
在程式刚开始的时候配置记忆体,并在程式结束前被消灭。尽管如此,
如果宣告时是位在某个区块中的话,仍然只有在该区块范围内能够读取
它。另外,对一个 class 来说,不管以此种结构宣告的物件有多少个,
其静态成员永远只有一份实体──所有的物件会共享这些静态成员。当
一个成员函式前面加上 static 时,表示该函式只会对结构内的静态成
员做存取。如果是不属於任何结构的普通函式被冠上 static 的话,则
没有这种限制;普通的静态函式只有一项特徵,那就是它不能被计画(
project,我实在不知道怎麽翻.....@@)中的其他档案存取。(这项特
徵是所有的静态变数或函式都具备的,包括之前所说的那些。)
P.S. 如果你在书上看到什麽不会改变之类的叙述,那是说它的位址不会
改变。静态变数并没有 const 的特性,不要弄错了。还有什麽「
每次看到它都是同一个」之类的,也是在强调它只会被建立一次。
这题很多人错喔......
又,如果不知道什麽是 project 的话,请务必去翻翻书喔!我一
时之间说不清楚....(绝不是因为懒! ....真的!)
3. sizeof
一个运算子,後面可以接变数或型态,会回传其所占用(或所需要)的
记忆体大小。这个回传值实际上是 char 型态大小的整数倍,会这样定
意原因是 C++ 标准中没有限定哪种型态应该占用多少记忆体,一切都
交由编译器来决定。几乎所有的编译器都是将 char 定为一个 byte ,
所以通常可以把这个单位想成是 byte ,不过实际上的情形还是要以使
用的编译器为准。另外,sizeof 回传的型态是 size_t,绝大多数的编
译器都将之定义为 unsigned int。
P.S. 你可能会有个疑问,不管是型态的大小也好,或者是 size_t 这种
奇怪的型态也罢,为什麽 C++ 标准不直接规定好,还要交给编译
器决定这麽麻烦?答案是为了弹性与相容性。不同的平台之下每种
型态适合的大小都不一样,比如说桌上型电脑跟手机多半就不会相
同;但是标准是大家都要遵守的。如果硬在标准中规定好一切,那
很可能就必须放弃某些平台。另外,就算在同一个平台下,由於种
种考量,每一家编译器定义的方式也可能不一样。交给编译器决定
的好处是,只要我的程式码符合公定标准,就可以在所有地方的流
通,每次跨平台的时候只要重新编译一次就好了,完全不必更动任
何一行程式码。
4. unsigned
表示所修饰的变数没有正负号的差别。由於将原本纪录正负的位元也拿
纪录数值了,所以可以储存比原本大一倍的数值。
5. return
从目前所在的函式立刻跳回到之前做出呼叫的函式中。(对 main() 来
说,则是回到作业系统。)除了标示成 void 的函式外,跳回去的时候
必须夹带一个变数,作为此函式执行的结果。
6. public
表示以下的成员对外公开,所有函式都可以存取这些成员变数,或是呼
叫这些成员函式。
7. struct
将各种型态的变数或函式组合起来,称此集合为一个结构,可以当成型
态使用。struct 为 class 的前身,两者的差别是 struct 中所有的成
员皆为 public。
P.S. 这题也有很多人错,struct 当然可以有函式啊,事实上它也是有
建构子与解构子的。
8. double
倍精准浮点数,是一种型态,与 float 大致相同,但容量为其两倍。
9. void
这个关键字有三种用法,当它在函式的前面时,表示这个函式没有回传
值;当它放在函式的传入值清单中时,表示这个函式不需要传入值;当
它作为一个指标的型态时,表示这是一个通用指标。一个被宣告成 void*
的指标可以指到任何型态的变数(const 变数除外),但是在它转型之
前没有办法被解读。通用指标可以转型成任何一种指标。
10. break
从 do、while、for、switch 中跳出来。
P.S. 终於打完这题了......看来老师跟我说解答第一题略过果然是相当有见
地.....@@ 不过我看这题普遍答得都不太理想,所以我还是写一下....
基本上不用太担心,老板的指示是只要有沾到边就给分,我是写来厘清
观念的。
第二题:(10分)
下列叙述执行後变数 A, B, C, D, E 之值分别为何?
int x[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}
;
int A, B, C, D, E;
A = x[7];
B = 20*x[1] + x[2];
C = *x;
D = *(x + 4);
x++;
E = *(x + 3);
Ans: A = 16 B = 86 C = 2 D = 10 E = 10
P.S. 偷偷吐嘈一下,老师少一个分号,扣一分。
第三题:(10分)
下列叙述执行後的输出为何?
#include <iostream.h>
main()
{
int a;
static char c[] = "Programming with C++ can be great fun!";
for(a=0; c[a]!='\0'; a++)
{
if((a%3) == 0)
cout << c[a];
}
}
Ans:Pgmnwh+c e n
第四题:(10分)
下列程式片段执行後的输出为何?
char s1[50] = 'JACK';
char s2[50] = 'MARY';
char s3[50];
strcpy(s3, s2);
cout << s3 << endl;
cout << strlen(s1) + strlen(s2) << endl;
strcat(s3, " and ");
cout << s3 << endl;
strcat(s3, s1);
cout << s3 << endl;
cout << s1 << " and " << s2 << endl;
Ans:
MARY
8
MARY and
MARY and JACK
JACK and MARY
第五题:(10分)
请设计一个程式其功能为输出一个九九乘法表於档案内。输出的档案名称为:
EXAM2004.TXT。 HINT: 你可能会用到下列之C++指令
ofstream outFile("EXAM2004.TXT", ios::out);
Ans:
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
ofstream outFile("EXAM2004.TXT", ios::out);
// 宣告一个 out file stream,
// 并准备写入 "EXAM2004.TXT" 这个档案
// 输出九九乘法表
for(int i=1; i<=9; i++)
{
for(int j=1; j<=9; j++)
outFile << i << "x" << j << " = " << i*j << endl;
outFile << endl;
}
// 结束档案
outFile.close();
}
第六题:(10分)
请设计一个程式,由键盘读入一个20x20的整数二维阵列,然後分别计算二维
阵列两条对角线元素的总合,将结果输出到萤幕上。
Ans:
#include "stdafx.h"
#include <iostream>
using namespace std;
void main()
{
cout << "请输入 20x20 的整数阵列 (400个耶!?请加油....)" << endl;
int matrix[20][20];
// 20x20 的矩阵
int sum1 = 0;
// 主对角线和
int sum2 = 0;
// 另一条对角线和
for(int i=0; i<20; i++)
for(int j=0; j<20; j++)
{
// 读入矩阵的值
cout << "A[" << i << "][" << j << "] = ";
cin >> matrix[i][j];
// 如果在主对角线上就累计
if(i == j)
sum1 += matrix[i][j];
// 如果在另一条对角线上就累计
if(i+j == 19)
sum2 += matrix[i][j];
}
cout << "辛苦了!两条对角线的和分别如下:" << endl
<< sum1 << "(左上到右下)" << endl
<< sum2 << "(右上到左下)" << endl;
}
第七题:(10分)
请写一个程式将一字串的所有旋转後的字串组合输出至电脑萤幕,每次只能
旋转一个字元。如字串"rotate"产生所有的旋转组合为:
rotate, otater, tatero, aterot, terota, erotat
Ans:
#include "stdafx.h"
#include <iostream>
using namespace std;
void main()
{
char str[100];
// 字串
int len = 0;
// 字串长度
int i, j;
// loop counter
cout << "输入一个字串:";
cin >> str;
len = strlen(str);
// 开始旋转,方法是将字串从中间切开,然後两个子字串交换位置。
// 要产生所有组合的话,只要切的位置从最左边不断往右移就好了。
for(i=0; i<len; i++)
{
// 输出後半段的字串
for(j=i; j<len; j++)
cout << str[j];
// 输出前半段的字串
for(j=0; j<i; j++)
cout << str[j];
cout << endl;
}
}
P.S. 老板是说用 char 阵列就好,不过基本上字串应该用 string 才对。
下面补上 string 的写法,我觉得你们应该有能力可以看懂了。
这样写的好处是不用担心输入太长会爆掉,而且运算方便。
#include "stdafx.h"
#include <iostream>
#include <string>
void main()
{
std::string str;
int len;
std::cout << "输入一个字串:";
std::cin >> str;
len = str.length();
for(int i=0; i<len; i++)
std::cout << str.substr(i, len) << str.substr(0, i) << std::endl;
}
第八题:(15分)
设计一个程式,输入国内某网站进行棒球选手网路票选结果的 N 个
球员(N<50)姓名与得票数,将结果以图形表现出来,图形以 1000
票为一个单位转换成一个星号,不足 1000 票者则舍去不计,将各球
员的得票数如下面之格式输出於萤幕。
=============================================================
球员 累计票数 绘图
=============================================================
陈致远 20650 ********************
张泰山 15874 ***************
谢佳贤 9718 *********
彭政闵 6871 ******
蔡泓泽 5849 *****
… … …
=============================================================
Ans:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
void main()
{
char name[50][100] = {{""}};
// 球员姓名(请注意二维阵列括号要两层)
int vote[50];
// 票数
int num = 0;
// 几个球员
int i;
// 回圈计数器
for(i=0; i<50; i++)
{
// 姓名
cout << "请输入球员姓名,或输入 \"-1\" 终止:";
cin >> name[i];
// name 是个 50 列 100 行的矩阵
// name[i] 的意思是第 i 列
// -1 就终止
if(name[i][0]=='-' && name[i][1]=='1')
break;
// 票数
cout << "请输入该球员的票数:";
cin >> vote[i];
// 累计球员数
num++;
}
// 画表格
for(i=0; i<60; i++)
cout << "=";
cout << endl << setw(10) << "球员" << setw(15) << "累计票数"
<< "\t绘图" << endl;
for(i=0; i<60; i++)
cout << "=";
cout << endl;
for(i=0; i<num; i++)
{
// 显示姓名与票数
cout << setw(10) << name[i] << setw(15) << vote[i] << "\t";
// 画星星
for(int j=0; j<(vote[i]/1000); j++)
cout << "*";
cout << endl;
}
for(i=0; i<60; i++)
cout << "=";
cout << endl;
}
第九题:(15分)
请以物件导向的观念设计一个程式计算长方形的周长与面积。
在此程式中你需要设计一个 Rectangle 的类别来记录与处理资
料。程式由使用者输入长方形的长与宽,分别计算出此长方形的
周长与面积输出至电脑萤幕。程式的要求如下:
1. 长方形的长、宽、周长与面积为 Rectangle 类别的内部
(private)资料,其读写需要由类别的成员函式来完成。
2. 分别设计设定长宽与计算周长与面积的函式,并将其设计
为 Rectangle 类别中的 public 成员函式。
3. 程式连续执行,至使用者输入结束指令後(自行设计)终止。
Ans:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Rectangle
{
public:
void SetLength(float l);
// 设定长
void SetWidth(float w);
// 设定宽
float GetArea(){return length*width;}
// 回传面积
// 因为这函式实在太短了,而且我想偷懒,所以打在这里;
// 不过这种写法很糟糕,平常还是尽量不要的好。
float GetAround(){return (2*length + 2*width);}
// 回传周长
private:
float length;
float width;
};
void Rectangle::SetLength(float l)
{
length = l;
}
void Rectangle::SetWidth(float w)
{
width = w;
}
void main()
{
float le, wi;
// 矩形长宽
Rectangle rect;
// 矩形
while(1)
{
// 读取长宽
cout << "请输入矩形的长:";
cin >> le;
cout << "请输入矩形的宽:";
cin >> wi;
// 设定长宽
rect.SetLength(le);
rect.SetWidth(wi);
// 显示面积周长
cout << "该矩形面积 = " << rect.GetArea() << endl
<< "该矩形周长 = " << rect.GetAround() << endl << endl;
// 继续?
char tmp;
cout << "继续吗?(Y/N)";
cin >> tmp;
if(tmp=='n' || tmp=='N')
// N 就跳出
break;
cout << endl;
}
}
就这样了。这次考题根本就大放水,而且老板说改松一点,
基本上我根本就昧着良心在改......@@
原始分数平均就有 6x,8x 分的一卡车........
--
「
唉...好吧,我长话短说,」
「
你...比妲己强吗?」
「
我绝对不会输她」
「
因为我不会和她打!!!!!!!!!!!」
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.166.73.37
※ 编辑: SuperBEAR 来自: 218.166.73.37 (01/21 03:50)
1F:→ jrshin:推~昧着良心 推 218.35.83.51 01/21
2F:→ jrshin:老师特地交代 所以我作业7成绩平移30~50分 推 218.35.83.51 01/21
3F:→ coldshawn:第六和第八题都用不到矩阵阿 推218.164.109.178 01/21
4F:→ SuperBEAR:不用也可以写的出来没错,不过一般而言, 推 218.166.73.37 01/21
5F:→ SuperBEAR:这种东西不会要人家用键盘输入,而且多半 推 218.166.73.37 01/21
6F:→ SuperBEAR:还会要做别的事情,所以存起来比较好 推 218.166.73.37 01/21
※ 编辑: SuperBEAR 来自: 218.166.73.37 (01/21 12:36)
7F:→ st3001:突然发现签名档 推推太公望XD 推 218.184.78.145 01/31
8F:→ sima:你好空虚喔~ 推 140.112.25.184 02/01
9F:→ wendychang:害我在想怎麽过了这麽久推文数又变多了... 推 218.174.158.16 02/01