zoukankan      html  css  js  c++  java
  • 第九章 类和对象练习题(下)

    练习
    网易云学习歌单链接: 点我听歌.
    数据结构与算法推荐链接(JAVA语言): link.

    1、定义构造成员函数处理输入输出。

    在类Time中定义了构造函数Time,它与所在的类同名。在建立对象时自动执行构造函数,
    该函数的作用是为对象中的各个数据成员赋初值 0。 注意只有执行构造函数时才为数据
    成员赋初值。
    程序运行时首先建立对象t1,并对t1中的数据成员赋初值0,然后执行t1.set_time函数,
    从键盘输入新值给对象t1的数据成员,再输出t1的数据成员的值。接着建立对象t2,同时
    对t2中的数据成员赋初值0,最后输出t2的数据成员的初值。

    代码:

    
    #include <iostream>
    using namespace std;
    class Time
    {
    public:
    	Time()
    	{
    		hour=0;
    	    minute=0;
    	    sec=0;
    	}
    	void set_time();
    	void show_time();
    private:
    	int hour;
        int minute;
        int sec;
    };
    
    int main()
    {
    	Time t1;
    	t1.set_time();
    	t1.show_time();
    	Time t2;
    	t2.show_time();
    
    	return 0;
    }
    void Time::set_time()
    {
    	cin>>hour;
    	cin>>minute;
    	cin>>sec;
    }
    
    void Time::show_time()
    {
    	cout<<hour<<":"<<minute<<":"<<sec<<endl;
    }
    

    亦可以在类外定义构造函数

    Time::Time()
    {
    	hour=0;
    	minute=0;
    	sec=0;
    }
    
    

    运行结果:
    在这里插入图片描述

    2.有两个长方柱,其长、宽、高分别为:
    (1)12,25,30
    (2)15,30,21
    编写程序,在类中用带参数的构造函数,计算它们的体积。
    分析:可以在类中定义一个计算长方体体积的成员函数计算对象的体积。

    代码:

    #include <iostream>
    using namespace std;
    class Box
    {
    public:
    	Box(int,int,int);
        int volume();
    private:
        int height;
        int width;
        int length;
    };
    Box::Box(int h,int w,int len)   // 长方体构造函数
    {
    	height=h;
        width=w;
        length=len;
    }
    
    int Box::volume()    //  计算长方体的体积
    {
    	return(height*width*length);
    }
    int main()
    {
    	Box box1(12,25,30);    // 定义对象box1
        cout<< " box1体积=" << box1.volume() <<endl;
        Box box2(15,30,21);    // 定义对象box2
        cout<< " box2体积= " << box2.volume()<<endl;
        
    	return 0;
    }
    

    构造函数Box有3个参数,分别代表长、宽、高。在主函数中定义对象box1时,指定了实参12,25,30。然后调用成员函数计算长方体的体积。
    提醒:
    (1)带形参的构造函数在定义对象时必须指定实参
    (2)用这种方法可以实现不同对象的初始化。

    运行结果:

    在这里插入图片描述

    3、在题2的基础上定义两个构造函数其中一个无参数,另一个有参数。

    代码:

    #include <iostream>
    using namespace std;
    class Box
    {
    public:
    	Box(int,int,int);
    	Box();
        int volume();
    private:
        int height;
        int width;
        int length;
    };
    Box::Box(int h,int w,int len)   // 长方体构造函数
    {
    	height=h;
        width=w;
        length=len;
    }
    Box::Box();
    int Box::volume()    //  计算长方体的体积
    {
    	return(height*width*length);
    }
    
    int main()
    {
    	Box box1(12,25,30);    // 定义对象box1
        cout<< " box1体积=" << box1.volume() <<endl;
        Box box2(15,30,21);    // 定义对象box2
        cout<< " box2体积= " << box2.volume()<<endl;
        
    	return 0;
    }
    

    运行结果:

    在这里插入图片描述

    4、将题3中的构造函数改用带默认值的参数,长、宽、高的默认值都是10

    代码:

    #include <iostream>
    using namespace std;
    class Box
    {
    public:
    	Box();
        int volume();
    private:
        int height;
        int width;
        int length;
    };
    Box::Box()   // 长方体构造函数
    {
    	height=10;
        width=10;
        length=10;
    }
    
    int Box::volume()    //  计算长方体的体积
    {
    	return(height*width*length);
    }
    int main()
    {
    	Box box1;    // 定义对象box1
        cout<< " box1体积=" << box1.volume() <<endl;
        Box box2;    // 定义对象box2
        cout<< " box2体积= " << box2.volume()<<endl;
        
    	return 0;
    }
    

    运行结果:

    在这里插入图片描述

    5、利用面向对象的编程方法求一元二次议程axx+b*x+c=0的实数解,其中,方程系数a、b、c从键盘输入。

    代码:

    #include <iostream>
    #include<cmath>
    
    using namespace std;
    class Root
    {
    public:
    	Root()
    	{
    		a=0;
    	    b=0;
    	    c=0;
    	}
    	void set_value();
    	void show_root();
    private:
    	double a;
        double b;
        double c;
    };
    
    int main()
    {
    	Root obj;
    	while(1)
    	{
    		obj.set_value();
    		obj.show_root();
    	}
    
    	return 0;
    }
    void Root::set_value()
    {
    	cout<<"请依次输入 a b c: "<<endl;
    	cin>>a;
    	cin>>b;
    	cin>>c;
    }
    
    void Root::show_root()
    {
    	double temp = 0;
    	temp = pow(b,2)-4*a*c;
    
    	if(0==temp)
    	{
    		cout<<"方程的根为:"<<(-b)/(2*a)<<endl;	
    	}
    	if(temp<0)
    	{
    		cout<<"为虚根"	<<endl;
    	}
    	if(temp>0)
    	{
    		cout<<"方程的一个根为:"<<((-b)+sqrt(temp))/(2*a)<<endl;	
    		cout<<"方程的另一个根为:"<<((-b)-sqrt(temp))/(2*a)<<endl;
    	}
    }
    

    运行结果:

    在这里插入图片描述

    6、利用面向对象的编程方法计算 1!+2!+3!…+n!的值,其中,n从键盘输入。

    代码:

    #include <iostream>
    #include<cmath>
    
    using namespace std;
    class Factorial
    {
    public:
    	Factorial()
    	{
    		n=0;
    	}
    	int set_value();
    	int show_value(int);
    private:
    	int n;
    };
    
    int main()
    {
    	Factorial obj;
    	int results=1,temp=0;
    
    	while(1)
    	{
    		temp = obj.set_value();
    		results = obj.show_value(temp);
    
    		cout<<"阶乘结果为:"<<results<<endl;
    	}
    
    	return 0;
    }
    int Factorial::set_value()
    {
    	cout<<"请输入 n 值: "<<endl;
    	cin>>n;
    
    	return n;
    }
    
    int Factorial::show_value(int num)
    {
    	n = num;
    	register int i ,f = 1;
        for(i=1;i<=n;i++)  
            f*=i;  
      
        return f; 
    }
    

    运行结果:
    在这里插入图片描述

    7、试定义一个字符串类STR,求两个字符串的交集。字符串的交集定义为由两个字符串都包含的字符组成的字符串。
    == 参考链接 ==.

    代码:

    #include <iostream>
    #include<cmath>
    #include<string>
    #define SIZE 50
    using namespace std;
    class STR
    {
    public:
    	STR(char *p1,char *p2)
    	{
    		strcpy(s1,p1);
    		strcpy(s2,p2);
    		s0[0] = '';
    	}
    	int isin(char *p,char c)
    	{
    		char *p0 = p;
    		while(*p0)
    		{
    			if(c == (*p0++))
    				return 1;
    		}
    		return 0;
    	}
    	void fun()
    	{
    		char *p0 = s0, *p1 = s1;
    		while(*p1)
    		{
    			if(isin(s2,*p1)&&(!isin(s0,*p1)))
    			{
    				*p0++ = *p1;
    			}
    			*p0 = '';
    			p1++;
    		}
    	}
    	void print()
    	{
    		cout<<"字符串1: "<<s1<<endl;
    		cout<<"字符串2: "<<s2<<endl;
    		cout<<"两个字符串的交集: "<<s0<<endl;
    	}
    private:
    	char s0[SIZE],s1[SIZE],s2[SIZE];
    };
    
    int main()
    {
    	char str1[] = "abcdef123cplus";
    	char str2[] = "stm32abcdef123";
    	STR obj(str1,str2);
    	obj.fun();
    	obj.print();
    
    	return 0;
    }
    

    运行结果:

    在这里插入图片描述

    8、试定义一个类Num,将字符串表示的十六进制整数转换为对应的十进制整数。

    == 参考链接 ==.

    代码:

    #include<iostream> 
    #include<string> 
    #include<cstdlib> 
    
    using namespace std;
    class Num
    { 
    	char s[10]; 
    	int n; 
    public: 
    
    	/*将大写字母转换成小写字母*/  
    	int tolower(int c)  
    	{  
    		if (c >= 'A' && c <= 'Z')  
    		{  
    			return c + 'a' - 'A';  
    		}  
    		else  
    		{  
    			return c;  
    		}  
    	} 
    	//将十六进制的字符串转换成整数  
     
    	int fun(char s1[10])
    	{  
    		int i = 0;  
    		n = 0;
    		strcpy(s,s1);
    		if (s[0] == '0' && (s[1]=='x' || s[1]=='X'))  
    		{  
    			i = 2;  
    		}  
    		else  
    		{  
    			i = 0;  
    		}  
    		for (; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >='A' && s[i] <= 'Z');++i)  
    		{  
    			if (tolower(s[i]) > '9')  
    			{  
    				n = 16 * n + (10 + tolower(s[i]) - 'a');  
    			}  
    			else  
    			{  
    				n = 16 * n + (tolower(s[i]) - '0');  
    			}  
    		}
    		
    		return n;  
    	}  
    
    	void print( ) 
    	{
    		cout<<"十六进制数: "<<s<<endl;
    		cout<<"对应的十进制数为: "<<n<<endl; 
    	} 
    
    }; 
    
    int main( ) 
    { 
    	char t[20]; cout<<"输入一个十六进制数: "; 
    	cin.getline(t,20);  
    	Num obj;
    	obj.fun(t);
    	obj.print();
    
    	return 0;
    }
    

    运行结果:

    在这里插入图片描述

    作业

    1、建立一个数组类ARR,求一个整型数组所有元素中的最大值及该最大值在数组中的序号(从1开始)。

    == 参考链接 ==.

    代码

    #include<iostream>
    using namespace std;
    
    class Array{
    	public:
    		Array(int a[5]);
    		void process();
    		void print();
    	private:
    		int data[5];
    		int max;
    		int max_index;
    		int min;
    		int min_index;
    };
    
    Array::Array(int a[5])
    {
    	for(int i=0;i<5;i++)
    	{
    		data[i]=a[i];
    	}
    }
    void Array::process()
    {
    	int t=data[0];
    	for(int i=1;i<5;i++)
    	{
    		if(t<data[i])
    		{
    			t=data[i];
    			max_index=i+1;
    		}
    	}
    	max=t;
    	for(i=0;i<5;i++)
    	{
    		if(t>data[i])
    		{
    			t=data[i];
    			min_index = i+1;
    		}
    	}
    	min=t;
    }
    void Array::print()
    {
    	cout<<"最大值: "<<max<<endl;
    	cout<<"最大值下标: "<<max_index<<endl;
    
    	cout<<"最小值: "<<min<<endl;
    	cout<<"最小值下标: "<<min_index<<endl;
    }
    
    int main()
    {
    	int b[5];
    	for(int i=0;i<5;i++)
    	{
    		cin>>b[i];
    	}
    	Array arr(b);
    	arr.process();
    	arr.print();
    	return 0;
    }
    

    结果

    在这里插入图片描述

    2、试定义一个类NUM,求100以内所有的无暇素数。所谓无暇素数是指一个两位整数,其本身是素数,其逆序数也是素数。例如,17是素数,17的逆序数是71,17和71都是素数,所以17和71都是无暇素数。

    == 参考链接 ==.

    代码

    #include <iostream>
    using namespace std;
    
    class PrimeNUM
    {
    public:
    	PrimeNUM(int low,int high);             //构造函数
    	int isprime(int x);                     //判断x是否为素数,若是,返回1;否则,返回0
    	void process();                         //把所有的素数存放在数组data中,并将求出的素数的个数赋值给num
    	void print();                           //输出求出的素数个数,每行输出5个素数
     
    private:
    	int m_data[25];                         //存放素数
    	int m_low,m_high;                       //数据范围的上下限
    	int m_num;                              //存放的个数
    };
     
    PrimeNUM::PrimeNUM(int low,int high)
    {
    	m_low = low;
    	m_high = high;
    }
     
    int PrimeNUM::isprime(int x)
    {
    	int i;
        int flag = 1;
        for (i = 2; i < x; i++)
    	{
    		if (x % i == 0)
    	    {
    			flag = 0;
    			break;
    	    }
    	}
    	return flag;
    }
     
    void PrimeNUM::process()
    {
    	m_num = 0;
    	int j;
    	int k = 0;
    	for( j= m_low;j <= m_high;j++)
    	{
    		if(isprime(j) == 1)
    		{
    			m_num++;
    			m_data[k] = j;
    			k++;
    		}
    	}
    }
     
    void PrimeNUM::print()
    {
    	std::cout << "primes' num are " << m_num << std::endl;
    	for(int count=0; count<m_num; count++)
    	{
    		std::cout << m_data[count] <<" ";
    		if((count+1) % 5 == 0)
    		{
    			std::cout << std::endl;
    		}
    	}
    }
    int main()
    {
    	PrimeNUM test(10, 99);
    	test.process();
    	test.print();
    	return 0;
    }
    

    结果
    在这里插入图片描述

    3、试定义一个类ARRAY,实现对一维整型数组的排序。排序的规则如下:将一维数组中各元素按其各位的数字之和从小到大排序。

    == 参考链接 ==.

    代码

    #include <iostream>
    using namespace std;
    
    //建立类
    class ARRAY
    {
    	int a[100];
    	int n;
    public:
    	//构造函数
    	ARRAY(int t[], int m)
    	{
    		n = m;
    		for(int i=0; i<n; i++)
    		{
    			a[i] = t[i];
    		}
    	}
    	//累加和算法
    	int sum(int x)
    	{
    		int s = 0;
    		while(x)
    		{
    			s = s+x%10;
    			x = x/10;
    		}
    		return s;
    	}
    	//输出函数
    	void print()
    	{
    		for(int i=0; i<n; i++)
    		{
    			cout<<a[i]<<"	";
    		}
    		cout<<endl;
    	}
    	//冒泡法
    	void fun()
    	{
    		int i, j, t;
    		for(i=0; i<n-1; i++)
    			for(j=0; j<n-1; j++)
    				if(sum(a[j])>sum(a[j+1]))
    				{
    					t = a[j];
    					a[j] = a[j+1];
    					a[j+1] = t;
    				}
    	}
    
    };
    
    int main()
    {
    	int a[] = {297,735,624,158,312,900};
    	ARRAY arr(a,sizeof(a)/sizeof(int));
    
    	arr.print();
    	arr.fun();
    	arr.print();
    	return 0;
    }
    

    结果
    在这里插入图片描述

    4、有16个数:1,2,2,3,4,4,5,6,6,7,8,8,8,9,10,10,已按由小到大的顺序排好,存于数组a中,试建立一个类ARR,完成将其中相同的数删得只剩一个。删除后a数组中的内容为{1,2,3,4,5,6,7,8,9,10}。
    (以上4道题要求:1、有私有数据成员,2、有公有成员函数,3、在主函数中对该类进行测试。)

    == 参考链接 ==.

    代码

    #include <iostream>
    using namespace std;
    
    //建立类
    class ARR
    {
    	int a[100];
    	int n;
    public:
    	//构造函数
    	ARR(int t[], int size)
    	{
    		n = size;
    		for(int i=0; i<n; i++)
    		{
    			a[i] = t[i];
    		}
    	}
    
    	//输出函数
    	void print()
    	{
    		int k = 0;
    		for(int i=0; i<n; i++)
    		{
    			cout<<a[i]<<"	";
    			k++;
    			if(k%5 == 0)
    				cout<<endl;
    		}
    		cout<<endl;
    	}
    
    	void fun()
    	{
    		for(int i=0; i<n-1; i++)
    		{
    			if(a[i] == a[i+1])
    			{
    				for(int j=i; j<n-1; j++)
    					a[j] = a[j+1];
    				n--;
    				i--;
    			}
    		}
    	}
    
    };
    
    int main()
    {
    	int a[16] = {1,2,2,3,4,4,5,6,6,7,8,8,8,9,10,10};
    	ARR arr(a,sizeof(a)/sizeof(int));
    
    	arr.print();
    	arr.fun();
    	arr.print();
    
    	return 0;
    }
    

    结果
    在这里插入图片描述

    5、利用成员函数作为友元函数,求底面积不同的圆柱体的体积。(1、圆柱体Volume类,圆形Circle类;2、在主函数中进行测试。)

    代码

    #include <iostream>
    using namespace std;
    #define PI 3.14
    
    //建立类
    class Circle
    {
    	double radius;
    public:
    	Circle(double r)
    	{
    		radius = r;
    	}
    	int getr()
    	{
    		return radius;
    	}
    };
    class Volume
    {
    	double hight;
    	Circle rad;
    public:
    	Volume(double h,double r):hight(h),rad(r)
    	{
    		hight = h;
    		rad = r;
    	}
    	friend void volume(Volume obj);
    };
    void volume(Volume obj)
    {
    	cout<<"圆柱体积为"<<obj.hight*obj.rad.getr()*obj.rad.getr()*PI<<endl;
    }
    
    int main()
    {
    	Volume obj_1(2,4);
    	volume(obj_1);
    
    	cout<<"====================
    ";
    	Volume obj_2(6,2);
    	volume(obj_2);
    
    	return 0;
    }
    

    结果
    在这里插入图片描述

    千里之行,始于足下!
  • 相关阅读:
    没时间写文章::>_<::
    使 iis 支持 flv 视频播放
    CentOS7系统配置国内yum源(阿里云)
    android adb启动失败问题 adb server is out of date. killing... ADB server didn't ACK * failed to start daemon *
    android开发 获取手机分辨率大小
    c++流操作>rdbuf()
    ROR:Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'
    android map如何获得Google Map API key
    Android有效解决加载大图片时内存溢出的问题
    Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
  • 原文地址:https://www.cnblogs.com/MINAIot/p/13040986.html
Copyright © 2011-2022 走看看