3166 - Vas 1: Diferență între versiuni

De la Universitas MediaWiki
 
(Nu s-au afișat 16 versiuni intermediare efectuate de un alt utilizator)
Linia 1: Linia 1:
Sursa: [https://www.pbinfo.ro/probleme/4273/prodpp]
Sursa: [https://www.pbinfo.ro/probleme/4273/prodpp]
== Cerinţa ==
== Cerinţa ==
Într-un vas sunt '''x''' litri de apă '''(x>0)'''. După fiecare '''t''' minute, '''x/i''' din cantitatea de apă rămasă se evaporă. Să se determine după câte minute vor rămâne în vas cel mult '''y''' litri de apă.
Într-un vas sunt '''apa_initiala''' litri de apă '''(apa_initiala>0)'''. După fiecare '''t''' minute, '''apa_initiala\rata_evaporare''' din cantitatea de apă rămasă se evaporă. Să se determine după câte minute vor rămâne în vas cel mult '''apa_minima''' litri de apă.


== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură patru numere naturale '''x t y i'''.
Programul citește de la tastatură patru numere naturale '''apa_initiala,timp_evaporare,apa_minima,rata_evaporare'''.


== Date de ieșire ==  
== Date de ieșire ==  
Programul va afișa pe ecran un număr '''T''', ce reprezintă numărul de minute necesare astfel încât in vas sa rămână cel mult '''y''' litri de apa.
Programul va afișa pe ecran numărul de minute necesare astfel încât in vas sa rămână cel mult '''apa_minima''' litri de apa.


Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează după câte minute vor rămâne în vas cel mult y litri de apă.
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează după câte minute vor rămâne în vas cel mult '''apa_minima''' litri de apă.
   
   
În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."
În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."


== Restricţii şi precizări ==
== Restricţii şi precizări ==
1 ≤ '''x,t,y''' ≤ 1.000.000.000
1 ≤ '''apa_initiala,timp_evaporare,apa_minima''' ≤ 1.000.000.000


2 ≤ '''i''' ≤ 100
2 ≤ '''rata_evaporare''' ≤ 100


== Exemplul 1 ==
== Exemplul 1 ==
; Datele de intrare
; Datele de intrare
: Numerele naturale X T Y I, separate prin spatiu sunt:  
:Introduceti X T Y I, separate prin spatiu:  
: 100 15 20 5
: 100 15 20 5
; Datele de ieșire
: Datele sunt introduse corect.
: Datele sunt introduse corect.
; Datele de ieșire
:Dupa 210 minute, vor ramane in vas cel mult 20 litri de apa
: Dupa 120 minute vor ramane in vas cel mult 20 litri de apa.
<br>
<br>


Linia 30: Linia 30:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#3166
#3166
def cantitatea_de_apa_ramasa(x, t, y, i):
def calculate_remaining_water_time(apa_initiala, timp_evaporare, apa_minima, rata_evaporare):
     remaining_water = x
     remaining_water = apa_initiala
     minutes = 0
     elapsed_time = 0
     while remaining_water > y:
     while remaining_water>rata_evaporare:
         evaporated_water = remaining_water / i
         evaporated_water = remaining_water / rata_evaporare
         remaining_water -= evaporated_water
         remaining_water -= evaporated_water
         minutes += t
         elapsed_time += timp_evaporare
     return minutes
     return elapsed_time


def validare_input(x, t, y, i):
def validate_input(apa_initiala, timp_evaporare, apa_minima, rata_evaporare):
     if not (1 <= x <= 1000000000 and 1 <= t <= 1000000000 and 1 <= y <= 1000000000 and 2 <= i <= 100):
     if not (1 <= apa_initiala <= 1000000000 and 1 <= timp_evaporare <= 1000000000 and 1 <= apa_minima <= 1000000000 and 2 <= rata_evaporare <= 100):
         return False
         return False
     return True
     return True


def main():
if __name__ == '__main__':
     x, t, y, i = map(int, input("Numerele naturale X T Y I, separate prin spatiu sunt: ").split())
     apa_initiala, timp_evaporare, apa_minima, rata_evaporare = map(int, input("Introduceti X T Y I, separate prin spatiu: ").split())
     if not validare_input(x, t, y, i):
     if not validate_input(apa_initiala, timp_evaporare, apa_minima, rata_evaporare):
         print("Datele nu corespund restricțiilor impuse.")
         print("Datele introduse nu corespund restrictiilor impuse.")
     else:
     else:
         T = cantitatea_de_apa_ramasa(x, t, y, i)
         elapsed_time = calculate_remaining_water_time(apa_initiala, timp_evaporare, apa_minima, rata_evaporare)
         print("Datele sunt introduse corect.")
         print("Datele sunt introduse corect.")
         print("Dupa", T, "minute vor ramane in vas cel mult", y, "litri de apa.")
         print("Dupa", elapsed_time, "minute, vor ramane in vas cel mult", apa_minima, "litri de apa")
 
if __name__ == '__main__':
    main()
</syntaxhighlight>
</syntaxhighlight>


'''Explicatie cod:'''
'''Explicatie cod:'''


Acest cod reprezintă o soluție la o problemă care cere determinarea timpului necesar pentru ca într-un vas să rămână cel mult o anumită cantitate de apă, în condițiile în care o anumită proporție din cantitatea rămasă se evaporă la fiecare interval de timp dat.
Acest cod are rolul de a calcula timpul necesar pentru ca cantitatea de apa dintr-un vas sa ajunga la o cantitate minima dupa evaporare, pe baza datelor de intrare: cantitatea initiala de apa din vas, timpul de evaporare pentru fiecare unitate de apa, cantitatea minima de apa pe care dorim sa o lasam in vas si rata de evaporare.
 
Funcția cantitatea_de_apa_ramasa primește patru argumente: x, t, y și i, reprezentând cantitatea inițială de apă din vas, intervalul de timp la care se face evaporația, cantitatea minimă de apă ce trebuie să rămână în vas și proporția de apă care se evaporă la fiecare interval de timp.


Această funcție realizează calculele necesare pentru a determina numărul de minute necesare până când în vas va rămâne cel mult cantitatea minimă de apă y. Într-un while loop se calculează cantitatea de apă evaporată la fiecare pas de timp și se actualizează cantitatea de apă rămasă în vas prin scăderea cantității evaporate. În același timp, variabila minutes este actualizată cu intervalul de timp t. Procesul se repetă până când cantitatea de apă rămasă în vas este mai mică sau egală cu cantitatea minimă y.
Funcția calculate_remaining_water_time primește ca parametri cantitatea inițială de apă, timpul de evaporare pentru fiecare unitate de apă, cantitatea minimă de apă pe care dorim să o lăsăm în vas și rata de evaporare. Ea calculează timpul necesar pentru ca cantitatea de apă din vas să ajungă la cantitatea minimă prin scăderea continuă a cantității de apă evaporată de rata de evaporare.


Funcția validare_input verifică dacă argumentele date sunt valide, conform cerințelor problemei.
Funcția validate_input primește ca parametri datele de intrare și returnează True dacă acestea respectă restricțiile impuse (cantitățile de apă trebuie să fie între 1 și 1.000.000.000, timpul de evaporare între 1 și 1.000.000.000, cantitatea minimă de apă între 1 și 1.000.000.000 și rata de evaporare între 2 și 100), altfel returnează False.


Funcția main primește de la tastatură valorile pentru x, t, y și i, le validează apelând funcția validare_input, apoi apelează funcția cantitatea_de_apa_ramasa și afișează rezultatul pe ecran. Acest cod respectă convenția de a pune codul care utilizează funcțiile definite înainte de definiția funcțiilor în sine, și utilizează construcția if __name__ == '__main__' pentru a se asigura că codul din funcția main este executat doar dacă fișierul curent este rulat ca program principal, nu dacă este importat ca modul într-un alt program.
În secțiunea principală, se cere utilizatorului să introducă cantitatea inițială de apă din vas, timpul de evaporare pentru fiecare unitate de apă, cantitatea minimă de apă pe care dorim să o lăsăm în vas și rata de evaporare. Se validează datele de intrare cu ajutorul funcției validate_input, iar dacă acestea sunt valide, se calculează timpul necesar pentru evaporare cu ajutorul funcției calculate_remaining_water_time și se afișează rezultatul. În caz contrar, se afișează un mesaj de eroare.

Versiunea curentă din 30 aprilie 2023 20:33

Sursa: [1]

Cerinţa

Într-un vas sunt apa_initiala litri de apă (apa_initiala>0). După fiecare t minute, apa_initiala\rata_evaporare din cantitatea de apă rămasă se evaporă. Să se determine după câte minute vor rămâne în vas cel mult apa_minima litri de apă.

Date de intrare

Programul citește de la tastatură patru numere naturale apa_initiala,timp_evaporare,apa_minima,rata_evaporare.

Date de ieșire

Programul va afișa pe ecran numărul de minute necesare astfel încât in vas sa rămână cel mult apa_minima litri de apa.

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează după câte minute vor rămâne în vas cel mult apa_minima litri de apă.

În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."

Restricţii şi precizări

1 ≤ apa_initiala,timp_evaporare,apa_minima ≤ 1.000.000.000

2 ≤ rata_evaporare ≤ 100

Exemplul 1

Datele de intrare
Introduceti X T Y I, separate prin spatiu:
100 15 20 5
Datele de ieșire
Datele sunt introduse corect.
Dupa 210 minute, vor ramane in vas cel mult 20 litri de apa


Rezolvare

#3166
def calculate_remaining_water_time(apa_initiala, timp_evaporare, apa_minima, rata_evaporare):
    remaining_water = apa_initiala
    elapsed_time = 0
    while remaining_water>rata_evaporare:
        evaporated_water = remaining_water / rata_evaporare
        remaining_water -= evaporated_water
        elapsed_time += timp_evaporare
    return elapsed_time

def validate_input(apa_initiala, timp_evaporare, apa_minima, rata_evaporare):
    if not (1 <= apa_initiala <= 1000000000 and 1 <= timp_evaporare <= 1000000000 and 1 <= apa_minima <= 1000000000 and 2 <= rata_evaporare <= 100):
        return False
    return True

if __name__ == '__main__':
    apa_initiala, timp_evaporare, apa_minima, rata_evaporare = map(int, input("Introduceti X T Y I, separate prin spatiu: ").split())
    if not validate_input(apa_initiala, timp_evaporare, apa_minima, rata_evaporare):
        print("Datele introduse nu corespund restrictiilor impuse.")
    else:
        elapsed_time = calculate_remaining_water_time(apa_initiala, timp_evaporare, apa_minima, rata_evaporare)
        print("Datele sunt introduse corect.")
        print("Dupa", elapsed_time, "minute, vor ramane in vas cel mult", apa_minima, "litri de apa")

Explicatie cod:

Acest cod are rolul de a calcula timpul necesar pentru ca cantitatea de apa dintr-un vas sa ajunga la o cantitate minima dupa evaporare, pe baza datelor de intrare: cantitatea initiala de apa din vas, timpul de evaporare pentru fiecare unitate de apa, cantitatea minima de apa pe care dorim sa o lasam in vas si rata de evaporare.

Funcția calculate_remaining_water_time primește ca parametri cantitatea inițială de apă, timpul de evaporare pentru fiecare unitate de apă, cantitatea minimă de apă pe care dorim să o lăsăm în vas și rata de evaporare. Ea calculează timpul necesar pentru ca cantitatea de apă din vas să ajungă la cantitatea minimă prin scăderea continuă a cantității de apă evaporată de rata de evaporare.

Funcția validate_input primește ca parametri datele de intrare și returnează True dacă acestea respectă restricțiile impuse (cantitățile de apă trebuie să fie între 1 și 1.000.000.000, timpul de evaporare între 1 și 1.000.000.000, cantitatea minimă de apă între 1 și 1.000.000.000 și rata de evaporare între 2 și 100), altfel returnează False.

În secțiunea principală, se cere utilizatorului să introducă cantitatea inițială de apă din vas, timpul de evaporare pentru fiecare unitate de apă, cantitatea minimă de apă pe care dorim să o lăsăm în vas și rata de evaporare. Se validează datele de intrare cu ajutorul funcției validate_input, iar dacă acestea sunt valide, se calculează timpul necesar pentru evaporare cu ajutorul funcției calculate_remaining_water_time și se afișează rezultatul. În caz contrar, se afișează un mesaj de eroare.