Tipos y variables en C — 3 programas reales en gedit y Fedora
Los tipos y variables en C práctica real es lo que toca ahora. En el artículo anterior vimos la teoría. Ahora abre gedit en Fedora y escribe el código mientras lees, es la única forma de que se quede. Tres programas progresivos con capturas reales de mi terminal.
Recuerda el flujo de trabajo:
gedit programa.c & # abrir editor en segundo plano # ... escribes el código ... gcc programa.c -o programa # compilar ./programa # ejecutar
Tabla de Contenidos
Programa 1 — Calculadora básica con tipos numéricos
Crea el archivo:
gedit calculadora.c &
Este programa demuestra la diferencia entre división entera y flotante, el error más común en C:
#include <stdio.h>
int main() {
/* Variables */
int a, b;
float resultado_float;
int resultado_entero;
/* Entrada de datos */
printf("Introduce el primer número: ");
scanf("%d", &a);
printf("Introduce el segundo número: ");
scanf("%d", &b);
/* Operaciones */
resultado_entero = a / b;
resultado_float = (float)a / b;
/* Resultados */
printf("\n--- Resultados con %d y %d ---\n", a, b);
printf("Suma: %d\n", a + b);
printf("Resta: %d\n", a - b);
printf("Multiplicación: %d\n", a * b);
printf("División entera: %d\n", resultado_entero);
printf("División real: %.4f\n", resultado_float);
printf("Módulo (resto): %d\n", a % b);
printf("a al cuadrado: %d\n", a * a);
return 0;
}
Compila y ejecuta:
bash
gcc calculadora.c -o calculadora ./calculadora
Resultado con 7 y 3:
Introduce el primer número: 7 Introduce el segundo número: 3 --- Resultados con 7 y 3 --- Suma: 10 Resta: 4 Multiplicación: 21 División entera: 2 División real: 2.3333 Módulo (resto): 1 a al cuadrado: 49
Fíjate en la diferencia clave: a / b con dos enteros da 2, pero (float)a / b da 2.3333. El cast (float) convierte a a flotante antes de dividir. Si no lo pones, aunque el resultado se guarde en un float, la división ya se hizo como entera y el daño está hecho.
Programa 2 — Calculadora de notas con media y clasificación
gedit notas.c &
#include <stdio.h>
int main() {
/* Variables para las notas */
float nota1, nota2, nota3, nota4;
float media;
char clasificacion;
int aprobado;
/* Entrada de notas */
printf("=== CALCULADORA DE NOTAS ===\n\n");
printf("Nota 1 (0-10): ");
scanf("%f", ¬a1);
printf("Nota 2 (0-10): ");
scanf("%f", ¬a2);
printf("Nota 3 (0-10): ");
scanf("%f", ¬a3);
printf("Nota 4 (0-10): ");
scanf("%f", ¬a4);
/* Cálculo de media */
media = (nota1 + nota2 + nota3 + nota4) / 4.0;
/* Clasificación — sin booleano, usamos int */
aprobado = (media >= 5.0);
/* Clasificación por letra */
if (media >= 9.0) clasificacion = 'A';
else if (media >= 7.0) clasificacion = 'B';
else if (media >= 5.0) clasificacion = 'C';
else clasificacion = 'F';
/* Resultados */
printf("\n--- Resultados ---\n");
printf("Nota 1: %.2f\n", nota1);
printf("Nota 2: %.2f\n", nota2);
printf("Nota 3: %.2f\n", nota3);
printf("Nota 4: %.2f\n", nota4);
printf("Media: %.2f\n", media);
printf("Letra: %c\n", clasificacion);
printf("Aprobado (1=si, 0=no): %d\n", aprobado);
return 0;
}
El programa usa if/else if/else para clasificar la nota. La sintaxis en C es exactamente igual que en Python pero con paréntesis obligatorios en la condición y llaves en el cuerpo. Lo veremos en profundidad en el artículo de estructuras de control, por ahora el código es intuitivo si vienes de FP1.
gcc notas.c -o notas ./notas
Resultado:
=== CALCULADORA DE NOTAS === Nota 1 (0-10): 7.5 Nota 2 (0-10): 8.0 Nota 3 (0-10): 6.5 Nota 4 (0-10): 9.0 --- Resultados --- Nota 1: 7.50 Nota 2: 8.00 Nota 3: 6.50 Nota 4: 9.00 Media: 7.75 Letra: B Aprobado (1=si, 0=no): 1
Fíjate en tres detalles importantes:
Primero — dividimos entre 4.0 y no entre 4. Si dividieras entre 4 (entero) y la suma también fuera entera, obtendrías división entera. Con 4.0 forzamos que sea flotante.
Segundo — aprobado es un int que vale 1 o 0, porque en C no hay booleano. Lo imprimimos con %d.
Tercero — clasificacion es un char que guardamos con = directamente. Lo imprimimos con %c.
Programa 3 — Ficha de estudiante con datos personales
Este programa es el más completo, usa todos los tipos básicos y demuestra cómo manejar caracteres con scanf:
gedit ficha.c &
#include <stdio.h>
int main() {
/* Datos del estudiante */
int dni;
char inicial_nombre;
char inicial_apellido;
int edad;
float nota_media;
int creditos;
int anio_ingreso; # en C no hay "ñ"
/* Entrada de datos */
printf("=== FICHA DE ESTUDIANTE ===\n\n");
printf("DNI (solo números): ");
scanf("%d", &dni);
printf("Inicial del nombre: ");
scanf(" %c", &inicial_nombre); /* espacio antes de %c — importante */
printf("Inicial del apellido: ");
scanf(" %c", &inicial_apellido);
printf("Edad: ");
scanf("%d", &edad);
printf("Nota media (0-10): ");
scanf("%f", ¬a_media);
printf("Créditos matriculados: ");
scanf("%d", &creditos);
printf("Año de ingreso: ");
scanf("%d", &anio_ingreso);
/* Cálculos */
int anios_carrera = 2026 - anio_ingreso;
float nota_sobre_100 = nota_media * 10;
int aprobado = (nota_media >= 5.0);
/* Mostrar ficha */
printf("\n=============================\n");
printf(" FICHA DE ESTUDIANTE\n");
printf("=============================\n");
printf("DNI: %d\n", dni);
printf("Iniciales: %c.%c.\n", inicial_nombre, inicial_apellido);
printf("Edad: %d años\n", edad);
printf("Nota media: %.2f/10 (%.1f/100)\n", nota_media, nota_sobre_100);
printf("Créditos: %d\n", creditos);
printf("Ingreso: %d (%d año/s)\n", anio_ingreso, anios_carrera);
printf("Estado: %s\n", aprobado ? "Aprobado" : "Suspenso");
printf("=============================\n");
return 0;
}
gcc ficha.c -o ficha ./ficha
El espacio antes de %c en scanf
Fíjate en scanf(" %c", &inicial_nombre), hay un espacio antes del %c. Ese espacio no es un error, es necesario. Sin él, scanf podría leer el salto de línea del Enter anterior en vez del carácter que escribes. Es uno de los comportamientos más molestos de C para los principiantes.
scanf("%c", &c); // puede leer el '\n' del Enter anterior
scanf(" %c", &c); // el espacio descarta espacios y saltos de línea
El operador ternario en C
En el último printf usamos aprobado ? "Aprobado" : "Suspenso", es el operador ternario, igual que en Python pero con diferente sintaxis:
// C condicion ? valor_si_true : valor_si_false // Python equivalente valor_si_true if condicion else valor_si_false
Los errores que más aparecen en estos programas
Error 1 — Olvidar el & en scanf:
scanf("%d", edad); // error — comportamiento indefinido
scanf("%d", &edad); // correcto
Error 2 — División entera inesperada:
float media = (nota1 + nota2) / 2; // si notas son float, ok float media = (7 + 8) / 2; // → 7 (división entera de enteros) float media = (7 + 8) / 2.0; // → 7.5 correcto
Error 3 — Usar %f con int o %d con float:
int x = 5;
printf("%f\n", x); // comportamiento indefinido — tipo incorrecto
printf("%d\n", x); // correcto
Error 4 — No inicializar variables:
int x;
printf("%d\n", x); // x tiene basura — valor indeterminado
int x = 0;
printf("%d\n", x); // correcto — siempre inicializa
Visualízalo con Python Tutor
Python Tutor no es solo para Python, también soporta C. Es especialmente útil en C porque puedes ver exactamente cómo se almacena cada variable en memoria, qué dirección ocupa y cómo cambia su valor en cada instrucción.
Ve a pythontutor.com, selecciona C en el desplegable de lenguaje y pega este código:
#include <stdio.h>
int main() {
int a = 7;
int b = 3;
float resultado_entero = a / b;
float resultado_real = (float)a / b;
int aprobado = (resultado_real >= 5.0);
printf("División entera: %.1f\n", resultado_entero);
printf("División real: %.4f\n", resultado_real);
printf("Aprobado: %d\n", aprobado);
return 0;
}
Ejecuta paso a paso y observa:
- Cómo
resultado_enterovale2.0aunque esperas2.3333— la división entera ya ocurrió antes de guardarse en el float - Cómo
aprobadovale0o1— nuncaTrueoFalse - Las direcciones de memoria de cada variable — algo que en Python nunca ves y en C es fundamental
Es la herramienta más útil para entender por qué C se comporta diferente a Python en las operaciones numéricas.

Resumen y siguiente paso
En este artículo practicaste tipos y variables en C con tres programas reales. Los conceptos clave que usaste: cast (float) para evitar división entera, int como booleano con 1 y 0, %c con espacio previo en scanf, y el operador ternario para condiciones simples.
En el siguiente artículo encontrarás ejercicios propuestos con solución para practicar por tu cuenta.
Types and variables in C — 3 real programs in gedit and Fedora
In the previous article we covered types and variables in C theory. Now open gedit on Fedora and write the code as you read. Three progressive programs with real terminal screenshots.
Workflow reminder:
gedit program.c & # open editor in background gcc program.c -o program # compile ./program # run
Program 1 — Basic calculator with numeric types
gedit calculator.c &
#include <stdio.h>
int main() {
int a, b;
float result_float;
int result_int;
printf("Enter first number: ");
scanf("%d", &a);
printf("Enter second number: ");
scanf("%d", &b);
result_int = a / b;
result_float = (float)a / b;
printf("\n--- Results with %d and %d ---\n", a, b);
printf("Addition: %d\n", a + b);
printf("Subtraction: %d\n", a - b);
printf("Multiplication: %d\n", a * b);
printf("Integer div: %d\n", result_int);
printf("Real div: %.4f\n", result_float);
printf("Modulo: %d\n", a % b);
printf("a squared: %d\n", a * a);
return 0;
}
Key difference: a / b with two integers gives 2, but (float)a / b gives 2.3333. The cast (float) converts a to float before dividing.
Program 2 — Grade calculator
#include <stdio.h>
int main() {
float grade1, grade2, grade3, grade4;
float average;
char classification;
int passed;
printf("=== GRADE CALCULATOR ===\n\n");
printf("Grade 1 (0-10): "); scanf("%f", &grade1);
printf("Grade 2 (0-10): "); scanf("%f", &grade2);
printf("Grade 3 (0-10): "); scanf("%f", &grade3);
printf("Grade 4 (0-10): "); scanf("%f", &grade4);
average = (grade1 + grade2 + grade3 + grade4) / 4.0;
passed = (average >= 5.0);
if (average >= 9.0) classification = 'A';
else if (average >= 7.0) classification = 'B';
else if (average >= 5.0) classification = 'C';
else classification = 'F';
printf("\n--- Results ---\n");
printf("Average: %.2f\n", average);
printf("Grade: %c\n", classification);
printf("Passed (1=yes, 0=no): %d\n", passed);
return 0;
}
Three important details: divide by 4.0 not 4, passed is int not bool, classification is char printed with %c.
Program 3 — Student profile
#include <stdio.h>
int main() {
int id;
char first_initial, last_initial;
int age;
float average;
int credits, year_enrolled;
printf("=== STUDENT PROFILE ===\n\n");
printf("ID number: "); scanf("%d", &id);
printf("First initial: "); scanf(" %c", &first_initial);
printf("Last initial: "); scanf(" %c", &last_initial);
printf("Age: "); scanf("%d", &age);
printf("Average grade: "); scanf("%f", &average);
printf("Credits enrolled: "); scanf("%d", &credits);
printf("Year enrolled: "); scanf("%d", &year_enrolled);
int years = 2026 - year_enrolled;
float grade_100 = average * 10;
int passed = (average >= 5.0);
printf("\n=============================\n");
printf(" STUDENT PROFILE\n");
printf("=============================\n");
printf("ID: %d\n", id);
printf("Initials: %c.%c.\n", first_initial, last_initial);
printf("Age: %d years\n", age);
printf("Average: %.2f/10 (%.1f/100)\n", average, grade_100);
printf("Credits: %d\n", credits);
printf("Enrolled: %d (%d year/s)\n", year_enrolled, years);
printf("Status: %s\n", passed ? "Passed" : "Failed");
printf("=============================\n");
return 0;
}
The space before %c in scanf
scanf("%c", &c); // may read the '\n' from previous Enter
scanf(" %c", &c); // space discards whitespace and newlines — correct
Ternary operator in C
// C syntax condition ? value_if_true : value_if_false // Python equivalent value_if_true if condition else value_if_false
Common mistakes
// Mistake 1 — missing & in scanf
scanf("%d", age); // wrong
scanf("%d", &age); // correct
// Mistake 2 — unexpected integer division
float avg = (7 + 8) / 2; // → 7 (integer)
float avg = (7 + 8) / 2.0; // → 7.5 correct
// Mistake 3 — wrong format specifier
int x = 5;
printf("%f\n", x); // undefined behaviour
printf("%d\n", x); // correct
// Mistake 4 — uninitialised variable
int x;
printf("%d\n", x); // garbage value
int x = 0;
printf("%d\n", x); // correct

Un comentario