1815 - Unghi
De la Universitas MediaWiki
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
# 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")