Zaawansowane szukanie | Nowości
Newsy | Artykuły | Programowanie: Pascal, Object/Delphi Pascal, C++, PHP, Javascript | Poradniki | Recenzje | FAQ | Mapa

Artykuł: C++ - Zmienne, warunki i pętle

Trochę matematyki


Jeżeli chcielibyśmy zrobić program, który potrafiłby dodawać, odejmować, mnożyć i dzielić liczby, należy pamiętać o poniższych znakach:
  • + dodawanie,
  • - odejmowanie,
  • * mnożenie
  • / dzielenie
C++ czyta właśnie takie znaki. W tym artykule przedstawię jak zrobić aplikację typu kalkulator, aczkolwiek standardowym kalkulatorem to ona nie będzie. Dla takiej aplikacji potrzebna nam będzie znajomość warunków i zmiennych.

Czym jest zmienna?


Zmienna - jest to wartość, która przechowuje nam dany tekst lub liczbę. Rodzaje zmiennych to np. string - wartość tekstowa i integer - wartość liczby całkowitej. Typów zmiennych liczbowych jest więcej i są to liczby w różnych zakresach. Poniżej przedstawiam listę typów zmiennych arytmetycznych (liczbowych) całkowitoliczbowych oraz ich zakresy:
  • shortint: -128 ... 127
  • smallint: -32768 ... 32767
  • integer: -2147483648 ... 2147483647
  • longint: -2147483648 ... 2147483647
  • cardinal: 0 ... 4294967295
  • int64: -2(63) ... 2(63)-1
  • byte: 0 ... 255
  • word: 0 ... 65535
  • longword: 0 ... 4294967295
Przydaje się jeszcze jedna lista - zmienne arytmetyczne rzeczywiste:
  • Real48: 2.9 x 10(-39) ... 1.7 x 10 38)
  • Single: 1.5 x 10(-45) ... 3.4 x 10(38)
  • Double: 5.0 x 10(-324) ... 1.7 x 10(308)
  • Extended: 3.6 x 10(-4951) ... 1.1 x 10(4932)
  • Comp: -2(63)+1 ... 2(63)-1
Gdzie liczby w nawiasach to potęgi.
Jak widać najlepiej jest korzystać ze zmiennej typu integer (to samo co longint).

Czas na praktykę


Otwieramy nasz projekt z poprzedniego artykułu (lub tworzymy nowy z przyciskiem kliknij na mnie o nazwie "przyciskKliknij") i deklarujemy dwie zmienne typu integer (ustawiamy pierwszą na 4, drugą na 5):
void __fastcall TForm1::przyciskKliknijClick(TObject *Sender)
{
 int zmienna = 4, zmienna2 = 5;
}
Teraz "zmienna" ma wartość 4, a "zmienna2" 5. Aby wyświetlić ich wynik w oknie dialogowym dodajemy:
 ShowMessage(zmienna + zmienna2);
Teraz po kliknięciu na "Kliknij na mnie" zobaczymy liczbę 9, czyli program działa. Czas w końcu zabrać się za coś pożyteczniejszego. Stwórzmy jeszcze przycisk "Zamknij" z procedurą:
Close();
Dodajemy jeszcze trzy pola edycji (komponent Edit) i nazywamy je kolejno "Liczba1", "Liczba2", "Wynik". Nad polem Liczba1 najlepiej wstawić jeszcze etykietę z tekstem "Podaj pierwszą liczbę", nad polem Liczba2 "Podaj drugą liczbę", natomiast nad polem Wynik "Wynik". Całość może wyglądać tak:
Forma aplikacji
Nie zaszkodzi napisać teraz trochę kodu. Edytujemy akcję OnClick dla przycisku "Kliknij na mnie":
void __fastcall TForm1::przyciskKliknijClick(TObject *Sender)
{
 Wynik->Text = Liczba1->Text + Liczba2->Text;
}
Teraz uruchamiamy program, w pole liczby pierwszej wpisujemy 1, a do drugiego pola 2. Klikamy na nasz przycisk i powinna pokazać nam się liczba 3. Niestety nie jest to takie proste, ponieważ dodaliśmy dane tekstowe, które po prostu doklejają się do siebie. Aby wynik pokazywał sumę liczb, musimy zmodyfikować kod:
void __fastcall TForm1::przyciskKliknijClick(TObject *Sender)
{
 Wynik->Text = StrToInt(Liczba1->Text) + StrToInt(Liczba2->Text);
}
Należy się wyjaśnienie - otóż dodałem tutaj funkcję StrToInt, która jak sama nazwa wskazuje, zmienia wartość typu string (tekst) na integer (liczbę). Teraz już bez problemu program działa. Funkcja odwrotna do StrToInt to IntToStr, która także często się przydaje.
Procedura ta może wyglądać inaczej. Można wykorzystać zmienne w taki sposób:
void __fastcall TForm1::przyciskKliknijClick(TObject *Sender)
{
 int PierwszaLiczba = StrToInt(Liczba1->Text), DrugaLiczba = StrToInt(Liczba2->Text);
 Wynik->Text = PierwszaLiczba + DrugaLiczba;
}
Teraz zostały zadeklarowane dwie zmienne typu integer - "PierwszaLiczba" i "DrugaLiczba" wraz z funkcjami "StrToInt". Teraz tekst pola "Wynik" zależny jest od wartości zmiennych PierwszaLiczba i DrugaLiczba, a nie od pól tekstowych, jednak na to samo wychodzi z tą różnicą, że możemy jeszcze "podrasować" te zmienne :) Zróbmy tak, by wynik wskazywał liczbę o 10 mniejszą niż suma dwóch liczb. W tym celu modyfikujemy nasz kod tak:
void __fastcall TForm1::przyciskKliknijClick(TObject *Sender)
{
 int PierwszaLiczba = StrToInt(Liczba1->Text),
 DrugaLiczba = StrToInt(Liczba2->Text),
 TrzeciaLiczba = PierwszaLiczba + DrugaLiczba,
 CzwartaLiczba = TrzeciaLiczba - 10;
 Wynik->Text = CzwartaLiczba;
}
Zostały dodane dwie zmienne. "TrzeciaLiczba" jest wynikiem dwóch poprzednich, a "CzwartaLiczba" odejmuje od "TrzeciaLiczba" 10. Wynik zostaje przedstawiony jako wartość "CzwartaLiczba". Jak przystało na dobrego programistę - kod należy optymalizować. W tym celu można zapisać go używając mniej zmiennych:
void __fastcall TForm1::przyciskKliknijClick(TObject *Sender)
{
 int PierwszaLiczba = StrToInt(Liczba1->Text),
 DrugaLiczba = StrToInt(Liczba2->Text),
 TrzeciaLiczba = PierwszaLiczba + DrugaLiczba - 10;
 Wynik->Text = TrzeciaLiczba;
}
Nie jest to wielka optymalizacja, bo nie wpłynie na stabilność czy wielkość programu. Optymalizacja kodu ważna jest wtedy, gdy robimy wielką aplikację. Należy wtedy upraszczać procedury najbardziej jak to możliwe.

Przydatną rzeczą jest deklarowanie zmiennych globalnych. Dzięki temu dana zmienna globalna będzie dostępna w całym programie, a nie tylko w danej procedurze. Aby zadeklarować zmienną globalną otwieramy plik Unit1.h (gdzie Unit1 to nazwa naszego pliku z kodem) i odszukujemy linijki z kodem private: // User declarations, po czym dodajemy poniżej deklarację zmiennej:
  int nazwazmiennej;


Ala Kalkulator


Nasz program potrafi narazie jedynie dodawać. Czas wzbogacić go o możliwość mnożenia, dzielenia i odejmowania. W tym celu najlepiej wykorzystać komponent ComboBox (lista rozwijalna). Wstawmy go nad polem wynik i nazwijmy "sprawdzacz". Wyedytujmy także w Inspektorze Obiektów wartość "Text" na "wybierz działanie" oraz dodajmy do wartości "Items" (która odpowiada za pozycje z liście) linie: "Dodawanie", "Odejmowanie", "Mnożenie", "Dzielenie".
Mniej więcej taki powinien być końcowy efekt
Wizualna sprawa załatwiona, trzeba zająć się w końcu kodem. Teraz najważniejsze będą warunki, czyli If warunek Then instukcje;. Warunek rozpoczynamy "If", po czym podajemy warunek, a jako "Then" posłuży nam znak "{". Teraz zademonstruję to na przykładzie naszego programu:
void __fastcall TForm1::przyciskKliknijClick(TObject *Sender)
{
 int liczba = StrToInt(Liczba1->Text), liczba3 = StrToInt(Liczba2->Text);
 if (sprawdzacz->Text == "Dodawanie") {
 	Wynik->Text = liczba + liczba3;
 }
 else if (sprawdzacz->Text == "Odejmowanie") {
 	Wynik->Text = liczba - liczba3;
 }
 else if (sprawdzacz->Text == "Mnożenie") {
 	Wynik->Text = liczba * liczba3;
 }
 else if (sprawdzacz->Text == "Dzielenie") {
 	Wynik->Text = liczba / liczba3;
 }
 else {
 	ShowMessage("Wybierz działanie z listy!");
 }
}
Nie jest to tak trudne jak się wydaje. Jeżeli ktoś zna PHP to pozna ten sposób tworzenia warunków. Na początku zadeklarowałem dwie zmienne - liczba i liczba3, które pobierają wartości z pól edycji. Potem w zależności od tekstu, który widnieje w polu do wyboru działania, "Wynik" jest zmieniany na wartość działania naszych zmiennych. Ostatni warunek poprawia nam bezpieczeństwo - jeżeli ktoś w miejscu działań wpisze swój tekst lub nie wybierze działania, wyświetli mu się komunikat "Wybierz działanie z listy!". Jak widać z powyższego kodu - "else" odpowiada za słowo "lub", działa to na takiej zasadzie: JEŚLI sprawdzacz ma wartość "Dodawanie" dodaj liczby LUB JEŚLI sprawdzacz ma wartość "Odejmowanie" (...). Warunki są wykorzystywane w większości programów - jest to jedna z najważniejszych umiejętności programisty. Oczywiście warunki nie polegają jedynie na sprawdzaniu równości. Poniższa lista przedstawia inne możliwości konstrukcji warunków w C++:
  • x > y - Przykład: if (x > y) - jeśli x jest większe od y (można też zapisać: if (x >> y))
  • x < y - Przykład: if (x < y) - jeśli x jest mniejsze od y (można też zapisać: if (x << y))
  • x >= y - Przykład: if (x >= y) - jeśli x jest większe lub równe y
  • x <= y - Przykład: if (x <= y) - jeśli x jest mniejsze lub równe y
  • x != y - Przykład: if (x != y) - jeśli x nie jest równe y
  • warunek 1 && warunek 2 - Przykład: if (x != y && z == a) - jeśli [warunek 1] i jeśli [warunek2] (np. jeśli x nie jest równe y i z jest równe a)
"Ala Kalkulator" już działa, lecz jest w nim jeszcze parę błędów - np. po wpisaniu słowa w miejsce liczby, wyświetli się błąd aplikacji. W następnym artykule pokażę jak przed takimi błędami się chronić i jak poprawić nasz "Ala Kalkulator".

Ależ to zapętlone


W programach często przydają się pętle. Na przykładzie listy pokażę jak je wykorzystać. Tworzymy nowy projekt (File -> News -> Application) i umieszczamy na formie komponent ListBox (lista). Zmieniamy nazwę obiektu na "lista" i dodajemy przycisk OK. Zróbmy tak, by po naciśnięciu OK na liście wyświetliły się 2 elementy o nazwach "pozycja1" i "pozycja2". W tym celu dodajemy poniższy kod:
void __fastcall TForm1::przyciskOKClick(TObject *Sender)
{
 lista->Items->Add("pozycja1");
 lista->Items->Add("pozycja2");
}
Rzecz prosta, wręcz banalna. Ale co, jeśli chcemy dodać 1000 pozycji i każdej nadać kolejno numer? Dużo byłoby kopiowania i edytowania, aż szkoda się męczyć. Do takiego zabiegu najlepiej posłużyć się pętlą. Aby po kliknięciu na przycisk OK pokazało nam się 30 takich pozycji, posłużmy się pętlą while:
void __fastcall TForm1::przyciskOKClick(TObject *Sender)
{
 int zmienna = 1;
 while (zmienna <= 30) {
	lista->Items->Add("pozycja" + IntToStr(zmienna));
	zmienna++;
 }
}
Pętlę while tworzy się tak: trzeba zadeklarować zmienną integer i ustawić jej wartość na 1 (nazwałem ją "zmienna"), po czym napisać już kod samej pętli - "PODCZAS GDY zmienna jest mniejsza lub równa od 30 WYKONAJ: dodaj pozycję do listy o nazwie "pozycja" + wartość zmiennej i DODAJ 1 do zmiennej zmienna, POWTÓRZ to 30 razy", czyli: "while (zmienna <= ilośćpowtórzeń) { co zrobić tyle razy; zmienna++; }". Po każdym przebiegu przebiegu pętli zmienna zwiększa swą wartość o 1 (zmienna++: ++ zwiększa o 1, -- zmniejsza o 1, += cos dodaje cos do zmiennej, -= cos odejmuje cos od zmiennej) Jak widać procedura działa:

Po naciśnięciu OK

Drugim rodzajem pętli jest pętla "for", która jest łatwiejsza w zastosowaniu (przynajmniej łatwiej ją zrozumieć). Przykład takiej pętli:
int i;
for	(i = 1; i <= 30; i++) {
/* tutaj procedura, która ma się powtarzać 30 razy */
}
Pętlę "for" można także zastosować tak, aby wyświetliła 30 pozycji tak samo jak przy pętli "while". Teraz za naszą indeks służy zmienna i. Jako argumenty pętli podaje się wstępne deklaracje zmiennych przed przebiegiem pętli (wartość indexu i ewentualnych innych zmiennych po przecinku), warunek sprawdzany przy każdym przebiegu pętli (i <= 30, jeśli indeks ustawiony byłby na 0, to aby wyświetlić 30 pozycji warunek musiałby wyglądać tak: i < 30) oraz działanie po każdym przebiegu pętli (np. zwiększanie indexu - i++).

W następnym artykule można przeczytać, jak już pisałem wcześniej, jak pokonywać błędy.
Autor: Michał Gacki
Główny programista i założyciel Bil Software.
Informacje o autorze | Kontakt