为什么我的病情不起作用?

时间:2018-02-11 14:47:53

标签: c++ function math output

我有以下代码:

#include <iostream>

using namespace std;

int a, b, sqr;
const int P = 3.14; //Later for circles...
string s1; 

class MathsFunctions{
public:
virtual void square(int a, int b)=0;

};

class TriangleFunc: public MathsFunctions{
public:
    void square(int a, int b){
    sqr = (a * b)/2;
    cout << "Square of triangle is: "<< sqr << endl;
    }
};

class RectangleFunc: public MathsFunctions{
public:
    void square(int a, int b){
    sqr = a * b;
    cout << "Square of rectangle is:  "<< sqr << endl;
    }
};

void getNumbers(){
 cout << "Enter the first number:  "<<endl;
 cin >> a;
 cout << "Enter the second number:   "<< endl;
 cin >> b;
}
void chooseTheFigure(){
   cout << "Choose the figure (rectangle or triangle): "<< endl;
   cin >> s1;
}

int main(){

chooseTheFigure();
getNumbers();

if(s1 == "rectangle" || "Rectangle"){
RectangleFunc r;
MathsFunctions * m = &r;
m -> square(a,b);
};

if (s1 == "triangle" || "Triangle"){
    TriangleFunc t;
    MathsFunctions *m = &t;
    m -> square(a,b);
};

}

我创建了一个计算矩形或三角形的平方的程序。 main()中有一个条件,但最后程序显示两个结果。我该如何改进?

程序输出截图:

Screenshot of output of the program

3 个答案:

答案 0 :(得分:5)

这不符合你的想法:

if(s1 == "rectangle" || "Rectangle"){
    RectangleFunc r;
    MathsFunctions * m = &r;
    m -> square(a,b);
};

上面的 if-expression 评估为:

if((s1 == "rectangle") || ("Rectangle"))
 // ^^^^^^^^^^^^^^^^^  or  ^^^^^^^^^^

现在,第二部分"Rectangle" string-literal ,它隐式转换为有效指针。除nullptr之外的任何指针或类似整数的零指针都会计算为true - 总是。

你可能想写:

if((s1 == "rectangle") || (s1 == "Rectangle")){
    RectangleFunc r;
    MathsFunctions * m = &r;
    m -> square(a,b);
};

----------------------------------------

您的代码中还有一些其他细微差别,例如

  • 基类中没有vitual析构函数,

  • 这样:

    const int P = 3.14; //Later for circles...
    

    P不会保留您期望的值。

答案 1 :(得分:0)

1.如WhiZtim所指出,或者运营商需要更正

if(s1 == "rectangle" || "Rectangle") {...}

将始终为true,因为“Rectangle”不为null。

  1. 您应该对字符串使用字符串比较函数(请参阅strcmpi())
  2. 修改

    关于字符串函数,请查看:

    Case-insensitive string comparison in C++

答案 2 :(得分:0)

if(s1 == "rectangle" || "Rectangle"){

有两种情况,如果这是真的,第一种是你所期望的,第二种是你的错误,因为它现在是你在你的代码中要说的话:

1)输入字符串s1,与字符串文字&#34;矩形&#34;相等。返回true,或

2)如果string-literal&#34; Rectangle&#34;本身被认为是真值。 由于此转换本质上是一个&#34;空指针检查&#34;,并且字符串文字从不为null,因此总是为真。

您需要重复测试:

if(s1 == "rectangle" || s1 == "Rectangle"){