Как вычислить истинный квадратный корень числа с 3 пользовательскими функциями

Мне нужно немного помощи и несколько советов о том, куда идти
Для задания по программированию мне нужно написать программу, которая вычисляет квадратный корень из числа, которое вводит пользователь, и существуют определенные требования.

  1. главный запрашивает номер и отображает его, работает внутри цикла, так что пользователь может повторить программу, не закрывая ее

  2. Расчет должен быть выполнен в функции под названием sqRoot который будет вызываться главный используя алгоритм:

newValue = 0,5 * (oldValue + (X / oldValue))

  1. sqRoot нужно будет найти абсолютное значение числа с помощью функции с именем absVal который затем будет вызван sqRoot

Я даже не знаю, с чего начать такую ​​программу. Но это то, что я имею до сих пор:

#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;

double sqRoot();
double absVal();
int i = 0;
double X;

int main()
{
sqRoot = sqrt(X);
double X;

// Calculations

cout << "Please enter a number: ";
cin >> X;

while (X <= 0)
{
cout << "*** Error: Invalid Number! *** " << endl;
cout << "Please enter a number: ";
cin >> X;
}
while (X >= 1)
{
cout << "The Square Root is: " << sqRoot << endl;
}
}

double sqRoot ()
{
double newValue;
double oldValue ;
while (abs(newValue - oldValue) > 0.0001)
{
newValue = 0.5 * (oldValue + ( X / oldValue));
oldValue = newValue;
cout << " The square root is: " << newValue << endl;
}
return (newValue);
}

Я просто застрял с тем, что делать дальше и как правильно написать программу.
Спасибо за помощь и советы!

2

Решение

В своем фрагменте вы не показываете, как вы реализуете absVal(), что тривиально:

double absVal( double x )
{
return  x < 0.0 ? -x : x;
}

Предполагая, что вы знаете троичного оператора. В противном случае используйте if,

Реализация main() Вы отправили в основном бесконечный цикл, который вычисляет и печатает многократно только первое число, равное или большее 1,0, которое вводит пользователь. Я думаю, это не то, о чем вас просят

Я не уверен, является ли условие x> = 1 обязательным (для крошечных значений требуется больше итераций) или ваше предположение и что вы должны делать в случае отрицательного числа (вы можете использовать absVal вместо вывода ошибки) , но вы можете написать что-то вроде этого:

#include <iostream>
// #include <cmath>         <-- you are not supposed to use that
// #include <cstdlib>       <-- why do you want that?
// using namespace std;     <-- bad idea

using std::cin;
using std::cout;

double absVal( double x );
double sqRoot( double x );

int main()
{
double num;

cout << "This program calculate the square root of the numbers you enter.\n"<< "Please, enter a number or something else to quit the program:\n";

// this will loop till std::cin fails
while ( cin >> num )
{
if ( num < 0.0 ) {
cout << "*** Error: Invalid input! ***\n"<< "Please enter a positive number: ";
continue;
}

cout << "The square root of " << num << " is: " << sqRoot(num);
cout << "\nPlease enter a number: ";
}

return 0;       // you missed this
}

Затем в вашей реализации sqRoot() Вы забыли передать переменную x в качестве параметра, чтобы инициализировать oldValue и newValue, и если поток выполнения попадет в цикл while, он выйдет после первого цикла, потому что oldValue = newValue; оценивается до состояния. Попробуйте что-то вроде этого (я использовал относительную ошибку вместо абсолютной разности, чтобы получить лучшую точность при малых значениях x за счет большего количества итераций):

double sqRoot(double x)
{
const double eps = 0.0001;
double newValue = 0;
double oldValue = x;

while ( oldValue != 0.0 )
{
newValue = 0.5 * (oldValue + (x / oldValue));

// check if the relative error is small enough
if ( absVal(newValue - oldValue) / oldValue  <  eps )
break;

oldValue = newValue;
}

return newValue;
}

Надеюсь, это помогло.

2

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

Всего несколько исправлений

#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;

double sqRoot(double X);

int main()
{
double X;

// Calculations

cout << "Please enter a number: ";
cin >> X;

while (X <= 0)
{
cout << "*** Error: Invalid Number! *** " << endl;
cout << "Please enter a number: ";
cin >> X;
}
while (X >= 1)
{
cout << "The Square Root is: " << sqRoot(X) << endl;
}
}

double sqRoot(double X)
{
double newValue = 0;
double oldValue = X;
while (true)
{
newValue = 0.5 * (oldValue + (X / oldValue));
if (abs(newValue - oldValue) < 0.0001)
break;
oldValue = newValue;
//cout << " The square root is: " << newValue << endl;
}
return (newValue);
}
0

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