班级学号姓名实验报告

  • 格式:doc
  • 大小:132.50 KB
  • 文档页数:17

“C++及其编程思想”实验报告专业:姓名:学号:2011年8月28日实验一熟悉Visual C++集成开发环境一、实验目的及要求1.掌握启动和退出VC6的方法。

2.熟悉VC6开发环境,初步掌握菜单栏、工具栏、项目工作区、文件编辑区、输出区和状态栏等的使用。

3.初步掌握简单程序的上机操作基本步骤,学会建立工程、建立单文件和多文件程序,正确进行编译、链接和运行程序,查找并修改简单的语法错误。

4.通过编程熟悉C++语言源程序的编程风格,掌握用cin>>和cout<<进行输入和输出的处理方式,正确进行源代码的单行注释。

二、实验内容在D盘上建立以自己学号姓名命名的文件夹(例如,407020518张三丰,以后实验的源程序文件存于此文件夹中),编写C++风格的源程序在自己的文件夹下建立一个名为exp1的工程,然后用建立新文件向工程添加的方式添加3个文件,实现求阶乘。

文件名分别为fac.h、fac.cpp和main.cpp,在头文件fac.h中给出求阶乘的函数的原型声明;在fac.cpp文件中给出求阶乘的函数的完整定义;在main.cpp中定义main函数,定义相关的变量,输入变量的值并进行一定的数据合理性判断,在数据非法时给出一定的提示信息并退出程序的运行,对于正确的数据,则调用求阶乘的函数,求出阶乘并输出。

在每个函数开头加注释说明函数的功能、入口参数、返回值情况,对函数的关键语句用单行方式注释。

三、程序四、实验结果五.总结实验二用C++实现面向过程的程序设计一、实验目的及要求1.掌握用C++语言实现面向过程的程序设计方法。

2.正确理解引用作为形式参数和函数返回值的意义和用法,并与值形式参数、指针参数做比较。

二、实验内容在自己的文件夹下建立一个名为exp2的工程,在该工程中添加新文件exp2.cpp,文件内容如下:#include <iostream>using namespace std;void swap(int x,int y);void main(){int x=10,y=20;cout<<”Before swap, x=”<<x<<”y=”<<y<<endl;swap(x,y);cout<<”After swap, x=”<<x<<”y=”<<y<<endl;}void swap(int x,int y){int t=x;x=y;y=t;}(1)编辑、编译、连接并运行程序,观察运行结果。

(2)根据调试器的使用方法,对以上程序的运行进行单步跟踪。

注意:在运行到语句swap(x,y);时使用F11键(Step Into 进入到函数体内执行)跟踪,观察swap函数执行的每一步各变量的变化情况;其余语句处使用F10键(Step Over 单步执行)跟踪,记录实际参数x、y的内存地址&x、&y,以及x、y在调用swap函数前后的变化情况;记录形式参数x、y的内存地址&x、&y,注意与实际参数的地址是否相等,以及形式参数x、y在调用swap函数过程中的变化情况,解释实际参数未能发生交换的原因。

(3)将上述程序代码中函数原形及函数定义首部的void swap(int x,int y)修改为void swap(int &x,int &y),再次运行程序,观察运行结果。

实验指导:(1)在跟踪调试时注意正确使用两种不同的单步跟踪方法:按下F10键实现Step Over 跟踪,而按下F11键实现Step Into跟踪。

此程序中,只有在调用swap函数这一行时需要按下F11键,其余位置都按F10即可。

(2)对于需要查看的信息,如果未在auto窗口中出现,可以在watch窗口中输入相应的内容,便于进行观察。

三、程序四、实验结果五、总结实验三类与对象的实践一、实验目的及要求1.掌握类和对象的概念、定义和使用方法。

2.掌握不同特性对象成员的访问方法,以及this指针的概念和使用方法。

3.掌握构造函数和析构函数的使用方法。

4.掌握复合类的定义。

二、实验内容在自己的文件夹下建立一个名为exp3的工程,在该工程中做如下操作:1.定义一个以hours, minutes和seconds作为数据成员的CTime类。

设计如下成员函数:(1)无参构造函数、带三个参数的构造函数、析构函数(2)修改成员数据的成员函数void Set(int hours,int minutes,int seconds);(3)修改hours的成员函数void SetHours(int hours);(4)修改minutes的成员函数void SetMinutes(int minutes);(5)修改seconds的成员函数void SetSeconds(int seconds);(6)获取hours的成员函数int GetHours();(7)获取minutes的成员函数int GetMinutes();(8)获取seconds的成员函数int GetSeconds();(9)设计一个显示时间的函数。

2.定义了一个以year, month,day,hours, minutes和seconds作为数据成员的CDateTime日期时间类。

但是hours, minutes和seconds数据成员可以用Time类定义。

也就是CDateTime的数据成员可以如下定义:class CDateTime{private:int year;int month;int day;CTime time;};成员函数要求有如下:(1)无参构造函数初始化为(2009-10-15日0:0:0)、带三个参数的构造函数(注意使用复合类的构造函数的定义方式)、析构函数。

(2)修改成员数据的成员函数void Set(int years,int months,int days,int hours,int minutes,int seconds);(3)修改year的成员函数void SetYear(int yeasr);(4)获取year的成员函数int GetYear();(5)修改month的成员函数void SetMonth(int months);(6)获取month的成员函数int GetMonth();(7)修改day的成员函数void SetDay(int days);(8)获取day的成员函数int GetDay();(9)显示日期时间的函数void ShowDateTime(void);(10)显示日期的函数void ShowDate(void);(11)显示时间的函数void ShowTime(void);(12)设计一个CDateTime对象加上一个整数(秒数),并把相加的结果赋值给该对象。

注意相加时seconds、 minutes、hours、day、month、year的变化。

(附加题,学有余力的同学完成)设计两个CDateTime对象相减运算的成员函数。

函数输出结果为整数(秒数)。

(附加题,学有余力的同学完成)要求:(1)把CTime类的声明放在time.h文件中。

(2)把CTime成员函数的定义放在time.cpp文件中。

(3)把CDateTime类的声明放在datetime.h文件中(4)把CDateTime成员函数的定义放在datetime.cpp文件中。

(5)把main函数的部分放在test3.cpp中。

(6)主函数中正确定义两个类的对象,调用各自的成员函数实现相应功能。

三、程序四、实验结果五、总结实验四继承与派生一、实验目的及要求1.掌握单继承和多重继承下派生类的定义方法,理解基类成员在不同的继承方式下不同的访问属性。

2.正确定义派生类的构造函数与析构函数,理解定义一个派生类对象时各个构造函数、析构函数被调用的顺序。

3.正确定义虚基类,消除在多层次继承方式下顶层基类中成员访问的二义性问题,关注此时各构造函数、析构函数的调用顺序。

4.通过基类与派生类的定义,及基类对象、指针、引用与派生类的对象、地址间相互赋值的方法,正确理解赋值兼容的4种情况,通过程序理解其不可逆性。

二、实验内容在自己的文件夹下建立一个名为exp4的工程,在该工程中做如下操作:定义一个车基类,派生出自行车类和汽车类,又以自行车类和汽车类为基类共同派生出摩托车类,每个类都要定义带有参数的构造函数。

对自行车类继承基类的方式分别用private、protected、public,观察基类成员在派生类中的访问属性;观察自行车类、汽车类和摩托车类对象定义时构造、析构函数的调用顺序。

最后将车基类定义为虚基类再观察程序运行结果,具体完成以下要求。

(1)定义基类Vehicle,具有两个保护成员变量:MaxSpeed、Weight,有3个公有的成员函数:Run()、Stop()、Show(),以及带参数构造函数、析构函数;再定义一个从Vehicle 公有继承的Bicycle类,增加Height保护属性的成员变量,定义Bicycle类的构造函数、析构函数,改造Show函数,用于输出本类中的完整信息。

main()函数中定义Bicycle类对象,观察构造函数和析构函数的执行顺序,以及各成员函数的调用。

请用单步跟踪的方法观察程序运行的每一步究竟调用的是哪一个函数,析构函数的跟踪方法可以采用在析构函数中设置断点的方法。

(2)在上一步基础上,将继承方式分别修改为protected和private,再重新编译,观察这时的报错信息并能解释。

修改程序使程序正确运行。

(3)将Bicycle类的继承方式恢复为public,代码回到(1)的状态,再在Bicycle 类下面增加一个第二层汽车类Car的定义,Car也是公有继承基类Vehicle,其中增加了一个保护成员变量SeatNum,表示汽车有几个座位,其定义方式与类Bicycle类似。

主函数中定义该对象,观察运行结果。

(4)在上一步的基础上,再定义一个第三层类MotorCycle,该类以公有继承方式继承了第二层的Bicycle和Car类。

定义其构造函数,要调用两个直接基类的构造函数,再改造函数Show(),输出所有四个成员变量的信息。

主函数中只定义类MotorCycle的对象并调用相应的函数,代码请参考实验指导的(4)。

程序进行编译,会产生4个错误、8个警告,因为存在二义性问题,请采用在同名成员前增加“基类名::”以消除二义性直到程序正确,观察运行结果。

(5)再将代码恢复至上一步未修改前,即存在4个错误、8个警告的状态,再作一定的修改,将Vehicle声明为虚基类以消除二义性,同时修改第三层的构造函数,其余代码不变,具体请参考实验指导的(5),观察运行结果,理解此时构造函数、析构函数的调用顺序及用虚基类消除二义性的原理。