👤
a fost răspuns

Se dă un șir de n cuvinte, fiecare format din cel mult 30 caractere.

Cerinţa
Să se determine numărul cuvintelor care conțin doar vocale.

Date de intrare
Fişierul de intrare doarvocale.in conţine pe prima linie numărul n, iar pe n următoarele n linii câte un cuvânt.

Date de ieşire
Fişierul de ieşire doarvocale.out va conţine pe prima linie numărul X, reprezentând numărul cuvintelor care conțin doar vocale.

Restricţii şi precizări
0 < n ≤ 1000
cuvintele vor conține doar litere mici ale alfabetului englez
se consideră vocale caracterele din mulțimea {a,e,i,o,u}


#include
#include
using namespace std;
ifstream fin("doarvocale.in");
ofstream fout("doarvocale.out");

char s[31];
char voc[]="aeiou";
int i,n,k;int nr=0;
int main()
{ fin>>n; fin.get();
for(k=1;k<=n;k++)
{
fin.getline(s,31);

for(i=0;i { if(strchr(voc,s[i]))


nr++;

}}
fout< return 0;
}

ce este gresit in programul meu ???




Răspuns :

Atunci cand dai strchr(voc,s[i]), tu nu verifici daca cuvantul e format doar din vocale,ci de fapt verifici daca s[i] este vocala.Asa ca vom folosi un contor care incepe de la 0 pt cate cuvinte doar din vocale sunt si vom folosi nr, ca si contor de cate vocale sunt in cuvant.

#include <fstream>

#include <cstring>

using namespace std;

ifstream fin("doarvocale.in");

ofstream fout("doarvocale.out");

char s[31];

char voc[] = "aeiou";

int i, n, k;

int nr, cnt;

int main() {

   fin >> n ;

   fin.get() ;

   for (k = 1 ; k <= n; k++) {

       fin.getline(s, 31);

       nr = 0 ;

       for (i = 0 ; i < strlen(s) ; ++ i){

           if (strchr(voc, s[i])){

               nr ++ ; //daca litera e vocala

           }

       }

       if (strlen(s) == nr) //daca toate literele au fost vocale

           cnt ++ ;

   }

   fout << cnt ;

   return 0;

}

Pot sa fac o solutie mai eficienta.Daca esti curios sa imi spui.