程序设计问题求解II实验指导书

上传人:无*** 文档编号:69212904 上传时间:2022-04-05 格式:DOC 页数:28 大小:166.50KB
返回 下载 相关 举报
程序设计问题求解II实验指导书_第1页
第1页 / 共28页
程序设计问题求解II实验指导书_第2页
第2页 / 共28页
程序设计问题求解II实验指导书_第3页
第3页 / 共28页
点击查看更多>>
资源描述
程序设计与问题求解 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一、实验目的:23二、实验内容:23三、实验结果与分析23实验八 链表编程24一、实验目的:24二、实验内容:24三、实验结果与分析25实验一 数组、结构体和函数综合编程一、实验目的1. 复习数组,结构体和函数的相关知识;2. 掌握利用数组存储数据和进行编程的方法;3. 进一步掌握函数的编写。二、实验内容1 学生成绩统计 从键盘输入一个班(全班最多不超过 30人)学生某门课的成绩,当输入成绩为 负值时,输入结束,分别实现下列功能:(1) 统计不及格人数并打印不及格学生名单;(2) 统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;(3) 统计各分数段的学生人数及所占的百分比。注:将成绩分为六个分数段,60分以下为第0段,6069为第1段,7079为第2段,8089为第3段,9099为第4段,100分为第5段。编程要求:1. 较好的用户输入输出提示信息2. 使用子函数来实现上述各个功能,并且要使用结构体数组来实现,该结构体中 包括学生学号和成绩3. 最好不要使用全局变量提示:typedef tagStude ntlong nu m; 学生学号float score;/ 学生分数Stude nt;供参考的函数原型如下:/*函数功能:从键盘输入一个班学生某门课的成绩及其学号函数参数:当输入成绩为负值时,输入结束 存放学生信息的Student结构体数组函数返回值:学生总数*/int ReadScore(Student st叩);/*函数功能:统计不及格人数并打印不及格学生名单 函数参数:存放学生信息的Student结构体数组 整型变量n,存放学生总数函数返回值:不及格人数*/int GetFail(Student st叩,int n);/*函数功能:计算全班平均分函数参数:存放学生信息的Student结构体数组,整型变量n,存放学生总数 函数返回值:平均分*/float GetAver(Student stu, int n);/*函数功能:统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单 函数参数:存放学生信息的Student结构体数组,整型变量n,存放学生总数 函数返回值:成绩在全班平均分及平均分之上的学生人数*/int GetAboveAver(Student stu, int n);/*函数功能:统计各分数段的学生人数及所占的百分比函数参数:存放学生信息的Student结构体数组,整型变量n,存放学生总数 函数返回值:无*/void GetDetail(Student stu, int n);2 成绩排名次某班期末考试科目为数学(MT、英语(EN)和物理(PH,有最多不超过30人 参加考试。要求:(1、计算每个学生的总分和平均分;(2、按总分成绩由高到低排出成绩的名次;(3) 打印出名次表,表格内包括学生编号、各科分数、总分和平均分;(4) 任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数编程要求:1. 较好的用户输入输出提示信息2. 使用子函数来实现上述各个功能3. 必须用结构体数组实现提示:设计好存放学生信息的结构体,方便编程。用函数编程实现计算每个学生的总分;用函数编程实现按总分由高到低对学生成绩排序用函数编程实现查找学号为k的学生在班级中的排名名次及相关成绩等信息, 不到时返回-1值三、实验结果与分析将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写 在实验报告上。实验二 递归程序设计一、实验目的1. 学习递归程序的一般设计方法;2. 了解和熟练多参数的递归函数的使用;3. 掌握用递归程序设计方法解决实际问题。二、实验内容1. 求游戏人员的年龄有 5 个人围坐在一起,问第五个人多大年纪,他说比第 4 个人大 2 岁;问第 4 个人,他说比第 3 个人大 2 岁;问第 3 个人,他说比第 2 个人大 2 岁;问第 2 个人,他说比第 1个人大 2岁。第一个人说自己 10岁,问第 5个人多大年纪。提示:此程序为递归问题,递归公式为 :age(n)10age(n 1) 2(n 1)(n 1)2. 计算最大公约数 利用计算最大公约数的三条性质,用递归方法计算两个整数的最大公约数。 性质1:如果xy,则x和y的最大公约数与x-y和y的最大公约数相同,即 gcd( x, y) gcd(x y, y)x y性质2:如果yx,则x和y的最大公约数与x和y-x的最大公约数相同,即 gcd( x, y) gcd( x, y x)x y性质3:如果x=y,则x和y的最大公约数与x值和y值相同,即gcd(x, y) x y 注意:上述两个代码的编写都非常简单, 在代码编写成功后, 需要自己再回忆一 下代码的编写过程,复习以前学过的内容,学习代码的调试。3. 整数划分问题将正整数n表示成一系列正整数之和:n=n 1+ n2+nk,其中n1 n2nk 1, k 1。正整数 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)的如下递归关系。1n 1,m 1q(n,m)1q(n,n)nmq(n,n1)n mq(n,m1) q(nm,m) n m 1如要求解 6 的整数划分,即是求q(6,5).其中 n=6, m=5。编程要求:(1) 编程求出任意 10 以内的整数的所有可能划分总数。 (必做!)(2) 选作部分:打印输出 6 的所有划分形式。三、实验结果与分析将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写 在实验报告上。实验三 类与对象(一)一、实验目的1. 初步掌握面向对象的思想,类的封装,多文件项目;2. 掌握类的概念、类的成员的概念和类的封装性; 3掌握类对象的定义;4理解类的成员的访问控制的含义,公有、私有和保护成员的区别; 5初步掌握用类和对象编制基于对象的编程; 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 Reset(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;minutes=m;Time Time:Sum(const Time& t)constTime 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);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 namespacestd; classTimeint 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、应用类和对象编程求出长方体的体积 需要求三个长方柱的体积,请编写一个基于对象的程序,数据成员包括 length( 长) 、 width( 宽) 、 height( 高) 。要求用成员函数实现以下功能:(1)、由键盘输入三个长方柱的长、宽、高;(2)、计算三个长方柱的体积;(3)、输出三个长方柱的体积;三、实验结果与分析将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写 在实验报告上。实验四 类与对象(二)一、实验目的1进一步加深对类和对象的理解;2掌握构造函数和析构函数的含义与作用、定义方式和使用方法,能够根据要 求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数; 3掌握友元函数的含义和使用,友元函数和成员函数的区别。二、实验内容1、 设计一个类Cdateinfo,其私有数据成员有year(年)、month(月)、day(日),要 求其满足下述要求。(1) 要求有一个无参数的构造函数,其初始的年、月、日分别为:2000, 1, 1。(2)要求有一个带参数的构造函数,起参数分别对应年、月、日。(3)要求用一个成员函数实现日期的设置。(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.height;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(box1);coutbox1.volume()endl;func1(box1);Box box3;box3=func2();coutbox3.volume()endl;return 0;3、分析和运行下面的程序,注意友元函数 dist(poi nt a,poi nt b)的作用。将友元函 数 dist(point a,point b)改为 Point 类的公有成员函数 Point :dist(point &b),请修改 主函数中的相应代码,使程序功能不变。#include #include using namespace std;class Pointdouble 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 p1(1,2);Point p2(5,2);coutdist(p1,p2)endl;三、实验结果与分析将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写 在实验报告上。实验五 继承与多态一、实验目的1 理解继承的含义,掌握派生类的定义方法和实现;2 理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地访 问继承层次中的各种类成员;3 理解保护成员在继承中的作用,能够在适当的时候选择使用保护成员以便派 生类成员可以访问基类的部分非公开的成员;4 理解虚函数在类的继承层次中的作用,虚函数的引入对程序运行时的影响, 能够对使用虚函数的简单程序写出程序结果。二、实验内容1、编写一个学生和教师数据输入和显示程序,要求:学生数据有编号、 姓名、班级和成绩, 教师数据有编号、 姓名、职称和部门。 要求将编号、姓名输入和显示设计成一个类 person, 并作为学生数据操作类 student 和教师类数据操作类 teacher 的基类。2、利用虚函数实现的多态性来求四种几何图形的面积之和。 这四种几何图形是: 三角形、矩形、 正方形和圆。 几何图形的类型可以通过构造函数或通过成员函数 来设置。为设置几何图形的数据并求出几何图形的面积, 需要定义一个包含两个虚函数的类:class Shapepublic:virtual float Area( void) =0;/求面积virtual void Setdata(float ,float =0) =0;/设置图形数据;因面积的计算依赖于几何图形,故在类中只能定义一个纯虚函数 Area。同理,设置几何图形数据的函数 Setdata也只能定义为虚函数。把这个基类派生出其它几何图形类。如派生出的三角形类为:class Triangle:public 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 #include class Shapepublic:virtual float Area( void) =0;/虚函数virtual void Setdata(float ,float =0) =0;/虚函数;class Triangle:public 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; /定义虚函数;class Rectangle:public Shape float 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 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 float 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 Rectangle(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) sn-Setdata(a,b); /B ;Compute:Compute()/A/释放动态分配的存储空间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 mai n(void ) Compute a;coutvv四种几何图形的面积a.Setdata(2,10);coutvv四种几何图形的面积a.Setdata(O, 10,12);coutvv四种几何图形的面积a.Setdata(1,2,5);coutvv四种几何图形的面积a.Setdata(3,15.5);coutvv四种几何图形的面积/通过基类指针实现多态性=vva.SumArea()vvn;/设置正方形的边长=vva.SumArea()vvn;/设置三角形的边长和高=vva.SumArea()vvn;/设置正方形的长和宽=vva.SumArea()vvn;=vva.SumArea()vvn;程序中A行的Setdata函数属于函数重载,它不是虚函数。该函数中的B行通过基类指针实现多态性。实例讲解:#in clude viostream using std:cout; using std:e ndl;class BaseClasspublic:请去掉注释后查看结果有何不同,并思考/*virtual*/ void prin t() / 为什么?/virtual只能在声明时使用,在定义时(cpp中)不能有!coutvAAAve ndl;;class SubClass: public BaseClasspublic:void prin t() coutBBBpri nt(); /virtual: A编译错误,因为父类对象(右值)不是子,也不能将父类对象强制转换为子类对编译正确,因为子类对象(右值)是父打印AAA打印BBB父类指针指向父类对象;!virtual: AAAbaseClass_p = & subClass; /父类指针指向子类对象baseClass_p-pri nt(); /virtual: BBB; !virtual: AAA解释:override 与 overloadoverride可以理解为 覆盖,重定义,重写,是指子类可以写一个函数原型(包括参数列表,返回值类型)与父类一模一样的成员方法,overload可以理解为重载,它不涉及类的层次,它是指可以通过参数列表的 不同同时写出多个 同名函数!上述的 baseClass.print(); subClass.print();均可以属于 override;virtual 的含义:不用 virtual 的话 , 父类指针指向子类对象时 , 它会根据指针的类型确定 调用父类还是子类的方法 ;若用 virtual 的话 , 父类指针指向子列对象时 , 它会根据指针所指对象的 类型( 而非指针的类型 )来确定该调用子类还是父类的方法 !三、实验结果与分析将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写 在实验报告上。实验六 运算符重载和模板类一、实验目的1 进一步了解运算符重载的概念和使用方法;2 掌握几种常用的运算符重载的方法;3 了解转换构造函数的使用方法;4. 掌握模板的定义和应用方法、实验内容1、模板类将冒泡排序中的用于比较之后的交换部分(即数组 ai 和 ai-1 比较后,若后 继元素比前面的元素大,则它们要互换位置)用函数swap(T,T) 模板实现。并写一个主函数分别进行字符数组、整形数组和浮点形数组的数据进行测试。2、运算符重载 定义一个复数类,通过重载运算符:+,-,*,/ ,直接实现二个复数之间的乘除运算。编写一个完整的程序,测试重载运算符的正确性。要求加法“+”用成员函数实现重载, 减法“- ”用成员函数实现重载。 乘法“ * ”用友元函数实现重 载,除法“ / ”用成员函数实现重载。两复数相乘的计算公式为:(a+b i)*(c+d i)=(ac - bd )+(ad+bc) i 两复数 相除的计算公式为: (a+b i)/(c+di)=(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 &);Complex operator /(Complex &);/ 重载运算符 /;Complex operator *( Complex &c1,Complex &c2) Complex t;t.Real=c1.Real * c2.Real - c1.Image * c2.Image;t.Image = return t;Complex Complex:operator /(Complex &c) Complex t;t.Real =(Real *c.Real+ Image * * c.Image);t.Image = (Image *c.Real - Real * * c.Image);return t;三、实验结果与分析将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写 在实验报告上。实验七 流与文件操作编程一、实验目的:1深入理解 C+勺输入输出的含义与其实现方法;2掌握文件流的打开、关闭及使用的使用方法;3掌握对文件的输入输出操作;4掌握标准输入输出流的应用,包括格式输入输出。二、实验内容:1、输入 N(10N20 )本图书的信息:书号( 6 个字符)、书名( 12 个字符)、 作者( 8个字符)、单价( 2 位小数);将所有数据写入文件 ST1.DAT 中;2、从 ST1.DAT 文件中读取图书数据,将价钱高于 30 元的图书信息输出;3、输入书号,在 ST1.DAT 文件中查找该图书, 找到以后输出该图书的所有数据, 如果文件中没有输入的书号,给相应的提示信息。三、实验结果与分析将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写 在实验报告上。实验八链表编程、实验目的:1. 了解和熟悉链表创建和使用方法;2. 掌握基本的带头节点的单向链表删除和增加操作3 能够利用链表编程解决简单的链表应用问题。、实验内容:1、建立一个单链表21 23 25 27 29 31,并输出该链表;2、输入序号n,查找序号为n的结点,并输出;3、输入值x,查找值为x的结点,并输出;4、插入结点:输入序号n和值x。在序号为n的结点后插入x,并输出该链表;5、删除结点:输入序号n,册除序号为n的结点,并输出该链表。程序运行结果:该链表为:2123 2527 29 31输入序号:3输出值为:25输入值:29输出序号:5插入结点:3,26输出链表:2123 2526 27 29 31删除结点:3输出链表:2123 2627 29 31/模板声明 结点类定义提示:templateclass datatype class NODE public:datatype data; NODE *next;/数据域 指针域;template class LIST private:/单链表类定义public:NODE *head;/链表头指针/;LIST() head=new NODE; head-next=NULL;int length();构造函数创建头结点/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; /求表长函数判空函数 取元素函数 取后继元素函数 取前驱元素函数 置换元素 插入元素函数 删除元素函数 查找函数 打印输出链表中的所有元素 析构函数/ 将链表中所有元素占用空间释放三、实验结果与分析将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写在实验报告上
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!