Autor Tema: Problemas en C

0 Usuarios y 1 Visitante están viendo este tema.

21 Noviembre, 2008, 10:32 pm
Leído 5374 veces

Lambda

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 348
  • Karma: +0/-0
  • Sexo: Masculino
Hola,

Acabo de comenzar a hacer prácticas con Code Blocks para C y me encuentro con una notable diferencia respecto al Scilab que era el programa que utilizaba hasta entonces.

Se me pide un programa que tengo creado para Scilab, pasarlo a C; lo tengo hecho pero a la hora de ejecutarlo me da problemas, puesto que una vez que sale de un ciclo si ya ha cumplido una condición no quiero que vuelva a entrar y lo hace.

El uso de {} me suele dar errores, pues creo que no las coloco bien.

Si alguien sugiere alguna idea, . . .

21 Noviembre, 2008, 10:36 pm
Respuesta #1

Gerardo Exequiel Pozzi

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 120
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Hola, mostrá ambos códigos en el foro, para que te podamos ayudar.

Eso sí, recordá por favor ubicar el código en entre las etiquetas [ code ] y [ /code ] y que estén bien indentados (espaciados) en lo posible.

¡Salut!

22 Noviembre, 2008, 10:21 pm
Respuesta #2

Lambda

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 348
  • Karma: +0/-0
  • Sexo: Masculino
En el siguiente caso, ¿cómo puedo hacer para no tener problemas con los signos para las siguientes operaciones?

Código: [Seleccionar]
printf("El resultado es %g + %gi  ,  %g  %gi \n", x, -im, x, im);


Gracias

23 Noviembre, 2008, 03:48 am
Respuesta #3

Gerardo Exequiel Pozzi

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 120
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
No te entiendo, ¿Cuál es el problema de signos?

Código: [Seleccionar]
printf("x1 = %f + i%f, x2 = %f - i%f\n", x, im, x, im);
cuando el discriminante es menor que cero, las raíces son complejas y conjugadas entre sí, o sea \( a + ib \)  y \( a -ib \)

23 Noviembre, 2008, 12:45 pm
Respuesta #4

Lambda

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 348
  • Karma: +0/-0
  • Sexo: Masculino
El problema es que si la solución es 1 - 1,7i y 1 + 1,7i, lo que se obtiene es:

1 - +1,7i  y 1 + +1,7i

Yo lo consigo corregir con los signos; pero entonces es con otro ejemplo con lo que falla; el ejemplo de a=1; b=4; c=5.

23 Noviembre, 2008, 03:45 pm
Respuesta #5

Gerardo Exequiel Pozzi

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 120
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
¿pero copiaste el ejemplo modificado del tuyo que yo te puse?

¿Cuáles son los que provocan la falla? La raíz siempre es positiva.

Código: [Seleccionar]
#include <stdio.h>
#include <math.h>

int main()
{
    double a, b, c, x1, x2, x, im, discriminante;

    printf("Introducir el valor de a donde a es el coeficiente que acompaña a x^2\n");
    scanf("%lf",&a);
    printf("Introducir el valor de b donde b es el coeficiente que acompaña a x\n");
    scanf("%lf",&b);
    printf("Introducir el valor de c donde c es el término independiente\n");
    scanf("%lf",&c);

    discriminante = b*b-4*a*c;
    printf("Discriminante = %f\n", discriminante);

    if (discriminante == 0) {
        x1 = x2 = -b/(2*a);
        printf("x1 = %f, x2 = %f\n", x1, x2);
    } else if (discriminante > 0) {
        x1 = (-b + sqrt(discriminante))/(2*a);
        x2 = (-b - sqrt(discriminante))/(2*a);
        printf("x1 = %f, x2 = %f\n", x1, x2);
    } else {
        x = -b/(2*a);
        im = sqrt(-discriminante)/(2*a);
        printf("x1 = %f + i%f, x2 = %f - i%f\n", x, im, x, im);
    }

    return 0;
}

ejecutándolo, un ejemplo de los tres casos:
Código: [Seleccionar]
$ cuad
Introducir el valor de a donde a es el coeficiente que acompaña a x^2
9
Introducir el valor de b donde b es el coeficiente que acompaña a x
12
Introducir el valor de c donde c es el término independiente
4
Discriminante = 0.000000
x1 = -0.666667, x2 = -0.666667

Código: [Seleccionar]
$ cuad
Introducir el valor de a donde a es el coeficiente que acompaña a x^2
3
Introducir el valor de b donde b es el coeficiente que acompaña a x
-1
Introducir el valor de c donde c es el término independiente
-2
Discriminante = 25.000000
x1 = 1.000000, x2 = -0.666667

Código: [Seleccionar]
$ cuad
Introducir el valor de a donde a es el coeficiente que acompaña a x^2
1
Introducir el valor de b donde b es el coeficiente que acompaña a x
1
Introducir el valor de c donde c es el término independiente
1
Discriminante = -3.000000
x1 = -0.500000 + i0.866025, x2 = -0.500000 - i0.866025


con los datos que vos me das:

Código: [Seleccionar]
$ cuad
Introducir el valor de a donde a es el coeficiente que acompaña a x^2
1
Introducir el valor de b donde b es el coeficiente que acompaña a x
4
Introducir el valor de c donde c es el término independiente
5
Discriminante = -4.000000
x1 = -2.000000 + i1.000000, x2 = -2.000000 - i1.000000





Es el siguiente el ejercicio:

Código: [Seleccionar]
#include <stdio.h>
#include<math.h>

int main()
{
{
double a,b,c,x,x1,x2,x3,x4;
printf("Introducir el valor de a donde a es el coeficiente que acompaña a x^2\n");
scanf("%lf",&a);
printf("Introducir el valor de b donde b es el coeficiente que acompaña a x\n");
scanf("%lf",&b);
printf("Introducir el valor de c donde c es el término independiente\n");
scanf("%lf",&c);

if(a==0){
x=-b/c;printf("el resultado es %lf",x);
}
else{
x1=(-b+sqrt(b*b-4*a*c))/2*a ;
x2=(-b-sqrt(b*b-4*a*c))/2*a ;
}

if(b*b-4*a*c==0){
printf("el resultado es %lg",x1);
}
else if ((b*b-4*a*c)>0){
printf("el resultado es %lg y %lg",x1,x2);
}
else if((b*b-4*a*c)<0){
x3=(-b/(2*a));
x4=(sqrt(4*a*c-b*b)/(2*a));
}

else if(b==0 && x4==1){
printf (" el resultado es +i y -i\n");
}
else if(b==0){
printf("el resultado es +%lgi y -%lgi\n",x4,x4);
}
else if(x4==1){
printf("el resultado es %lg +i y %lg -i\n",x3,x3);
}
else if(x4<0){
printf("el resultado es %lg + %lgi y %lg %lgi\n",x3,-x4,x3,x4);
}
else{
printf("el resultado es %lg + %lgi y %lg - %lgi\n",x3,x4,x3,x4);
}
}

return 0;

}




Esto es en C, y en Scilab me funcionaba con lo siguiente:




Código: [Seleccionar]
function raices
printf("introducir el valor de a donde a es el coeficiente que acompaña a x^2")
a=scanf("%d\n")
printf("introducir el valor de b donde b es el coeficiente que acompaña a x")
b=scanf("%d\n")
printf("introducir el valor de c donde c es el coeficiente que acompaña a x^0")
c=scanf("%d\n")
if (a==0)
  x=-b/c
printf("el resultado es %g",x)
else
  x1=(-b+sqrt(b^2-4*a*c))/2*a
  x2=(-b-sqrt(b^2-4*a*c))/2*a
  if(b^2-4*a*c==0)
  printf("el resultado es %g",x1)
     elseif((b^2-4*a*c)>0)
     printf("el resultado es %g y %g",x1,x2)
     elseif((b^2-4*a*c)<0)
     x3=(-b/(2*a))
     x4=(sqrt(4*a*c-b^2))/(2*a)
        if (b==0)& (x4==1)
           printf("el resultado es +i y -i\n")
           elseif(b==0)
           printf("el resultado es +%gi y -%gi\n",x4,x4)
        elseif (x4==1)
        printf("el resultado es %g + i y %g -i\n",x3,x3)
        elseif(x4<0)
        printf("el resultado es %g + %gi y %g %gi\n",x3,-x4,x3,x4)
        else
        printf("el resultado es %g+%gi y %g-%gi\n",x3,x4,x3,x4)
        end
   end
end
endfunction

23 Noviembre, 2008, 04:00 pm
Respuesta #6

Lambda

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 348
  • Karma: +0/-0
  • Sexo: Masculino
Prueba con -1,2,-4 y verás el problema.

Además se me pide que si la parte "real" es 0 que no aparezca; y que si es 1 la parte imaginaria que acompaña a i, que no aparezca el 1.

Por eso decía que me daba problemas.

Saludos,

23 Noviembre, 2008, 04:12 pm
Respuesta #7

Gerardo Exequiel Pozzi

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 120
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Bueno, hay muchas opciones, por ejemplo:
Código: [Seleccionar]
#include <stdio.h>
#include <math.h>

int main()
{
    double a, b, c, x1, x2, re, im, discriminante;

    printf("Introducir el valor de a donde a es el coeficiente que acompaña a x^2\n");
    scanf("%lf",&a);
    printf("Introducir el valor de b donde b es el coeficiente que acompaña a x\n");
    scanf("%lf",&b);
    printf("Introducir el valor de c donde c es el término independiente\n");
    scanf("%lf",&c);

    discriminante = b*b-4*a*c;
    printf("Discriminante = %f\n", discriminante);

    if (discriminante == 0) {
        x1 = x2 = -b/(2*a);
        printf("x1 = %f, x2 = %f\n", x1, x2);
    } else if (discriminante > 0) {
        x1 = (-b + sqrt(discriminante))/(2*a);
        x2 = (-b - sqrt(discriminante))/(2*a);
        printf("x1 = %f, x2 = %f\n", x1, x2);
    } else {
        re = -b/(2*a);
        im = sqrt(-discriminante)/(2*a);
        if (re == 0)
            printf("x1 = %f + i%f, x2 = %f - i%f\n", re, fabs(im), re, fabs(im));
        else if (im == 1)
            printf("x1 = %f + i, x2 = %f - i\n", re, re);
        else
            printf("x1 = %f + i%f, x2 = %f - i%f\n", re, fabs(im), re, fabs(im));
    }

    return 0;
}

Código: [Seleccionar]
$ cuad
Introducir el valor de a donde a es el coeficiente que acompaña a x^2
-1
Introducir el valor de b donde b es el coeficiente que acompaña a x
2
Introducir el valor de c donde c es el término independiente
-4
Discriminante = -12.000000
x1 = 1.000000 + i1.732051, x2 = 1.000000 - i1.732051

Código: [Seleccionar]
$ cuad
Introducir el valor de a donde a es el coeficiente que acompaña a x^2
1
Introducir el valor de b donde b es el coeficiente que acompaña a x
4
Introducir el valor de c donde c es el término independiente
5
Discriminante = -4.000000
x1 = -2.000000 + i, x2 = -2.000000 - i

¿Ahora si?

23 Noviembre, 2008, 04:55 pm
Respuesta #8

Lambda

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 348
  • Karma: +0/-0
  • Sexo: Masculino
Vale de acuerdo, desconocía la función fabs que supongo que será "valor absoluto" ¿no?

Muchas gracias por su dedicación.

23 Noviembre, 2008, 05:29 pm
Respuesta #9

Gerardo Exequiel Pozzi

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 120
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Por nada.

Sí, fabs() es valor absoluto de un número en punto flotante.