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

Cuvinte care conțin cel puțin k vocale


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

3

Anamaria

ia nota buna la...bacalaureat

Date de ieșire

Anamaria

bacalaureat


Am incercat sa rezolv problema in felul urmator:

#include

#include

#include

using namespace std;


int main() {

int k;

cin >> k;

char line[260], v[]="aeiouAEIOU";

ifstream fin("date.in");

int counter_vocale = 0;

while(fin >> line) {

int n = strlen(line);

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

if(strchr(v, line[i])){

++counter_vocale = 0;

}

}

if(counter_vocale >= k) {

cout << line << "\n";

}


}

return 0;

}


ideea este ca nu returneaza nimic si nu imi dau seama de ce.

Ma puteti ajuta va rog !

Răspunsuri la întrebare

Răspuns de VxF
2

Răspuns:

#include <iostream>

#include <fstream>

#include <cstring>

using namespace std;

int main() {

   int k;

   ifstream fin("date.in");

   fin >> k;

   char line[260], cuvant[260], v[] = "aeiouAEIOU";

   int counter_vocale, inceput;

   while (fin >> line) {

       int n = strlen(line);

       inceput = -1;

       counter_vocale = 0;

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

           if ((line[i] >= 'a' && line[i] <= 'z') || (line[i] >= 'A' && line[i] <= 'Z')) {

               if (inceput == -1) {

                   inceput = i;

               }

               if (strchr(v, line[i])) {

                   ++counter_vocale;

               }

           } else {

               if (counter_vocale >= k) {

                   strncpy(cuvant, line + inceput, i - inceput);

                   cuvant[i - inceput] = 0;

                   cout << cuvant << "\n";

               }

               inceput = -1;

               counter_vocale = 0;

           }

       }

       if (counter_vocale >= k) {

           strncpy(cuvant, line + inceput, n - inceput);

           cuvant[n - inceput] = 0;

           cout << cuvant << "\n";

       }

   }

   return 0;

}

Explicație:

  • „De pe prima linie se va citi numărul k” — Tu o citești din cin.
  • „un cuvânt este o succesiune continuă de litere” — Tu consideri fiecare citire un cuvânt. Citirea se face până la spaţiu. „la...bacalaureat“ va fi citit dintr-o singură mișcare, dar are 2 succesiuni continue de litere: „la” și „bacalaureat”.
  • „++counter_vocale = 0;” — Acolo faci 2 chestii: incrementezi și imediat resetezi la 0. Resetarea trebuie să se întâmple înainte de buclă. (au la începerea procesării unui nou cuvânt).
  • Am optat pentru rezolvarea de mai sus cu intenţia să nu mă îndepărtez prea mult de la versiunea ta. Cea mai semnificativã modificare este introducerea variabilei inceput. Acesta are valoarea -1 cât timp i parcurge porţiune de ne-litere, sau un numãr [0 .. n) când i parcurge porţiune de litere, indicând poziţia de început a cuvântului curent.

oanaroxana3: Buna!
oanaroxana3: Imi poti te rog sa imi explici linia asta de cod : strncpy(cuvant, line + inceput, i - inceput); sa luam exmplu " anamaria. " : citim caracterul "a" iar in variabila "cuvant" noi ne salvam inceputul lui (linie + inceput ) unde linia este inceputul sirul (0) iar variabila inceput va fi tot 0 .Iar i - inceput ar insemna sfarsitul, dar inceputul se actualizeaza de fiecare data cu variabila i, ar daca noi facem i - inceput = 0; Am inteles corect? Multumesc frumos !
VxF: Mai bine luăm șirul „inainte!mijloc?dupa” presupunând că procesăm al 2-lea cuvânt. În acest caz inceput = 8 iar i = 14. line deţine adresa primului „i” + inceput = adresa literei „m”. i - inceput = 14 - 8 = 6 = lungimea cuvântului „mijloc”. Acele 6 caractere copiem la adresa variabilei cuvant (deci pe pozițiile 0..5), apoi la poziția 6 punem un caracter terminator 0.
oanaroxana3: Daca am folosi strcpy in loc de strncpy ar arata ceva de genul : strcpy(line + inceput, i - inceput)? Stiu ca strcpy primește ca parametru două șiruri și copiază valorile din al doilea șir cu tot cu numărul 0 de la final...scz ca insist dar ma chinui sa inteleg logica si nu prea imi iese
Alte întrebări interesante