Estructuras y Punteros en Lenguaje C: Registro y Cálculo de Temperaturas Semanales

Enviado por cristian y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 5,11 KB

Implementación de Registro de Temperaturas en Lenguaje C

El siguiente programa implementa la captura, almacenamiento, visualización y procesamiento estadístico de temperaturas diarias a lo largo de una semana. Se emplean estructuras anidadas (struct), definición de tipos mediante typedef, y paso de parámetros tanto por valor como por referencia mediante punteros.

Definición de Librerías y Tipos de Datos

Se declaran las librerías estándar necesarias para operaciones de entrada/salida y llamadas al sistema, así como las estructuras para representar un día individual y la semana completa:

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

struct s_TemperaturaDia {
    int min;  // Temperatura mínima
    int max;  // Temperatura máxima
};

typedef struct s_TemperaturaDia TemperaturaDia;
typedef struct s_TemperaturaDia *pTemperaturaDia;

struct s_TemperaturaSemana {
    TemperaturaDia dia[7];  // Primer día de la semana, índice 0
};

typedef struct s_TemperaturaSemana TemperaturaSemana;
typedef struct s_TemperaturaSemana *pTemperaturaSemana;

Funciones de Lectura y Muestra de Datos

Estas rutinas gestionan la entrada de datos por consola y la impresión organizada por día y por semana:

void LeerTemperaturaDia(pTemperaturaDia dia) {
    int menor, mayor;
    printf("Indique mínima: ");
    scanf("%d", &menor);
    printf("Indique máxima: ");
    scanf("%d", &mayor);
    dia->min = menor;
    dia->max = mayor;
}

void PresentarTemperaturaDia(TemperaturaDia dia) {
    printf("min: %d | max: %d\n", dia.min, dia.max);
}

void LeerTemperaturaSemana(pTemperaturaSemana semana) {
    int i;
    TemperaturaDia dia;
    printf("Ingrese las temperaturas de la semana:\n");
    for (i = 0; i < 7; i++) {
        printf("Día %d:\n", i + 1);
        LeerTemperaturaDia(&dia);
        semana->dia[i].min = dia.min;
        semana->dia[i].max = dia.max;
    }
}

void PresentarTemperaturaSemana(TemperaturaSemana semana) {
    int i;
    printf("\nLas temperaturas ingresadas son:\n");
    for (i = 0; i < 7; i++) {
        printf("Día %d -> ", i + 1);
        PresentarTemperaturaDia(semana.dia[i]);
    }
}

Algoritmos de Búsqueda de Extremos y Promedios

Funciones encargadas de determinar los índices de los días con valores extremos y realizar los cómputos de promedios semanales:

int DiaMayorTemperatura(TemperaturaSemana semana) {
    int poMayor = 0;
    int temMayor = semana.dia[0].max;
    int i;
    for (i = 0; i < 7; i++) {
        if (semana.dia[i].max > temMayor) {
            temMayor = semana.dia[i].max;
            poMayor = i;
        }
    }
    return poMayor;
}

int DiaMenorTemperatura(TemperaturaSemana semana) {
    int poMenor = 0;
    int temMenor = semana.dia[0].min;
    int i;
    for (i = 0; i < 7; i++) {
        if (semana.dia[i].min < temMenor) {
            temMenor = semana.dia[i].min;
            poMenor = i;
        }
    }
    return poMenor;
}

float PromedoMinima(TemperaturaSemana semana) {
    int s = 0, i;
    float prom;
    for (i = 0; i < 7; i++) {
        s = s + semana.dia[i].min;
    }
    prom = s / 7.0f;
    return prom;
}

float PromedoSemana(TemperaturaSemana semana) {
    int i;
    float s = 0.0f, prom, promediodia;
    for (i = 0; i < 7; i++) {
        promediodia = (semana.dia[i].min + semana.dia[i].max) / 2.0f;
        s = s + promediodia;
    }
    prom = s / 7.0f;
    return prom;
}

Función Principal (main)

Punto de entrada de la aplicación donde se declaran las variables, se invocan las subrutinas y se imprimen los resultados calculados:

int main(int argc, char *argv[]) {
    TemperaturaSemana temsem;
    LeerTemperaturaSemana(&temsem);
    PresentarTemperaturaSemana(temsem);

    int dm = DiaMayorTemperatura(temsem);
    printf("El día de mayor temperatura es: %d\n", dm + 1);

    int dme = DiaMenorTemperatura(temsem);
    printf("El día de menor temperatura es: %d\n", dme + 1);

    float pm = PromedoMinima(temsem);
    printf("El promedio de las temperaturas mínimas es: %.2f\n", pm);

    float promedio = PromedoSemana(temsem);
    printf("El promedio general de los días es: %.2f\n", promedio);

    system("PAUSE");
    return 0;
}

Aspectos Técnicos a Considerar

  • Indexación de Arreglos: En C, los índices comienzan en 0 y terminan en 6 para un vector de 7 elementos. Al mostrar los resultados por pantalla se suma 1 para una lectura natural.
  • Tipos de Retorno en Promedios: Las funciones que calculan promedios devuelven un tipo float para preservar la parte decimal y evitar la pérdida de precisión por truncamiento entero.
  • Uso de Punteros: Se recurre al operador flecha (->) al acceder a campos desde punteros (dia->min) y al operador punto (.) cuando se accede de forma directa (dia.min).