0234 - Med Poz
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
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}")