




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.2 实验指导3.2.1 对象指针和对象引用【实验3-1】比较两个分数的大小 【问题描述】 设计分数类Fraction,它具有分子和分母两个数据成员,具有构造函数和读取分子、分母值的成员函数。定义全局函数compare(),其功能是比较两个分数大小,若相等,返回0,若第一个分数大于第二个,返回1,小于则返回-1。为简单起见,暂不考虑约分问题。【实例输出】【实验思路】本题重点在于全局函数compare()和分数类Fraction的设计。由于compare()中需要比较两分数大小,故应先实现Fraction类,再实现compare()。本题难点在于compare()的定义。很明显,该函数操作的对象是待比较的两个分数对象,因此compare()的函数原型有两种选择:(1) int compare(Fraction f1, Fraction f2); /形参是对象(2) int compare(Fraction &f1, Fraction &f2); /形参是对象引用请读者自行思考该选择哪种函数原型,理由是什么?【代码模板】(1) Fraction类声明部分class Fractionpublic:Fraction(int n,int d);int getNum() return numerator; int getDenom() return denominator; private:int numerator; /分子int denominator; /分母 ;(2) main()的实现int main()int x,y;cout x y;Fraction f1(x,y);cout x y;Fraction f2(x,y);int result = compare(f1,f2);cout f1.GetNum() / f1.GetDenom();if(result = 0)cout = ;else if(result = 1)cout ;elsecout ;cout f2.GetNum() / f2.GetDenom() endl; return 0;【问题拓展】请读者进一步思考,函数int compare(Fraction &f1, Fraction &f2)的形参类型是Fraction &类型好,还是const Fraction &类型更好,为什么?如果const Fraction &类型更好,应如何修改本程序?【实验3-2】模拟存钱罐【问题描述】可以将币值为1角、5角、1元、5元、10元的零钱存入存钱罐中,最多能存放100张。编程模拟存钱罐功能:用户按一次回车键代表存入一个零钱,币值随机。当用户键入除回车键外的任意键后,程序应打印出存钱总额,并分类统计出各类币值的零钱分别是多少。【实例输出】【实验思路】本题最难点是整个程序的框架布局。首先应确定问题涉及两个类:SavingBox类和Money类。而确定这两个类具有哪些类成员是最重要、也最困难之处。(1) SavingBox类由于存钱罐最多能存放100张零钱,因此其数据成员应该包含一个具有100个元素的指针数组“Money * items100”,数组中的每个指针均可指向一个Money类对象,利用该数组就实现了存钱罐的存钱功能。另外,为统计究竟存入了多少币,还应定义整型数据成员count,每存入一个零币就计数一次。围绕这两个数据成员,应具有的成员函数有构造函数、析构函数、存钱函数PutIntoMoney()和统计函数Count()。(2) Money类Money类仅有代表币值的浮点型数据成员value,其成员函数有构造函数和读取币值的函数getValue()。其中,构造函数应保证生成的币值是随机数,且该随机数在符合题目要求的范围内。此外题目要求用户按一次回车键投入一张零钱,故Money类对象可用动态存储分配实现。随机函数相关说明参见实验2-7。【代码模板】(1) Money类声明class Moneypublic: Money(); /产生的零钱面额是随机的! double getValue() const;private: double value;(2) SavingBox类声明class SavingBoxpublic: SavingBox(); SavingBox(); /释放每张随机生成的零钱 void PutIntoMoney(Money* mon); /投入一张零钱 void Count() const; /零钱分类统计private: Money *items100; /指针数组,可容纳100个元素 int count;(3) main()的实现int main() SavingBox piggybank; srand(time(NULL); /设置随机数种子 while(cin.get() = n) /输入的键是回车键时保持循环 piggybank.PutIntoMoney(new Money(); piggybank.Count(); return 0;(4) 部分重要成员函数提示Money:Money() static double val = 0.1,0.5,1,5,10; /*生成随机数magic*/ value = valmagic;SavingBox:SavingBox()for(int i = 0;i count;i+)delete itemsi;void SavingBox:PutIntoMoney(Money *mon) /*将mon放入存钱罐中,即mon赋给数组item对应元素*/ cout 投入 getValue() 元币。 endl;【问题拓展】在UML中,SavingBox类和Money类之间是什么关系?本题中二者的这种关系体现在哪里?3.2.2 常对象和常成员【实验3-3】设计实时更新的日期类Date【问题描述】设计日期类Date,它具有年、月、日等数据成员,并具有无参构造函数和带参构造函数,其中无参构造函数按照系统当前日期初始化年月日。此外,Date类还具有年、月、日对应的get和set的方法以及打印日期的pirnt()方法。请打印出我国举办奥运会的日期和系统当前日期,为简单起见,假设每个月均有31天。【实例输出】【实验思路】 Date类具有哪些类成员题目已明确说明。实现该类的难点主要是如何获取系统当前时间进行初始化工作。此外,请读者观察本题涉及哪些常对象和常成员。(1) 获取系统当前日期从实验2-4可知,调用标准C头文件中的库函数time(NULL)会返回自格林威治时间1970年1月1日凌晨至现在所经过的秒数,可将其保存在变量now中,再调用函数localtime(&now)可以把time(NULL)返回的时间now转换为当地时间,并保存在结构体struct tm类型的变量中,该变量的成员tm_year、tm_mon、tm_mday即代表系统当前的年月日。(2) 找出问题中的常对象和常成员由于我国举办奥运会的日期是已知的、确定的,故可以将其视为常值,也就是常对象,其类型为const Date。而Date类中不会修改数据成员的成员函数是print()和get方法,故可将其声明为常成员函数。【代码模板】(1) Date类声明class Datepublic: Date(); Date(int y,int m,int d); void setDate(int y,int m,int d); void setYear(int y); void setMonth(int m); void setDay(int d); int getYear() const; int getMonth() const; int getDay() const; void print() const;private: int year; /年份大于0 int month; /1-12月 int day; /1-31天;(2) Date类无参构造函数Date:Date() long now = time(NULL); /返回以秒为单位的当前系统时间 tm local = *localtime(&now); /将now转换为本地时间格式 setDate(1900 + local.tm_year , local.tm_mon + 1 , local.tm_mday); (3) 设置月份的成员函数inline void Date:setMonth(int m) month = (m 0 & m = 12 ? m : 1);(4) main()的实现int main() const Date OlympicDay(2008,8,8); /OlympicDay.SetDate(2008,8,9); cout 我国举办奥运会的日期是: ;OlympicDay.print();Date now;cout 当前系统时间是:;now.print(); cout 用户设置的时间是:;now.SetDate(2009,7,5);now.print(); return 0; 【问题拓展】 将主函数中被注释掉的语句“OlympicDay.SetDate(2008,8,9);”前面的“/”去掉,程序能正常执行吗?为什么?【实验3-4】打印社保信息【问题描述】设计居民类Citizen,它具有姓名、性别、出生日期和身份证号等属性,其中,出生日期的数据类型为Date类。Citizen类具有构造函数和print()方法。编写主函数测试Citizen类的功能。【实例输出】【实验思路】本题涉及两个类Date类和Citizen类。Date类的实现可参考实验3-3,Citizen类具有哪些类成员题意已清楚说明,并且不难实现。本题应先实现Date类,再实现Citizen类。本题的难点是找出Citizen类具有哪些常成员。对于每个人来讲,性别、出生日期、身份证号虽然各自不同,但都是固定不变的信息,因此应将其视为常数据成员,其初始化仅能在构造函数的初始化列表中完成。从功能上讲,print()方法仅能读取数据成员,不会修改数据成员的值,因此是常成员函数。【代码模板】(1) Citizen类声明class Citizenpublic: Citizen(char *pname,const char *pgen,const char *pID,const Date &d); void print() const; /常成员函数private: string name; const string gender; /常数据成员 const string IDCardNum; /常数据成员 const Date birthday; /常数据成员、常对象;(2) main()的实现int main() Citizen Lily(李莉,女Date(1979,4,5); Lily.print(); return 0;【问题拓展】能否将Citizen类的3个string类常数据成员的数据类型换成char *?3.2.3 对象数组和对象成员【实验3-5】打印运动会参赛人员名单 【问题描述】 学校运动会有游泳、跳高、短跑等比赛项目,限每位参赛人员仅能参加一项比赛。请打印出参加游泳比赛的运动员名单。已知运动员的属性有姓名、院系等,比赛项目的属性有项目名称、比赛时间、参赛人数、参赛人员等。【实例输出】【实验思路】由题意可知,问题涉及运动员类Athlete和比赛项目类Game。这两个类的关系在UML中称之为“关联(association)”,这里可理解为多个运动员参加游泳比赛,如图3-2所示。1 参加 *游泳比赛运动员图3-2 关联示意图在设计这两个类时,如何体现它们之间的关联是本题的难点。通常情况下,可以采用对象指针来实现关联,即在游泳比赛Game类中定义一个Athlete *类型的指针arr,arr指向参加游泳比赛的运动员集合(数组),该指针的初始化在Game类的构造函数中进行。【代码模板】(1) Athlete类声明部分class Athletepublic: Athlete(char *pname,char *pdept); const string & getName() const return name; const string & getDept() const return dept; private: string name; /姓名 string dept; /所在院系;(2) Game类声明部分class Gamepublic: Game(char *pname,int h,int m,int c,Athlete *a); void print() const;private: string name; /比赛项目名 int hour; /比赛时间 int minute; int count; /参赛人数 Athlete *arr; /参赛人员;(3) main()的实现int main() Athlete arr3 = Athlete(刘勇,商学院), /对象数组初始化Athlete(周华,文学院),Athlete(何川洋,法学院); Game swimming(游泳,15,30,3,arr); swimming.print(); return 0;【问题拓展】(1) Game类中的对象指针“Athlete *arr”能否换成对象引用,为什么?(2) 在UML中,能构成多边形的各顶点(Point类)和多边形(Polygon类)之间是组合关系。组合关系是否用对象指针体现?(3) Athlete类的常成员函数getName()和getDept()的函数返回值类型为const string &,能否换成sting &?为什么?【实验3-6】随机组句游戏【问题描述】 用户按一次回车键,就按照冠词、名词、动词、介词、冠词、名词的顺序随机组一个句子,并显示到屏幕上。组句用的单词应从以下的字符串数组中随机选出。要求句中各单词用空格分隔,句首字母大写,句末加上句号。 冠词数组包含:many,those,the,some,any 名词数组包含:bulls,photoes,potatoes,cars,girls 动词数组包含:kicked,ran,sleep,slided,jumped 介词数组包含:on,to,from,under,over【实例输出】【实验思路】 随机组句的主要思路是:将冠词、名词、动词、介词数组定义为4个string类型的数组,然后按照按冠词、名词、动词、介词、冠词、名词的顺序,依次从4个数组中随机选出6个单词,并利用运算符“+”将这6个单词连接成句子然后输出。 组句功能由类Sentence完成。它的属性是string类型的变量content,用于存储连接成的句子。Sentence的方法包括构造函数、实现组句功能的MakeSentence()、打印组句结果的print()、清空语句内容的clear()。本题的难点是如何从每个数组中随机选取单词。其实只需产生一个代表数组下标的随机数magic,并保证其值在0,4之间,即可实现随机选取单词。随机数的产生采用函数srand()和rand()完成,这两个函数声明于中。【代码模板】(1) Sentence类声明class Sentencepublic: Sentence(); void MakeSentence(string *art,string *noun,string *prep,string *verb); /组句 void print() const; /打印所组成的句子 void clear(); /清空句子private: string content; int Rand() const; /随机生成0,4的随机数;(2) 部分成员函数实现void Sentence:clear() content.erase(); /清除字符串内容void Sentence:MakeSentence(string *art,string *noun,string *prep,string *verb) string temp = artRand(); if(temp0 = 97) temp0 -= 32; content += temp + + nounRand() + + verbRand() + + prepRand() + + artRand() + + nounRand();(3) main()的实现int main() string article5 = many,those,the,some,any; string noun5 = bulls,photoes,potatoes,cars,girls; string verb5 = kicked,ran,sleep,slided,jumped; string prep5 = on,to,from,under,over; Sentence sen; srand(time(NULL); while(cin.get() = n) sen.MakeSentence(article,noun,prep,verb); sen.print(); sen.clear(); return 0; 【问题拓展】 随机组句常常组出毫无意义的句子。能否实现一首四行的打油诗,最好能押韵?3.2.4 综合实验【实验3-7】查询个人图书借阅情况【问题描述】读者凭借阅证从图书馆借阅图书,每张借阅证的借阅限额为10本,超过则无法借出。已知图书的相关信息有:图书编号、书名、作者、出版社。借阅证的相关信息有:借阅证号、姓名、院系、借书限额、已借阅数。请打印出某同学的借阅信息。【实例输出】【实验思路】本题较为综合地考察了第二、三章的相关知识。本题有两个重点(也是难点):(1)问题涉及哪些类,它们的关系如何?(2)这些类具有哪些成员?这两个问题解决了,程序的框架就搭建起来了。在寻找类的阶段,程序中的候选类别有:读者、借阅证、图书。甄别候选类时不难看出,读者类和借阅证类都代表借阅人的相关信息,并且借阅证类更具描述力,因此,剔除冗余类读者类。而剩下的借阅证类和图书类之间存在着关联关系,如图3-3所示。1 借阅 *借阅证图书图3-3 二元关联关系进一步思考会发现,借阅关系有属于自己的特征:借阅人、借阅的具体书籍、借阅数量、借阅日期。因此应把借阅关系单独抽象为借阅类,如图3-4所示。1 *1 *借阅证图书借阅图3-4 关联关系抽象为类故问题中的类主要包含借阅证类LibraryCard、图书类Book、借阅类Loan,这里再增加一个表示借阅日期的辅助类Date。4个类中,较容易实现的是Book类和Date类,其具体的类成员实现参考【代码模板】。找出LibraryCard类的数据成员并不难,它们是:阅证号、姓名、院系、已借阅数、借阅限额。其中,借阅限额应定义为静态数据成员。LibraryCard类的成员函数有构造函数、打印借阅证信息的print()、读取阅证号、姓名、院系的get方法。由于题目要求检查借阅量是否已达到借阅限额,还应定义方法CheckQuota(),而方法IncCount()则根据本次借阅册数修改借阅证上的已借阅册数。Loan类具有借阅人、借阅的具体书籍、借阅数量、借阅日期等数据成员,其中借阅日期是对象成员。该类具有的成员函数有构造函数、打印本次借阅信息的函数print()。其中,构造函数中应检测本次借阅是否有效,即借阅册数是否达到该借阅证的借阅上限。【代码模板】(1) Book类声明class Bookpublic: Book(char *pnum,char *pname,char *au,char *ppub); void print() const; /打印图书相关信息private: string bkNumber; /图书编号 string bkName; /书名 string author; /作者 string pub; /出版社; (2) Date类声明class Datepublic: Date(int y,int m,int d); void setYear(int y); void setMonth(int m); void setDay(int d); void print() const; /打印日期private: int year; int month; int day;(3) LibraryCard类声明class LibraryCardpublic: LibraryCard(char *pnum,char *pname,char *pdept); void IncCount(int c); /根据当前借书数c修改已借阅数 bool CheckQuota(int c); /检查借阅量是否已达到借阅限额 const string & getCrdNumber() const; /返回借阅证号 const
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深圳科目一理论考试试题及答案
- 2025年广西民族大学继续教育学院招聘考试笔试试题(含答案)
- 2025年甘肃省直文博单位招聘事业编制工作人员考试笔试试题(含答案)
- 2025年鄂尔多斯市消防员考试笔试试题(含答案)
- 2024年生产经营单位安全生产知识竞赛题库与答案
- 危急值报告制度考试题及答案
- 2024山西安全生产月知识培训考试试题附参考答案
- 树墩爷爷的秘密课件
- 2024年度福建“安全生产月”知识考试试题附参考答案
- 2024年初级银行从业资格之初级风险管理通关试题库有答案
- 2025年辽宁省地质勘探矿业集团有限责任公司校园招聘笔试备考题库附答案详解
- GB/T 45911-2025人工影响天气作业用弹药存储安全要求
- 排污许可证审核及环境应急管理服务方案投标文件(技术方案)
- 驻京信访工作组管理办法
- 尿道下裂的诊断及分型
- 肿瘤的诊断与治疗
- 【高朋律师事务所】RWA发展研究报告:法律、监管和前瞻(2025年)
- DB42∕T 2272-2024 微粒化岩沥青改性沥青路面施工技术规范
- 办公耗材应急方案(3篇)
- 新高中班级团建活动方案
- 护理执行医嘱制度
评论
0/150
提交评论