Простой калькулятор площади формы возвращает ошибочные вычисления

#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:« возврат »: преобразование из двойного в плавающее, возможная потеря данных»

… Я почти уверен, что это является причиной неправильных вычислений при запуске кода (например, он возвращает площадь квадрата 5×5 как 1.15292e + 016) — Пожалуйста, кто-нибудь объяснит правильный метод для решения этой проблемы, я могу ‘ Кажется, я обыграл мою довольно тупую голову 🙁

0

Решение

Неправильный результат не является результатом преобразования типа 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 >> обрабатывает чтение double, а не float.
Когда вы пытаетесь читать из cin в float, вы сначала получаете двойное значение, которое затем неявно приводится к float. Поскольку float имеет меньшую точность, чем double, компилятор предупреждает вас, что при этом вы можете потерять точность. Предполагая, что точности с плавающей точкой достаточно — это не проблема. Вы можете решить эту проблему, просто объявив классы и переменную для использования double вместо float.

1

Другие решения

Вы не инициализируете данные членов класса

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

По вопросам рекламы [email protected]