Darmowy fragment publikacji:
IDZ DO
IDZ DO
PRZYK£ADOWY ROZDZIA£
PRZYK£ADOWY ROZDZIA£
SPIS TREœCI
SPIS TREœCI
KATALOG KSI¥¯EK
KATALOG KSI¥¯EK
KATALOG ONLINE
KATALOG ONLINE
ZAMÓW DRUKOWANY KATALOG
ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK
TWÓJ KOSZYK
DODAJ DO KOSZYKA
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
CENNIK I INFORMACJE
ZAMÓW INFORMACJE
ZAMÓW INFORMACJE
O NOWOœCIACH
O NOWOœCIACH
ZAMÓW CENNIK
ZAMÓW CENNIK
CZYTELNIA
CZYTELNIA
FRAGMENTY KSI¥¯EK ONLINE
FRAGMENTY KSI¥¯EK ONLINE
Wydawnictwo Helion
ul. Koœciuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
C++Builder i Turbo C++.
Podstawy
Autor: Jacek Matulewski
ISBN: 83-246-0642-4
Format: B5, stron: 280
Przyk³ady na ftp: 4122 kB
Wizualne œrodowiska projektowe od d³u¿szego czasu ciesz¹ siê uznaniem
programistów. Mo¿liwoœæ budowania aplikacji z gotowych komponentów, realizuj¹cych
typowe funkcje, pozwala skoncentrowaæ siê na jej funkcjonalnoœci bez potrzeby
ponownego wymyœlania ko³a. Najbardziej znanym œrodowiskiem tego typu jest Delphi,
jednak jego producent, firma Borland, wypuœci³ na rynek kolejne narzêdzie: C++Builder.
To wizualne œrodowisko projektowe oparte na jêzyku C++ pozwala tworzyæ aplikacje dla
platformy Win32 z wykorzystaniem komponentów VCL. W sieci dostêpna jest równie¿
jego bezp³atna wersja o nazwie Turbo C++ Explorer.
„C++Builder i Turbo C++. Podstawy” to podrêcznik programowania w tych
œrodowiskach. Czytaj¹c go, nauczysz siê tworzyæ aplikacje w jêzyku C++ dla systemu
Windows z wykorzystaniem C++Buildera lub Turbo C++. Dowiesz siê, jak zainstalowaæ
i skonfigurowaæ œrodowisko programistyczne oraz jak utworzyæ w nim projekt.
Poznasz elementy jêzyka C++, zasady programowania obiektowego i korzystania
z komponentów VCL. Stworzysz w³asne komponenty i aplikacje, zaimplementujesz
mechanizm przeci¹gania i upuszczania, a tak¿e zapiszesz dane aplikacji w rejestrze
systemu Windows.
(cid:129) Instalacja œrodowiska programistycznego
(cid:129) Pierwszy projekt
(cid:129) Zmienne i instrukcje w C++
(cid:129) Programowanie zorientowane obiektowo
(cid:129) Wyszukiwanie i usuwanie b³êdów w kodzie
(cid:129) Komponenty VCL oferowane przez C++Buildera
(cid:129) Tworzenie interfejsu u¿ytkownika dla aplikacji
(cid:129) Drukowanie
(cid:129) Operacje na plikach
(cid:129) Przechowywanie informacji w rejestrze systemowym
(cid:129) Tworzenie w³asnych komponentów VCL
Poznaj nowoczesne narzêdzia programistyczne
Wstęp............................................................................................. 11
O czym jest ta książka? .................................................................................................... 11
Jak zdobyć C++Builder? .................................................................................................. 11
Część I Zintegrowane środowisko programistyczne
i język programowania C++............................................ 13
Rozdział 1. Poznajemy możliwości C++Buildera 2006......................................... 15
Platforma Win32............................................................................................................... 16
Pierwszy projekt ............................................................................................................... 17
Projekt VCL Forms Application — C++Builder ....................................................... 17
Jak umieścić komponent na formie? .......................................................................... 18
Co to jest inspektor obiektów? ................................................................................... 18
Jak za pomocą inspektora obiektów zmieniać własności komponentów? ................. 19
Jak dopasować położenie komponentu? .................................................................... 21
Jak umieszczać na formie wiele komponentów tego samego typu? .......................... 21
Jak zaznaczyć wiele komponentów jednocześnie? .................................................... 22
Jak zaprogramować reakcję programu na kliknięcie panelu przez użytkownika?..... 22
Jak uruchomić projektowaną aplikację? .................................................................... 24
Jak przełączać między widokiem projektowania i edytorem? ................................... 24
Jak ustalić pozycję okna po uruchomieniu aplikacji? ................................................ 25
Jak zmieniać własności obiektów programowo? ....................................................... 25
Jak zapisać projekt na dysku? .................................................................................... 27
Pliki projektu .............................................................................................................. 28
Filozofia RAD ............................................................................................................ 28
Ustawienia projektu .......................................................................................................... 29
Jak zmienić tytuł i ikonę aplikacji? ............................................................................ 29
Informacje o wersji aplikacji dołączane do skompilowanego pliku .exe................... 30
Dystrybucja programów ................................................................................................... 31
Konfiguracja środowiska C++Builder 2006..................................................................... 33
Okno postępu kompilacji ........................................................................................... 33
Automatyczne zapisywanie plików projektu ............................................................. 34
Edytor kodu ...................................................................................................................... 34
Opcje edytora ............................................................................................................. 35
4
C++Builder i Turbo C++. Podstawy
Rozdział 2. Analiza kodu pierwszej aplikacji, czyli wprowadzenie do C++ ............ 37
Jak wczytać wcześniej zapisany projekt?................................................................... 37
Plik modułu formy Unit1.cpp ........................................................................................... 38
Komentarze ................................................................................................................ 39
Zmienne globalne ....................................................................................................... 40
Dyrektywy prekompilatora ........................................................................................ 40
Plik nagłówkowy modułu Unit1.h.................................................................................... 40
Klasa TForm1............................................................................................................. 41
Czym jest moduł?....................................................................................................... 42
Plik Unit1.dfm .................................................................................................................. 42
Plik Kolory.cpp................................................................................................................. 43
Rozdział 3. Typy zmiennych i instrukcje sterujące,
czyli o tym, co każdy programista umieć musi................................ 45
Podstawy........................................................................................................................... 45
Równanie kwadratowe ............................................................................................... 46
Przygotowanie interfejsu............................................................................................ 47
Deklarowanie zmiennych ........................................................................................... 48
Inicjacja i przypisanie wartości zmiennej .................................................................. 49
Dygresja na temat typów rzeczywistych w C++Builderze ........................................ 49
Konwersja łańcucha na liczbę .................................................................................... 50
Obliczenia arytmetyczne i ich kolejność.................................................................... 51
Operatory upraszające zapis operacji arytmetycznych wykonywanych na zmiennej ...... 52
Typ logiczny i operatory logiczne.............................................................................. 53
Instrukcja warunkowa if............................................................................................. 53
Jak wyłączyć podpowiadanie szablonów instrukcji w edytorze? .............................. 55
O błędach w kodzie i części else instrukcji warunkowej ........................................... 55
Słowo kluczowe return............................................................................................... 57
Na tym nie koniec............................................................................................................. 58
Typy całkowite C++................................................................................................... 58
Instrukcja wielokrotnego wyboru switch ................................................................... 60
Funkcja ShowMessage ............................................................................................... 61
Obsługa wyjątków ............................................................................................................ 62
Czym są i do czego służą wyjątki?............................................................................. 63
Przechwytywanie wyjątków....................................................................................... 63
Zgłaszanie wyjątków.................................................................................................. 65
Pętle .................................................................................................................................. 66
Pętla for ...................................................................................................................... 66
Pętla for w praktyce, czyli tajemnica pitagorejczyków ................................................ 67
Dzielenie liczb naturalnych ........................................................................................ 69
Pętla do..while ............................................................................................................ 70
Pętla while .................................................................................................................. 71
Instrukcje break i continue ......................................................................................... 72
Podsumowanie.................................................................................................................. 73
Typy złożone .................................................................................................................... 73
Tablice statyczne ........................................................................................................ 74
Tablice dwuwymiarowe ............................................................................................. 75
Definiowanie aliasów do typów ................................................................................. 76
Tablice dynamiczne.................................................................................................... 77
Typy wyliczeniowe .................................................................................................... 77
Zbiory ......................................................................................................................... 78
Struktury..................................................................................................................... 81
Jak sprawdzić zawartość tablicy rekordów? .............................................................. 83
Kilka słów o konwersji i rzutowaniu typów ..................................................................... 84
Spis treści
5
Łańcuchy .......................................................................................................................... 85
Dyrektywy preprocesora................................................................................................... 87
Dyrektywa #include ................................................................................................... 87
Dyrektywy kompilacji warunkowej ........................................................................... 85
Stałe preprocesora ...................................................................................................... 88
Makra ......................................................................................................................... 88
Zadania ............................................................................................................................. 89
Zdegenerowane równanie kwadratowe ...................................................................... 89
Silnia........................................................................................................................... 89
Pętle ............................................................................................................................ 89
Ikony formy................................................................................................................ 89
Typ wyliczeniowy i zbiór........................................................................................... 90
Struktury..................................................................................................................... 90
Rozdział 4. Wskaźniki i referencje ..................................................................... 91
Wskaźniki do zmiennych i obiektów. Stos i sterta ........................................................... 91
Operatory dostępu............................................................................................................. 93
Zagrożenia związane z wykorzystaniem wskaźników ..................................................... 94
Referencje ......................................................................................................................... 96
Rozdział 5. Programowanie modularne............................................................... 99
Funkcja niezwracająca wartości............................................................................... 100
Definiowanie funkcji................................................................................................ 100
Interfejs modułu ....................................................................................................... 102
Plik nagłówkowy modułu......................................................................................... 103
Argumenty funkcji ................................................................................................... 104
Większa ilość argumentów....................................................................................... 104
Wartości domyślne argumentów .............................................................................. 105
Referencje jako argumenty funkcji .......................................................................... 105
Wskaźniki jako argumenty funkcji .......................................................................... 106
Wartość zwracana przez funkcję.............................................................................. 106
Wskaźniki do funkcji ............................................................................................... 107
Rozdział 6. Programowanie zorientowane obiektowo ........................................ 109
Pojęcia obiekt i klasa ...................................................................................................... 109
Klasa......................................................................................................................... 110
Wskaźniki do komponentów jako pola klasy........................................................... 111
Tworzenie obiektów ................................................................................................. 111
Jeden obiekt może mieć wiele wskaźników............................................................. 113
Interfejs i implementacja klasy....................................................................................... 113
Definicja klasy.......................................................................................................... 113
Projektowanie klasy — ustalanie zakresu dostępności pól i metod......................... 114
Pola........................................................................................................................... 116
Konstruktor klasy — inicjowanie stanu obiektu ...................................................... 116
Wskaźnik this ........................................................................................................... 117
„Bardziej” poprawna inicjacja pól obiektu w konstruktorze ................................... 117
Tworzenie obiektu.................................................................................................... 118
Usuwanie obiektów z pamięci.................................................................................. 119
Metoda prywatna...................................................................................................... 120
Metoda typu const .................................................................................................... 120
Zbiór metod publicznych udostępniających wyniki................................................. 121
Testowanie klasy ...................................................................................................... 122
Metody statyczne...................................................................................................... 122
6
C++Builder i Turbo C++. Podstawy
Rozdział 7. Podstawy debugowania kodu ......................................................... 125
Ukryty błąd............................................................................................................... 125
Aktywowanie debugowania ..................................................................................... 126
Kontrolowane uruchamianie i śledzenie działania aplikacji .................................... 126
Breakpoint ................................................................................................................ 128
Obserwacja wartości zmiennych .............................................................................. 129
Obsługa wyjątków przez środowisko BDS .............................................................. 129
Wyłączanie debugowania......................................................................................... 131
Część II Biblioteka komponentów VCL ...................................... 133
Rozdział 8. Podstawowe komponenty VCL ....................................................... 135
Komponent TShape — powtórzenie wiadomości .......................................................... 135
Jak umieszczać komponenty na formie? .................................................................. 135
Jak modyfikować złożone własności komponentów za pomocą inspektora
obiektów?............................................................................................................... 136
Jak reagować na zdarzenia? ..................................................................................... 137
Komponent TImage. Okna dialogowe............................................................................ 138
Automatyczne adaptowanie rozmiarów komponentów do rozmiaru formy ............ 138
Jak wczytać obraz w trakcie projektowania aplikacji?............................................... 138
Konfigurowanie komponentu TOpenDialog............................................................ 138
Jak za pomocą okna dialogowego wczytać obraz podczas działania programu? .... 140
Jak odczytać plik w formacie JPEG? ....................................................................... 141
Kontrola programu za pomocą klawiatury............................................................... 141
Wczytywanie dokumentu z pliku wskazanego jako parametr linii komend ............ 142
Jak uruchomić projektowaną aplikację w środowisku BDS
z parametrem linii komend? .................................................................................. 143
Komponent TMediaPlayer ............................................................................................. 144
Odtwarzacz plików wideo ........................................................................................ 144
Panel jako ekran odtwarzacza wideo ....................................................................... 145
Wybór filmu za pomocą okna dialogowego w trakcie działania programu............. 146
Odtwarzacz CDAudio .............................................................................................. 147
Komponenty sterujące .................................................................................................... 147
Suwak TScrollBar i pasek postępu TProgressBar.................................................... 147
Pole opcji TCheckBox ............................................................................................. 148
Pole wyboru TRadioButton...................................................................................... 149
Niezależna grupa pól wyboru................................................................................... 150
TTimer ............................................................................................................................ 151
Czynności wykonywane cyklicznie ......................................................................... 151
Czynność wykonywana z opóźnieniem ................................................................... 152
Aplikacja z wieloma formami ........................................................................................ 153
Dodawanie form do projektu.................................................................................... 153
Dostęp do nowej formy z formy głównej................................................................. 153
Show versus ShowModal ......................................................................................... 155
Zmiana własności Visible formy w trakcie projektowania ...................................... 156
Dostęp do komponentów formy z innej formy ........................................................ 156
Właściciel i rodzic .......................................................................................................... 157
Własności Owner i Parent komponentów ................................................................ 157
Zmiana rodzica w trakcie działania programu ......................................................... 158
Co właściwie oznacza zamknięcie dodatkowej formy? ............................................. 159
Tworzenie kontrolek VCL w trakcie działania programu ............................................. 160
Zadania ........................................................................................................................... 161
Komponent TSaveDialog ......................................................................................... 161
Komponenty TMemo, TRichEdit ............................................................................ 161
Komponent TRadioGroup........................................................................................ 161
Spis treści
7
Rozdział 9. Więcej komponentów VCL… .......................................................... 163
Menu aplikacji ................................................................................................................ 163
Menu główne aplikacji i edytor menu...................................................................... 164
Rozbudowywanie struktury menu............................................................................ 166
Tworzenie nowych metod związanych z pozycjami menu ...................................... 166
Wiązanie pozycji menu z istniejącymi metodami.................................................... 167
Wstawianie pozycji do menu. Separatory ................................................................ 167
Usuwanie pozycji z menu ........................................................................................ 168
Klawisze skrótu ........................................................................................................ 168
Ikony w menu........................................................................................................... 169
Pasek stanu ..................................................................................................................... 170
Sztuczki z oknami........................................................................................................... 172
Jak uzyskać dowolny kształt formy?........................................................................ 172
Jak poradzić sobie z niepoprawnym skalowaniem formy w systemach z różną
wielkością czcionki? .............................................................................................. 173
Jak ograniczyć rozmiary formy? .............................................................................. 174
Jak przygotować wizytówkę programu (splash screen)? ......................................... 174
Zadania ........................................................................................................................... 177
Menu kontekstowe ................................................................................................... 177
Pasek narzędzi .......................................................................................................... 177
Rozdział 10. Prosta grafika............................................................................... 179
Klasa TCanvas.......................................................................................................... 179
Odświeżanie formy. Zdarzenie OnPaint formy........................................................ 179
Linie................................................................................................................................ 180
Metoda mieszająca kolory........................................................................................ 180
Rysowanie linii......................................................................................................... 182
ClientHeight i Height, czyli obszar użytkownika formy ............................................ 183
Okno dialogowe wyboru koloru TColorDialog ....................................................... 184
Punkty............................................................................................................................. 186
Wykorzystanie tablicy TCanvas::Pixels................................................................... 186
Negatyw ................................................................................................................... 186
Jak umożliwić edycję obrazów z plików JPEG?...................................................... 188
Kilka słów o operacjach na bitach............................................................................ 190
Własność TBitmap::ScanLine.................................................................................. 191
Inne możliwości płótna................................................................................................... 192
Tekst na płótnie ........................................................................................................ 192
Obraz na płótnie ....................................................................................................... 194
Zadanie ........................................................................................................................... 196
Rozdział 11. Operacje na plikach i drukowanie z poziomu VCL i VCL.NET ............ 197
Automatyczne dopasowywanie rozmiaru komponentów............................................... 198
Własność Align, czyli o tym, jak przygotować interfejs aplikacji, który
będzie automatycznie dostosowywał się do zmian rozmiarów formy .................. 198
Komponent TSplitter................................................................................................ 199
Komponenty VCL pomagające w obsłudze plików ....................................................... 199
Jak połączyć komponenty TDriveComboBox, TDirectoryListBox
i TFileListBox tak, żeby stworzyć prostą przeglądarkę plików?........................... 199
Jak filtrować zawartość komponentu TFileListBox?............................................... 200
Prezentowanie na komponencie TLabel nazwy katalogu wybranego za pomocą
TDirectoryListBox................................................................................................. 200
Prezentowanie na komponencie TLabel pliku wybranego za pomocą
TFileListBox.......................................................................................................... 201
Jak z łańcucha wyodrębnić nazwę pliku, jej rozszerzenie lub ścieżkę dostępu?......... 202
8
C++Builder i Turbo C++. Podstawy
Wczytywanie plików graficznych wskazanych w FileListBox ............................... 203
Przeglądanie katalogów w TFileListBox ................................................................. 204
Obsługa plików z poziomu C++..................................................................................... 206
Tworzenie pliku tekstowego .................................................................................... 206
Test funkcji zapisującej do pliku.............................................................................. 207
Dopisywanie do pliku............................................................................................... 208
Odczytywanie plików tekstowych ........................................................................... 208
O funkcjach tworzących obiekty i o tym, dlaczego nie jest to najszczęśliwsze
rozwiązanie ............................................................................................................ 209
Co jeszcze potrafi klasa ifstream? ............................................................................ 210
System plików ................................................................................................................ 212
Operacje na plikach .................................................................................................. 212
Operacje na katalogach ............................................................................................ 212
Jak z łańcucha wyodrębnić nazwę pliku, jego rozszerzenie lub katalog,
w którym się znajduje? ........................................................................................... 213
Jak sprawdzić ilość wolnego miejsca na dysku?...................................................... 213
Drukowanie „automatyczne”.......................................................................................... 214
Drukowanie tekstu znajdującego się w komponencie TRichEdit.
Okno dialogowe TPrintDialog............................................................................... 214
Wybór drukarki z poziomu kodu aplikacji............................................................... 216
Drukowanie „ręczne” ..................................................................................................... 216
Tworzenie i przygotowanie modułu Drukowanie .................................................... 217
Jak w trybie graficznym wydrukować tekst przechowywany w klasie TStrings? ...... 217
Testowanie drukowania tekstu w trybie graficznym................................................ 220
Jak wydrukować obraz z pliku? ............................................................................... 221
Dodawanie kodu źródłowego modułu do projektu .................................................. 223
Powtórka z edycji menu aplikacji ............................................................................ 223
Testowanie funkcji drukującej obraz ....................................................................... 224
Zadania ........................................................................................................................... 224
Klasa TStringList ..................................................................................................... 224
Rozwijanie funkcji Drukuj ....................................................................................... 225
Rozdział 12. Przechowywanie informacji w rejestrze systemu Windows .............. 227
Przechowywanie danych aplikacji w rejestrze ............................................................... 228
Jak utworzyć nowy moduł na funkcje odczytujące i zapisujące dane do rejestru? ........ 228
Deklarowanie funkcji w pliku nagłówkowym modułu ............................................ 229
Jak odczytywać dane z rejestru? .............................................................................. 229
Jak zapisać dane do rejestru? ................................................................................... 231
Odczyt z rejestru pozycji i rozmiaru okna po uruchomieniu aplikacji i ich zapis
w trakcie jej zamykania ......................................................................................... 233
Automatyczne uruchamianie aplikacji w momencie logowania użytkownika .............. 234
Zapisywanie do rejestru informacji o uruchamianiu aplikacji w momencie
logowania użytkownika ......................................................................................... 235
Usuwanie zapisu o automatycznym uruchamianiu .................................................. 235
Sprawdzanie, czy istnieje zapis o automatycznym uruchomieniu ........................... 236
Udostępnianie funkcji z modułu .............................................................................. 236
Test funkcji............................................................................................................... 237
Zadania ........................................................................................................................... 238
Przenoszenie modułu Rejestr do innych projektów ................................................. 238
Lista ostatnio otwartych plików w rejestrze............................................................. 238
Spis treści
9
Rozdział 13. Mechanizm drag drop................................................................. 239
Drag Drop z biblioteką VCL ...................................................................................... 240
Przygotowanie interfejsu z dwiema listami ............................................................. 240
Faza pierwsza: rozpoczęcie przenoszenia ................................................................ 241
Faza druga: akceptacja upuszczenia......................................................................... 241
Faza trzecia: upuszczenie przenoszonego elementu ................................................ 241
Usprawnienia .................................................................................................................. 242
Umieszczanie elementu w miejscu upuszczenia ...................................................... 242
Uelastycznianie kodu. Wykorzystanie wskaźnika Sender ....................................... 243
Rzutowanie wskaźnika Sender................................................................................. 243
Jak przenosić wiele elementów? .............................................................................. 244
Rozdział 14. Projektowanie własnego komponentu VCL ..................................... 247
Projektowanie i testowanie komponentu ........................................................................ 248
Tworzenie modułu komponentu............................................................................... 248
Funkcja Register....................................................................................................... 249
Metoda testująca komponent.................................................................................... 249
Dodawanie metod do komponentu........................................................................... 250
Krótka uwaga na temat metod statycznych i stałych ............................................... 251
Konstruktor komponentu.......................................................................................... 251
Dodawanie własności komponentu .......................................................................... 252
Zalety własności ....................................................................................................... 254
Testowanie własności............................................................................................... 254
Metoda prawie zdarzeniowa..................................................................................... 254
Funkcja ShellExecute ............................................................................................... 255
Uzupełnianie konstruktora ....................................................................................... 255
Wskaźniki do metod................................................................................................. 256
Udostępnianie niektórych ukrytych własności......................................................... 257
Pakiet dla komponentu i jego instalacja w BDS............................................................. 258
Aby stworzyć projekt pakietu .................................................................................. 258
Instalowanie komponentu VCL ............................................................................... 260
Ostateczne testowanie komponentu ......................................................................... 261
Zadania ........................................................................................................................... 262
Własności w klasie TRownanieKwadratowe ........................................................... 262
Rozwijanie komponentu TLinkLabel....................................................................... 262
Klasa abstrakcyjna.................................................................................................... 262
Skorowidz........................................................................................ 263
Rozdział 3.
Żeby nie zanudzać Czytelnika suchym wykładem o poszczególnych typach zmiennych
predefiniowanych w C++, instrukcjach sterujących i tym podobnych rzeczach, których
tak czy inaczej trzeba się nauczyć, od razu proponuję zająć się programowaniem — wie-
dza o języku pojawiać się będzie jako niezbędny element składowy opisywanych progra-
mów. Przy okazji nauczymy się też, jak korzystać z najbardziej podstawowych kom-
ponentów: pola edycyjnego TEdit, etykiety TLabel i przycisku TButton. Nie zamierzam
bowiem zmuszać nikogo do tworzenia aplikacji konsolowych, na których zwykle uczy się
programowania, co w przypadku narzędzi RAD jest mało naturalne i raczej nieatrakcyjne.
Podstawy
Zacznijmy od spraw podstawowych. Na przykład od powtórzenia informacji, że w C++
wielkość liter ma podstawowe znaczenie. Możemy na przykład zadeklarować trzy
zmienne: zmienna, Zmienna i ZMIENNA, i każda z nich będzie przez kompilator trakto-
wana jako oddzielna, zupełnie niezależna zmienna.
Nie ma natomiast znaczenia sposób ułożenia kodu. Oznacza to, że pomiędzy słowa kodu
można wstawić dowolną ilość spacji i zrobić dowolnie wielkie wcięcia — kompilator
nie zwróci na to uwagi.
Wszystkie zmienne w C++ są inicjowane. Jeżeli przy deklarowaniu zmiennej nie wska-
żemy jej wartości, to zostanie ona zainicjowana wartością domyślną. W przypadku
większości typów jest to zero.
46
Część I ¨ Zintegrowane środowisko programistyczne i język programowania C++
W rozdziale pierwszym do zmiany koloru panelu, a więc do przypisania nowej warto-
ści własności Panel1- Color, użyliśmy operatora =. W C++ jest to właśnie operator
przypisania. To tym operatorem nadajemy nową wartość wszelkiego typu zmiennym.
Do porównywania dwóch zmiennych służy natomiast operator ==, który zwraca war-
tość true (prawda), gdy zmienne są równe, i false (fałsz) w przeciwnym przypadku.
Równanie kwadratowe
Przygotujmy program rozwiązujący równanie kwadratowe. Jest to przykład na tyle
prosty, żeby był łatwo zrozumiały bez większego wysiłku, a jednocześnie informatycz-
nie na tyle złożony, żeby możliwe było przedstawienie wielu aspektów języka pro-
gramowania. Jest to wręcz idealny przykład na zastosowanie instrukcji wyboru if
i operacji arytmetycznych.
Najpierw jednak trochę teorii dla tych, którzy zdążyli już zapomnieć, jak oblicza się
pierwiastki równania kwadratowego i czym one w ogóle są. Równanie kwadratowe
to równanie, w którym wyrażenie typu ax2+bx+c przyrównuje się do zera, a więc
ax2+bx+c=0. Współczynniki równania a, b i c są ustalone i możemy założyć, że je
znamy. Zakładamy dodatkowo, że współczynnik a jest różny od zera1. Naszym zada-
niem jest natomiast wyznaczenie takich wartości liczby x, dla których równanie
będzie spełnione, tzn. że po wstawieniu znalezionego x do lewej strony będzie ona
równa zero.
Jeżeli pozwolimy, żeby x było liczbą zespoloną, to równanie kwadratowe ma zawsze
dwa, choć niekoniecznie różne, rozwiązania. W C++ liczby zespolone nie są jednak
jednym z typów wbudowanych, choć obecny jest on w dołączonych do C++Buildera
bibliotekach. Proponuję zatem ograniczyć się do liczb rzeczywistych, a wówczas rów-
nanie kwadratowe może mieć dwa różne rozwiązania, jedno rozwiązanie „podwójne”
lub nie mieć rozwiązań. Wszystko zależy od wartości parametrów, a dokładnie od
. Jest to wyróżnik równania kwa-
wartości ich następującej kombinacji:
dratowego nazywany popularnie deltą, bo takiego symbolu używa się zazwyczaj do
jego oznaczenia. Jeżeli wartość delty jest dodatnia, to równanie ma dwa różne roz-
wiązania (pierwiastki). Jeżeli równa jest zero, to pierwiastki stają się sobie równe
i mówimy, że równanie ma jedno rozwiązanie będące pierwiastkiem podwójnym. Na-
tomiast jeżeli delta jest ujemna, to równanie nie ma rozwiązań w dziedzinie liczb rze-
czywistych. Obliczenie delty to już połowa sukcesu, bo o ile nie jest ujemna, pozwala
na bezpośrednie obliczenie wartości pierwiastków, które są równe:
=D
2 -
b
4
ac
x
1
=
D--
b
2
a
i
x
2
=
D+-
b
2
a
Widać, że jeżeli wartość delty równa jest zero, a więc znika pierwiastek w liczniku,
to x1 i x2 mają taką samą wartość i są równe –b/2a. To wspomniany pierwiastek po-
dwójny.
1
Jeżeli a jest równe zero, to równanie kwadratowe degraduje się do równania bx+c = 0, którego rozwiązaniem
jest x = –c /b (wówczas b musi być różne od zera).
Rozdział 3. ¨ Typy zmiennych i instrukcje sterujące
47
Algorytm obliczania rozwiązań równania kwadratowego jest zatem następujący:
1. Odczytujemy wartości współczynników równania
2. Obliczamy wartość delty D.
3. Sprawdzamy, czy wartość delty jest mniejsza od zera: jeżeli tak, kończymy,
pokazując komunikat o braku pierwiastków.
4. Jeżeli delta jest nieujemna, obliczamy pierwiastki i prezentujemy je użytkownikowi.
Przygotowanie interfejsu
Aby umożliwić użytkownikowi podanie współczynników równania, zastosujemy je-
den z najbardziej podstawowych komponentów biblioteki VCL, a mianowicie TEdit
— pole edycyjne. A dokładniej trzy tego typu komponenty, po jednym dla każdego
współczynnika. Z każdym polem edycyjnym związana będzie etykieta informująca,
który współczynnik należy wpisać do pola. Etykieta to komponent TLabel. Wynik po-
każemy natomiast w okienku dialogowym, a ponadto na dodatkowym komponencie
TEdit. Obliczenia uruchamiane będą za pomocą przycisku TButton. TEdit, TLabel
i TButton to trzy chyba najczęściej używane komponenty biblioteki VCL.
Świadomie pominąłem komponent TSpinEdit z zakładki Samples, który byłby z pew-
nością wygodniejszy do kontroli liczb, którymi są współczynniki równania. Chciałem
po prostu przedstawić Czytelnikowi komponent TEdit.
Stwórzmy zatem nowy projekt aplikacji. Dokładniejszy opis czynności, które należy
w tym celu wykonać, znajdzie Czytelnik w pierwszym rozdziale, ale ograniczają się
one w zasadzie do wybrania pozycji VCL Forms Application — C++Builder z menu
File/New.
W widoku projektowania na formie należy umieścić trzy komponenty TEdit według
wzoru na rysunku 3.1. Za pomocą inspektora własności zmieniamy ich własności
Text odpowiadające zawartości pól na np. 1 w przypadku pierwszego i zera w przy-
padku pozostałych (zob. rysunek 3.1). Nad każdym z nich warto umieścić komponent
TLabel. Ich dokładne pozycje można dopasować za pomocą własności Left i Top wi-
docznych w inspektorze obiektów. Etykiety tych komponentów zmieniamy kolejno
na a, b i c. Można też zmienić ich własność Font w taki sposób, żeby powiększyć ety-
kiety i użyć kursywy2. Dzięki temu będzie jasne, jaką wartość należy wpisać do każ-
dego pola edycyjnego.
Umieszczamy tam także jeszcze jedno pole edycyjne, w którym pokażemy wynik. Jego
własność ReadOnlR (z ang. tylko do odczytu) zmieniamy na true. Żeby wyraźnie za-
znaczyć, że nie jest to pole, którego wartość będzie dostępna do edycji, proponuję
zmienić kolor jego tła na identyczny z kolorem formy (rysunek 3.1). W tym celu
z rozwijanej listy w inspektorze obiektów przy własności Color wybieramy pozycję
clBtnFace. Tę samą domyślną wartość ma własność Color formy.
O tym, jak wykonać te czynności, dowiedzieliśmy się w pierwszym rozdziale.
2
48
Część I ¨ Zintegrowane środowisko programistyczne i język programowania C++
Rysunek 3.1.
Interfejs aplikacji
znajdującej
rozwiązania równania
kwadratowego
Obok tych komponentów kładziemy jeszcze przycisk TButton. Za pomocą inspektora
własności zmieniamy jego własność Caption np. na Oblicz (rysunek 3.1). Następnie
klikamy go dwukrotnie, aby utworzyć domyślną metodę zdarzeniową. Przeniesieni zo-
staniemy do edytora, gdzie zobaczymy utworzoną metodę — przez najbliższy czas bę-
dzie to nasz cały ogródek, w którym będziemy uczyć się programowania w C++.
Deklarowanie zmiennych
W C++ nie ma wydzielonego miejsca, w którym należy deklarować zmienne. Ogromne
znaczenie ma jednak to, czy zadeklarujemy ją wewnątrz, czy na zewnątrz metody
Button1Click. W drugim przypadku będziemy mieli do czynienia ze zmienną globalną
istniejącą przez cały czas działania programu. W pierwszym — ze zmienną lokalną
tworzoną tylko na czas wykonywania metody Button1Click. Rozwiązanie drugie ogra-
nicza ilość wykorzystywanej pamięci. Jest również znacznie bezpieczniejsze, bo ła-
twiej kontrolować wartość zmiennej, która nie może być zmieniana nigdzie indziej jak
tylko w metodzie Button1Click.
Musimy obliczyć wartość delty. Zadeklarujmy więc w metodzie Button1Click zmienną
lokalną Delta typu double. W tym celu w metodzie wpisujemy typ double, a po spacji
nazwę zmiennej Delta (listing 3.1). Typ double potrafi przechowywać liczby rzeczy-
wiste. Na ich przechowywanie posiada 64-bity (8 bajtów), co daje mu możliwość
przechowywania liczb o wartości ponad ±10300.
Listing 3.1. Deklaracja zmiennej Delta typu Double
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double Delta;
}
Jeżeli więcej zmiennych ma ten sam typ, to możemy je zadeklarować razem. Dodajmy
jeszcze trzy zmienne o nazwach a, b i c typu double (listing 3.2). Zmienne te będą
przechowywać wartości współczynników równania kwadratowego.
Listing 3.2. W metodzie zadeklarowane są teraz cztery zmienne lokalne
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double a,b,c,Delta;
}
Rozdział 3. ¨ Typy zmiennych i instrukcje sterujące
49
Podkreślmy, że są to zmienne lokalne metody Button1Click. To znaczy, że powstają
w momencie wywołania tej metody, a usuwane są z pamięci w momencie jej zakoń-
czenia. Jak wspomniałem, można również tworzyć zmienne globalne, tzn. zmienne,
których życie trwa przez cały okres działania programu. Przykładem takiej zmiennej
jest Form1 zadeklarowane w interfejsie modułu Unit1. Ogólnie rzecz biorąc, należy
jednak ograniczać korzystanie ze zmiennych globalnych, a wszystkie niezbędne dane
przesyłać przez argumenty funkcji i metod. Żeby dać Czytelnikowi dobry przykład,
w tym rozdziale i w całej książce w ogóle nie będziemy używać zmiennych globalnych.
Inicjacja i przypisanie wartości zmiennej
Zmienne zadeklarowane w listingu 3.1 i 3.2 nie są automatycznie inicjowane! To oznacza,
że rezerwowana jest pamięć, w której przechowywana będzie zmienna, ale jej zawartość
nie jest czyszczona. W konsekwencji wartość tak zadeklarowanej zmiennej jest przy-
padkowa. Każda deklarowana zmienna powinna być inicjowana, tj. powinniśmy przypi-
sać jej wartość w momencie utworzenia (takie sformułowanie dotyczy zmiennych lokal-
nych, do których ograniczamy się w tej książce). Należy to zrobić w następujący sposób:
double a=1;
Zmienna, która została zainicjowana, może oczywiście zmieniać wartość w trakcie
działania programu. W takiej sytuacji mówimy o operacji przypisania, np.
double a=1;
a=2;
W przypadku typów prostych, jak int, obie te czynności można utożsamiać. Różnice
pojawiają się w przypadku klas, ale to temat wykraczający poza zakres tej książki3.
Dygresja na temat typów rzeczywistych
w C++Builderze
C++Builder nie ma zbyt wielu typów rzeczywistych, ale są one w zupełności wystar-
czające. Wszystkie (raptem trzy) wymienione zostały w tabeli 3.1.
Tabela 3.1. Typy rzeczywiste w C++Builder 2006
Nazwa typu
Float
Double
long double
Zakres (najmniejsza i największa
absolutna wartość liczby)
Liczba bajtów (bitów)
4
zajmowana przez zmienną
Postać literału
1,5 · 10–45 .. 3,4 · 1038
5,0 · 10–324 .. 1,7 · 10308
3,4 · 10–4932 .. 1,1 · 104932
4 (32)
8 (64)
10 (80)
1.0F
1.0
1.0L
3
Omówienie różnic między inicjacją i przypisaniem w przypadku klas znajdzie Czytelnik w książce
Stephena C. Dewhursta C++. Kanony wiedzy programistycznej, Helion 2005
4
Liczbę bajtów zajmowaną przez typ można sprawdzić następującą instrukcją:
ShowMessage(IntToStr(sizeof(typ)));.
50
Część I ¨ Zintegrowane środowisko programistyczne i język programowania C++
Konwersja łańcucha na liczbę
Pole edycyjne TEdit pozwala użytkownikowi na wpisanie łańcucha. Łańcuch ten
może być następnie wykorzystany przez program, który może odczytać go z własno-
ści Text typu AnsiString. AnsiString jest najbardziej „typowym typem” łańcuchów
w C++Builderze i stosunkowo rzadko zachodzi potrzeba, żeby korzystać z łańcucha
typowego dla C i C++, a więc tablicy znaków, tj. tablicy zmiennych typu char, który
jest znacznie mniej wygodny w użyciu. Łańcuchy AnsiString są w C++Builderze
identyfikowane za pomocą cudzysłowu, np. Helion . Nie ma w łańcuchach problemu
z polskimi znakami, można ich swobodnie używać.
Zakładamy (zapewne naiwnie), że użytkownik domyśli się, iż w pola edycyjne należy
wpisać współczynniki równania kwadratowego, a więc liczby rzeczywiste. Wówczas
będziemy mogli skonwertować łańcuchy z własności Text każdego pola edycyjnego
na liczby rzeczywiste i zapisać je do zmiennych a, b i c. Na szczęście nie ma żadnego
problemu z konwertowaniem łańcuchów na liczby (rzeczywiste lub naturalne). W przy-
padku liczb rzeczywistych należy do tego użyć funkcji StrToFloat. Listing 3.3 zawiera
przykład konwersji łańcucha z pierwszego pola edycyjnego do zmiennej a.
Listing 3.3. Konwersja łańcucha na liczbę
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double a,b,c,Delta;
a=StrToFloat(Edit1- Text);
}
Podobnie zróbmy z pozostałymi współczynnikami (listing 3.4). Zrezygnujemy przy tym
z deklaracji ich we wspólnej linii na rzecz czytelności kodu:
Listing 3.4. Konwersja wszystkich danych wejściowych
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double a=StrToFloat(Edit1- Text);
double b=StrToFloat(Edit2- Text);
double c=StrToFloat(Edit3- Text);
double Delta;
}
Do konwersji łańcucha na liczbę naturalną służy funkcja StrToInt.
Z konwersją łańcuchów do liczb rzeczywistych wiążą się problemy. Jednym z pod-
stawowych jest sposób rozdzielania części całkowitej od dziesiętnej, a więc tzw. „prze-
cinek”. W Polsce jako przecinka zgodnie ze standardami powinno używać się… prze-
cinka. Wiem, to trochę masło maślane. Ale mniej maślane okazuje się w krajach
anglosaskich, w których jako przecinka używa się kropki. Funkcja StrToFloat auto-
Rozdział 3. ¨ Typy zmiennych i instrukcje sterujące
51
matycznie wykrywa ustawienia systemowe i odpowiednio do nich interpretuje wsta-
wione znaki, w tym kropkę lub przecinek. Programista może też wymusić, jaki znak ma
być podczas konwersji interpretowany jako „przecinek”5.
Jeżeli konwersja nie powiedzie się, to znaczy gdy użytkownik do pola edycyjnego
wpisze tekst, który mimo najszczerszych chęci nie może być zinterpretowany przez
funkcję StrToFloat jako liczba, to zgłosi ona wyjątek informujący o błędzie. To da nam
możliwość zareagowania na błąd bez zawieszania aplikacji, ale tym zajmiemy się póź-
niej. Na razie załóżmy, że użytkownik naszej aplikacji będzie posłuszny i rzeczywiście
w polach edycyjnych umieści liczby.
Obliczenia arytmetyczne i ich kolejność
Jeżeli konwersja powiedzie się, otrzymamy trzy współczynniki równania, które sta-
nowią dane wejściowe naszego algorytmu. Możemy zatem zabrać się za obliczenie
delty według wzoru
. Do tego konieczne będzie mnożenie i odejmowanie
b
współczynników od siebie.
=D
2 -
4
ac
Do podstawowych operacji arytmetycznych, czyli do dodawania, odejmowania, mno-
żenia i dzielenia, służą operatory: +, –, * i / (zob. tabela 3.2), które pozwalają kolejno
na dodawanie, odejmowanie, mnożenie i dzielenie liczb. Typ liczby zwracanej przez
te operatory zależy od typów jego argumentów. Zatem dodając dwie liczby int, otrzy-
mamy wynik typu int. To naturalne także dla operatora odejmowania i mnożenia. Kło-
poty sprawia jednak operator dzielenia. Bo przecież iloraz dwóch liczb całkowitych
nie musi być liczbą całkowitą. Wręcz przeciwnie — częściej nią nie jest. A jednak
operator / również przestrzega zasady, według której typ wyniku zależy od typu ar-
gumentów. W związku z tym 1/2 ma wartość 0 (zaokrąglenie wyniku następuje zaw-
sze w kierunku zera), ale 1/(double)2 lub 1/2.0 równy jest 0.5. Należy na to zwracać
uwagę, bo to jedno z częstszych źródeł błędów logicznych w programach.
Tabela 3.2. Operatory arytmetyczne w C++
Operator Opis
Przykłady
Priorytet
*
/
+
–
mnożenie (jeżeli argumenty są rzeczywiste, to
zwracany przez operator typ też jest rzeczywisty)
dzielenie (jeżeli argumenty są całkowite, to zwracany przez
operator typ też jest zaokrąglony do liczby całkowitej)
reszta z dzielenia całkowitego (nie może być użyta
z liczbami rzeczywistymi)
dodawanie (zwracany typ zależy od typu argumentów)
odejmowanie (operator dwuargumentowy) i zmiana
znaku (operator jednoargumentowy)
2*2 daje 4, 2.0*2.0
daje 4.0
2.0/4.0 daje 0.5,
2/4 daje 0
2 4 daje 2, 4 2
daje 0
2+4 daje 6, 2.0+4.0
daje 6.0
2–4 daje –2, –2
daje… –2
4
4
4
5
5
5
Opis tego zagadnienia znajduje się w książce J. Matulewskiego C++Builder 2006. 222 gotowe rozwiązania,
Helion 2006.
52
Część I ¨ Zintegrowane środowisko programistyczne i język programowania C++
Jeżeli w operatorach / i drugi argument będzie miał wartość 0, to podczas wy-
konywania jednej z tych operacji zgłoszony zostanie wyjątek EDivBEDero.
Aby obliczyć deltę, wystarczy odjąć od siebie dwa iloczyny, co w C++ należy zapisać
jako: b*b–4*a*c. Przyjrzyjmy się temu wyrażeniu. Wiemy dobrze, że oznacza ono
różnicę dwóch iloczynów, a więc (b*b)–(4*a*c). Kolejność działań wyznaczona jest
przez priorytet każdej operacji arytmetycznej. Wszyscy zostaliśmy nauczeni jeszcze
w szkole podstawowej, że mnożenie i dzielenie ma pierwszeństwo przed dodawaniem
i odejmowaniem. Ale czy wie o tym kompilator C++Buildera? Na szczęście tak. Prio-
rytety operatorów arytmetycznych w C++ (ostatnia kolumna w tabeli 3.2) całkowicie
zgadzają się z tymi, jakie obowiązują w algebrze.
Możemy zatem bez obaw dopisać do metody Button1Click wyrażenie obliczające war-
tość pola Delta zgodnie ze wzorem z poniższego listingu:
Listing 3.5. Obliczanie wyróżnika równania kwadratowego
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double a=StrToFloat(Edit1– Text);
double b=StrToFloat(Edit2- Text);
double c=StrToFloat(Edit3- Text);
double Delta=b*b–4*a*c;
}
Operatory upraszające zapis operacji
arytmetycznych wykonywanych na zmiennej
Mówiąc o operatorach arytmetycznych, warto wspomnieć o charakterystycznych dla C++
operatorach przypisania, które zastępują operatory arytmetyczne w szczególnych, ale
często spotykanych sytuacjach.
Załóżmy, że w naszym programie jest zmienna n, której wartość chcemy zwiększyć
o dwa. Możemy napisać instrukcję
n=n+2;
Odczytuje ona bieżącą wartość zmiennej n, dodaje do niej 2 i zapisuje nową wartość
z powrotem do tej samej zmiennej. Instrukcja z operatorem = wykonywana jest bo-
wiem od prawej do lewej, a więc najpierw obliczana jest wartość wyrażenia stojącego
po prawej stronie tego operatora, a dopiero potem następuje przypisanie.
C++ oferuje jednak operator, który upraszcza powyższą instrukcję:
n+=2;
Ze względu na wynik jest to instrukcja zupełnie równoważna poprzedniej, ale tym razem
następuje tylko jedno odwołanie do zmiennej n, a poza tym zamiast dwóch operacji (+ i =)
wykonywana jest tylko jedna. Poza wspomnianym wyżej operatorem += mamy do dys-
pozycji także analogiczne operatory *=, /=, = i –=. Ich priorytet równy jest 15.
Rozdział 3. ¨ Typy zmiennych i instrukcje sterujące
53
Jeżeli chcielibyśmy zwiększyć wartość zmiennej tylko o jeden — taka sytuacja ma
często miejsce w przypadku indeksów pętli — moglibyśmy użyć jeszcze innego ope-
ratora, a mianowicie ++. Jest to operator inkrementacji i może być umieszczony zarówno
przed, jak i za zmienną. I ma to zasadnicze znaczenie w przypadku, gdy występuje on
wspólnie z operatorem przypisania.
//przEpadek a)
int a1=2;
int a2=++a1;
ShowMessage(a2);
//przEpadek b)
int b1=2;
int b2=b1++;
ShowMessage(b2);
Jeżeli operator inkrementacji umieszczony zostanie przed zmienną, jak w przypadku a),
to wartość zmiennej a1 zostanie najpierw zwiększona o jeden, a dopiero wtedy jej
wartość zostanie użyta do zainicjowania zmiennej a2. W przypadku b) kolejność ope-
racji jest odwrotna. Wpierw wartość zmiennej b1 zostanie przypisana do b2, a dopiero
wówczas wartość b1 zostanie zwiększona.
Typ logiczny i operatory logiczne
Poza operatorami arytmetycznymi zdefiniowane są jeszcze operatory logiczne, ope-
ratory porównania, operatory związane ze wskaźnikami (omówimy je w następnym
rozdziale), operatory działające na bitach liczb (te omówimy w rozdziale 10.), opera-
tory dotyczące zbiorów oraz np. operator pozwalający na łączenie łańcuchów. Ope-
ratory porównania to ==, != (różne), , , = i =. Myślę, że ich działania nie trzeba
omawiać, bo działają w sposób jak najbardziej intuicyjny. Natomiast operatory lo-
giczne to !, i ||. Wszystkie dotyczą zmiennej typu bool, która może przyjmować
wartość true lub false. Działanie operatorów logicznych omówione zostało w tabeli 3.3.
Zasadniczym zastosowaniem tych operatorów będzie konstruowanie warunków in-
strukcji warunkowej, którą zaraz poznamy, i warunków przerywania pętli, którymi zaj-
miemy się trochę później.
Tabela 3.3. Operatory logiczne (t = true, f = false)
Operator Opis
Przykłady
Priorytet
!
||
negacja
koniukcja
alternatywa
!t = f, !f daje t
t t = t, t f = f, f f = f
t || t = t, t || f = t, f || f = f
2
12
13
Instrukcja warunkowa if
Wróćmy do naszego równania kwadratowego. Na razie mamy obliczoną wartość delty.
Sprawdźmy, czy nie jest ona mniejsza od zera. Jak pamiętamy, równanie nie ma wów-
czas rozwiązań. Do tego typu zadań służy instrukcja warunkowa if (ang. jeżeli):
if (warunek) polecenie;
54
Część I ¨ Zintegrowane środowisko programistyczne i język programowania C++
Polecenie zostanie wykonane jedynie wtedy, gdy warunek zostanie spełniony, a więc
jeżeli wyrażenie pełniące rolę warunku ma wartość true. Jeżeli od warunku chcemy
uzależnić wykonanie większej ilości poleceń, to musimy je umieścić w bloku otoczonym
nawiasami klamrowymi { i }:
if (warunek)
{
polecenia
}
Szkielet instrukcji warunkowej w takiej postaci widoczny jest na listingu 3.6. Dopiszmy
go do edytowanej przez nas metody.
Listing 3.6. Jeżeli delta jest mniejsza od zera, to…
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double a=StrToFloat(Edit1- Text);
double b=StrToFloat(Edit2- Text);
double c=StrToFloat(Edit3- Text);
double Delta=b*b-4*a*c;
if (Delta 0)
{
}
}
Co zrobimy, jeżeli Delta jest mniejsza od zera? Oczywiście poinformujemy użytkow-
nika, że nie ma co liczyć na rozwiązania. Równanie, którego współczynniki podał, nie
ma rozwiązań wśród liczb rzeczywistych. Informację o braku rozwiązań najprościej
będzie umieścić w przeznaczonym do tego czwartym polu edycyjnym (komponent
Edit4). Do jego własności Text przypiszmy łańcuch z odpowiednim komunikatem (li-
sting 3.7).
Listing 3.7. Własność Text pól edycyjnych służy nie tylko do odczytania zawartości pola, ale również
do jego zmiany
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double a=StrToFloat(Edit1- Text);
double b=StrToFloat(Edit2- Text);
double c=StrToFloat(Edit3- Text);
double Delta=b*b-4*a*c;
if (Delta 0)
{
Edit4- Text= Brak rozwiązań (delta mniejsza od zera) ;
}
}
W przypadku, gdy w razie spełnienia warunku wykonywane jest tylko jedno polecenie,
klamry { i } nie są oczywiście konieczne, ale nawet wówczas warto je umieścić w kodzie,
bo podnoszą jego czytelność, nie zmieniając jego sensu i nie wpływając na wielkość
skompilowanego pliku .exe. Poza tym unikniemy w ten sposób błędu, jeżeli wbrew
wcześniejszym intencjom zdecydujemy się jednak dopisać jakieś nowe polecenia.
Rozdział 3. ¨ Typy zmiennych i instrukcje sterujące
55
Proszę zwrócić uwagę, że w C++ operator porównania dwóch zmiennych to ==, a nie =.
Zatem w warunku instrukcji if może znaleźć się ==, ale raczej nie powinno =.
Jak wyłączyć podpowiadanie szablonów instrukcji
w edytorze?
Po napisaniu instrukcji if i wstawieniu spacji edytor dopisze za nas część kodu i wy-
znaczy miejsca, gdzie możemy wstawić warunek i instrukcję. Mnie to doprowadza do
szewskiej pasji, bo nie mogę spokojnie pisać dalej kodu, który mam w głowie. Wydaje
mi się, że dla Czytelnika, który uczy się C++, takie wyręczenie pamięci na tym etapie
też nie jest dobre. Proponuję zatem to cudo wyłączyć. W tym celu z menu Tools wy-
bieramy pozycję Options…. W oknie Options (rysunek 3.2) przechodzimy na zakładkę
Editor Options/Code Insight i usuwamy zaznaczenie przy opcji Code Template Comple-
tion. Następnie naciskam
Pobierz darmowy fragment (pdf)