C ++, код работает нормально, но не при извлечении функции

Прежде всего, я студент-физик, а не программист, поэтому, пожалуйста, прости эту тривиальную проблему. Я пытаюсь создать функцию для поиска корней кубического уравнения, используя метод Ньютона-Рафсона. Я создал код, который в значительной степени работает просто отлично, но смысл этого упражнения состоит в том, чтобы этот код был в форме «функции», т.е. возвращаемый тип, параметры, а затем блок кода. Когда я пытаюсь поместить его в эту форму, мой код скомпилируется, но когда я ввожу в него результаты (корни, которые он возвращает), являются фальшивыми. Вот мой код

#include<iostream>
#include<cmath>

double roots(double,double,double,double);

int main()
{
double x3,x2,x,con;
std::cin>>x3,x2,x,con;

double result=roots(x3,x2,x,con);
std::cout<<result<<std::endl;
system("pause");
}

double roots(double xcubecoeff, double xsquarecoeff, double xcoeff, double constant)
{
int j=0;
int k=0;
int l=0;
int m=0;
double seedvalue1=-10;
double seedvalue2=10;
double seedvalue3=0.3;
double seedvalue4=-0.3;
double xnplus1;
double xnplus2;
double xnplus3;

while(j <= 100)
{
//func is just the structure of the cubic equation in terms of the
// parameters of the function
//derfunc is just the structure of the gneral derivitive of a cuic
// function, again in terms of the parameters
//seedvalues are just the initial values for x in the general cubic
// equation.
//Seedvalue one goes into the loop to find the negative x root,
// seedvalue 2 finds the positive one, seedvalue three attempts to
// find the one in the middle of those, however if it just finds
// either of those again then an IF statement and seedvalue 4 are
//used to find it.

double func = xcubecoeff * (seedvalue1 * seedvalue1 * seedvalue1) +
xsquarecoeff * (seedvalue1 * seedvalue1) +
xcoeff * seedvalue1 +
constant;

double derfunc = 3 * xcubecoeff * (seedvalue1 * seedvalue1) +
2 * xsquarecoeff * seedvalue1 +
xcoeff;double xnplus1 = seedvalue1 - (func / derfunc);

seedvalue1=xnplus1;
j++;
}while(k <= 100)
{
double func = xcubecoeff * (seedvalue2 * seedvalue2 * seedvalue2) +
xsquarecoeff * (seedvalue2 * seedvalue2) +
xcoeff * seedvalue2 +
constant;

double derfunc = 3 * xcubecoeff * (seedvalue2 * seedvalue2) +
2 * xsquarecoeff * seedvalue2 +
xcoeff;

double xnplus2 = seedvalue2 - (func / derfunc);

seedvalue2 = xnplus2;
k++;
}

while(l<=100)
{
double func = xcubecoeff * (seedvalue3 * seedvalue3 * seedvalue3) +
xsquarecoeff * (seedvalue3 * seedvalue3) +
xcoeff * seedvalue3 +
constant;

double derfunc = 3 * xcubecoeff * (seedvalue3 * seedvalue3) +
2 * xsquarecoeff * seedvalue3 +
xcoeff;

double xnplus3 = seedvalue3 - (func / derfunc);

seedvalue3=xnplus3;
l++;
}

if(seedvalue3 == seedvalue1 || seedvalue3 == seedvalue2)
{
while(m<=100)
{
double func = xcubecoeff * (seedvalue4 * seedvalue4 * seedvalue4) +
xsquarecoeff * (seedvalue4 * seedvalue4) +
xcoeff * seedvalue4 +
constant;

double derfunc = 3 * xcubecoeff * (seedvalue4 * seedvalue4) +
2 * xsquarecoeff * seedvalue4 + xcoeff;

double xnplus4 = seedvalue4 - (func / derfunc);

seedvalue4=xnplus4;
m++;
}

std::cout<<seedvalue1<<std::endl;
std::cout<<seedvalue2<<std::endl;
std::cout<<seedvalue4<<std::endl;
}
else
{

std::cout<<seedvalue1<<std::endl;
std::cout<<seedvalue2<<std::endl;
std::cout<<seedvalue3<<std::endl;
}
}

Это, вероятно, действительно неуклюжий и громоздкий код, и я уверен, что есть лучший способ выполнить метод Ньютона Рафсона.
Итак, чтобы быть ясным, я начинаю с включения стандартного iostream и математики. Затем я объявляю свою функцию, за именем следуют типы параметров, которые могут быть переданы ей. Затем я начинаю свой код. Я инициализирую переменные x3, x2, x и con как double и использую импорт ‘cin’, чтобы позволить пользователям вводить значения для них, которые будут коэффициентами кубического уравнения. Затем я вызываю функцию и помещаю имена переменных, инициализированные выше, что, как я считаю, означает, что введенные пользователем значения будут переданы в функцию для использования внутри функции.
Ниже я программирую распечатать вывод функции. Под этим понимается определение функции, которая, помимо имени функции и параметров, состоит в том, как я написал ее в другом cpp, который работал просто отлично, только когда я писал этот код, пытаясь поместить исходный код в форму функции, проблемы возникли.

Поскольку я говорю, что этот код, вероятно, очень уродлив и неэффективен, но он работает в некоторой степени, я просто не могу понять, почему он не работает в этой форме.

Я надеюсь, что вы можете помочь,

Я постараюсь уточнить, если у вас есть дополнительные вопросы.

-1

Решение

Ваша функция должна вернуть значение, в конце вы пропустите оператор возврата:

return value; // instead of "value", pick the variable you want to return
3

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

Следующее неверно:

double x3,x2,x,con;
std::cin>>x3,x2,x,con;

Это вызывает оператор запятой который не делает то, что вы думаете, что делает.

Вы должны сделать это:

std::cout << "Enter x3: ";
std::cin >> x3;
std::cout << "Enter x2: ";
std::cin >> x2;
std::cout << "Enter x: ";
std::cin >> x;
std::cout << "Enter c: ";
std::cin >> con;

Если вы хотите объединить их в одну строку:

std::cin >> x3 >> x2 >> x >> con;
2

Одна проблема с этой линией

std::cin>>x3,x2,x,con;

Это не делает то, что вы думаете! Запятые здесь на самом деле являются «оператором запятой», который оценивает оба своих операнда и принимает значение самого правого. Имеет более низкий приоритет, чем >> так что ваша линия означает так же, как

((((std::cin>>x3), x2), x), con);

который читает из cin в x3 а затем продолжает оценивать переменные x2, x а также con — это ничего не делает, потому что оценка переменной не имеет побочных эффектов. Чтобы прочитать все 4 переменные, вы можете использовать:

std::cin >> x3 >> x2 >> x >> con;

Это хорошая идея, чтобы включить как можно больше предупреждений компилятора, потому что это часто приводит к подобным вещам. Например, если я скомпилирую эти строки вашего кода с gcc -Wall -Wextra это дает эти предупреждения:

test.cpp: In function 'int main()':
test.cpp:5:17: warning: right operand of comma operator has no effect [-Wunused-value]
test.cpp:5:19: warning: right operand of comma operator has no effect [-Wunused-value]
test.cpp:5:22: warning: right operand of comma operator has no effect [-Wunused-value]
2
По вопросам рекламы [email protected]