[Curso] Introducción a la programación en C (IV)

Moderadores: largeroliker, Kravenbcn, fidelcastro, cerealkiller, pspCaracas, m0skit0, LnD, ka69, zacky06

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5586
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

[Curso] Introducción a la programación en C (IV)

Mensajepor m0skit0 » 09 Oct 2009, 14:47

<< Anterior Siguiente >>

Ave María, ¿cuándo serás mía?

Seguimos pues con las variables. Como hemos dicho, a las variables se les puede modificar el valor que contienen (por eso se llaman variables). Vamos a ver un algunos ejemplos:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char *argv[])
{
  int edad_pedrito;
  int edad_josito;
 
  edad_pedrito = 5;
  edad_josito = 12;
  printf("Edad de Pedro hace tiempo: %d\n", edad_pedrito);
  printf("Edad de Jose hace tiempo: %d\n", edad_josito);

  edad_pedrito = 7;
  edad_josito = 14;
  printf("Edad de Pedro ahora: %d\n", edad_pedrito);
  printf("Edad de Jose ahora: %d\n", edad_josito);

  getch();
  return 0;
}


Primero veréis que ya no aparece #include <stdlib.h>. Esto es por el mero hecho de que no usamos ninguna función definida en ese fichero, por tanto nos sobra.

Código: Seleccionar todo

int edad_pedrito;
int edad_josito;


Ahora ya no asignamos las edades en la declaración. Esto significa que edad_pedrito y edad_josito tienen valores indefinidos (puede ser cualquier valor).

Código: Seleccionar todo

edad_pedrito = 5;
edad_josito = 12;


Aquí les asignamos valores. Estos valores sobreescriben los valores que hubiera anteriormente (los valores indefinidos).

Código: Seleccionar todo

edad_pedrito = 7;
edad_josito = 14;


De nuevo sobreescribimos los valores asignados anteriormente a edad_pedrito y edad_josito (5 y 12) por 7 y 14 respectivamente.

Evidentemente, sólo podemos asignar valores válidos según el tipo de la variable. Es decir:

Código: Seleccionar todo

edad_pedrito = "siete";


Sería incorrecto e ilegal, y el compilador nos daría un error en esta línea. Tampoco valdría

Código: Seleccionar todo

edad_pedrito = "17";


ya que al ponerlo entre comillas dobles estamos especificando que es una secuencia de caracteres y no un número (da igual que sólo sea una cifra, seguimos en las mismas). También sería incorrecto

Código: Seleccionar todo

edad_pedrito = 12.5;


porque hemos especificado int edad_pedrito, que como recordaréis es un entero, y 12.5 no es entero. Pero sin embargo

Código: Seleccionar todo

float edad_pedrito;
edad_pedrito = 12;


Es correcto, porque, aunque no especifiquemos explícitamente 12.0, el compilador sobreentiende esto (algo listo sí que es, pero no os fiéis...). Esto es porque los números reales (llamados coma flotante en programación) incluyen a los enteros, pero no viceversa.

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char *argv[])
{
  char* nombre;

  nombre = "Alfonsooooooooooo";
  printf("%s\n", nombre);

  nombre = "Digamelon\n";

  printf("%s", nombre);

  getch();
  return 0;
}


Código: Seleccionar todo

char* nombre;


Declaramos una variable de cadena de caracteres llamada nombre.

Código: Seleccionar todo

nombre = "Digamelon\n";


Aquí veréis que hemos incluido el carácter cambio de línea (\n) en la variable en vez de en el printf(). Tanto monta que monta tanto.

Operaciones con variables

Bueno, todo esto de las variables está bien, pero ¿de qué sirven los datos si no los podemos manipular? Pues aquí que vamos con algunas operaciones ;)

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char *argv[])
{
  int edad_pedrito = 5;
  int edad_josito = 12;
 
  printf("Edad de Pedro ahora: %d\n", edad_pedrito);
  printf("Edad de Jose ahora: %d\n", edad_josito);
  printf("Edad de Pedro hace dos anios: %d\n", edad_pedrito - 2);
  printf("Edad de Jose hace tres anios: %d\n", edad_josito - 3);
  printf("La mitad de la edad de Pedro: %d\n", edad_pedrito / 2);
  printf("La mitad de la edad de Jose: %d\n", edad_josito / 2);
  printf("El triple de la edad de Jose: %d\n", edad_josito * 3);
  printf("La suma de las edades de Pedro y Jose: %d\n", edad_josito + edad_pedrito);

  getch();
  return 0;
}


Lo primero que seguramente os llame la atención es que usamos expresiones en vez de variables en printf(). Ponemos las operaciones directamente en vez de usar variables. Esto es perfectamente legal. En cualquier lugar donde usemos una variable, podemos usar una expresión (una operación) tan larga como deseemos.

Lo segundo que algunos notaréis es que la mitad de la variable edad_pedrito (valor 5) es... ¿3? Esto es debido al tipo de datos de int edad_pedrito(integer, entero). Por tanto un entero dividido por un entero da un entero. Así que se redondea hacia el más cercano (hacia arriba si hay igual distancia como en este caso).

Más ejemplos:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char *argv[])
{
  float altura = 1.92;
  float peso = 90;
 
  printf("La mitad de la altura: %f\n", altura / 2);
  printf("La mitad del triple del peso: %f\n", peso * 3 / 2);
  printf("El doble del peso, mas 3: %f\n", peso * 2 + 3);
  printf("El doble del peso mas 3: %f\n", (peso + 3) * 2);
  printf("Factor del peso y la altura: %f\n", peso * altura);
  printf("Relación peso - altura: %f\n", peso / altura);
  printf("Relacion altura - peso: %f = %f\n", 1 / (peso / altura), altura / peso);

  getch();
  return 0;
}


Primero, veréis que usando el tipo float las divisiones ya no se redondean.

Código: Seleccionar todo

printf("El doble del peso, mas 3: %f\n", peso * 2 + 3);
printf("El doble del peso mas 3: %f\n", (peso + 3) * 2);


Es importante tener en cuenta el orden de precedencia de operadores. Como en las matemáticas, no es lo mismo 1+2*3 = 7 que (1+2)*3 = 9.

Código: Seleccionar todo

printf("Relacion altura - peso: %f = %f\n", 1 / (peso / altura), altura / peso);


Aquí veréis que usamos 2 expresiones en lugar de 2 variables. Como dijimos, donde va una variable puede ir una expresión. También veréis dos formas de calcular lo mismo ya que 1 / (x / y) = y / x.

Con todo esto, creo que se ve claramente la importancia de las matemáticas en la programación.

En el próximo veremos más operaciones con variables. ¡Hasta pronto!

EL PDF de esta lección para descargar (gracias a Kracker :oki: ):
leccion IV_C.rar


<< Anterior Siguiente >>
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Imagen

Avatar de Usuario
dark_sasuke
Moderador Global
Moderador Global
Mensajes: 3373
Registrado: 03 Sep 2009, 02:13
Twitter: D4rkyt0

Re: [Curso] Introducción a la programación en C (IV)

Mensajepor dark_sasuke » 09 Oct 2009, 14:54

como siempre excelente profe :oki: :oki:
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (IV)

Mensajepor arisma » 09 Oct 2009, 16:52

Un saludo. ;)

Avatar de Usuario
Kravenbcn
Administrador
Administrador
Mensajes: 16226
Registrado: 01 Sep 2009, 21:27
PSN ID: Kravenbcn
Twitter: Kravenbcn
Ubicación: Barcelona
Contactar:

Re: [Curso] Introducción a la programación en C (IV)

Mensajepor Kravenbcn » 17 Oct 2009, 15:55

Perfecto como hasta ahora m0skit0 :oki:
No te pierdas nada, sigue a DaXHordes en Twitter, Facebook, Google+ y Youtube

Imagen
¿Quieres formar parte del equipo de DaXHordes.org? Esta es tu oportunidad.
PS3 · PS Vita · PSP

Avatar de Usuario
largeroliker
Administrador
Administrador
Mensajes: 8258
Registrado: 03 Sep 2009, 09:46
PSN ID: larger0o
Gamertag Xbox Live: larger0o
Steam ID: larger0o
Twitter: larger0o
Ubicación: Málaga
Contactar:

Re: [Curso] Introducción a la programación en C (IV)

Mensajepor largeroliker » 21 Ene 2010, 18:51

m0ski, una duda...para poder poner números enteros negativos cómo se hace? Es que he intentado hacer un miniprograma de ecuaciones de segundo grado y siempre me fastidia el negativo :(

Saludos! ;)
Imagen
Nintendo Switch · PS4 · PS Vita · PS3 · new 3DS XL · Xbox 360 · PSP · PS2

Avatar de Usuario
finfantasy
Habitual
Habitual
Mensajes: 153
Registrado: 15 Oct 2009, 19:00

Re: [Curso] Introducción a la programación en C (IV)

Mensajepor finfantasy » 21 Ene 2010, 21:39

Las variables "int" ya permiten números negativos.

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5586
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (IV)

Mensajepor m0skit0 » 22 Ene 2010, 02:38

finfantasy escribió:Las variables "int" ya permiten números negativos.

Efestivamente. Para calcular las raíces de una ecuación de segundo grado, sería:

Código: Seleccionar todo

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


Ojo que x1 y x2 puedes ser fracciones (float) y que a != 0.
Imagen

Avatar de Usuario
largeroliker
Administrador
Administrador
Mensajes: 8258
Registrado: 03 Sep 2009, 09:46
PSN ID: larger0o
Gamertag Xbox Live: larger0o
Steam ID: larger0o
Twitter: larger0o
Ubicación: Málaga
Contactar:

Re: [Curso] Introducción a la programación en C (IV)

Mensajepor largeroliker » 22 Ene 2010, 09:30

Entonces puedo declarar a, b y c como int, y antes de escribir nada calcular x1 y x2 de esa forma?

Algo como...

Código: Seleccionar todo

 int a = 3;
 int b = 4;
 int c = -5;
 float x1 = (-b + (sqrt(b*b-4*a*c))/2*a;
 float x2 = (-b - (sqrt(b*b-4*a*c))/2*a;


Saludos! ;)
Imagen
Nintendo Switch · PS4 · PS Vita · PS3 · new 3DS XL · Xbox 360 · PSP · PS2

Avatar de Usuario
finfantasy
Habitual
Habitual
Mensajes: 153
Registrado: 15 Oct 2009, 19:00

Re: [Curso] Introducción a la programación en C (IV)

Mensajepor finfantasy » 22 Ene 2010, 10:56

Por poder puedes, pero si te fijas bien, al declarar b y c como enteros, la raíz te dará un número entero, y al dividirlo entre otro entero, volverá a dar un entero, así que no tendrás la precisión que necesitas.

Para eso, cambia las variables a double's y ya está.

Avatar de Usuario
largeroliker
Administrador
Administrador
Mensajes: 8258
Registrado: 03 Sep 2009, 09:46
PSN ID: larger0o
Gamertag Xbox Live: larger0o
Steam ID: larger0o
Twitter: larger0o
Ubicación: Málaga
Contactar:

Re: [Curso] Introducción a la programación en C (IV)

Mensajepor largeroliker » 22 Ene 2010, 11:31

Y cómo llamo en el printf a las doubles?

Por otra parte, he estado probando con este código...

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 
   int a;
   int b;
   int c;
   float x1;
   float x2;
   
   a = 3;
   b = 3;
   c = 3;
   x1 = (-b + sqrt(b*b - 4*a*c)) / 2*a;
   x2 = (-b - sqrt(b*b - 4*a*c)) / 2*a;
   
   
   printf("La solucion a la ecuacion %dx^2+%dx+%d es igual a...\n", a, b, c);
   printf("Pulsa cualquier boton para continuar\n");
   getch();
   printf("Solucion 1: %f\n", x1);
   printf("Pulsa cualquier boton para continuar\n");
   getch();
   printf("Solucion 2: %f\n", x2);
   printf("Pulsa cualquier boton para salir\n");
   getch();
   return 0;
}


Y pasa esto...

Imagen

Saludos! ;)
Imagen
Nintendo Switch · PS4 · PS Vita · PS3 · new 3DS XL · Xbox 360 · PSP · PS2


Volver a “Programación”

¿Quién está conectado?

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