Informatică, întrebare adresată de climaCode, 8 ani în urmă

URGENT!!

Să se scrie un program C++ care conține o (singură) funcție ce returnează numărul de apariții ale subșirului sir2 in șirul sir1, precum și indecșii de la care încep subșirurile sir2 in sir1.

sir1 conține maxim 1000 de caractere, iar sir2 maxim 100 caractere.

NU se folosesc funcții din biblioteca cstring. Prelucrarile se fac la nivel de caracter.

În funcția main() se citesc datele de intrare, se apelează funcția și se afișează pe 2 linii separate: numărul de apariții, respectiv indecșii separați de un spațiu.

NU se folosesc variabile globale.

Date de intrare:

sir1 sir2

Date de ieșire:

Linia 1: Numărul de apariții ale sir2 in sir1. În cazul în care sir2 nu se găsește in interiorul sir1, se va afișa 0.
Linia 2: indecșii de la care încep sir2 în sir1, separați prin spațiu. Daca sir2 nu se găsește în sir1, Linia 2 rămâne goală.

Exemplu:

Date de intrare:

anaaremereareana are

Date de ieșire:

2

3 10

Răspunsuri la întrebare

Răspuns de Utilizator anonim
0

Răspuns:

#include <iostream>

using namespace std;

const int MAX_SIR1 = 1000;

const int MAX_SIR2 = 100;

// Funcția care returnează numărul de apariții ale subșirului sir2 în șirul sir1, precum și indecșii de la care încep subșirurile sir2 în sir1.

// Se folosesc variabile locale pentru sir1, sir2 și rezultate.

void numar_aparitii(char sir1[MAX_SIR1], char sir2[MAX_SIR2], int &numar_aparitii, int indecsi[MAX_SIR1]) {

   int lungime_sir1 = strlen(sir1);

   int lungime_sir2 = strlen(sir2);

   numar_aparitii = 0;

   int pozitie = 0; // poziția curentă în sir1 unde se caută sir2

   while (pozitie < lungime_sir1) {

       // Căutarea sir2 începând de la poziția curentă

       bool gasit = true;

       for (int i = 0; i < lungime_sir2; i++) {

           if (sir1[pozitie + i] != sir2[i]) {

               gasit = false;

               break;

           }

       }

       if (gasit) {

           // Sir2 a fost găsit la poziția pozitie în sir1

           indecsi[numar_aparitii] = pozitie;

           numar_aparitii++;

           pozitie += lungime_sir2; // Salt la poziția următoare după sir2

       } else {

           pozitie++;

       }

   }

}

int main() {

   char sir1[MAX_SIR1];

   char sir2[MAX_SIR2];

   cin >> sir1 >> sir2;

   int numar_aparitii;

   int indecsi[MAX_SIR1];

   numar_aparitii(sir1, sir2, numar_aparitii, indecsi);

   cout << numar_aparitii << endl;

   for (int i = 0; i < numar_aparitii; i++) {

       cout << indecsi[i] << " ";

   }

   cout << endl;

   return 0;

}

Exemplu de utilizare:

anaaremereareana are

Ieșire:

2

3 10

Alte întrebări interesante