Skip to content
This repository has been archived by the owner on Aug 9, 2024. It is now read-only.

Commit

Permalink
Entrega del Parcial
Browse files Browse the repository at this point in the history
  • Loading branch information
Laifsyn committed Apr 19, 2024
1 parent 8d5ef82 commit fe8f3de
Showing 1 changed file with 167 additions and 21 deletions.
188 changes: 167 additions & 21 deletions src/main/java/com/utp/clsHerramientas/parcial_1/App.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.utp.clsHerramientas.pry2;
package com.utp.clsHerramientas.parcial_1;

import java.math.BigDecimal;
import java.math.RoundingMode;
Expand All @@ -21,18 +21,22 @@ static Result<BigDecimal, String> readBigDecimal(String message) {
if (line.isEmpty()) {
return Result.error("No se ingresó un valor.");
}
if (line.get().equals("exit")) {
System.exit(0);
}
try {
return Result.ok(new BigDecimal(line.get()));
} catch (Exception e) {
return Result.error("El valor ingresado no es un número : `{}`%n".replace("{}", line.get()));
return Result.error("El valor ingresado no es un número : `{}`".replace("{}", line.get()));
}
}

public static void main(String[] args) {
while (true) {
System.out.println("1-) Calcular el interes compuesto.");
System.out.println("2-) Calcular la velocidad de los corredores.");
System.out.println("3-) Salir.");
System.out.println("3-) Reporte climático.");
System.out.println("4-) Salir.");
var opcion = System.console().readLine();
switch (opcion) {
case "1" -> {
Expand Down Expand Up @@ -117,6 +121,79 @@ public static void main(String[] args) {
tiempoCarrera.imprimirVelocidad();
}
case "3" -> {
while (true) {
System.out.println("Ingrese los datos iniciales: ");
Result<BigDecimal, String> maybe_temperatura = readBigDecimal("Temperatura: ");
if (maybe_temperatura.isError()) {
System.out.println(maybe_temperatura.unwrapError());
continue;
}
var maybe_probabilidadLluvia = readBigDecimal("Probabilidad de lluvia: ");
if (maybe_probabilidadLluvia.isError()) {
System.out.println(maybe_probabilidadLluvia.unwrapError());
continue;
}
var maybe_dias = readBigDecimal("Días a predecir: ");
if (maybe_dias.isError()) {
System.out.println(maybe_dias.unwrapError());
continue;
}
double temperatura = maybe_temperatura.get().doubleValue();
int dias = maybe_dias.get().intValue();
if (dias < 0) {
System.out.println("El número de días no puede ser negativo.");
continue;
}
double probabilidadLluvia = maybe_probabilidadLluvia.get().doubleValue();

ProbabilidadLluvia pronostico = new ProbabilidadLluvia(temperatura, probabilidadLluvia, dias);
ArrayList<ReporteNDia> reportes = new ArrayList<>();
for (int i = 0; i < dias; i++) {
System.out.println("Ingrese la temperatura del día " + (i + 1) + ": ");
maybe_temperatura = readBigDecimal("Temperatura: ");
if (maybe_temperatura.isError()) {
System.out.println(maybe_temperatura.unwrapError());
continue;
}
double temperatura_hoy = maybe_temperatura.get().doubleValue();
Optional<ReporteNDia> reporte = pronostico.next_with_temperatura(temperatura_hoy);
if (reporte.isEmpty()) {
break;
}
reportes.add(reporte.get());
}
if (reportes.isEmpty()) {
System.out.println("No se ingresaron reportes.");
continue;
}
double max_temp = reportes.get(0).temperatura();
double min_temp = max_temp;
int dias_con_lluvia = 0;
for (var reporte : reportes) {
if (reporte.temperatura() > max_temp) {
max_temp = reporte.temperatura();
}
if (reporte.temperatura() < min_temp) {
min_temp = reporte.temperatura();
}
if (reporte.probabilidadLluvia() >= 100.0) {
dias_con_lluvia++;
}
System.out.println(reporte.leer_reporte());
}
System.out.printf("%nPronóstico para los próximos %d días:%n", dias);
if (dias_con_lluvia == reportes.size()) {
System.out.println("Va a llover todos los días.");
} else {
System.out.printf("Va a llover %d de %d dias%n", dias_con_lluvia, reportes.size());
}
// Rango de temperaturas
System.out.printf("Temperatura máxima: %.2f%n", max_temp);
System.out.printf("Temperatura mínima: %.2f%n", min_temp);
break;
}
}
case "4" -> {
return;
}
default -> System.out.println("Opción no válida.");
Expand All @@ -134,16 +211,6 @@ static Result<Integer, String> tryParseInt(String input) {

}

// • Muchos bancos y cajas de ahorro calculan los intereses de las cantidades
// depositadas por los clientes diariamente según las premisas siguientes. Un
// capital de 1,000 dólares, con una tasa de interés del 6 por 100, renta un
// interés en un día de 0.06 multiplicado por 1,000 y dividido por 365. Esta
// operación producirá 0,16 dólares de interés y el capital acumulado será
// 1,000.16. El interés para el segundo día se calculará multiplicando 0.06 por
// 1,000 y dividiendo el resultado por 365. Diseñar un módulo que reciba tres
// entradas: el capital a depositar, la tasa de interés y la duración del
// depósito en semanas, y calcular el capital total acumulado al final del
// período de tiempo especificado.
class InteresCompositivo {
public static final int SCALE = 64;

Expand All @@ -160,13 +227,6 @@ public static BigDecimal calcularInteres(BigDecimal capital, BigDecimal tasa, in
}
}

// • Diseñar un módulo para calcular la velocidad (en m/s) de los corredores de
// la carrera de 1,500 metros. La entrada consistirá en parejas de números
// (minutos, segundos) que dan el tiempo del corredor; por cada corredor, el
// algoritmo debe visualizar el tiempo en minutos y segundos, así como la
// velocidad media. Ejemplo de entrada de datos: (3,53) (3,40) (3,46) (3,52)
// (4,0) (0,0); el último par de datos se utilizará como fin de entrada de
// datos.
class TiempoCarrera {
ArrayList<Duration> tiempos = new ArrayList<>();
static final double DISTANCIA = 1500.0;
Expand Down Expand Up @@ -203,4 +263,90 @@ public void imprimirVelocidad() {
contador++;
}
}
}
}

record ReporteNDia(int dia, double temperatura, double probabilidadLluvia) {
public String leer_reporte() {
String llovio = probabilidadLluvia >= 100.0 ? "Llovió" : "No llovió";
return String.format("Dia: `%d`, Temperatura: `%.1f centigrados`, %s (%.1f%% lluvia)", dia, temperatura,
llovio, probabilidadLluvia);
}
}

/*
* Adicione un módulo que simule las condiciones climáticas (temperatura y
* probabilidad de lluvia) de la ciudad de David al pasar un número concreto de
* días según estas reglas:
* o La temperatura inicial y el % de probabilidad lluvia lo define el usuario.
* o Cada día que pasa:
*  10% de posibilidades de lluvias se da cuando la temperatura aumente o
* disminuye 2 grados.
*  Si la temperatura supera los 25 grados, la probabilidad de lluvia al día
* siguiente aumenta un 20%,
*  Si la temperatura baja 5 grados, la probabilidad de lluvia al día siguiente
* en un disminuye 20%.
*  Si llueve (100%), la temperatura del día siguiente disminuye en 1 grado
* o El método recibe en número de días de la predicción y muestra la
* temperatura y si llueve durante todo esos días.
* o También mostrará la temperatura máxima y mínima de ese periodo y cuantos
* días va a llover
*/
class ProbabilidadLluvia {
private double temperatura;
private double probabilidadLluvia;
final private int dias;
private int dia = 0;

public ProbabilidadLluvia(double temperatura, double probabilidadLluvia, int dias) {
this.update_temperatura(temperatura);
this.update_probabilidad_lluvia(probabilidadLluvia);
this.dias = dias;
}

void update_temperatura(double nueva_temperatura) {
offset_temperatura(nueva_temperatura - temperatura);
}

void offset_temperatura(double offset) {
// redondear a 0 cifras
offset = Math.round(offset);
if (Math.abs(offset) == 2.0) {
this.update_probabilidad_lluvia(probabilidadLluvia + 10);
}
if (offset == -5.0) {
this.update_probabilidad_lluvia(probabilidadLluvia - 10);
}
this.temperatura += offset;

}

void update_probabilidad_lluvia(double probabilidad_lluvia) {
this.probabilidadLluvia = probabilidad_lluvia;
if (this.probabilidadLluvia > 100.0) {
this.probabilidadLluvia = 100.0;
}
}

// Computa el reporte de hoy
public Optional<ReporteNDia> next_with_temperatura(final double temperatura_hoy) {
if (this.dia == dias) {
return Optional.empty();
}
double temperatura_offset = 0;
double temperatura_ayer = this.temperatura;
double probabilidad_lluvia_ayer = this.probabilidadLluvia;
// si la temperatura de hoy es mayor a 25 grados, aumentar la probabilidad de
// lluvia
if (temperatura_ayer > 25.0) {
this.update_probabilidad_lluvia(this.probabilidadLluvia + 20);
}
// Si ayer llueve, hoy la temperatura disminuye en 1 grado
if (probabilidad_lluvia_ayer >= 100.0) {
temperatura_offset -= 1.0;
}
this.update_temperatura(temperatura_hoy + temperatura_offset);
this.dia += 1;
return Optional.of(new ReporteNDia(this.dia, this.temperatura, this.probabilidadLluvia));
}

} // ProbabilidadLluvia

0 comments on commit fe8f3de

Please sign in to comment.