2016-03-22 4 views
-2

Я не могу понять, почему моя программа не делает то, что она должна делать. Задача состояла в том, чтобы создать c-программу, которая может решать квадратичную работу с использованием двух c-файлов. Это код называется interface.c, что мы должны работать, ничего не должно быть изменено на этом:Почему вывод программы x1 = Nan, x2 = Nan?

#include <stdio.h> 

void abc (void); 

int a, b, c; 

extern double x1real, x1imag, x2real, x2imag; 

static void get_parameters (void) 
{ 
    scanf("%d", &a); 
    scanf("%d", &b); 
    scanf("%d", &c); 
} 

void print_solution(void) 
{ 
    printf("The roots of %dx^2 + %dx + %d are:\n",a,b,c); 

    if(x1imag == 0 && x2imag == 0) 
    { 
     if(x1real == x2real) 
     { 
      printf("x = %.4f\n", x1real); 
     } 
     else 
     { 
      printf("x1 = %.4f, x2 = %.4f\n", x1real, x2real); 
     } 
    } 
    else 
    { 
     printf("x1 = %.4f+%.4fi, x2 = %.4f-%.4fi\n", x1real, x1imag, x2real, x2imag); 
    } 
} 

int main (void) 
{ 
    int runs, run; 

    scanf("%d",&runs); 

    for(run=0; run < runs; run++) 
    { 
     get_parameters(); 
     abc(); 
     print_solution(); 
    } 

    return 0; 
} 

Далее код, который я сделал, который не работает, там, кажется, идет что-то не так с целые типы, которые я думаю. С каждой квадратичной формулой он будет выводить x1 = nan x2 = nan. Что-то не так с целым типом, но не может понять, какой.

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 

extern int a, b, c; 

double x1real, x1imag, x2real, x2imag; 

int discriminant(void) 
{ 
    int discriminant; 

    discriminant = (pow(b,2)-4*a*c); 

    return discriminant; 
} 

void abc (void) 
{ 
    if (discriminant() > 0) 
    { 
     x1real = (-b - sqrt(discriminant()))/(2*a); 
     x2real = (-b + sqrt(discriminant()))/(2*a); 
     x1imag = 0; 
     x2imag = 0; 
    } 
    else 
    { 
     x1real = x2real = (-b)/(2*a); 
     x1imag = (-b - sqrt(-discriminant()))/(2*a); 
     x2imag = (-b + sqrt(-discriminant()))/(2*a); 
    } 

    return; 
} 
input: 
4 
2 0 0 
1 3 2 
3 4 9 
1 0 1 



output: 
The roots of 2x^2 + 0x + 0 are: 
x = 0.0000 
The roots of 1x^2 + 3x + 2 are: 
x1 = -1.0000, x2 = -2.0000 
The roots of 3x^2 + 4x + 9 are: 
x1 = -0.6667+-2.2653i, x2 = -0.6667-0.9319i 
The roots of 1x^2 + 0x + 1 are: 
x1 = 0.0000+-1.0000i, x2 = 0.0000-1.0000i 

suspected output: 
The roots of 2x^2 + 0x + 0 are: 
x = 0.0000 
The roots of 1x^2 + 3x + 2 are: 
x1 = -1.0000, x2 = -2.0000 
The roots of 3x^2 + 4x + 9 are: 
x1 = -0.6667+1.5986i, x2 = -0.6667-1.5986i 
The roots of 1x^2 + 0x + 1 are: 
x1 = 0.0000+1.0000i, x2 = 0.0000-1.0000i 
+3

'дискриминант> 0'? Вы должны назвать функцию этим именем? –

+0

Это может быть конфликт разрешения имен в коде. – callyalater

+0

Да, я подозреваю, что, чтобы избежать использования указателя на функцию, вам нужно «discinant()». –

ответ

0

Квадратичная формула?

условное выражение 「b^2-4ac ≧ 0」 не называется, не так ли?

int discriminant(void) 
{ 
    int discriminant; 

    discriminant = (pow(b,2)-4*a*c); 

    return discriminant; 
} 

void abc (void) 
{ 

// if (discriminant > 0) // it doesn't call [int discriminant(void)] 
    if (discriminant() >= 0) 
    { 
     x1real = (-b - sqrt(discriminant()))/(2*a); 
     x2real = (-b + sqrt(discriminant()))/(2*a); 
     x1imag = 0; 
     x2imag = 0; 
    } 
    else 
    { 
     x1real = x2real = (-b)/(2*a); 
     x1imag = (-b - sqrt(-discriminant()))/(2*a); 
     x2imag = (-b + sqrt(-discriminant()))/(2*a); 
    } 

    return; 
} 

(Дополнение)

static void get_parameters (void) 
{ 
    do { 
     scanf("%d", &a); 
     scanf("%d", &b); 
     scanf("%d", &c); 
    } while(a == 0) 
} 
+0

См. [комментарий] (http://stackoverflow.com/questions/36158645/why-does-program-output-x1-nan-x2-nan#comment59955663_36158645) – chux

+0

Спасибо, что помогли мне ! – MrAlphaking

+0

Теперь вы вычисляете дискриминант три раза при каждом вызове abc. И вы не учитываете вероятность того, что 'a' равно нулю. Кроме того, не используйте' pow (b, 2) 'для вычисления a квадрат - просто используйте 'b * b'. Вы также вычисляете тот же квадратный корень дважды. – FredK

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