elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Empezando con C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Empezando con C  (Leído 2,577 veces)
AlexioZ

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Empezando con C
« en: 18 Agosto 2010, 14:34 pm »

Buenas a todos. Antes de nada presentarme ya que soy nuevo en el foro.

Estoy empezando un curso de C y la verdad esque para empezar tengo la siguiente duda y espero que me echeis una mano.

Tengo que escribir el codigo necesario para sacar por pantalla la siguiente expresión con su respectiva solución:

[(bb) - (4ac)] / 2a

Empiezo con el código:
Código:

#include <stdio.h>

main()
{
      int a, b, c;
      float x;
           
      a = 1;
      b = 5;
      c = 2;
     
      // Cuenta
     
      x = ( ( b * b ) - ( 4 * a * c ) ) / ( 2 * a ) ;
      printf ("( %d * %d ) - ( %d * %d * %d ) ) / ( %d * %d ) = %d ", b, b, 4, a, c, 2, a, x); 
                 
      }


La duda es la siguiente:

Al declarar la variable tipo real "x" ( Float ) pretendo que me de como resultado un REAL, y al ejecutar el programa lo que me da es 0 patatero, jajaja. "x = 0"
Pero al declarar la variable X como un entero ( INT ) si que me da el resultado que quiero x = 8 ( que es el resultado final de la expresión sin su parte decimal ) pero lo quiero con parte decimal. ¿ Que estoy haciendo mal ?

Gracias de antemano x las contestaciones.

Un saludo.



En línea

Gallu

Desconectado Desconectado

Mensajes: 247



Ver Perfil
Re: Empezando con C
« Respuesta #1 en: 18 Agosto 2010, 14:56 pm »

simplemente has de cambiar el formato , estás usando el '%d' para escribir x , si pones  '%g' te lo va a mostrar bien .


En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
AlexioZ

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Empezando con C
« Respuesta #2 en: 18 Agosto 2010, 15:02 pm »

simplemente has de cambiar el formato , estás usando el '%d' para escribir x , si pones  '%g' te lo va a mostrar bien .


Tienes razón en parte. cambiando el valor de '%d' perteneciente a la 'x' por '%g' me sigue dando un valor entero. Al menos ya no es 0 sino 8, pero sigue siendo un entero... y la solución a la expresión es 17/2... que es un real.

Código:
printf("(%d*%d)-(%d*%d*%d))/(%d*%d)=%g", b, b, 4, a, c, 2, a, x); 

Gracias por la contestación.

Alguna sugerencia más?
« Última modificación: 18 Agosto 2010, 15:05 pm por AlexioZ » En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Empezando con C
« Respuesta #3 en: 18 Agosto 2010, 16:56 pm »

¡Buenas!

Solo una cosa sobre los operadores aritmeticos. Todas las operaciones las estas haciendo con numeros enteros. En este caso no importa porque el resultado tambien es un numero entero, pero si el resultado fuese un numero con decimales, al trabajar solo con enteros, la parte decimal desapareceria. Para que las operaciones sean entre numeros reales tendrias que convertir alguno de los numeros a float, por ejemplo, de esta forma el compilador convertiria el resto de los numeros a reales y el resultado seria tambien real.

Podrias hacer por ejemplo:
Código
  1. x = ( ( b * b ) - ( 4. * a * c ) ) / ( 2. * a ) ;
  2. x = ( (float) ( ( b * b ) - ( 4 * a * c ) ) ) / ( 2 * a ) ;
  3. x = ( ( b * b ) - ( 4 * a * c ) ) / ( (float) ( 2 * a )) ;
  4.  

Cualquiera de las formas anteriores es esquivalente a las otras. El hecho de poner un punto despues de un numero, indica que es real. Es equivalente a poner por ejemplo 2.0...

Espero que te haya quedado claro.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Empezando con C
« Respuesta #4 en: 18 Agosto 2010, 17:21 pm »

Es más eficiente si declaras e inicializas las variables, en este caso las variables int.
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
AlexioZ

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Empezando con C
« Respuesta #5 en: 18 Agosto 2010, 20:11 pm »

¡Buenas!

Solo una cosa sobre los operadores aritmeticos. Todas las operaciones las estas haciendo con numeros enteros. En este caso no importa porque el resultado tambien es un numero entero, pero si el resultado fuese un numero con decimales, al trabajar solo con enteros, la parte decimal desapareceria. Para que las operaciones sean entre numeros reales tendrias que convertir alguno de los numeros a float, por ejemplo, de esta forma el compilador convertiria el resto de los numeros a reales y el resultado seria tambien real.

Podrias hacer por ejemplo:
Código
  1. x = ( ( b * b ) - ( 4. * a * c ) ) / ( 2. * a ) ;
  2. x = ( (float) ( ( b * b ) - ( 4 * a * c ) ) ) / ( 2 * a ) ;
  3. x = ( ( b * b ) - ( 4 * a * c ) ) / ( (float) ( 2 * a )) ;
  4.  

Cualquiera de las formas anteriores es esquivalente a las otras. El hecho de poner un punto despues de un numero, indica que es real. Es equivalente a poner por ejemplo 2.0...

Espero que te haya quedado claro.

¡Saludos!

Muchas gracias do-while, tu aclaración resolvió mi problema. Pero me acarreao otra duda.

En el manual que estoy siguiendo ( Curso de programación en C/C++ por Juan Ceballos de la editorial RA-MA) dice claramente que en una operación aritmetica en la cual operamos con distintos tipos ( int y float en este caso ) siempre retorna al tipo mas exacto (en este caso al float). Si yo declare la variable 'x' como float me deberá retornar un valor REAL no? sin necesidad de 'indicarle' al compilador en la operación que me ponga por ejemplo la primera parte como Real (x = ( (float) ( ( b * b ) - ( 4 * a * c ) ) ) / ( 2 * a ) ;). Aunque bueno, quizás esa parte no la haya comprendido del todo y quiera decir lo que tu propones aquí.


Nota: hace un ratito que puse este mensaje y estuve dandole vueltas al asunto y llego a la conclusión de que:

Por mucho que indique que 'x' es de tipo float, siempre que 'x' lo iguale en una operación aritmetica a numeros enteros, me retornará un entero, ya que un entero es un numero real [float ( int) ] (float contiene a int ). Por lo tanto en la expresión debo indicar alguno de los parámetros como Reales para que me retorne un REAL como bien dices.

Es más o menos así ¿no?
« Última modificación: 18 Agosto 2010, 20:18 pm por AlexioZ » En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Empezando con C
« Respuesta #6 en: 19 Agosto 2010, 00:06 am »

Por mucho que indique que 'x' es de tipo float, siempre que 'x' lo iguale en una operación aritmetica a numeros enteros, me retornará un entero, ya que un entero es un numero real [float ( int) ] (float contiene a int ). Por lo tanto en la expresión debo indicar alguno de los parámetros como Reales para que me retorne un REAL como bien dices.

Es más o menos así ¿no?

No, no confundas las cosas, son tipos de datos totalmente diferentes. Si bien el compilador se encarga de hacer las conversiones pertinentes, es buena práctica expresar dicha conversión explicitamente por nosotros.

Tu expresión debiera quedar así:

Código
  1. float x = ((b * b) - (4.0 * a * c)) / (2.0 * a);

Al poner 4.0 y 2.0, le ahorras al compilador tener que hacer la conversión.

Citar
Conversion of a signed integer to a float or double takes 4 - 16 clock cycles, depending
on the processor and the type of registers used.

Saludos.
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines