1815 - Unghi

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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