Untitled

 avatar
unknown
plain_text
9 months ago
7.6 kB
12
Indexable
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

public class TemperaturaFueraDeRangoException : Exception
{
    public TemperaturaFueraDeRangoException()
    {
    }

    public TemperaturaFueraDeRangoException(string message)
        : base(message)
    {
    }

    public TemperaturaFueraDeRangoException(string message, Exception inner)
        : base(message, inner)
    {
    }
}
public class SensorTemperatura
{
    private const double TEMPERATURA_MINIMA = -50.0;
    private const double TEMPERATURA_MAXIMA = 100.0;

    public string ID { get; private set; }
    public string Ubicacion { get; private set; }
    public double TemperaturaActual { get; private set; }

    public SensorTemperatura(string id, string ubicacion, double tempInicial = 0.0)
    {
        ID = id;
        Ubicacion = ubicacion;
        TemperaturaActual = tempInicial;
    }

    public void ActualizarTemperatura(double nuevaTemp)
    {
        if (nuevaTemp < TEMPERATURA_MINIMA || nuevaTemp > TEMPERATURA_MAXIMA)
        {
            throw new TemperaturaFueraDeRangoException(
                $"Error en '{ID}': La temperatura {nuevaTemp}°C está fuera del rango ({TEMPERATURA_MINIMA}°C a {TEMPERATURA_MAXIMA}°C)."
            );
        }
        TemperaturaActual = nuevaTemp;
    }
    public override string ToString()
    {
        return $"ID: {ID,-10} | Ubicación: {Ubicacion,-20} | Temperatura: {TemperaturaActual,6:F1}°C";
    }
}
public class Program
{
    private static List<SensorTemperatura> sensores = new List<SensorTemperatura>();
    private const string nombreArchivo = "lecturas.txt";

    public static void Main(string[] args)
    {
        CargarSensoresDesdeArchivo();

        bool salir = false;
        while (!salir)
        {
            Console.WriteLine("\n--- Menú de Monitoreo de Sensores ---");
            Console.WriteLine("1. Agregar un nuevo sensor");
            Console.WriteLine("2. Actualizar temperatura de un sensor");
            Console.WriteLine("3. Mostrar todas las lecturas");
            Console.WriteLine("4. Calcular estadísticas (Promedio y Máxima)");
            Console.WriteLine("5. Guardar y Salir");
            Console.Write("Seleccione una opción: ");

            switch (Console.ReadLine())
            {
                case "1":
                    AgregarSensor();
                    break;
                case "2":
                    ActualizarTemperaturaSensor();
                    break;
                case "3":
                    MostrarTodasLasLecturas();
                    break;
                case "4":
                    CalcularEstadisticas();
                    break;
                case "5":
                    GuardarSensoresEnArchivo();
                    salir = true;
                    break;
                default:
                    Console.WriteLine("Opción no válida. Intente de nuevo.");
                    break;
            }
        }
        Console.WriteLine("Programa finalizado.");
    }

    private static void AgregarSensor()
    {
        Console.Write("Ingrese el ID del nuevo sensor: ");
        string id = Console.ReadLine();
        Console.Write("Ingrese la ubicación del sensor: ");
        string ubicacion = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(id) || string.IsNullOrWhiteSpace(ubicacion))
        {
            Console.WriteLine("El ID y la ubicación no pueden estar vacíos.");
            return;
        }
        if (sensores.Any(s => s.ID.Equals(id, StringComparison.OrdinalIgnoreCase)))
        {
            Console.WriteLine("Error: Ya existe un sensor con ese ID.");
            return;
        }
        sensores.Add(new SensorTemperatura(id, ubicacion));
        Console.WriteLine("Sensor agregado exitosamente.");
    }
    private static void ActualizarTemperaturaSensor()
    {
        Console.Write("Ingrese el ID del sensor a actualizar: ");
        string id = Console.ReadLine();
        var sensor = sensores.FirstOrDefault(s => s.ID.Equals(id, StringComparison.OrdinalIgnoreCase));
        if (sensor == null)
        {
            Console.WriteLine("Sensor no encontrado.");
            return;
        }
        Console.Write($"Ingrese la nueva temperatura para el sensor '{sensor.ID}' en '{sensor.Ubicacion}': ");
        if (double.TryParse(Console.ReadLine(), out double nuevaTemp))
        {
            try
            {
                sensor.ActualizarTemperatura(nuevaTemp);
                Console.WriteLine("Temperatura actualizada correctamente.");
            }
            catch (TemperaturaFueraDeRangoException ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(ex.Message);
                Console.ResetColor();
            }
        }
        else
        {
            Console.WriteLine("Entrada inválida. Por favor, ingrese un número.");
        }
    }
    private static void MostrarTodasLasLecturas()
    {
        Console.WriteLine("\n--- Lecturas Actuales de Sensores ---");
        if (!sensores.Any())
        {
            Console.WriteLine("No hay sensores registrados.");
            return;
        }

        foreach (var sensor in sensores)
        {
            Console.WriteLine(sensor.ToString());
        }
    }
    private static void CalcularEstadisticas()
    {
        if (!sensores.Any())
        {
            Console.WriteLine("No hay sensores para calcular estadísticas.");
            return;
        }

        double tempPromedio = sensores.Average(s => s.TemperaturaActual);
        double tempMaxima = sensores.Max(s => s.TemperaturaActual);

        Console.WriteLine("\n--- Estadísticas de Temperatura ---");
        Console.WriteLine($"Temperatura Promedio: {tempPromedio:F2}°C");
        Console.WriteLine($"Temperatura Más Alta: {tempMaxima:F1}°C");
    }

    private static void GuardarSensoresEnArchivo()
    {
        try
        {
            using (StreamWriter sw = new StreamWriter(nombreArchivo))
            {
                foreach (var sensor in sensores)
                {
                    sw.WriteLine($"{sensor.ID},{sensor.Ubicacion},{sensor.TemperaturaActual}");
                }
            }
            Console.WriteLine($"Datos guardados correctamente en '{nombreArchivo}'.");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error al guardar el archivo: {ex.Message}");
        }
    }

    private static void CargarSensoresDesdeArchivo()
    {
        if (!File.Exists(nombreArchivo))
        {
            Console.WriteLine("No se encontró archivo 'lecturas.txt'. Empezando desde cero.");
            return;
        }
        
        try
        {
            string[] lineas = File.ReadAllLines(nombreArchivo);
            foreach (var linea in lineas)
            {
                string[] partes = linea.Split(',');
                if (partes.Length == 3 && double.TryParse(partes[2], out double temp))
                {
                    sensores.Add(new SensorTemperatura(partes[0], partes[1], temp));
                }
            }
            Console.WriteLine($"Se cargaron {sensores.Count} sensores desde '{nombreArchivo}'.");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error al cargar el archivo: {ex.Message}");
        }
    }
}
Editor is loading...
Leave a Comment