Duda, Programación en C: Trabajo con Punteros


HTML, CSS, PHP, JavaScript, Java... tus dudas por aquí...
   

Duda, Programación en C: Trabajo con Punteros

Notapor Alquimia » Sep 2009, 21:33

Hola, tengo un pequeño problema desde hace un tiempo, a ver si me pueden ayudar.
El programa es un ejercicio de trabajo con punteros y paso de parámetros por punteros. Se supone que se crea una función que capture los coeficientes a,b y c de una ecuación cuadrática y cambie los valores almacenados en a y b a través del uso de sus direcciones de memoria.

Les muestro mi código.
Código: Seleccionar todo
#include <stdio.h>
#include <math.h>
#include <string.h>

int funcion (float *a, float *b, float *c);

void main()
{
   float a,b,c;

   printf ("\t\tEcuacion cuadratica\n\n");
   printf ("Coeficiente a: ");
   scanf ("%f",&a);
   printf ("Coeficiente b: ");
   scanf ("%f",&b);
   printf ("Coeficiente c: ");
   scanf ("%f",&c);
   
   int valida;
   funcion (&a,&b,&c);
   valida = (a==0 && b==0);
   if(!valida)
      printf ("Las soluciones son: %.3f y %.3f. \n", a,b);
   else
      printf ("Tiene raíces complejas.\n");
}

int funcion (float *ah, float *be, float *ce)
{
   //Comprueba si tiene raíces complejas
   if ((*be * *be -(4* *ah * *ce)) < 0){
       *ah = 0;
       *be = 0;
   }
   else{
      float aux = *ah;
      *ah = (-(*be) + sqrt (*be * *be -4 * aux * *ce)) /2* aux;
      *be = (-(*be) - sqrt (*be * *be -4 * aux * *ce)) /2* aux;
   }
}


El programa funciona correctamente para operaciones como a=1,b=2,c=-3 ; pero pierde su efectividad al tratarse de números más grandes.

Por ejemplo...

Código: Seleccionar todo
                Ecuacion cuadratica

Coeficiente a: 1
Coeficiente b: 2
Coeficiente c: -3
Las soluciones son: 1.000 y -3.000.

Lo que es correcto, pero...

Código: Seleccionar todo
                Ecuacion cuadratica

Coeficiente a: 3
Coeficiente b: 4
Coeficiente c: -5
Las soluciones son: 7.077 y -19.077

Siendo que las soluciones son 0.78 y -2.11


Ojalá me puedan ayudar. :-D
Avatar de Usuario
Alquimia
Nivel 2
 
Mensajes: 89
Registrado: May 2009, 01:46
Ubicación: Temuco, Chile.
Twitter: @alexissaavedra

Re: Duda, Programación en C: Trabajo con Punteros

Notapor elQuique » Sep 2009, 23:30

Debe ser, o es más bien es un problema de redondeo, quizás debas usar un tipo de variable de más precisión.

Fíjate en 32 o 64bits, si soporta tu compilador y procesador, y en los dígitos de precisión:

Imagen
Avatar de Usuario
elQuique
Moderador
 
Mensajes: 2024
Registrado: May 2009, 18:43
Ubicación: Florida, Uruguay
Twitter: @elQuique

Re: Duda, Programación en C: Trabajo con Punteros

Notapor Alquimia » Sep 2009, 02:04

Lo primero que hice fue cambiar todos los float por double, pero la combinación (1,2,-3) me devuelve que tiene raíces complejas :-S, luego los pasé a long double y obtengo resultados erróneos...
He probado el código en Windows, con Dev-C++ y en Linux con gcc, la verdad que ya no tengo ni idea qué puedo hacer. :-S
Avatar de Usuario
Alquimia
Nivel 2
 
Mensajes: 89
Registrado: May 2009, 01:46
Ubicación: Temuco, Chile.
Twitter: @alexissaavedra

Re: Duda, Programación en C: Trabajo con Punteros

Notapor Alquimia » Sep 2009, 00:43

Al final era una estupidez....

Estaba dividiendo por 2 y multiplicando por a, en vez de dividir por 2a....

En esa parte había que poner (2 * a) y se solucionaba. xD !!!
Avatar de Usuario
Alquimia
Nivel 2
 
Mensajes: 89
Registrado: May 2009, 01:46
Ubicación: Temuco, Chile.
Twitter: @alexissaavedra

Re: Duda, Programación en C: Trabajo con Punteros

Notapor elQuique » Sep 2009, 08:58

jaja :P
Avatar de Usuario
elQuique
Moderador
 
Mensajes: 2024
Registrado: May 2009, 18:43
Ubicación: Florida, Uruguay
Twitter: @elQuique

Re: Duda, Programación en C: Trabajo con Punteros

Notapor Link » Oct 2010, 18:25

Porque no lo haces mas sencillo usando cout y cin?
Aparte, si lo corres en DEV-C++ no funciona en codigo fuente ;)
Declaras "float funcion (float *a, float *b, float *c);" fuera del programa consecutivo, y tienes que declarar afuera primero "int main(int argc, char *argv[])" y dentro declarar ahora sí "float funcion (float *a, float *b, float *c);"
Otra, usas caracteres, y dejas afuera el system("PAUSE"); return EXIT_SUCCESS;
Al usar caracteres como tu programa, para un pause de pantalla se muestra return PID; y tu no lo hiciste...
Imagen
Imagen
Imagen
Imagen
Avatar de Usuario
Link
Nivel 2
 
Mensajes: 47
Registrado: May 2009, 20:14
Ubicación: México
Twitter: @





¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron