Napisałem według książki “Symfonia C++” taki program, który pokazuje jak działa pętla while :
#include
int main()
{
int ile;
std::cout << "Ile gwiazdek ma miec kapitan?: ";
std::cin >> ile;
std::cout << "\n No to narysujemy wszystkie " << ile << " : ";
// ---------------------- pętla while rysująca gwiazdki --------------------
while (ile)
{
std::cout << "*";
ile = ile - 1;
}
// na dowód, że miał prawo przerwać pętlę
std::cout << "\n Teraz zmienna ile ma wartosc " << ile;
}
Jeśli warunek się nie spełni, to wtedy praca pętli zostanie przerwana. No właśnie, sądzę, że ma to coś wspólnego z tym
ile = ile - 1;
Czy mógłby mi ktoś wytłumaczyć o co w tym chodzi :?: Jak wpiszę np. 4 (gwiazdki) to potem (na samym końcu) wyświetla mi się “Teraz zmienna ile ma wartosc 0”…
Po pierwsze to nie funkcja. Po drugie lepiej przeczytać rozdział w książce jeszcze raz, przepisać program i uruchomić, porównać wyjście z listingiem w książce, zamiast pisać takie tematy.
Na pewno przeczytałeś już o konwencji, że zero to fałsz, a reszta wartości liczbowych to prawda logiczna?
W tym programie pobierasz wartość liczbową. Pętla while wypisuje gwiazdkę i zmniejsza wartość zmiennej ile o jeden. Kiedy dojdzie to wartości 0 wtedy pętla kończy swoje działanie. Jeżeli z tak prostymi rzeczami masz problemy to nie chcę nawet myśleć co będzie później…
Wg mnie “Symfonia C++” to beznadzieja, pełno tam przykładów które pokazują jedynie jak nie należy programować :?
Może ten przykład i pokazuje jak działa while tylko w tym przypadku aż się prosi o manipulatory.
#include
#include
int main()
{
int ile;
std::cout<<"Ile gwiazdek ma miec kapitan?: ";
std::cin>>ile;
std::cout<
return 0;
}
Tak należało by rozwiązać zadanie z gwiazdkami, nauczanie za pomocą takich przykładów jak w symfonii daje złe nawyki. Nie mówię już nawet o funkcjach które coś zwracają a nie mają instrukcji return :x Poza tym każdą książkę zawierającą w przykładach coś w stylu:
char slowo[20];
cin>>slowo;
należy spalić zaś autora wraz z redaktorem powiesić, ponieważ wyrządzają one (te książki) olbrzymie szkody na skale światową.
Symfonia nie jest beznadziejna. Po prostu autor przyjął taką konwencję, że najpierw opisuje język, a później biblioteki (poza iostream). Poza tym autor ostrzega, że takie a takie rozwiązanie nie jest eleganckie, ale czytelnik jeszcze nie wie tyle, żeby użyć lepszego rozwiązania.
Poza tym ten przykład ma właśnie pokazać działanie while , a nie działanie manipulatorów które są opisane w książce o wiele dalej. Nie mówiąc, że twój przykład ma cudowne formatowanie zwiększające czytelność i się nie kompiluje, bo zapomniałeś o ‘std::’. No i jeszcze dopuszcza ujemną liczbę gwiazdek.
Czy uważasz, że powinno się zakazać pisania w C/C++, dokumentacje spalić, a członków komitetów standaryzujących powiesić tylko za to, że w bibliotece standardowej jest funkcja gets(), która nie sprawdza zakresów tablicy? Jasne, że ten przykład podany przez Ciebie jest nieelegancki i w normalnym kodzie by nie przeszedł, ale na potrzeby nauki, kiedy w książce jest za wcześnie, żeby wspomnieć o std::string, malloc/free , new/delete, może być. Przecież w dalszej części SYmfonii jest i o new/delete i o std::string, więc w czym problem?
Cóż, u mnie ten kod działa bez problemu. Napisz z jakiego kompilatora korzystasz? Akurat stykanie się klamer z identyfikatorami nie ma znaczenia, bardzo wiele białych znaków w kodzie ma za zadanie tylko i wyłącznie poprawę czytelności kodu. Tak na marginesie zachęcam do stosowania wcięć w kodzie, bo to znakomicie poprawie czytelność. (każdy ma jakiś swój styl pisania kodu, w każdym razie ważne aby był czytelny)
#include
int main()
{
char litera;
do {
std::cout << "Napisz jakas litere: ";
std::cin >> litera;
std::cout << "Napisales: " << litera << '\n';
} while( litera != 'K' );
std::cout << "Skoro napisales K to konczymy!";
}
Powyższy kod u mnie kompiluje się bez problemu i na 100% nie ma w nim żadnego błędu.
funkcja gets, oraz cin>>(char*) oraz temu podobne rzeczy w c/c++ nie przeznaczone do takiego użycia. Doskonale sprawdzają sie na plikach kiedy w poprzedzającym kodzie sprawdzamy ilość znaków do najbliższego białego znaku.