2015-02-06 2 views
0

Я пишу функцию в C с указанными ниже характеристиками:С программой, чтобы найти корни ошибки

float find_root(float a, float b, float c, float p, float q); 

find_root принимает коэффициенты а, Ь, с квадратного уравнения и интервала (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; 
} 

Пожалуйста, дайте я знаю, что это за ошибка.

+2

Вы должны скомпилировать все предупреждения и информацию об отладке ('gcc -Wall -Wextra -g'), затем ** использовать отладчик ** (' gdb') для запуска вашего кода шаг за шагом. –

+3

Пожалуйста, определите 'не работает'. У вас есть 'main()'? Почему бы нам не показать? Вы ссылаетесь на '-lm'? Почему бы нам не сказать? –

+0

@BasileStarynkevitch Привет, я попробовал, что не смог исправить ошибку. Я хотел бы подтвердить, нужно ли изменять параметры отладчика, или что-то не так с самим кодом – KLMM

ответ

2

Ваша программа не работает, потому что вы никогда не звонили find_root() с вашего main().

find_root() не предполагается использовать все-на-себе. Выполнение вашей программы statrs от 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.

+0

Я не думаю, что основная функция является проблемой, поскольку по умолчанию используется компилятор-отладчик, который добавляет основную функцию и вызов, и, следовательно, если я добавлю основную функцию, она выкинет ошибку «дублировать функцию». – KLMM

+0

Точная ошибка, с которой я столкнулся: Compile failed ... см. Public.compile.err для получения более подробной информации /tmp/roots-KXflke.o: В функции 'find_root ': /u/cs136t/49627.dir/roots. c: 18: неопределенная ссылка на 'sqrt ' /u/cs136t/49627.dir/roots.c:19: неопределенная ссылка на' sqrt' clang: ошибка: команда компоновщика не удалась с кодом выхода 1 (используйте -v, чтобы увидеть invocation) – KLMM

+0

@ L887: Sourav Ghosh писал (а): * change * your 'main', а не добавить второй! –

1

Ваша программа начинается с 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

также около undefined behavior, которого вы всегда должны избегать.

BTW, вы можете использовать любой стандартный компилятор C (и редактор вроде emacs или gedit) для вашей домашней работы, например. используйте gcc или clang на вашем Linux-ноутбуке (затем используйте gdb ...). Вы не нуждаетесь в конкретном seashell

1

Для этих данных два ваших корня: 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 
0

Прежде всего, необходимо проверить значение d перед SQRT (d).

Вы также должны проверить, находится ли root2 внутри интервала.

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

0

Изменить это условие

if (root1<=q || root1>=p) 

в

if (root1<=q && root1>=p) 

иначе, если кто-либо из условий не выполняется, root1 будут возвращены и root2 никогда не будет почти быть возвращены. Надеюсь, это исправляет вашу проблему.

+0

Thats действительно смущающая ошибка, спасибо за указание на это – KLMM

Смежные вопросы