Ir al contenido
wannacode

Variables y tipos

En resumen: Una variable es un lugar en la memoria con un nombre, un tipo y un valor; el tipo dice qué guarda: int un número entero, double un número decimal, bool sí o no, string texto.

Problema

El precio está en tres sitios

En una tienda en línea, un mismo precio aparece en varios sitios: en el catálogo, en el carrito y al pagar. Si en todos está escrito como número, pasa esto:

Console.WriteLine("Auriculares: 49.90 €");
Console.WriteLine("En el carrito: auriculares, 49.90 €");
Console.WriteLine("A pagar: 49.90 €");

Mañana los auriculares están en oferta. Tienes que encontrar y corregir cada 49.90. Si se te escapa uno, el cliente ve dos precios distintos.

La idea

Una variable: un nombre para un valor

Escribe el precio una sola vez y dale un nombre. Después escribe el nombre en todas partes.

double price = 49.90;
Console.WriteLine("Auriculares: " + price + " €");
Console.WriteLine("En el carrito: auriculares, " + price + " €");
Console.WriteLine("A pagar: " + price + " €");
Salida
Auriculares: 49.9 €
En el carrito: auriculares, 49.9 €
A pagar: 49.9 €

double price = 49.90; crea una variable: un lugar en la memoria con un nombre (price), un tipo (double, un número decimal) y un valor (49.90). Donde el código dice price, el programa toma el valor de ahí.

+ entre un texto y un valor los une en un solo texto. Por eso los espacios están dentro de las comillas.

El cero del final desapareció: 49.90 salió como 49.9. Para el número es lo mismo. Cómo mostrar el precio con dos cifras decimales lo verás en la lección de entrada y salida.

Más precisamente, para curiosos
  • Un nombre empieza con una letra y no tiene espacios. Escríbelo en minúsculas, y empieza cada palabra siguiente con mayúscula: price, pricePerNight. Las mayúsculas y las minúsculas importan: price y Price son dos nombres distintos.
  • El lenguaje también permite nombres con letras como ñ o con tilde (año, situación), pero no lo hagas. El código de todo el mundo usa nombres en latín básico, y así escribirán también tus compañeros.
  • Una variable a la que todavía no has dado un valor no se puede usar. El compilador se detiene con un error.
  • Si en tu computadora sale 49,9 con coma, es por la configuración regional (la española y muchas otras usan la coma). C# la sigue cuando convierte un número en texto. Los ejemplos del curso usan punto.

La idea

Tipos de valores

El tipo dice qué puede guardar la variable. Estos son los principales:

string name = "Mochila";
double price = 39.90;
int stock = 12;
bool onSale = true;
char size = 'M';
Console.WriteLine(name + ", talla " + size);
Console.WriteLine("Precio: " + price + " €");
Console.WriteLine("En stock: " + stock + " uds.");
Console.WriteLine("En oferta: " + onSale);
Salida
Mochila, talla M
Precio: 39.9 €
En stock: 12 uds.
En oferta: True
  • int: un número entero, por ejemplo una cantidad.
  • double: un número decimal, por ejemplo un precio o un peso. En el código el separador decimal es un punto: 39.90.
  • bool: sí o no, true o false.
  • char: un solo carácter, entre comillas simples: 'M'.
  • string: texto, entre comillas dobles: "Mochila". Esto es una cadena (string), una secuencia de caracteres.

true en el código se imprime como True. Así convierte C# los valores lógicos en texto.

Más precisamente, para curiosos

string es otro nombre de System.String. Los tipos simples (int, double, bool, char, etc.) guardan el valor mismo. string es un tipo por referencia: la variable guarda un enlace al texto. La diferencia importará en el módulo «Clases y objetos».

Los tipos numéricos y los demás tipos simples de C#:

Tipo Tamaño Valores
byte 1 byte de 0 a 255 (sin signo)
sbyte 1 byte de -128 a 127
short 2 bytes de -32 768 a 32 767
ushort 2 bytes de 0 a 65 535 (sin signo)
int 4 bytes de -2 147 483 648 a 2 147 483 647
uint 4 bytes de 0 a 4 294 967 295 (sin signo)
long 8 bytes de -9 223 372 036 854 775 808 a 9 223 372 036 854 775 807
ulong 8 bytes de 0 a 18 446 744 073 709 551 615 (sin signo)
float 4 bytes decimal, hasta unos ±3,4 · 10³⁸, de 6 a 9 cifras significativas
double 8 bytes decimal, hasta unos ±1,8 · 10³⁰⁸, de 15 a 17 cifras significativas
decimal 16 bytes decimal, hasta unos ±7,9 · 10²⁸, de 28 a 29 cifras significativas, exacto en base 10
char 2 bytes un carácter de Unicode, códigos de 0 a 65 535
bool 1 byte true o false

La u del nombre significa unsigned, sin signo: solo el cero y los números positivos. byte no tiene signo aunque no lleva u, y su versión con signo es sbyte. decimal es el tipo para el dinero. double guarda los números en binario, y algunos valores decimales como 0.1 no quedan exactos. En una suma de miles de pagos, estas pequeñas diferencias se acumulan.

Un número en el código es un int o un double, salvo que digas otra cosa. Una L al final hace que un número sea long, una f hace que sea float, una m hace que sea decimal. Sin la m, la línea decimal balance = 1250.75; no compila. Los guiones bajos entre las cifras solo ayudan a leerlo:

long population = 8_100_000_000L;
float weight = 1.5f;
decimal balance = 1250.75m;
Console.WriteLine(population + " " + weight + " " + balance);
Salida
8100000000 1.5 1250.75

Pruébalo

Encuentra el error

El programa debe imprimir una compra. No compila. ¿En qué línea está el error?

Elige la línea con el error.

La idea

= guarda una copia

El signo = no es «igual» como en matemáticas. Significa: toma el valor de la derecha y guárdalo en la variable de la izquierda. Esto se llama asignación. El valor anterior de la variable desaparece.

Cuando a la derecha hay otra variable, se guarda una copia de su valor en ese momento. Las dos variables no quedan conectadas:

int seats = 40;
int seatsAtStart = seats;
seats = 37;
Console.WriteLine("Al inicio: " + seatsAtStart);
Console.WriteLine("Ahora: " + seats);
Salida
Al inicio: 40
Ahora: 37

seatsAtStart recibe 40. Después seats pasa a 37, pero la copia en seatsAtStart sigue siendo 40.

Pruébalo

¿Qué valor se queda?

¿Qué imprimirá el programa?

int roomA = 12;
int roomB = 20;
roomA = roomB;
roomB = 25;
Console.WriteLine(roomA + " y " + roomB);
Respuesta

Problema

Las medidas están al revés

Un programa para imprimir fotos recibe las medidas al revés: ancho 120 y alto 80, cuando deberían ser 80 x 120. Parece que basta con guardar una en la otra y viceversa:

int width = 120;
int height = 80;
width = height;
height = width;
Console.WriteLine(width + " x " + height);
Salida
80 x 80

Salió 80 x 80. ¿Adónde fue el 120?

Míralo

Intercambio con una variable auxiliar

int width = 120;
int height = 80;
int temp = width;
width = height;
height = temp;
Console.WriteLine(width + " x " + height); // 80 x 120
Paso a paso, en palabras
  1. El ancho y el alto se introdujeron al revés: 120 y 80.
  2. temp = width: una copia de 120 va a temp. En width sigue estando 120.
  3. width = height: una copia de 80 entra en width. El 120 anterior desaparece de ahí, pero está guardado en temp.
  4. height = temp: 120 vuelve de temp a height.
  5. Ya están intercambiados: 80 x 120.

En la versión ingenua, width = height guarda 80 en width, y el 120 anterior desaparece. Cuando después viene height = width, width ya guarda 80, y eso es lo que se copia de vuelta.

La solución es una tercera variable auxiliar, temp. Guarda el 120 antes de que width se sobrescriba. Después el 120 pasa de temp a height, y las medidas quedan 80 x 120.

Pruébalo

Ordena el intercambio

En la tienda, dos compañeros se cambian el turno. morning es «Iván», y evening es «María». Ordena las líneas para que se intercambien.

  1. string temp = morning;
  2. Console.WriteLine("Mañana: " + morning + ", tarde: " + evening);
  3. morning = evening;
  4. evening = temp;

La idea

var: el tipo se deduce

Cuando el tipo se ve por el valor, puedes escribir var en su lugar:

var city = "Plovdiv";
var nights = 3;
var pricePerNight = 65.0;
Console.WriteLine(city + ": " + nights + " noches a " + pricePerNight + " €");
Salida
Plovdiv: 3 noches a 65 €

El compilador ve por sí mismo que "Plovdiv" es texto, 3 es un int y 65.0 es un double. Esto se llama inferencia de tipos (type inference).

var no significa «sin tipo». El tipo lo decide el primer valor, y después ya no cambia:

var nights = 3;
nights = "tres";
Mensaje del compilador
error CS0029: Cannot implicitly convert type 'string' to 'int'

En este curso escribiremos el tipo casi siempre de forma explícita, para que lo veas.

Más precisamente, para curiosos
  • var necesita un valor enseguida: var nights; no compila, porque no hay de dónde saber el tipo.
  • var es solo para variables dentro de Main (y dentro de los demás métodos, que llegan en el módulo «Métodos»).
  • C# también tiene dynamic: con él, el tipo se comprueba solo mientras el programa se ejecuta, no al compilar. Se usa poco, con datos de otros sistemas. En este curso no lo necesitaremos.

Ejercicio

Tus variables

Resuelve las tareas en tu editor. Los valores están escritos en el código, sin leer del teclado. La lectura llega en la siguiente lección.

1. Intercambio. En el estante de arriba hay 15 libros, en el de abajo 27. Guárdalos en dos variables, intercambia sus valores e imprime el antes y el después.

Salida
Antes: arriba 15, abajo 27
Después: arriba 27, abajo 15

2. Edad. Guarda un nombre y una edad en dos variables e imprímelos en una frase.

Salida
María tiene 19 años.

3. La ficha de un hotel. Guarda en variables el nombre del hotel (texto), las estrellas (un número entero), la valoración (un número decimal), si tiene desayuno (sí o no) y la categoría (un solo carácter). Imprímelos.

Salida
Hotel «Estrella de Mar»
Estrellas: 4
Valoración: 8.7
Desayuno: True
Categoría: B

Más tareas

  • Tres en círculo. Tres cajas empiezan el día con 120, 85 y 240 €. Mueve las cantidades en círculo: la primera pasa a la segunda, la segunda a la tercera, la tercera a la primera. Usa una sola variable auxiliar. Imprime 240 120 85.
  • Lo mismo con var. Reescribe la tarea 3 con var en todas partes. La salida no debe cambiar.
  • Un error a propósito. Guarda un texto en un int y un número decimal en un int. Lee lo que dice el compilador.

Test

Ponte a prueba

1. ¿Qué hace la línea int count = 5;?
2. ¿Qué tipo sirve para un precio como 12.99?
3. int a = 5; int b = a; a = 9; ¿Cuánto vale b?
4. ¿Por qué intercambiar dos valores necesita una tercera variable?
5. Después de var nights = 3;, ¿qué es cierto?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·