Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Ejercicios de Estructuras

Universidad Nacional de Río Negro

Acerca de

Estos ejercicios tienen como propósito ejercitar el agrupamiento de tipos heterogéneos bajo una misma entidad de datos empleando la palabra clave struct en C.

Capítulos de Apunte Correspondientes

Cuestiones de Estilo Aplicables


Fracciones

Desarrollar un tipo fraccion_t y las funciones necesarias para operar con fracciones. El objetivo es encapsular el numerador y el denominador en una única entidad.

typedef struct {
    int numerador;
    int denominador;
} fraccion_t;

Ejercicio 18.1 - Operaciones Aritméticas ⭐⭐☆☆☆

Implementar funciones que tomen dos fracciones y retornen el resultado de la operación.

Ejercicio 18.2 - Simplificación ⭐⭐☆☆☆

Implementar una función que modifique una fracción para llevarla a su mínima expresión. La simplificación se realiza dividiendo numerador y denominador por su Máximo Común Divisor (MCD).


División con Resto

Ejercicio 18.3 - Estructura de división ⭐⭐⭐☆☆

La división entera en C (/ y %) produce dos resultados. El objetivo es unificar estas operaciones en una única función que retorne una struct con el cociente y el resto, basándose en el algoritmo de la división.

dividendo=divisor×cociente+resto,donde 0resto<divisordividendo = divisor \times cociente + resto, \quad \text{donde } 0 \le resto < |divisor|
typedef struct {
    int cociente;
    int resto;
} division_t;

division_t division_lenta(int dividendo, int divisor);

Medición de Tiempo

Desarrollar una estructura tiempo_t para representar un instante o duración en horas, minutos y segundos, junto con funciones para manipularla.

typedef struct {
    int horas;
    int minutos;
    int segundos;
} tiempo_t;

Ejercicio 18.4 - Suma de Tiempos ⭐⭐☆☆☆

Implementar una función que sume dos tiempo_t. El resultado debe ser normalizado para que los segundos y minutos no excedan 59.

Ejercicio 18.5 - Comparación de Tiempos ⭐⭐☆☆☆

Implementar una función que compare dos tiempo_t y devuelva un valor que indique si el primero es anterior, igual o posterior al segundo. Una estrategia es convertir ambos tiempos a una unidad común (ej. segundos totales) para facilitar la comparación.

ten_segundos=horas×3600+minutos×60+segundost_{en\_segundos} = horas \times 3600 + minutos \times 60 + segundos

Tipos de Datos Compuestos

Ejercicio 18.6 - Arreglos con Capacidad ⭐⭐⭐☆☆

Encapsular un arreglo en una estructura para agrupar el contenedor de datos, su longitud actual y su capacidad máxima. Esto previene errores de desbordamiento de búfer y simplifica pasar la información del arreglo a funciones.

#define CAPACIDAD_MAX 100
typedef struct {
    int datos[CAPACIDAD_MAX];
    size_t longitud; // Elementos actualmente en uso
} arreglo_t;

Este ejercicio puede ser mejorado con memoria dinámica, para lo cual es necesario agregar un atributo más con el tamaño en memoria pedido para datos.

Ejercicio 18.7 - Cadenas Seguras II ⭐⭐⭐☆☆

Aplicar el mismo principio a las cadenas de caracteres para crear un tipo cadena_segura_t que gestione su propia capacidad y longitud, evitando los peligros asociados a las cadenas de C estándar.

#define CAPACIDAD_MAX_CADENA 256
typedef struct {
    char datos[CAPACIDAD_MAX_CADENA];
    size_t longitud;
} cadena_segura_t;