Instrukcję „for” wykorzystuje się zazwyczaj wtedy, gdy wiadomo ile iteracji ma się wykonać np. i < 10. Instrukcje „while” oraz „do ... while” zazwyczaj wtedy, gdy większe znaczenie ma prawdziwość warunku, a nie ilość wykonań. Jest to subtelna różnica, którą zaczyna się wyczuwać wraz ze zdobytym doświadczeniem.
Pętla while
Pętla ta ma następującą budowę:
while( warunek )
{
ciało pętli
}
Najpierw sprawdzany jest warunek znajdujący się pomiędzy nawiasami. Jeśli jego wynik jest prawdziwy to wykonują się instrukcje znajdujące się wewnątrz pętli, a więc jej ciało. W przeciwnym wypadku wykonanie programu omija pętle i wykonuje się instrukcja znajdująca się bezpośrednio za pętlą. Wykonywanie pętli jest kontynuowane dopóki warunek jest prawdziwy, tak więc jeśli nie chcemy aby iteracji nie była nieskończona ilość musimy odpowiednio wpłynąć na prawdziwość warunku (w pewnym momencie musi być nieprawdziwy aby instrukcja „while” zakończyła się).
Napiszmy program, który zapyta nas o hasło. Jeśli podamy poprawne (w tym wypadku jest nim wyraz „tajne”) to wyświetli się komunikat powiadamiający nas o tym, w przeciwnym wypadku program zawiadomi nas o błędzie i poprosi o ponowne wprowadzenie hasła. Dopóki nie podamy poprawnego, program będzie powtarzał pytanie w pętli.
class KlasaGlowna
{
static void Main()
{
System.Console.Write("hasło:
");
string haslo = System.Console.ReadLine();
while (haslo != "tajne")
{
System.Console.WriteLine("Podałeś; złe hasło. Spróbuj jeszcze raz.");
System.Console.Write("hasło: ");
haslo = System.Console.ReadLine();
}
System.Console.WriteLine("Brawo!
Podałeś; poprawne hasło.");
System.Console.Read();
}
Na początku pobieramy hasło za pomocą instrukcji „ReadLine()” i przypisujemy jego zawartość do zmiennej „haslo”. Następnie w instrukcji „while” sprawdzamy czy podane hasło nie jest równe wyrazowi „tajne”. Warunek jest prawdziwy jeśli podaliśmy niepoprawne hasło, dlatego wykona się ciało pętli. Wewnątrz pętli znowu pobieramy hasło i zanim wykona się następna iteracja, ponownie sprawdzamy prawdziwość warunku. W momencie gdy podamy poprawne hasło, warunek zwróci wartość „false” (nieprawda), następna iteracja nie wykona się i instrukcja „while” zostanie przerwana.
A oto wynik:
Instrukcja „do ... while”
Różnica między „while” a „do ... while” jest niewielka. W zasadzie sprowadza się ona do tego, że w przypadku „while” warunek sprawdzany jest przed wykonaniem iteracji, a w przypadku „do ... while” na końcu. Co nam to daje?
Wykorzystując pętlę „while” musimy spodziewać się tego, że jest szansa, że nie wykona się ani jedna iteracja. Natomiast w przypadku „do ... while” mamy pewność, że wykona się przynajmniej jedna.
Napiszmy program do pobierania hasła jeszcze raz, tym razem używając pętli „do ... while”.
class KlasaGlowna
{
static void
{
string haslo;
do
{
System.Console.Write("hasło: ");
haslo
= System.Console.ReadLine();
}
while (haslo != "tajne");
System.Console.WriteLine("Brawo! Podałeś poprawne hasło.");
System.Console.Read();
}
Program pyta się nas o hasło, następnie sprawdza prawdziwość warunku. Jeśli jest prawdziwy to wykonuje się następna iteracja, jeśli nie to pętla kończy swoje działanie. Zauważmy także, że w przypadku instrukcji „do ... while” należy umieścić średnik zaraz po nawiasie zamykającym, znajdującym się po warunku.
Działanie tego programu jest trochę inne niż poprzedniego, ponieważ aplikacja nie powiadamia nas o błędnie wprowadzonym haśle. Jeśli chcielibyśmy to zmienić powinniśmy dodać wyświetlanie komunikatu o błędzie i wprowadzić dodatkową instrukcję warunkową.
class KlasaGlowna
{
static void
{
string haslo;
System.Console.Write("hasło:
");
haslo =
System.Console.ReadLine();
do
{
if (haslo != "tajne")
{
System.Console.Write("hasło: ");
haslo
= System.Console.ReadLine();
}
}
while (haslo != "tajne");
System.Console.WriteLine("Brawo! Podałeś poprawne hasło.");
System.Console.Read();
}
Powyższe rozwiązanie nie jest idealne, dlatego jeśli chcemy wyświetlać komunikat o błędzie lepiej użyć instrukcji “while”, jeśli nie chcemy “do … while”.
Użycie for oraz while w jednym przykładzie
Powróćmy do przykładu z poprzedniego rozdziału, a więc potęgowania. Poprzedni program obliczał zadanie i kończył swoje działanie. Musieliśmy ponownie go uruchamiać, jeśli chcieliśmy znowu coś obliczyć. Dzięki instrukcjom warunkowym możemy sami decydować kiedy chcemy aby program się zakończył.
class KlasaGlowna
{
static void
{
string
koniec;
do
{
System.Console.WriteLine("Podaj podstawę.");
string podstawa =
System.Console.ReadLine();
System.Console.WriteLine("Podaj
wykładnik");
string wykladnik
= System.Console.ReadLine();
int wynik = 1;
for
(int i = 0; i < int.Parse(wykladnik);
i++)
{
wynik *= int.Parse(podstawa);
}
System.Console.WriteLine("Wynik wynosi: " + wynik);
koniec = System.Console.ReadLine();
}
while
(koniec != "k");
System.Console.WriteLine("Papa!");
System.Console.Read();
}
Pętla „do ... while” jest zewnętrzna w stosunku do „for” („for” znajduje się w ciele „do ... while”). Program będzie się wykonywał, czyli będzie obliczał dla nas potęgi, do momentu gdy wprowadzimy „k” z klawiatury.
Istnieje jeszcze pętla „foreach”, jednak z jej omówieniem musimy poczekać do momentu aż poznamy takie typy danych jak tablice czy kolekcje.
Ćwiczenie
Napisz kalkulator umożliwiający dodawanie, odejmowanie, mnożenie, dzielenie, potęgowanie oraz obliczanie silni. Działanie programu ma się kończyć po wciśnięciu klawisza „k”.
class KlasaGlowna
{
static void Main()
{
string
koniec;
do
{
string x;
string y;
string dzialanie;
double wynik = 0;
System.Console.WriteLine("Wybierz działanie: \n1) Mnożenie \n2)
Dzielenie");
System.Console.WriteLine("3)
Dodawanie \n4) Odejmowanie \n5) Potęgowanie \n6) Silnia");
dzialanie = System.Console.ReadLine();
if(int.Parse(dzialanie) < 6)
{
System.Console.WriteLine("Podaj
pierwszą liczbę.");
x = System.Console.ReadLine();
System.Console.WriteLine("Podaj drugą liczbę.");
y = System.Console.ReadLine();
if(dzialanie == "1")
{
wynik = double.Parse(x) * double.Parse(y);
}
if(dzialanie
== "2")
{
wynik = double.Parse(x) / double.Parse(y);
}
if(dzialanie == "3")
{
wynik = double.Parse(x) + double.Parse(y);
}
if(dzialanie == "4")
{
wynik = double.Parse(x) - double.Parse(y);
}
if(dzialanie
== "5")
{
wynik = 1;
for(int i = 0; i <
int.Parse(y); i++)
{
wynik *= int.Parse(x);
}
}
}
else
if(dzialanie == "6")
{
System.Console.WriteLine("Podaj
liczbę.");
x = System.Console.ReadLine();
wynik = 1;
for(int
i = 1; i <= int.Parse(x); i++)
{
wynik *= i;
}
}
System.Console.WriteLine("Wynik
wynosi: " + wynik + "\ Jeżeli
chcesz zakończyc nacisnij \"k\".");
koniec = System.Console.ReadLine();
}
while(koniec
!= "k");
}
}
Aktualności
- Co tymi wymaganiami Windowsa 11? To był tydzień z Microsoft 345
- Funkcje AI dla Copilot+ PCs Intel i AMD w Windows 11 (build 26120.2510 w Dev Channel)
- Nowa podatność 0day w Windows 11, 10 i Server z nieoficjalną łatką
- Microsoft zakończył produkcję Surface Studio 2+
- Microsoft Edge 133 już w Dev Channel. Co nowego w buildzie 133.0.2992.0?
- Windows 11 ułatwi zmianę rozdzielczości kamerki internetowej
- Lista kompilacji systemu Windows 11
- OpenAI o1 już ogólnodostępny z możliwością przesyłania obrazów
Artykuły
- Jak działa rozwiązywanie problemów przy użyciu usługi Windows Update w Windows 11?
- Co nowego w Microsoft 365? Podsumowanie zmian z listopada 2024
- Jak połączenie internetu symetrycznego z sieciami MPLS może wspierać zaawansowane potrzeby biznesowe?
- Lista gier w Xbox Game Pass
- Co nowego w Microsoft 365? Podsumowanie zmian z października 2024
- Consent Mode a personalizacja zakupów: Jak balansować między prywatnością a wygodą użytkowników?
- Najlepszy VPN dla Windows: Przewodnik połączenia
- Jak pobrać i zainstalować pakiet Office 2024 w wersji LTSC?