注意每道题的难度等级不同,越多,难度等级越高.可以根据自己的_第1页
注意每道题的难度等级不同,越多,难度等级越高.可以根据自己的_第2页
注意每道题的难度等级不同,越多,难度等级越高.可以根据自己的_第3页
注意每道题的难度等级不同,越多,难度等级越高.可以根据自己的_第4页
注意每道题的难度等级不同,越多,难度等级越高.可以根据自己的_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、注意:每道题的难度等级不同,*越多,难度等级越高。可以根据自己的能力,选做恰当难度的题(至少选作2道题)。1. 假设描述月份信息的数据结构声明如下:struct Monthstring name;/ name of monthint monthNum;/ number of days in a month; 定义函数void CreateByYear(Month *months, unsigned year); 该函数的作用是根据参数year输入的年份,顺序产生该年份12个月的信息,并将这些信息存放到参数months指向的月份信息结构变量数组或链表。 定义函数void SortByName(M

2、onth *months, int n, bool order);该函数的作用是按字典顺序对months指向的n个月份信息以月份名(name)进行上升或下降排序。参数order 用来指示排序方式,order = true表示升序排列,order = false表示降序排列。 定义函数void SortByDays(Month *months, int n, boolorder);该函数的作用是对months指向的n个月份信息按月份的天数(monthNum)进行上升或下降排序。参数order 用来指示排序方式,order = true表示升序排列, order = false表示降序排列。要求:

3、在主函数main()中实现以下操作1 编写一段代码,实现通过键盘能选择输入年份值,然后根据所输入的年份生成该年的月份信息并保存到一个Month类型数组中。输入的年份值的选择范围为1900 2099。2 分别调用SortByName和SortByDays对输入年份的12个月份信息进行升序和降序排列。3 顺序显示未排序前,升序和降序排列后的全年的月份信息。4 每一步操作应该有恰当的提示信息,提供友好的操作和输出界面。5 能通过键盘输入确定不再选择输入年份值,即退出程序运行。提示:1 使用string类型需要在程序中包含使用C+标准字符串类型模板库<string>的预编译命令和使用使用C

4、+标准模板库名域的语句。这些代码添加在预编译头文件stdafx.h 中比较方便。添加的代码如下:#include <string>using namespace std;2 函数CreateByYear根据年份产生月份信息时,要判别年份是否是闰年。3 可以使用do while结构中实现要求的操作,可以通过从键盘输入的是否是空串的方法确定是否退出循环。4 注意使用getline从键盘获取用户指定的年份字符串,然后调用库函数atoi将输入的年份字符串转换为所需要的整数年份值。实现这一操作的示范代码如下:int year;string str;getline(cin, str);year

5、 = atoi(str.c_str();/ c_str()是string类型的成员函数,其作用可以将string/ 类型的数据转换为atoi函数所需要的const char*参/ 数类型。如果通过键盘输入复合键Ctrl+Z后按回车键,则str接收的字符串是一个空串。因此可以用判别输入的字符串是否是空串来确定程序是否继续执行。难度等级:*2. 编写一个能够从控制台键盘输入n个数据,并将所输入的数据进行从小到大的排序后显示输出。要求: 1 输入的数据个数n可以有用户确定。2 输入的数据类型可以由用户选择,可以选择的数据类型包括:int、double和string。提示:1 使用重载函数实现使用同名

6、函数处理不同类型数据的要求。2 使用不同类型动态数组输入、保存和输出由用户动态确定的数据。难度等级:*3 几何图形类Geometry的类图和定义如下:Geometry-V1:double-V2:double-figuretype:Figure+Geometry(in radius:double)+Geometry(in length:double, in width:double)+Geometry()+Border():doubleconst+Area():doubleconst+Diagonal():doubleconst+Type():Figureconstenum Figure Cir

7、cle, Rectangle;/ 自定义枚举常量,用于定义几何图形类别class Geometryprivate:double V1, V2;/ 根据几何图形的不同存放描述图形的参数:/ Circle:只需要用V1保存圆的半径值;/ Rectangle:需要用V1和V2分别保存矩形的长和宽Figure figuretype;/ 指定几何图形的类型:Circle或Rectangle public:Geometry(double radius);/ 构造圆形:V1 = radius, figuretype = CircleGeometry(double length, double width);

8、/ 构造矩形:V1 = length, V2 = width, figuretype = RectangleGeometry();double Border() const;/ 依据图形类型计算并返回图形的周长double Area() const;/ 依据图形类型计算并返回图形的面积double Diagonal() const;/ 依据图形类型计算并返回图形的对角线长度Figure Type() const;/ 获取并返回图形的类型;要求:1. 在程序中实现类Geometry的定义,并在类定义的外部实现类的构造函数和其他成员函数的操作定义。2. 在程序的主函数main中,能够实现如下操作:

9、 按照下图所示的几何关系,可以使用Geometry类创建一个描述(兰色)基圆的对象,一个描述(红色)基圆的外切矩形的对象和一个描述(绿色)矩形的外接圆的对象。创建这些对象的依据是由用户通过键盘输入的一个double类型的基圆半径值r(如图所示)。rX 使用中所创建的描述圆形和矩形的Geometry类对象进行如下操作:·按照图示从外向内顺序计算并格式显示每个图形的周长、面积和对角线;·计算并格式显示两个圆之间的环的面积;·计算并格式显示图示中标以X的弓形区域的周长和面积。 程序应能使用户能够多次重复上述和操作,直至用户要求结束操作。提示:1 在类 Geometry

10、的定义中所有用于判断图形种类和计算相应图形的面积、周长、对角线的成员函数的操作都是依据 Geometry 类对象的各个属性值,因此无须传递参数,而对象的各个属性值是在Geometry 类对象构造时确定的。2主函数main()的程序结构应该是一个循环结构。该循环结构可以根据用户的选择是否结束。在该循环中首先根据键盘输入的r值,按照要求中的几何图形关系,创建相应的Geometry类对象。然后使用这些所创建的Geometry类对象,计算所要求的结果。难度等级:*4. 试设计一个类用于对整数进行判别,并根据判别的结果分别统计所判别过的正整数、负整数和零的个数,并能格式显示其统计结果。1 该类的名称由用

11、户自行确定,例如类名为IntChecker。2 该类应有三个私有整型数据成员,分别作为存放所判别过的正、负整数和零个数的计数器。建议用于存放正整数个数的数据成员名可以命名为 positiveCount,用于存放负整数个数的数据成员名可以命名为 negativeCount,而用于存放零个数的数据成员名可以命名为zeroCount。3 在该类缺省的无参数的构造函数中,需要添加将存放正、负整数零个数的三个数据成员的初始值设置为0的操作代码。4 该类应拥有一个接口成员函数为Check(int n), 用于判别由参数n传递的整数值是正整数、负整数还是零,并分别修改所对应的数据成员的值。5 该类还应拥有另

12、一个接口成员函数Show(),用于格式显示三个数据成员中保存的判别统计结果。例如,显示格式和内容可以按如下所示:所判别的整数共 XXX 个其中正整数 XXX 个,负整数 XXX 个,零XXX 个。要求:1 在程序中实现类IntChecker的定义,并在类定义的外部实现包括构造函数在内的各个成员函数的定义。2 在程序中定义1个类外全程函数CheckInputValue,该函数的原型声明如下:void CheckInputValue(int in, int num, IntChecker checker);该函数的功能是使用IntChecker类对象checker对整数数组in中的num个数据依次

13、判别,并统计数组元素中的正、负数和零的个数。3 在程序的主函数main中按顺序实现以下功能: ·从键盘输入至少20个(正/负/零)整数,并将它们存放在一个预先定义的整型数组中。 ·创建一个IntChecker类对象,用于对数组中所有整数的判别统计。·使用存放输入整数的数组、数组元素个数和所创建的IntChecker类对象作为实参调用全程CheckInputValue。·调用IntChecker类对象的接口函数Show() 显示对输入的20个整数的判别统计结果;检查运行结果是否正确?如果发现运行结果是错误的,请将函数CheckInputValue的定义的第

14、三个参数修改为:void CheckInputValue(int in, int num, IntNTChecker &checker);而无须修改函数体中的操作代码。再次编译执行修改后的程序。比较两次运行结果,分析产生错误的原因是什么? *4. 要求编写编程文档,文档内容包括: IntChecker类图 IntChecker类定义描述 类成员函数Check和全程类外函数CheckInputValue的实现算法描述 main()函数的流程图难度等级:*5. 记录一个学生的平均分数的简单类Grade声明如下:class Gradestring name;/ 学生姓名float score

15、;/ 平均分数public:Grade(string n, float s);/ name =n, score = sGrade();/ 缺省设置 name = ”,score = 0.0。Grade();bool Compare(string n);/ 比较name是否与输入参数n相同。如果比较/ 结果相同函数返回true,否则返回false。void Read();/ 从键盘读入字串和浮点数为属性name和score/ 赋值(注意友好美观的输入提示)。void Show();/ 格式输出name和score的属性值。;要求:1 编写类Grade的各成员函数的实现代码。2 编写类外函数Sea

16、rch用于搜索具有一个具有n个Grade对象元素的数组Arr中是否包含与指定姓名name匹配的Grade对象元素。如果存在,则返回该元素在数组中的索引值(元素下标值),如果不存在,则返回-1。该函数的原型声明如下:int Search(Grade Arr, int n, string name);3 在主函数中创建和使用Grade类型对象实现如下操作: 创建一个含5个Grade类型对象的数组Students。并且在该数组创建时将前4 个元素(Student0Students3)的属性name和score分别初始化为:(“John”, 78.3),(“Sally”, 86.5),(“Bob”,

17、58.9)和(“Donna”, 98.3);而第5个元素(Students4)的name和score是在数组创建完成后通过键盘输入被初始化为(“Henry”, 92.5)的。 编写一段代码用于实现以下功能: 从键盘输入一个字符串,如果输入串不是空串,则搜索Students数组中是否存在姓名与输入串匹配的Grade对象,并根据搜索的匹配结果显示相应的信息(若匹配成功,显示搜索到Grade对象的信息;若匹配失败,显示恰当的错误提示);如果输入串是空串,则程序结束。*4 要求编写编程文档,文档内容包括: Grade类图 Grade类定义描述 类成员函数Read和全程类外函数Search的实现算法描述

18、 main()函数的流程图提示:1 声明Grade类型对象的数组Students的同时,对其中的元素进行指定的初始化的操作与预定义类型数组在声明时对元素的初始化相同,因此Students的声明代码可以写为:Grade Students5 = Grade(“John”, 78.3), Grade(“Sally”, 86.5), Grade(“Bob”, 58.9), Grade(“Donna”, 98.3);2 从键盘接收姓名字符串建议调用输入流的成员函数getline,调用方法例如:string name;getline(cin, name);即可从键盘获取字符串(该字符中可以包括空格)。如果

19、在键盘上键入复合键Ctrl+Z后回车结束一次输入操作,则会产生输入空串的结果,即name = “”。难度等级:*6. 如图所示,椭圆形可以由边长分别为2a和2b的外切矩形确定。常数a和b被称为椭圆的半轴,椭圆的数学方程为:(x x0)2/a2 + (y y0)2/b2 = 1(其中x0,y0表示椭圆的圆心坐标)椭圆的面积计算公式为ab。根据以上描述,试设计椭圆类Ellipse和矩形类Rectangle。两个类分别具有确定尺寸和形状的属性,并能通过构造函数对这些属性初始化;另外两个类还分别拥有用于计算面积的成员函数Area。使用Ellipse和Rectangle的类对象解决以下建设成本的计算问题

20、:在一个200feet X 150feet(feet = 英尺)的矩形区域内要建造如图所示两个椭圆形的游泳池。游泳池的平均单位成本为$250/feet2,游泳池的四周要铺设水泥,其单位成本为$0.50/feet2,试计算总造价。要求:1 设计和实现类Ellipse和Rectangle。2 在主函数中创建必要的Ellipse和Rectangle类对象。使用这些类对象完成要求的计算,并显示输出计算结果。*3 要求编写编程文档,文档内容包括: 绘制Ellipse和Rectangle类图 Ellipse和Rectangle类定义描述 main()函数的流程图难度等级:*7. 编写一个能模拟简单猜扑克牌

21、大小游戏的应用程序。该游戏的名称为Hi-Low,其玩法和规则如下:1 玩法 洗牌:每盘游戏开始之前,使扑克牌的排列顺序充分随机。 发牌:每局开始时,从未使用的扑克牌集合中顺序发给玩家5张扑克牌(明牌)。 猜点:从未使用的扑克牌集合中按顺序取出一张扑克牌(即庄家的暗牌),要求玩家将手中的第一张扑克牌和这张庄家的暗牌进行比较,确定哪张牌大? 积分:玩家确定回答后,翻开被猜的扑克牌(暗牌变成明牌),同时根据玩家回答的正确与否显示相应的提示,并为玩家的游戏成绩积分。然后将这两张已经比较过的牌回收到已经使用过的扑克牌集合中,玩家手中的下一张扑克牌成为新的一张扑克牌。 对玩家手中剩余的扑克牌顺序重复第和步

22、操作,直至玩家手中不再有剩余的扑克牌时,一局游戏结束。 如果未使用的扑克牌集合中的扑克牌数目多余10张,则从第步自动开始进行本盘游戏的下一局。 询问玩家是否继续进行下一盘游戏,如果继续,则从第步开始进行新的一盘游戏。2 规则 积分规则: · 猜中1次,积1分;猜错1次,不积分。 · 1局中连续猜中3次,除正常积分外奖励1分;连续猜错3次,罚1分。 · 1局全部猜中,除正常积分外奖励3分;1局全部猜错,罚3分。 · 玩家的最低积分为0,即不出现负分。 牌面大小比较规则:每张扑克牌的牌面由花色(梅花Club、方块Diamond、红心Heart和黑桃Spade

23、)和牌点(A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K)组成。确定两张扑克牌牌面大小的规则有两条:· 如果两张牌面的牌点不同,则牌面大小仅与牌点有关,而与牌面的花色无关。牌点的大小顺序为:2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A。· 如果两张牌面的牌点相同,则牌面大小仅与牌面的花色有关。花色的大小顺序为:Club < Diamond < Heart < Spade。要求:1 按照面向对象的思想分

24、析题意要求实现的需求,合理的分解对象类。2 设计和实现各个组成类。3 在主函数main()中,创建各个组成类对象,并通过这些类对象使用类功能实现游戏Hi-Low。*4 要求编写编程文档,文档内容包括: 绘制各个组成类的类图与类图之间的静态关系图 各个组成类的类定义描述 主要功能函数的算法描述 main()函数的流程图提示:1 分析各种扑克牌游戏,可以归纳出如下几条规律: 一副扑克牌,即扑克牌的全集是有54张具有不同牌面的扑克牌组成的。 任何一种扑克牌游戏都需要使用由n张扑克牌组成的集合,该集合可以是一副扑克牌的全集,也可以是一副扑克牌的子集,甚至可以是多副扑克牌的并集。例如Hi-Low游戏需要

25、使用一副扑克牌中除大小王牌Trump以外的52张牌组成的子集。 任何一种扑克牌游戏都会根据自己的玩法和规则,确定一种若干步特定操作构成的游戏程式。 每一种扑克牌游戏都会根据积分规则确定一个相对独立的积分计算器,依据游戏结果为玩家计算积分。2 根据上述分析,建议进行如下的对象类分解: 将扑克牌对象设计为一个类Card,用于定义标识每一张特定扑克牌的牌面(花色和牌点)和显示操作。为此该类可以用如下属性和操作描述:属性:· 牌面属性face作为每张扑克牌唯一标识,确定了每张牌的花色和牌点。该属性可以声明为一个包含了两个元素的整型数组。其中face0 用于存放牌面的牌点:1 - 13对应的牌

26、点为2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A;face1用于存放牌面的花色:1 4 对应的花色为Club, Diamond, Heart, Spade。为了使该属性不能被随意修改,因此该属性应该声明为私有成员。 操作: · 构造函数:无参数,便于创建对象数组。 · 初始化操作Init:依据传入参数值,为牌点face0和花色face1赋值。该操作应向外提供服务。 · 获取牌点操作Value:无须参数,返回face0的当前值。该操作应向外提供服务。 · 获取花色操作Face:无须参数,返回face1的当前值。该操作应向外提

27、供服务。 · 显示牌面操作Show:依据牌面属性face的当前值,显示相应的字符串。例如,当一张牌的牌面属性face0=12;face1=4,则显示的字符串就可以是Spade Q。该操作应向外提供服务。注意,如果在图形界面的应用程序中该操作就可以显示相应的牌面图形。 考虑到结构的合理性,可以将计算游戏积分所需要属性和操作封装在一个类中。该类可以命名为Counter,它所包含的属性和操作如下:属性:· 积分属性score:用于记录游戏的积分值。为了能记录足够大的积分值,该属性应声明为长整型long。· 连续标志属性sequence:用于存放玩家当前猜点操作的连续状态

28、:连续猜中时,sequence > 0(连续猜中的次数);连续猜错时,sequence < 0(连续猜错的次数);即未连续猜中,也未连续猜错时,sequence = 0。 操作:· 构造函数:将积分属性score和连续标志属性sequence初始设置为0。· 累计积分操作accumulate:根据玩家当前猜点操作的结果(布尔类型值, 通过实参传递该操作)修改玩家当前的连续猜中状态sequence,并根据猜点操作的结果和连续猜中状态,按积分规则玩家累计积分。该操作应向外提供服务。· 显示积分操作Show:显示游戏积分值。该操作应向外提供服务。·

29、 清除连续标志操作ClearSequece:在游戏新的一盘开始前,设置Sequece为0。 根据扑克牌游戏的玩法和规则,将扑克牌游戏设计成一个类。在类的定义中描述游戏该游戏所需要使用的扑克牌集合和所需要的辅助属性,以及满足游戏玩法和规则的各种操作。本题中的扑克牌游戏类可以直观地命名为HiLow,它应该包括如下属性和操作:属性:· 扑克牌集合属性deck:存放HiLow游戏所要使用的52张扑克牌(不需要大小王牌)。该属性是一个Card类型的数组。· 已用牌索引属性used:指示deck中游戏已经使用过的扑克牌的索引。每盘游戏开始时,该属性应被初始化为0(deck的第一个元素的

30、下标值);以后每次从deck取一张牌(为玩家每发一张牌或取一张被猜的牌)后,该属性值增1。该属性的值域为0 used 51。· 玩家牌索引属性index:指示当前玩家手中正在进行猜点操作的牌在deck 中的索引。每局游戏开始时,该属性值 = used;以后每次猜点操作完成后,该属性值增1。该属性的值域为0 index 51。· 积分计算器属性counter:该属性是一个Counter类对象,用于为游戏提供积分管理。 操作:· 构造函数:完成HiLow游戏对象的创建。在此创建操作中要完成各个属性必要的初始化,其中对deck中每个元素的初始化是调用 Card

31、类的Init操作逐个完成的。· 洗牌操作Shuffle:该操作应向外提供服务,用于deck中的元素(扑克牌)进行随机排列。模拟真实的洗牌操作可以通过52次将deck中的两个由随机下标索引的元素进行交换操作来实现。产生随机下标可以调用库函数rand来完成,52次交换操作就需要调用rand 52次。值得注意的是,在第一次调用rand之前应该调用另一个库函数srand为随机数发生器播种,即初始随机数,使得每次洗牌所需要的52个随机数序列都不一样。获得这个初始随机数的最简单方法就是调用库函数time获取当前的时间值作为初始随机数。因此调用srand创建随机数发生器的表达式可以写为:srand

32、(unsigned)time(NULL); 库函数rand和srand的原型声明在系统头文件stdlib.h中; 库函数time的原型声明在系统头文件time.h中。 另外,库函数rand所产生随机数的值域范围是0至整型数最大值,可以通过对函数的返回值模52运算(rand() % 52),获得值域范围为0至51的随机下标值。调用洗牌操作意味着新的一盘游戏的开始,因此,在上述随机排列操作完成后,需要将used和index设置为0,还需要调用积分计算器属性counter的成员函数ClearSequece清除积分连续标志(sequence = 0)。· 发牌操作Deal:该操作应向外提供服

33、务,用于每次为玩家发5张扑克牌。完成这一操作只需调整used和index的值,而无须发生扑克牌的获取操作。· 显示玩家手中牌操作PlayerShow:该操作应向外提供服务,用于显示当前玩家手中所有可以用猜牌操作的扑克牌的牌面信息。这些牌的索引范围是:index至index + 4。· 比较操作Check:该操作应向外提供服务,用于一次比较玩家明牌和庄家暗牌大小的操作,并返回比较结果(布尔)标志(玩家牌大为ture,否则为false)。被猜的两张牌的索引可以通过index和used获得(注意访问后,需要对index和used属性值分别增1)。· 显示猜牌结果操作Re

34、sultShow:该操作应向外提供服务,用于在比较操作Check被调用后,显示用于比较大小的玩家牌和庄家牌的牌面信息,即根据比较结果(作为实参传递给操作)显示相应的提示信息。注意,被显示的两张牌的索引是index - 1至used - 1。· 积分操作accumulate:该操作应向外提供服务,该操作是根据玩家的本次猜牌结果(布尔)标志(猜中为true,否则为false),调用积分计算器counter的成员函数accumulate完成玩家的游戏积分计算和管理。玩家的本次猜牌结果应通过布尔类型实参传递给操作的。· 判断一局结束操作IsGameOver:该操作应向外提供服务,用

35、于提供游戏的局结束(布尔)标志(结束为ture,未结束为false)。如何判断一局是否结束,可以通过分析index值的变化规律发现。注意,如果一局结束,还需要调用积分计算器counter的成员函数ClearSequece清除积分连续标志(sequence = 0)。· 判断一盘结束操作IsSetOver:该操作应向外提供服务,用于提供游戏的盘结束(布尔)标志(结束为ture,未结束为false)。如何判断一盘是否结束,可以通过分析used值的变化规律发现。· 显示游戏积分ScoreShow:该操作应向外提供服务,用于显示玩家的当前戏积分。此操作是调用积分计算器属性count

36、er的成员函数Show实现的。3 在主函数main()中创建HiLow游游戏对象,使用该对象提供各项操作功能,实现游戏的玩法所要求的操作和控制。注意,在游戏的各步操作中应提供恰当的提示信息,以便提供友好的操作界面。难度等级:*8. 定义一个用于链表的学生结点类Student,它的定义如下所示: class StudentLong id;/ 学生学号string name;/ 学生姓名int age;/ 学生年龄string sex;/ 学生性别string specialty;/ 所学专业Student* next;/ 指向链表中下一个Student结点类对象的指针static Long nu

37、mTotal;/ 学生总数,该属性在所有的学生对象创建前应被初始化/ 为学号基数(第一个学生的学号),每个新生的学号=该/ 属性当前值,然后该属性值增1。public:Student();/ id=numTotal,name=”,age=6,sex=”,specialty=”,/ next=0,numTotal +Student(string n, int a, string s, string spec);/ id=numTotal, age=a, name=n,sex=s,/ specialty=spec,next=0,numTotal +Student();int Compare(lon

38、g id);/ 将学生对象的学号与指定的学号id进行比较,/ 如果Student:id < id时,则返回-1;/ 如果Student:id = id时,则返回0;/ 如果Student:id > id时,则返回1。void Print();/ 按确定的格式在标准输出设备上输出学生各项信息。输/ 出格式可以按如下形式:/ 学号:XXXXXXXXXX/ 姓名:XXXXX年龄:XX 性别:XX/ 专业:XXXXXXXXXX;要求:1 在类定义体外实现Student类各个成员函数的定义。2 定义一个单链表结构的学生信息集合类StudentSet,该集合可以按学号顺序插入需要保存所有的学生

39、信息(每个学生的信息保存在Student类对象),可以查询指定的学生信息,可以删除指定的学生信息,可以显示集合中保存的所有学生信息。为此,学生信息集合类StudentSet必须具有必要的属性和操作: 集合链表头指针head,用于指向链表的头结点,因此它的类型应该是Student*。 该指针在StudentSet对象创建时必须被初始化为空(head = 0)。该指针只在类对象的操作中被访问,所以它是private数据成员,并且不需要提供在类对象外访问head的接口。 集合构造函数StudentSet,链表结构集合创建时应是一个空链表。 集合析构函数StudentSet,链表结构集合析构(撤消)时

40、,如果链表不为空,则需要将链表中的各个结点逐一撤消。 集合判空操作IsEmpty,该成员函数用于判断集合(即链表)是否为空,并将判断结果以一个布尔(bool)类型值作为标志返回。 学生信息结点插入操作Insert,该成员函数的功能是将一个动态创建的Student类型的新生对象作为结点按学号顺序插入链表。创建新生对象所需要的各项属性(姓名、年龄、性别、专业)应通过参数的形式传递给函数的操作。注意,新生必须是在堆中动态创建的对象,而不能是在堆栈中创建的局部对象。 查询指定学生信息操作Contain,该成员函数的功能是查询集合中是否存在指定学号的学生。被查询学生的学号通过参数的形式传递给函数的操作,

41、如果被查询学生存在,则返回链表中该学生的地址,否则返回空地址。 删除指定学生信息操作Delete,该成员函数的功能是:如果指定学号的学生在链表中,则将该学生从集合中删除;否则结束操作。被删除学生的学号通过参数的形式传递给函数的操作, 显示集合中全部学生信息操作ShowAll,该成员函数的功能是:如果集合不为空,则顺序输出集合中所有学生的信息。3 在主函数main()中完成如下操作: 建立一个学生信息空集合(StudentSet类对象)。 显示集合中的全部学生记录信息。 编写一段代码实现通过键盘能逐个输入任意个学生的各项信息(姓名、年龄、性别和专业),并以这些信息为参数创建学生信息记录(Stud

42、ent类对象)对象, 并将它们顺序插入链表中,直至人为结束输入(例如,通过键盘输入Ctrl+Z)。 再次显示链表中的全部学生记录信息。 编写一段代码能够实现以下所描述的任意次查询操作:· 通过键盘输入学号;· 根据此学号在集合中查找有无学号匹配的学生记录;· 如果存在,则显示该学生的信息;· 询问用户是否从集合中删除该学生记录;· 若删除,则将学生记录从集合中删除,然后显示集合中的全部学生记录信息;· 如果集合中没有学号匹配的学生记录,否则显示相应的提示信息;· 直至集合为空或人为结束查询操作(例如,通过键盘输入Ctrl+Z

43、)。*4 要求编写编程文档,文档内容包括: 绘制Student和StudentSet类图和类图之间的静态关系图 Student和StudentSet类定义描述 main()函数的流程图提示:1 由于链表集合类StudentSet中结点是Student类型,为了操作方便和提高访问速度,应该在Student类中将StudentSet声明为友元。为此,需要对Student的定义做相应的修改。2 学号的构成规则可以确定为年级+5位长度的注册顺序号,例如,2005年级的学生学号基数 = 200500001。3 从键盘接收字符串建议调用输入流的成员函数getline,调用方法例如:string id;ge

44、tline(cin,id);即可从键盘获取字符串。如果在键盘上键入复合键Ctrl+Z后回车结束一次输入操作,则会产生输入空串的结果,即id = “”。难度等级:*9. 数值的进制的表示总是用以进制n为模的余数所对应的数值码组成的,例如,2进制数的数值码为0,1;3进制数的数值码为0,1,2;而10进制数的数值码为0,1,2,3,4,5,6,7,8,9等。根据上述概念,定义一个能够表示任意进制整数的自定义整数类RandomInt,该类能表示2至16进制之间的任意进制整数,也就是说,能按照当前进制整数的运算规则和表示规则对该整数类对象施加算术四则运算和进行输入输出操作。要求:1. 正确、合理地设计

45、和实现能满足题意要求的任意进制整数类RandomInt。为此要求该类应包括以下属性和操作:属性: 进制属性mod:该属性为int类型,取值范围为2,16。该属性用于存放RandomInt类对象的当前进制值,例如,mod = 3,表示RandomInt类对象表示的是三进制整数。该属性是判定输入数值码合法性和输出数值码转换的依据。 数值属性value:该属性为int类型,取值范围为系统确定的整型数取值范围。该属性用于存放RandomInt类对象的当前值,注意该数值总是以十进制表示的,这样将有利于利用系统已经确定的十进制整数的操作规则。而表示该数值的数值码取决于进制属性mod,例如,RandomIn

46、t类对象的value = 45,mod = 3,则表示该整数对象的数值码就应该是1200;如果RandomInt类对象的mod = 8,则表示value = 45的数值码就应该是55。 操作: 构造函数应能适应两种情况: ·不传递参数的构造函数:该构造函数将进制属性mod设定为缺省进制值10, 数值属性value 设定0,也就是构造一个表示十进制的RandomInt类对象,其初值等于0。 ·传递指定进制值和数值的构造函数:该构造函数通过参数将所创建RandomInt类对象的进制属性mod设定为指定进制,将数值属性value设定为指定值。 ·拷贝构造函数:由于属性v

47、alue是一个需要动态分配存储空间的指针,因此必须为RandomInt类对象自定义拷贝构造函数。注意根据进制值的取值范围检查参数所传递的进制值的合法性。 算术四则运算操作:能使用算术四则运算符完成两个RandomInt整数的算术四则运算操作并返回计算结果(RandomInt整数)。这类操作必须在两个同进制的RandomInt整数对象之间进行,因此在运算操作之前,必须判别参与运算的两个RandomInt整数对象的进制是否相同;如果不相同,则先进行进制的转换规一,然后在进行相应的四则运算操作。进制的转换规一规则指定为“向左规一”,即转换右操作数的进制与左操作数的进制一致。注意,重载的四则运算符应该

48、能满足参与运算的两个操作数中可以有一个是系统预定义int类型常数(10进制),而运算符的返回值必须是一个RandomInt类对象。 输入、输出操作:能对标准输入流cin使用输入运算符 >> 和对标准输出流cout使用输入运算符 << 对RandomInt类对象所表示的整数进行输入和输出操作。在这类操作中应注意以下几点:·输入操作是将从标准输入流中获得的一个由数值码组成的字符串,并按照目标(RandomInt)对象的进制属性mod检查字符串中数值码的合法性,将字符串中连续的合法子串转换为相应的十进制数值,赋予RandomInt类对象的数值属性value。例如,从

49、标准输入流获得的字符串为”-12100420”, RandomInt类对象的进制属性mod = 3,则合法子串为”-12100”,转换后的十进制值是-144,即RandomInt类对象的数值属性value 被赋值为 -144。 ·输出操作是将源(RandomInt)对象的value中保存的十进制数值按照进制属性mod中存放的进制值转换为相应进制的数值码字符串,并该字符串添加到标准输出流中输出显示。例如,被输出的RandomInt类对象的mod = 3,value = 145,则转换输出的数值码字符串是”12101”。 注意,符号应该单独处理。 改变进制操作:将RandomInt对象的

50、进制属性mod的值修改为由参数指定的新进制值。注意根据进制值的取值范围检查参数所传递的进制值的合法性。 类型转换操作:将RandomInt对象所表示任意进制整数转换为系统预定义整数类型int值,并返回。2. 定义一个类外全程函数void Solve(RandomInt& a, RandomInt& x, RandomInt& b);用于求解关于x的方程ax = b。3. 在主函数main() 中对任意进制整数类型RandomInt的功能进行如下验证: 创建3种不常使用的进制(例如,3、5、7进制)RandomInt整数对象,每种进制各创建3个对象。注意,要求每种进制的3

51、个对象中2个使用有参数的构造函数创建,1个使用无参数的构造函数创建。 通过标准输入流分别为使用无参数构造函数创建的3种进制的RandomInt 整数对象输入相应的数值。 通过标准输出流顺序输出显示所有已经创建的RandomInt整数对象。 使用所创建的RandomInt整数对象,分别验证三种模值的RandomInt对象的分配律:a * (b + c) = a * b + a * c 共验证4次,前3次操作中验证分配率表示式中的a、b、c使用3个相同进制的RandomInt整数对象,最后一次操作中验证分配率表示式中的a、b、c使用3个不同进制的RandomInt整数对象。每次验证都应显示恰当的提

52、示和验证结果。例如:a * (b + c) = XXXXa * b + a * c = XXXXX进制的四则运算分配率a * (b + c) = a * b + a * c成立注意,上述输出中X进制。的X是用于验证分配率的RandomInt整数对象的进制值;XXXX分别表示分配率表示左边和右边的计算结果。 调用类外函数Solve求解关于x的方程ax = b。共调用4次,前3次调用时方程中的a、b使用两个相同进制的RandomInt整数对象,最后一次调用时方程中的a、b使用两个不同进制的RandomInt对象。每次调用都应显示恰当的提示和求解结果。4. 要求编写编程文档,文档内容包括:(选作)

53、RandomInt类图 RandomInt类定义描述 重要类成员函数和全程类外函数Solve的实现算法描述 main()函数的流程图提示:1. n位任意m进制整数Nn-1Nn-2N2N1N0的值可以表示为:Nn-1×mn-1+Nn-2×mn-2+ + N2×m2+N1×m1+N0×m0 其中组成m进制整数每一位数码满足m-1 Ni 0。2. 数字的进制只是数值的计数和表示方法,而不会影响数值的大小,因此任意进制数字之间的算术四则运算既可以任意的m进制值,以“逢m进1”的规则直接按位进行;也可以将任意的m进制数字的值,按一种指定进制(10进制)进

54、行运算,然后再将运算结果按确定的m进制表示。两种实现方法的结果是完全一致的。3. 为了提高代码的重用率,应该将RandomInt类成员函数中使用超过一次的逻辑代码段定义成相应的内部操作,即私有成员函数。例如,可以将多个成员函数中需要使用的将m进制的数值码表示串转换为一个10进制整型数值的操作定义成一个私有成员函数,该函数可以命名为StrToInt;还可以将多个成员函数中需要使用的将一个10进制整型数值转换成m进制的数值码表示串的操作也定义成另一个私有成员函数,该函数可以命名为IntToStr。4. 类型转换运算函数必须是RandomInt类的成员函数,而算术四则运算符函数必须是RandomInt类的友元函数,并且每种运算符函数都应有3个不同版本,才能满足题意的要求。例如,+ 运算符的重载函数应该有3个版本,它们在RandomInt类定义中原型声明应为如下形式:.friend RandomInt operator +(const RandomInt&, const RandomInt&);friend RandomInt operator +(const in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论