1815 - Unghi: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: 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 '''unghi.in''' va conține pe...
 
No edit summary
Line 4: Line 4:
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?
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 ==
== Date de intrare ==
Fișierul '''unghi.in''' 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ță.
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 ==
== Date de ieşire ==
Fișierul '''unghi.out''' 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ă.
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 ==
== Restricții și precizări ==
* '''n''' este număr natural, 1 ⩽ n ⩽ 100
* '''n''' este număr natural, 1 ⩽ n ⩽ 100
Line 12: Line 12:
* '''m''' este număr natural, 0 ⩽ m ⩽ 60
* '''m''' este număr natural, 0 ⩽ m ⩽ 60
* Dimensiunea unui unghi se măsoară în grade. Un cerc are '''360 de grade'''.
* Dimensiunea unui unghi se măsoară în grade. Un cerc are '''360 de grade'''.
== Exemplu ==
== Exemplul 1 ==
; '''unghi.in'''
; '''unghiin.txt'''
: 3
: 3
: 8 20
: 8 20
: 1 10
: 1 10
: 5 15
: 5 15
; '''unghi.out'''
; '''unghiout.txt'''
: Datele de intrare corespund restrictiilor impuse
: 130
: 130
: 25
: 25
:67.5
:67.5
== Exemplul 2 ==
; '''unghiin.txt'''
: 9
: 2 20
: 1 j
: 5 -15
; '''unghiout.txt'''
: Datele de intrare nu corespund restrictiilor impuse
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
# Deschidem fisierul de intrare
# 1815  Unghi
with open('unghi.in', 'r') as intrare:
def validare(n_validare, h_validare, m_validare):
     n = int(intrare.readline())
     # Verificăm dacă n este în intervalul 1-100
     # Initializam o lista pentru a stoca rezultatele
     if n_validare < 1 or n_validare > 100:
    rezultate = []
        raise ValueError
     # Parcurgem fiecare problema
     # Verificăm dacă fiecare h este în intervalul 0-24
     for _ in range(n):
     for index in range(n_validare):
        # Citim ora si minutul pentru fiecare problema
         if h_validare[index] < 0 or h_validare[index] > 24:
        h, m = map(int, intrare.readline().split())
             raise ValueError
         if h == 12:
    # Verificăm dacă fiecare m este în intervalul 0-60
             h = 0
    for j in range(n_validare):
        # Daca minutul este 60, il setam la 0 si incrementam ora cu 1
         if m_validare[j] < 0 or m_validare[j] > 60:
         if m == 60:
             raise ValueError
             m = 0
    file_out.write("Datele de intrare corespund restrictiilor impuse\n")
            h += 1
        # Calculam pozitia orarului in grade
        ora = 0.5 * (h * 60 + m)
        # Calculam pozitia minutarului in grade
        minut = 6 * m
        # Calculam unghiul absolut dintre orar si minutar
        unghi = abs(ora - minut)
        # Daca unghiul este mai mare de 180 de grade, folosim complementul sau in cerc (360 - unghi)
        unghi = min(360 - unghi, unghi)
        # Adaugam unghiul calculat in lista de rezultate
        rezultate.append(unghi)


# Deschidem fisierul de iesire
 
with open('unghi.out', 'w') as iesire:
def unghi(h_unghi, m_unghi):    # Definim funcția de calcul a unghiului
    # Scriem fiecare unghi calculat pe cate o linie noua in fisierul de iesire
    if h_unghi == 12:
    for unghi in rezultate:
        h_unghi = 0
        iesire.write(str(unghi) + '\n')
    # 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>
</syntaxhighlight>

Revision as of 12:06, 10 November 2023

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>