Curso de programación con C

C es un lenguaje de programación rápido, portátil y eficiente, ideal para sistemas operativos, software embebido y aplicaciones de alto rendimiento.

Aprende C GRATIS y certifícate

El lenguaje C es uno de los lenguajes de programación más influyentes y ampliamente utilizados. Fue desarrollado a principios de la década de 1970 por Dennis Ritchie en los Laboratorios Bell, y ha servido como base para muchos otros lenguajes modernos (como C++, C#, Java y muchos más). A continuación, se presenta una explicación de los fundamentos de C y un recorrido por su sintaxis principal.


1. Características y fundamentos del lenguaje C

  • Lenguaje compilado:
    El código fuente escrito en C se compila a código máquina específico para la arquitectura de la computadora, lo que permite programas eficientes y rápidos.

  • Lenguaje estructurado:
    Se basa en la descomposición del programa en funciones y módulos, facilitando el diseño, la lectura y el mantenimiento del código.

  • Tipado estático y fuerte:
    Cada variable en C debe declararse con un tipo específico (por ejemplo, int, float, char), lo que ayuda a detectar errores durante la compilación.

  • Acceso de bajo nivel:
    Permite manipular directamente la memoria (por ejemplo, mediante punteros), lo que es fundamental en programación de sistemas y desarrollo de controladores, sistemas operativos y software embebido.

  • Portabilidad:
    Aunque el código debe compilarse para cada plataforma, C fue diseñado con portabilidad en mente, lo que significa que un programa en C puede ser adaptado a diferentes sistemas con pocos cambios.


2. Estructura básica de un programa en C

Todo programa en C tiene una estructura mínima que incluye la función main(), que es el punto de entrada. Además, se utilizan directivas del preprocesador para incluir librerías o definir macros. Un ejemplo básico:

#include <stdio.h>   // Inclusión de la librería estándar de entrada/salida

// Función principal: punto de entrada del programa
int main() {
    // Instrucción que imprime un mensaje en la consola
    printf("Hola, mundo!\n");
    return 0;  // Indica que el programa terminó correctamente
}

Elementos a notar:

  • #include <stdio.h>: Directiva del preprocesador que incluye la librería estándar de entrada y salida.
  • int main() { ... }: Definición de la función principal.
  • printf(...): Función para mostrar información en la consola.
  • return 0;: Devuelve un valor al sistema operativo indicando el estado de salida del programa.

3. Sintaxis principal del lenguaje C

Declaración de variables y tipos de datos

C tiene varios tipos de datos básicos:

  • Enteros: int, short, long, unsigned int, etc.
  • Punto flotante: float, double.
  • Caracteres: char.

Ejemplo de declaración y asignación:

#include <stdio.h>

int main() {
    int edad = 25;         // Declaración de un entero
    float altura = 1.75;   // Declaración de un número de punto flotante
    char inicial = 'J';    // Declaración de un carácter

    printf("Edad: %d, Altura: %.2f, Inicial: %c\n", edad, altura, inicial);
    return 0;
}

Formato de impresión:

  • %d para enteros.
  • %f o %.2f para números flotantes (con 2 decimales en este caso).
  • %c para caracteres.

Operadores

C cuenta con diversos operadores:

  • Aritméticos: +, -, *, /, % (módulo)
  • Asignación: =, +=, -=, etc.
  • Comparación: ==, !=, <, >, <=, >=
  • Lógicos: && (AND), || (OR), ! (NOT)
  • Incremento/Decremento: ++, --

Ejemplo:

#include <stdio.h>

int main() {
    int a = 10, b = 3;
    int suma = a + b;
    int modulo = a % b;
    
    printf("Suma: %d, Módulo: %d\n", suma, modulo);
    return 0;
}

Estructuras de control

Sentencias condicionales

If-Else:

#include <stdio.h>

int main() {
    int numero = 7;
    
    if (numero % 2 == 0) {
        printf("El número es par.\n");
    } else {
        printf("El número es impar.\n");
    }
    return 0;
}

Switch:

#include <stdio.h>

int main() {
    int opcion = 2;
    
    switch(opcion) {
        case 1:
            printf("Opción 1 seleccionada.\n");
            break;
        case 2:
            printf("Opción 2 seleccionada.\n");
            break;
        default:
            printf("Opción no reconocida.\n");
            break;
    }
    return 0;
}

2. Bucles o iteraciones

While:

#include <stdio.h>

int main() {
    int contador = 0;
    while (contador < 5) {
        printf("Contador: %d\n", contador);
        contador++;
    }
    return 0;
}

Do-While:

#include <stdio.h>

int main() {
    int contador = 0;
    do {
        printf("Contador: %d\n", contador);
        contador++;
    } while (contador < 5);
    return 0;
}

For:

#include <stdio.h>

int main() {
    int i;
    for (i = 0; i < 5; i++) {
        printf("Valor de i: %d\n", i);
    }
    return 0;
}

Funciones

Las funciones permiten modularizar el código. Se pueden declarar y definir funciones para realizar tareas específicas.

Ejemplo con una función que suma dos números:

#include <stdio.h>

// Declaración de la función (prototipo)
int sumar(int a, int b);

int main() {
    int resultado = sumar(3, 4);
    printf("La suma es: %d\n", resultado);
    return 0;
}

// Definición de la función
int sumar(int a, int b) {
    return a + b;
}

Aspectos a considerar:

  • Los prototipos de función son útiles para indicar al compilador la existencia de funciones que se definirán posteriormente.
  • Las funciones pueden retornar valores o ser del tipo void si no retornan nada.

Punteros

Los punteros son variables que almacenan direcciones de memoria. Permiten un control muy preciso sobre la memoria, lo que es crucial en aplicaciones de bajo nivel.

Ejemplo básico de punteros:

#include <stdio.h>

int main() {
    int var = 20;
    int *puntero = &var;  // 'puntero' almacena la dirección de 'var'
    
    printf("Valor de var: %d\n", var);
    printf("Dirección de var: %p\n", (void*)&var);
    printf("Valor almacenado en puntero: %p\n", (void*)puntero);
    printf("Valor al que apunta puntero: %d\n", *puntero);  // Desreferenciación
    
    return 0;
}

Conceptos importantes:

  • &: Operador de dirección.
  • *: Operador de desreferenciación, que accede al valor almacenado en la dirección indicada.

f) Arreglos y cadenas de caracteres

Un arreglo es una colección de elementos del mismo tipo. En C, las cadenas de caracteres se manejan como arreglos de char terminados en un carácter nulo \0.

Ejemplo de un arreglo y una cadena:

#include <stdio.h>

int main() {
    int numeros[5] = {1, 2, 3, 4, 5};  // Arreglo de enteros
    char saludo[] = "Hola";            // Arreglo de caracteres (cadena)
    
    // Recorrido del arreglo de enteros
    for (int i = 0; i < 5; i++) {
        printf("numero[%d] = %d\n", i, numeros[i]);
    }
    
    // Imprimir la cadena
    printf("Saludo: %s\n", saludo);
    
    return 0;
}

Estructuras y uniones

Las estructuras permiten agrupar diferentes tipos de datos bajo un mismo nombre, facilitando la organización y manipulación de datos complejos.

Ejemplo de una estructura:

#include <stdio.h>

// Definición de una estructura para representar una persona
struct Persona {
    char nombre[50];
    int edad;
    float altura;
};

int main() {
    // Declaración e inicialización de una variable de tipo 'struct Persona'
    struct Persona persona1 = {"Juan", 30, 1.80};
    
    printf("Nombre: %s\n", persona1.nombre);
    printf("Edad: %d\n", persona1.edad);
    printf("Altura: %.2f\n", persona1.altura);
    
    return 0;
}

Las uniones son similares a las estructuras, pero todos sus miembros comparten el mismo espacio de memoria, lo que permite ahorrar memoria cuando solo se usa uno de los miembros a la vez.


h) Manejo de memoria dinámica

La biblioteca <stdlib.h> provee funciones para gestionar memoria dinámicamente, como malloc, calloc, realloc y free.

Ejemplo de asignación dinámica:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arreglo;
    int n = 5;
    
    // Asignar memoria para 5 enteros
    arreglo = (int *)malloc(n * sizeof(int));
    
    if (arreglo == NULL) {
        printf("Error en la asignación de memoria.\n");
        return 1;
    }
    
    // Inicializar y mostrar el arreglo
    for (int i = 0; i < n; i++) {
        arreglo[i] = i * 2;
        printf("arreglo[%d] = %d\n", i, arreglo[i]);
    }
    
    // Liberar la memoria asignada
    free(arreglo);
    
    return 0;
}
Aprende C GRATIS online

Tutoriales de C

Aprende C con tutoriales de programación en C.

Tipo de tecnología

Lenguaje

Categoría laboral

Backend

Año de lanzamiento

1972

Developers

ISO/IEC JTC1/SC22/WG14

Todos los módulos de C

Ver todos los módulos de C

Otras tecnologías

Node

Node

Backend

Node.js es un entorno de ejecución de JavaScript basado en el motor V8 de Google.

Vue.js
Vuejs

Vuejs

Frontend

Framework de JS progresivo para construir interfaces de usuario reactivas y modulares.

Seaborn

Seaborn

Ciencia de Datos e Inteligencia artificial

Biblioteca de visualización de datos para Python.

Apache Spark
PySpark

PySpark

Big Data

Motor unificado de análisis de datos distribuido para grandes volúmenes.

Java

Java

Backend

Lenguaje de programación versátil y multiplataforma.

TypeScript
TypeScript

TypeScript

Full Stack

Superconjunto de JavaScript con tipado estático.

OpenCV
OpenCV

OpenCV

Ciencia de Datos e Inteligencia artificial

Biblioteca de Python para el aprendizaje automático, incluyendo clasificación, regresión, clustering y reducción de dimensionalidad.

NestJS
Nest

Nest

Backend

Framework Node.js para crear aplicaciones escalables y eficientes.

React
React

React

Frontend

Librería framework para frontend interfaces de usuario.

CSharp

CSharp

Backend

Lenguaje de programación de Microsoft para aplicaciones robustas.

Spring Boot
SpringBoot

SpringBoot

Backend

Framework para desarrollo rápido de aplicaciones Java.

Docker
Docker

Docker

DevOps

Plataforma de contenedores para aplicaciones portátiles.

Go
Go

Go

Backend

Lenguaje de programación eficiente y concurrente creado por Google.

scikit-learn
ScikitLearn

ScikitLearn

Backend

Biblioteca de aprendizaje automático en Python.

SQL

SQL

Administración de bases de datos

Lenguaje para gestionar bases de datos relacionales.

Fundamentos

Fundamentos

Full Stack

Fundamentos y bases de la programación de software moderna.

PHP
PHP

PHP

Backend

Lenguaje de programación para desarrollo web del lado del servidor.

Tailwind CSS
TailwindCSS

TailwindCSS

Frontend

Framework de utilidades CSS para diseños rápidos y personalizables.

TensorFlow
TensorFlow

TensorFlow

Backend

Biblioteca Python para redes neuronales en Deep Learning

Selenium
Selenium

Selenium

Testing / QA (Quality Assurance)

Suite de herramientas open-source para automatizar navegadores web y pruebas de software de interfaz de usuario.

Git
Git

Git

DevOps

Sistema de control de versiones distribuido.

Kotlin
Kotlin

Kotlin

Backend

Lenguaje de programación moderno y seguro para aplicaciones Android.

NumPy
Numpy

Numpy

Ciencia de Datos e Inteligencia artificial

Biblioteca Python para computación científica y matrices.

HTML5
HTML

HTML

Frontend

Lenguaje de marcado para estructurar contenido web.

GNU Bash
Bash

Bash

Administración de sistemas

Intérprete de comandos para sistemas Unix y Linux.

2022-09-27T22:26:51.030457 image/svg+xml Matplotlib v3.6.0, https://matplotlib.org/
Matplotlib

Matplotlib

Ciencia de Datos e Inteligencia artificial

Biblioteca Python para crear gráficos y visualizaciones.

Bootstrap
Bootstrap

Bootstrap

Frontend

Framework CSS para diseños web responsive y modernos.

Hibernate
Hibernate

Hibernate

Backend

ORM para Java, simplifica el acceso a bases de datos.

pandas
Pandas

Pandas

Ciencia de Datos e Inteligencia artificial

Herramienta Python para análisis y manipulación de datos.

JavaScript
JavaScript

JavaScript

Full Stack

Lenguaje de scripting para desarrollo web interactivo.

Angular
Angular

Angular

Frontend

Framework web de Google para aplicaciones dinámicas.

CSS3
CSS

CSS

Frontend

Lenguaje de estilo para diseñar páginas web atractivas.

Python
Python

Python

Backend

Lenguaje de programación fácil de aprender y versátil.

Acceder a todas las tecnologías