C ++ - 简单形状区域计算器返回错误的计算

时间:2013-09-22 05:19:16

标签: c++ calculator area

#include <iostream>
#include <iomanip>
using namespace std;

class Rectangle 
{
float x, y;
public:
void value (float,float);
float area () {return (x*y);}
};

void Rectangle::value (float a,float b) 
{
x = a;
y = b;
}

class Circle 
{
float x;
public:
void value (float);
float area () {return (3.14*x*x);}
};

void Circle::value (float a) 
{
x = a;
}

int main () 
{
float q,a,b;
char reply;

cout << "\t\tArea Calculator";
do
{
cout << "\n\nPlease select from the following: ";
cout << "\n1. Rectangle";
cout << "\n2. Cirlce";
cout << "\n3. Exit";
cout << "\n\n";
cin >> q;
if (q==3)
break;

if (q==1)
{
system("cls");
Rectangle rect;
cout << "\nPlease enter length: ";
cin >> a;
cout << "\nPlease enter width: ";
cin >> b;
cout << "\nArea: " << rect.area();
cin.get();
cout << "\n\nDo you want to continue y/n: ";
cin >> reply;

    if (toupper(reply) == 'N') 
        {
        cout << "\n\n";
        cout << "Goodbye!";
        break;
        }
}

if (q==2)
{
system("cls");
Circle circ;
cout << "\nPlease enter radius: ";
cin >> a;
cout << "\nArea: " << circ.area();
cin.get();
cout << "\n\nDo you want to continue y/n: ";
cin >> reply;

    if (toupper(reply) == 'N') 
        {
        cout << "\n\n";
        cout << "Goodbye!";
        break;
        }
} 

}   while (toupper(reply!='Y'));
{
cout << "\n\n";
system("pause");
}
}

上面的代码,调试时出现以下警告:

“警告C4244:'return':从double转换为float,可能会丢失数据”

...我很确定这是代码运行时计算错误的原因(例如,它返回5x5平方的区域为1.15292e + 016) - 请有人解释正确的方法解决这个问题,我似乎无法解决这个问题:(

2 个答案:

答案 0 :(得分:1)

错误的结果不是double到float转换的结果,而是初始化Rectangle / Circle对象的维度成员的结果。 在读取用户的值后,需要调用rect.value(a,b)。 不执行此操作会使对象的x和y成员未初始化,因此包含一些任意值 - 导致错误的计算结果。 同样可以为圈子调用circ.value(a)。

cout << "\nPlease enter length: ";
cin >> a;
cout << "\nPlease enter width: ";
cin >> b;
rect.value(a,b);
cout << "\nArea: " << rect.area();

双向浮动转换的警告可能是“cin&gt;&gt; b”样式行的结果。 cin流&gt;&gt;操作员处理读取双倍,而不是浮动。 当您尝试从cin读取浮点数时,首先得到一个double值,然后将其隐式转换为float。由于float的准确度低于double,因此编译器会警告您,这样做可能会失去精度。假设浮动精度足够 - 这没有问题。你可以简单地通过声明类和变量来使用double而不是float来解决这个问题。

答案 1 :(得分:0)

您没有初始化班级的数据成员

rect.area();circ.area();正在计算某些垃圾值的区域

使用构造函数:

Rectangle(float a, float b):x(a),y(b){}

Circle(float a):x(a){}

然后

cin >> a;
cin >> b;
Rectangle rect(a,b);
rect.area();

cin >> a;
Circle circ(a);
circ.area();