2013-09-22 54 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();