0272 - Pare Sort

De la Universitas MediaWiki

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