1、面向对象程序设计实验项目及答案资料实验一 C+面向过程练习(一) (2学时) 实验目的和要求:1. 掌握C程序的基本格式与规范,学会编写简单的C程序。2. 理解C程序的结构和特点。3. 熟悉C程序基本的输入和输出操作。4. 掌握C数据类型、常量和变量以及修饰符的使用方法。5. 掌握C的各种流程控制语句的使用。6. 熟悉C语言实验环境,能够在VC6.0环境下调试与运行程序。 实验内容:7. 求解方程在复数域上的解,a,b,c由终端输入。注意分析的全面性。#include#includeusing namespace std;int main() double a,b,c,d,e,m,n; cou
2、ta; coutb; coutc; while(1) if(a=0) m=-b/c; coutx1=x2=m=0) e=sqrt(d); m=(-b+e)/(2*a); n=(-b-e)/(2*a); if(m!=n) coutx1=mendlx2=nendl; else coutx1=x2=mendl; else e=sqrt(-d); m=-b/(2*a); n=e/(2*a); coutx1=m+niendl; coutx2=m-niendl; couta; coutb; coutc; return 0;8. 猴子吃桃子问题:一天一只小猴子摘下一堆桃子,当即吃掉一半,还觉得不过瘾,又多吃
3、了一个。第二天接着吃了前一天剩下的一半,馋不忍罢又多吃了一个。以后每天如此。到第十天小猴子去吃时,只剩下一个桃子了。问小猴子共摘下了多少个桃子。 #includeusing namespace std;int f(int n);int main() coutf(1)endl; return 0;int f(int n) if(n=10) return 1; else return (f(n+1)+1)*2;9. 用,求e之值,直到为止。#includeusing namespace std;int fact(int n);int main() int i=1; double sum=1,a;
4、do a=1./fact(i); sum+=a; i+; while(a0.000001); coute=sumendl;int fact(int n) if(n=1) return 1; else return fact(n-1)*n; 实验二C+面向过程练习(二)(2学时) 实验目的和要求:10. 掌握一维数组、二维数组的定义与使用。11. 掌握函数定义、函数调用和函数说明的方法。12. 掌握函数递归调用的概念和使用方法。 实验内容:13. 编程求若干个整数中的最大和次大,最小和次小这四个数。#includeusing namespace std;# define M 100int mai
5、n() int aM,n,t; cinn; for(int k=0;kak; for(int i=1;in;i+) for(int j=0;jaj+1) t=aj; aj=aj+1; aj+1=t; coutmax=an-1 cmax=an-2endl; coutmin=a0 cmin=a1endl; return 0;14. 由键盘输入两个整数,试编写两个函数分别求出这两个数的最大公约数和最小公倍数。#includeusing namespace std;int main() int m,n,t,lcm,gcd; cinmn; if(m=0|n=0) coutm = 0 or n = 0en
6、dl; else if(mn) t=m; m=n; n=t; gcd=m; while(gcd%n!=0) gcd+=m; lcm=gcd/(m*n); coutlcm=lcmendlgcd=gcdendl; return 0; 15. 编写一个递归函数void reverse(int a,int n),将数组a中的数倒置。如a数组原来为:1 2 3 4 5,则调用reverse函数后,a数组内容变为:5 4 3 2 1。#includeusing namespace std;const int M=100;void reverse(int a,int n);int main() int aM
7、,n; cinn; for(int i=0;iai; reverse(a,n); coutendl; return 0;void reverse(int a,int n) if(n!=0) n-; reverse(&a1,n); couta0 ; return;实验三 C+在非面向对象方面的扩充(2学时) 实验目的和要求:16. 掌握函数重载的方法及定义重载函数时的注意事项。17. 掌握函数缺省参数的使用。18. 掌握指针的定义及使用方法,理解void型指针。19. 理解动态内存分配意义,掌握new和 delete使用方法。20. 掌握引用的声明方法及使用。21. 掌握const修饰符及其内联
8、函数的使用。22. 熟悉C+在非面向对象方面的其他扩充特性。 实验内容:23. 编写10个重载函数max,分别求两个整数、实数、双精度数、字符及三个整数、单精度数、双精度数、字符中的最大数。#includeusing namespace std;int max(int x,int y) return xy?x:y;int max(int x,int y,int z) int t=xy?x:y; return tz?t:z;float max(float i,float j) return ij?i:j;float max(float i,float j,float k) float s=ij?
9、i:j; return sk?s:k;double max(double m,double n) return mn?m:n;double max(double m,double n,double o) double l=mn?m:n; return lo?l:o;char max(char p,char q) return pq?p:q;char max(char p,char q,char r) char v=pq?p:q; return vr?v:r;int main() int x,y,z,t; float i,j,k; double m,n,o; char p,q,r; cout1.
10、两个整数比较大小endl2.两个单精度数比较大小endl3.两个双精度数比较大小endl4.两个字符比较大小endl; cout5.三个整数比较大小endl6.三个单精度数比较大小endl7.三个双精度数比较大小endl8.三个字符比较大小endl; while(1) coutt; switch(t) case 1: cinxy; coutmax(x,y)ij; coutmax(i,j)mn; coutmax(m,n)pq; coutmax(p,q)xyz; coutmax(x,y,z)ijk; coutmax(i,j,k)mno; coutmax(m,n,o)pqr; coutmax(p,q
11、,r)endl;break; return 0;24. 编写函数void add1(int sum),void add2(int * sum),void add3(int & sum),功能如下:输入若干个整数,以0结束,并用参数sum返回这若干个整数之和。在主程序中分别调用这三个函数,观察结果,总结值传递和地址传递的规律。 #include#includeusing namespace std;void add1(int sum) int i; while(i!=0) cini; sum+=i; void add2(int *p) int i; while(i!=0) cini; *p+=i
12、; void add3(int &sum) int i; while(i!=0) cini; sum+=i; int main() int sum1=0,sum2=0,sum3=0; int *p; p=&sum2; add1(sum1); add2(p); add3(sum3); coutsum1endlsum2endlsum3endl; return 0; 25. 矩阵中填数:当给出 N*N 的矩阵,要求用程序填入下列形式的数:(1)S形填数,例如N=5 (2)回转填数,例如N=51234510987611121314152019181716 21222324251234516171819
13、6152425207142322218131211109 要求:用new和delete动态分配空间(提示:可用一维数组来表示二维数组)。#include#includeusing namespace std;int row,temp;void gorigh(int *q,int &m,int &a) for(temp=0;temprow;temp+) if(qa*row+temp=0) qa*row+temp=m+; a+;void godown(int *q,int &m,int &b) for(temp=0;temp0;temp-) if(qc*row+temp=0) qc*row+tem
14、p=m+; c-;void goup(int *q,int &m,int &d) for(temp=row-1;temp0;temp-) if(qtemp*row+d=0) qtemp*row+d=m+; d-;int main() int a,b,c,d,m,n=100; for(a=1;a=n;a+) coutrow; int *p=new int row*row; m=1; for(a=0;arow*row;a+) pa=0; a=d=0; c=b=row-1; while(m=row*row) gorigh(p,m,a); godown(p,m,b); goleft(p,m,c); g
15、oup(p,m,d); cout回旋方阵:endl; for(a=0;a0) coutendl; for(b=0;brow;b+) coutsetw(3)pa*row+b; coutendl; for(a=0;arow*row;a+) pa=0;d=1;b=1; for(a=0;arow;a+) if(b=1) for(c=0;c=0;c-) pa*row+c=(d+); b=-b; coutS形方阵:endl; for(a=0;a0) coutendl; for(b=0;brow;b+) coutsetw(3)pa*row+b; coutendl; delete p; return 0; 实
16、验四 类与对象(一)(4学时) 实验目的和要求:26. 掌握类、类的数据成员、类的成员函数的定义方式。27. 理解类成员的访问控制方式。28. 掌握对象的定义和操作对象的方法。29. 理解和掌握构造函数、析构函数、拷贝构造函数的定义与执行过程。30. 掌握重载构造函数的方法。31. 理解浅拷贝与深拷贝。32. 了解对象的生存期。 实验内容:33. 设计三个图形类:Circle(圆)、Rectangle(矩形)、Triangle(三角形),要求:(1) Circle 类基本信息:圆心坐标、半径;Rectangle 类基本信息:长、宽;Triangle 类基本信息:三个顶点坐标;其中:成员变量为
17、private 属性,成员函数为public 属性。(2) 为Circle类设计缺省的构造函数,并用init成员函数进行数据成员的初始化。(3) 为其余两个类设计多个构造函数:无参、带参、参数值缺省的构造函数。(4) 每个图形类有计算图形的面积GetArea(),计算图形的周长GetPerimeter(),显示图形的基本信息函数Show(),修改基本信息的函数Set(形参)。以Circle 类为例:通过GetArea()计算圆的面积,GetPerimeter()计算圆的周长,Show()函数中显示圆心坐标、直径、周长、面积等基本信息;Set(int x,int y, int r)函数可以修改圆
18、心坐标和半径。(5) 注意多个构造函数的声明方式与定义的实现。(6) 当输入数据为不合理数据时(例如:输入的三角形的顶点是否能组成一个三角形),提示用户输入错误。#includeusing namespace std;#includeclass Circlepublic: void setCircle(int a,int b, int c) x=a;y=b;r=c; double GetArea(int a=0,int b=0, int c=0) return 3.14*c*c; double GetPerimeter(int a,int b, int c) return 2*3.14*c;
19、void showCircle() cout圆的坐标为:(x,y)endl; cout圆的直径为:2*rendl; coutArea=GetArea(x,y,r) Perimeter=GetPerimeter(x,y,r)width=wid; / Rectangle double Area(double len,double wid) return len*wid; double Perimeter(double len,double wid) return 2*(len+wid); void showRectangle() coutArea=Area(length,width) Perime
20、ter=Perimeter(length,width)endl; private: double length,width;class Trianglepublic: void setTriangle(double x,double y,double r) a=x;b=y;c=r; double getArea(double x,double y,double r) return sqrt(x+y+r)/2)*(x+y+r)/2-x)*(x+y+r)/2-y)*(x+y+r)/2-r); double getPerimeter(double x,double y,double r) retur
21、n x+y+r; void showTriangle() cout三角形的三边分别为a=a b=b c=cendl; coutArea=getArea(a,b,c) Perimeter=getPerimeter(a,b,c)endl; private: double a,b,c;int main() int a,b,c,d,e,f,i,j,k,p; double r,s,t,m,n; cout计算 圆 请输入 : 1endl计算 矩形 请输入 : 2endl计算三角形请输入 : 3p; switch(p) case 1: Circle circle1; coutijk; circle1.set
22、Circle(i,j,k); circle1.showCircle(); break; case 2: Rectangle rectangle1; coutmn; rectangle1.setRectangle(m,n); rectangle1.showRectangle(); break; case 3: Triangle triangle1; coutabcdef; r=sqrt(pow(a-c,2)+pow(b-d,2); s=sqrt(pow(a-e,2)+pow(b-f,2); t=sqrt(pow(c-e,2)+pow(f-d,2); triangle1.setTriangle(r,s,t); if(r+s)=t|(r+t)=s|(t+s)=r) cout对不起!您输入的三个坐标构