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

Se dă un număr k și un text aflat pe mai multe linii. Să se afișeze toate cuvintele care conțin cel puțin k vocale. Considerăm că un cuvânt este o succesiune continuă de litere.


Date de intrare

De pe prima linie se va citi numărul k, iar de pe următoarele linii se va citi textul.


Date de ieșire

Pe ecran se vor afișa cuvintele care conțin cel puțin k vocale. Cuvintele vor fi afișate câte unul pe o linie


Restricții

Textul va conține maxim 260 de caractere

Exemplu

Date de intrare Date de ieșire

3

Anamaria

ia nota buna la...bacalaureat


Ideea mea de rezolvare:

-> Declar si citesc datele problemei, un sir care sa-mi contina vocalele 'aeiouAEIOU' si un contor pentru numarul de vocale.

-> Incep cu un for care imi parcurge sirul.

-> In for pun un if care se executa daca elementul curent din sir este diferit de ' ' sau de '\n'.

-> In if, mai pun un if, care verifica daca elementul curent este vocala

-> Daca este vocala, variabila pentru numarare a vocalelor se incrementeaza.

-> Aici ma gandesc ca trebuie pusa afisarea, in cazul in care contorul pentru numarul de vocale este mai mare sau egal cu k, afisez cuvantul.

-> In continuare, inchid toate if-urile, iar pentru primul if, o sa pun un else, care imi va reseta variabila pentru numarul de vocale la 0.


Tentativa mea de implementare

#include

#include

using namespace std;


int main() {

int k;

cin >> k;

char s[260];

cin.getline(s, 260);

char vowel[11] = "aeiouAEIUO";

int v = strlen(vowel);

int lg = strlen(s);

int nb_vowel = 0;

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

if (s[i] != ' ' || s[i] != '\n' || s[i] != '.' || s[i] != ',' || s[i] != '!' || s[i] != '?') {

for (int j = 0; j < v; ++j) {

if (s[i] == vowel[j]) {

++nb_vowel;

}

}

if (nb_vowel >= k) {

cout << s << "\n";

}

} else {

nb_vowel = 0;

}

}

}


return 0;

}

Poate cineva sa ma ajute sa-mi duc la capat implementarea, va rog!

Răspunsuri la întrebare

Răspuns de Apollyon
1

Răspuns:

#include <cstring>

#include <iostream>

using namespace std;

/* un macro ca să evităm „magic numbers” (acuma știm clar ce reprezintă acel 260) */

constexpr auto BUFFER_SIZE = 260;

/* semnătura funcției */

bool eVocala(const char& caracter);

int main()

{

 int nrVocale;

 char sirCitit[BUFFER_SIZE];

 std::cout << "Introdu nr. minim de vocale per cuvant >> ";

 /* citim numărul de vocale */

 cin >> nrVocale;

 std::cout << "Introdu sirul de caractere >> ";

 /* cin.ignore(...) golește buffer-ul de garbage values (ca să poți citi în continuare de la tastatură), trebuie pus deoarece când citim „nrVocale” în buffer o să avem ceva de genul „3\n”, având nevoie de un întreg o să ia doar 3-ul și rămânem în buffer cu „\n” iar când ajungem la cin.getline(...) citește caracterul rămas și programul își termină execuția */

 cin.ignore(numeric_limits<streamsize>::max(), '\n');

 cin.getline(sirCitit, BUFFER_SIZE);

 /* delimitatorii după care separăm cuvintele */

 char delimitatori[] = " .,!?";

 /* ne folosim de strtok(...) care sparge string-ul inițial în string-uri mai mici după delimitatorii specificați mai sus */

 char* cuvantCurent{ strtok(sirCitit, delimitatori) };

 while (cuvantCurent) {

  /* inițializăm contorul vocalelor la 0 */

   int contorVocale{};

   /* luăm caracter cu caracter */

   for (int i{}; i < strlen(cuvantCurent); i++) {

    /* dacă caracterul e vocală incrementăm contorul */

     if (eVocala(cuvantCurent[i])) {

       contorVocale++;

     }

     /* dacă avem suficiente vocale-n cuvântul curent îl afișăm și ieșim din for */

     if (contorVocale == nrVocale) {

       std::cout << cuvantCurent << " ";

       break;

     }

   }

   cuvantCurent = strtok(NULL, delimitatori);

 }

 return 0;

}

bool eVocala(const char& caracter)

{

 char vectorVocale[]{ "aeiouAEIOU" };

 for (int i = 0; i < sizeof(vectorVocale); i++) {

   if (caracter == vectorVocale[i]) {

     return true;

   }

 }

 return false;

}


Apollyon: Chiar îți recomand să te uiți peste strtok(...) și cum funcționează el mai ales când ai nevoie să extragi cuvintele dintr-un șir, îți face viața mai ușoară.
ana0o0: Multumesc pentru raspuns!
Alte întrebări interesante