0516 - SumSec1: Diferență între versiuni

De la Universitas MediaWiki
 
(Nu s-au afișat 3 versiuni intermediare efectuate de alți 2 utilizatori)
Linia 23: Linia 23:
== Exemplu 2 ==
== Exemplu 2 ==
; Intrare
; Intrare
: Introduceti valoarea lui n: 2
: Introduceti valoarea lui n: 4
: 1 2 3 4 5 6  
: 2 4 6 8
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: Datele nu corespund restricțiilor impuse.
: 6 7
 


== Rezolvare ==  
== Rezolvare ==  
Linia 37: Linia 37:
# 0516 - SumSec1
# 0516 - SumSec1


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


def suma_elemente_impare(n, v):
 
     first_odd = -1
def calculate_sum(n, v):
     last_odd = -1
     start = None
     end = None
 
     for i in range(n):
     for i in range(n):
         if v[i] % 2 == 1:
         if vector[i] % 2 == 1:
             if first_odd == -1:
             if start is None:
                 first_odd = i
                 start = i
             last_odd = i
             else:
     return sum(v[first_odd:last_odd+1])
                end = i
 
     return sum(vector[start:end+1])
 
 
if __name__ == "__main__":
    n = int(input("Introduceti valoarea lui n: "))
    vector = list(map(int, input("Introduceti valorile din vector: ").split()))


def read_input():
     if not validate_input(n, vector):
     try:
         exit()
        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__':
     print(calculate_sum(n, vector))
     n, v = read_input()
    if n is not None and v is not None:
        print(suma_elemente_impare(n, v))


</syntaxhighlight>
</syntaxhighlight>
Linia 82: Linia 85:
== Explicație rezolvare==
== 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 validate_input primește patru argumente: n, vector, A și B. Această funcție are rolul de a valida datele de intrare. Verificările pe care le face includ verificarea dacă n se încadrează în intervalul [1, 1000], dacă fiecare element al vectorului vector se încadrează în intervalul [1, 1.000.000], dacă vectorul vector conține cel puțin un element impar și dacă A și B se încadrează în intervalul [1, 2.000.000.000] și dacă A este mai mic sau egal cu B. Dacă toate verificările trec, atunci funcția afișează pe ecran "Datele sunt introduse corect." și returnează True. În caz contrar, funcția afișează pe ecran "Datele nu corespund restricțiilor impuse." și returnează False.
 
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.
Funcția sum_secventa primește trei argumente: n, vector și valid. Această funcție calculează suma elementelor din secvența determinată de primul și ultimul element impar din vectorul vector. Dacă parametrul valid este False, adică datele de intrare nu au trecut validarea, funcția afișează pe ecran "Datele nu corespund restricțiilor impuse." și returnează None. În caz contrar, funcția calculează prima și ultima poziție cu numere impare în vectorul vector, apoi calculează suma elementelor din secvența respectivă și afișează pe ecran această valoare.


Î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.
În funcția main se citesc datele de intrare, se validează cu ajutorul funcției validate_input, și se calculează suma cu ajutorul funcției sum_secventa. Dacă valoarea returnată de sum_secventa este diferită de None, adică dacă datele de intrare au trecut validarea și s-a putut calcula suma, atunci se afișează pe ecran "Datele sunt introduse corect." și valoarea sumei. În caz contrar, se afișează doar "Datele nu corespund restricțiilor impuse."

Versiunea curentă din 14 mai 2023 19:41

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 va fișa pe ecran numărul S, reprezentând suma calculată, 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 1

Intrare
Introduceti valoarea lui n: 8
12 10 15 6 7 10 19 14
Ieșire
Datele sunt introduse correct.
5 4

Exemplu 2

Intrare
Introduceti valoarea lui n: 4
2 4 6 8
Ieșire
Datele nu corespund restricțiilor impuse.


Rezolvare

Rezolvare ver. 1

# 0516 - SumSec1

def validate_input(n, vector):
    if n < 1 or n > 1000:
        print("Datele nu corespund restricțiilor impuse.")
        return False

    has_odd = False
    for i in range(n):
        if vecror[i] < 0 or vector[i] >= 1000000:
            print("Datele nu corespund restricțiilor impuse.")
            return False
        if vector[i] % 2 == 1:
            has_odd = True
    
    if not has_odd:
        print("Datele nu corespund restricțiilor impuse.")
        return False

    print("Datele sunt introduse corect.")
    return True


def calculate_sum(n, v):
    start = None
    end = None

    for i in range(n):
        if vector[i] % 2 == 1:
            if start is None:
                start = i
            else:
                end = i

    return sum(vector[start:end+1])


if __name__ == "__main__":
    n = int(input("Introduceti valoarea lui n: "))
    vector = list(map(int, input("Introduceti valorile din vector: ").split()))

    if not validate_input(n, vector):
        exit()

    print(calculate_sum(n, vector))

Explicație rezolvare

Funcția validate_input primește patru argumente: n, vector, A și B. Această funcție are rolul de a valida datele de intrare. Verificările pe care le face includ verificarea dacă n se încadrează în intervalul [1, 1000], dacă fiecare element al vectorului vector se încadrează în intervalul [1, 1.000.000], dacă vectorul vector conține cel puțin un element impar și dacă A și B se încadrează în intervalul [1, 2.000.000.000] și dacă A este mai mic sau egal cu B. Dacă toate verificările trec, atunci funcția afișează pe ecran "Datele sunt introduse corect." și returnează True. În caz contrar, funcția afișează pe ecran "Datele nu corespund restricțiilor impuse." și returnează False.

Funcția sum_secventa primește trei argumente: n, vector și valid. Această funcție calculează suma elementelor din secvența determinată de primul și ultimul element impar din vectorul vector. Dacă parametrul valid este False, adică datele de intrare nu au trecut validarea, funcția afișează pe ecran "Datele nu corespund restricțiilor impuse." și returnează None. În caz contrar, funcția calculează prima și ultima poziție cu numere impare în vectorul vector, apoi calculează suma elementelor din secvența respectivă și afișează pe ecran această valoare.

În funcția main se citesc datele de intrare, se validează cu ajutorul funcției validate_input, și se calculează suma cu ajutorul funcției sum_secventa. Dacă valoarea returnată de sum_secventa este diferită de None, adică dacă datele de intrare au trecut validarea și s-a putut calcula suma, atunci se afișează pe ecran "Datele sunt introduse corect." și valoarea sumei. În caz contrar, se afișează doar "Datele nu corespund restricțiilor impuse."