0272 - Pare Sort

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.

Cerința

Se dă un şir cu n elemente, numere naturale nenule cu cel mult 4 cifre fiecare. Afişaţi, în ordine crescătoare, valorile pare din şir. Dacă şirul nu conţine nici o valoare pară, se va afişa mesajul nu exista.

Date de intrare

Fişierul de intrare paresortin.txt conţine pe prima linie numărul n; urmează cele n elemente ale şirului, dispuse pe mai multe linii, separate prin spaţii.

Date de ieșire

Dacă datele sunt introduse corect, în fișierul paresortout.txt se va afișa: " Datele de intrare corespund restrictiilor impuse", fişierul de ieşire paresort.out va conţine pe prima linie numărul m, numărul de valori pare din şir, iar pe a două linie aceste valori, în ordine crescătoare, separate printr-un spaţiu. Dacă şirul nu conţine nici un număr par, fişierul va conţine doar mesajul nu exista, situat pe prima linie. Iar dacă condițiile nu sunt îndeplinite, se va afișa mesajul:" Datele de intrare nu corespund restrictiilor impuse".

Restricții și precizări

  • 1 ≤ n ≤ 1000

Exemplu 1

paresortin.txt
9
2 3 1 4 7 2 5 8 6
paresortout.txt
Datele introduse corespund restricțiilor impuse.
5
2 2 4 6 8


Exemplu 2

paresortin.txt
0
paresortout.txt
Datele de intrare nu corespund restricțiilor impuse.


Rezolvare

# 0272 PareSort

def validare(nr_elemente, sir_numere):      # functia in care se verifica daca datele de intrare sunt valide
    # in cazul in care nu este respectata vreo restrictie, vom marca acest lucru prin eroarea ValueError
    if nr_elemente > 255:
        raise ValueError

    for numar in sir_numere:
        if numar <= 0 or numar >= 10000:
            raise ValueError

    if nr_elemente != len(sir_numere):
        raise ValueError

    file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def paresort(sir_numere):
    sir_pare = []                   # creem o lista doar cu numerele pare
    for numar in sir_numere:
        if numar % 2 == 0:
            sir_pare.append(numar)

    if len(sir_pare) == 0:              # daca nu exista, afisam mesajul corespunzator si incheiem programul
        file_out.write("nu exista")
        return

    file_out.write(str(len(sir_pare)) + "\n")   # daca am ajuns aici, inseamna ca avem numere pare, afisam cate sunt

    sir_pare.sort()                 # sortam sirul deoarece trebuie in ordine crescatoare

    for numar in sir_pare:
        file_out.write(str(numar) + " ")    # scriem sirul rezultat in fisier


if __name__ == '__main__':

    file_in = open("paresortin.txt", "r")   # declararea fisierelor conform cerintei
    file_out = open("paresortout.txt", "w")

    try:                                    # in cazul in care datele de intrare nu sunt corecte, va fi eroare
        n = file_in.readline()
        sir = file_in.readline()
        n = int(n)

        sir = sir.split()                   # creem o lista cu fiecare element din sir separat prin spatiu
        sir = list(map(int, sir))           # sirul citit este un sir de caractere, il transformam in sir de int

        validare(n, sir)                    # validam datele

        paresort(sir)                       # apelam functia de rezolvare a problemei

    # ne asteptam la 2 tipuri de erori cauzate de datele de intrare, daca apar, le tratam corespunzator
    except ValueError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")