标题:C++期末大作业,菜鸟一只,也不知道写的对不对,麻烦帮忙看一下,蟹蟹
只看楼主
anhaoAH
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2019-12-18
结帖率:75%
已结贴  问题点数:10 回复次数:6 
C++期末大作业,菜鸟一只,也不知道写的对不对,麻烦帮忙看一下,蟹蟹
题目要求:a、将三角形、矩形、圆形等形状封装成相应的类;
          b、实现相应图形的构造函数;
          c、将计算相应图形的周长和面积函数封装成类的成员函数;
          d、在main函数中分别输入相应图形的参数构造相应图形的对象,计算相应图形的周长和面积并输出。
#include<iostream>
#include<cmath>
using namespace std;
class Graph
{
public:
    Graph(int a,int b,int c)
    {
        x=a;
        y=b;
        z=c;
    }
    Graph(int a,int b)
    {
        x=a;
        y=b;
    }
    Graph(int a)
    {
        x=a;
    }
    double perimeter(int a,int b,int c)
    {
        return a+b+c;
    }
    double perimeter(int a,int b)
    {
        return 2*a+2*b;
    }
    double perimeter(int a)
    {
        return 3.14*2*a;
    }
    double area(int a,int b,int c)
    {
        double p=(a+b+c)/2;
        return sqrt(p*(p-a)*(p-b)*(p-c));
    }
    double area(int a,int b)
    {
        return a*b;
    }
    double area(int a)
    {
        return 3.14*a*a;
    }
private:
    int x;
    int y;
    int z;
};
int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    Graph A(a,b,c);
    cout<<A.perimeter()<<' '<<A.area()<<endl;
    return 0;
}
编译时红色代码行报错显示error: no matching function for call to Graph: perimeter O 求解答哪里出的问题
另外,题目求不同图形的周长和面积我的想法是函数重载,但是我感觉“cin>>a>>b>>c;”这一句输入参数进行重载好像不太对,但是自己又想不出什么好办法,希望大佬帮忙指正。
搜索更多相关主题的帖子: double 图形 Graph return int 
2020-06-09 18:11
吕孟伟
Rank: 8Rank: 8
等 级:贵宾
威 望:27
帖 子:200
专家分:870
注 册:2018-10-4
得分:7 
题目要求是三角形、矩形、圆形等形状封装成相应的类,那么需要得是三个类,而不是一个将他们三个整合到一起的类。
那么,对应到各个类中的计算周长和面积的成员函数类似这样得写,运用this指针。
程序代码:
double perimeter()
    {
        return this->x + this->y + this->z;
    }

double area()
    {
        double p=(this->x+this->y+this->z)/2;
        return sqrt(p*(p-this->x)*(p-this->y)*(p-this->z));
    }


[此贴子已经被作者于2020-6-10 08:35编辑过]


借用一下侯捷的话:勿在浮沙筑高台。
2020-06-09 22:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:3 
主要是题目看不懂
a、将三角形、矩形、圆形等形状封装成相应的类;
需要继承一个公共的基类吗?
d、在main函数中分别输入相应图形的参数构造相应图形的对象,计算相应图形的周长和面积并输出。
这就完全听不懂了,这个“相应图形”是哪个图形?

程序代码:
#include <iostream>
#include <cmath>
#include <numbers>

class Graph
{
public:
    virtual ~Graph() = default;
    virtual double perimeter() const = 0;
    virtual double area() const = 0;
};

class Triangle : public Graph
{
public:
    Triangle( double a, double b, double c ) : a_(a), b_(b), c_(c)
    {
    }
    virtual ~Triangle() = default;
    virtual double perimeter() const
    {
        return a_+b_+c_;
    }
    virtual double area() const
    {
        double p = (a_+b_+c_)/2;
        return sqrt(p*(p-a_)*(p-b_)*(p-c_));
    }

protected:
    double a_, b_, c_;
};

class Rectangle : public Graph
{
public:
    Rectangle( double a, double b ) : a_(a), b_(b)
    {
    }
    virtual ~Rectangle() = default;
    virtual double perimeter() const
    {
        return 2*(a_+b_);
    }
    virtual double area() const
    {
        return a_*b_;
    }

protected:
    double a_, b_;
};

class Circle : public Graph
{
public:
    Circle( double r ) : r_(r)
    {
    }
    virtual ~Circle() = default;
    virtual double perimeter() const
    {
        return 2 * r_ * std::numbers::pi;
    }
    virtual double area() const
    {
        return std::numbers::pi * r_ * r_;
    }

protected:
    double r_;
};

using namespace std;

int main( void )
{
    Triangle a( 3, 4, 5 );
    cout << "Triangle(3,4,5) 的周长是 " << a.perimeter() << ", 面积是 " << a.area() << ".\n";

    Rectangle b( 5, 6 );
    cout << "Rectangle(5,6) 的周长是 " << b.perimeter() << ", 面积是 " << b.area() << ".\n";

    Circle c( 7 );
    cout << "Circle(7) 的周长是 " << c.perimeter() << ", 面积是 " << c.area() << ".\n";
}

2020-06-10 09:00
anhaoAH
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2019-12-18
得分:0 
回复 3楼 rjsp
这个程序在codeblocks编译出错
#include<numbers>    显示fatal error: numbers: No such file or directory    好像没有这个头文件
而且这个程序它没有输入,而我想请教的是像下面说的那样👇👇👇
请问如何实现从键盘输入不确定几个数字(1/2/3)后自动调用相应的函数,额,不太好表达,就是我可能会输入一个数字,也可能是两个或三个,但是无论我输入几个数字,都必须回车后直接调用相应图形的周长和面积函数并输出。
2020-06-10 10:29
anhaoAH
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2019-12-18
得分:0 
回复 2楼 吕孟伟
请问如何实现从键盘输入不确定几个数字(1/2/3)后自动调用相应的函数,额,不太好表达,就是我可能会输入一个数字,也可能是两个或三个,但是无论我输入几个数字,都必须回车后直接调用相应图形的周长和面积函数并输出。
2020-06-10 10:34
anhaoAH
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2019-12-18
得分:0 
谢谢大家的回答!我又来了听了大家的建议改成了三个类,三角形的输出也对了,非常接近成功,现在是main函数里不知道该怎么写才能让程序自动调用不同图形的相应函数,求解答。
#include<iostream>
#include<cmath>
using namespace std;
class Graph
{
public:
    Graph(int a,int b,int c)
    {
        x=a;
        y=b;
        z=c;
    }
    Graph(int a,int b)
    {
        x=a;
        y=b;
    }
    Graph(int a)
    {
        x=a;
    }
private:
    int x;
    int y;
    int z;
};
class Triangle
{
public:
    Triangle(int a,int b,int c)
    {
        x=a;
        y=b;
        z=c;
    }
    double perimeter()
    {
        return this->x + this->y + this->z;
    }

    double area()
    {
        double p=(this->x+this->y+this->z)/2;
        return sqrt(p*(p-this->x)*(p-this->y)*(p-this->z));
    }
private:
    int x;
    int y;
    int z;
};
class Rectangle
{
public:
    Rectangle(int a,int b)
    {
        x=a;
        y=b;
    }
    double perimeter()
    {
        return 2*(this->x+this->y);
    }
    double area()
    {
        return this->x*this->y;
    }
private:
    int x;
    int y;
};
class Round
{
public:
    Round(int a)
    {
        x=a;
    }
    double perimeter()
    {
        return 2*3.14*this->x;
    }
    double area()
    {
        return 3.14*this->x*this->x;
    }
private:
    int x;
};
int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    Triangle A(a,b,c);
        就是这一块不知道咋写,目前只能计算特定图形的。
    cout<<A.perimeter()<<' '<<A.area()<<endl;
    return 0;
}
2020-06-10 11:46
anhaoAH
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2019-12-18
得分:0 
#include<iostream>
#include<cmath>
using namespace std;
class Triangle
{
public:
    Triangle(int a,int b,int c)
    {
        x=a;
        y=b;
        z=c;
    }
    double perimeter()
    {
        return this->x + this->y + this->z;
    }

    double area()
    {
        double p=(this->x+this->y+this->z)/2;
        return sqrt(p*(p-this->x)*(p-this->y)*(p-this->z));
    }
private:
    int x;
    int y;
    int z;
};
class Rectangle
{
public:
    Rectangle(int a,int b)
    {
        x=a;
        y=b;
    }
    double perimeter()
    {
        return 2*(this->x+this->y);
    }
    double area()
    {
        return this->x*this->y;
    }
private:
    int x;
    int y;
};
class Round
{
public:
    Round(int a)
    {
        x=a;
    }
    double perimeter()
    {
        return 2*3.14*this->x;
    }
    double area()
    {
        return 3.14*this->x*this->x;
    }
private:
    int x;
};
int main()
{
    int x,a,b,c;
    cout<<"Please select the type you want to calculate."<<endl;/*先确定要计算的图形类型*/
    cout<<"1:Triangle"<<endl<<"2:Rectangle"<<endl<<"3:Round"<<endl;
    cin>>x;
    if(x==1)
    {
    cin>>a>>b>>c;
        if(a+b<=c||b+c<=a||a+c<=b||a<=0||b<=0||c<=0)/*排除数据不符合条件的情况*/
        {
            cout<<"Wrong data.";
        }
        else
        {
            Triangle A(a,b,c);
            cout<<A.perimeter()<<' '<<A.area()<<endl;
        }
    }
    else if(x==2)
    {
        cin>>a>>b;
        if(a<=0||b<=0)//排除数据不符合条件的情况
        {
            cout<<"Wrong data.";
        }
        else
        {
        Rectangle A(a,b);
        cout<<A.perimeter()<<' '<<A.area()<<endl;
        }
    }
    else if(x==3)
    {
        cin>>a;
        if(a<=0)//排除数据不符合条件的情况
        {
            cout<<"Wrong data.";
        }
        else
        {
        Round A(a);
        cout<<A.perimeter()<<' '<<A.area()<<endl;
        }
    }
    else
    {
        cout<<"Wrong type.";//当所选图形类型不在范围内时结束程序
        exit(0);
    }
    return 0;
}
最后改成了这样,运行正常,但总感觉略显臃肿,也算是解决了。
感谢大家的帮助!
2020-06-10 20:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502033-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019756 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved