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