我有以下代码:
#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()中有一个条件,但最后程序显示两个结果。我该如何改进?
程序输出截图:
答案 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。
修改强>
关于字符串函数,请查看:
答案 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"){