Цикл нечеткой логики C ++ увеличивается после первого ввода

Я написал свою первую программу Fuzzy Logic, и первый вход отлично справляется со своей задачей, выводя правильное значение напряжения. Слово Напряжение строго заполнитель. Это точно соответствует моей математике. Любое значение после этого увеличивает конечный результат, и НИКОГДА не работает снова, пока я не перезапущу программу, после чего она делает то же самое.

Я постараюсь максимально упростить мой код.

int main()
{
int InputDistance;
double BetweenDistance1;
double BetweenDistance2;
double DoM1;
double DoM2;
double OutputComponent1;
double OutputComponent2;
double CrispOutput;
bool NN = false;
bool N = false;
bool Z = false;
const double NNVolt (0);
const double NVolt (2.25);
const double ZVolt (4.5);
for(;;)
{
cout <<  "What is the distance?" << endl << endl;
cin >> InputDistance;
cout << endl;
if(InputDistance > 0 && InputDistance <= 5)
{
BetweenDistance1 = InputDistance - 0;
BetweenDistance2 = 5 - InputDistance;
NN = true;
N = true;
}
if(InputDistance > 5 && InputDistance <= 10)
{
BetweenDistance1 = InputDistance - 5;
BetweenDistance2 = 10 - InputDistance;
NN = true;
N = true;
}
if(InputDistance > 10 && InputDistance <= 15)
{
BetweenDistance1 = InputDistance - 10;
BetweenDistance2 = 15 - InputDistance;
N = true;
Z = true;
}
if(InputDistance > 15 && InputDistance <= 20)
{
BetweenDistance1 = InputDistance - 15;
BetweenDistance2 = 20 - InputDistance;
N = true;
Z = true;
}

DoM1 = BetweenDistance1 / 5;
DoM2 = BetweenDistance2 / 5;

if(NN == true && N == true)
{
OutputComponent1 = NNVolt * DoM1;
OutputComponent2 = NVolt * DoM2;
}
if(N == true && Z == true)
{
OutputComponent1 = NVolt * DoM1;
OutputComponent2 = ZVolt * DoM2;
}
CrispOutput = OutputComponent1 + OutputComponent2;

cout << "Voltage = " << CrispOutput << endl << endl;
}
return (0);
}

Что вызывает приращение значений при каждом вводе нового значения расстояния? Я не вижу этого

1

Решение

Вы никогда не сбрасываете bools.

bool NN = false;
bool N = false;
bool Z = false;

Должен быть в начале цикла for, чтобы они сбрасывались каждый раз, когда он повторяется.

Как правило, любая переменная, которую вы будете использовать в цикле, должна быть объявлена ​​в цикле, если вам не нужен доступ к ней вне области цикла.

3

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

Вы должны инициализировать все ваши переменные, потому что даже если ваш компилятор инициализирует их как null, "", preppended "\0", 0, 0.0, 0.0f это может быть принято для компиляции в другом компиляторе, который не следует такому стандарту, или для компиляции с флагами, которые инициализируются с использованием разных вещей.

int main()
{
int InputDistance = 0;
double BetweenDistance1 = 0.0;
double BetweenDistance2 = 0.0;
double DoM1 = 0.0;
double DoM2 = 0.0;
double OutputComponent1 = 0.0;
double OutputComponent2 = 0.0;
double CrispOutput = 0.0;
bool NN = false;
bool N = false;
bool Z = false;
const double NNVolt (0);
const double NVolt (2.25);
const double ZVolt (4.5);

И вы должны повторно инициализировать в начале цикла, чтобы убедиться, что вы не используете данные предыдущих итераций.

    for(;;)
{
//----------- init ------------
InputDistance = 0;
BetweenDistance1 = 0.0;
BetweenDistance2 = 0.0;
DoM1 = 0.0;
DoM2 = 0.0;
OutputComponent1 = 0.0;
OutputComponent2 = 0.0;
CrispOutput = 0.0;
NN = false;
N = false;
Z = false;
//-----------------------------

cout <<  "What is the distance?" << endl << endl;
cin >> InputDistance;
cout << endl;

..

}

return (0);
}
1

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