1660 - Fotbal

From Bitnami MediaWiki
Revision as of 20:04, 14 May 2023 by Catalin Moje (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerința

Gigel se joacă fotbal. El fiind un informatician de excepție , ar vrea să determine in cate moduri poți ajunge la un anumit scor.

Date de intrare

Se va introduce de la tastatură 2 numere naturale reprezentând scorul în timpul actual. Să se determine în câte moduri se poate ajunge de la 0-0 la acel scor.

Date de ieșire

Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul "Datele de intrare corespund restricțiilor" și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: "Datele de intrare nu corespund cerinței".

Restricții și precizări

cele 2 numere citite vor fi mai mici decât 10

Exemplu

Exemplu 1

<syntaxhighlight lang="python">

Introduceti primul numar: 3 Introduceti al doilea numar: 0 Datele de intrare corespund restrictiilor Numarul de moduri de a ajunge la scorul 3-0 este 1 </syntaxhighlight>

Exemplu 2

<syntaxhighlight lang="python">

Introduceti primul numar: 11 Introduceti al doilea numar: 10 Datele de intrare nu corespund cerintei. Numerele introduse trebuie sa fie numere intregi pozitive mai mici sau egale cu 10 </syntaxhighlight>

Exemplu 3

Intrare:

I;ntroduceti primul numar: abc

Iesire:
Datele de intrare nu corespund cerintei.
invalid literal for int() with base 10
'abc'


Rezolvare

<syntaxhighlight lang="python" line="1"> def validare(num1, num2):

   if not isinstance(num1, int) or not isinstance(num2, int):
       raise ValueError("Numerele introduse trebuie sa fie numere intregi")
   if num1 < 0 or num1 > 10 or num2 < 0 or num2 > 10:
       raise ValueError("Numerele introduse trebuie sa fie numere intregi pozitive mai mici sau egale cu 10")


def numar_moduri(a, b):

   n = a + b
   k = a
   rezultat = 1
   for i in range(1, k + 1):
       rezultat *= (n - k + i) / i
   return int(rezultat)


def main():

   try:
       num1 = int(input("Introduceti primul numar: "))
       num2 = int(input("Introduceti al doilea numar: "))
       validare(num1, num2)
       print("Datele de intrare corespund restrictiilor")
       rezultat = numar_moduri(num1, num2)
       print(f"Numarul de moduri de a ajunge la scorul {num1}-{num2} este {rezultat}")
   except ValueError as e:
       print(f"Datele de intrare nu corespund cerintei.\n{e}")


if __name__ == '__main__':

   main()


</syntaxhighlight>

Explicații

  1. 1Începem cu funcția validare(num1, num2). Aceasta primește cele două numere de intrare, num1 și num2, și verifică dacă sunt valide. Dacă unul dintre cele două numere nu este un număr întreg sau nu se încadrează în intervalul permis (mai mare decât 0 și mai mic sau egal cu 10), atunci funcția aruncă o excepție ValueError cu un mesaj corespunzător.
  1. 2 Următoarea funcție, numar_moduri(a, b), primește scorul actual al jocului ca o pereche de numere, a și b, și calculează numărul de moduri de a ajunge la acel scor folosind formula combinatorică menționată în enunț. Pentru a calcula combinația de (a+b) luate câte a, am folosit o metodă iterativă care înmulțește fracțiuni succesive de la 1 la a și le împarte la fracțiuni succesive de la (n-k+1) la n. Dacă nu transformăm rezultatul final într-un întreg folosind int(rezultat), atunci acesta ar fi un float.
  1. 3 Funcția main() este punctul de intrare al programului. Aceasta primește intrările de la utilizator și validează datele folosind funcția validare(). Dacă datele sunt valide, se afișează un mesaj corespunzător, iar numărul de moduri de a ajunge la scorul respectiv se calculează folosind funcția numar_moduri() și se afișează.
  1. 4 În final, blocul if __name__ == '__main__': verifică dacă acesta este modulul principal și, în caz afirmativ, apelează funcția main(). Această verificare este importantă pentru a ne asigura că codul din modulul nostru nu va fi rulat accidental atunci când este importat ca modul în alt script.