C

C

Tutorial C: Estructura básica de un programa en C

C: Aprende a manejar directivas de preprocesador y la función main() para crear programas robustos y eficientes en el lenguaje C.

Aprende C y certifícate

Sintaxis básica: directivas de preprocesador y la función main()

Las directivas de preprocesador se escriben antes de que el compilador analice el código fuente y siempre comienzan con #. Por ejemplo, en C se utiliza #include para agregar cabeceras que contienen declaraciones de funciones y estructuras, como <stdio.h> para funciones de E/S. También es común emplear #define para crear constantes simbólicas o macros que se reemplazan en el código antes de compilarse.

El preprocesador ofrece varias directivas como #if, #ifdef y #ifndef para controlar la inclusión condicional de bloques de código. Estas directivas son útiles cuando se requiere compilar diferentes partes del programa en función de ciertas condiciones. Un uso frecuente es proteger cabeceras con #ifndef para evitar inclusiones duplicadas.

En un archivo fuente típico, la función main() es el punto de entrada del programa. Su forma recomendada suele ser:

#include <stdio.h>

int main(void) {
    printf("Ejemplo de función main\n");
    return 0;
}

En el ejemplo anterior, la directiva #include <stdio.h> permite usar printf(). Además, se observa que la función main() devuelve un entero a manera de código de salida, y se especifica void para indicar que no recibe argumentos. Algunas implementaciones también permiten:

int main(int argc, char *argv[]) {
    /* Código que maneja argumentos de línea de comandos */
    return 0;
}

En ese caso, argc representa el número de argumentos y argv es un array de cadenas que contiene cada argumento. Siempre es importante especificar un tipo de retorno para main() y terminar con una instrucción return apropiada, pues así se cumple con la convención de terminar el programa indicando si hubo éxito o algún incidente.

Tipos de datos primitivos

Los tipos de datos primitivos en C representan aquellas categorías predefinidas que permiten almacenar valores simples, como números o caracteres. Su uso adecuado resulta esencial para gestionar correctamente el espacio de memoria y el rendimiento del programa.

El tipo int se emplea para representar números enteros, que pueden ser positivos, negativos o cero. A menudo se asocia a distintos modificadores (short, long) para ajustar el rango de valores. Un ejemplo sencillo es:

int numero = 10;

El tipo char se utiliza para caracteres individuales, aunque internamente se guarda como un código numérico (habitualmente con codificación ASCII). Por ejemplo:

char letra = 'A';

Para almacenar números reales de precisión simple se emplea el tipo float. Es idóneo cuando se requiere menos consumo de memoria que en tipos de mayor tamaño. Como ejemplo:

float temperatura = 36.5f;

El tipo double es similar a float, pero gestiona valores con mayor rango y precisión. De este modo, se prefiere cuando se necesitan cálculos más exactos:

double promedio = 12.3456789;

El tipo booleano se utiliza para representar valores lógicos (verdadero o falso) en C. Sin embargo, dado que el lenguaje C no incluye un tipo booleano de forma nativa en las versiones clásicas del estándar (como C89 o C90), hay dos maneras de trabajar con este tipo de datos:

  • Usando enteros: En C, es común emplear el tipo int para representar valores booleanos, donde 0 se interpreta como falso y cualquier valor distinto de cero se interpreta como verdadero. Por ejemplo:
int esVerdadero = 1; // Verdadero
int esFalso = 0;     // Falso
  • Usando el estándar **stdbool.h**: A partir del estándar C99, se introdujo la librería stdbool.h, que define el tipo bool junto con las constantes true y false. Esto proporciona una forma más legible y estándar de trabajar con valores booleanos:
#include <stdbool.h>

bool esVerdadero = true; // Verdadero
bool esFalso = false;    // Falso

Ambos enfoques son válidos, pero se recomienda usar stdbool.h en proyectos modernos para mejorar la claridad del código y aprovechar las ventajas del estándar.

Declaración e inicialización de variables

Las variables en C se definen especificando el tipo seguido de un identificador único. Por convención, se recomienda usar nombres descriptivos para facilitar la lectura del código y minimizar errores. Es posible acompañar la declaración con la asignación de un valor inicial para asegurar que la variable no contenga datos indeterminados.

Como ejemplo, se pueden crear múltiples variables de un mismo tipo en una sola línea, separadas por comas. Además, la inicialización puede realizarse en el mismo comando de declaración:

int contador = 0, limite = 100;
float factor = 2.5f;

En muchos casos, combinar la declaración y la inicialización en una misma instrucción contribuye a un estilo más claro y conciso. Asimismo, al seguir esta práctica se evitan posibles comportamientos impredecibles causados por variables sin valor definido. Por tanto, es habitual encontrarse con patrones como:

int resultado = 1;
resultado = resultado + 5;

En C99 se permite declarar variables en cualquier parte del bloque de código, siempre y cuando se haga antes de usarlas por primera vez. Así, se fomenta la cercanía entre la variable y su uso, favoreciendo la comprensión del propósito y optimizando el flujo de lectura dentro de la función.

Funciones de entrada y salida

Las funciones de entrada y salida proporcionan un método para interactuar con el usuario a través de la consola, empleando la biblioteca estándar <stdio.h>. Mediante printf() se muestra texto u otros valores en pantalla, mientras que scanf() se utiliza para leer datos procedentes del flujo de entrada estándar.

Para imprimir datos, printf() requiere especificar el formato adecuado según el tipo de cada valor. Entre los especificadores más comunes destacan:

  • %d para enteros (int)
  • %f para números de coma flotante (float)
  • %lf para números de doble precisión (double)
  • %c para caracteres
  • %s para cadenas de caracteres
    El siguiente ejemplo muestra varias salidas con diferentes tipos de datos:
#include <stdio.h>

int main(void) {
    int edad = 25;
    double altura = 1.78;
    char inicial = 'M';

    printf("Edad: %d\n", edad);
    printf("Altura: %lf\n", altura);
    printf("Inicial: %c\n", inicial);

    return 0;
}

Al recibir entrada desde la consola, scanf() exige el uso de especificadores de formato análogos a los de printf(), pero debe proporcionarse la dirección de memoria de la variable destino mediante el operador &. Para controlar situaciones de errores de lectura, es recomendable verificar el valor de retorno de scanf(). A modo de ejemplo:

#include <stdio.h>

int main(void) {
    int numero;
    int resultado = scanf("%d", &numero);

    if (resultado == 1) {
        printf("Número introducido: %d\n", numero);
    } else {
        printf("Error al leer el número.\n");
    }

    return 0;
}

En muchos programas interactivos, se emplea printf() para solicitar información al usuario y, acto seguido, se recurre a scanf() para capturarla. Este patrón de lectura-escritura favorece la legibilidad del código y la comprensión al guiar al usuario correctamente en la entrada de datos. A la hora de formatear la salida, conviene ajustar cuidadosamente el orden y el tipo de los parámetros para evitar resultados imprevistos.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con certificados de superación para tu CV.

Plan mensual

19.00 € /mes

Precio normal mensual: 19 €
47 % DE DESCUENTO

Plan anual

10.00 € /mes

Ahorras 108 € al año
Precio normal anual: 120 €
Aprende C online

Todas las lecciones de C

Accede a todas las lecciones de C y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a C y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender el uso de directivas de preprocesador como #include y #define.
  • Implementar la función main() como punto de entrada en un programa en C.
  • Identificar y usar los tipos de datos primitivos correctamente.
  • Declarar e inicializar variables.
  • Interactuar con el usuario mediante funciones de entrada y salida.
  • Aplicar correcto formato usando printf() y scanf().