C программа для поиска корней ошибки
Я пишу функцию на C со следующими спецификациями:
float find_root(float a, float b, float c, float p, float q);
find_root
принимает коэффициенты a,b,c квадратного уравнения и интервал (p, q). Он вернет корень этого уравнения в заданном интервале.
Например: find_root(1, -8, 15, 2, 4)
должен выдавать рут "близко к" 3.0
Я написал код ниже, и я не понимаю, почему он не работает:
#include<stdio.h>
#include<math.h>
main()
{
printf("Hello World");
}
float find_root(float a, float b, float c, float p, float q) {
float d,root1,root2;
d = b * b - 4 * a * c;
root1 = ( -b + sqrt(d)) / (2* a);
root2 = ( -b - sqrt(d)) / (2* a);
if (root1<=q || root1>=p)
{
return root1;
}
return root2;
}
Пожалуйста, дайте мне знать, что это за ошибка.
5 ответов
Ваша программа не работает, потому что вы никогда не звонили find_root()
от твоего main()
,
find_root()
не предполагается запускать сам по себе. Выполнение вашей программы из main()
, Вам нужно вызвать свою подфункцию из main()
чтобы заставить их исполниться.
Измените свою основную, чтобы позвонить find_root()
что-то вроде ниже.
int main() //put proper signature
{
float anser = 0;
answer = find_root(1, -8, 15, 2, 4); //taken from the question
printf("The anser is %f\n", answer); //end with a \n, stdout is line buffered
return 0; //return some value, good practice
}
Затем скомпилируйте программу как
gcc -o output yourfilename.c -lm
Помимо этого, для логического вопроса (ов) в find_root()
функции, пожалуйста, следуйте пути, предложенному г-ном @paxdiablo.
Ваша программа начинается с main
по определению.
Ваш main
функция не вызывается find_root
но это должно быть
Вы должны скомпилировать все предупреждения и отладочную информацию (gcc -Wall -Wextra -g
) затем используйте отладчик (gdb
) шаг за шагом запускать код, чтобы понять поведение вашей программы, поэтому скомпилируйте
gcc -Wall -Wextra -g yoursource.c -lm -o yourbinary
или с
clang -Wall -Wextra -g yoursource.c -lm -o yourbinary
тогда научитесь пользоваться gdb
(например, запустить gdb ./yourbinary
... и позже ./yourbinary
без отладчика)
Затем вы будете думать и улучшать исходный код, перекомпилировать его и снова отлаживать. И повторяйте этот процесс, пока вы не будете довольны своей программой.
Кстати, вам лучше закончить printf
форматировать строки с \n
или узнать о fflush (3)
Не забудьте прочитать документацию по каждой функции (например, printf (3)...), которую вы вызываете.
Возможно, вы захотите привести некоторые аргументы (через ваш main(int argc, char**argv)
...) к вашей программе. Вы можете использовать atof (3), чтобы преобразовать их в double
Читайте также о неопределенном поведении, которого всегда следует избегать.
Кстати, вы можете использовать любой стандартный компилятор C (и редактор, как emacs
или же gedit
) для вашей домашней работы, например, использовать gcc
или же clang
на вашем ноутбуке Linux (затем используйте gdb
...). Вам не нужен конкретный seashell
Для этих данных ваши два корня 5
а также 3
, С p == 2
а также q == 4
:
if (root1<=q || root1>=p)
будет выглядеть так:
if (5<=4 || 5>=2)
это правда, так что вы получите 5
,
if
условие, которое вы хотите это:
if ((p <= root1) && (root1 <= q))
как показано в следующей программе, которая производит правильный 3
:
#include<stdio.h>
#include<math.h>
float find_root (float a, float b, float c, float p, float q) {
float d,root1,root2;
d = b * b - 4 * a * c;
root1 = ( -b + sqrt(d)) / (2* a);
root2 = ( -b - sqrt(d)) / (2* a);
if ((p <= root1) && (root1 <= q))
return root1;
return root2;
}
int main (void) {
printf ("%f\n", find_root(1, -8, 15, 2, 4));
return 0;
}
Это логическая ошибка с вашими вычислениями корней.
Просто имейте в виду, что есть другие проблемы с вашим кодом.
Вы должны убедиться, что вы на самом деле вызываете саму функцию, ваш main
как оно стоит не.
Это также не будет производить значение в пределах p/q
граничит, вместо этого он даст вам первый корень, если он находится в этих пределах, иначе он даст вам второй корень независимо от его значения.
Вы можете поймать ситуацию, когда d
отрицательно, так как вы не хотите брать квадратный корень из этого:
a = 1000, b = 0, c = 1000: d <- -4,000,000
И, наконец, если ваш компилятор жалуется на неспособность связать sqrt
(согласно одному из ваших комментариев), вы, вероятно, обнаружите, что можете это исправить, указав математическую библиотеку, что-то вроде:
gcc -o myprog myprog.c -lm
Изменить это условие
if (root1<=q || root1>=p)
в
if (root1<=q && root1>=p)
в противном случае, если выполняется любое из условий, root1 будет возвращен, а root2 почти никогда не будет возвращен. Надеюсь, это решит вашу проблему.
Сначала вам нужно проверить значение d перед sqrt(d).
Вы также должны проверить, находится ли root2 внутри интервала.
И вам также нужно иметь способ вернуть "Нет корней в интервале".