《C++实验 类和对象——普通数学题计算.doc》由会员分享,可在线阅读,更多相关《C++实验 类和对象——普通数学题计算.doc(10页珍藏版)》请在金锄头文库上搜索。
1、实验报告实验九 类和对象(1)一、实验目的1 掌握类的概念、类的定义格式、类与结构的关系、类的成员属性和类的封装性;2 掌握类对象的定义;3 理解类的成员的访问控制的含义,公有、私有和保护成员的区别;4 掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数。二、实验内容1. 输入以下程序,并写出程序的输出结果。定义一个描述三角形的类Tri,具体要求如下:(1)私有数据成员double a, b, c: 三角形的三边。(2) 公有成员函数Tri(double x, double y, double z):构造函数,用x
2、, y, z 初始化a, b,c, 对指定的对象初始化。double Peri( ) : 求三角形的周长。double Area( ): 求三角形的面积。void Show( ): 输出三角形的各种参数(边长、周长、面积)。(3) 在主程序中定义两个三角形对象:三角形tri1, 边长分别为3,4,5,三角形tri2,边长分别为5,6,7,用构造函数初始化这两个对象a,然后输出这两个三角形的各种参数。将文件命名为S15_1.cpp。#include#includeclass Tridouble a,b,c; /定义三角形的三边public:Tri(double x, double y, doub
3、le z) /构造函数,初始化三边a=x; b=y;c=z;double Peri() /返回三角形的周长return (a+b+c);double Area() /返回三角形的面积double s=Peri()/2;double area=sqrt(s*(s-a)*(s-b)*(s-c);return area;void Show() /输出三角形的参数cout三角形的边长: atbtcendl;cout三角形的周长: Peri()endl;cout三角形的面积: Area()endlendl;/三角形类的定义结束,定义了三角形的各种属性和可实施的操作void main() /main函数决
4、定了程序运行的过程和顺序Tri tri1(3,4,5),tri2(5,6,7); /定义了两个具体的三角形tri1.Show(); /输出这两个三角形的参数tri2.Show();要求:编译运行程序,程序的输出是。2. 根据程序要求,完善程序后输入源程序,编译连接,并写出运行结果。如果某个自然数除了1和它本身外还有其他因子,则这个自然数就是合数(非素数)。试定义一个类NUM,从3开始向上试探找出n个连续的自然数,且它们都是合数。当找到第一组连续n个合数后,即停止查找。具体要求如下:(1) 私有数据成员:int n : 存放满足条件的连续自然数的个数。int *p: 根据n的值申请一个动态数组用
5、来存放求出的满足条件的n个自然数。(2) 公有成员函数。NUM(int n1):构造函数,用n1初始化n,根据n的值申请动态数组空间,使p指向该动态数组空间。int yes(int x):判定x是否为合数。如果是,返回1,否则返回0。void fun(): 从3开始向上试探找出n个连续的自然数,且它们都是合数,并依次放入动态数组。void print(): 输出满足条件的n个合数。NUM(): 析构函数,释放动态数组所占用的存储空间。(3) 在主函数中定义一个NUM类的对象num, 求出10个连续的合数。然后通过对象num调用成员函数求出10个连续的合数,并输出计算结果。将文件命名为S15_2
6、.cpp。#includeclass NUM /定义数据类NUMprivate:int n;int *p;public:NUM(int n1)/构造函数, 用n1初始化n, 并且用p动态开辟n个整数空间, 存放符合条件的合数 n=n1;p=new intn; /连续开辟n个整型空间, 将整型空间的首地址赋给pint yes(int x) /判断x是否为合数, 若是返回1, 否则返回0for(int i=2;i=x/2;i+) /i从2循环到x/2, 依次判断x能否整除iif(x%i=0) /若能整除, 说明x是合数return 1; /直接返回1return 0; /循环结束, 说明不能整除,
7、 不是合数, 返回0 void fun(void) /寻找n个连续的合数int j;for(int i=3; 1 ;i+)/从3开始向上找, 因为未给上限, 所以一直循环(循环条件永远满足)j=0; /对连续的合数计数, 所以在每次寻找之前清零while(yes(i)=1&jn)/当前的数i是合数且没有找到连续n个时, 循环向后寻找pj=i;/边找边将合数赋给动态开辟的数组空间,赋完值后序号加1j+;i+; /继续判断下一个连续的数是否满足条件if(j=n) /当找到n个连续的合数,退出上面的while循环break; /操作完成, 用break强制退出for循环void print(void
8、) /输出满足条件的连续的合数for(int i=0;in;i+)coutpit;coutendl;NUM() /析构函数, 释放在构造函数中动态开辟的数组空间if(p) deletep;void main(void)NUM num(10); /定义类的对象, 并调用构造函数动态开辟10个整型空间 num.fun();/对这个对象完成寻找连续的合数的操作, 并把操作结果存放在动态开辟的空间中num.print(); /调用对象的成员函数, 输出连续的合数 /函数结束, 对象num的作用域也结束, 调用析构函数释放对象所占用的空间要求:(1)完善程序;(2)编译运行程序,程序的输出为。3. 仿照
9、样例程序编写程序定义一个字符串类STR,从左到右对字符串中每个字符删除其后所有相同的字符,只留下第一次出现的那一个。例如,若字符串为cocoon,删除重复出现的字符后,其结果是字符串con。具体要求如下:(1) 私有数据成员:char *s1: 指向原字符串,存放字符串的空间需动态分配。char *s2: 指向结果字符串,存放字符串的空间需动态分配。(2) 公有成员函数STR(char *str):构造函数,用str初始化s1,动态分配s1和s2指向的空间。void delsame( ):删除重复出现的字符。void show( ):输出原字符串和结果字符串。STR( ):析构函数,释放动态分
10、配的存储空间。(3) 在主函数中定义一个STR类的对象test, 用字符串concoon初始化test, 通过调用成员函数完成删除工作,输出删除前后的两个字符串。代码:#include#include using namespace std;class STRprivate:char *s1;char *s2;public:STR(char *str):s1(str) s2 = new charstrlen(str)+1;/删除字符串里相同的元素void delsame() char *s1_temp = s1;char *s2_temp = s2;while (*s1_temp != 0)c
11、har *t = s1_temp;bool flag = 0;/不定义flag也可以!后面就可以用break跳出循环,if里面直接写不相等条件就行!while (*t != 0)+t;if (*t = *s1_temp) flag = 1; if (flag = 0) /如果s1_temp后面的字符都跟s1_temp不相等,就放入s2 *s2_temp+ = *s1_temp; +s1_temp; *s2_temp = 0; void show(); STR()delete s2;/输出原来与删除后的数组void STR:show() cout原字符串为:s1endl; cout删除后的字符串
12、为:s2endl;int main()STR text(concoon); text.delsame();text.show();return 0;4. 进阶提高圆盘找数问题。定义一个圆盘类Circle,用20个随机数组成一个圆(首尾相接),分别求出连续的四个数之和为最大的四个数及其和值)以及连续的四个数之和为最小的四个数(输出整个数列、最大、最小的四个数及其和值。)具体要求如下:(1) 私有数据成员int num20: 存放生成的20个随机数int Max4: 存放20个随机数中连续4个数之和中最大的那4个连续的数int Min4: 存放20个随机数中连续4个数之和中最小的那4个连续的数in
13、t sum_max: 存放20个随机数中连续4个数之和中最大的和int sum_min: 存放20个随机数中连续4个数之和中最小的和(2) 公有成员函数:Circle(): 构造函数, 用20个随机数初始化圆盘中的num数组void Find_Max(): 圆盘类的主要操作, 寻找符合条件(和为最或最小)的连续的4个数void Show(void): 输出圆盘类的整个数列,最大、最小的四个数及其和值(3) 在主函数中定义一个Circle类的对象cir, 用20个随机数初始化该对象cir,通过调用成员函数完成题目要求的任务。将文件命名为S15_4.cpp。要求:代码:#include#includeusing namespace std;class Circlepublic:Circle();/ 圆盘类的主要操作, 寻找符合条件(和为最