Dlaczego nie wypisuje ostatniej spółgłoski?

Odpowiedz Nowy wątek
2018-09-24 18:31
Highway137
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;
}
edytowany 1x, ostatnio: furious programming, 2018-09-26 17:07

Pozostało 580 znaków

2018-09-24 18:42
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() .

edytowany 1x, ostatnio: Azarien, 2018-09-24 18:42

Pozostało 580 znaków

2018-09-24 18:49
Highway137
0

UB ? co to znaczy ?

Undefined Behaviour, czyli kompilator może zrobić co chce, bo taki kod nie ma prawa zostać wykonanym. W tym przypadku jest to wyjście poza zakres tablicy. To jest ten sam typ błędu co dereferencja pustego wskaźnika. - hauleth 2018-09-24 19:05

Pozostało 580 znaków

2018-09-24 19:03
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; }
edytowany 2x, ostatnio: hauleth, 2018-09-25 17:46
Samogłoska po angielsku to vowel a nie vovel ;) - tajny_agent 2018-09-25 00:40

Pozostało 580 znaków

2018-09-25 15:28
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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2018-09-25 15:32
A nie lepiej po prostu bool isVowel(char ch) { return strchr("aeiouy", tolower(ch)) != nullptr; }? - _0x666_ 2018-09-26 10:36
czy lepiej to zależy od wymagań i gustów. Twoje rozwiązanie jest lepsze bo konfigurowalne (można je przerobić by takie było), moje jest lepsze jak ktoś jest maniakiem optymalizacji. W sumie nie potrzebnie z tym wyskoczyłem, bo to jest "overkill" dla autora pytania. - MarekR22 2018-09-26 11:33
E tam. Im więcej rozwiązań tym lepiej. Jeszcze brakuje fallthrough switch ;) - tajny_agent 2018-09-26 20:55

Pozostało 580 znaków

2018-09-26 10:37
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 ;)


Wole wizerunek z nożem w zębach, przejść po trupie
Niż zgrywać ćwierćinteligenta z piórkiem w d.
Zastosowanie seta do przeszukiwania sześcioelementowego zbioru to lekka przesada ;) - _0x666_ 2018-09-26 10:43
tyle, że std::any_of działa inaczej niż to co ja napisałem. Trzeba dostarczyć kontener. Mój szablon po prostu generuje ciąg "lub równy wartość", bez użycia kontenera. - MarekR22 2018-09-26 11:30
@_0x666_: zawsze można użyć array+any_of. @MarekR22 no ok. Mimo wszystko jeśli efekt jest ten sam to wolę opcję z mniejsza liczba linijek ;) - tajny_agent 2018-09-26 19:36
std::string vowels = "aeiouy"; – kontener raz. - Azarien 2018-09-26 20:11

Pozostało 580 znaków

2018-09-26 12:08
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); 
}

Szacuje się, że w Polsce brakuje 50 tys. programistów
edytowany 1x, ostatnio: vpiotr, 2018-09-26 12:08

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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