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:
#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.