String i liczenie samogłosek w ciągu znaków.

0

Muszę napisać program, który w podanym ciągu znaków policzy ilość występujących samogłosek. Coś naskrobałem, lecz program źle liczy samogłoski. Kombinowałem jak to poprawnie zrobić, lecz nic z tego nie wyszło. Proszę o pomoc. Najlepiej z wyjaśnieniem gdzie jest błąd i jak to poprawnie zapisać.

// Napisz program, ktory prosi uzytkownika o wypisanie ciagu znakow o maksymalnej liczbie znakow wynoszacej 32.
// Program ten ma sprawdzac ile razy w podanym ciagu znakow wystapily samogloski.
#include <iostream>
using namespace std;

int main()
{

    string s1;
    string samogloski= "aeiouy";
    int pozycja = 0;
    int suma = 0;
    int zmiana = 0;
    
    cout << "Podaj ciag znakow (maksymalnie 32 znaki):" << endl;
    getline(cin,s1);
    
    if (s1.size()>32)
    {
       cout << "Ciag znakow jest za dlugi. Podaj ciag znakow: " << endl;
       getline(cin,s1);
    }
    
    for (int i = 1 ; i <= samogloski.size() ; i++)
    {                     
        for (int j = 1; j <= s1.size() ; j++)
        {
            pozycja = s1.find(samogloski[i],pozycja) + 1;
            if (pozycja!=zmiana)
            { 
               zmiana = pozycja;
               suma++;
            } 
            
        }
        pozycja = 0;
    }
    
    cout << "W podanym ciagu znakow wystepuje " << suma << " samoglosek" << endl;
    
    
    system ("pause");
    return 0;
} 
0

Użyj tego:

inline bool is_vovel(char c) {
  return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'y';
}

// ...

for(string::iterator i = s1.begin(); i != s1.end(); ++i) sum += is_vovel(*i);

edit: zapomniałem

0

By uniknąć głupich komunikatów typuW podanym ciagu wystepuje 1 samoglosek lepiej wypisywać tak

cout << "Liczba samoglosek w podanym ciagu znakow jest rowna " << suma << endl;
0

Dzięki za odpowiedź. Trochę skomplikowane to co podałeś. Ogólnie mówiąc muszę do zrobić do szkoły. Zadane było wymyślić 4 zadania z operacjami na stringach. Myślałem, że będzie to można jakoś łatwiej zrobić, lecz widocznie się myliłem xd Nie dałoby rady zrobić tego jakoś inaczej? Nie chodzi o efektywność. Najlepiej żeby przerobić jakoś program z pierwszego postu (myślałem, że mam błąd w złej pętli, złych wartościach). Jeżeli nie da rady na tym poziomie trudności co w pierwszym poście to będę musiał sobie to darować.

0

oczywiście że się da:

for(int i=0;i<s1.length();suma+=(samogloski.find(s1[i++])!=npos)) {}
0
Przemotar napisał(a)

Dzięki za odpowiedź. Trochę skomplikowane to co podałeś. Ogólnie mówiąc muszę do zrobić do szkoły. Zadane było wymyślić 4 zadania z operacjami na stringach. Myślałem, że będzie to można jakoś łatwiej zrobić, lecz widocznie się myliłem xd Nie dałoby rady zrobić tego jakoś inaczej? Nie chodzi o efektywność. Najlepiej żeby przerobić jakoś program z pierwszego postu (myślałem, że mam błąd w złej pętli, złych wartościach). Jeżeli nie da rady na tym poziomie trudności co w pierwszym poście to będę musiał sobie to darować.

A co jest trudnego w moim poście? Jeśli nie znasz iteratorów to można to zrobić zwykłym indeksem:

for(string::size_type i = 0; i < s1.length(); ++i) sum += is_vovel(s1[i]);

string::size_typeto jest po prostu alias na size_t, który z kolei jest aliasem na unsigned int. Lepsze bo string::length()zwraca właśnie string::size_type i kompilator powinien zwrócić uwagę na porównywanie liczby ze znakiem z liczbą bez znaku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1