Operadores y aritmética
En resumen: Los operadores aritméticos +, -, *, / y % hacen cálculos con números; cuando los dos lados de / son números enteros, la división es entera y la parte decimal se corta.
Problema
La cuenta en la mesa
Has pedido tres cafés a 2,50 € y dos cruasanes a 1,50 €. Pagas con un billete de 20 €. ¿Cuánto es la cuenta y cuánto cambio te tienen que dar?
Lo puedes calcular de cabeza. Pero la caja de la cafetería hace esta cuenta cientos de veces al día, con precios y cantidades distintos. El programa tiene que calcular por sí solo.
La idea
Los operadores aritméticos
Calculas igual que en papel: + suma, - resta, * multiplica, / divide. Estos signos se llaman operadores.
double coffee = 2.5;double croissant = 1.5;double total = 3 * coffee + 2 * croissant;double change = 20 - total;Console.WriteLine("Total: " + total + " €");Console.WriteLine("Cambio: " + change + " €");Total: 10.5 €Cambio: 9.5 €El orden es el mismo que en matemáticas: primero * y /, después + y -. Por eso 3 * coffee + 2 * croissant es 7,5 + 3. Si quieres otro orden, pones paréntesis: (2 + 3) * 4 es 20.
Hay también un quinto operador, %. De él trata la siguiente idea.
Más precisamente, para curiosos
- Los operadores con la misma prioridad se calculan de izquierda a derecha:
20 - 5 - 3es 12, no 18. -delante de un número lo hace negativo:-total.
- Con texto,
+no suma, sino que pega. En cuanto hay texto a la izquierda, todo lo que viene después se pega como texto. Esa es la trampa de la siguiente tarjeta.
Pruébalo
Entradas para el concierto
Tres entradas a 8 € y 5 € de gastos de gestión del pedido.
¿Qué imprimirá el programa?
int tickets = 3;int fee = 5;Console.WriteLine("Total: " + tickets * 8 + fee);* se calcula primero: tickets * 8 es 24. Después, de izquierda a derecha: «Total: » + 24 es el texto «Total: 24», y a él se le pega el 5. Para que salga 29, el cálculo tiene que ir entre paréntesis: "Total: " + (tickets * 8 + fee).Problema
Una nota media de 5, no de 5,67
Tienes las notas 5, 6 y 6. La media es 17 / 3 = 5,67. El programa dice otra cosa:
int math = 5;int physics = 6;int english = 6;double average = (math + physics + english) / 3;Console.WriteLine("Nota media: " + average);Nota media: 5Guardas el resultado en un double, y aun así falta la parte decimal. ¿Dónde se ha perdido?
La idea
Entero entre entero da entero
Cuando los dos lados de / son int, la división es división entera: el resultado es un número entero, y la parte decimal se corta. 17 / 3 es 5. Solo después ese 5 se guarda en el double, donde pasa a ser 5.0.
Esta es la nota media de la tarjeta anterior, paso a paso:
int math = 5;int physics = 6;int english = 6;double average = (math + physics + english) / 3;Console.WriteLine("Nota media: " + average);Paso a paso, en palabras
- Tres notas, cada una en un int: 5, 6, 6.
- Primero los paréntesis: 5 + 6 + 6 = 17. La suma también es un int.
- 17 / 3: los dos lados son int. ¿Cuántos grupos enteros de 3 caben en 17? 5.
- El resto 2 (es decir, 17 % 3) se descarta. El resultado es el número entero 5.
- Solo ahora se guarda 5 en double average, donde pasa a ser 5.0. La parte decimal ya se ha perdido.
- Se imprime «Nota media: 5»: C# no escribe .0 al final. 5.67 no aparece en ningún sitio.
Lo que se corta no se pierde del todo. El operador % da el resto de la división: 17 % 3 es 2, porque 17 = 5 · 3 + 2.
Juntos, los dos dividen una cantidad en partes enteras y un resto. La película dura 135 minutos:
int minutes = 135;int hours = minutes / 60;int rest = minutes % 60;Console.WriteLine(hours + " h " + rest + " min");2 h 15 minVas a necesitar % a menudo. Un número es par si n % 2 es 0. La última cifra de un número es n % 10.
Más precisamente, para curiosos
- Con números negativos el resultado se corta hacia el cero, y el resto tiene el signo del dividendo.
%también funciona con números decimales:
Console.WriteLine(-7 / 2);Console.WriteLine(-7 % 2);Console.WriteLine(7.5 % 2);-3-11.5- Un número entero dividido entre 0 detiene el programa con un error:
DivideByZeroException. Condoubleno hay error:5.0 / 0da infinito, y0.0 / 0daNaN(«no es un número»).
Pruébalo
Botellas en cajas
En una caja caben 6 botellas. Tienes 17.
¿Qué imprimirá el programa?
int bottles = 17;int perCase = 6;Console.WriteLine(bottles / perCase + " cajas");Console.WriteLine(bottles % perCase + " de sobra");17 / 6 son 2 cajas enteras (12 botellas), y 17 % 6 es el resto: 5 botellas que no llenan una caja.
La idea
Conversión entre tipos
Para que la división dé un resultado decimal, al menos uno de los lados tiene que ser double. Si tienes un int, lo conviertes: escribes el tipo entre paréntesis delante del valor. Esto se llama cast (conversión explícita).
int sum = 5 + 6 + 6;double average = (double)sum / 3;Console.WriteLine(average);Console.WriteLine($"{average:F2}");int whole = (int)9.99;Console.WriteLine(whole);5.6666666666666675.679(double)sum convierte 17 en 17.0, y entonces la división da un resultado decimal. Si el número está escrito en el código, basta con que sea decimal: sum / 3.0.
Al revés, de double a int, la parte decimal se corta: (int)9.99 es 9, no 10. Por eso el compilador no lo hace por su cuenta: si escribes int whole = 9.99;, el programa no compila. De int a double no se pierde nada, y la conversión se hace sola: double price = 10; es 10.0.
Más precisamente, para curiosos
- Un cast va de un número a un número. Convertir texto en número ya lo haces con
int.Parse: eso es otra cosa. - Un carácter (
char) en realidad se guarda como un número, su código. Por eso se convierte ainty al revés:
Console.WriteLine((int)'A');Console.WriteLine((char)66);int max = 2147483647;Console.WriteLine(max + 1);65B-2147483648- La tercera línea es una sorpresa:
intllega hasta 2 147 483 647. Uno más no da error. «Da la vuelta» hasta el número negativo más pequeño. Para números más grandes estálong.
- C# también tiene
Convert.ToInt32(9.99). Redondea (da 10) en lugar de cortar como(int).
Pruébalo
Encuentra el error
La factura de la luz es de 125 € y se reparte entre tres compañeros de piso. El programa dice que cada uno paga 41,00 €, pero deberían ser 41,67 €. ¿En qué línea está el error?
Elige la línea con el error.
125 / 3 es una división entera y da 41. El cast llega solo después y convierte 41 en 41.0. La solución es hacer el cast antes de la división: (double)bill / people.La idea
Formas abreviadas: += y ++
A menudo cambias un valor a partir de sí mismo: el saldo de la tarjeta baja con cada compra, un contador sube de uno en uno. Hay una forma corta de escribirlo:
double balance = 20;int purchases = 0;balance -= 4.5;purchases++;balance -= 3.5;purchases++;Console.WriteLine(purchases + " compras, quedan " + balance + " €");2 compras, quedan 12 €| Escribes | Significa |
|---|---|
balance -= 4.5; |
balance = balance - 4.5; |
total += price; |
total = total + price; |
x *= 2;, x /= 2;, x %= 2; |
lo mismo con *, / y % |
purchases++; |
purchases = purchases + 1; |
seats--; |
seats = seats - 1; |
+= también funciona con texto: message += "!"; pega un signo de exclamación al final.
Más precisamente, para curiosos
++ también puede ir delante de la variable. En su propia línea no hay diferencia. Dentro de una expresión sí la hay: a++ da el valor antiguo y después lo aumenta, ++a primero lo aumenta y da el valor nuevo.
int a = 5;int b = a++;int c = ++a;Console.WriteLine(a + " " + b + " " + c);7 5 7Un código así es difícil de leer. Escribe ++ y -- en su propia línea.
La idea
Math: raíces, potencias, redondeo
Una pizzería vende una pizza de 30 cm al mismo precio que dos pizzas de 20 cm. ¿Qué es más? El área de un círculo es π · r². Para la potencia y para π hay algo ya hecho en Math: escribes el nombre y los números entre paréntesis. Son métodos, trozos de código ya hechos. Escribirás los tuyos en el módulo «Métodos».
double big = Math.PI * Math.Pow(15, 2);double small = 2 * Math.PI * Math.Pow(10, 2);Console.WriteLine($"Una de 30 cm: {big:F1} cm²");Console.WriteLine($"Dos de 20 cm: {small:F1} cm²");Console.WriteLine(Math.Sqrt(144));Console.WriteLine(Math.Abs(-7.5));Una de 30 cm: 706.9 cm²Dos de 20 cm: 628.3 cm²127.5Una pizza grande es más que dos pequeñas.
| Escribes | Qué da |
|---|---|
Math.Sqrt(x) |
la raíz cuadrada |
Math.Pow(x, n) |
x elevado a n |
Math.Abs(x) |
el valor absoluto (sin el signo) |
Math.Round(x) |
redondeo a un número entero |
Math.PI |
el número π, 3,14159… |
La raíz cuadrada y la potencia devuelven un double, aunque el resultado sea un número entero. Si necesitas un int, conviértelo: (int)Math.Sqrt(144).
Más precisamente, para curiosos
- Redondear 2,5: Java y C# dan resultados distintos.
Console.WriteLine(Math.Round(2.5));Console.WriteLine(Math.Round(3.5));Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero));Console.WriteLine(Math.Round(5.678, 2));2435.68Math.Roundredondea «la mitad» hacia el número par: 2,5 pasa a ser 2, y 3,5 pasa a ser 4. Así lo hacen los bancos (de ahí el nombre «redondeo bancario»). El redondeo que aprendiste en el colegio esMidpointRounding.AwayFromZero. Con un segundo argumento redondeas a ese número de cifras decimales:Math.Round(5.678, 2)es 5,68.
- F2 sigue la configuración de idioma de la computadora. En una computadora configurada en español verás
706,9, no706.9.
Ejercicio
Que calcule el programa
Resuelve las tareas en tu editor. Cada número de la entrada va en una línea aparte.
1. Media de tres números. Lee tres números enteros e imprime su media con dos cifras decimales. Cuidado con la división.
566Media: 5.672. Segundos en horas. Lee un número de segundos y divídelo en horas, minutos y segundos. Pista: una hora tiene 3600 segundos, y % da lo que sobra.
37251 h 2 min 5 s3. Volumen de una esfera. Lee el radio e imprime el volumen: V = 4/3 · π · r³. Piensa cuánto es 4 / 3 antes de escribirlo así.
10Volumen: 4188.79 cm³4. Celsius a Fahrenheit. F = C · 9 / 5 + 32. Lee la temperatura en grados Celsius.
3737.0 °C = 98.6 °FMás tareas
- Pulgadas a centímetros. Una pulgada son 2,54 cm. Para 12 pulgadas:
30.48 cm. - Área de un rectángulo. Lee el largo y el ancho, e imprime el área (largo · ancho).
- Área de un cuadrado. Lee el lado e imprime el área. Hazlo una vez con
*y otra conMath.Pow. - Radianes a grados. Grados = radianes · 180 / π. Para 3.14159:
180.00°. - Horas a segundos. Lee un número de horas e imprime cuántos segundos son. Para 2 horas: 7200.
- El código de un carácter. Lee un carácter e imprime su código. Para
A: 65. El primer carácter del texto leído lo obtienes conConsole.ReadLine()[0]. Qué significa esto lo verás en la lección sobre el texto.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: Tu primer programa · Variables y tipos · Entrada y salida
- Continúa en: Condiciones · Bucles · Arrays · Arrays bidimensionales
- Ejercicios sobre el tema: Fundamentos del lenguaje