1815 - Unghi

From Bitnami MediaWiki
Revision as of 12:06, 10 November 2023 by AntalKrisztian (talk | contribs)

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>

  1. 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>