0234 - Med Poz

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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