Dlaczego nie wypisuje ostatniej spółgłoski?

0

Dlaczego pętla nie wypisuje mi ostatniej spółgłoski w wyrazie ?

#include <iostream>

using namespace std;

bool czySamogloska(char znak)
{
    if(znak=='A'||znak=='E'||znak=='I'||znak=='O'||znak=='Y'||znak=='U')
    {
        return 1;
    }

    return 0;

}

int main()
{
    char zml,zml2;

  string nazwa;
  cout<<"podaj napis: ";
  cin>>nazwa;



      for(int i=0;i<nazwa.size();i++)
    {

            if(!czySamogloska(nazwa[i]))
            {

             zml=nazwa[i];
             break;

            }

    }

         for(int i=nazwa.size();i>0;i--)
    {

            if(!czySamogloska(nazwa[i]))
            {

             zml2=nazwa[i];
             cout<<zml2;
             break;


            }

    }

for(int i=0;i<nazwa.size();i++)
{
            if(!czySamogloska(nazwa[i]))
            {
                cout<<nazwa[i]<<" to spolgloska \n";

            }
            else
                cout<<nazwa[i]<<" to samogloska \n";
}

cout<<nazwa;



    return 0;
}
1
bool czySamogloska(char znak)
{
    if(znak=='A'||znak=='E'||znak=='I'||znak=='O'||znak=='Y'||znak=='U')
    {
        return 1;

true

}

return 0;

false

     for(int i=nazwa.size();i>0;i--)
{

        if(!czySamogloska(nazwa[i]))

UB dla i == nazwa.size() .

0

UB ? co to znaczy ?

2

To jest zło:

bool czySamogloska(char znak)
{
    if(znak=='A'||znak=='E'||znak=='I'||znak=='O'||znak=='Y'||znak=='U')
    {
        return 1;
    }
 
    return 0;
 
}

Zdecydowanie łatwiej, i przyjemniej będzie się to czytać w postaci:

bool czySamogloska(char znak)
{
    return znak == 'A' || znak == 'E' || znak == 'I' || znak == 'O' || znak == 'Y' || znak == 'U';
}

Wyczyściłem cały kod:

#include <iostream>
#include <cctype>

using namespace std;

bool is_vowel(char character) {
    character = toupper(character);
    return character == 'A'
        || character == 'E'
        || character == 'I'
        || character == 'O'
        || character == 'Y'
        || character == 'U';
}

int main() {
    string text;

    cout << "podaj napis: ";
    cin >> text;

    for (auto character: text) {
        if (!is_vowel(character)) {
            cout << character << '\n';
            break;
        }
    }

    for (auto character = text.rbegin(); character != text.rend(); character++) {
        if (!is_vowel(*character)) {
            cout << *character << '\n';
            break;
        }
    }

    for (auto character: text) {
        if (is_vowel(character))
            cout << character << " to samogloska \n";
        else
            cout << character << " to spolgloska \n";
    }

    cout << text;

    return 0;
}

Zasady:

  • jeśli piszesz if (xxx) { return true; }; return false; to można to zastąpić return xxx;
  • używaj wcięć
  • pisz kod zwięźlej, za dużo pustych przestrzeni powoduje, że to się ciężko czyta
  • używaj spacji na około operatorów, łatwiej wtedy optycznie wydzielić części
  • jeśli nie potrzebujesz zmiennej, to jej nie używaj, zmienne zml i zml2 są zupełnie zbędne i zaciemniają Ci co się dzieje
  • używaj for-loop gdzie kiedy możesz
  • jak nie możesz użyć for-loop to przynajmniej używaj iteratorów, to by Cię uchroniło przed off-by-one-error
  • używaj angielskiej nomenklatury
  • 'A' != 'a' więc normalizuj wartości jeśli chcesz je porównywać
  • nie używaj negacji w warunkach z else, tj. if (!val) { bar; } else { foo; } można zapisać jako if (val) { foo; } else { bar; }
0

Ja wolę tak:

template<typename T>
bool equalToOneOf(T a, T b)
{
    return a == b;
}

template<typename T, typename ...TArgs>
bool equalToOneOf(T a, T b, TArgs ...args)
{
    return equalToOneOf(a, b) || equalToOneOf(a, args...);
}

bool isVowel(char ch)
{
    return equalToOneOf(ch, 'a', 'e', 'i', 'o', 'u', 'y');
}

https://wandbox.org/permlink/3dP3ZnHpJYBlv4En

0

A nie łatwiej po prostu:

bool IsVowel( char chr )
{
  static std::unordered_set< char > vowels{ 'a', 'e', 'i', 'o', 'u', 'y' };
  return vowels.find( std::tolower( chr ) ) != vowels.cend();
}

@MarekR22: std::any_of już istnieje, nie trzeba pisać samemu ;)

1

Bardziej matematyczna wersja funkcji "czy samogłoska":

bool czySamogloskaImpl(char znak)
{
    auto x = znak - 65;
    auto x2 = x*x, x3 = x2*x, x4 = x2*x2, x5 = x*x4;
    return (!x || !(x5 - 70*x4 + 1824*x3 - 21728*x2 + 115712*x - 215040))?1:0;
}

bool czySamogloska(char znak)
{
  return czySamogloskaImpl(znak) | czySamogloskaImpl(znak - 32); 
}

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