实验七 类构造与静态成员函数

A. 三角形类(构造与析构)

题目描述

定义一个三角形类CTriangle,属性包含三条边和三角形类型,其中用字符串保存三角形类型。三角形类型如下:

等腰三角形:isosceles triangle
直角三角形:right triangle
等腰直角三角形:isosceles right triangle
等边三角型:equilateral triangle
一般三角形:general triangle
不能构成三角形:no triangle

其中判断直角三角形条件:三角形三边中的一边长度平方等于另两边长度平方之和

类行为包括构造、析构、计算面积等等。其中构造函数将设置三条边长度,并且判断三条边能否构成三角形、并设置三角形类型。析构函数将三条边长度清0,并将三角形类型设置为none

三角形面积计算如下
在这里插入图片描述

输入

测试数据的组数

第一组边1 第一组边2 第一组边3

第二组边1 第二组边2 第二组边3

输出

第一个三角形类型,面积

第二个三角形类型,面积

如果不形成三角形,就无需输出面积

面积精度到小数点后1位

输入样例

3
3.0 2.0 6.0
3.0 4.0 5.0
1.0 1.0 1.414

输出样例

no triangle
right triangle, 6.0
isosceles right triangle, 0.5

参考代码

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
class CTriangle
{
	double a;
	double b;
	double c;
	string type;
	public:
	CTriangle(){}
	CTriangle(double x1,double x2,double x3);
	bool istriangle()
	{
		if(type[0]=='n') return false;
		else return true;
	}
	double area()
	{
		double s;
		double p;
		p=(a+b+c)/2;
		s=sqrt(p*(p-a)*(p-b)*(p-c));
		return s;
	}
	~CTriangle()
	{
		a=0;
		b=0;
		c=0;
		type="none";
	}
	void print()
	{
		if(istriangle()) cout<<type<<", "<<fixed<<setprecision(1)<<area()<<endl;
		else cout<<type<<endl;
		
	}
		
};
CTriangle::CTriangle(double x1,double x2,double x3)
	{
		a=x1;
		b=x2;
		c=x3;
		type="0";
		if(a+b>c&&a+c>b&&b+c>a&&fabs(a-b)<c&&fabs(a-c)<b&&fabs(b-c)<a)
		{
			int flag1=0,flag2=0;
			//直角三角形 
			if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) 
			{
				type="right triangle";
				flag1=1;
			}	
			else if(a==b||a==c||b==c) 
			{
				if(a==b&&b==c) type="equilateral triangle";//等边三角形 
				else //普通的等腰三角形 
				{
					type="isosceles right triangle";
					flag2=1;
				}	
			}
			else if(flag1&&flag2) type="isosceles right triangle";
			else type="general triangle";	
		}
		else type="no triangle";
	}
int main()
{
	int t;
	cin>>t;
	double x1,x2,x3;
	
	while(t--)
	{
		cin>>x1>>x2>>x3;
		CTriangle tri(x1,x2,x3);
		tri.print();
	}
}

B. Equation(类与对象+构造)

题目描述

建立一个类Equation,表达方程ax2+bx+c=0。类中至少包含以下方法:

1、无参构造(abc默认值为1、1、0)与有参构造函数,用于初始化a、b、c的值;

2、set方法,用于修改a、b、c的值

3、getRoot方法,求出方程的根。

一元二次方程的求根公式如下:
在这里插入图片描述
一元二次方程的求解分三种情况,如下:
在这里插入图片描述

输入

输入测试数据的组数t

第一组a、b、c

第二组a、b、c

输出

输出方程的根,结果到小数点后2位

在C++中,输出指定精度的参考代码如下:

#include

#include //必须包含这个头文件

using namespace std;

void main( )

{ double a =3.141596;

cout<<fixed<<setprecision(3)<<a<<endl; //输出小数点后3位

输入样例

3
2 4 2
2 2 2
2 8 2

输出样例

x1=x2=-1.00
x1=-0.50+0.87i x2=-0.50-0.87i
x1=-0.27 x2=-3.73

参考代码

#include<iostream>
#include<iomanip> 
#include<cmath>
using namespace std;
class Equation
{
	double a;
	double b;
	double c;
	public:
	Equation()
	{
		a=1;b=1;c=0;	
	}
	Equation(double a1,double a2,double a3)
	{
		a=a1;
		b=a2;
		c=a3;
	}	
	void set(double a1,double a2,double a3)
	{
		a=a1;
		b=a2;
		c=a3;
	}	
	int num_root()
	{
		int judge=0;
		if(b*b-4*a*c<0) judge=0;
		else if(b*b-4*a*c==0) judge=1;
		else judge=2; 
		return judge;
	}
	void getroot();	
};
void Equation::getroot()
{
	double x1,x2,x1_i,x2_i;
	double res1,res2;
	res1=-b/(2*a);
	if(num_root()==0) //无实根 
	{
		x1=res1;
		x2=res1;
		x1_i=sqrt(4*a*c-b*b)/(2*a);//判别式为负数 
		x2_i=-sqrt(4*a*c-b*b)/(2*a); 
		cout<<"x1="<<fixed<<setprecision(2)<<x1<<'+'<<fixed<<setprecision(2)<<x1_i<<"i x2=";
		cout<<fixed<<setprecision(2)<<x2<<fixed<<setprecision(2)<<x2_i<<'i'<<endl;
	}
	else if(num_root()==1)
	{
		x1=res1;
		x2=res1;
		cout<<"x1=x2="<<fixed<<setprecision(2)<<x1<<endl;
	}
	else 
	{
		x1=res1+sqrt(b*b-4*a*c)/(2*a);
		x2=res1-sqrt(b*b-4*a*c)/(2*a);
		cout<<"x1="<<fixed<<setprecision(2)<<x1<<' ';
		cout<<"x2="<<fixed<<setprecision(2)<<x2<<endl;
	}
}
int main()
{
	int t;
	cin>>t;
	double a1,a2,a3;
	while(t--)
	{
		cin>>a1>>a2>>a3;
		Equation equ1(a1,a2,a3);
		equ1.getroot();
	}
}

C. 图书借阅(对象数组+构造)

题目描述

假设图书馆的图书书名各不相同,相同书有若干本可借阅。

定义图书类CBook,数据成员包括:索取号、书名、馆藏数量、可借数量。方法包括:

构造函数:根据参数初始化数据成员。

借书:参数是书名。若该书的可借数量大于等于1,则返回索取号;否则,返回空串。

主函数动态定义CBook数组,初始化图书馆馆藏信息。输入借书信息,对每次借书需求,根据样例给出结果。

输入

图书馆馆藏书种类n

n个图书信息:索取号 书名 馆藏数量 可借数量

借书需求次数m

m本书名

输出

对每个借书需求,根据样例输出结果。

输出空行。

输出所有馆藏书的信息。

输出借出图书数量 剩余馆藏图书数量

输入样例

4
TP312JA-43/L99 Java语言程序设计教程 3 0
TP312PH/Q68b PHP7内核剖析 3 2
TP311.561-43/L93 Python大学教程 3 1
TP311.5-43/M18a1(2) 软件工程基础 3 3
4
Java语言程序设计教程
软件工程基础
Python大学教程
Python大学教程

输出样例

Java语言程序设计教程 该书已全部借出
软件工程基础 索取号: TP311.5-43/M18a1(2)
Python大学教程 索取号: TP311.561-43/L93
Python大学教程 该书已全部借出

TP312JA-43/L99 Java语言程序设计教程 3 0
TP312PH/Q68b PHP7内核剖析 3 2
TP311.561-43/L93 Python大学教程 3 0
TP311.5-43/M18a1(2) 软件工程基础 3 2
借出图书: 8本  剩余馆藏图书: 4

参考代码

#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
using namespace std;
class CBook
{
	string sbn;
	string name;
	int num_have;
	int num_borr;
	public:
		CBook(){}
		CBook(string s1,string s2,int n1,int n2)
		{
			sbn=s1;
			name=s2;
			num_have=n1;
			num_borr=n2;
		}
		void set(string s1,string s2,int n1,int n2)
		{
			sbn=s1;
			name=s2;
			num_have=n1;
			num_borr=n2;
		}
		string borrow()
		{
			string temp;
			if(num_borr>=1) 
			{
				num_borr--; 
				return sbn;
			} 
			else 
			{
				temp="\0";
				return temp;
			}
		}
		string get_name()
		{
			return name;
		}
		int get_numbor()
		{
			return num_borr;
		}
		int get_numhav()
		{
			return num_have;
		}
		void get_all()
		{
			cout<<sbn<<' '<<name<<' '<<num_have<<' '<<num_borr<<endl;
		}
};

int main()
{
	int n;
	cin>>n;
	int m,num1,num2;
	string s1,s2,temp1,temp2;
	CBook *p=new CBook[n];
	for(int i=0;i<n;i++)
	{
		cin>>s1>>s2>>num1>>num2;
		p[i].set(s1,s2,num1,num2);
	}
	cin>>m;
	for(int i=0;i<m;i++)
	{
		cin>>temp1;
		cout<<temp1<<' ';
		for(int j=0;j<n;j++)
		{
			if(p[j].get_name()==temp1) 
			{
				temp2=p[j].borrow();
				if(temp2=="\0") cout<<"该书已全部借出"<<endl;
				else cout<<"索取号: "<<temp2<<endl;
				break;
			}
		}	
	}
	cout<<endl; 
	int sum=0,sum_left=0,sum_bor=0;
	for(int i=0;i<n;i++)
	{
		p[i].get_all();
		sum+=p[i].get_numhav();
		sum_left+=p[i].get_numbor();
	}
	sum_bor=sum-sum_left;
	cout<<"借出图书: "<<sum_bor<<"本  "<<"剩余馆藏图书: "<<sum_left<<"本"<<endl; 
	delete []p;
}

D. 手机服务(构造+拷贝构造+堆)

题目描述

设计一个类来实现手机的功能。它包含私有属性:号码类型、号码、号码状态、停机日期;包含方法:构造、拷贝构造、打印、停机。

1、号码类型表示用户类别,只用单个字母,A表示政府,B表示企业、C表示个人

2、号码是11位整数,用一个字符串表示

3、号码状态用一个数字表示,1、2、3分别表示在用、未用、停用

4、停机日期是一个日期对象指针,在初始化时该成员指向空,该日期类包含私有属性年月日,以及构造函数和打印函数等


5、构造函数的作用就是接受外来参数,并设置各个属性值,并输出提示信息,看示例输出

6、拷贝构造的作用是复制已有对象的信息,并输出提示信息,看示例输出。

想一下停机日期该如何复制,没有停机如何复制??已经停机又如何复制??

7、打印功能是把对象的所有属性都输出,输出格式看示例

8、停机功能是停用当前号码,参数是停机日期,无返回值,操作是把状态改成停用,并停机日期指针创建为动态对象,并根据参数来设置停机日期,最后输出提示信息,看示例输出


要求:在主函数中实现号码备份的功能,对已有的虚拟手机号的所有信息进行复制,并将号码类型改成D表示备份;将手机号码末尾加字母X

输入

第一行输入t表示有t个号码

第二行输入6个参数,包括号码类型、号码、状态、停机的年、月、日,用空格隔开

依次输入t行

输出

每个示例输出三行,依次输出原号码信息、备份号码信息和原号码停机后的信息

每个示例之间用短划线(四个)分割开,看示例输出

输入样例

2
A 15712345678 1 2015 1 1
B 13287654321 2 2012 12 12

输出样例

Construct a new phone 15712345678
类型=机构||号码=15712345678||State=在用
Construct a copy of phone 15712345678
类型=备份||号码=15712345678X||State=在用
Stop the phone 15712345678
类型=机构||号码=15712345678||State=停用 ||停机日期=2015.1.1
----
Construct a new phone 13287654321
类型=企业||号码=13287654321||State=未用
Construct a copy of phone 13287654321
类型=备份||号码=13287654321X||State=未用
Stop the phone 13287654321
类型=企业||号码=13287654321||State=停用 ||停机日期=2012.12.12
----

参考代码

#include<iostream>
#include<string>
using namespace std;
class date {
	private:
		int y, m, d;
	public:
		date(int a, int b, int c) 
		{
			y = a;
			m = b;
			d = c;
		}
		void print_date() 
		{
			cout << y << '.' << m << '.' << d << endl;
		}
};
class phone {
	public:
		char type;
		string number;
		int mod;
		date *bir;
		phone(char a, string b, int c, date *p) {
			type = a;
			number = b;
			mod = c;
			bir = p;
			cout << "Construct a new phone " << number << endl;
		}
		phone(const phone &a) {
			type = 'D';
			number = a.number;
			mod = a.mod;
			bir = new date(*a.bir);
			cout << "Construct a copy of phone " << number << endl;
		}
		
		void stop() //停机操作 
		{
			cout<<"Stop the phone "<<number<<endl;
			mod=3;
			print();
			cout<<"||停机日期=";
			bir->print_date();
			cout<<"----"<<endl;
		}
		void print() 
		{
			switch (type) {
				case 'A':
					cout << "类型=机构" << "||";
					break;
				case 'B':
					cout << "类型=企业" << "||";
					break;
				case 'C':
					cout << "类型=个人" << "||";
					break;
				case 'D':
					cout << "类型=备份" << "||";
					number.append("X");
					break;
			}
			cout << "号码=" << number << "||";
			switch (mod) {
				case 1:
					cout << "State=在用"<<endl;
					break;
				case 2:
					cout << "State=未用"<<endl;
					break;
				case 3:
					cout << "State=停用 ";
					break;
			}

		}
		~phone()
		{
			if(bir!=NULL)
			delete bir;
		}
};
int main() {
	int t,y, m, d;
	cin >> t;
	while (t--) 
	{
		char type;
		string num;
		int mod;
		cin >> type >> num >> mod>> y >> m >> d;
		date *p = new date(y, m, d);
		phone ph1(type, num, mod, p);
		ph1.print();
		phone ph2(ph1);//调用拷贝构造 
		ph2.print();
		ph1.stop();
	}
}

E. 最高成绩(静态成员)

题目描述

学生类定义如下:

class Student {

private:

int id;//学号

int score; //成绩

static int maxscore;//最高分数

static int maxid;//最高分数学生学号

public:

Student(int ti=0,int ts=0)

:id(ti), score(ts)

{}

static void findMax(Student & st); //寻找最高成绩和学号

static int getMaxScore(); //返回最高成绩

static int getMaxID();//返回最高成绩的学号

};

输入一组学生学号和成绩,用上述静态成员求最高成绩和对应学号

输入

第一行输入n表示有n个学生

接着输入n行,每行包括两个数据,表示学号和成绩

输出

调用静态成员函数输出学号和最高成绩,格式看样例

输入样例

3
1002 68
1023 54
1045 32

输出样例

1002--68

参考代码

#include<iostream>
using namespace std;
class Student
{
	private:
		int id;
		int score;
		static int maxscore;//最高分数
		static int maxid;//最高分数学生学号
	public:
		Student(int ti=0,int ts=0):id(ti),score(ts) {}
		static void findMax(Student & st); //寻找最高成绩和学号
		static int getMaxScore()//返回最高成绩
		{
			return maxscore;
		}
		 
		static int getMaxID()//返回最高成绩的学号
		{
			return maxid;
		}	
		void set()
		{
			maxscore=score;
			maxid=id;
		}
		void print()
		{
			cout<<maxid<<"--"<<maxscore<<endl;
		}
};
int Student::maxscore=0;
int Student::maxid=0;
void Student::findMax(Student &st)
{
	if(maxscore<st.score) 
	{
		st.set();
	}
	
}
int main()
{
	int n;
	cin>>n;
	int id1,sco1;
	Student *q=new Student[n];
	for(int i=0;i<n;i++)
	{
		cin>>id1>>sco1;
		q[i]=Student(id1,sco1); 
	}
	q[0].set();
	for(int i=0;i<n-1;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			q[i].findMax(q[j]);
		}
	}
	q[0].print();
	delete []q;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值