1815 - Unghi
La geometrie, domnul profesor de matematică le-a vorbit elevilor săi despre unghiuri. Pentru a fi sigur că aceștia au înțeles noțiunile predate, le-a dat o listă cu n probleme.
Cerinţa
Fiind date numărul de ore în variabila h și numărul de minute în variabila m, să se determine câte grade avea unghiul dintre orarul și minutarul unui ceas clasic, la ora h şi m minute?
Date de intrare
Fișierul unghiin.txt va conține pe prima linie un număr natural n, reprezentând numărul de probleme date ca temă, iar pe a doua linie, două numere h și m, separate printr-un spațiu, cu semnificațiile din cerință.
Date de ieşire
Fișierul unghiout.txt va conține pe câte o linie numărul de grade corespunzător unghiului format de orar și minutar, pentru fiecare dintre cele n probleme din temă.
Restricții și precizări
- n este număr natural, 1 ⩽ n ⩽ 100
- h este număr natural, 0 ⩽ h ⩽ 24h
- m este număr natural, 0 ⩽ m ⩽ 60
- Dimensiunea unui unghi se măsoară în grade. Un cerc are 360 de grade.
Exemplul 1
- unghiin.txt
3 8 20 1 10 5 15
- unghiout.txt
Datele de intrare corespund restrictiilor impuse 130 25 67.5
Exemplul 2
- unghiin.txt
9 2 20 1 j 5 -15
- unghiout.txt
Datele de intrare nu corespund restrictiilor impuse
Rezolvare
<syntaxhighlight lang="python" line>
- 1815 Unghi
def validare(n_validare, h_validare, m_validare):
# Verificăm dacă n este în intervalul 1-100 if n_validare < 1 or n_validare > 100: raise ValueError # Verificăm dacă fiecare h este în intervalul 0-24 for index in range(n_validare): if h_validare[index] < 0 or h_validare[index] > 24: raise ValueError # Verificăm dacă fiecare m este în intervalul 0-60 for j in range(n_validare): if m_validare[j] < 0 or m_validare[j] > 60: raise ValueError file_out.write("Datele de intrare corespund restrictiilor impuse\n")
def unghi(h_unghi, m_unghi): # Definim funcția de calcul a unghiului
if h_unghi == 12: h_unghi = 0 # Convertim minutul 60 la 0 și incrementăm ora cu 1 if m_unghi == 60: m_unghi = 0 h_unghi += 1 ora = 0.5 * (h_unghi * 60 + m_unghi) # Calculăm poziția orarului în grade minut = 6 * m_unghi # Calculăm poziția minutarului în grade # Calculăm unghiul absolut dintre orar și minutar unghi_val = abs(ora - minut) # Dacă unghiul este mai mare de 180 de grade, folosim complementul său în cerc (360 - unghi) unghi_val = min(360 - unghi_val, unghi_val) return unghi_val
if __name__ == '__main__':
file_in = open("unghiin.txt", "r") # Deschidem fișierul de intrare pentru citire file_out = open("unghiout.txt", "w") # Deschidem fișierul de ieșire pentru scriere
# Încercăm să citim datele de intrare și să calculăm unghiurile try: n_main = int(file_in.readline()) # Citim numărul de probleme # Inițializăm listele pentru ore și minute h_main = [] m_main = [] # Citim orele și minutele pentru fiecare problemă for _ in range(n_main): h, m = map(int, file_in.readline().split()) h_main.append(h) m_main.append(m) validare(n_main, h_main, m_main) # Validăm datele de intrare # Calculăm și scriem unghiul pentru fiecare problemă for i in range(n_main): unghi_main = unghi(h_main[i], m_main[i]) file_out.write(str(unghi_main) + '\n')
# Tratăm excepțiile care pot apărea la citirea datelor de intrare except ValueError: file_out.write("Datele de intrare nu corespund restrictiilor impuse") except IndexError: file_out.write("Datele de intrare nu corespund restrictiilor impuse")
</syntaxhighlight>