《慕课版的c++答案.docx》由会员分享,可在线阅读,更多相关《慕课版的c++答案.docx(107页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第一章1简述冯诺依曼计算机的组成及工作过程。【解】冯诺依曼计算机由五大部分组成:运算器、控制器、存储器、输入设备和输出设备。 运算器是真正执行计算的组件。它在控制器的控制下执行程序中的指令,完成算术运算、逻 辑运算和移位运算等。控制器用于协调机器其余部分的工作。控制器依次读入程序的每条指令,分析指令,命令各 其他部分共同完成指令要求的任务。存储器用来存储数据和程序。存储器可分为主存储器和外存储器。主存储器又称为内存,用 来存放正在运行的程序和程序处理的数据。外存储器用来存放长期保存的数据。输入/输出设备又称外围设备,它是外部和计算机交换信息的渠道。输入设备用于输入程序、 数据、操作命令、图形、
2、图像和声音等信息。输出设备用于显示或打印程序、运算结果、文 字、图形、图像等,也可以播放声音和视频等信息。2简述寄存器、主存储器和外存储器的异同点。【解】寄存器、主存储器和外存储器都是用于存储信息,但级别不同。从功能来讲,寄存器 存储的是运算器当前正在运算的数据或当前正在执行的那条指令。主存储器保存的是正在运 行的程序代码和数据。外存储器保存的是需要长期保存的数据。从容量角度来讲,寄存器容 量最小,内存次之,外存储器最大。从访问速度来讲,寄存器最快,内存次之,外存最慢。3所有的计算机能够执行的指令都是相同的吗?【解】计算机能够执行的指令是直接由硬件完成的,与硬件设计有关。不同的硬件设计产生 不
3、同的指令系统。因此,不同类型的计算机所能执行的指令是不同的。4投入正式运行的程序就是完全正确的程序吗?【解】程序的调试及测试不可能将程序所有的路径、所有的数据都执行一遍,因此只能发现 并改正程序中的某些错误,而不能证明程序是正确的。5为什么需要编译?为什么需要链接?【解】计算机硬件能“认识”的只有机器指令,它并不认识程序设计语言,如C+。要使计 算机能够执行C+写的程序,必须把C+的程序翻译成计算机认识的机器语言,机器语言版 的程序称为目标程序。源程序到目标程序的翻译是由编译器完成的。程序员编写的程序通常会用到其他程序员或C+系统已经编好的一些工具,程序运行时会用 到这些工具的代码。需要将目标
4、文件和这些工具的目标文件捆绑在一起,这个过程称为链接。 链接器就是完成这个链接工作。链接以后的代码称为一个可执行文件。这是能直接在某台计 算机上运行的程序。6调试的作用是什么?如何进行程序调试?【解】调试的作用是尽可能多地找出程序中逻辑错误,使程序能给出正确的答案。调试一般 需要运行程序,通过观察程序的阶段性结果来找出错误的位置和原因,并改正错误。7试列出一些常用的系统软件和应用软件。【解】常用的系统软件有:操作系统、编译系统、数据库系统等。应用软件又分成通用的应 用软件和专用的应用软件。通用的应用软件提供一些常规的应用,如文字处理软件word, 媒体播放软件Media Play等。专用的应用
5、软件是某个领域专用的一些软件,如银行系统、 证券交易系统等。8为什么在不同生产厂商生产的计算机上运行C+程序需要使用不同的编译器。【解】因为不同的生产厂商生产的计算机有不同的机器语言,所以需要不同的编译器将同样 的C+程序翻译成不同的机器语言。9什么是源程序?什么是目标程序?为什么目标程序不能直接运行?【解】用某种程序设计语言写的程序称为源程序,源程序经过编译产生的机器语言的程序称 为目标程序。因为程序可能用到了一些其他程序员写好的程序,没有这些工具程序的代码整a .测试整型变量n的值在09之间,包含0和9。b .测试整型变量a的值是否是整型变量b的值的一个因子。 c .测试字符变量ch中存储
6、的是一个数字字符。d .测试整型变量a e .测试整型变量a f .测试整型变量a【解】的值是否是奇数。的值是否为5。的值是否为7的倍数sl . n = 0 & n = O & ch c &b = c b . a | b + c & b - c c . ! (a b) & !c d . (a ! = b) | | (b c&b=c =true & false =falseb . a | b + c & b - c =true | b + c & b - c =truec . ! (a b) & !c =true & false =falsed . (a != b) | | (b c) =tru
7、e | (b c) =true4用一个if语句重写下列代码 if (ch =z Ez)+c;if (ch =E) cout c endl;解 if (ch =,E,) +c; cout c endl; 或者if (ch =E) cout +c endl;5用一个switch语句重写下列代码 if (ch = E, | ch =,ez) +countE;else if (ch =A | ch =a) +countA;else if (ch =fIf | ch =,iz) +countl;elsecout error【解】else return LongLonglnt(dl) =(const si
8、gnedlnt &dl, const signedlnt &d2) if (dl.sign = * + 1 & d2.sign = 1 - 1 ) return true;if (dl.sign = 1 - 1 & d2.sign = + ) return false;if (dl.sign = +) return LongLonglnt(dl) = LongLonglnt(d2); else return LongLonglnt(dl) = LongLonglnt(d2);)bool operator= d2);bool operator d2); 5在第11章程序设计题第5题定义的安全的、
9、动态的二维数组Matrix的基础上定义一个 可指定下标范围的安全的、动态的二维数组MatrixAdvancedo【解】MatrixAdvanced在Matrix的基础上增加了 4个数据成员:rowLow、rowHigh、 colLow和colHigh,分别表示行和列的下标范围。MatrixAdvanced类重载了函数调用 运算符。构造MatrixAdvanced类对象时要给出行列的下标范围。构造函数用这些值初始 化新增的数据成员,并根据下标范围计算二维数组的行数和列数,将行数和列数传给基类的 构造函数构造一个基类对象。class MatrixAdvanced : public Matrix p
10、rivate:int rowLow;int rowHigh;int colLow;int colHigh;public:MatrixAdvancedfint rl, int rh, int cl, int ch):Matrixfrh - rl + 1, ch - cl + 1), rowLow(rl), rowHigh(rh), colLowfcl, colHigh(ch) double &operatorQ(int u int c) return Matrix:operatorQ(r - rowLow, c - colLow); );6 .在程序设计题2定义的安全的动态的一维整型数组Arra
11、y的基础上,用组合的方式定义 一个安全的动态的二维整型数组。m 二维数组可以看成是一维数组的数组。保存一个二维数组可以用一个指针数组,数组 的每个元素指向一个一维数组。所以Matrix类有3个数据成员:行数row、列数col和指向 数组Array起始地址的指针storage。所需的成员函数有构造、析构和函数调用运算符重 载。class Matrix int row;int col;Array *storage;public:Matrix(int r, int c);-Matrix();int operator()(int r, intc) ; ;Matrix:Matrix(int rz int
12、 c) : row(r), col (c)storage = new Array for (int i = 0; i Array(col); storage = new Array for (int i = 0; i Array(col); *row;row; +i) storagei = newMatrix:-Matrix()for (int i = 0; i = 0 & r readerNo;if (readerNo = noOfReader) cout ”非法的读者号! bookNo;if (recordreaderNo-bookBorrow(bookNo)cout ”借书成功! rea
13、derNo;if (readerNo = noOfReader) cout ”非法的读者号! ” bookNo;if (recordreaderNo-bookReturn(bookNo)cout ”还书成功! endl;else cout ”此读者没借过这本书,不能还! endl; void library:Show()(for (int i= 0; i noOfReader; +i) cout “读者” show();)有了上述工具,实现图书馆管理系统只需定义一个图书馆类的对象。切,然后显示菜单,根 据用户的选择调用。切的各项功能。int main()int selector;library
14、 obj;cin selector;while (true) cout H0 - cout n1 - cout n2 - cout H3 - cout 114 -退出” endl;添加读者” endl;借书” endl;还书” endl;显示借书记录” ercout ”请选择 ,switch (selector) case 0: return 0; case 1: obj.AddReader(); break; case 2: obj.Borrow(); break; case 3: obj.Return(); break; case 4: obj.Show(); )return 0;) 8定
15、义一个基本的银行账户类。在基本账户类的基础上派生出1年期定期账户、2年期定 期账户、3年期定期账户和5年期定期账户。定义一个n个基类指针组成的数组,随机生成n 个各类派生类的对象。让每个指针指向一个派生类的对象。这些对象可以是1年期定期账户、 2年期定期账户、3年期定期账户,也可以是5年期定期账户。输出每个账户到期的利息。 【解】基本帐户类有账号、账户名、开户日期和帐户余额4个数据成员。这些数据成员都设 为保护成员。基本帐户类只需要一个构造的功能,但为了规范派生类的功能以及实现多态性, 设计了一个纯虚函数showoinclude #include#include#include#include
16、#include #include class account protected: int no;char name10;char date7;double balance;double b);double b);public: account(int n, char *nm, char *d, virtual void show() const = 0;);account:account (int n, char *nm, char *d, double b) :no (n), balance(b) strcpy(name, nm); strcpy(date, d);)一年期帐户增加一个静
17、态的数据成员:一年期利率,所需的功能有显示帐户信息及到期利率, 另外还需要一个设置利率的静态成员函数setRateo 2年期定期账户、3年期定期账户,和5 年期定期账户的设计基本类似。class accountlYear : public account static double rate;public:accountlYear (int n, char *nm, char *d, double b) :account (nz nm, d, b) void show() const cout setw (10) no setw (15) name setw (10) balance setw
18、 (10) rate setw(10) balance * rate endl; static void setRate(double r) rate = r; ;class account2Year : public account static double rate;public:account2Year (int n, char *nm, char *d, double b) :account (nz nm, d, b) void show() const cout setw (10) no setw (15) name setw (10) balance setw (10) rate
19、 setw (10) balance * rate * 2 endl; static void setRate(double r) rate = r; );class account3Year : public account static double rate;public:account3Year (int n, char *nm, char *d, double b) :account (nz nm, d, b) void show() const cout setw (10) no setw (15) name setw (10) balance setw (10) rate set
20、w(10) balance * rate * 3 endl; static void setRate(double r) rate = r; );class account5Year : public account static double rate;public:account5Year (int n, char *nm, char *d, double b) :account (n, nm, d, b) void show() const cout setw (10) no setw (15) name setw (10) balance setw (10) rate setw(10)
21、 balance * rate * 5 endl; static void setRate(double r) rate = r; );按照题意,系统可以保存一组帐户,假设为30个,程序中的7ata就是用于保存指向这组 对象的指针。然后随机生成30个帐户。对于每个帐户,先生成帐户类别以及存入金额,我 们用0-3分别表示1年期、2年期、3年期和5年期帐户,然后根据帐户类别生成不同的帐户 对象,将地址存入数组data。最后输出每个帐户的到期利息。double accountlYear:rate = 0; doubleaccount2Year:rate = 0; double account3Yea
22、r:rate = 0;double account5Year:rate = 0;int main() (accoi.int.1 Year : : setRate (0,01);account2Year:setRate(0.02);account3Year:setRate(0.03);account5Year:setRate(0.04);account *data30;int type;char date 7 = n051112n;/12 年 11 月 5 日aaaaaaaaachar name10= double deposit;srand(time(NULL);/生成不同的帐户类型/生成不同
23、的账户名称/生成存入的金额/生成不同的帐户类型/生成不同的账户名称/生成存入的金额for (int i = 0; i 30; +i) type = rand() % 4;+nametype;deposit = rand() / 100.0;deposit); break; deposit); break; deposit); break; deposit);=newaccountlYear(i,name,date,=newaccount2Year(i,name,date,=newaccount3Year(i.name.date,=newaccount5Year(i,name,date,depo
24、sit); break; deposit); break; deposit); break; deposit);switch (type) case 0: datai case 1: datai case 2: datai case 3: datai)for ( i = 0; i show();delete datai;)return0; 第13章简答题【1】什么是模板的实例化?【解】类模板只是个设计图纸,不是一个真正的类。要使得类模板变成一个真正的类,必须 用真正的类型名或常量替换类模板的形式参数。这个过程称为类模板的实例化。实例化后, 类模板成为了一个真正的类,可以定义这个类的对象了。2为
25、什么要定义模板?定义类模板有什么好处?【解】有了类模板,可以将一组功能类似、存储方式也类似的类定义成一个类模板,可以进 一步减少程序员的工作量。3同样是模板,为什么函数模板的使用与普通的函数完全一样,而类模板在使用时还必 须被实例化?【解】在函数模板中,如果模板的形式参数出现在函数形式参数表中,那么当函数调用时, 编译器可以根据函数的实际参数的类型确定模板的实际参数,然后对函数模板进行实例化。 在定义类模板的对象时,无法确定模板形式参数对应的实际参数值,因此只能在程序中显式 地指出模板实际参数的值。4 .什么时候需要用到类模板的声明?为什么?【解】一般来说,当定义一个类模板是另一个类模板的友元
26、时必须要用到类模板的声明。当 类模板A声明类模板B是它的友元时,编译器必须知道有这样的一个类模板B存在。如果类模 板B的定义出现在类模板A的定义前面,则没有问题。但如果类模板B定义在类模板A后面时, 编译器就不知道B是什么,也无法确定类模板A中对类模板B的名是否合法,这时可以通过类 模板的声明来告诉编译器B是一个类模板。5 .类模板继承时的语法与普通的类继承有什么不同?【解】类模板继承时,凡是涉及到基类的地方,都必须在基类名后面跟上模板的形式参数名。即:基类名形式参数1,形式参数2,。6 .定义了一个类模板,在编译通过后为什么还不能确保类模板的语法是正确的? 【解】由于类模板包含有模板参数,这
27、些模板参数对应的实际参数在编译时尚未确定,所以 编译器无法确定那些类型为模板参数的数据或函数的用法是否正确,只好暂时不检查。第13章程序设计题1设计一个处理栈的类模板,要求该模板用一个数组存储栈的元素。数组的初始大小由 模板参数指定。当栈中的元素个数超过数组大小时,重新申请一个大小为原来数组一倍的新 数组存放栈元素。【解】栈类有3个数据成员。data为数组的起始地址,siz为数组的规模,top_p为栈顶位 置。有5个成员函数:创建一个空栈(由构造函数完成)、进栈(push)、出栈(pop)、读 栈顶元素(top)和判栈空(isEmpty) o还需要一个析构函数和一个工具函数doublSpac。
28、 template class stack private:T *data;int size;int top_p;void doubleSpace ();public:stack(int S) : size (S)z top_p(-1) data = new T size; -stack () delete data; void push(T d) if (top_p = size - 1) doubleSpace(); data+top_p = d; ) T pop () return datatop_p-; bool isEmpty() return top_p = -1;T top ()
29、 return datatop_p;); template void stack:doubleSpace() (T *tmp = data;size *= 2;data = new T size;for (int i = 0; i = top_p; +i) datai = tmpi;delete tmp;)2,设计一个处理集合的类模板,要求该类模板能实现集合的并、交、差运算。【解】模板的参数是集合中的元素类型。保存一个集合可以用一个动态数组,类模板的行为有并、交、差,我们用运算符+、*和-表示这3个运算。template class set friendsetoperator+(constse
30、t&sl,constset&s2);friendsetoperator*(constset& s 1,constset&s2);friendsetoperator-(constset& s 1 ,constset&s2);friend ostream &operator(ostream &os, const set &obj) (for (int i = 0; i obj.size; +i) os obj.datai 1t1; return os;private:T*data;intsize;public:set(T *d = NULL, int s = 0) : size (s)if (s
31、= 0) return;data = new Tsize;for (int i = 0; i s; +i) datai= di; set (const set &obj) : size(obj.size) if (size = 0) return;data = new Tsize;for (int i = 0; i size; +i) datai = obj.data i; set() delete data; set &operator= (const set &obj) if (&obj = this) return *this;if (size ! = 0) delete data;si
32、ze = obj.size;if (size = 0) return *this;data = new T size;for (int i = 0; i size; +i) datai = obj datai; );template set operator4- (const set &sl, const set &s2) (int i, j, k, s = si.size + s2.size;T *tmp = new Ts;for (i = 0; i si.size; +i) tmpi = si.datai; for ( j = 0 ; j s2.size; +j) for (k = 0;
33、k si.size; +k)if (si.datak = s2.dataj) break;if (k = si.size) tmpi+ = s2.dataj;)set obj(tmp, i);delete tmp;return obj; template set operator*(const set &sl, const set &s2) (int i = 0, j, k;T *tmp = new Tsi.size;for ( j = 0 ; j s2.size; +j) for (k = 0; k si.size; +k) if (si.datak = s2.dataj) break; i
34、f (k si.size) tmpi+ = s2.dataj;)set obj(tmp, i);delete tmp;return obj;) template set operator-(const set &sl, const set &s2)int i = 0, j r k;T *tmp = new Tsi.size;for ( j = 0 ; j si.size; +j) for (k = 0; k s2.size; +k) if (si.dataj = s2.datak) break; if (k = s2.size) tmpi+ = si.dataj;)set obj(tmp, i
35、);delete tmp; return obj;3在教材例13.1定义的Array类中,当生成一个对象时,用户程序员必须提供数组的规 模,构造函数根据程序员给出的数组规模申请一个动态数组。在析构函数中释放动态数组的 空间。如果用户程序员定义了一个对象后一直没有访问这个对象,动态数组占用的空间就被 浪费了。一种称为“懒惰初始化”的技术可以解决这个问题。所谓懒惰初始化就是在定义对 象时并不给它申请动态数组的空间,而是到第一次访问对象时才申请。修改类模板Array, 完成懒惰初始化。【解】在构造函数中不再为storag申请空间了,而仅把storag置为空指针。在下标运算 符重载函数中,在检查了下标
36、范围后还需检查storag是否为空指针。如果是空指针,则 先为storage申请空间/构造函数template Array:Array(int Ih = 0, int rh = 0) :low(Ih)z high(rh)r storage(NULL) /下标运算符重载函数 template T & Array:operator(int index) (assert (index = low & index = high);if (storage = NULL) storage = new Thigh - low + 1;return storageindex - low; .改写教材代码清单1
37、3-6中的单链表类,将结点类作为链表类的内嵌类。【解】template class linkList friend ostream &operator( ostream &, const linkList &); private:void makeEmpty () ;/ 清空链表class Node public: elemType data; Node *next; Node(const elemType &x, Node *N = NULL) data = x; next = N; Node( ):next(NULL) Node() );Node *head;public:linkList () head = new Node; linkList () makeEmpty(); delete head; void create(const elemType Sflag);); 第14章简答题【1】什么是打开文件?什么是关闭文件?为什么需要打开和关闭文件?【解】打开文件就是将一个文件流对象和一个文件关联起来。关闭文件是切断文件流对象与 文件的关系,表示不再需要访问此文件了。2为什么要检查文件打开是否成功?如何检查?【解】一旦文件打开失败,程序中的后续操作将无法进行。因此执行文件打开后必须检查打 开是否成功。当文件打开失败时,文件流对象会包含值0。
限制150内