1752 - nr aparitii rec: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: ==Cerința== Scrieţi în limbajul Python definiţia completă a funcţiei recursive nr_aparitii cu următorul antet: unsigned nr_aparitii(char *sir, char *secventa) ce returnează numărul de apariţii ale şirului de caractere secventa în şirul sir. ==Date de intrare== Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru ==Date de ieșire== Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse." În cazul în c...
 
No edit summary
Line 20: Line 20:


==Rezolvare==
==Rezolvare==
Pentru a implementa această funcție, putem folosi o metodă de căutare a șirului secventa în șirul sir, care presupune compararea caracter cu caracter a celor două șiruri și în cazul în care găsim o potrivire parțială, continuăm căutarea cu restul caracterelor până când găsim sau nu întregul șir secventa.
Pentru a implementa această metodă, putem folosi o funcție auxiliară cauta care primește ca parametrii începutul șirului sir și începutul șirului secventa, și returnează 1 dacă șirul secventa apare în șirul sir începând cu poziția dată, sau 0 în caz contrar. Apoi, putem defini funcția nr_aparitii care folosește această funcție pentru a căuta secvența în șir și, în cazul în care o găsește, mărește numărul de apariții și continuă căutarea începând cu poziția următoare din șirul sir.
În cele ce urmează, vom implementa această soluție și vom adăuga funcții de validare și main pentru a verifica și executa codul.
def validare_input(sir, secventa):
    if ' ' in sir or ' ' in secventa:
        return False
    if len(sir) > 1000 or len(secventa) > 1000:
        return False
    return True
  def nr_aparitii(sir, secventa):
  def nr_aparitii(sir, secventa):
    # Verifică dacă datele de intrare corespund restricțiilor impuse
     if not validare_input(sir, secventa):
     if len(sir) > 1000 or len(secventa) > 1000:
         print("Datele de intrare nu corespund restricțiilor impuse.")
         print("Datele de intrare nu corespund restricțiilor impuse.")
         return None 
         return
     # Caz de bază
     n = len(sir)
    if len(sir) < len(secventa):
    m = len(secventa)
    if n < m:
         return 0
         return 0
    # Cazul general
     if sir[:m] == secventa:
     if sir[:len(secventa)] == secventa:
         return 1 + nr_aparitii(sir[m:], secventa)
         return 1 + nr_aparitii(sir[len(secventa):], secventa)
    else:
        return nr_aparitii(sir[1:], secventa)
def main():
    sir = input("Introduceti sirul: ")
    secventa = input("Introduceti secventa: ")
    if validare_input(sir, secventa):
        print("Datele de intrare corespund restricțiilor impuse.")
        print("Numarul de aparitii ale secventei in sir este:", nr_aparitii(sir, secventa))
     else:
     else:
         return nr_aparitii(sir[1:], secventa)  
         print("Datele de intrare nu corespund restricțiilor impuse.")
  # Exemplu de utilizare
  if __name__ == '__main__':
print(nr_aparitii("maimuta_samurai", "mu")) # afișează 2
    main()

Revision as of 11:42, 25 March 2023

Cerința

Scrieţi în limbajul Python definiţia completă a funcţiei recursive nr_aparitii cu următorul antet:

unsigned nr_aparitii(char *sir, char *secventa) ce returnează numărul de apariţii ale şirului de caractere secventa în şirul sir.

Date de intrare

Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru

Date de ieșire

Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse." În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse.".

Restricții și precizări

cele două şiruri nu conţin spaţii şi au cel mult 1000 de caractere biblioteca cstring (string.h) este deja inclusă la verificare

Exemplu

nr_aparitii("maimuta_samurai", "mu") = 2

Rezolvare

Pentru a implementa această funcție, putem folosi o metodă de căutare a șirului secventa în șirul sir, care presupune compararea caracter cu caracter a celor două șiruri și în cazul în care găsim o potrivire parțială, continuăm căutarea cu restul caracterelor până când găsim sau nu întregul șir secventa.

Pentru a implementa această metodă, putem folosi o funcție auxiliară cauta care primește ca parametrii începutul șirului sir și începutul șirului secventa, și returnează 1 dacă șirul secventa apare în șirul sir începând cu poziția dată, sau 0 în caz contrar. Apoi, putem defini funcția nr_aparitii care folosește această funcție pentru a căuta secvența în șir și, în cazul în care o găsește, mărește numărul de apariții și continuă căutarea începând cu poziția următoare din șirul sir.

În cele ce urmează, vom implementa această soluție și vom adăuga funcții de validare și main pentru a verifica și executa codul.

def validare_input(sir, secventa):
   if ' ' in sir or ' ' in secventa:
       return False
   if len(sir) > 1000 or len(secventa) > 1000:
       return False
   return True
def nr_aparitii(sir, secventa):
   if not validare_input(sir, secventa):
       print("Datele de intrare nu corespund restricțiilor impuse.")
       return
   n = len(sir)
   m = len(secventa)
   if n < m:
       return 0
   if sir[:m] == secventa:
       return 1 + nr_aparitii(sir[m:], secventa)
   else:
       return nr_aparitii(sir[1:], secventa)
def main():
   sir = input("Introduceti sirul: ")
   secventa = input("Introduceti secventa: ")
   if validare_input(sir, secventa):
       print("Datele de intrare corespund restricțiilor impuse.")
       print("Numarul de aparitii ale secventei in sir este:", nr_aparitii(sir, secventa))
   else:
       print("Datele de intrare nu corespund restricțiilor impuse.")
if __name__ == '__main__':
   main()