Duda, Programación en C: Trabajo con Punteros

HTML, CSS, PHP, JavaScript, Java... tus dudas por aquí...
Responder
Avatar de Usuario
Alquimia
Nivel 2
Mensajes: 89
Registrado: 08 May 2009, 01:46
Twitter: @alexissaavedra
Ubicación: Temuco, Chile.
Contactar:

Duda, Programación en C: Trabajo con Punteros

Mensaje por Alquimia »

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
elQuique
Moderador
Mensajes: 2227
Registrado: 05 May 2009, 18:43
Twitter: @elQuique
Ubicación: Florida, Uruguay
Contactar:

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

Mensaje por elQuique »

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
Alquimia
Nivel 2
Mensajes: 89
Registrado: 08 May 2009, 01:46
Twitter: @alexissaavedra
Ubicación: Temuco, Chile.
Contactar:

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

Mensaje por Alquimia »

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: 08 May 2009, 01:46
Twitter: @alexissaavedra
Ubicación: Temuco, Chile.
Contactar:

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

Mensaje por Alquimia »

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
elQuique
Moderador
Mensajes: 2227
Registrado: 05 May 2009, 18:43
Twitter: @elQuique
Ubicación: Florida, Uruguay
Contactar:

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

Mensaje por elQuique »

jaja :P
Avatar de Usuario
Link
Nivel 2
Mensajes: 46
Registrado: 08 May 2009, 20:14
Twitter: @
Ubicación: México

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

Mensaje por Link »

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...
Responder