tipos y variables en C práctica programas gedit Fedora

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

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", &nota1);
    printf("Nota 2 (0-10): ");
    scanf("%f", &nota2);
    printf("Nota 3 (0-10): ");
    scanf("%f", &nota3);
    printf("Nota 4 (0-10): ");
    scanf("%f", &nota4);

    /* 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.

Segundoaprobado es un int que vale 1 o 0, porque en C no hay booleano. Lo imprimimos con %d.

Terceroclasificacion 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", &nota_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_entero vale 2.0 aunque esperas 2.3333 — la división entera ya ocurrió antes de guardarse en el float
  • Cómo aprobado vale 0 o 1 — nunca True o False
  • 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.

tipos y variables en C práctica usando Python Tutor

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

Publicaciones Similares

Un comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *