0516 - SumSec1: Diferență între versiuni

De la Universitas MediaWiki
Fără descriere a modificării
Fără descriere a modificării
Linia 6: Linia 6:
Programul va citi de la tastatură numărul n, apoi cele n elemente ale vectorului.
Programul va citi de la tastatură numărul n, apoi cele n elemente ale vectorului.
== Date de ieșire ==  
== Date de ieșire ==  
Programul va fișa pe ecran numărul S, reprezentând suma calculată.
Dacă datele sunt introduse corect, pe ecran se va afișa:
'''"Datele sunt introduse corect."''', apoi pe un rând nou '''numărul c''', 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 ==
* 1 ≤ n ≤ 1000
* 1 ≤ n ≤ 1000
Linia 28: Linia 30:
def validate_input(n, v):
def validate_input(n, v):
     if n < 1 or n > 1000:
     if n < 1 or n > 1000:
         print("n nu respecta restricțiile impuse")
         print("Datele nu corespund restricțiilor impuse.")
         return False
         return False
     if not any(x % 2 == 1 for x in v):
     if not any(x % 2 == 1 for x in v):
Linia 35: Linia 37:
     for i in range(n):
     for i in range(n):
         if v[i] < 1 or v[i] > 1000000:
         if v[i] < 1 or v[i] > 1000000:
             print("valorile din v nu respecta restricțiile impuse")
             print("Datele nu corespund restricțiilor impuse.")
             return False
             return False
     return True
     return True
Linia 50: Linia 52:


def read_input():
def read_input():
     n = int(input())
     try:
    v = list(map(int, input().split()))
        n = int(input("Introduceti valoarea lui n: "))
    if not validate_input(n, v):
        v = list(map(int, input("Introduceti valorile vectorului, separate prin spatiu: ").split()))
         exit()
        if not validate_input(n, v):
    return n, v
            print("Datele nu corespund restricțiilor impuse.")
            return None, None
         print("Datele sunt introduse corect.")
        return n, v
    except ValueError:
        print("Datele nu corespund formatului așteptat.")
        return None, None


if __name__ == '__main__':
if __name__ == '__main__':
     n, v = read_input()
     n, v = read_input()
     print(suma_elemente_impare(n, v))
     if n is not None and v is not None:
        print(suma_elemente_impare(n, v))
 
</syntaxhighlight>
</syntaxhighlight>



Versiunea de la data 27 aprilie 2023 17:33

Sursa: https://www.pbinfo.ro/probleme/516/sumsec1 0516 - SumSec1]


Cerinţa

Se dă un vector format din n elemente, numere naturale. Calculați suma elementelor din secvența determinată de primul și ultimul element impar.

Date de intrare

Programul va citi de la tastatură numărul n, apoi cele n elemente ale vectorului.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou numărul c, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • 1 ≤ n ≤ 1000
  • elementele vectorului vor fi mai mici decât 1.000.000
  • vectorul va conţine cel puțin un element impar

Exemplu

Intrare
8
12 10 15 6 7 10 19 14
Ieșire
5 4

Rezolvare

Rezolvare ver. 1

# 0516 - SumSec1

def validate_input(n, v):
    if n < 1 or n > 1000:
        print("Datele nu corespund restricțiilor impuse.")
        return False
    if not any(x % 2 == 1 for x in v):
        print("vectorul trebuie sa contina cel putin un element impar")
        return False
    for i in range(n):
        if v[i] < 1 or v[i] > 1000000:
            print("Datele nu corespund restricțiilor impuse.")
            return False
    return True

def suma_elemente_impare(n, v):
    first_odd = -1
    last_odd = -1
    for i in range(n):
        if v[i] % 2 == 1:
            if first_odd == -1:
                first_odd = i
            last_odd = i
    return sum(v[first_odd:last_odd+1])

def read_input():
    try:
        n = int(input("Introduceti valoarea lui n: "))
        v = list(map(int, input("Introduceti valorile vectorului, separate prin spatiu: ").split()))
        if not validate_input(n, v):
            print("Datele nu corespund restricțiilor impuse.")
            return None, None
        print("Datele sunt introduse corect.")
        return n, v
    except ValueError:
        print("Datele nu corespund formatului așteptat.")
        return None, None

if __name__ == '__main__':
    n, v = read_input()
    if n is not None and v is not None:
        print(suma_elemente_impare(n, v))

Explicație rezolvare

Funcția validate_input primește numărul de elemente n și vectorul v și verifică dacă acestea respectă restricțiile impuse. Dacă se găsește o problemă, se va afișa un mesaj de eroare și se va returna False. Altfel, se va returna True.

Funcția suma_elemente_impare primește numărul de elemente n și vectorul v și calculează suma elementelor dintre primul și ultimul element impar din vector.

Funcția read_input primește datele de intrare și le validează folosind funcția validate_input. Dacă datele sunt valide, acestea vor fi returnate într-un tuplu.

În final, în blocul if __name__ == '__main__', se va apela funcția read_input pentru a citi datele de intrare, apoi funcția suma_elemente_impare pentru a calcula suma și se va afișa rezultatul pe ecran.