0234 - Med Poz: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: == 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, reprez...)
 
Fără descriere a modificării
 
Linia 6: Linia 6:
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.
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 ==
== 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 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."'''.
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 ==
== Restricții și precizări ==
* 2 ⩽ n ⩽ 20
* 2 ⩽ n ⩽ 20

Versiunea curentă din 28 aprilie 2023 13:01

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