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");
}
}

上記のコードは、次の警告でデバッグします。

「警告 C4244: 'return': double から float への変換、データが失われる可能性があります」

...これが、コード実行時の計算ミスの原因であると確信しています(たとえば、5x5 の正方形の面積を 1.15292e+016 として返します)。これを解決するための正しい方法を誰か説明してください。私はそれを回避することができません:(

4

2 に答える 2

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

double から float への変換に関する警告は、おそらく "cin >> b" スタイルの行の結果です。cin stream >> 演算子は、float ではなく double の読み取りを処理します。cin から float に読み込もうとすると、最初に double 値が取得され、それが暗黙的に float にキャストされます。float は double よりも精度が低いため、コンパイラは、これを行うと精度が失われる可能性があることを警告します。float の精度が十分であると仮定すると、問題は発生しません。float の代わりに double を使用するようにクラスと変数を宣言するだけで、これを解決できます。

于 2013-09-22T09:39:01.827 に答える
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();
于 2013-09-22T05:28:45.223 に答える