PDA

View Full Version : Error logico o de sintaxis en C ?


nanohueso
05-05-2011, 10:43 AM
hola amigos, toy tratando de hacer una funcion que haga la cuadratica ( todos la hemos visto en la secundaria jaja y que devuelva , 1 en caso de q la raices sean iguales, 2 si hay 2 raices distintas , 0 si no hay raices y -1 en caso de que haya raices infinitas.

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

float Raices (float, float, float);

float a=0, b=0, c=0;

int main(void)

{

printf("Ingrese el valor de a:",a);
scanf("%f", &a);

printf("Ingrese el valor de b:",b);
scanf("%f", &b);

printf("Ingrese el valor de c:",c);
scanf("%f", &c);

Raices(a, b, c);

return 0;
}

float Raices (float a, float b, float c)

{

float x1=0, x2=0;

x1= (- b + sqrt((b * b)- (4 * a * c)))/(2 * a);

x2= (- b - sqrt((b * b)- (4 * a * c)))/(2 * a);


if(a=0, b=0, c=0)
{
return -1;
}
else if((b * b)- (4 * a * c)<0)
{
return 0;
}
else if(x1==x2)
{
return 1;
}
else if(x1 =! x2)
{
return 2;
}
}

Cuando compilo no me tira ningun error de sintaxis , ahora cuando ejecuto , bueno , me pone ingresa a, b , c y dps de ingresar c , se termina ahi el programa.. , nose porque .. meti los if con sus return respectivos...

cual podria llegar a ser el problema?!

Saludos a todos!

ulisessoad
05-05-2011, 10:50 AM
huy c no vi, pero no es como pascal que le tenias que meter un readln; vacio como para que tengas que tocar una tecla para que no se borre el resultado?, proba ocn un print vacio asi desde mi ignorancia en c digo

nanohueso
05-05-2011, 10:58 AM
huy c no vi, pero no es como pascal que le tenias que meter un readln; vacio como para que tengas que tocar una tecla para que no se borre el resultado?, proba ocn un print vacio asi desde mi ignorancia en c digo

le mande un printf("Hay % tantas raices"); arriba del primer if pero me tira "Hay -0.000 raices" :S

areanfg
05-05-2011, 11:01 AM
La instrucción de salto return es utilizada en lenguaje C para indicar el valor de retorno de una función. Por tanto, vamos a hacer uso de la instrucción return cuando definamos subprogramas de tipo función, que estudiaremos en el apartado 5. Llamadas a subprogramas.

no se si te sirve. segun entiendo, no va a devolver un valor en pantalla, sino un valor a una función.

nanohueso
05-05-2011, 11:03 AM
no se si te sirve. segun entiendo, no va a devolver un valor en pantalla, sino un valor a una función.

tiene sentido lo que decis , recien probe metiendo un printf adentro de cada if , pero resulto igual...
tengo que asignar una variable a esos valores y dps imprimir en pantalla esa variable el tema es q son 4 valores.. :S

donduacho
05-05-2011, 11:07 AM
conseguite el programa wolfram mathematica que te resuelve lo que se te ocurra de matematicas y bajate el manual. si queres conectate que te lo paso:)

nanohueso
05-05-2011, 11:11 AM
conseguite el programa wolfram mathematica que te resuelve lo que se te ocurra de matematicas y bajate el manual. si queres conectate que te lo paso:)

ahi me conect

donduacho
05-05-2011, 11:15 AM
ahi me conect

no sirve porque yo pense que tenias que resolver una ecuacion y te pusiste a travesear a ver como se programaba, no sabia era para un trabajo de programacion:doh!: :doh!: :doh!: :doh!: :doh!: :D :D :D :D :D :D

hernang
05-05-2011, 12:35 PM
C nunca estudié pero fijate esto:
al hacer 2 * a estás multiplicando un integer con un float, se puede hacer esto directamente?
ni bien entres a la función imprimí a, b y c para ver si te llegan bien, antes de hacer otra cosa

edit: en el primer if, para comparar a=0 no tendría que ser a==0?
Qué estarían haciendo las "," acá if(a=0, b=0, c=0)?
Probá así, if(a==0 && b==0 && c==0)


Una cosa más, por un tema de orden, podés crear una variable integer, dentro de cada if ponés por ejemplo resultado=-1, resultado=2, etc
Al salir de los if, ponés return resultado;
El funcionamiento es el mismo pero se recomienda tener un return solo por función

otro edit :p
ojo en la función al hacer /(2 * a), si a es 0 no va a andar, NO se puede dividir por 0, tendrías que preguntarlo antes

tincho85
05-05-2011, 01:05 PM
Para mi algun problema de codigo tenes, dejame investigarlo bien y te digo.
Para poder seguir viendo la ventana del programa sin q se te cierre, abajo del return 0; tenes q poner un getch();

Un saludo

EDIT:

Si lo corres paso a paso y ves el contenido de las variables para ver si te almacena algo¿?


#include <stdio.h>
#include <conio.h>
#define DET ((b * b)-(4 * a * c))

float Raices (float, float, float);

float a=0, b=0, c=0, R;

int main(void)
{
printf("Ingrese el valor de a:",a);
scanf("%f", &a);

printf("Ingrese el valor de b:",b);
scanf("%f", &b);

printf("Ingrese el valor de c:",c);
scanf("%f", &c);

R=Raices(a, b, c);
printf("%f", R);
getch();
return 0;
}

float Raices (float a, float b, float c)

{
if (DET > 0)
return 2;
if (DET == 0)
return 1;
if (DET < 0)
return -1;
else
return 0;

}

El problema q vi es q nunca imprimias el resultado x eso no lo veias :doh!:

nanohueso
05-05-2011, 04:02 PM
C nunca estudié pero fijate esto:
al hacer 2 * a estás multiplicando un integer con un float, se puede hacer esto directamente?
ni bien entres a la función imprimí a, b y c para ver si te llegan bien, antes de hacer otra cosa

edit: en el primer if, para comparar a=0 no tendría que ser a==0?
Qué estarían haciendo las "," acá if(a=0, b=0, c=0)?
Probá así, if(a==0 && b==0 && c==0)


Una cosa más, por un tema de orden, podés crear una variable integer, dentro de cada if ponés por ejemplo resultado=-1, resultado=2, etc
Al salir de los if, ponés return resultado;
El funcionamiento es el mismo pero se recomienda tener un return solo por función

otro edit :p
ojo en la función al hacer /(2 * a), si a es 0 no va a andar, NO se puede dividir por 0, tendrías que preguntarlo antes


te hice caso en varias cosas, mira, lo deje asi


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

float Raices (float, float, float);

float a=0, b=0, c=0;

int main(void)

{

printf("Ingrese el valor de a:",a);
scanf("%f", &a);

printf("Ingrese el valor de b:",b);
scanf("%f", &b);

printf("Ingrese el valor de c:",c);
scanf("%f", &c);

Raices(a, b, c);

return 0;
}

float Raices (float a, float b, float c)

{

float x1=0, x2=0;
int resultado;
x1= (- b + sqrt((b * b)- (4 * a * c)))/(2 * a);

x2= (- b - sqrt((b * b)- (4 * a * c)))/(2 * a);

printf("",resultado);

if(a==0, b==0, c==0)
{
resultado=-1;
return resultado;
}
else if((b * b)- (4 * a * c)<0)
{
resultado=0;
return resultado;
}
else if(x1==x2)
{
resultado=1;
return resultado;
}
else if(x1 != x2)
{
resultado=2;
return resultado;
}
}

Me sigue pasando lo mismo, cuando compilo todo OK , ahora cuando ejecuto , ingreso a,b,c y despues de mandar el enter para ingresar el valor de c se termina el programa ahi...

The Big Praf
05-05-2011, 10:05 PM
No la tengo clara con C, pero a modo de debugear mejor, yo probaría con lo siguiente:


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

/*primero defino las variables, luego la funcion que calcula las raices y luego el main (viejos recuerdos de pascal)*/

float a=0, b=0, c=0;
float x=0; /*esta variable es la que va a almacenar el resultado de la operacion*/

float Raices (float a, float b, float c)

{

float x1=0, x2=0;
/* si mi jefe ve estas variables me mata jejje */
float y1=0, y2=0, y3=0, y4=0, y5=0;
int resultado;
/*primero valida que a no sea cero, por las dudas*/
if(a!=0)
{

y1 = (b * b);
y2 = (4 * a * c);
y3 = (2 * a);
y4 = sqrt(y1 - y2);
y5 = (-b + y4);
x1= y5/y3;

/* ahora imprimo todo para ver como vienen las variables */
printf("Y1 vale = ",y1);
printf("Y2 vale = ",y2);
printf("Y3 vale = ",y3);
printf("Y4 vale = ",y4);
printf("Y5 vale = ",y5);
printf("x1 vale = ",x1);

y1 = (b * b);
y2 = (4 * a * c);
y3 = (2 * a);
y4 = sqrt(y1 - y2);
y5 = (-b - y4);
x2= y5/y3;

printf("Y1 vale = ",y1);
printf("Y2 vale = ",y2);
printf("Y3 vale = ",y3);
printf("Y4 vale = ",y4);
printf("Y5 vale = ",y5);
printf("x2 vale = ",x2);
}

printf("",resultado);

if(a==0, b==0, c==0)
{
resultado=-1;
}
else if((b * b)- (4 * a * c)<0)
{
resultado=0;
}
else if(x1==x2)
{
resultado=1;
}
else if(x1 != x2)
{
resultado=2;
}


return resultado;
}


int main(void)

{

printf("Ingrese el valor de a:",a);
scanf("%f", &a);

printf("Ingrese el valor de b:",b);
scanf("%f", &b);

printf("Ingrese el valor de c:",c);
scanf("%f", &c);

/*asigno el resultado de la funcion a la variable y luego la imprimo en pantalla. Esto me parece lo mas importante*/
x = Raices(a, b, c);
printf("El resultado de la operación es: ",x);

/* esto es, como te dijeron antes, para que el programa no termine y puedas ver el resultado*/
scanf("%f", &c);

return 0;
}




Despues contanos si te sirvió de algo

nanohueso
05-05-2011, 10:22 PM
No la tengo clara con C, pero a modo de debugear mejor, yo probaría con lo siguiente:


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

/*primero defino las variables, luego la funcion que calcula las raices y luego el main (viejos recuerdos de pascal)*/

float a=0, b=0, c=0;
float x=0; /*esta variable es la que va a almacenar el resultado de la operacion*/

float Raices (float a, float b, float c)

{

float x1=0, x2=0;
/* si mi jefe ve estas variables me mata jejje */
float y1=0, y2=0, y3=0, y4=0, y5=0;
int resultado;
/*primero valida que a no sea cero, por las dudas*/
if(a!=0)
{

y1 = (b * b);
y2 = (4 * a * c);
y3 = (2 * a);
y4 = sqrt(y1 - y2);
y5 = (-b + y4);
x1= y5/y3;

/* ahora imprimo todo para ver como vienen las variables */
printf("Y1 vale = ",y1);
printf("Y2 vale = ",y2);
printf("Y3 vale = ",y3);
printf("Y4 vale = ",y4);
printf("Y5 vale = ",y5);
printf("x1 vale = ",x1);

y1 = (b * b);
y2 = (4 * a * c);
y3 = (2 * a);
y4 = sqrt(y1 - y2);
y5 = (-b - y4);
x2= y5/y3;

printf("Y1 vale = ",y1);
printf("Y2 vale = ",y2);
printf("Y3 vale = ",y3);
printf("Y4 vale = ",y4);
printf("Y5 vale = ",y5);
printf("x2 vale = ",x2);
}

printf("",resultado);

if(a==0, b==0, c==0)
{
resultado=-1;
}
else if((b * b)- (4 * a * c)<0)
{
resultado=0;
}
else if(x1==x2)
{
resultado=1;
}
else if(x1 != x2)
{
resultado=2;
}


return resultado;
}


int main(void)

{

printf("Ingrese el valor de a:",a);
scanf("%f", &a);

printf("Ingrese el valor de b:",b);
scanf("%f", &b);

printf("Ingrese el valor de c:",c);
scanf("%f", &c);

/*asigno el resultado de la funcion a la variable y luego la imprimo en pantalla. Esto me parece lo mas importante*/
x = Raices(a, b, c);
printf("El resultado de la operación es: ",x);

/* esto es, como te dijeron antes, para que el programa no termine y puedas ver el resultado*/
scanf("%f", &c);

return 0;
}




Despues contanos si te sirvió de algo

esta bien , aunque algunas cosas no las entiendo

yo transforme bastante la funcion, aunque me da un resultado que no es el que me tiene que dar jajaja


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

float Raices (float, float, float);
float cantidad(float, float);
float a=0, b=0, c=0, x1=0, x2=0;

int main(void)

{

printf("Ingrese el valor de a:",a);
scanf("%f", &a);

printf("Ingrese el valor de b:",b);
scanf("%f", &b);

printf("Ingrese el valor de c:",c);
scanf("%f", &c);

Raices(a, b, c);

cantidad(x1, x2);
printf("Hay %d cantidad de raices ",cantidad);

return 0;
}

float Raices (float a, float b, float c)

{

float x1=0, x2=0;

x1= (- b + sqrt((b * b)- (4 * a * c)))/(2 * a);

x2= (- b - sqrt((b * b)- (4 * a * c)))/(2 * a);

printf("Las raices son %f y %f \n", x1,x2);
}

float cantidad(float x1, float x2)
{
int resultado;

if(a==0, b==0, c==0)
{
resultado=-1;
return resultado;
}
else if((b * b)- (4 * a * c)<0)
{
resultado= 0;
return resultado;
}
else if(x1==x2)
{
resultado= 1;
return resultado;
}
else if(x1 != x2)
{
resultado= 2;
return resultado;
}

return resultado;
}

The Big Praf
05-05-2011, 10:32 PM
Te comento algunas cosas:

Primero que nada, las variables que definis adentro de una funcion (como X1 y X2) solo se pueden utilizar dentro de esa función
Cuando llamas a la función cantidad y le pasas x1 y x2, le estas dos ceros, porque los valores que le cargaste a las variables x1 y x2 dentro de la función Raices, se los cargaste a las variables que declaraste dentro de esa función.

Mejor comentame que no entendiste del código que te puse, asi te guío un poco mas.

nanohueso
06-05-2011, 10:07 AM
Para mi algun problema de codigo tenes, dejame investigarlo bien y te digo.
Para poder seguir viendo la ventana del programa sin q se te cierre, abajo del return 0; tenes q poner un getch();

Un saludo

EDIT:

Si lo corres paso a paso y ves el contenido de las variables para ver si te almacena algo¿?


#include <stdio.h>
#include <conio.h>
#define DET ((b * b)-(4 * a * c))

float Raices (float, float, float);

float a=0, b=0, c=0, R;

int main(void)
{
printf("Ingrese el valor de a:",a);
scanf("%f", &a);

printf("Ingrese el valor de b:",b);
scanf("%f", &b);

printf("Ingrese el valor de c:",c);
scanf("%f", &c);

R=Raices(a, b, c);
printf("%f", R);
getch();
return 0;
}

float Raices (float a, float b, float c)

{
if (DET > 0)
return 2;
if (DET == 0)
return 1;
if (DET < 0)
return -1;
else
return 0;

}

El problema q vi es q nunca imprimias el resultado x eso no lo veias :doh!:

tincho, me gusto muchisismo el que hiciste vos, es mas simplificador, lo que si no entiendo algo..

cuando pones
#define DET ((b * b)-(4 * a * c))
es una forma de declarar variable??...

edit: para que es el getch() y como funciona..?

Saludos.

nanohueso
06-05-2011, 12:35 PM
y en buena hora, saque el programa :D

#include <stdio.h>
#define DET ((b * b)-(4 * a * c))

float Raices (float, float, float);

float a, b, c, R;

int main(void)
{
printf("Ingrese el valor de a:",a);
scanf("%f", &a);

printf("Ingrese el valor de b:",b);
scanf("%f", &b);

printf("Ingrese el valor de c:",c);
scanf("%f", &c);

R=Raices(a, b, c);
printf("Hay %f raices\n", R);

return 0;
}

float Raices (float a, float b, float c)

{
while(a!=0,b!=0,c!=0)
{
if(a==0 && b!=0 && c!=0)
return 9999;
if (DET > 0)
return 2;
if (DET == 0)
return 1;
if (DET < 0)
return 0;
}
return -1;
}

Lo unico que me quedo, es que cuando a vale 0 , y b y c son distintos de cero, le puse 9999 porqe no es funcion cuadratica, hay alguna manera de que ponga " No es funcion cuadratica",?? , si le meto printf , se me agrega al "Hay %f raices"...

alguyna idea para solucionar eso??


Respecto a lo demas, dan todo los valores bine :)

Abrazo para todos :P

The Big Praf
06-05-2011, 12:55 PM
Lo que podrías hacer es que devuelva un dato de tipo string (o un vector de char), y ahi devolves el número como si fuera texto o un texto diciendo que los datos ingresados no son validos

hernang
06-05-2011, 01:24 PM
nano te hago una pregunta, por qué pusiste un while dentro de la función Raices?

tincho85
06-05-2011, 01:44 PM
tincho, me gusto muchisismo el que hiciste vos, es mas simplificador, lo que si no entiendo algo..

cuando pones
#define DET ((b * b)-(4 * a * c))
es una forma de declarar variable??...

edit: para que es el getch() y como funciona..?

Saludos.

El #define es otra forma de definir algo. Puede ser una variable, o una expresion, como en este caso. El #define se llama "macro"
El getch es una funcion para tomar un caracter del teclado y no te lo muestra, si queres q te muestre el caracter leido, se usa getche();
Aclaracion: ambas estan en conio.h

y en buena hora, saque el programa :D

Lo unico que me quedo, es que cuando a vale 0 , y b y c son distintos de cero, le puse 9999 porqe no es funcion cuadratica, hay alguna manera de que ponga " No es funcion cuadratica",?? , si le meto printf , se me agrega al "Hay %f raices"...

alguyna idea para solucionar eso??

Una forma de solucionar eso, (rapida y facil, xq no tengo ganas de pensar mas :P) podria ser esta:
En el main despues q retorna la funcion es poner un if para preguntar por el resultado.


R=Raices(a, b, c);
if (R==9999)
printf("\nNo es funcion cuadratica\n");

nanohueso
06-05-2011, 01:46 PM
El #define es otra forma de definir algo. Puede ser una variable, o una expresion, como en este caso. El #define se llama "macro"
El getch es una funcion para tomar un caracter del teclado y no te lo muestra, si queres q te muestre el caracter leido, se usa getche();
Aclaracion: ambas estan en conio.h



Una forma de solucionar eso, (rapida y facil, xq no tengo ganas de pensar mas :P) podria ser esta:
En el main despues q retorna la funcion es poner un if para preguntar por el resultado.


R=Raices(a, b, c);
if (R==9999)
printf("\nNo es funcion cuadratica\n");

Diooos como no se me ocurrioo!! jajaj

gracias tincho , ahora si, se terrmino catabum :P

nanohueso
06-05-2011, 01:58 PM
ahora si , en hora BUENISIMA jajajaja

Programador: nanohueso

Se agradece la colaboracion de: tincho85,The Big Praf.

#include <stdio.h>
#define DET ((b * b)-(4 * a * c))

float Raices (float, float, float);

float a, b, c, R;

int main(void)
{
printf("Ingrese el valor de a:",a);
scanf("%f", &a);

printf("Ingrese el valor de b:",b);
scanf("%f", &b);

printf("Ingrese el valor de c:",c);
scanf("%f", &c);

R=Raices(a, b, c);

if(R==9999)
printf("No es una funcion cuadratica \n");
else
printf("Hay %f raices\n", R);

return 0;
}

float Raices (float a, float b, float c)

{
while(a!=0,b!=0,c!=0)
{
if(a==0 && b!=0 && c!=0)
return 9999;
if (DET > 0)
return 2;
if (DET == 0)
return 1;
if (DET < 0)
return 0;
}
return -1;
}

hernang
06-05-2011, 04:13 PM
Alguien que me explique qué hace ese while ahí :p

tincho85
06-05-2011, 04:28 PM
Alguien que me explique qué hace ese while ahí :p

Si, parece q esta al pedo xq la evaluacion de las variables las hace el if, pero (como decia confusio) si anda no lo arregles :p

hernang
06-05-2011, 06:09 PM
jaja sí no hay con qué darle a esa frase, igual vale la siguiente aclaración:

NANO EN EL PARCIAL NO SE TE OCURRA PONER UN WHILE AHÍ PORQUE TE DESAPRUEBAN!

nanohueso
07-05-2011, 08:09 PM
jaja sí no hay con qué darle a esa frase, igual vale la siguiente aclaración:

NANO EN EL PARCIAL NO SE TE OCURRA PONER UN WHILE AHÍ PORQUE TE DESAPRUEBAN!

porque me decis eso :o?

nanohueso
07-05-2011, 08:11 PM
puse el while como podria haber puesto otro if , es lo mismo, no me cambia , podria haber puesto,

if (a!=0,b!=0,c!=0)
return -1;

hernang
10-05-2011, 04:03 PM
El WHILE significa "mientras".
Mientras se cumpla la condición va a ejecutar el código, una o mil veces.

El IF en cambio se fija UNA VEZ en la condición, y ejecuta o no el código.

En tu ejercicio se dio que con las dos estructuras anda bien PERO para lo que vos querés hacer va un if. Justamente estas cosas son las que corrigen en los parciales, por eso te digo que le prestes más atención a esto y no tanto a las sumas y restas.