C++ - funkcja while


(Quentin) #1

Witam :slight_smile:

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"...

Z góry wielkie dzięki za pomoc :slight_smile:


(Sawyer47) #2

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...


(W Kowaluk) #3

while (ile)

jest rownowazne

while(ile!=0)


(system) #4

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ą.


(Sawyer47) #5

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?


(Fiołek) #6

Białe znaki nie grają znaczącej roli w C++. Pokaż jaki to błąd jest, a nie tylko nagłówek...

Na GCC 4.2.3(Ubuntu) kompiluje się dobrze i działa prawidłowo.

//EDIT: tak to jest jak się posty usuwa...


(Sawyer47) #7

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.


(Quentin) #8

Sorry, już działał ten kod więc usunąłem posta ^^ Nie wiem po prostu, spróbowałem stworzyć nowy projekt i zadziałał kod :slight_smile:


(system) #9

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.