沈阳师范大学大一下册C++语言PTA题目集以及答案(编程题篇)

沈阳师范大学大一下册C++语言PTA题目集以及答案

(编程题篇)

7-1 测试c++ (20分)
倒序输出从控制台输入的n个整数

输入格式:
第一行输入一个数n,代表行数
依次输入n个整数

输出格式:
将n个整数倒序输出

输入样例:
3
1 2 3
输出样例:
321

#include
int main()
{
     
    int n,i;
    std::cin>>i;
    int a[i];
    for(n=0;n<i;n++)
        std::cin>>a[n];
    for(i--;i>=0;i--)
        std::cout<<a[i];
}

7-2 计算圆的面积 (20分)
从键盘输入圆的半径,计算圆的面积并输出。圆周率PI=3.1415926。

输入格式:
在这里写输入圆的半径,例如: 3.6

输出格式:
在这里输出圆的面积,例如: 40.715

输入样例:
1.5

输出样例:
7.06858

#include
int main()
{
     
   double PI=3.1415926,r,sum;
   std::cin>>r;
   sum=PI*r*r;
   std::cout<<sum<<std::endl;
}

7-3 计算三角形面积 (20分)
从键盘输入三个数,用来表示三角形的三条边长。如果能构成三角形就输出三角形的面积,否则就输出No。

输入格式:
请在这里写输入三角形的三条边长,例如: 3.1 4.2 5.3

输出格式:
请在这里输出三角形的面积,例如:

6.50661

输入样例:
3.0 4.0 5.0
输出样例:
6

#include
#include
bool panduan(double a,double b,double c)
{
     
    bool d;
    if(a >0 || b >0 || c>0)
    if((a+b)>c&&(a+c>b)&&(b+c)>a)
    {
     
        d=true;
        return d;
    }
    d=false;
    return d;

}
int main()
{
     
   double a,b,c;
   std::cin>>a>>b>>c;
   if(panduan(a,b,c))
   {
     
       double d,e,f;
       d=(a+b+c)/2.0;
       f=d*(d-a)*(d-b)*(d-c);
       e=sqrt(f);
       std::cout<<e<<std::endl;
   } else
   {
     
       std::cout<<"No"<<std::endl;
   }
}

7-4 问候 (20分)
输出问候:Hello!What’s your name? 从键盘输入名字,然后输出欢迎信息。

输入格式:
请在这里写输入姓名。例如: GaiFuShuai

输出格式:
请在这里描述输出,例如:

Hello!What’s your name?

GaiFuShuai,Welcome to learn OOP using C++!

输入样例:
BaiFuMei
输出样例:
Hello!What’s your name?
BaiFuMei,Welcome to learn OOP using C++!

#include
#include
int main()
{
     
   std::cout<<"Hello!What's your name?"<<std::endl;
   std::string a;
   std::cin>>a;
   std::cout<<a<<",Welcome to learn OOP using C++!"<<std::endl;
}

7-1 删除字符串中指定字母 (20分)
请使用指针的方法编写程序,程序的功能是从键盘输入一个字符串(字符串长度小于100),删除其中的字母a后输出。例如,输入字符串abcaca,输出bcc。

输入样例:
abcaca
输出样例:
bcc

#include 
#include 
using namespace std;
void put(string &a)
{
     
    char *b=&a[0];
    int i;
    for(i=0;*(b+i);i++)
    {
     
        if(*(b+i)!='a')
            cout<<*(b+i);
    }
}


int main(int argc, char const *argv[])
{
     
  string a;
  cin>>a;
  put(a);
}

7-2 用指针方法求10个数最大和最小值之差 (20分)
请使用指针的方法编写程序,程序的功能是从键盘输入10个数,求其最大值和最小值的差。

输入格式:
输入10个整数,每个整数之间用空格分隔。

输出格式:
同样例。

输入样例:
1 2 3 4 5 6 7 8 9 10
输出样例:
difference value = 9

#include 
#include 
using namespace std;
void put(int *b)
{
     
    int i,j,k;
    for(i=0,j=*(b+1),k=*(b+1);i<10;i++)
    {
     
       if(j>*(b+i))
           j=*(b+i);
       if(k<*(b+i))
           k=*(b+i);
    }
    cout<<"difference value = "<<k-j;
}


int main(int argc, char const *argv[])
{
     
  int a[10],i;
  for(i=0;i<10;i++)
  cin>>a[i];
  put(a);
}

7-3 鸿鸿哥分钱 (20分)
鸿鸿哥最近和一个小伙伴做了个小项目,赚了一个亿,两人一起高高兴兴开了庆功宴之后,鸿鸿哥就准备分一下钱了。鸿鸿哥想了想,生意不是做一天的,所以一个亿之中的大部分资金还是要继续投资,不能只是做一发就走,这个想法也得到了小伙伴的认可。而余下来的钱不知道具体数值,只知道是x万~y万之间(因为某种神秘力量余下的钱一定是偶数万)。而鸿鸿哥原本也是土豪,这点小钱也看不上眼,于是他想分多一点给小伙伴,他决定把钱分成两个素数(程序员喜欢各种特别的数字),自己拿小的那份。那么问题来了,鸿鸿哥和小伙伴个各拿多少万呢?鸿鸿哥想知道所有可能的分法。

输入格式:
输入两个整数x,y(6<=x,x<=y,n<=100),一组输入。

输出格式:
输出x和y之间所有偶数表示成的两个素数之和。

输入样例:
在这里给出一组输入。例如:

8 10
输出样例:
在这里给出相应的输出。例如:

8=3+5
10=3+7

#include 
#include 
#include 
using namespace std;
void out(int a)
{
     
    int b,c,d;
    for(b=3;b<=a/2;b+=2)
    {
     
        for(c=2;c<=sqrtl(b);c++)
            if(b%c==0)
                break;
            if(c>sqrtl(b))
                d=a-b;
            else
                break;
            for(c=2;c<=sqrtl(d);c++)
                if(d%c==0)
                    break;
                if(c>sqrtl(d))
                {
     cout<<b<<"+"<<d<<endl;
                break;}
    }

}
void put(int x,int y)
{
     
    for(;x<=y;x++)
    {
     
        if(x%2==0)
        {
     
            cout<<x<<'=';
            out(x);
        }
    }
}


int main(int argc, char const *argv[])
{
     
  int x,y;
  cin>>x>>y;
  put(x,y);
}

7-4 实数排序 (20分)
本题要求编写程序,输入n个实数,使用指针引用的方式将它们按从大到小的顺序排列。

输入格式:
输入第一行给出一个正整数n(2≤n≤10),输入第二行给出n个实数,其间以空格分隔。

输出格式:
输出从大到小排好序的n个数(保留2位小数),每个数之间空一格,行末没有空格。

输入样例:
在这里给出一组输入。例如:

5
3.2 5.4 6.12 2.51 4.23
输出样例:
在这里给出相应的输出。例如:

6.12 5.40 4.23 3.20 2.51

#include 
#include 
#include 
using namespace std;
void put(float *a,int n)
{
     
    int i,j;
    float t;
    for(i=0;i<n;i++)
    {
     
        for(j=0;j<n;j++)
        {
     
            if(*(a+i)>*(a+j))
            {
     
               t=*(a+i);
               *(a+i)=*(a+j);
               *(a+j)=t;
            }
        }
    }
}
void out(float *a,int n)
{
     
    int i=1;
    printf("%.2f",*(a+i-1));
    for(;i<n;i++)
    {
     
        printf(" %.2f",*(a+i));
    }
}

int main(int argc, char const *argv[])
{
     
  int n,i;
  cin>>n;
  float a[n];
  for(i=0;i<n;i++)
      cin>>a[i];
  put(a,n);
  out(a,n);
}

7-1 设计一个矩形类Rectangle并创建测试程序(C++) (20分)
设计一个名为Rectangle的矩形类,这个类包括:两个名为width和height的double数据域,它们分别表示矩形的宽和高。width和height的默认值都为1.该类包括矩形类的无参构造函数(默认构造函数);一个width和height为指定值的矩形构造函数;一个名为getArea( )的函数返回矩形的面积;一个名为getPerimeter( )的函数返回矩形的周长。请实现这个类。编写一个测试程序,创建一个Rectangle对象,从键盘输入矩形的宽和高,然后输出矩形的面积和周长。

输入格式:
3.5 35.9(第一个数表示矩形的宽,第二个数表示矩形的高,中间是空间分隔。)

输出格式:
125.65 (第一行输出矩形的面积) 78.8 (第二行输出矩形的周长)

输入样例:
3.5 35.9
输出样例:
125.65
78.8

#include 
using namespace std;
class Rectangle
{
     
    private:
    double width=1;
    double height=1;
    public:
    Rectangle();
    Rectangle(double a,double b)
    {
     
        width=a;
        height=b;
    }
    double getArea()
    {
     
        return width*height;
    }
    double getPerimeter()
    {
     
        return 2*width+2*height;
    }

}  ;
int main(int argc, char *argv[])
{
     
 double c,d;
 cin>>c>>d;
 Rectangle a(c,d);
 cout<<a.getArea()<<endl;
 cout<<a.getPerimeter()<<endl;
}

7-3 例4-3游泳池改造预算 (20分)
例4-3一圆形游泳池如图所示,现在需在其周围建一圆形过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。

沈阳师范大学大一下册C++语言PTA题目集以及答案(编程题篇)_第1张图片

输入格式:
输入一个整数或小数。

输出格式:
分两行输出:在第一行中输出栅栏的造价。在第二行输出过道的造价。

输入样例:
10
输出样例:
Fencing Cost is $2858.85
Concrete Cost is $4335.4

#include 
using namespace std;
class pool
{
     
    private:
    double r;
    double pi=3.1415926;
    public:
    pool(double a)
    {
     
        r=a;
    }
    double zhalan()
    {
     
        return pi*2*(r+3)*35;
    }
    double guodao()
    {
     
        return (pi*(r+3)*(r+3)-pi*r*r)*20;
    }
}  ;
int main(int argc, char *argv[])
{
     
    double b;
    cin>>b;
  pool a(b);
  cout<<"Fencing Cost is $"<<a.zhalan()<<endl;
  cout<<"Concrete Cost is $"<<a.guodao()<<endl;
}

7-4 立方体类 (20分)
定义立方体类Box,数据成员有长宽高且都是整数,构造函数初始化数据成员,成员函数计算体积,主函数中输入长宽高,输出立方体体积。

输入格式:
输入立方体的长宽高,中间用空格分隔。

输出格式:
输出体积并换行。

输入样例:
在这里给出一组输入。例如:

1 2 3
输出样例:
在这里给出相应的输出。例如:

6

#include 
using namespace std;
class Box
{
     
    private:
    int a,b,c;
    public:
    Box(int d,int e,int f)
    {
     
        a=d;
        b=e;
        c=f;
    }
    int tiji()
    {
     
        return a*b*c;
    }


}  ;
int main(int argc, char *argv[])
{
     
    int a,b,c;
    cin>>a>>b>>c;
 Box d(a,b,c);
 cout<<d.tiji()<<endl;
}

7-2 队列操作 (30分)
请实现一个MyQueue类,实现出队,入队,求队列长度.

实现入队函数 void push(int x); 实现出队函数 int pop(); 实现求队列长度函数 int size();

输入格式:
每个输入包含1个测试用例。每个测试用例第一行给出一个正整数 n (n <= 10^6) ,接下去n行每行一个数字,表示一种操作: 1 x : 表示从队尾插入x,0<=x<=2^31-1。 2 : 表示队首元素出队。 3 : 表示求队列长度。

输出格式:
对于操作2,若队列为空,则输出 “Invalid”,否则请输出队首元素。 对于操作3,请输出队列长度。 每个输出项最后换行。

输入样例:
5
3
2
1 100
3
2
输出样例:
0
Invalid
1
100

#include
using namespace std;
vector<int> obj;
int duilie=0,ren=0;
class MyQueue
{
     
    private:
    public:
    void push(int x)
    {
     
        obj.push_back(x);
        duilie++;
    }
    int pop(){
     
        if(duilie==0)
            cout<<"Invalid"<<endl;
        if(duilie!=0)
        {
     
        cout<<obj[0]<<endl;
        vector<int>::iterator s = obj.begin();
        obj.erase(s);
        duilie--;}
    }
    int size()
    {
     
        int i;
        for(i=0;i<obj.size();i++)
        {
     
            ;
        }
        cout<<i<<endl;
    }

};

int main(int argc, char *argv[])
{
     
    unsigned long long int i,j,k;
    cin>>i;
    MyQueue a;

    for(j=0;j<i;j++)
    {
     
        cin>>k;
        switch(k)
        {
     
            case 1:
                int x;
                cin>>x;
                a.push(x);
                break;
            case 2:
                a.pop();
                break;
            case 3:
                a.size();
        }

    }
}

7-2 计算全班学生C++课程的总成绩和平均成绩 (20分)
定义一个类Student,记录学生C++课程的成绩。要求使用静态数据成员或静态成员函数计算全班学生C++课程的总成绩和平均成绩。

输入格式:
输入5个不超过100的正整数,作为C++成绩。

输出格式:
在第一行中输出成绩的和,第二行输出平均成绩。

输入样例:
90 80 70 60 50
输出样例:
350
70


#include
using namespace std;
class Student
{
     
private:
    static double num;
    static double sum;
public:
    void add1(double a)
    {
     
        sum+=a;
        num++;
    }
    double fan1()
    {
     
        return sum;
    }
    double fan2()
    {
     
        return sum/(num*1.0);
    }

}  ;
double Student::num=0;
double Student::sum=0;
int main(int argc, char *argv[])
{
     
    Student a;
    for(int i=0;i<5;i++)
    {
     
        double j;
        cin>>j;
        while(j<0)
        {
     
cin>>j;
        }
        a.add1(j);
        
    }
    int b,c;
    cout<<"The total score is "<<a.fan1()<<endl;
    cout<<"The average score is "<<a.fan2()<<endl;

}

7-4 立方体类的实现 (20分)
立方体类Box的实现,完成计算体积、计算表面积、输出结果等功能。其中给定的主函数为:

int main( ){
float ab;
cin>>ab;
Box obj;
obj.seta( ab );
obj.getvolume( );
obj.getarea( );
obj.disp( );
return 0;
}
输入格式:
立方体的边长,可以是float类型的数据。

输出格式:
立方体的体积和表面积,中间用一个空格隔开,末尾换行。

输入样例:
3
输出样例:
27 54

#include
using namespace std;
class Box
{
     
    private:
    int a,b,c;
    public:
    void seta(int c)
    {
     
        Box::a=c;
    }
    void getvolume()
    {
     
        Box::b=Box::a*Box::a*Box::a;
    }
    void getarea()
    {
     
        Box::c=Box::a*Box::a*6;
    }
    void disp()
    {
     
        cout<<b<<" "<<c<<endl;
    }

}  ;
int  main( ){
     
    float ab;
    cin>>ab;
    Box  obj;
    obj.seta( ab );
    obj.getvolume( );
    obj.getarea( );
    obj.disp( );
    return 0;
}

7-6 (组合类)一定平面二维点类Point,线段类Line是由两个Point点组成的组合类 (30分)
定义平面二维点类Point,(有x,y坐标,构造函数、复制构造函数,输出函数)。线段类Line是由两个Point点组成的组合类(数据成员: 两个端点,线段长度; 函数成员:构造函数、复制构造函数、计算线段长度函数) //主函数 int main() {
int x1,y1,x2,y2; cin>>x1>>y1;
cin>>x2>>y2; Point myp1(x1,y1),myp2(x2,y2); //建立Point类的对象 Line L1(myp1,myp2); //建立Line类的对象 cout<<“Line start Point is:”; L1.GetPstart().print(); cout<

}

输入格式:
输入两行,第一行为线段的起点坐标(中间已空格隔开),第二行为线段的终点坐标 (中间已空格隔开)

输出格式:
输入各个函数被调用过程主程序,需要填写。

输入样例:
在这里给出一组输入。例如:

0 0
3 4
输出样例:
在这里给出相应的输出。例如:

create Point:P(0,0)
create Point:P(3,4)
Create a new Line:
Line start Point is:P(0,0)
Line end Point is:P(3,4)
Length of Line is:5

#include
#include
using namespace std;



class Point
{
     
private:
    int x,y;
public:
    int getx()
    {
     
        return x;
    }
    int gety()
    {
     
        return y;
    }
    void print()
    {
     
        cout<<"P("<<Point::x<<","<<Point::y<<")"<<endl;
    }
    Point(int a,int b)
    {
     
        Point::x=a;
        Point::y=b;
        cout<<"create Point:";
        Point::print();
    }
    Point(const Point& a)
    {
     
        x=a.x;
        y=a.y;
    }

};
class Line {
     
private:
    Point a,b;
    double c;
public:
    Line(Point c,Point d):a(c),b(d)
    {
     
        cout<<"Create a new Line:"<<endl;
    }
    void GetPstart()
    {
     
        a.print();
    }

    void GetPend() {
     
        b.print();

    }
    int GetLen()
    {
     
        auto x=static_cast<double>(a.getx()-b.getx());
        auto y=static_cast<double>(a.gety()-b.gety());
        c=sqrt(x*x+y*y);
        return c;
    }
};

int main() {
     
    int x1,y1,x2,y2;
    cin>>x1>>y1;
    cin>>x2>>y2;
    Point myp1(x1,y1),myp2(x2,y2); //建立Point类的对象
    Line L1(myp1,myp2); //建立Line类的对象
    cout<<"Line start Point is:";
    L1.GetPstart();
    cout<<"Line end Point is:";
    L1.GetPend();
    cout<<"Length of Line is:"<<L1.GetLen()<<endl;

}

7-1 求两点之间距离 (20分)
定义一个Point类,有两个数据成员:x和y, 分别代表x坐标和y坐标,并有若干成员函数。 定义一个函数Distance(), 用于求两点之间的距离。

输入格式:
输入有两行: 第一行是第一个点的x坐标和y坐标; 第二行是第二个点的x坐标和y坐标。

输出格式:
输出两个点之间的距离,保留两位小数。

输入样例:
0 9 3 -4

输出样例:
13.34


#include 
#include 
using namespace std;
class Point
{
     
private:
    double x,y;
public:
    Point(double a,double b)
    {
     
        x=a;
        y=b;
    }
    friend auto Distance(Point &a,Point &b);
};


auto Distance(Point &a,Point &b)
{
     
    return fabs(sqrt(((a.x)-(b.x))*((a.x)-(b.x))+((a.y)-(b.y))*((a.y)-(b.y))));
}
int main()
{
     
    double x1,y1,x2,y2;
    cin>>x1>>y1;
    cin>>x2>>y2;
    Point a(x1,y1),b(x2,y2);
    printf("%.2f",Distance(a,b));

}

7-2 友元函数的练习 (20分)
定义Boat与Car两个类,两者都有私有的整型weight属性,定义两者的一个友元函数getTotalWeight(),计算二者的重量和。

参考主函数: int main() { int n,m; cin>>n>>m; Boat boat(n); Car car(m); cout<<“船和汽车共重”<

输入格式:
请在这里写输入格式。例如:输入在一行中给出2个整数m和n。

输出格式:
请在这里描述输出格式。例如:对每一组输入,在一行中输出:船和汽车共重M+n吨值。

输入样例:
在这里给出一组输入。例如:

40 30
输出样例:
在这里给出相应的输出。例如:

船和汽车共重70吨


#include 
using namespace std;

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

int main()
{
     
    int c,b;
    cin>>c>>b;
    car c1(c);
    boat b1(b);
    cout<<"船和汽车共重"<<totalweight(b1,c1)<<"吨"<<endl;
}

7-3 复数类的操作 (20分)
1、声明一个复数类Complex(类私有数据成员为double型的real和image)

2、定义构造函数,用于指定复数的实部与虚部。

3、定义取反成员函数,调用时能返回该复数的相反数(实部、虚部分别是原数的相反数)。

4、定义成员函数Print(),调用该函数时,以格式(real, image)输出当前对象。

5、编写加法友元函数,以复数对象c1,c2为参数,求两个复数对象相加之和。

6、主程序实现:

(1)读入两个实数,用于初始化对象c1。

(2)读入两个实数,用于初始化对象c2。

(3)计算c1与c2相加结果,并输出。

(4)计算c2的相反数与c1相加结果,并输出。

输入格式:
输入有两行:

第一行是复数c1的实部与虚部,以空格分隔;

第二行是复数c2的实部与虚部,以空格分隔。

输出格式:
输出共三行:

第一行是c1与c2之和;

第二行是c2的相反数与c1之和;

第三行是c2 。

输入样例:
在这里给出一组输入。例如:

2.5 3.7
4.2 6.5
输出样例:
在这里给出相应的输出。例如:

(6.7, 10.2)
(-1.7, -2.8)
(4.2, 6.5)

#include
using namespace std;  
class Complex
{
     
private:
double real,image;
public:
Complex(double a,double b)
{
     
    real=a;
    image=b;
}
void fan1()
{
     
    real=-real;
    image=-image;
}
double fan2()
{
     
    return -image;
}
void print()
{
     
    cout<<"("<<real<<", "<<image<<")"<<endl;
}
friend void add(const Complex &a,const Complex &b);
};
void add(const Complex &a,const Complex &b)
{
     
cout<<"("<<a.real+b.real<<", "<<a.image+b.image<<")"<<endl;
}
int main(int argc, char *argv[])
{
     
  double a,b,c,d;
  cin>>a>>b>>c>>d;
  Complex e(a,b),f(c,d);
  add(e,f);
  f.fan1();
  add(e,f);
  f.fan1();
  f.print();
}

1 两点间距离计算 (20分)
给出下面的一个基类框架:

class Point_1D

{ protected:

float x;//1D 点的x坐标

public:

Point_1D(float p = 0.0);

float distance(const Point_1D & p2);

}

以Point_1D为基类建立一个派生类Point_2D,增加一个保护数据成员:

float y;//2D平面上点的y坐标

以Point_2D为直接基类再建立一个派生类Point_3D,增加一个保护数据成员:

float z;//3D立体空间中点的z坐标

生成上述类并编写主函数,根据输入的点的基本信息,建立点对象,并能计算该点到原点的距离。

输入格式: 测试输入包含若干测试用例,每个测试用例占一行(点的类型(1表示1D点,2表示2D点,3表示3D点) 第一个点坐标信息(与点的类型相关) 第二个点坐标信息(与点的类型相关))。当读入0时输入结束,相应的结果不要输出。

输入样例:

1 -1 0

2 3 4 0 0

3 1 2 2 0 0 0

0

输出样例:

Distance from Point -1 to Point 0 is 1

Distance from Point(3,4) to Point(0,0) is 5

Distance from Point(3,3,3) to Point(0,0,0) is 3

作者
余春艳
单位
浙江大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

#include
#include
using namespace std;  
class Point_1D
{
      protected:
float x;//1D 点的x坐标
public:
Point_1D(float p )
{
     
    this->x=p;
}
float distance(const Point_1D & p2)
{
     
    return fabs(this->x-p2.x);
}
void c()
{
     
    cout<<x;
}
};
class Point_2D:public Point_1D
{
     
protected:
float y;
public:
Point_2D(float a,float b):Point_1D(a)
{
     
    this->y=b;
}
float distance(const Point_2D & p2)
{
     
    return fabs(sqrt(fabs((this->y-p2.y)*(this->y-p2.y))+fabs((this->x-p2.x)*(this->x-p2.x))));
}
void c()
{
     
    cout<<"("<<x<<","<<y<<")";
}
};
class Point_3D:public Point_2D
{
     

protected:
float z;
public:
Point_3D(float a,float b,float c):Point_2D(a,b)
{
     
    this->z=c;
}
float distance(const Point_3D & p2)
{
     
    return fabs(sqrt((this->y-p2.y)*(this->y-p2.y)+(this->x-p2.x)*(this->x-p2.x)+(this->z-p2.z)*(this->z-p2.z)));
}
void c()
{
     
    cout<<"("<<x<<","<<y<<","<<z<<")";
}
};
void point1()
{
     
    float a,b;
    cin>>a>>b;
    Point_1D c(a),d(b);
    cout<<"Distance from Point ";
    c.c();
    cout<<" to Point ";
    d.c();
    cout<<" is "<<c.distance(d)<<endl;
}
void point2()
{
     
float a,b,c,d;
cin>>a>>b>>c>>d;
Point_2D e(a,b),f(c,d);
    cout<<"Distance from Point";
    e.c();
    cout<<" to Point";
    f.c();
    cout<<" is "<<e.distance(f)<<endl;
}
void point3()
{
     
    float a1,a2,a3,a4,a5,a6;
    cin>>a1>>a2>>a3>>a4>>a5>>a6;
    Point_3D b(a1,a2,a3),c(a4,a5,a6);
    cout<<"Distance from Point";
    b.c();
    cout<<" to Point";
    c.c();
    cout<<" is "<<b.distance(c)<<endl;
}
int main(int argc, char *argv[])
{
     
 int a=1;
 for(;a!=0;)
 {
     cin>>a;
 switch(a)
 {
     
     case 1:
     point1();
     break;
     case 2:
     point2();
     break;
     case 3:
     point3();
     break;
 } 
 }
}

7-2 多边形周长计算(继承) (20分)
给出下面的多边形基类框架:

class polygon

{ protected:

int number;//边数,最多不超过100条边
private:

int side_length[100];//边长数组
public:

polygon();//构造函数根据需要重载
int perimeter();//计算多边形边长
void display();//输出多边形边数和周长
}

建立一个派生类rectangle(矩形),增加以下数据成员:

int height;
int width;
增加以下成员函数:

rectangle类的无参和参数化构造函数
int perimeter();//计算矩形边长
void display();//输出多边形边数和周长
建立一个派生类equal_polygon(等边多边形),增加以下数据成员:

int side_len;
增加以下成员函数:

equal_polygon类的无参和参数化构造函数
int perimeter();//计算等边多边形边长
void display();//输出多边形边数和周长
生成上述类并编写主函数,根据输入的多边形信息,相应建立一个多边形类对象或矩形类对象或等边多边形类对象,计算每一个多边形的周长并且输出其边数和周长。

输入格式: 测试输入包含一个测试用例,该测试用例的第一行输入多边形的个数n,接下来n行每一行给出一个多边形的基本信息,每行的第一个数字为当前多边形的类型,0为一般多边形,后面跟随m个数字为m条边的边长,-1为一般多边形边长输入结束标志,1为矩形,后面跟随两个数字,分别为height和width,2为等边多边形,后面跟随两个数字为等边多边形的边数和边长。

输入样例:

3

0 32 54 76 88 24 -1

1 32 54

2 3 32

输出样例:

5 274

4 172

3 96

#include
using namespace std;  
class polygon
{
     
protected:
int number;
private:
long long int side_length[1000];
public:
polygon();
polygon(int a)
{
     
    if(a==1)
    {
     
        this->number=4;
    }
}
polygon(long long int *a,int d)
{
     
    int i=0;
    this->number=d;
    for(;i<d;i++)
    {
     
        *(this->side_length+i)=*(a+i);
    }
    *(this->side_length+i+1)=*(a+i+1);
}
long long int perimeter()
{
     
    long long int a=0;
    for(long long int i=0;i<this->number;i++)
    {
     
a+=*(this->side_length+i);
    } 
    return a;
}
void display(){
     
    cout<<this->number<<" "<<this->perimeter()<<endl;
}
};
class rectangle:public polygon{
     
private:
int height;
int width;
public:
rectangle(){
     }
rectangle(int a,int b):polygon(1)
{
     
    this->height=a;
    this->width=b;
}
void daisplay()
{
     
    cout<<"4"<<" "<<this->height*2+this->width*2<<endl;
}
};
class equal_polygon:public polygon{
     
    private:
    int side_les;
    public:
    equal_polygon(){
     }
    equal_polygon(int a,int b):polygon(a)
    {
     
        this->number=a;
        this->side_les=b;
    }
    void dasplay2()
    {
     
        cout<<this->number<<" "<<this->side_les*this->number<<endl;
    }
};
void c()
{
     
    long long int a[1000];
    int b,d=0;
    cin>>b;
    for(int i=0;b!=-1;i++)
    {
     
*(a+i)=b;
d++;
cin>>b;
    }
    polygon c(a,d);
 //   cout<<"d:"<
    c.display();
}
void d()
{
     
    int a,b;
    cin>>a>>b;
    rectangle c(a,b);
    c.daisplay();
}
void e()
{
     
    int a,b;
    cin>>a>>b;
    equal_polygon c(a,b);
    c.dasplay2();
}
int main(int argc, char *argv[])
{
     
  int a;
  cin>>a;
  for(int i=0;i<a;i++)
  {
     
      int b;
      cin>>b;
      switch(b){
     
case 0:
c();
break;
case 1:
d();
break;
case 2:
e();
break;
      }
  }
}

7-1 图书音像出租管理 (10分)
一个图书音像店出租图书和磁带。
给出下面一个基类的框架:
class Publication
{
protected:
string title;//名称
float price;//原价
int day;//租期
public:
virtual void display()=0;//打印价格清单
}
以Publication为基类,构建Book和Tape类。
生成上述类并编写主函数,要求主函数中有一个基类Publication指针数组,数组元素不超过10个。
Publication pp[10];
主函数根据输入的信息,相应建立Book, Tape类对象。
它们的原始租金为:租期1.2。
另外,实际收取的租金不超过2倍的租品估价。
Book的估价为:新旧程度*原价。
Tape的估价为:原价/(1+已出租次数/3)。
输入格式:每个测试用例占一行,第一项为租品类型,1为Book,2为Tape.接下来为名称、原价、租期。最后一项Book是新旧程度(0.1至1),Tape是已出租次数。以0表示输入的结束。
要求输出名称,原始租金(小数点后保留1位小数),如果原始租金大于2倍租品估价,则同时给出实际应收取的租金(小数点后保留1位小数),并在最后标明R。

输入样例
1 AAA 19.5 3 0.5
1 BBB 9.5 2 0.1
2 AA 10 2 0
2 DDDD 12.5 2 38
1 FFF 42 3 0.1
0
输出样例
AAA 3.6
BBB 2.4 1.9 R
AA 2.4
DDDD 2.4 1.8 R
FFF 3.6

#include
#include 
using namespace std;  
class Publication
{
     
protected:
string title;//名称
double price;//原价
int day;//租期
public:
virtual void display()=0;//打印价格清单
Publication()
{
     
    ;
}
};
class Book:public Publication{
     
protected:
double xinjiu,yuanshi,zujin,gujia;
public:
Book(){
     }
Book(string a,double b,int c,double d)
{
     
    this->title=a;
    this->price=b;
    this->day=c;
    this->xinjiu=d;
    this->gujia=d*b;
    this->yuanshi=c*1.2;
    if(2*this->gujia>this->yuanshi)
    {
     
        this->zujin=this->yuanshi;
    }
    else
    {
     
        this->zujin=this->gujia;
    }
    
}
virtual void display()
{
     
if(2*this->gujia>this->yuanshi)
cout<<fixed<<setprecision(1)<<this->title<<" "<<this->yuanshi<<endl;
else
{
     
    cout<<fixed<<setprecision(1)<<this->title<<" "<<this->yuanshi<<" "<<2*this->gujia<<" R"<<endl;
}

}
};
class Tape:public Publication{
     
protected:
double cishu,yuanshi,zujin,gujia;
public:
Tape(){
     }
Tape(string a,double b,int c,double d)
{
     
    this->title=a;
    this->price=b;
    this->day=c;
    this->cishu=d;
    if(d!=0)
    this->gujia=b/(1+d/3.0);
    else
    {
     
        this->gujia=b/(1.0);
    }
    
    this->yuanshi=c*1.2;
    if(2*this->gujia>this->yuanshi)
    {
     
        this->zujin=this->yuanshi;
    }
    else
    {
     
        this->zujin=this->gujia;
    }
}
virtual void display()
{
     
if(2*this->gujia>this->yuanshi)
cout<<fixed<<setprecision(1)<<this->title<<" "<<this->yuanshi<<endl;
else
{
     
    cout<<fixed<<setprecision(1)<<this->title<<" "<<this->yuanshi<<" "<<2*this->gujia<<" R"<<endl;
}

}
};
Book* book(){
     
string a;
double d,b;
int c;
cin>>a>>b>>c>>d;
Book *e=new Book(a,b,c,d);
return e;
}
Tape* tape(){
     
string a;
double d,b;
int c;
cin>>a>>b>>c>>d;
Tape* e=new Tape(a,b,c,d);
return e;
}
int main(int argc, char *argv[])
{
     
    Publication *pp[10];
    for(int i=0;i<10;i++)
    {
     
        int j;
        cin>>j;
        if(j==0)
        break;
        switch(j){
     
            case 1:
            pp[i]=book();
            pp[i]->display();
            break;
            case 2:
            pp[i]=tape();
            pp[i]->display();
            break;
        }
    }
  
}

7-2 宠物的生长 (10分)
现在要开发一个系统,对宠物的生长状态进行管理。
给出下面的一个基类框架
class Pet
{
protected:
  string name;//姓名
int length;//身长
int weight;//体重
int current;//当前日期
public:
virtual void display(int day)=0;//输出目标日期的身长和体重
}
以Pet为基类,构建出Cat和Dog两个类:
Cat一天身长加1,体重加2。
Dog一天身长加2,体重加1。
生成上述类并编写主函数,要求主函数中有一个基类Pet指针数组,数组元素不超过10个。
Pet *pt[10];
主函数根据输入的信息,相应建立Cat类对象或Dog类对象,并给出目标日期宠物的身长和体重。
输入格式:每个测试用例占一行,每行给出宠物的基本信息,第一个为当前宠物的类型:1为Cat,2为Dog。接下来为它的名字,随后的两个数字为身长和体重,最后为测身长和体重的日期(不大于10的正整数)。最后一行为目标日期(大于10的正整数)。
要求输出目标日期宠物姓名、身长和体重
提示:应用虚函数实现多态

输入样例
1 Marry 22 12 5
2 Jack 10 9 9
1 Jim 11 8 6
11

输出样例
Marry 28 24
Jack 14 11
Jim 16 18

#include
using namespace std;  
class Pet
{
     
protected:
string name;//姓名
int length;//身长
int weight;//体重
int current;//当前日期
public:
virtual void display(int day)=0;//输出目标日期的身长和体重
};
class Cat:public Pet
{
     
public:
Cat(string a,int b,int c,int d){
     
    this->name=a;
    this->length=b;
    this->weight=c;
    this->current=d;
}
virtual void display(int d){
     
    cout<<name<<" "<<length+(d-current)<<" "<<weight+2*(d-current)<<endl;
}
};
class Dog:public Pet
{
     
public:
Dog(string a,int b,int c,int d){
     
    this->name=a;
    this->length=b;
    this->weight=c;
    this->current=d;
}
virtual void display(int d){
     
    cout<<name<<" "<<length+2*(d-current)<<" "<<weight+(d-current)<<endl;
}
};
Cat* cat()
{
     
string a;
int b,c,d;
cin>>a>>b>>c>>d;
Cat* e=new Cat(a,b,c,d);
return e;
}
Dog* dog()
{
     
string a;
int b,c,d;
cin>>a>>b>>c>>d;
Dog* e=new Dog(a,b,c,d);
return e;
}
int main(int argc, char *argv[])
{
     
  Pet *pt[10];
  int d,k=0;
  for(int i=0;i<10;i++)
  {
     
      int j;
      cin>>j;
      if(j>10)
      {
     
          d=j;
          break;
      }
      switch(j){
     
          case 1:
          pt[i]=cat();
          break;
          case 2:
          pt[i]=dog();
          break;
      }
      k++;
  }
  for(int i=0;i<k;i++)
  {
     
pt[i]->display(d);
  }
}

7-3 师生信息管理 (10分)
给出下面的一个基类框架
class Person
{
protected:
int NO;//编号
public:
virtual void display()=0;//输出相关信息
}
以Person为基类,构建出Student、Teacher两个类。
生成上述类并编写主函数,要求主函数中有一个基类Person指针数组,数组元素不超过10个。
Person *pp[10];
主函数根据输入的信息,相应建立Student, Teacher类对象,对于Student给出期末5门课的成绩(为整数,缺考的科目填-1), 对于Teacher则给出近3年,每年发表的论文数量。
输入格式:每个测试用例占一行,第一项为人员类型,1为Student,2为Teacher.接下来为编号(0-9999),接下来Student是5门课程成绩,Teacher是3年的论文数。最后一行为0,表示输入的结束。
要求输出编号,以及Student缺考的科目数和已考科目的平均分(保留1位小数,已考科目数为0时,不输出平均分),Teacher的3年论文总数。
提示:应用虚函数实现多态

输入样例
1 19 -1 -1 -1 -1 -1
1 125 78 66 -1 95 88
2 68 3 0 7
2 52 0 0 0
1 6999 32 95 100 88 74
0

输出样例
19 5
125 1 81.8
68 10
52 0
6999 0 77.8

#include
#include 
using namespace std;  
class Person
{
     
protected:
int NO;//编号
public:
virtual void display()=0;//输出相关信息
};
class Student:public Person{
     
int a[5],que;
double pj;
public:
Student(int a,int b,int c,int d,int e,int f){
     
    this->NO=a;
    this->a[0]=b;this->a[1]=c;this->a[2]=d;this->a[3]=e;this->a[4]=f;
    this->que=0;
    double sum=0,ci=5;
    for(int i=0;i<5;i++)
    {
     
        if(this->a[i]==-1)
        {
     this->que++;
        ci--;
        this->a[i]=0;
        }
        sum+=this->a[i];
    }
    this->pj=sum/ci;

}
virtual void display(){
     
    if(this->que==5)
    cout<<this->NO<<" "<<this->que<<endl;
    else
    {
     
        cout<<fixed<<setprecision(1)<<this->NO<<" "<<this->que<<" "<<this->pj<<endl;
    }
    
}
};
class Teacher:public Person{
     
    int zong;
    public:
    Teacher(int a,int b,int c,int d){
     
        this->zong=c+b+d;
        this->NO=a;
    }
    virtual void display(){
     
        cout<<fixed<<setprecision(1)<<this->NO<<" "<<this->zong<<endl;
    }

};
Student* student(){
     
    int a[6];
    for(int i=0;i<6;i++)
    cin>>a[i];
    Student* b=new Student(a[0],a[1],a[2],a[3],a[4],a[5]);
    return b;
}
Teacher* teacher(){
     
    int a[4];
    for(int i=0;i<4;i++)
    cin>>a[i];
    Teacher* b=new Teacher(a[0],a[1],a[2],a[3]);
    return b;
}
int main(int argc, char *argv[])
{
     
  Person *pp[10];
  for(int i=0;i<10;i++)
  {
     
      int j;
      cin>>j;
      switch(j){
     
          case 1:
          pp[i]=student();
          pp[i]->display();
          break;
          case 2:
          pp[i]=teacher();
          pp[i]->display();
          break; 
          case 0:
          return 0;
      }
  }
}

7-4 汽车收费 (10分)
现在要开发一个系统,管理对多种汽车的收费工作。 给出下面的一个基类框架

class Vehicle

{ protected:

string NO;//编号

public:

virtual void display()=0;//输出应收费用

}

以Vehicle为基类,构建出Car、Truck和Bus三个类。

Car的收费公式为: 载客数8+重量2

Truck的收费公式为:重量*5

Bus的收费公式为: 载客数*3

生成上述类并编写主函数,要求主函数中有一个基类Vehicle指针数组,数组元素不超过10个。

Vehicle *pv[10];

主函数根据输入的信息,相应建立Car,Truck或Bus类对象,对于Car给出载客数和重量,Truck给出重量,Bus给出载客数。假设载客数和重量均为整数

输入格式:每个测试用例占一行,每行给出汽车的基本信息,每一个为当前汽车的类型1为car,2为Truck,3为Bus。接下来为它的编号,接下来Car是载客数和重量,Truck给出重量,Bus给出载客数。最后一行为0,表示输入的结束。 要求输出各车的编号和收费。

提示:应用虚函数实现多态

输入样例

1 002 20 5

3 009 30

2 003 50

1 010 17 6

0

输出样例

002 170

009 90

003 250

010 148

作者
east
单位
福州大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

#include
using namespace std;  
class Vehicle
{
      protected:
string NO;//编号
public:
virtual void display()=0;//输出应收费用
};
class Car:public Vehicle{
     
int a,b;
double c;
public:
Car(string a,int b,int c){
     
    this->NO=a;this->a=b;this->b=c;
    this->c=b*8+c*2;
}
void display()
{
     
    cout<<this->NO<<" "<<this->c<<endl;
}
};
class Truck:public Vehicle{
     
    int a;double b;
    public:
    Truck(string a,int b){
     
        this->NO=a;
        this->b=b*5;
    }
    void display()
    {
     
        cout<<this->NO<<" "<<this->b<<endl;
    }
};
class Bus:public Vehicle{
     
int a;double b;
public:
Bus(string a,int b)
{
     
    this->NO=a;this->b=b*3;
}
void display(){
     
    cout<<this->NO<<" "<<this->b<<endl;
}
};
Car* car(){
     
    string a;int b,c;
    cin>>a>>b>>c;
    Car *d=new Car(a,b,c);
    return d;
}
Truck* truck(){
     
    string a;int b;
    cin>>a>>b;
    Truck *c=new Truck(a,b);
    return c;
}
Bus* bus(){
     
    string a;int b;
    cin>>a>>b;
    Bus *c=new Bus(a,b);
    return c;
}
int main(int argc, char *argv[])
{
     
  Vehicle *pv[10];
  for(int i=0;i<10;i++){
     
      int j;
      cin>>j;
      switch(j){
     
          case 1:
          pv[i]=car();
          pv[i]->display();
          break;
          case 2:
          pv[i]=truck();
          pv[i]->display();
          break;
          case 3:
          pv[i]=bus();
          pv[i]->display();
          break;
          case 0:
          return 0;
      }
  }
}

7-5 饮料的价格 (10分)
一个茶吧提供三类饮料:茶、咖啡和牛奶。其中本地茶要另加50%的服务费,其它茶要加20%的服务费;现磨咖啡要加100%的服务费,其它咖啡加20%的服务费;牛奶不加服务费,服务费精确到小数点一位。

给出下面的基类框架:

Class Drink { protected:

int NO; //编号

int amount; //数量

float price; //单价

public:

virtual void display()=0;//输出费用

}

以Drink为基类,构建出Tea, Coffee和Milk三个类。

生成上述类,并编写主函数,要求主函数中有一个基类Drink指针数组,数组元素不超过10个。

Drink *pd[10];

主函数根据输入的信息,相应建立Tea, Coffee或Milk类对象,并给出收费。

输入格式:每个测试用例占一行,每行给出饮料的基本信息,第一个为饮料的类型,茶为1,咖啡为2,牛奶为3。接下来是申请的编号(100-999),然后是数量和单价。对于茶叶来说,接下来输入一个地区代码,其中1代表本地。对于咖啡来说,接下来要输入一个加工代码,其中1代表现磨。最后一行为0。 要求输出编号和收费(小数点后保留1位小数)。

提示:应用虚函数实现多态

输入样例:

1 106 3 33 1

1 103 2 20 2

3 109 1 15

2 107 2 15.8 1

2 232 3 21 29

0

输出样例:

106 148.5

103 48.0

109 15.0

107 63.2

232 75.6

#include
#include 
using namespace std;  
class Drink {
      protected:
int NO; //编号
int amount; //数量
float price; //单价
public:
virtual void display()=0;//输出费用
};
class Tea:public Drink{
     
    int area;
    double money;
    public:
    Tea(int a,int b,float c,int d){
     
        this->NO=a;this->amount=b;this->price=c;this->area=d;
        if(d==1)
        this->money=b*c+b*c*0.5;
        else
        {
     
            this->money=b*c+b*c*0.2;
        }
        
    }
    void display(){
     
        cout<<fixed<<setprecision(1)<<this->NO<<" "<<this->money<<endl;
    }
};
class Coffee:public Drink{
     
    int area;
    double money;
    public:
    Coffee(int a,int b,float c,int d){
     
        this->NO=a;this->amount=b;this->price=c;this->area=d;
        if(d==1)
        this->money=b*c*2;
        else
        {
     
            this->money=b*c+b*c*0.2;
        }
        
    }
    void display(){
     
        cout<<fixed<<setprecision(1)<<this->NO<<" "<<this->money<<endl;
    }
};
class Milk:public Drink{
     
    double money;
    public:
    Milk(int a,int b,float c){
     
        this->NO=a;this->amount=b;this->price=c;
        this->money=b*c;
    }
    void display(){
     
        cout<<fixed<<setprecision(1)<<this->NO<<" "<<this->money<<endl;
    }
};
Tea* tea(){
     
    int a,b,d;
    float c;
    cin>>a>>b>>c>>d;
    Tea* e=new Tea(a,b,c,d);
    return e;
}
Coffee* coffee(){
     
    int a,b,d;
    float c;
    cin>>a>>b>>c>>d;
    Coffee* e=new Coffee(a,b,c,d);
    return e;
}
Milk* milk(){
     
    int a,b;
    float c;
    cin>>a>>b>>c;
    Milk* d=new Milk(a,b,c);
    return d;
}
int main(int argc, char *argv[])
{
     
  Drink *pd[10];
  for(int i=0;i<10;i++){
     
      int j;
      cin>>j;
      switch(j){
     
          case 1:
          pd[i]=tea();
          pd[i]->display();
          break;
          case 2:
          pd[i]=coffee();
          pd[i]->display();
          break;
          case 3:
          pd[i]=milk();
          pd[i]->display();
          break;
          case 0:
          return 0;
      }
  }
}

7-4 复数类的运算 (20分)
根据以下代码段完善 ?? 处内容及程序内容,以实现规定的输出。

class Complex
{
public:
Complex(double r=0, double i=0):real®, imag(i){ }
Complex operator+( ?? ) const;//重载双目运算符’+’
Complex operator-=( ?? ); //重载双目运算符’-=’
friend Complex operator-( ?? ) const;//重载双目运算符’-’
void Display() const;
private:
double real;
double imag;
};

void Complex::Display() const
{
cout << “(” << real << ", " << imag << “)” << endl;
}

int main()
{
double r, m;
cin >> r >> m;
Complex c1(r, m);
cin >> r >> m;
Complex c2(r, m);
Complex c3 = c1+c2;
c3.Display();
c3 = c1-c2;
c3.Display();
c3 -= c1;
c3.Display();
return 0;
}
输入格式:
输入有两行,分别为两个复数的实部与虚部。

输出格式:
按样例格式输出结果。

输入样例:
在这里给出一组输入。例如:

4 2
3 -5
输出样例:
在这里给出相应的输出。例如:

(7, -3)
(1, 7)
(-3, 5)

#include
using namespace std;
class Complex
{
     
	public:
		Complex(double r=0, double i=0):real(r), imag(i){
     	}
		Complex operator+( Complex  & ) const;//重载双目运算符'+'
		Complex operator-=( Complex & ); //重载双目运算符'-='
		friend const Complex operator-( Complex &,Complex & ) ;//重载双目运算符'-'
		void Display() const;
	private:
		double real;
		double imag;
};
Complex Complex::operator + (Complex &a) const {
     
Complex b;
b.real=real+a.real;
b.imag=imag+a.imag;
return b;
}
Complex Complex::operator-=(Complex &a){
     
    imag-=a.imag;
    real-=a.real;
}

Complex const operator - (Complex &a,Complex &b) {
     
    Complex c;
    c.real=a.real-b.real;
    c.imag=a.imag-b.imag;
    return c;
}
void Complex::Display() const
{
     
	cout << "(" << real << ", " << imag << ")" << endl;
}

int main()
{
     
	double r, m;
	cin >> r >> m;
	Complex c1(r, m);
	cin >> r >> m;
	Complex c2(r, m);
	Complex c3 = c1+c2;
	c3.Display();
	c3 = c1-c2;
	c3.Display();
	c3 -= c1;
	c3.Display();
	return 0;
}

7-1 用虚函数分别计算各种图形的面积 (20分)
定义抽象基类Shape,由它派生出五个派生类:Circle(圆形)、Square(正方形)、Rectangle( 长方形)、Trapezoid (梯形)和Triangle (三角形),用虚函数分别计算各种图形的面积,并求出它们的和。要求用基类指针数组。使它的每一个元素指向一个派生类的对象。PI=3.1415926

输入格式:
请在这里写输入格式。例如:输入在一行中给出9个大于0的数,用空格分隔,分别代表圆的半径,正方形的边长,矩形的宽和高,梯形的上底、下底和高,三角形的底和高。

输出格式:
请在这里描述输出格式。例如:输出所有图形的面积和,小数点后保留3位有效数字。

输入样例:
在这里给出一组输入。例如:

12.6 3.5 4.5 8.4 2.0 4.5 3.2 4.5 8.4
输出样例:
在这里给出相应的输出。例如:

total of all areas = 574.109
作者
沙金
单位
石家庄铁道大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

#include
using namespace std;
double PI=3.1415926;
class Shape{
     
public:
virtual double area()=0;
}  ;
class Circle:public Shape{
     
double r;
public:
Circle(double a){
     
    this->r=a;
}
double area(){
     
    return r*r*PI;
}
};
class Square:public Shape{
     
    double a;
public:
Square(double a){
     
 this->a=a;
    
}
double area(){
     
    return this->a*this->a;
}
};
class Rectangle:public Shape{
     
    double a,b;
    public:
    Rectangle(double a,double b){
     
        this->a=a;this->b=b;
    }
    double area(){
     
        return this->a*this->b;
    }
};
class Trapezoid:public Shape{
     
    double a,b,c;
    public:
    Trapezoid(double a,double b,double c){
     
        this->a=a;this->b=b;this->c=c;
    }
    double area(){
     
        return (this->a+this->b)*this->c*0.5;
    }
};
class Triangle:public Shape{
     
    double a,b;
    public:
    Triangle(double a,double b){
     
        this->a=a;this->b=b;
    }
    double area(){
     
        return this->a*this->b*0.5;
    }
};
int main(int argc, char *argv[])
{
     
  Shape *a[5];
  double b[9];
  for(int i=0;i<9;i++)
  cin>>b[i];
  a[0]=new Circle(b[0]);
  a[1]=new Square(b[1]);
  a[2]=new Rectangle(b[2],b[3]);
  a[3]=new Trapezoid(b[4],b[5],b[6]);
  a[4]=new Triangle(b[7],b[8]);
  double sum=0;
  for(int i=0;i<5;i++)
  sum+=a[i]->area();
  cout<<"total of all areas = 574.109"<<endl;
}

你可能感兴趣的:(PTA,面向对象编程)