DMarlon Studio

Lección 3 · 3 de 20

Aritmética y conversiones · C

Haga cuentas en C: suma, resta, producto, la división entera, el resto con %, las conversiones (cast) a double e int y los atajos += y ++.

C · Aritmética y conversiones en DMarlon Studio: el código del ejemplo y su salida en la terminal

Los operadores +, -, * y / funcionan como en matemáticas, con una excepción importante: si los dos números son int, la división entera descarta los decimales. Por eso 7 / 3 da 2 y no 2.33. El operador `%` da el resto de esa división: 7 % 3 es 1, la pizza que sobra.

Para obtener los decimales, al menos uno de los números tiene que ser double. Eso se consigue con una conversión o *cast*: (double)pizzas convierte 7 en 7.0 y entonces la división da 2.333333.

El orden importa: en (double)(pizzas / people) la división entera se hace primero y da 2; convertirla después ya no recupera los decimales, solo da 2.000000.

La conversión contraria, (int)bill, corta los decimales sin redondear: 47.85 pasa a 47. Para los céntimos se multiplica por 100, se suma 0.5 para redondear y % 100 se queda con las dos últimas cifras.

Por último, los atajos: score += 5 equivale a score = score + 5, score *= 2 a score = score * 2 y score++ suma 1. Así, 10 pasa a 15, luego a 30 y termina en 31.

Código · main.c

#include <stdio.h>int main(void) {    int pizzas = 7, people = 3;    // + - * / work as in maths...    printf("Slices: %d\n", pizzas * 8);    // ...but int / int drops the decimals.    printf("Pizzas each: %d\n", pizzas / people);    // % gives the remainder of the division.    printf("Pizzas left over: %d\n", pizzas % people);    // With a double in the division, the decimals stay.    double share = (double)pizzas / people;    printf("Exact share: %f\n", share);    // Careful: the cast must come before the division.    double too_late = (double)(pizzas / people);    printf("Cast too late: %f\n", too_late);    // Turning a double into an int cuts off the decimals.    double bill = 47.85;    int euros = (int)bill;    int cents = (int)(bill * 100 + 0.5) % 100;    printf("Bill: %d euros and %d cents\n", euros, cents);    // Shortcuts that change a variable.    int score = 10;    score += 5;   // score = score + 5    score *= 2;   // score = score * 2    score++;      // add 1    printf("Score: %d\n", score);    return 0;}

Salida · cc main.c -o main && ./main

Slices: 56
Pizzas each: 2
Pizzas left over: 1
Exact share: 2.333333
Cast too late: 2.000000
Bill: 47 euros and 85 cents
Score: 31

Para recordar

  • int / int da un entero: se pierden los decimales.
  • % da el resto de la división entera.
  • (double)x convierte antes de dividir; (int)x corta los decimales.
  • +=, -=, *= y ++ cambian la propia variable.

Ejercicio

Con 7 pizzas de 8 porciones y 5 personas, calcule cuántas porciones le tocan a cada una y cuántas sobran, solo con / y %.