




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
哈尔滨工业大学(威海)软件学院 C程序设计 实验报告编号: 姓名孟令鑫院系软件学院学号131110412任课教师丁建睿指导教师实验地点研究院中507-508实验时间2014年 3月 27日实验名称初识面向对象同 组 人无预习报告(对实验主要内容的认识)得分一、 实验目的1. 熟悉编程环境2. 初步利用类和对象编程3. 学会根据类图编程4. 学会调用成员函数5. 学会使用构造函数6. 学会使用接口与实现的分离7. 学会使用C+ 的基本控制语句8. 学会使用递归函数(即自我调用的函数)二、 在各个数据成员相应的set函数中根据实际情况对设置的参数值进行验证,如setSex(string sex)函数中应该确保传入的实际参数的值为”男”或”女”,设置年龄的函数中要保证年龄为大于0的值等实验内容(问题,思路,程序,结果)得分实验一学生信息修改1、 设计思路:通过UML图可知,在这个事例中,需要在类中定义的变量以及函数和函数参数,这里要格外注意constructor的构造函数的同名定义,以及public函数设置和private的变量设置以保证除了类中的函数,其他函数和命令不能对变量进行修改。整体使用do while 循环、while循环、switch循环来进行函数的反复操作。在头文件中定义student相关的类的定义。这里格外注意对student的同名构造函数的定义,以及函数参数的设置问题实现函数的接口设置对用户隐形。在student.cpp文件中,进行函数的实现,对各个函数进行类外的定义,这里要注意在类外定义函数的时候要使用“:”二元作用域运算符。Set,get函数主要通过赋值进行,在modify函数中,主要是通过do while循环通过用户输入控制循环的进行。使用while循环进行用户输入的容错处理,通过switch多路选择语句实现用户的选择操作。在main函数中进行相关函数的调用实现函数的测试。在这里,函数的容错处理显得尤其重要,这里我限制了用户输入操作时的输入为1-5.输入其他的时候报错重新输入,类似的,年龄限制为0-150、性别限制为男和女,学号限制为0-2000000000(为了防止发生溢出导致的程序报错),超出允许的则报错,提醒用户重新输入。2、 代码设置:main函数#include using namespace std;#includeStudent.hint main() Student student(131110409,22); /ueing congstuctor to initielize class Student student.printStudentInfo(); /using print fuction to print student information student.modifyStudentInfo(); /call modify fuction to modify student infomation return 0;student。Cpp文件#include using namespace std;#includeStudent.hStudent:Student(int StudentID,string Name,string Sex,int Age) /initialize constructor Student setStudentID(StudentID); /initialize studentID setName(Name); /initialize studentName setSex(Sex); /initialize studentSex setAge(Age); /initialize studentAgevoid Student:setStudentID(int StudentID) /fuction to set studentID studentID=StudentID;void Student:setName(string Name) /fuctiong to set student name name = Name;void Student:setSex(string Sex) /fuction to set student sex sex = Sex;void Student:setAge(int Age) /fuction to set student age age = Age;int Student:getStudentID() /fuction to get student ID return studentID;string Student:getName() /fuction to get student Name return name;string Student:getSex() /fuction to get student sex return sex;int Student:getAge() /fuction to get student age return age;void Student:printStudentInfo() /fuctiong to print student infomation cout *学生信息* endl 学号: getStudentID() endl 姓名: getName() endl 性别: getSex() endl 年龄: getAge() endl *结束* endl;void Student:modifyStudentInfo() /fuction to modify student infomation char replay; /variable for user to select continue or not int choiceOperate; /variable for user to select whice operate to do do do /processing error input while(cout 请选择要修改的信息:n 1、学号 t 2、姓名 t 3、性别 t 4、年龄 t 5、修改完毕! choiceOperate,!(choiceOperate=1|choiceOperate=2|choiceOperate=3|choiceOperate=4|choiceOperate=5)|cin.fail() cout输入错误,请重新输入endl; cin.clear(); cin.sync(); switch(choiceOperate) /user to select whice operate to do case 1: int StudentID; /processing error input while( cout 请输入学号: StudentID,!(StudentID=0&StudentID=2000000000)|cin.fail() cout输入错误,请重新输入endl; cin.clear(); cin.sync(); setStudentID(StudentID); cout 学号已经修改完毕! endl; break; case 2: string Name; cout 请输入姓名: Name; setName(Name); cout 姓名已经修改完毕! endl; break; case 3: string Sex; while( cout 请输入性别: Sex,!(Sex=男|Sex=女)|cin.fail() cout输入错误,请重新输入endl; cin.clear(); cin.sync(); setSex(Sex); cout 性别已经修改完毕! endl; break; case 4: int Age; /processing error input while( cout 请输入年龄: Age,!(Age=0&Age=150)|cin.fail() cout输入错误,请重新输入endl; cin.clear(); cin.sync(); setAge(Age); cout 年龄已经修改完毕! endl; break; case 5: cout 修改完毕! endl; printStudentInfo(); break; default: cout输入错误请重新输入endl; break; while(choiceOperate != 5); cout 是否继续更改信息(输入y/Y)/否(输入n/N)? replay; while(replay =y|replay =Y) ; Student 。h文件#ifndef STUDENT_H_INCLUDED#define STUDENT_H_INCLUDED#include #include using namespace std;/ Student class definition in header fileclass Student public:/class fuction definition Student(int,std:string, std:string,int);/consructor Student void setStudentID(int); /fuction to set studentID void setName(string); /fuction to set student Name void setSex(string); /fuction to set student sex void setAge(int); /fuction to set stundet age int getStudentID(); /fuction to get student ID string getName(); /fuction to get student name string getSex(); /fuction to get student sex int getAge(); /fuction to get student age void printStudentInfo(); /fuctiong to print student infomation void modifyStudentInfo(); /fuction to modify student infomation private:/class variable definition int studentID; string name; string sex; int age;#endif / STUDENT_H_INCLUDED3、 遇到问题:(1)cin函数的容错处理,当要求cin,int类型的变量时候,如果用户错误输入了char形的变量会引起程序进入死循环。 (2) 在switch多路选择语句中出现error: jump to case label|,error: crosses initialization of std:string Name|等错误。 (3)当选择结束修改的时候,按y,n,N,Y出现错误。不是按照预想的情况进行。4、解决方法:(1)经过百度和谷歌搜索cin的容错处理,知道了cin.clear(); cin.sync();两个函数的使用,进行函数正误的返回值的验证,如果不是正确的返回值,则进行cin读入的清除处理。然后通过while循环进行反复提醒用户输入正确选项的处理。具体代码如下:while(cout 请选择要修改的信息:n 1、学号 t 2、姓名 t 3、性别 t 4、年龄 t 5、修改完毕! choiceOperate,!(choiceOperate=1|choiceOperate=2|choiceOperate=3|choiceOperate=4|choiceOperate=5)|cin.fail() cout输入错误,请重新输入endl; cin.clear(); cin.sync(); (2)在switch多路选择语句中出现error: jump to case label|,error: crosses initialization of std:string Name|等错误。经过查询,是由于在case中使用的变量初始化的问题,如果选择其他case模块,跳过该case内容会导致该模块中的变量初始化失败的问题,以及在其他部分进行调用出错。所以应该在每一个case语句后加上使case后的语句成为一个单独的语句块。如case 2: string Name; cout 请输入姓名: Name; setName(Name); cout 姓名已经修改完毕! endl; break; 在case语句中,应该在每一个case中使用break,来跳出该次switch循环,否则会引起多个case模块的连续顺序调用而不是选择调用。(3)当选择结束修改的时候,按y,n,N,Y出现错误。不是按照预想的情况进行。原来的代码设置为:cout 是否继续更改信息(输入y/Y)/否(输入n/N)? replay; while(replay =y|Y) ;该种情况会导致输入Y退出,而输入N仍然执行的发生。原因经查仍然未知,但经过反复修改和实验,正确的语句应该为while(replay =y|replay =Y) ;(需要请教老师)实验二汉诺塔问题的解决。1、 设计思路:通过查阅上学期的c语言教材得知,采用递归函数的方法来解决这个问题,在递归函数中,最为重要的就是调用本身的过程,和函数基线情况的设置。这里是需要格外注意的。以Hanoi(4,1,2,3)举例来说:1、2、3分别代表可以存放盘子的底座的编号,4表示刚开始时第1个底座有4个盘子,a、b、c分别代表:问题开始时的原来存放盘子的底座、临时底座、问题结束时盘子存放的底座。按照上面的模型,分成三步: (1)将第1个底座的最上面的3个盘子移动到第2个底座上; (2)将第1个底座上剩下的1个盘子直接放到第3个底座上; (3)将第2个底座上的3个盘子移动到第三个底座上; 上面三个过程实际上就对应到Hanoi(.)递归函数的中的三个语句。第(1)、(3)步就是相当于原来问题的两个变形。可以把第(1)步理解为:将n-1个盘子从第1个底座搬到第2个底座的汉诺塔问题,这样问题有3个变化的地方和1个不变的地方:盘子总数减少了1、要将盘子移动到的目标底座变成了第2个底座了、临时底座变成了第3个底座了、问题的本质上还是汉诺塔问题,这个不变很重要,它是问题可以递归求解的关键,也就是说可以用不同的参数来调用同一个函数来解决。对应到Hanoi(.)函数的4个参数中的3个变化。 完成了前面两步后,显然问题并没有解决,所以才有第(3)步,也就是第二个递归。同样的道理第(3)步可以理解为:将n-1个盘子从第2个底座搬到第三个底座的汉诺塔问题了。只不过与第一个递归不同的是:原来的第2个底座相当于原来的第1个底座、原来的第1个底座相当于现在的第2个底座了。2、代码设置:#include using namespace std;void Hanoi(int quantitiy,char a,char b,char c);void Move(int quantitiy,char a,char b);char choice;int count = 0; /using global variable to add stepsint main() int quantitiy; do count=0; /processing error input while( cout Please input the quantity of plates quantitiy,!(quantitiy=0&quantitiy=2000000000)|cin.fail() coutinput wrongendl; cin.clear(); cin.sync(); cout move quantitiy plates from A to B through Cn; /call rcursive fuction to move quantitiy plates from start A to target B through C Hanoi(quantitiy,A,B,C); cout need count steps endl; coutDo you want to continuechoice; while(choice=y); return 0;/Using rcursive fuction to move quantitiy plates from start A to target B through Cvoid Hanoi(int quantitiy,char a,char b,char c) count+; if(quantitiy = 1) /baseline condition while quantitiy=1 Move(quantitiy,a,b); /Using fuction Move to move n plates from start A to target B else Hanoi(quantitiy-1,a,c,b); /call rcursive fuction to move quantitiy-1 plates from start B to target A through C Move(quantitiy,a,b); /move NO.quantitiy plates from A to B Hanoi(quantitiy-1,c,b,a); /call rcursive fuction to move quantitiy-1 plates from start A to target C through B /A fuction move NO.quantitiy plates from A to Bvoid Move(int quantitiy,char a,char b) cout plate quantitiy : from a to b endl;3、出现的问题:无4、解决方法:无四、实验结果实验结论得分通过实验现象总结出的规律,或者通过程序代码的编写,得到的收获。1. 熟悉了编程环境2. 初步学会了利用类和对象编程3. 学会了根据类图编程4. 学会了调用成员函数5. 学会了使用构造函数6. 学会了使用接口与实现的分离7. 学会了使用C+ 的基本控制语句8. 学会了使用递归函数(即自我调用的函数)9、cin的容错处理,知道了cin.clea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供水管道打压试验技术方案
- 跨境运输机械设备吊装装船方案
- 污水处理厂污泥脱水处理方案
- 环保设备长期环保性能维护方案
- 水库大坝除险加固技术方案
- 风电场施工组织设计方案
- 标准厂房管线综合布置方案
- 数字化铝幕墙设计参数优化方案
- 岗位培训安全培训课件
- 导游带团安全知识培训课件
- TCRHA 063.2-2024 消毒供应质量管理及评价 第2部分:区域化消毒供应业务
- 2024年新人教版化学九年级上册全册课件(新版教材)
- CA6140车床后托架(831001型号)的机械加工工艺规程及夹具设计774262
- 人教版部编道德与法治一年级上册《全册完整》课件
- 血管外科运用PDCA降低介入手术穿刺点并发症
- 三级公立医院绩效考核微创手术目录(2022版)
- 危险驾驶罪课件讲解
- 地质灾害危险性评估收费标准
- 幼儿园中班数学课件:《图形的组合与分解-欢欢的礼物》
- 医院检验科实验室生物安全程序文件SOP
- 生物制品基础知识
评论
0/150
提交评论