#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) - 请有人解释正确的方法解决这个问题,我似乎无法解决这个问题:(
答案 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();