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

Ai învățat programare și ți-ai dat seama că te pricepi să le explici colegilor tăi mai mici tot felul de noțiuni din informatică, pe limba lor. De fiecare dată când cineva se plânge că o noțiune e "prea abstractă", îi vii în ajutor cu un exemplu concret.

Astăzi, fratele tău mai mic a venit de la facultate trist și ai aflat că toată ziua s-a chinuit să înțeleagă expresiile regulare. Ba mai mult, el susține că la finalul laboratorului li s-a dat să scrie un program care primește un șir de caractere (îl vom nota sir) și un șir de n cuvinte și afișează numărul de cuvinte care se potrivesc cu expresia regulară sir.+. De exemplu, dacă sir are valoarea "ana", cuvintele trebuie să se potrivească cu expresia regulară ana.+.

Te-ai hotărât să îl ajuți și ai început să citești despre expresiile regulare ca să înțelegi cerința problemei. Expresia dată e de tip POSIX extended, găsești aici mai multe despre cum funcționează.

Scrie un program care rezolvă problema de mai sus, pentru a înțelege mai bine expresiile regulare și a putea să îi răspunzi fratelui tău la întrebări.

Date de intrare
Programul va citi de pe prima linie numărul natural n, reprezentând numărul de cuvinte din listă, de pe linia următoare șirul de caractere care reprezintă începutul expresiei regulare, conform cerinței de mai sus, iar de pe următoarele n linii câte un singur cuvânt format doar din litere mici ale alfabetului englez.

Date de ieșire
Pe ecran se va afișa numărul de cuvinte care se potrivesc cu expresia regulară construită cu primul șir de caractere citit, conform cerinței.

Restricții și precizări
1 ≤ n ≤ 50.
fiecare cuvânt va conține maxim 100 de caractere.
toate liniile citite, în afară de prima, sunt formate din litere mici ale alfabetului englez.
Exemplu
Date de intrare Date de ieșire
5 2
pre
preadmitere
eprezicere
pre
prezentare
practica

O indrumare cum sa fac problema cu expresii regulare.


VxF: În ce limbaj de programare?
oanaroxana3: in c++
oanaroxana3: nu stiu cum se foloseste asta "ana.+". Am inteles ca inseamana ca verificam prefix-ul fiecarui cuvant daca sunt la fel si ca trebuie sa avem cel putin o litera dupa, dar nu stiu cum sa il pun in program. Multumesc!

Răspunsuri la întrebare

Răspuns de VxF
1

Răspuns:

#include <iostream>

#include <string>

#include <regex>

int main()

{

   std::regex expresieRegulara;

   std::string inceput, cuvant;

   int n, sePotrivesc = 0;

   std::cout << "Număr cuvinte: ";

   std::cin >> n;

   std::cin.get();

   std::cout << "Început cuvânt: ";

   std::cin >> inceput;

   expresieRegulara = std::regex(inceput + ".+.");

   std::cout << n << " cuvinte: ";

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

       std::cin >> cuvant;

       if (std::regex_match(cuvant, expresieRegulara)) {

           sePotrivesc++;

       }

   }

   std::cout << "Număr potriviri: " << sePotrivesc << std::endl;

}

Explicație:


oanaroxana3: Buna! Multumesc mult pentru ajutor , dar mi s-a spus acum sa nu folosesc expresii regulare, erau doar pentru info. Crezi ca ai putea sa faci codul folosind doar functii predefinte si fara string in c++? Inca odata multumesc!
oanaroxana3: Buna, nu nu este corect .
oanaroxana3: Eu am incercat ceva de genul :
oanaroxana3: #include
#include
using namespace std;

const int MAX_LENGHT = 100;

int main() {
char pref[MAX_LENGHT], sir[MAX_LENGHT];
int n, counter = 0;
cin >> n;
cin >> pref;
for (int j = 0; j < n; j++){
cin >> sir;
if(sir[i] == pref[i] && strlen(sir) > strlen(pref)){
++counter;
}
}
cout << counter << '\n';
return 0;
}
Dar, nu este ok, cred ca trebuie cu strcmp . Imi poti da o idee cum sa folosesc aceasta functie ?
oanaroxana3: Am rezolvat, nu mai este nevoie! Multumesc!
Alte întrebări interesante