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

编程入门 行业动态 更新时间:2024-10-11 11:14:59

实验七 类构造与<a href=https://www.elefans.com/category/jswz/34/1771395.html style=静态成员函数"/>

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

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

  • A. 三角形类(构造与析构)
    • 题目描述
    • 输入
    • 输出
    • 输入样例
    • 输出样例
    • 参考代码
  • B. Equation(类与对象+构造)
    • 题目描述
    • 输入
    • 输出
    • 输入样例
    • 输出样例
    • 参考代码
  • C. 图书借阅(对象数组+构造)
    • 题目描述
    • 输入
    • 输出
    • 输入样例
    • 输出样例
    • 参考代码
  • D. 手机服务(构造+拷贝构造+堆)
    • 题目描述
    • 输入
    • 输出
    • 输入样例
    • 输出样例
    • 参考代码
  • E. 最高成绩(静态成员)
    • 题目描述
    • 输入
    • 输出
    • 输入样例
    • 输出样例
    • 参考代码

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;
}

更多推荐

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

本文发布于:2024-02-27 18:58:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1765822.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:静态   函数   成员

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!