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 Anamaria
bacalaureat
Aceasta este rezolvarea mea, imi poate spune cineva care sunt pozitiile invalide pe care le afiseaza. Pentru ca primesc eroare. Ma poate cineva ajuta sa o aduc la o solutie corecta! Va rog!!!
Multumesc!
#include
#include
using namespace std;
int MAX_SIZE = 260;
int main() {
int k;
cin >> k;
char s[MAX_SIZE], *p;
cin.getline(s, MAX_SIZE);
char vowel[11] = "aeiouAEIUO";
p = strtok(s, " ;.,\n!?\"");
int v = strlen(vowel);
int w_lg = strlen(p);
int nb_vowel = 0;
while (p != NULL) {
for (int i = 0; i < w_lg; ++i) {
for (int j = 0; j < v; ++j) {
if (p[i] == vowel[j]) {
++nb_vowel;
}
}
}
if (nb_vowel >= k) {
cout << p << "\n";
}
p = strtok(NULL , " ;.,!?\n");
nb_vowel = 0;
}
return 0;
}
VxF:
Ai încercat să dai un cout s; să vezi ce încearcă strtok() să proceseze? Pentru că e gol. La citire de întregi cu cin >> separatorul de după număr rămâne necitit și dacă urmează citire de șir de caractere, atunci va fi consumat. După cin >>k; bagă un cin.get();
Răspunsuri la întrebare
Răspuns de
2
Răspuns:
#include <iostream>
#include <cstring>
using namespace std;
int MAX_SIZE = 260;
int main() {
int k;
cin >> k;
cin.get();
char s[MAX_SIZE], *p;
cin.getline(s, MAX_SIZE, 0);
char vowel[11] = "aeiouAEIUO";
int v = strlen(vowel);
p = strtok(s, " ;.,\n!?\"");
while (p != NULL) {
int nb_vowel = 0;
int w_lg = strlen(p);
for (int i = 0; i < w_lg; ++i) {
for (int j = 0; j < v; ++j) {
if (p[i] == vowel[j]) {
++nb_vowel;
}
}
}
if (nb_vowel >= k) {
cout << p << "\n";
}
p = strtok(NULL, " ;.,!?\n");
}
return 0;
}
Explicație:
- La citire de întregi cu cin >> separatorul de după număr rămâne necitit și dacă urmează citire de șir de caractere, atunci va fi consumat. După cin >> k; bagă un cin.get(); altfel variabila s o să fie goală.
- Citirea cu cin.getline(); se oprește ori la lungimea specificată ori la primul delimitator întâlnit, care implicit este sfârșitul de rând. Deci codul tău va citi și va procesa doar primul rând, „Anamaria”, ignorând restul „ia nota buna la...bacalaureat”. Trebuie ori să repeţi citirea, ori să specifici terminatorul 0 ca delimitator, ca să citească tot ce poate: cin.getline(s, MAX_SIZE, 0);
- p ia valori atât înainte de bucla while cât și în interiorul lui, însă w_lg ia lungimea lui p doar înainte de while. Mai bine mută int w_lg = strlen(p); în interiorul while să fie reiniţializat la fiecare iteraţie.
- Pentru lizibilitate propun să muţi și int nb_vowel = 0; împreună cu int w_lg = strlen(p); și să elimini resetarea ei de la sfârșitul while.
Alte întrebări interesante
Limba română,
8 ani în urmă
Engleza,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
8 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă