2013-09-22 58 views
0
#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"); 
} 
} 

上面的代码,具有以下警告调试:C++ - 简单的形状面积计算器返回错误计算

“警告C4244:‘回归’:从双变换浮动,可能丢失数据”

...我敢肯定这是代码运行时错误计算的原因(例如,它返回5x5平方的区域为1.15292e + 016) - 请任何人解释正确的解决方法这,我似乎无法得到我相当dopey头左右:(

回答

1

错误的结果不是双结果浮动转换而是不进行初始化的矩形/圆形物体的尺寸构件的结果。 您需要在读取用户的值后调用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 >> b”样式行的结果。 cin stream >>操作符处理读取双精度值,而不是浮点数。 当您尝试从cin读入浮点数时,首先会得到一个double值,然后将其隐式转换为浮点数。由于float的准确性比double小,编译器警告你可能会失去精度。假设浮点精度就足够了 - 这没有问题。你可以简单地通过声明类和变量来使用double而不是float来解决这个问题。

+0

非常感谢谢谢! :D ...只是一个快速后续问题,如果你不介意......如果double有更高的精度(双精度),为什么不用float来代替float - 是因为它使用了更多的内存也许? - 当然,如果是这样的话,当考虑到现代计算机拥有的大量内存资源时,这个数量是微不足道的? –

+0

当你有很多数字要保存 - 或者一个非常小的内存区域时,内存可能是一个考虑因素。不要只考虑带有X GB内存的PC - 考虑一个运行一些内存的微芯片固件代码,其中所需内存大小影响芯片尺寸 - 因此芯片的价格。另一个潜在的考虑是运行在旧的或低端的CPU上,这些CPU可能没有“更便宜”的支持以获得更高的精度,因此使用浮点比使用double更快。 –

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();