程序设计与问题求解II实验指导书V1.0.doc

上传人:文库蛋蛋多 文档编号:2385983 上传时间:2023-02-17 格式:DOC 页数:25 大小:98KB
返回 下载 相关 举报
程序设计与问题求解II实验指导书V1.0.doc_第1页
第1页 / 共25页
程序设计与问题求解II实验指导书V1.0.doc_第2页
第2页 / 共25页
程序设计与问题求解II实验指导书V1.0.doc_第3页
第3页 / 共25页
程序设计与问题求解II实验指导书V1.0.doc_第4页
第4页 / 共25页
程序设计与问题求解II实验指导书V1.0.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《程序设计与问题求解II实验指导书V1.0.doc》由会员分享,可在线阅读,更多相关《程序设计与问题求解II实验指导书V1.0.doc(25页珍藏版)》请在三一办公上搜索。

1、程序设计与问题求解II实验指导书程序设计与问题求解II教改项目组编2011年 3月目 录实验一 数组、结构体和函数综合编程3一、实验目的3二、实验内容3三、实验结果与分析5实验二 递归程序设计6一、实验目的6二、实验内容6三、实验结果与分析7实验三 类与对象(一)8一、实验目的8二、实验内容8三、实验结果与分析11实验四 类与对象(二)12一、实验目的12二、实验内容12三、实验结果与分析14实验五 继承与多态15一、实验目的15二、实验内容15实例讲解:18三、实验结果与分析20实验六 运算符重载和模板类21一、实验目的21二、实验内容21三、实验结果与分析22实验七 流与文件操作编程23一

2、、实验目的:23二、实验内容:23三、实验结果与分析23实验八 链表编程24一、实验目的:24二、实验内容:24三、实验结果与分析25实验一 数组、结构体和函数综合编程一、实验目的1.复习数组,结构体和函数的相关知识;2.掌握利用数组存储数据和进行编程的方法;3.进一步掌握函数的编写。二、实验内容1学生成绩统计从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:(1)统计不及格人数并打印不及格学生名单;(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;(3)统计各分数段的学生人数及所占的百分比。注:将成绩分为六个分数段

3、,60分以下为第0段,6069为第1段,7079为第2段,8089为第3段,9099为第4段,100分为第5段。编程要求:1.较好的用户输入输出提示信息2.使用子函数来实现上述各个功能,并且要使用结构体数组来实现,该结构体中包括学生学号和成绩3.最好不要使用全局变量提示:typedef tagStudentlong num;/学生学号float score;/学生分数Student;供参考的函数原型如下:/*函数功能:从键盘输入一个班学生某门课的成绩及其学号 当输入成绩为负值时,输入结束 函数参数: 存放学生信息的Student结构体数组 函数返回值:学生总数*/int ReadScore(S

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

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

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

7、求游戏人员的年龄有5个人围坐在一起,问第五个人多大年纪,他说比第4个人大2岁;问第4个人,他说比第3个人大2岁;问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。第一个人说自己10岁,问第5个人多大年纪。 提示:此程序为递归问题,递归公式为: 2.计算最大公约数利用计算最大公约数的三条性质,用递归方法计算两个整数的最大公约数。性质1:如果xy,则x和y的最大公约数与x-y和y的最大公约数相同,即性质2:如果yx,则x和y的最大公约数与x和y-x的最大公约数相同,即性质3:如果x=y,则x和y的最大公约数与x值和y值相同,即注意:上述两个代码的编写都非常简单,在代码编写成功后,

8、需要自己再回忆一下代码的编写过程,复习以前学过的内容,学习代码的调试。3.整数划分问题将正整数n表示成一系列正整数之和:n=n1+n2+nk,其中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不大

9、于m的划分个数记作q(n,m)。可以建立q(n,m)的如下递归关系。如要求解6的整数划分,即是求q(6,5). 其中n=6,m=5。编程要求:(1) 编程求出任意10以内的整数的所有可能划分总数。(必做!)(2) 选作部分:打印输出6的所有划分形式。三、实验结果与分析 将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写在实验报告上。 实验三 类与对象(一)一、实验目的1. 初步掌握面向对象的思想,类的封装,多文件项目;2. 掌握类的概念、类的成员的概念和类的封装性;3掌握类对象的定义;4理解类的成员的访问控制的含义,公有、私有和保护成员的区别;5初步掌握用类和对象编制基于对象的编

10、程;6学习检查和调试基于对象的程序;7. 掌握工程文件的编译方法;8. 逐步从面向过程编程转到面向对象编程。二、实验内容1、验证题目将下面的程序正确划分到不同的文件中,编译链接运行,观测运行结果与期望是否相符。时间类:/mytime.h#ifndef MYTIME_H_#define MYTIME_H_#include using namespace std;class Timeprivate:int hours;int minutes;public:Time();Time(int h,int m=0);void AddMin(int m);void AddHr(int h);void Res

11、et(int h=0,int m=0);Time Sum(const Time& t) const;void Show() const;#endif/mytime.cpp#include mytime.hTime:Time()hours=minutes=0;Time:Time(int h,int m)hours=h;minutes=m;void Time:AddMin(int m)minutes+=m;hours+=minutes/60;minutes%=60;void Time:AddHr(int h)hours+=h;void Time:Reset(int h,int m)hours=h;

12、minutes=m;Time Time:Sum(const Time& t)const Time sum; sum.minutes=minutes+t.minutes; sum.hours=hours+t.hours+sum.minutes/60; sum.minutes%=60; return sum;void Time:Show()constcouthourshours,minutesminutes;coutendl;/usetime.cpp#include using namespace std;#include mytime.hint main()Time A;Time B(5,40)

13、;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 using namespace std;class Timeint hour;int minute;int sec; void set_time();void show_time();Time t;int main

14、( ) 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、应用类和对象编程求出长方体的体积需要求三个长方柱的体积,请编写一个基于对象的程序,数据成员包括length(长)、width(宽)、height(高)。要求用成员函数实现以下功能:(1)、由键盘输入三个长方柱的长、宽、高;(2)、计算三个长方柱的体积;(3)、输出三个长方柱的体积;三、实验结果与分析 将源程序、运行结果和分析以及实验中遇

15、到的问题和解决问题的方法,写在实验报告上。实验四 类与对象(二)一、实验目的1进一步加深对类和对象的理解;2掌握构造函数和析构函数的含义与作用、定义方式和使用方法,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数;3掌握友元函数的含义和使用,友元函数和成员函数的区别。二、实验内容1、设计一个类Cdateinfo,其私有数据成员有year(年)、month(月)、day(日),要求其满足下述要求。(1)要求有一个无参数的构造函数,其初始的年、月、日分别为:2000,1,1。(2)要求有一个带参数的构造函数,起参数分别对应年、月、日。(3)要求用一个成员函数实现日期的

16、设置。(4)要求用一个成员函数实现日期的输出。在上述程序的基础上将(1)和(2)的两个构造函数改为一个带默认参数的构造函数,并使年、月、日的默认值分别为:2000,1,1。2、分析以下程序,掌握程序的运行过程,进一步掌握普通构造函数、复制构造函数和析构函数 :#include using namespace std;class Boxpublic:Box(int=10,int=10,int=10); Box:Box(Box& b);int volume( );private:int height;int width;int length;Box:Box(Box& b)height = b.he

17、ight;width = b.width;length = b.length;coutcopy constructorendl;Box:Box(int h,int w,int len)height=h;width=w;length=len;coutconstructorendl;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(bo

18、x1); coutbox1.volume()endl; func1(box1); Box box3;box3=func2();coutbox3.volume()endl; return 0;3、分析和运行下面的程序,注意友元函数dist(point a,point b)的作用。将友元函数dist(point a,point b)改为Point类的公有成员函数Point :dist(point &b),请修改主函数中的相应代码,使程序功能不变。#include #include using namespace std;class Pointdouble x;double y;public:Poi

19、nt(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 p1(1,2);Point p2(5,2);coutdist(p1,p2)endl;三、实验结果与分析 将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写在实验报告上。实验五 继承与多态一、实验目的1 理解继承的含义,掌握派生类的定义方法和实现;2 理解公有继承下

20、基类成员对派生类成员和派生类对象的可见性,能正确地访问继承层次中的各种类成员;3 理解保护成员在继承中的作用,能够在适当的时候选择使用保护成员以便派生类成员可以访问基类的部分非公开的成员;4 理解虚函数在类的继承层次中的作用,虚函数的引入对程序运行时的影响,能够对使用虚函数的简单程序写出程序结果。 二、实验内容1、编写一个学生和教师数据输入和显示程序,要求:学生数据有编号、姓名、班级和成绩,教师数据有编号、姓名、职称和部门。要求将编号、姓名输入和显示设计成一个类person,并作为学生数据操作类student和教师类数据操作类teacher的基类。2、利用虚函数实现的多态性来求四种几何图形的面

21、积之和。这四种几何图形是:三角形、矩形、正方形和圆。几何图形的类型可以通过构造函数或通过成员函数来设置。 为设置几何图形的数据并求出几何图形的面积,需要定义一个包含两个虚函数的类:class Shapepublic:virtual float Area( void) =0;/求面积virtual void Setdata(float ,float =0) =0;/设置图形数据;因面积的计算依赖于几何图形,故在类中只能定义一个纯虚函数Area。同理,设置几何图形数据的函数Setdata也只能定义为虚函数。把这个基类派生出其它几何图形类。如派生出的三角形类为:class Triangle:publ

22、ic Shape float W,H;/三角形边长为W,高为Hpublic: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; ;在派生类中定义了基类中两个虚函数的实现。为了实现求面积和设置数据的多态性,必须定义一个类,该类中定义一个指向基类Shape的指针数组,其元素分别指向由基类Shape派生出的不同的几何图形类,并完成求出所有几何图形面积之和,以及设置参数的函数。一个完整的参考程序如下:#include #

23、include class Shapepublic:virtual float Area( void) =0;/虚函数virtual void Setdata(float ,float =0) =0;/虚函数;class Triangle:public Shapefloat W,H;/三角形边长为W,高为Hpublic: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 Rec

24、tangle:public Shapefloat W,H;/矩形边长为W,高为Hpublic:Rectangle(float 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 Shapefloat S;/正方形边长Spublic:Square(float a=0) S=a; float Area( void)return S*S/2; /定义虚函数void Setdata(float

25、 w,float h=0)S=w; /定义虚函数;class Circle:public Shapefloat R;/圆的半径为Rpublic: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 Recta

26、ngle(6,8); s2 = new Square(6.5); s3 = new 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

27、sum;void main(void ) Compute 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函数属于函数重载,它不是虚函数。该函数

28、中的B行通过基类指针实现多态性。实例讲解:#include using std:cout;using std:endl;class BaseClasspublic: /*virtual*/ void print() /请去掉注释后查看结果有何不同, 并思考为什么? /virtual 只能在声明时使用, 在定义时(cpp中)不能有! coutAAAendl; ;class SubClass: public BaseClasspublic: void print() coutBBBprint(); /virtual: AAA; !virtual: AAA baseClass_p = & subCl

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

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

31、函数swap(T,T)模板实现。并写一个主函数分别进行字符数组、整形数组和浮点形数组的数据进行测试。2、运算符重载定义一个复数类,通过重载运算符: +,-,*,/,直接实现二个复数之间的乘除运算。编写一个完整的程序,测试重载运算符的正确性。要求加法“+”用成员函数实现重载,减法“-”用成员函数实现重载。乘法“*”用友元函数实现重载,除法“/”用成员函数实现重载。两复数相乘的计算公式为:(a+b i)*(c+d i)=(acbd )+(ad+bc) i两复数相除的计算公式为:(a+b i)/(c+d i)=(ac+bd)/(c*c+d*d)+(bc-ad)/(c*c+d*d) i复数类及运算符重

32、载函数可定义为: 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 &);Complex operator /(Complex &);/重载运算符/;Complex operator *( Complex &c1,Complex &c2)Complex t;t.Real=c1.Real * c2.Real - c1

33、.Image * c2.Image;t.Image = c1.Image*c2.Real +c1.Real* c2.Image;return t;Complex Complex:operator /(Complex &c) Complex t;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 t;三、实验结果与分析 将源程序、运

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

35、,给相应的提示信息。三、实验结果与分析 将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写在实验报告上。实验八 链表编程一、实验目的:1. 了解和熟悉链表创建和使用方法;2. 掌握基本的带头节点的单向链表删除和增加操作。3能够利用链表编程解决简单的链表应用问题。二、实验内容:1、建立一个单链表21 23 25 27 29 31,并输出该链表;2、输入序号n,查找序号为n的结点,并输出;3、输入值x,查找值为x的结点,并输出;4、插入结点: 输入序号n和值x。在序号为n的结点后插入x,并输出该链表;5、删除结点: 输入序号n,册除序号为n的结点,并输出该链表。 程序运行结果:该链表

36、为:21 23 25 27 29 31输入序号:3输出值为:25输 入 值:29输出序号:5插入结点:3,26输出链表:21 23 25 26 27 29 31删除结点:3输出链表:21 23 26 27 29 31提示:template /模板声明class NODE /结点类定义public:datatype data; /数据域 NODE *next; /指针域;templateclass LIST /单链表类定义private:NODE *head; /链表头指针 public:LIST() /构造函数创建头结点head=new NODE;head-next=NULL;int leng

37、th(); /求表长函数bool isempty() return head-next=NULL?true:false;/判空函数bool get_data(int i,datatype &x); /取元素函数bool get_succ(int i,datatype &x); /取后继元素函数bool get_prior(int i,datatype &x); /取前驱元素函数 bool replace_data(int i,const datatype x); /置换元素bool insert_data(datatype data,int i); /插入元素函数bool delete_data(int i); /删除元素函数bool find_data(datatype x,datatype &result); /查找函数 void print_list(); /打印输出链表中的所有元素 LIST() /析构函数NODE *p;while(head) /将链表中所有元素占用空间释放p = head;head = head-next;delete p; ;三、实验结果与分析 将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写在实验报告上。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号