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")