0234 - Med Poz

From Bitnami MediaWiki
Revision as of 13:01, 28 April 2023 by Alexandra Leș (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Enunț

Se consideră un tablou bidimensional cu n linii şi n coloane ce conţine numere intregi din intervalul [-100,100].

Cerinţa

Să se determine media aritmetică a elementelor strict pozitive din matrice, care sunt situate sub diagonala principală.

Date de intrare

Fişierul de intrare medpoz.in conţine pe prima linie numărul n, iar pe următoarele n linii câte n numere naturale separate prin spaţii, reprezentând elementele tabloului.

Date de ieşire

Dacă datele sunt introduse corect,în fişierul de ieşire medpoz.out se va afișa :"Datele sunt introduse corect.",apoi pe un rând nou va conţine un singur număr, reprezentând valoarea cerută.În cazul contrar,se va afișa pe ecran "Datele nu corespund restricțiilor impuse.".

Restricții și precizări

  • 2 ⩽ n ⩽ 20
  • dacă în matrice nu există elemente strict pozitive, situate sub diagonala principală, se va afișa mesajul NU EXISTA;
  • media se va afişa cu exact trei zecimale, fără rotunjire;

Exemplu

medpoz.in
4
-1 2 4 5
0 6 3 1
2 4 2 0
3 -5 1 -3
medpoz.out
Datele sunt introduse corect.
2.500

Explicație

Valorile strict pozitive situate sub diagonala principală sunt 2, 4, 3 şi 1, iar media lor aritmetică este 2.5. Se va afişa cu trei zecimale, adică 2.500

Rezolvare

<syntaxhighlight lang="python" line>

def validare_date(n: int, a: list[list[int]]) -> bool:

   # Verificare dimensiunea matricei
   if not (2 <= n <= 20):
       return False
   # Verificare interval valori elemente
   for i in range(n):
       for j in range(n):
           if not (-100 <= a[i][j] <= 100):
               return False
   return True

def media_aritmetica_pozitive_sub_diagonala(n: int, a: list[list[int]]) -> float:

   suma_pozitive_sub_diagonala = 0
   numar_elemente_pozitive_sub_diagonala = 0
   # Parcurgere elemente sub diagonala principală
   for i in range(1, n):
       for j in range(i):
           # Dacă elementul este strict pozitiv, se adună la suma S
           if a[i][j] > 0:
               suma_pozitive_sub_diagonala += a[i][j]
               numar_elemente_pozitive_sub_diagonala += 1
   # Daca nu s-au găsit elemente pozitive sub diagonală, se returnează None
   if numar_elemente_pozitive_sub_diagonala == 0:
       return None
   # Altfel, se calculează și se returnează media aritmetică
   else:
       return suma_pozitive_sub_diagonala / numar_elemente_pozitive_sub_diagonala

if __name__ == '__main__':

   # Citire date de intrare
   with open('medpoz.in', 'r') as fin:
       n = int(fin.readline())
       a = []
       for i in range(n):
           linie = list(map(int, fin.readline().split()))
           a.append(linie)
   # Verificare date de intrare
   if not validare_date(n, a):
       with open('medpoz.out', 'w') as fout:
           fout.write("Datele nu corespund restricțiilor impuse.")
   else:
       # Calcul și afișare rezultat
       rezultat = media_aritmetica_pozitive_sub_diagonala(n, a)
       if rezultat is None:
           print("NU EXISTA")
       else:
           with open('medpoz.out', 'w') as fout:
               fout.write("Datele sunt introduse corect.\n")
               fout.write(f"{rezultat:.3f}")

</syntaxhighlight>