Мне нужно немного помощи и несколько советов о том, куда идти
Для задания по программированию мне нужно написать программу, которая вычисляет квадратный корень из числа, которое вводит пользователь, и существуют определенные требования.
главный запрашивает номер и отображает его, работает внутри цикла, так что пользователь может повторить программу, не закрывая ее
Расчет должен быть выполнен в функции под названием sqRoot который будет вызываться главный используя алгоритм:
newValue = 0,5 * (oldValue + (X / oldValue))
Я даже не знаю, с чего начать такую программу. Но это то, что я имею до сих пор:
#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);
}
Я просто застрял с тем, что делать дальше и как правильно написать программу.
Спасибо за помощь и советы!
В своем фрагменте вы не показываете, как вы реализуете 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;
}
Надеюсь, это помогло.
Всего несколько исправлений
#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);
}