程序设计与问题求解II实验指导书V1.0_第1页
程序设计与问题求解II实验指导书V1.0_第2页
程序设计与问题求解II实验指导书V1.0_第3页
程序设计与问题求解II实验指导书V1.0_第4页
程序设计与问题求解II实验指导书V1.0_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、程序设计与问题求解 ii 实验指导书实验指导书 程序设计与问题求解 ii教改项目组编 2011 年 3 月 目 录 实验一实验一 数组、结构体和函数综合编程数组、结构体和函数综合编程 .3 一、实验目的.3 二、实验内容.3 三、实验结果与分析.5 实验二实验二 递归程序设计递归程序设计 .6 一、实验目的.6 二、实验内容.6 三、实验结果与分析.7 实验三实验三 类与对象(一)类与对象(一) .8 一、实验目的.8 二、实验内容.8 三、实验结果与分析.11 实验四实验四 类与对象(二)类与对象(二) .12 一、实验目的.12 二、实验内容.12 三、实验结果与分析.14 实验五实验五

2、继承与多态继承与多态 .15 一、实验目的.15 二、实验内容.15 实例讲解:.18 三、实验结果与分析.20 实验六实验六 运算符重载和模板类运算符重载和模板类 .21 一、实验目的.21 二、实验内容.21 三、实验结果与分析.22 实验七实验七 流与文件操作编程流与文件操作编程 .23 一、实验目的:.23 二、实验内容:.23 三、实验结果与分析.23 实验八实验八 链表编程链表编程 .24 一、实验目的:.24 二、实验内容:.24 三、实验结果与分析.25 实验一实验一 数组、结构体和函数综合编程数组、结构体和函数综合编程 一、实验目的一、实验目的 1.复习数组,结构体和函数的相

3、关知识; 2.掌握利用数组存储数据和进行编程的方法; 3.进一步掌握函数的编写。 二、实验内容二、实验内容 1学生成绩统计 从键盘输入一个班(全班最多不超过 30 人)学生某门课的成绩,当输入成绩为 负值时,输入结束,分别实现下列功能: (1)统计不及格人数并打印不及格学生名单; (2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单; (3)统计各分数段的学生人数及所占的百分比。 注:将成绩分为六个分数段,60 分以下为第 0 段,6069 为第 1 段,7079 为 第 2 段,8089 为第 3 段,9099 为第 4 段,100 分为第 5 段。 编程要求编程要求: 1

4、.较好的用户输入输出提示信息 2.使用子函数来实现上述各个功能,并且要使用结构体数组来实现,该结构体 中包括学生学号和成绩 3.最好不要使用全局变量 提示提示: typedef tagstudent long num;/学生学号 float score;/学生分数 student; 供参考的函数原型如下:供参考的函数原型如下: /*函数功能:从键盘输入一个班学生某门课的成绩及其学号 当输入成绩为负值时,输入结束 函数参数: 存放学生信息的 student 结构体数组 函数返回值:学生总数 */ int readscore(student stu); /*函数功能:统计不及格人数并打印不及格学生

5、名单 函数参数:存放学生信息的 student 结构体数组 整型变量 n,存放学生总数 函数返回值:不及格人数 */ int getfail(student stu, int n); /*函数功能:计算全班平均分 函数参数:存放学生信息的 student 结构体数组,整型变量 n,存放学生总 数 函数返回值:平均分 */ float getaver(student stu, int n); /*函数功能:统计成绩在全班平均分及平均分之上的学生人数并打印其学生名 单 函数参数:存放学生信息的 student 结构体数组,整型变量 n,存放学生总 数 函数返回值:成绩在全班平均分及平均分之上的学生

6、人数 */ int getaboveaver(student stu, int n); /*函数功能:统计各分数段的学生人数及所占的百分比 函数参数:存放学生信息的 student 结构体数组,整型变量 n,存放学生总 数 函数返回值:无 */ void getdetail(student stu, int n); 2成绩排名次 某班期末考试科目为数学(mt) 、英语(en)和物理(ph) ,有最多不超过 30 人 参加考试。要求: (1)计算每个学生的总分和平均分; (2)按总分成绩由高到低排出成绩的名次; (3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分; (4)任意输入一个

7、学号,能够查找出该学生在班级中的排名及其考试分数 编程要求编程要求: 1.较好的用户输入输出提示信息 2.使用子函数来实现上述各个功能 3.必须用结构体数组实现 提示提示: 设计好存放学生信息的结构体,方便编程。 用函数编程实现计算每个学生的总分; 用函数编程实现按总分由高到低对学生成绩排序 用函数编程实现查找学号为 k 的学生在班级中的排名名次及相关成绩等信息, 找不到时返回-1 值 三、实验结果与分析三、实验结果与分析 将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法, 写在实验报告上。 实验二实验二 递归程序设计递归程序设计 一、实验目的一、实验目的 1.学习递归程序的一般设

8、计方法; 2.了解和熟练多参数的递归函数的使用; 3.掌握用递归程序设计方法解决实际问题。 二、实验内容二、实验内容 1.求游戏人员的年龄 有 5 个人围坐在一起,问第五个人多大年纪,他说比第 4 个人大 2 岁;问第 4 个人,他说比第 3 个人大 2 岁;问第 3 个人,他说比第 2 个人大 2 岁;问第 2 个人,他说比第 1 个人大 2 岁。第一个人说自己 10 岁,问第 5 个人多大年纪。 提示:此程序为递归问题,递归公式为: 10(1) ( ) (1)2(1) n age n age nn 2.计算最大公约数 利用计算最大公约数的三条性质,用递归方法计算两个整数的最大公约数。 性质

9、 1:如果 xy,则 x 和 y 的最大公约数与 x-y 和 y 的最大公约数相同,即 gcd( , )gcd(, )x yxy yxy 性质 2:如果 yx,则 x 和 y 的最大公约数与 x 和 y-x 的最大公约数相同,即 gcd( , )gcd( ,)x yx yxxy 性质 3:如果 x=y,则 x 和 y 的最大公约数与 x 值和 y 值相同,即 gcd( , )x yxy 注意:上述两个代码的编写都非常简单,在代码编写成功后,需要自己再回忆 一下代码的编写过程,复习以前学过的内容,学习代码的调试。 3.整数划分问题 将正整数 n 表示成一系列正整数之和:n=n1+n2+nk,其中

10、 n1n2nk1,k1。 正整数 n 的这种表示称为正整数 n 的划分。求正整数 n 的不同划分个数。 例如正整数 6 有如下 10 种不同的划分: 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1。 前面的几个例子中,问题本身都具有比较明显的递归关系,因而容易用递归函数直接求解。 在本例中,如果设 p(n)为正整数 n 的划分数,则难以找到递归关系,因此考虑增加一个自 变量:将最大加数 n1 不大于 m 的划分个数记作 q(n,m)。可以建立 q(n,m)的如下递归关系。 如要求解 6 的整数划分,

11、即是求 q(6,5). 其中 n=6,m=5。 编程要求: (1)编程求出任意 10 以内的整数的所有可能划分总数。 (必做!) (2)选作部分:打印输出 6 的所有划分形式。 三、实验结果与分析三、实验结果与分析 将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法, 写在实验报告上。 1 1, 1 ),() 1,( ) 1,(1 ),( 1 ),( mn mn mn mn mmnqmnq nnq nnq mnq 实验三实验三 类与对象(一)类与对象(一) 一、实验目的一、实验目的 1. 初步掌握面向对象的思想,类的封装,多文件项目; 2. 掌握类的概念、类的成员的概念和类的封装性;

12、 3掌握类对象的定义; 4理解类的成员的访问控制的含义,公有、私有和保护成员的区别; 5初步掌握用类和对象编制基于对象的编程; 6学习检查和调试基于对象的程序; 7. 掌握工程文件的编译方法; 8. 逐步从面向过程编程转到面向对象编程。 二、实验内容二、实验内容 1、验证题目 将下面的程序正确划分到不同的文件中,编译链接运行,观测运行结果与期望 是否相符。 时间类: /mytime.h #ifndef mytime_h_ #define mytime_h_ #include using namespace std; class time private: int hours; int minu

13、tes; public: time(); time(int h,int m=0); void addmin(int m); void addhr(int h); void reset(int h=0,int m=0); time sum(const time void show() const; ; #endif /mytime.cpp #include mytime.h time:time() hours=minutes=0; time:time(int h,int m) hours=h; minutes=m; void time:addmin(int m) minutes+=m; hour

14、s+=minutes/60; minutes%=60; void time:addhr(int h) hours+=h; void time:reset(int h,int m) hours=h; minutes=m; time time:sum(const time sum.minutes=minutes+t.minutes; sum.hours=hours+t.hours+sum.minutes/60; sum.minutes%=60; return sum; void time:show()const couthourshours,minutesminutes; coutendl; /u

15、setime.cpp #include using namespace std; #include mytime.h int main() time a; time b(5,40); time c(2,55); couta=; a.show(); coutb=; b.show(); coutc=; c.show(); a=b.sum(c); coutb.sum(c)=; a.show(); return 0; 2、找错误 请检查下面程序,找出其中的错误(先不要上机,自己先检查),并改正之。然后上机调 试,使之能正常运行,运行时从键盘输入时、分、秒的值,检查输出是否正确。 #include us

16、ing namespace std; class time int hour; int minute; int sec; void set_time(); void show_time(); ; time t; int main( ) set_time(); show_time(); return 0; void set_time() cint.hour; cint.minute; cint.sec; void show_time() coutt.hour:t.minute:t.secendl; 3、应用类和对象编程求出长方体的体积 需要求三个长方柱的体积,请编写一个基于对象的程序,数据成员包

17、括length(长)、 width(宽)、height(高)。 要求用成员函数实现以下功能: (1)、由键盘输入三个长方柱的长、宽、高; (2)、计算三个长方柱的体积; (3)、输出三个长方柱的体积; 三、实验结果与分析三、实验结果与分析 将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法, 写在实验报告上。 实验四实验四 类与对象(二)类与对象(二) 一、实验目的一、实验目的 1进一步加深对类和对象的理解; 2掌握构造函数和析构函数的含义与作用、定义方式和使用方法,能够根据要 求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数; 3掌握友元函数的含义和使用,友元函

18、数和成员函数的区别。 二、实验内容二、实验内容 1、设计一个类 cdateinfo,其私有数据成员有 year(年)、month(月)、day(日), 要求其满足下述要求。 (1)要求有一个无参数的构造函数,其初始的年、月、日分别为: 2000,1,1。 (2)要求有一个带参数的构造函数,起参数分别对应年、月、日。 (3)要求用一个成员函数实现日期的设置。 (4)要求用一个成员函数实现日期的输出。 在上述程序的基础上将(1)和(2)的两个构造函数改为一个带默认参数的构 造函数,并使年、月、日的默认值分别为:2000,1,1。 2、分析以下程序,掌握程序的运行过程,进一步掌握普通构造函数、复制构

19、造 函数和析构函数 : #include using namespace std; class box public: box(int=10,int=10,int=10); box:box(box int volume( ); private: int height; int width; int length; ; box:box(box width = b.width; length = b.length; coutcopy constructorendl; box:box(int h,int w,int len) height=h; width=w; length=len; coutco

20、nstructorendl; int box:volume( ) return(height*width*length); void func1(box b) coutb.volume()endl; box func2( ) box b(20,30); return b; int main( ) box box1(10,20,10); box box2(box1); coutbox1.volume()endl; func1(box1); box box3; box3=func2(); coutbox3.volume()endl; return 0; 3、分析和运行下面的程序,注意友元函数 di

21、st(point a,point b)的作用。将友元 函数 dist(point a,point b)改为 point 类的公有成员函数 point :dist(point class point double x; double y; public: point(double a,double b) x=a; y=b; friend double dist(point a,point b); ; double dist(point a,point b) return sqrt(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); void main() point

22、p1(1,2); point p2(5,2); coutdist(p1,p2)endl; 三、实验结果与分析三、实验结果与分析 将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法, 写在实验报告上。 实验五实验五 继承与多态继承与多态 一、实验目的一、实验目的 1 理解继承的含义,掌握派生类的定义方法和实现; 2 理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地 访问继承层次中的各种类成员; 3 理解保护成员在继承中的作用,能够在适当的时候选择使用保护成员以便 派生类成员可以访问基类的部分非公开的成员; 4 理解虚函数在类的继承层次中的作用,虚函数的引入对程序运行时的

23、影响, 能够对使用虚函数的简单程序写出程序结果。 二、实验内容二、实验内容 1、编写一个学生和教师数据输入和显示程序,要求: 学生数据有编号、姓名、班级和成绩,教师数据有编号、姓名、职称和部 门。要求将编号、姓名输入和显示设计成一个类 person,并作为学生数据操作 类 student 和教师类数据操作类 teacher 的基类。 2、利用虚函数实现的多态性来求四种几何图形的面积之和。这四种几何图形是: 三角形、矩形、正方形和圆。几何图形的类型可以通过构造函数或通过成员函 数来设置。 为设置几何图形的数据并求出几何图形的面积,需要定义一个包含两个虚 函数的类: class shape pub

24、lic: virtual float area( void) =0;/求面积 virtual void setdata(float ,float =0) =0;/设置图形数据 ; 因面积的计算依赖于几何图形,故在类中只能定义一个纯虚函数 area。同 理,设置几何图形数据的函数 setdata 也只能定义为虚函数。 把这个基类派生出其它几何图形类。如派生出的三角形类为: class triangle:public shape float w,h;/三角形边长为 w,高为 h public: triangle(float w=0,float h=0) w=w; h = h; float area

25、( void) return w*h/2; void setdata(float w,float h=0) w=w; h = h; ; 在派生类中定义了基类中两个虚函数的实现。为了实现求面积和设置数据 的多态性,必须定义一个类,该类中定义一个指向基类 shape 的指针数组,其 元素分别指向由基类 shape 派生出的不同的几何图形类,并完成求出所有几何 图形面积之和,以及设置参数的函数。 一个完整的参考程序如下: #include #include class shape public: virtual float area( void) =0;/虚函数 virtual void setda

26、ta(float ,float =0) =0;/虚函数 ; class triangle:public shape float w,h;/三角形边长为 w,高为 h public: triangle(float w=0,float h=0) w=w;h = h; float area( void) return w*h/2; /定义虚函数 void setdata(float w,float h=0) w=w; h = h; /定义虚函数 ; class rectangle:public shape float w,h;/矩形边长为 w,高为 h public: rectangle(float

27、 w=0,float h=0) w=w; h = h; float area( void)return w*h; /定义虚函数 void setdata(float w,float h=0)w=w; h = h; /定义虚函数 ; class square:public shape float s;/正方形边长 s public: square(float a=0) s=a; float area( void) return s*s/2; /定义虚函数 void setdata(float w,float h=0)s=w; /定义虚函数 ; class circle:public shape

28、float r;/圆的半径为 r public: circle(float r=0) r=r; float area( void)return 3.1415926*r *r ; /定义虚函数 void setdata(float w,float h=0)r=w; /定义虚函数 ; class compute shape *s;/指向基类的指针数组 public: compute() s= new shape *4;/给几何图形设置参数 s0 = new triangle(3,4); s1 = new rectangle(6,8); s2 = new square(6.5); s3 = new

29、circle(5.5); float sumarea(void ) ; compute(); void setdata(int n, float a,float b=0) /a sn-setdata(a,b); /b ; compute:compute()/释放动态分配的存储空间 for(int i= 0; i4; i+) delete si; delete s; float compute:sumarea(void ) float sum =0; for( int i =0; iarea();/通过基类指针实现多态性 return sum; void main(void ) compute

30、a; cout四种几何图形的面积=a.sumarea()n; a.setdata(2,10);/设置正方形的边长 cout四种几何图形的面积=a.sumarea()n; a.setdata(0, 10,12); /设置三角形的边长和高 cout四种几何图形的面积=a.sumarea()n; a.setdata(1,2,5);/设置正方形的长和宽 cout四种几何图形的面积=a.sumarea()n; a.setdata(3,15.5); cout四种几何图形的面积=a.sumarea()n; 程序中 a 行的 setdata 函数属于函数重载,它不是虚函数。该函数中的 b 行通 过基类指针实现

31、多态性。 实例讲解:实例讲解: #include using std:cout; using std:endl; class baseclass public: /*virtual*/ void print() /请去掉注释后查看结果有何不同, 并思考 为什么? /virtual 只能在声明时使用, 在定义时(cpp 中)不能有! coutaaaendl; ; class subclass: public baseclass public: void print() coutbbbprint(); /virtual: aaa; !virtual: aaa baseclass_p = /父类指针

32、指向子类对象 baseclass_p-print(); /virtual: bbb; !virtual: aaa 解释: override 与 overload override 可以理解为 覆盖, 重定义, 重写, 是指子类可以写一个函数原型(包 括参数列表, 返回值类型) 与父类一模一样的成员方法, overload 可以理解为 重载, 它不涉及类的层次, 它是指可以通过参数列表的 不同同时写出多个 同名函数! 上述的 baseclass.print(); subclass.print(); 均可以属于 override; virtual 的含义: 不用 virtual 的话, 父类指针指

33、向子类对象时, 它会根据指针的类型确 定调用父类还是子类的方法; 若用 virtual 的话, 父类指针指向子列对象时, 它会根据指针所指对象 的类型(而非指针的类型)来确定该调用子类还是父类的方法! 三、实验结果与分析三、实验结果与分析 将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法, 写在实验报告上。 实验六实验六 运算符重载和模板类运算符重载和模板类 一、实验目的一、实验目的 1 进一步了解运算符重载的概念和使用方法; 2 掌握几种常用的运算符重载的方法; 3 了解转换构造函数的使用方法; 4. 掌握模板的定义和应用方法 二、实验内容二、实验内容 1、模板类 将冒泡排序中的

34、用于比较之后的交换部分(即数组 ai和 ai-1比较后,若后 继元素比前面的元素大,则它们要互换位置)用函数 swap(t,t)模板实现。并 写一个主函数分别进行字符数组、整形数组和浮点形数组的数据进行测试。 2、运算符重载 定义一个复数类,通过重载运算符: +,-,*,/,直接实现二个复数之间的乘 除运算。编写一个完整的程序,测试重载运算符的正确性。要求加法“+”用成 员函数实现重载,减法“-”用成员函数实现重载。乘法“*”用友元函数实现 重载,除法“/”用成员函数实现重载。 两复数相乘的计算公式为:(a+b i)*(c+d i)=(acbd )+(ad+bc) i 两复数 相除的计算公式为

35、:(a+b i)/(c+d i)=(ac+bd)/(c*c+d*d)+(bc-ad)/(c*c+d*d) i 复数类及运算符重载函数可定义为: class complex float real, image; public: complex(float r=0,float i=0) real=r;image=i; void show() cout real=realtimage=imagen; friend complex operator *(complex complex operator /(complex /重载运算符/ ; complex operator *( complex t.

36、real=c1.real * c2.real - c1.image * c2.image; t.image = c1.image*c2.real +c1.real* c2.image; return t; complex complex:operator /(complex t.real =(real *c.real+ image * c.image)/(c.real*c.real+ c.image * c.image); t.image = (image *c.real - real * c.image)/(c.real*c.real+ c.image * c.image); return

37、t; 三、实验结果与分析三、实验结果与分析 将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法, 写在实验报告上。 实验七实验七 流与文件操作编程流与文件操作编程 一、实验目的:一、实验目的: 1深入理解c+的输入输出的含义与其实现方法; 2掌握文件流的打开、关闭及使用的使用方法; 3掌握对文件的输入输出操作; 4掌握标准输入输出流的应用,包括格式输入输出。 二、实验内容:二、实验内容: 1、输入 n(10n20)本图书的信息:书号(6 个字符) 、书名(12 个字符) 、 作者(8 个字符) 、单价(2 位小数) ;将所有数据写入文件 st1.dat 中; 2、从 st1.dat 文件中读取图书数据,将价钱高于 30 元的图书信息输出; 3、输入书号,在 st1.dat 文件中查找该图书,找到以后输出该图书的所有数 据,如果文件中没有输入的书号,给相应的提示信息。 三、实验结果与分析三、实验结果与分析 将源程序、运行结果和分析以及实验中遇到

温馨提示

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

评论

0/150

提交评论