Ir al contenido
wannacode

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 + " €");
Salida
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 - 3 es 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);
Respuesta

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);
Salida
Nota media: 5

Guardas 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
  1. Tres notas, cada una en un int: 5, 6, 6.
  2. Primero los paréntesis: 5 + 6 + 6 = 17. La suma también es un int.
  3. 17 / 3: los dos lados son int. ¿Cuántos grupos enteros de 3 caben en 17? 5.
  4. El resto 2 (es decir, 17 % 3) se descarta. El resultado es el número entero 5.
  5. Solo ahora se guarda 5 en double average, donde pasa a ser 5.0. La parte decimal ya se ha perdido.
  6. 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");
Salida
2 h 15 min

Vas 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);
Salida
-3
-1
1.5
  • Un número entero dividido entre 0 detiene el programa con un error: DivideByZeroException. Con double no hay error: 5.0 / 0 da infinito, y 0.0 / 0 da NaN («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");
Respuesta

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);
Salida
5.666666666666667
5.67
9

(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 a int y al revés:
Console.WriteLine((int)'A');
Console.WriteLine((char)66);
int max = 2147483647;
Console.WriteLine(max + 1);
Salida
65
B
-2147483648
  • La tercera línea es una sorpresa: int llega 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.

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 + " €");
Salida
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);
Salida
7 5 7

Un 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));
Salida
Una de 30 cm: 706.9 cm²
Dos de 20 cm: 628.3 cm²
12
7.5

Una 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));
Salida
2
4
3
5.68
  • Math.Round redondea «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 es MidpointRounding.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, no 706.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.

Entrada
5
6
6
Salida
Media: 5.67

2. 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.

Entrada
3725
Salida
1 h 2 min 5 s

3. 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í.

Entrada
10
Salida
Volumen: 4188.79 cm³

4. Celsius a Fahrenheit. F = C · 9 / 5 + 32. Lee la temperatura en grados Celsius.

Entrada
37
Salida
37.0 °C = 98.6 °F

Má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 con Math.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 con Console.ReadLine()[0]. Qué significa esto lo verás en la lección sobre el texto.

Test

Ponte a prueba

1. ¿Cuánto es 17 / 5 si los dos números son int?
2. ¿Cuánto es 17 % 5?
3. ¿Qué expresión da 2.5?
4. ¿Qué da (int)9.99?
5. ¿Qué imprime Console.WriteLine("Suma: " + 2 + 3)?

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