• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ i wprowadzanie danych wejściowych w pętli

Object Storage Arubacloud
0 głosów
620 wizyt
pytanie zadane 16 stycznia 2018 w C i C++ przez Szminka93 Nowicjusz (140 p.)

Witam wszystkich,

znalazłem na forum podobny problem lecz trochę jednak się różni sposób w jaki chcę go rozwiązać.

Jest to zadanie 7. z ćwiczeń na koniec rozdziału 6. i pochodzi ze "Skoły Programowania", S.Prata.

Treść: 

"Napisz program wczytujący dane wejściowe aż do wpisania pojedynczej litery q. Dalej program ma pokazać liczbę słów zaczynających się od samogłosek, zaczynających się od spółgłosek i niezaliczonych do żadnej kategorii. Jeden sposób realizacji tego zadania to użycie funkcji isalpha() do wyróżnienia słów zaczynających się od liter i innych słów, a następnie użycie if lub switch do oddzielna samogłosek od spółgłosek."

Postanowiłem zrobić to za pomocą instrukcji switch. 

#include <iostream>
#include <cctype>

using namespace std;

int main()
{
    string napis;
    int samogloski=0;
    int spolgloski=0;
    int inne=0;

    cout << "Podawaj slowa (pojedyncze 'q' lub 'Q' konczy): ";

    cin >> napis;


    while ((napis!="q") && (napis!="Q"))
    {
        if (isalpha(napis[0]))
        {
            switch (napis[0])
            {
                case 'a':
                case 'A':
                case 'e':
                case 'E':
                case 'i':
                case 'I':
                case 'o':
                case 'O':
                case 'u':
                case 'U':
                case 'y':
                case 'Y': samogloski++;
                break;
                default: spolgloski++;
                break;
            }
        }
        else inne++;

        cout << "";
        cin >> napis;
    }

    cout << spolgloski << " slow zaczyna sie od spolglosek." << endl;
    cout << samogloski << " slow zaczyna sie od samoglosek." << endl;
    cout << inne << " slow nie zalicza sie do zadnej z tych kategorii." << endl;

    return 0;
}

Po skompilowaniiu tego programu wszystko działa jak nalezy. Program konczy przetwarzanie gdy dojdzie do 'q' lub 'Q', slowa sa zliaczne prawidłowo. Jednak troszkę nie rozumiem dlaczego linie kodu 43 i 44, tj. cout << ""; cin >> napis; są warunkiem prawidłowego wyświetlania wyniku? Wiem, że ma to związek z obiektem string i jak dane wejściowe są przetwarzane jednak nie potrafię tego do końca sobie uporzadkować.

Jeśli zmodyfikuję kod na następujący:

#include <iostream>
#include <cctype>

using namespace std;

int main()
{
    string napis;
    int samogloski=0;
    int spolgloski=0;
    int inne=0;

    cout << "Podawaj slowa (pojedyncze 'q' lub 'Q' konczy): ";
    


    while ((cin>>napis) && (napis!="q") && (napis!="Q"))
    {
        if (isalpha(napis[0]))
        {
            switch (napis[0])
            {
                case 'a':
                case 'A':
                case 'e':
                case 'E':
                case 'i':
                case 'I':
                case 'o':
                case 'O':
                case 'u':
                case 'U':
                case 'y':
                case 'Y': samogloski++;
                break;
                default: spolgloski++;
                break;
            }
        }
        else inne++;


    cout << spolgloski << " slow zaczyna sie od spolglosek." << endl;
    cout << samogloski << " slow zaczyna sie od samoglosek." << endl;
    cout << inne << " slow nie zalicza sie do zadnej z tych kategorii." << endl;

    return 0;
}

To cały program kompiluje sie tak jak powinien. Czy ktos moze mi to wyjasnic. Wertowałem książkę i tak jak mowilem, wiem ogolnie, iż ma to związek z obiektem cin lecz nie potrafie dalej tego rozwinąć, a chcę.

Dziękuję z góry za poświęcony czas, pozdrawiam!

1 odpowiedź

+1 głos
odpowiedź 16 stycznia 2018 przez niezalogowany
edycja 16 stycznia 2018

Brakuje Ci średnika po else, aby zakończyć działanie pętli. std::cin w warunku to sprawdzenie czy wczytane dane zostały wczytane poprawnie (lub nie został wczytany EOF). Jeżeli nie konstrukcja ta zwróci wartość false przerywając pętlę (i należałoby naprawić strumień).

PS. Zamiast switch można też umieścić samogłoski w tablicy (której rolę może pełnić string). Wtedy bardzo łatwo możesz sprawdzić czy litera jest samogłoską za pomocą metody find:

#include <iostream>
#include <cctype>
#include <string>

using namespace std;

int main()
{
	string napis;
	const string samogloski = "aeiouyAEIOUY";
	int liczba_samoglosek = 0;
	int liczba_spolglosek = 0;
	int inne = 0;

	cout << "Podawaj slowa (pojedyncze 'q' lub 'Q' konczy): ";

	while ((cin >> napis) && (napis != "q") && (napis != "Q"))
	{
		if (!isalpha(napis[0]))
		{
			inne++;
		}
		else if (samogloski.find(napis[0]) != string::npos)
		{
			liczba_samoglosek++;
		}
		else
		{
			liczba_spolglosek++;
		}
	}

	cout << liczba_spolglosek << " slow zaczyna sie od spolglosek." << endl;
	cout << liczba_samoglosek << " slow zaczyna sie od samoglosek." << endl;
	cout << inne << " slow nie zalicza sie do zadnej z tych kategorii." << endl;
	return 0;
}
komentarz 16 stycznia 2018 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
Nie średnika tylko klamry }.
komentarz 16 stycznia 2018 przez niezalogowany
Myślałem o klamrze, a napisałem średnik - dziękuję za zauważenie pomyłki ;)
komentarz 16 stycznia 2018 przez Szminka93 Nowicjusz (140 p.)
Dziękuję Ci za odpowiedź i pokazanie nowego sposobu. Jednak brak klamry w tym drugim kodzie to moje przeoczenie.

Ale w sumie wszystko rozchodzi się o ten pierwszy kod, gdzie wprowadzanie danych nie jest w warunku pętli. Po wprowadzeniu danych (łącznie ze znakiem 'q' lub 'Q') program nie pokazuje wyników koncowych tylko czeka "zawieszony".

Natomiast drugi kod, gdzie cin >> napis jest elementem warunku działa bardzo dobrze (po dopisaniu brakujacej klamry :) )

Tym razem chyba trochę lepiej poszło wyjaśnienie o co chodzi. Proszę o pomoc czemu tak to działa, i dzieki :)
komentarz 16 stycznia 2018 przez niezalogowany
U mnie pierwszy kod działa dobrze. Może różni się od kodu, który pierwotnie nie działał? Jeżeli nie to podaj mi jaki out wpisujesz.
komentarz 16 stycznia 2018 przez Szminka93 Nowicjusz (140 p.)
Kurcze, teraz jeszcze raz wszystko przeanalizowałem i faktycznie jest ok. Wszystko się kompiluje bez najmniejszych problemow. Trochę chyba się zakręciłem sam. Tak czy siak -  wielkie dzieki za pomoc! :)

Podobne pytania

0 głosów
1 odpowiedź 1,160 wizyt
pytanie zadane 23 października 2018 w C i C++ przez web Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 161 wizyt
0 głosów
1 odpowiedź 121 wizyt

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...