fcamuso

c++ 23: lez 16.a

Mar 12th, 2026
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. #include <cstdlib> //per exit()
  2. import std;
  3.  
  4. /* forma moderna c++ 23 (la useremo dopo aver visto le lambda)
  5.  *
  6.  *      auto main() -> int { }
  7.  */
  8.  
  9.  
  10.  /*  Questo programma calcola l'Indice di Massa Corporea (IMC) che  si ottiene dividendo il peso corporeo (in kg)
  11.      per il quadrato dell'altezza (in metri); il valore in kg è un numero intero; il valore in metri è un numero reale
  12.      il risultato è un numero reale */
  13.  
  14.  
  15. //Fa solo pulizia *silenziosa* (SRP Rispettato)
  16. std::string pulisci_buffer()
  17. {
  18.     std::cin.clear();
  19.     //std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  20.     std::string spazzatura;
  21.     getline(std::cin, spazzatura);
  22.     return spazzatura;
  23. }
  24.  
  25. template<typename T>
  26. std::expected<T, std::string> richiedi_numero(std::string messaggio_richiesta_intero)
  27. {
  28.     T valore = 0;
  29.  
  30.     std::print("{}", messaggio_richiesta_intero);
  31.     std::cin >> valore;
  32.  
  33.     if (std::cin.fail())
  34.     {
  35.         std::cin.clear();
  36.  
  37.         //dato errato
  38.         std::string spazzatura;
  39.         std::getline(std::cin, spazzatura);
  40.         return std::unexpected("Errore: '" + spazzatura + "' non è un numero valido!");
  41.        
  42.     }
  43.  
  44.     if (pulisci_buffer() != "")
  45.     {
  46.         return std::unexpected("Errore: input non valido, ci sono caratteri extra dopo il numero!");
  47.     }
  48.  
  49.  
  50.     return valore;
  51. }
  52.  
  53.  
  54.  int main() {
  55.  
  56.     //1. DICHIARAZIONE VARIABILI
  57.     int peso_kg{ 70 };          //per input    
  58.     double altezza_m{ 1.75 };   //per input
  59.  
  60.     double IMC{ 0.0 };          //per calcolo e output
  61.  
  62.    
  63.     //2. INPUT O INGRESSI
  64.     auto risultato = richiedi_numero<int>("dimmi quanto pesi: ");
  65.  
  66.     if (!risultato)  //input tecnicamente NON valido
  67.     {
  68.         std::println("Errore: {}", risultato.error());
  69.         return 1; //programma terminato con errori
  70.     }
  71.  
  72.     peso_kg = risultato.value();
  73.     if (peso_kg <= 0)
  74.     {
  75.         std::println("Peso non valido! Il programma termina");
  76.         return 1; //programma terminato con errori
  77.     }
  78.        
  79.     auto risultato2 = richiedi_numero<double>("dimmi quanto sei alto: ");
  80.     if (!risultato2)  //input tecnicamente NON valido
  81.     {
  82.         std::println("Errore: {}", risultato2.error());
  83.         return 1; //programma terminato con errori
  84.     }
  85.    
  86.     altezza_m = risultato2.value();
  87.     if (altezza_m <= 0)
  88.     {
  89.         std::println("Altezza non valida! Il programma termina");
  90.         return 1; //programma terminato con errori
  91.     }
  92.    
  93.  
  94.     //tecnica alternativa di consumo di expected
  95.    
  96.     //3. ELABORAZIONE
  97.     IMC = peso_kg / (altezza_m * altezza_m);
  98.  
  99.  
  100.     //4 OUTPUT O USCITE
  101.     std::println("IMC calcolato: {}", IMC);
  102.  
  103.  
  104.  
  105.     return 0;
  106. }
  107.  
  108.  
  109.  
  110.  
  111.  
Advertisement
Add Comment
Please, Sign In to add comment