设计一个void类型的函数reverse_string,其功能是将一个给定的字符串逆序。例如,给定字符串为“hello”,逆序后为“olleh”。
函数接口定义如下:
/* 函数原型参见main函数 */
裁判测试程序样例:
#include
#include
using namespace std;
/* 你的代码将嵌在这里 */
int main(int argc, char const *argv[])
{
string str;
getline(cin, str); //输入字符串
reverse_string(str); //逆序字符串str
cout << str << endl; //输出逆序后的字符串
return 0;
}
输入样例:
hello
输出样例:
Olleh
void reverse_string(string &s)
{
char *str=&s[0];
int n,i,j;
char a;
for(n=0;*(str+n);n++);
for(i=0,j=n-1;i<j;i++,j--)
{
a=*(str+i);
*(str+i)=*(str+j);
*(str+j)=a;
}
}
实现一个面积计算器,它能够计算矩形或长方体的面积。
函数接口定义:
int area(int x, int y);
int area(int x, int y, int z);
第一个函数计算长方形的面积,其中x和y是长和宽。第二个函数计算长方体的表面积,x,y和z是长,宽和高。
裁判测试程序样例:
#include
#include
using namespace std;
int area(int,int);
int area(int,int,int);
int main()
{
int i, repeat, c, x, y, z;
cin>>repeat;
for(i=0;i<repeat;i++){
cin>>c;
if(c==2){
cin>>x>>y;
cout<<area(x,y)<<endl;
}
if(c==3){
cin>>x>>y>>z;
cout<<area(x,y,z)<<endl;
}
}
return 0;
}
/* 请在这里填写答案 */
输入样例:
2
2 1 2
3 2 3 4
输出样例:
2
52
```cpp
int area(int x,int y)
{
return x*y;
}
int area(int x,int y,int z)
{
return 2*(x*y+y*z+x*z);
}
**编写重载函数myMax可分别求取两个整数,三个整数,两个双精度数的最大值。**
函数接口定义:
裁判测试程序样例:
/* 请在这里填写答案 */
```cpp
int main(){
cout<
输入样例:
无
输出样例:
在这里给出相应的输出。例如:
4
5
4.3
#include
using namespace std;
int myMax(int a,int b)
{
return a>b?a:b;
}
int myMax(int a,int b,int c)
{
return (a>b)?((a>c)?a:c):((b>c)?b:c);
}
double myMax(double a,double b)
{
return a>b?a:b;
}
本题要求定义一个简单的学生类,数据成员仅需要定义学号和姓名,函数成员的原型见给出的代码,请给出函数成员的类外完整实现。
函数接口定义:
class Student
{
private:
int m_id;
char m_name[10];
public:
Student(int id=0,char *name="");
~Student();
void print();
};
其中m_id和m_name分别表示学生的学号和姓名,类型已经定义好。类内声明了3个成员函数,分别表示构造函数、析构函数和用于输出学生信息的函数。 构造函数要完成两个数据成员的初始赋值,并做一行输出,形如:“Hi!学号 姓名”。 析构函数要求输出一行,形如:“Bye!学号 姓名”。 print函数要求在一行中输出学生信息,形如:“学号 姓名”。 注:学号和姓名之间用一个空格分开。
裁判测试程序样例:
#include
#include
using namespace std;
int main()
{
Student stu_array[3]={
Student(1,"Zhang"),Student(2,"Wang")};
return 0;
}
/* 请在这里填写答案 */
Student::Student(int id,char *name)
{
m_id=id;
strcpy(m_name ,name) ;
cout<<"Hi!"<<m_id<<" "<<m_name<<endl;
}
Student::~Student()
{
cout<<"Bye!"<<m_id<<" "<<m_name<<endl;
}
//void Student::print()
//{
//cout<
//}
定义一个Tree(树)类,有成员ages(树龄),不带参数的构造函数对ages初始化为1,成员函数grow(int years)对ages加上years,age()显示tree对象的ages的值。
Tree类声明如下:
class Tree {
public:
Tree();//构造函数
void grow(int years);//对数龄ages加上years
void age();//显示数龄ages的值
private:
int ages;//树龄
};
请实现Tree类的构造函数和成员函数。
裁判测试程序样例:
#include
using namespace std;
class Tree {
public:
Tree();//构造函数
void grow(int years);//对数龄ages加上years
void age();//显示数龄ages的值
private:
int ages;//树龄
};
int main()
{
Tree tree;
int years;
cin >> years;
tree.grow(years);
tree.age();
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
30
输出样例:
31
Tree::Tree()
{
ages=1;
}
void Tree::grow(int years)
{
ages+=years;
}
void Tree::age()
{
cout<<ages;
}
本题要求实现一个日期类定义,根据所定义的类可以完成相关的类测试。
Date类定义:
根据Date被使用的情况,进行Date类定义,要求通过构造函数进行日期初始化,并通过display()函数进行日期格式显示,显示格式为"月/日/年"
测试程序样例:
main( ) 函数定义如下
int main()
{
Date d1(3,25,2019);
Date d2(3,30);
Date d3(10);
Date d4;
d1.display();
d2.display();
d3.display();
d4.display();
return 0;
}
/* 请在这里填写答案 */
输出样例:
在这里给出相应的输出。例如:
3/25/2019
3/30/2019
10/1/2019
1/1/2019
class Date{
public:
Date(int newTimeM=1,int newTimeD=1,int newTimeY=2019);
void display();
private:
int month,day,year;
};
Date::Date(int newTimeM, int newTimeD, int newTimeY) {
month=newTimeM;
day=newTimeD;
year=newTimeY;
}
void Date::display() {
cout<<month<<"/"<<day<<"/"<<year<<endl;
}
本题要求声明和实现一个Car类,包括实现其成员函数。
要求如下:
类和函数接口定义:
其中,成员函数disp_welcomemsg()显示一条欢迎信息“Welcome to the car world!”。 成员函数get_wheels()返回Car类的私有数据成员m_nWheels。 成员函数set_wheels(int)用指定的形参初始化数据成员m_nWheels。
裁判测试程序样例:
#include
using namespace std;
/* 请在这里填写答案 */
```cpp
int main()
{
int n;
cin >> n;
Car myfstcar, myseccar; //定义类对象
myfstcar.disp_welcomemsg();//访问成员函数,显示欢迎信息
myfstcar.set_wheels(n); //访问成员函数,设置车轮数量
myseccar.set_wheels(n+4); //访问成员函数,设置车轮数量
//访问成员函数,显示车轮数量
cout << "my first car wheels num = " << myfstcar.get_wheels() << endl;
cout << "my second car wheels num = " << myseccar.get_wheels() << endl;
return 0;
}
输入样例:
4
输出样例:
Welcome to the car world!
my first car wheels num = 4
my second car wheels num = 8
class Car
{
private:
int m_nWheels;
public:
void disp_welcomemsg()
{
cout<<"Welcome to the car world!"<<endl;
}
int get_wheels()
{
return m_nWheels;
}
void set_wheels(int n)
{
Car::m_nWheels=n;
}
};
某大学开田径运动会,现有12名选手参加100米比赛,对应的运动员号及成绩如表所示,请按照成绩排名并输出,要求每一行输出名次、运动员号及成绩。
运动员号 成绩(秒) 运动员号 成绩(秒)
001 13.6 031 14.9
002 14.8 036 12.6
010 12.0 037 13.4
011 12.7 102 12.5
023 15.6 325 15.3
025 13.4 438 12.7
使用给定的类,完成数据的对象的定义,并按照成绩排序后输出(格式见输出样例)
类声明如下:
#include
#include
#include
using namespace std;
class Sport
{
public:
Sport() {
}
Sport(string n,double g)
{
num=n;
grade=g;
}
string num;
double grade;
};
输入样例:
无
输出样例:
在这里给出相应的输出。例如:
1 010 12
2 102 12.5
3 036 12.6
4 011 12.7
5 438 12.7
6 025 13.4
7 037 13.4
8 001 13.6
9 002 14.8
10 031 14.9
11 325 15.3
12 023 15.6
注意:使用setw()进行宽度设置,每个输出项占6列。
int main()
{
Sport A[12];
void paixu(Sport *p);
void luru(Sport *p);
luru(A);
paixu(A);
}
void paixu(Sport *p)
{
double a;
string b;
int i,j;
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
{
if(((p+j)->grade)>((p+i)->grade))
{
a=(p+j)->grade;
(p+j)->grade=(p+i)->grade;
(p+i)->grade=a;
b=(p+j)->num;
(p+j)->num=(p+i)->num;
(p+i)->num=b;
}
}
}
for(i=0;i<12;i++)
{
cout<<setw(6)<<(i+1)<<setw(6)<<(p+i)->num<<setw(6)<<(p+i)->grade<<endl;
}
}
void luru(Sport *p)
{
p->num="001";
p->grade=13.6;
(p+1)->num="002";
(p+1)->grade=14.8;
(p+2)->num="010";
(p+2)->grade=12.0;
(p+3)->num="011";
(p+3)->grade=12.7;
(p+4)->num="023";
(p+4)->grade=15.6;
(p+5)->num="025";
(p+5)->grade=13.4;
(p+6)->num="031";
(p+6)->grade=14.9;
(p+7)->num="036";
(p+7)->grade=12.6;
(p+8)->num="037";
(p+8)->grade=13.4;
(p+9)->num="102";
(p+9)->grade=12.5;
(p+10)->num="325";
(p+10)->grade=15.3;
(p+11)->num="438";
(p+11)->grade=12.7;
}
本题要求定义一个简单的学生类,数据成员仅需要定义学号和姓名,函数成员的原型见给出的代码,请给出函数成员的类外完整实现。
函数接口定义:
class Student
{
private:
int m_id;
char m_name[10];
public:
Student(int id=0,char *name="");
~Student();
void print();
};
其中m_id和m_name分别表示学生的学号和姓名,类型已经定义好。类内声明了3个成员函数,分别表示构造函数、析构函数和用于输出学生信息的函数。 构造函数要完成两个数据成员的初始赋值,并做一行输出,形如:“Hi!学号 姓名”。 析构函数要求输出一行,形如:“Bye!学号 姓名”。 print函数要求在一行中输出学生信息,形如:“学号 姓名”。 注:学号和姓名之间用一个空格分开。
裁判测试程序样例:
#include
#include
using namespace std;
int main()
{
Student stu_array[3]={
Student(1,"Zhang"),Student(2,"Wang")};
return 0;
}
/* 请在这里填写答案 */
Student::Student(int id,char *name)
{
m_id=id;
strcpy(m_name ,name) ;
cout<<"Hi!"<<m_id<<" "<<m_name<<endl;
}
Student::~Student()
{
cout<<"Bye!"<<m_id<<" "<<m_name<<endl;
}
//void Student::print()
//{
//cout<
//}
定义一学生类,已有若干个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。
类定义:
定义一学生类,已有若干个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分
裁判测试程序样例:
利用学生类进行对象定义并输出结果的例子如下:
/* 请在这里填写答案 */
int Stud::sum=0;
int Stud::num=0;
int main()
{
Stud s1(1,"Li",89),s2(2,"Chert",78),s3(3,"zheng",94);
s1.disp();
s2.disp();
s3.disp();
cout<<"avg="<<Stud::avg()<<endl;
return 0;
}
输入:
无
输出样例:
1,Li,89
2,Chert,78
3,zheng,94
avg=87
#include
using namespace std;
class Stud
{
private:
static int sum;
static int num;
int a,b;
string c;
public:
Stud(int x,string y,int z)
{
a=x;
c=y;
b=z;
sum+=z;
num++;
}
void disp()
{
cout<<a<<","<<c<<","<<b<<endl;
}
static double avg()
{
return sum/(num*1.0);
}
};
6-1 2017final友元函数之全班同学的平均绩点 (10分)
一个学生类,有三个私有成员:名字name、课程学分指针score、课程成绩指针grade。定义一个友元函数,求全班同学的平均绩点。单门课程的学分绩点=学分绩点=学分(成绩/10-5) ; 全班同学的平均绩点是 所有同学的全部课程的学分绩点之和/所有同学学分数之和。单个同学的课程数不超过100门。全班同学人数不超过100名。
输入说明:
输入若干行。
每行一个学生的信息:第一个输入是学生的名字,第二个输入是第一门课程的学分,第三个输入是第一门课程的成绩,第四个输入是第二门课程的学分,第五个输入是第二门课程的成绩,以此类推,最后以-1表示该行输入结束。每个学生的课程数不超过100门。
最后以 no 表示输入结束。
输出一行,即该全班同学的平均绩点。
函数接口定义:
这是求全部同学平均绩点的友元函数的声明:
friend double averagegrade(student *stu, int count)
其中 *stu 和 count 都是用户传入的参数。 *stu 是传入的学生对象数组的首指针,count是全班学生数量。
裁判测试程序样例:
#include
#include
using namespace std;
class student{
private:
double *grade;
double *score;
string name;
public:
student( )
{
grade=NULL;
score=NULL;
}
student(string n, double *g, double *s)
{
name=n;
grade=g;
score=s;
}
friend double averagegrade(student *stu, int count);
};
/* 请在这里填写答案 */
int main()
{
student stu[100];
double s[100][100], g[100][100];
int count=0;
string n;
for(int i=0;i<100;i++)
{
cin>>n;
if(n=="no") break;
count++;
for(int j=0;j<100;j++)
{
cin>>s[i][j];
if(s[i][j]==-1) break;
cin>>g[i][j];
}
stu[i]=student(n, g[i], s[i]);
}
cout<<averagegrade(stu, count);
return 0;
}
输入样例:
bob 3 90 2 68.5 2.5 50 -1
andy 3 80 2 77 -1
no
输出样例:
2.408
double averagegrade(student *stu, int count)
{
int i=0,k=1;
double sum1=0,sum2=0,sum3=0;
for(;i<count;i++)
{
double *p1=(stu+i)->grade,*p2=(stu+i)->score;
int j=0;
while(*(p2+j)!=-1)
{
sum1+=*(p1+j);
sum2+=*(p2+j);
sum3+=*(p2+j)*(*(p1+j)/10-5);
j++;
}
}
if(sum3!=0&&sum2!=0)
return sum3/sum2;
else return 0;
//double *p=(stu+i)->grade;
//return *(p+k);
}
6-2 车与船的重量 (10分)
定义一boat与car两个类,二者都有weight属性,定义二者的一个友元函数totalweight(),计算二者的重量和。
测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
#include
using namespace std;
/* 请在这里填写答案 */
int main()
{
int c,b;
cin>>c>>b;
car c1(c);
boat b1(b);
cout<<totalweight(b1,c1)<<endl;
}
输入样例:
1000 2000
输出样例:
3000
作者
范鹏程
单位
内蒙古师范大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
class car;
class boat;
class car
{
private:
double weight;
public:
car(double a)
{
weight=a;
}
friend double totalweight(const boat b,const car c);
};
class boat
{
double weight;
public:
boat(double a)
{
weight=a;
}
friend double totalweight(const boat b,const car a);
};
double totalweight(boat b,car a)
{
return b.weight+a.weight;
}
6-1 写出派生类构造方法(C++) (10分)
裁判测试程序样例中展示的是一段定义基类People、派生类Student以及测试两个类的相关C++代码,其中缺失了部分代码,请补充完整,以保证测试程序正常运行。
函数接口定义:
提示:
观察类的定义和main方法中的测试代码,补全缺失的代码。
裁判测试程序样例:
注意:真正的测试程序中使用的数据可能与样例测试程序中不同,但仅按照样例中的格式调用相关函数。
#include
using namespace std;
class People{
private:
string id;
string name;
public:
People(string id, string name){
this->id = id;
this->name = name;
}
string getId(){
return this->id;
}
string getName(){
return name;
}
};
class Student : public People{
private:
string sid;
int score;
public:
Student(string id, string name, string sid, int score)
/** 你提交的代码将被嵌在这里(替换此行) **/
}
friend ostream& operator <<(ostream &o, Student &s);
};
ostream& operator <<(ostream &o, Student &s){
o << "(Name:" << s.getName() << "; id:"
<< s.getId() << "; sid:" << s.sid
<< "; score:" << s.score << ")";
return o;
}
int main(){
Student zs("370202X", "Zhang San", "1052102", 96);
cout << zs << endl;
return 0;
}
输入样例:
(无)
输出样例:
(Name:Zhang San; id:370202X; sid:1052102; score:96):People::People(id,name)
{
this->sid=sid;
this->score=score; }
6-2 狗的继承 (10分)
完成两个类,一个类Animal,表示动物类,有一个成员表示年龄。一个类Dog,继承自Animal,有一个新的数据成员表示颜色,合理设计这两个类,使得测试程序可以运行并得到正确的结果。
函数接口定义:
按照要求实现类
裁判测试程序样例:
/* 请在这里填写答案 */
int main(){
Animal ani(5);
cout<<"age of ani:"<<ani.getAge()<<endl;
Dog dog(5,"black");
cout<<"infor of dog:"<<endl;
dog.showInfor();
}
输入样例:
无
输出样例:
age of ani:5
infor of dog:
age:5
color:black
#include
using namespace std;
class Animal{
private:
int age;
public:
Animal(int a)
{
this->age=a;
}
int getAge()
{
return age;
}
};
class Dog:public Animal
{
private:
string color;
public:
Dog(int a,string b):Animal::Animal(a)
{
this->color=b;
}
void showInfor()
{
cout<<"age:"<<this->getAge()<<endl;
cout<<"color:"<<this->color<<endl;
}
};
6-3 派生类使用基类的成员函数 (10分)
按要求完成下面的程序:
1、定义一个Animal类,成员包括:
(1)整数类型的私有数据成员m_nWeightBase,表示Animal的体重;
(2)整数类型的保护数据成员m_nAgeBase,表示Animal的年龄;
(3)公有函数成员set_weight,用指定形参初始化数据成员nWeightBase;
(4)公有成员函数get_weight,返回数据成员nWeightBase的值;
(5)公有函数成员set_age,用指定形参初始化数据成员m_nAgeBase;
2、定义一个Cat类,公有继承自Animal类,其成员包括:
(1)string类型的私有数据成员m_strName;
(2)带参数的构造函数,用指定形参对私有数据成员进行初始化;
(3)公有的成员函数print_age,功能是首先输出成员m_strName的值,然后输出“, age = ”,接着输出基类的数据成员m_nAgeBase的值。具体输出格式参见main函数和样例输出。
类和函数接口定义:
参见题目描述。
裁判测试程序样例:
#include
#include
using namespace std;
/* 请在这里填写答案 */
int main()
{
Cat cat("Persian"); //定义派生类对象cat
cat.set_age(5); //派生类对象调用从基类继承的公有成员函数
cat.set_weight(6); //派生类对象调用从基类继承的公有成员函数
cat.print_age(); //派生类对象调用自己的公有函数
cout << "cat weight = " << cat.get_weight() << endl;
return 0;
}
输入样例:
本题无输入。
输出样例:
Persian, age = 5
cat weight = 6
class Animal
{
private:
int m_nWeightBase;
protected:
int m_nAgeBase;
public:
void set_weight(int a){
this->m_nWeightBase=a;
}
int get_weight()
{
return m_nWeightBase;
}
void set_age(int a)
{
this->m_nAgeBase=a;
}
};
class Cat:public Animal{
private:
string m_strName;
public:
Cat(string a)
{
this->m_strName=a;
}
void print_age()
{
cout<<m_strName<<", age = "<<this->m_nAgeBase<<endl;
}
};
-4 派生类的定义和使用 (10分)
按要求完成下面的程序:
1、定义一个Animal类,包含一个void类型的无参的speak方法,输出“animal language!”。
2、定义一个Cat类,公有继承自Animal类,其成员包括:
(1)私有string类型的成员m_strName;
(2)带参数的构造函数,用指定形参对私有数据成员进行初始化;
(3)公有的成员函数print_name,无形参,void类型,功能是输出成员m_strName的值,具体输出格式参见main函数和样例输出。
类和函数接口定义:
参见题目描述。
裁判测试程序样例:
#include
#include
using namespace std;
/* 请在这里填写答案 */
int main()
{
Cat cat("Persian"); //定义派生类对象
cat.print_name(); //派生类对象使用本类成员函数
cat.speak(); //派生类对象使用基类成员函数
return 0;
}
输入样例:
本题无输入。
输出样例:
cat name: Persian
animal language!
class Animal
{
public:
void speak()
{
cout<<"animal language!"<<endl;
}
};
class Cat:public Animal{
private:
string m_strName;
public:
Cat(string a)
{
this->m_strName=a;
}
void print_name()
{
cout<<"cat name: "<<this->m_strName<<endl;
}
};
6-5 学生派生类 (10分)
根据所给的类Student定义其派生类,并利用构造函数进行数据初始化,使程序能按照"样例"的格式进行输出
类定义:
#include
#include
using namespace std;
class Student
{
public:
Student(int n,string nam,char s )
{
num=n;
name=nam;
sex=s; }
~Student( ) {
}
protected:
int num;
string name;
char sex ;
};
/* 请在这里添加派生类定义 */
裁判测试程序样例:
int main( )
{
Student1 stud1(10010,"Wang-li",'f',19,"115 Beijing Road,Shanghai");
Student1 stud2(10011,"Zhang-fun",'m',21,"213 Shanghai Road,Beijing");
stud1.show( );
stud2.show( );
return 0;
}
输出样例:
num: 10010
name: Wang-li
sex: f
age: 19
address: 115 Beijing Road,Shanghai
num: 10011
name: Zhang-fun
sex: m
age: 21
address: 213 Shanghai Road,Beijing
class Student1:public Student{
private:
int a;
string b;
public:
Student1(int c,string d,char e,int a,string b):Student(c,d,e)
{
this->a=a;
this->b=b;
}
void show( )
{
static int x=0;
cout<<"num: "<<this->num<<endl<<"name: "<<this->name<<endl<<"sex: "<<this->sex<<endl<<"age: "<<this->a<<endl<<"address: "<<this->b<<endl<<endl;
}
};
-1 使用成员函数重载复数类的运算符+ (10分)
类Complex声明了一个复数类,有两个数据成员realPart(代表复数的实部)和imgPart(代表复数的虚部),并定义了成员函数实现了重载运算符“+”以实现两个复数对象的相加操作。成员函数Show用来输出复数的实部和虚部。请完成对运算符“+”的重载操作。
函数接口定义:
Complex& Complex::operator+(Complex& com);
参数com为复数类Complex的对象的引用,函数的返回值为当前对象与com对象相加后的值。
裁判测试程序样例:
#include
using namespace std;
class Complex {
public:
Complex(double realPart = 0, double imgPart = 0) {
this->realPart = realPart;
this->imgPart = imgPart;
}
Complex& operator+(Complex& com);
void Show() {
cout << realPart << " " << imgPart << endl;
}
private:
double realPart, imgPart;
};
int main() {
int r1, i1; //第1个复数对象的实部和虚部
int r2, i2; //第1个复数对象的实部和虚部
cin >> r1 >> i1;
cin >> r2 >> i2;
Complex c1(r1, i1); //构造第1个复数对象c1
Complex c2(r2, i2); //构造第2个复数对象c2
c1 = c1 + c2;
c1.Show();
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3 4
10 20
输出样例:
13 24
Complex &Complex::operator+(Complex& com){
Complex *t=new Complex;
t->imgPart=imgPart+com.imgPart;
t->realPart=realPart+com.realPart;
return *t;
}
6-2 重载±运算符 (10分)
请根据程序的输出结果,重载类A的+和-运算符。
类和函数接口定义:
class A {
public:
A(int x = 0, int y = 0) : x(x), y(y) {
}
void show() const;
A operator+(A& a); //重载+运算符
A operator-(A& a); //重载-运算符
private:
int x, y;
};
裁判测试程序样例:
#include
using namespace std;
class A {
public:
A(int x = 0, int y = 0) : x(x), y(y) {
}
void show() const;
A operator+(A& a);
A operator-(A& a);
private:
int x, y;
};
void A::show() const {
cout << "(x,y) = " << "(" << x << "," << y << ")" << endl;
}
/* 请在这里填写答案 */
int main() {
A a1(1, 2);
A a2(4, 5);
A a;
cout << "a1:"; a1.show();
cout << "a2:"; a2.show();
a = a1 + a2;
cout << "a:"; a.show();
a = a1 - a2;
cout << "a:"; a.show();
return 0;
}
输入样例:
本题无输入。
输出样例:
a1:(x,y) = (1,2)
a2:(x,y) = (4,5)
a:(x,y) = (5,7)
a:(x,y) = (-3,-3)
A A::operator+(A& a){
A b;
b.x=x+a.x;
b.y=y+a.y;
return b;
}
A A::operator-(A& a){
A b;
b.x=x-a.x;
b.y=y-a.y;
return b;
}
6-5 时间相加 (10分)
设计一个时间类,用来保存时、分、秒等私有数据成员,通过重载操作符“+”实现2个时间的相加。要求: (1)小时的时间范围限制在大于等于0;(2)分的时间范围为059分;(3)秒的时间范围为059秒。
#include
using namespace std;
class Time {
private:
int hours,minutes, seconds;
public:
Time(int h=0, int m=0, int s=0);
Time operator + (Time &);
void DispTime();
};
/* 请在这里填写答案 */
int main() {
Time tm1(8,75,50),tm2(0,6,16), tm3;
tm3=tm1+tm2;
tm3.DispTime();
return 0;
}
输出:
在这里给出相应的输出。例如:
9h:22m:6s
Time::Time(int h, int m, int s){
this->hours=h;
this->minutes=m;
this->seconds=s;
}
void Time::DispTime(){
cout<<this->hours<<"h:"<<this->minutes<<"m:"<<this->seconds<<"s"<<endl;
}
Time Time::operator + (Time &a){
Time c;
c.seconds=seconds+a.seconds;
c.minutes=minutes+a.minutes;
c.hours=hours+a.hours;
if(c.seconds>=60){
c.minutes++;
c.seconds-=60;
}
if(c.minutes>=60){
c.hours++;
c.minutes-=60;
}
return c;
}
6-2 抽象类Shape (10分)
请编写一个抽象类Shape,包括两个纯虚函数,分别为计算面积getArea()和计算周长getPerim()。通过Shape类派生出矩形类Rectangle和圆类Circle,并计算各自的面积和周长。
测试用例具体要求:输入1表示测试矩形类,之后输入矩形长和宽。输入2表示测试圆类,之后输入圆半径。
Shape类定义如下:
class Shape {
public:
virtual double getArea()=0;
virtual double getPerim()=0;
};
裁判测试程序样例:
#include
using namespace std;
const double PI=3.14;
class Shape {
public:
virtual double getArea()=0;
virtual double getPerim()=0;
};
/* ------请在这里填写答案 ------*/
int main() {
Shape *p;
int n;
double w,h,r;
scanf("%d",&n);
switch(n) {
case 1: {
cin>>w>>h;
Rectangle rect(w,h);
cout<<"area="<<rect.getArea()<<endl;
cout<<"perim="<<rect.getPerim()<<endl;
break;
}
case 2: {
cin>>r;
Circle c(r);
cout<<"area="<<c.getArea()<<endl;
cout<<"perim="<<c.getPerim()<<endl;
break;
}
}
return 0;
}
输入样例1:
在这里给出一组输入。例如:
1
4 5
输出样例1:
在这里给出相应的输出。例如:
area=20
perim=18
输入样例2:
在这里给出一组输入。例如:
2
5
输出样例2:
在这里给出相应的输出。例如:
area=78.5
perim=31.4
class Rectangle:public Shape{
private:
double a,b;
public:
Rectangle(double a,double b){
this->a=a;
this->b=b;
}
double getArea(){
return this->a*this->b;
}
double getPerim(){
return this->a*2+this->b*2;
}
};
class Circle:public Shape{
private:
double a;
public:
Circle(double a){
this->a=a;
}
double getArea(){
return this->a*this->a*3.14;
}
double getPerim(){
return this->a*2*3.14;
}
};
6-3 虚函数的应用 (10分)
补充下列代码,使得程序的输出为:
A:3
A:15
B:5
3
15
5
类和函数接口定义:
参见裁判测试程序样例中的类和函数接口。
裁判测试程序样例:
#include
using namespace std;
class CMyClassA {
int val;
public:
CMyClassA(int);
void virtual print();
};
CMyClassA::CMyClassA(int arg) {
val = arg;
printf("A:%d\n", val);
}
void CMyClassA::print() {
printf("%d\n", val);
return;
}
/* 在这里填写代码 */
int main(int argc, char** argv) {
CMyClassA a(3), *ptr;
CMyClassB b(5);
ptr = &a;
ptr->print();
a = b;
a.print();
ptr = &b;
ptr->print();
return 0;
}
输入样例:
None
输出样例:
A:3
A:15
B:5
3
15
5
来源:
openjudge.cn
class CMyClassB:public CMyClassA{
int val2;
public:
CMyClassB(int a):CMyClassA(a*3){
this->val2=a;
cout<<"B:"<<a<<endl;
}
void print(){
cout<<val2<<endl;
}
};