C++思考题习题补充后的版本Word下载.docx
《C++思考题习题补充后的版本Word下载.docx》由会员分享,可在线阅读,更多相关《C++思考题习题补充后的版本Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
如果关系不成立,则返回false。
另外,该类还提供判定函数isZero(是零)。
如果有兴趣,可以继续提供成员函数multiply、divide和modulus。
3、创建TicTacToe类,使你可以编写一个完整的三连棋(tic-tac-toe)游戏程序。
这个饮食一个作为private数据 的3X3的二维整数数组。
构造函数应将空棋盘初始化为0,允许两个人玩游戏。
无论第一个人移动到哪里,都在指定的棋格中放置1,无论第二个人移到哪里,都在指定的棋格中放置2。
每次移动都必须到达一个空格。
在每次移动后,确定是否已分胜负,还是出现了平局。
此外,可以让玩家决定谁先走谁后走。
如果还想继续挑战,那么可以开发一个程序,在4X4X4的棋盘上玩三维的三连棋游戏。
注意:
这是一个极其挑战的项目,可能需要长达几个星期的努力工作。
思考题四:
1、创建一个SavingAccount类。
使用一个static数据成员annualInterestRate保存每个存款者的年利率。
类的每个对象都包含一个private数据成员savingsBalance,用以指示存款者目前的存款金额。
该类提供成员函数calculateMonthlyInterest,它将余额乘以annualInterestRate再除以12来计算月利息,这个利息应该加到savingsBalance中。
该类还提供一个static成员函数modifyInterestRate,它将static的annualInterestRate设置为一个新值。
编写一个驱动程序测试SavingAccount类。
实例化SavingAccount类的两个对象saver1和saver2,余额分别为$2000.00和$3000.00。
将annualInterestRate设置为3%,计算月利率并打印每个存款者的新余额。
接着将annualInterestRate设置为4%,计算下个月的利息并打印每个存款者的新余额。
2、创建类IntegerSet,它的每个对象可以存储0~100内的整数。
集合在内部表示为0和1的数组。
如果整数i在这个集合内,则数组元素a[i]是1。
如果整数j不在这个集合内,则元素a[j]为0。
默认构造函数将集合初始化成所谓的“空集合”,即其数组表示中所有元素都是0的集合。
提供常用集合操作的成员函数。
例如,提供unionOfSets成员函数,它生成第三个集合,这个集合是两个现有集合理论上的并集(即如果两个现有集合中只要有一个集合的元素为1,则第三个集合中的数组元素设置为1,如果在两个集合中的元素都为0,则第三个集合中的数组元素设置为0)。
提供intersectionOSets的成员函数,该成第三个集合,是两个现有集合论上的交集(即如果两个集合中只要有一个集合的元素为0,则第三个集合中的数组元素设置为0,如果在两个集合中的两个元素都为1,则第三个集合的数组元素设置为1)。
提供insertElement成员函数,它把一个新整数k插入到集合中(通过将a[k]设置为1)
提供deleteElement成员函数,它删除整数m(将a[m]设为0)。
提供printSet成员函数,它把集合打印为用空格隔开的数字列表。
只打印集合中出现的元素(即在数组对应位置上值为1的元素)。
提供isEqualTo函数,判定两个集合是否相等。
提供另一个构造函数,它接受一个整数的数组以及该数组的大小,并使用该数组初始化集合对象。
现在编写一个驱动程序测试你的IntegerSet类。
实例化几个IntegerSet对象,并且测试你的所有成员函数是否工作正常。
思考题五:
1、利用一个一维数组解决以下问题。
一家公司以底薪加提成的方式传给销售人员工资。
销售人员每周获得200美元的底薪。
外加本周达到一定销售额的9%的提成。
例如,一个销售人员一周的销售额是5000美元,就会得到200美元加上5000美元的9%,即总共650美元。
编写一个程序(利用一个计数器数组)。
判断有多少销售人员可以获得以下范围内的报酬(假设每个销售人员的报酬都将取整):
a)$200~$299
b)$300~$399
c)$400~$499
d)$500~$599
e)$600~$699
f)$700~$799
g)$800~$899
h)$900~$999
i)$1000及以上
3、回文是一种字符串,正读和反读该字符串都会得到同样的拼写。
例如,”radar”、”ablewasIereIsawelba”和“amanaplanacanalpanama”都是回文(如果忽略空格)。
编写一个递归函数testPalindrome,如果数组中存储的字符串是回文,则返回true;
否则,返回false。
这个函数应当忽略字符串的空格和标点符号。
4、编写一个程序,按(555)555-5555的形式输入电话号码字符串。
该程序应该利用函数strtock把区号、电话号码前3位和后4位号码分别作为记号取出来。
电话号码的7位数字应该连接成一个字符串。
最后打印区号和电话号码。
5、针对下列各题,各编写一条C++语句完成指定的任务。
假设已经声明了长整型变量value1和value2,并且value1已初始化200000。
a)声明变量longPtr为指向long类型对象的指针。
b)把变量value1的地址赋给指针变量longPtr。
c)打印longPtr所指对象的值。
d)把longPtr所值对象的值赋给变量value2
e)打印value2的值。
f)打印value1的值。
g)打印存储在longPtr中的地址。
打印出的值是否和value1的地址一样?
思考题六~七:
1、一些快递商,如FedEx、DHL和UPS,都提供多样化的服务,同时也收取不同的费用。
创建管委会表示各种上不同包裹的继承层次。
以包裹类Package作为基类,两日包裹类TwoDayPackage和连夜包裹类OvernightPackage作为派生类。
基类Package应该包含代表寄件人和收件人姓名、地址、所在城市、所在州和邮政编码等的数据成员。
此外,还应饮食存储包裹重量(以盎司计)和第盎司费用的数据成员。
类的构造函数应初始化这些数据成员,并确保重量和每盎司费用为正值。
Package应该提供Public成员函数calculateCost,该函数计算重量和每盎司费用的乘积,得到的是与运输该包裹有关的费用并返回(返回值类型为double)。
派生类TwoDayPackage构造函数应继承基类Package的功能,但还应包含一个数据成员,表示付给两日快递服务的平寄费。
TwoDayPackage构造函数应接受一个值来初始化这个数据成员。
类TwoDayPackage还应该重新定义基类的成员函数calculateCost来计算运输费用,具体方法是将平寄费加到由基类Package的calculateCost函数计算得到的基于重量的费用中。
派生类OvernightPackage应直接继承基类,并且应包含一个附加的数据成员,表示传给连夜快递服务的每盎司的额外费用。
类OvernightPackage应当重新定义基类的成员函数calculateC灯笼,从而使它在计算运输费用之前,先将额外的每盎司费用加到标准的每盎司费用上。
编写测试程序,创建每咱Package的对象并测试成员函数calculateCost。
2、创建一个银行账户的继承层次,表示银行所有的客户账户。
所有的客户都能在他们的银行账户存钱、,但是账户也可以分成更具体的类型。
例如,一方面存款账户SavingsAccount依靠存款生利;
另一方面,支票账户CheckingAccount对每笔交易(即存款或取款)收取费用。
创建一个,以Account作为基类,SavingsAccount和CheckingAccount作为派生类。
基类Account应该包括一个double类型的数据成员balace,表示账户的余额。
该类应提供一个构造函数,接受一个初始余额值并用它初始化数据成员balance。
而且构造函数确认初始余额的有效性,保证它大于等于0。
如果小于0,则需将其置为0,并显示出错信息,表明该初始化余额是一个无效的值。
该类应当提供三个成员函数。
成员函数credit可以向当前余额加钱;
成员函数debit负责从账户中取钱,并且保证账户不会透支。
如果提取金额大于账户余额,函数将保持balance不变,并打印信息”Debitamountexceededaccountbalance”;
成员函数getBalance则返回当前balance的值。
派生类SavingsAccount不仅继承了基类Account的功能,而且还应提供一个附加的double类型数据成员interestrate表示这个账户的利率(百分比)。
SavingsAccount的构造函数应接收初始余额值和初始利率值,应应提供一个public成员函数calculateInterest,返回代表账户的利息的一个double值,这个值是balance和interestrate的乘积。
类SavingAccount应继承成员函数credit和debit,不需要重新定义。
派生类CheckingAccount不仅继承了基类Account的功能,还应提供一个附加的double类型数据成员表示每笔交易的费用。
CheckingAccount的构造函数应接收初始余额值和交易费用值。
类CheckingAccount需要重新定义函数credit和debit,当每笔交易完成时,从balance中减去每交易的费用。
重新定义这些函数应用(即调用)基类Account的这两个函数来执行账户余额的更新。
CheckingAccount的debit函数只有当钱被成功提取时(即提取金额不超过账户余额时)才应收取交易费。
提示:
定义Account的debit函数使它返回一个bool类型值,是表示钱是否被成功提取,然后利用该值决定是否需要扣除交易费。
当这个的类定义完毕后,编写一个程序,要求创建每个类的对象成员并测试它们的成员函数。
将利息加到SavingsAcount对象的方法是:
先调用它的成员函数calculateInterest,然后将返回的利息数传递给该对象的credit值。
思考题八~九:
1、设计Shape类层次结构。
每个TwoDinmensionalShape类都包含类成员函数getArea,用于计算二维形状的面积。
每个ThreeDimensionalShape类都包含getArea和getVolume,分别用于计算三维形状的表面积和体积。
编写一个程序,使用一个Shape指针的vector对象,它的元素指向类层次中每个具体类的对象。
程序应打印输出该vector对象每个元素所指的对象。
同样,在处理该vector对象的所有形状的循环中,程序应判断每个形状到底是TwoDinmensionalShape类的还是ThreeDimensionalShape类的。
如果属于TwoDimensionalShape类,就显示其面积,如果属于ThreeDimensionalShape类,就显示其表面积和体积。
2、使用在思考题6.1中创建的Package类继承层次结构,创建一个用于显示若干Package的地址信息并计算其运输费用的程序。
程序应该包含一个Package指针的vector对象,其中的指针指向TwoDayPackage对象和OvernightPackage对象。
遍历该vector对象,多态性地处理这些Package.。
对于每个Package调用获取函数,获得发送者和接收者的地址信息,然后打印输出这两个地址,就像它们出现在邮包标签上一样。
此外,调用每个Package的calculateCost成员函数并输出结果。
跟踪记录该vector中所有Package的总的运输费用,并在循环遍历结束时显示此总费用。
3、使用在思考题6.2中创建的Account类层次结构开发一个具有多态性的银行系统程序。
创建一个Account指针的vector对象,其中的指针指向SavingsAccount对象和CheckingAccount对象。
对于该vector对象中的每个Account,允许用户使用成员函数debit指定要从该Account取出的货币金额,并允许用户使用成员函数credit指定要存入该Account的货币金额。
处理每个Account时,应判定它的类型。
如果Account是SavingsAccount,就使用成员函数calculateInterest计算该Account应得的利息,然后利用成员函数credit把利息加到账户余额上。
处理完一个Account后,通过调用基类成员函数getBalance打印更新后的账户余额。
思考题十:
1、创建类RationalNumber(分数),使其具备以下能力:
a)创建一个构造函数,它可以防止分数的分母0,如果分数不是化简形式,它可以进行化简,并避免分母为负数。
b)重载加法、减法、乘法和除法运算符。
c)重载关系和相等运算符。
2、开发类Polynomial(多项式)。
在类内部,多项式由它的各项组成的数组表示,每一项包含一个系数和一个指数。
例如,项2X2的系数为2,指数为4.开发一个完整的类,包含适当的构造函数、析构函数及设置和获取函数。
此外,Polynomial类还应提供下列重载运算符的能力:
a)重载加法运算符(+),对两个Polynomial做加法。
b)重载加法运算符(-),对两个Polynomial做减法。
c)重载赋值运算符,把一个Polynomia赋给另一个。
d)重载加法运算符(*),对两个Polynomial做乘法。
e)重载加法赋值运算符(+=)、减法赋值运算符(-=)和乘法赋值运算符(*=)。
思考题十一~十三:
1、请为判断函数isEqualTo编写一个简单的函数模板。
isEqualTo函数利用等号运算符(==)判断两个同类型的参数是否相等,如果相等则返回true;
反之则返回false。
利用函数模板,在测试程序中只对多种内置数据类型调用isEqualTo函数。
接着,单独编写一个程序版本。
通过用户定义的类类型调用isEqualTo函数,但是不重载等号运算符。
2、使用类模板Array编写一个程序。
模板可以实例化为任意元素类型的数组。
使用特定定义为float类型的数组重载模板(即类Array<
float>
)。
而测试程序必须演示通过模板实例化int类型的Array,并展示如何用Array<
类中提供的定义实例化float数组。
3、编写一个函数模板palindrome,以一个vector为参数,根据vector顺序和倒序是否相同(例如,一个包含元素1,2,3,2,1的vector就是回文,而一个包含元素1,2,3,4的vector就不是),返回true或false。
思考题十四~十五:
1、利用继承来创建各种不同的runtime_error子类。
接着证明基类的异常捕获处理器可以捕获子类的异常。
2、写出一个返回double或者int的异常条件表达式。
同时提供一个int捕获处理器和一个double捕获处理器。
证明:
无论返回的是int还是double,只有double捕获处理器被执行。
3、编写一个程序,证明所有在一个块中创建的对象的析构函数都将在那个块中抛出异常之前被调用。
4、编写一个程序,证明只有在异常抛出之前创建的成员对象的析构函数才会被调用。
思考题十六~十七:
1、编写一系列语句完成下述要求。
假设我们已经定义了类Person,其中包含private数据成员如下:
charlastName[15];
charfirstName[15];
charage[4];
public成员函数如下:
voidsetLastName(string);
stringgettLastName()const;
voidsetFirstNmae(string);
stringgetFirstName()const;
voidsetAge(string);
stringgetAge()const;
同样,假设所有的随机存取文件都以适当的方式打开。
a)使用100条存储了lastName=”unassigned”、firstName=””和age=”0”的记录初始化文件nameage.dat。
b)输入10个包含姓、名、年龄的记录,并写入文件。
c)更新一条已包含信息的记录,如果记录没包含信息,就告诉用户“Noinfo”。
d)通过重新初始化特定的记录来删除一条包含信息的记录。
2、假设你是一个硬件商店的老板,需要一个清单来告诉自己有哪些不同的工具、手头上每种工具有多少个及每个价格是多少。
编写一个程序,使用100条空记录来初始化随机存取文件hardware.dat,允许输入每个工具的数据,可以列出所有工具,可以删除一条不再需要的工具记录并允许更新文件中的任何信息。
使用工具识别号作为记录号。
利用下面信息作为文件的开始信息。
Record#
ToolName
Quantity
Cost
3
Electricsander
7
57.98
17
Hammer
76
11.99
24
Jigsaw
21
11.00
39
Lawnmower
79.50
56
Powersaw
18
99.99
68
Screwdriver
106
6.99
77
Sledgehammer
11
21.50
83
Wrench
34
7.50
3、编写一个程序,使用sizeof运算符来判断计算机系统中各种数据类型的大小,以字节为单位。
将结果写入文件datasize.dat中,结果以两列的格式显示,左边一列为类型名称,右边一列为类型的大小,如下所示:
(计算机的内置数据类型大小可以与所列不同)
char1
unsignedchar1
shorint2
unsignedshortint2
int4
unsignedint4
longint4
unsignedlongint4
float4
double8
longdouble10
思考题十八~二十三:
1、利用MFC,建立单文档应用程序,制作一个限制鼠标移动范围的应用程序,当按住鼠标左键时,鼠标将不允许移出窗口范围。
.
2、利用MFC,建立单文档应用程序,制作一个可以动态创建菜单的应用程序,当单击“扩展菜单”命令时,在名为“颜色”的菜单项中显示两个扩展菜单命令。
3、利用MFC,建立单文档应用程序,制作可以使用自定义工具条的应用程序,工具条由三色按钮组成,工具条可以放置在窗口中的任意位置。
4、利用MFC,建立单文档应用程序,制作一个实现字幕滚到显示的效果。
5、利用MFC,建立单文档应用程序,制作一个计算器的应用程序,完成一些简单的数学计算。
6、利用MFC,建立单文档应用程序,制作一个使用计时器的应用程序,当鼠标放在窗口中一定时间内没有移动时,应用程序会发出一个提示性语句。
7、利用MFC,建立单文档应用程序,制作一个可以随时获取内存大小的应用程序。
8、利用MFC,建立基于对话框的应用程序,制作一个能够显示多个彩色按钮的应用程序。
9、利用MFC正规DLL生成一个自定义的控件,然后建立一个基于对话框的应用程序,用它调用生成的自定义控件实现控件的功能—交通灯的颜色变换。
10、利用MFC,建立单文档应用程序,制作一个划线的应用程序。
运行时可以看到一条在窗口中不停摆动的直线,编织成一副美丽的网状图形,图像随着直线摆动不停的变换,直到程序停止。
补充的思考题
1(素数)素数是只能被1和自己整除的整数,例如,2,3,5,7是素数,4,6,8和9不是素数,
h)编写一个函数,确定一个数是否是素数。
i)在程序中使用这个函数,该程序确定和打印2~10000之间的所有素数,在确信已找到所有的素数之前,实际需测试这些数中的多少数?
j)起初,你可能认为n/2是确定一个数是否为素数所要进行的最多的测试次数,但是实际上只需要进行n的平方根次就可以了。
为什么呢?
重新编写程序,用这两种方式运行,估计性能提高了多少?
2编写一个程序模拟硬币的投掷,对于每次投掷,程序应该打印出是正面还是背面。
让程序模拟投掷硬币100次,并计算正面和背面各自出现的次数,打印出结果,程序应该调用个单独的无参函数flip,在硬币出现背面时它返回0,在硬币出现正面时它返回1。
如果程序比较逼真地模拟硬币的投掷,那么硬币出现两面的次数应该是差不多的。
3计算机经常用在工资与账号支付应用之类的支票开写系统中,许多怪事经常出现。
如每周工资支票上错误地多开出一百万美元。
由于人为的或者机器的错误,使支票开写系统打印出不可思议的数值,系统设计人员在系统中建立控制,防止这种错误支票的发行。
另外一个严重的问题是有些人故意改变支票金额,想欺骗性的兑现支票。
为了防止篡改支票金额,大多数计算机化的支票开写系统采用了称为支票保护的技术。
设计给计算机打印的支票包含固定的可以打印金额的空间。
假设一张工资支票包含有8个空位的空间供计算机打印每周工资支票的金额,如果金额太大,则8个空位都会被填满。
例如,
1,230.60(支票金额)
------------
12345678(位置编号)
另外一个方面,如果金额小于1000美元,则部分空位空间会空在那里。
-----99.87
--------
12345678
包含3个空位空间,如