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 внутри интервала.

И вам также нужно иметь способ вернуть "Нет корней в интервале".

Другие вопросы по тегам