0234 - Med Poz

De la Universitas MediaWiki

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}")