Curso de C · Módulo 2 de 12

Variables, tipos de datos y scanf/printf en C

Qué aprenderás en este módulo

guardar datos en variables, conocer los tipos básicos y comunicarte con el usuario con printf y scanf.

Incluye 4 ejercicios con pistas y solución y un quiz de 6 preguntas. Tiempo estimado: 60 minutos.

1. Variables

Una variable es una caja con nombre y tipo en memoria. En C hay que declarar el tipo antes de usarla.

int edad = 30;        // entero
double precio = 9.99; // decimal de doble precisión
char letra = 'A';     // un carácter (comillas SIMPLES)

Reglas de nombres: letras, dígitos y _; no empieza por dígito; C distingue mayúsculas (Edad ≠ edad).

⚠️ Una variable local sin inicializar contiene basura. Inicializa siempre: int x = 0;.

2. Tipos básicos

Tipo Tamaño típico Uso Formato printf
char 1 byte un carácter / byte pequeño %c (o %d como número)
int 4 bytes enteros (≈ ±2 mil millones) %d
long long 8 bytes enteros enormes %lld
unsigned int 4 bytes solo ≥ 0 %u
float 4 bytes decimales (~7 cifras) %f
double 8 bytes decimales (~15 cifras) %f / %.2f

sizeof(int) te dice cuántos bytes ocupa un tipo. Los enteros desbordan en silencio: INT_MAX + 1 da un negativo (<limits.h>).

3. Constantes

const double IVA = 0.21;   // no se puede modificar
#define MAX_ALUMNOS 30     // sustitución de texto (módulo 11)

4. Operadores aritméticos y conversiones

+ - * / % y los abreviados += -= *= /= ++ --.

  • División entera: 7 / 2 es 3, no 3.5. 7 % 2 es 1 (resto).
  • Para dividir con decimales hace falta que algún operando sea decimal: 7 / 2.0 o (double)7 / 2.
  • Un cast (double)x convierte el valor en esa expresión.

5. Salida con printf

printf("Tengo %d años y mido %.2f m. Mi inicial es %c\n", edad, altura, letra);

%d entero · %f real (%.2f = 2 decimales) · %c carácter · %s cadena · %5d ancho 5 · %% un símbolo %. Debe haber un argumento por cada %, del tipo correcto; si no, comportamiento indefinido.

6. Entrada con scanf

int n;
double x;
scanf("%d", &n);       // OJO al &: scanf necesita la DIRECCIÓN donde escribir
scanf("%lf", &x);      // double en scanf = %lf (¡con l!)
scanf("%d %d", &a, &b);// varios valores
  • scanf devuelve cuántos valores leyó con éxito: if (scanf("%d", &n) != 1) { /* entrada inválida */ }.
  • Para leer un char saltando blancos previos: scanf(" %c", &c) (espacio antes del %).
  • El & lo entenderás del todo en el módulo 7 (punteros).

Prueba esto

  1. Imprime sizeof(int), sizeof(double) y sizeof(char) con %zu.
  2. ¿Qué imprime printf("%d\n", 10 / 4);? ¿Y printf("%f\n", 10 / 4);? (el segundo es un error de tipo: ¿qué sale y por qué?).
  3. Declara int x; sin inicializar e imprímelo. Ejecútalo 3 veces.

Resumen

  • Declara con tipo, inicializa siempre.
  • int / int = división entera. Usa double o un cast para decimales.
  • printf lleva % por cada valor; scanf lleva & (salvo con arrays de char).

Ejercicios prácticos del módulo 2

Programar se aprende programando: intenta cada ejercicio antes de mirar las pistas, y usa la solución solo para comparar. Marca los que resuelvas y tu progreso se guarda en este navegador.

2.1 Suma de dos enteros
Lee dos enteros (separados por espacio o salto de linea) y muestra su suma con el formato: La suma es 12

Entrada de ejemplo

5 7

Salida esperada

La suma es 12

Tu punto de partida

#include <stdio.h>

int main(void) {
    int a, b;
    // TODO: lee a y b con scanf, e imprime "La suma es X"

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

scanf("%d %d", &a, &b); -- fijate en el & delante de cada variable.

Pista 2

printf("La suma es %d\n", a + b);

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    int a, b;
    scanf("%d %d", &a, &b);
    printf("La suma es %d\n", a + b);
    return 0;
}
2.2 Rectangulo: area y perimetro
Lee la base y la altura de un rectangulo (numeros reales) e imprime, con 2 decimales: Area: 12.00 Perimetro: 14.00 Usa double y los formatos %lf para leer y %.2f para imprimir.

Entrada de ejemplo

3 4

Salida esperada

Area: 12.00
Perimetro: 14.00

Tu punto de partida

#include <stdio.h>

int main(void) {
    double base, altura;
    // TODO

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

Con scanf los double se leen con %lf (L minuscula + f). Con printf basta %f, pero usa %.2f.

Pista 2

perimetro = 2 * (base + altura)

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    double base, altura;
    scanf("%lf %lf", &base, &altura);
    printf("Area: %.2f\n", base * altura);
    printf("Perimetro: %.2f\n", 2 * (base + altura));
    return 0;
}
2.3 Grados Celsius a Fahrenheit
Lee una temperatura en grados Celsius (real) y muestrala en Fahrenheit con 1 decimal: 25.0 C = 77.0 F Formula: F = C * 9 / 5 + 32. Cuidado con la division entera: 9/5 en enteros vale 1.

Entrada de ejemplo

25

Salida esperada

25.0 C = 77.0 F

Tu punto de partida

#include <stdio.h>

int main(void) {
    double c;
    // TODO

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

Si c es double, c * 9 / 5 ya se hace en coma flotante. Lo que no puedes es escribir 9 / 5 solo.

Pista 2

printf("%.1f C = %.1f F\n", c, f);

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    double c;
    scanf("%lf", &c);
    printf("%.1f C = %.1f F\n", c, c * 9.0 / 5.0 + 32.0);
    return 0;
}
2.4 Cociente, resto y division real
Lee dos enteros a y b (b distinto de 0) e imprime: cociente=3 resto=2 real=3.286 es decir: a / b (entera), a % b y la division REAL con 3 decimales (necesitas un cast a double).

Entrada de ejemplo

23 7

Salida esperada

cociente=3 resto=2 real=3.286

Tu punto de partida

#include <stdio.h>

int main(void) {
    int a, b;
    // TODO

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

a / b entre dos int da un int (descarta decimales). % da el resto.

Pista 2

(double)a / b convierte a antes de dividir, y entonces la division es real.

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    int a, b;
    scanf("%d %d", &a, &b);
    printf("cociente=%d resto=%d real=%.3f\n", a / b, a % b, (double)a / b);
    return 0;
}

Quiz del módulo 2

6 preguntas para comprobar que has fijado los conceptos. Las opciones se barajan cada vez.