Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00397 007895 10477465 na godz. na dobę w sumie
Turbo Pascal i Borland C++. Przykłady - książka
Turbo Pascal i Borland C++. Przykłady - książka
Autor: Liczba stron: 240
Wydawca: Helion Język publikacji: polski
ISBN: 83-7197-873-1 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> turbo pascal - programowanie
Porównaj ceny (książka, ebook, audiobook).
Książka ta adresowana jest do czytelników, którzy rozpoczęli lub właśnie rozpoczynają swoją przygodę z programowaniem. Zawiera ona szereg przykładowych programów napisanych zgodnie z zasadami dobrego stylu programowania. Wszystkie stworzone zostały w dwóch wersjach: w Turbo Pascalu i C++. Dlatego książka ta jest szczególnie polecana osobom, które już potrafią programować w Pascalu i chcą zapoznać się z językiem C++.

W książce omówiono:

Wymagania stawiane czytelnikowi są niewielkie -- wystarczy podstawowa umiejętność programowania, najlepiej w Pascalu.

Do książki dołączona jest dyskietka z przykładami.

Znajdź podobne książki Ostatnio czytane w tej kategorii

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 Turbo Pascal i Borland C++Builder. Przyk³ady Autor: Kazimierz Jakubczyk ISBN: 83-7197-873-1 Format: B5, stron: 234 Zawiera dyskietkê Ksi¹¿ka ta adresowana jest do czytelników, którzy rozpoczêli lub w³aġnie rozpoczynaj¹ swoj¹ przygodê z programowaniem. Zawiera ona szereg przyk³adowych programów napisanych zgodnie z zasadami dobrego stylu programowania. Wszystkie stworzone zosta³y w dwóch wersjach: w Turbo Pascalu i C++. Dlatego ksi¹¿ka ta jest szczególnie polecana osobom, które ju¿ potrafi¹ programowaæ w Pascalu i chc¹ zapoznaæ siê z jêzykiem C++. W ksi¹¿ce omówiono: • Proste operacje na liczbach • Dzia³ania na datach • Tworzenie grafiki z wykorzystaniem BGI • Animacje • Tworzenie list jednokierunkowych • Programowanie zorientowane obiektowo Wymagania stawiane czytelnikowi s¹ niewielkie — wystarczy podstawowa umiejêtnoġæ programowania, najlepiej w Pascalu. Do ksi¹¿ki do³¹czona jest dyskietka z przyk³adami. Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl Spis treści Wstęp ...................................................z............................................ 7 Rozdział 1. Operacje na liczbach...................................................z..................... 11 Ile cyfr ma liczba? ...................................................a...................................................a.......11 Program LCyf w Pascalu ...................................................a.........................................11 Pętle w Pascalu ...................................................a...................................................a.....12 Pętle w C i C++...................................................a...................................................a.....13 Program LCyf w C++ ...................................................a..............................................13 Uruchamianie programu w środowisku programowania............................................14 Odwrócenie kolejności bitów liczby ...................................................a..............................15 Program Bity w Pascalu...................................................a...........................................15 Program Bity w C++...................................................a................................................16 Wyrażenia przypisujące w C i C++ ...................................................a.........................16 Zapis liczby w notacji rzymskiej...................................................a....................................17 Program LRzym w Pascalu...................................................a......................................18 Program LRzym w C++...................................................a...........................................19 Wskaźniki a łańcuchy w C i C++ ...................................................a............................20 Współczynniki Newtona i trójkąt Pascala...................................................a......................20 Algorytm iteracyjny ...................................................a.................................................21 Algorytm rekurencyjny...................................................a............................................22 Program TPascala w Pascalu ...................................................a...................................22 Program TPascala w C++ ...................................................a........................................24 Tablicowanie funkcji Bessela...................................................a.........................................24 Algorytm obliczania sumy szeregu liczbowego ...................................................a......25 Program FBessela w Pascalu ...................................................a...................................26 Program FBessela w C++ ...................................................a........................................27 Formatowanie wydruku w funkcji printf ...................................................a.................28 Ćwiczenia ...................................................a...................................................a....................29 Rozdział 2. Zadania z kalendarzem ...................................................z................. 31 Dzień tygodnia i numer dnia w roku...................................................a..............................31 Algorytmy kalendarzowe...................................................a.........................................32 Moduł obliczeniowy Kal w Pascalu ...................................................a........................33 Program Dzien w Pascalu ...................................................a........................................34 Moduł obliczeniowy Kal w C++ ...................................................a.............................35 Program Dzien w C++ ...................................................a.............................................37 Kalendarz miesięczny ...................................................a...................................................a.38 Moduł Klaw czytania znaku w Pascalu ...................................................a...................38 Moduł Klaw czytania znaku w C++ ...................................................a........................39 4 Turbo Pascal i Borland C++. Przykłady Program KMies w Pascalu...................................................a.......................................40 Program KMies w C++...................................................a............................................42 Kolorowanie kalendarza...................................................a.................................................44 Algorytm Gaussa wyznaczania daty Wielkanocy...................................................a....45 Program KMies2 w Pascalu...................................................a.....................................46 Program KMies2 w C++...................................................a..........................................48 Ćwiczenia ...................................................a...................................................a....................51 Rozdział 3. Grafika ...................................................z......................................... 53 Gra w chaos...................................................a...................................................a.................53 Algorytm gry w chaos...................................................a..............................................54 Program Chaos w Pascalu...................................................a........................................54 Program Chaos w C++...................................................a.............................................56 Wielokąt foremny i gwiazdka ...................................................a........................................57 Wyznaczanie wierzchołków wielokąta foremnego ...................................................a.57 Rysowanie wielokąta foremnego w Pascalu...................................................a............58 Rysowanie wielokąta foremnego w C++...................................................a.................59 Wyznaczanie wierzchołków gwiazdki równoramiennej ............................................59 Program Gwiazdka w Pascalu ...................................................a.................................60 Program Gwiazdka w C++ ...................................................a......................................61 Najmniejszy wielokąt wypukły...................................................a......................................62 Algorytm wyznaczania brzegu najmniejszego wielokąta wypukłego ........................62 Program WielWyp w Pascalu ...................................................a..................................64 Program WielWyp w C++ ...................................................a.......................................66 Wskaźniki a tablice w C i C++ ...................................................a................................68 Wyrażenia warunkowe w C i C++...................................................a...........................68 Częstotliwość występowania liter w pliku ...................................................a.....................69 Program Litery w Pascalu...................................................a........................................69 Program Litery w C++...................................................a.............................................71 Konwersja znaku na łańcuch w C i C++...................................................a..................73 Definiowanie stałych symbolicznych w C++ ...................................................a..........74 Wykres funkcji drgań harmonicznych tłumionych ...................................................a........74 Okno i widok przy tworzeniu wykresu funkcji...................................................a........74 Program Drgania w Pascalu...................................................a.....................................76 Nazwa funkcji parametrem podprogramu w Pascalu .................................................78 Nazwa funkcji a wskaźnik w C i C++ ...................................................a.....................79 Program Drgania w C++...................................................a..........................................80 Ćwiczenia ...................................................a...................................................a....................82 Rozdział 4. Animacja ...................................................z...................................... 85 Piłeczka ...................................................a...................................................a.......................85 Program Pileczka w Pascalu ...................................................a....................................86 Program Pileczka w C++ ...................................................a.........................................87 Wieże Hanoi...................................................a...................................................a................88 Reprezentacja danych w Pascalu ...................................................a.............................89 Wizualizacja krążków na ekranie monitora...................................................a.............89 Nakładanie krążka na szczyt wieży ...................................................a.........................90 Zdejmowanie krążka ze szczytu wieży...................................................a....................91 Algorytm rekurencyjny przenoszenia wież ...................................................a.............91 Program WHanoi w Pascalu ...................................................a....................................92 Program WHanoi w C++ ...................................................a.........................................94 Krzywe Lissajous ...................................................a...................................................a........97 Rysowanie krzywej na ekranie monitora...................................................a.................97 Odwracający tryb rysowania...................................................a....................................98 Spis treści 5 Program Lissa w Pascalu ...................................................a.........................................98 Przekazywanie parametrów przez wartość i referencję w C++ ................................100 Program Lissa w C++ ...................................................a............................................101 Układ planetarny ...................................................a...................................................a.......102 Model komputerowy układu planetarnego ...................................................a............103 Program Grawit w Pascalu...................................................a.....................................104 Program Grawit w C++...................................................a..........................................107 Hipocykloida ...................................................a...................................................a.............109 Obliczanie współrzędnych punktów ...................................................a......................109 Algorytm animacji oparty na kopiowaniu fragmentów obrazu ................................110 Dynamiczne przydzielanie i zwalnianie pamięci...................................................a...111 Program Hipo w Pascalu...................................................a........................................112 Program Hipo w C++...................................................a.............................................113 Elementy charakterystyczne dla C++ ...................................................a....................114 Ćwiczenia ...................................................a...................................................a..................115 Rozdział 5. Listy jednokierunkowe ...................................................z................ 117 Sito Eratosthenesa ...................................................a...................................................a.....118 Definiowanie listy w Pascalu...................................................a.................................118 Wstawianie elementu na początek listy ...................................................a.................119 Przeglądanie listy i usuwanie elementów ...................................................a..............120 Program SitoEra w Pascalu...................................................a....................................121 Definiowanie i obsługa listy w C++ ...................................................a......................123 Program SitoEra w C++...................................................a.........................................123 Wskaźnik NULL w roli wyrażenia warunkowego ...................................................a125 Rozwinięcie dziesiętne ułamka ...................................................a....................................125 Tablica czy lista?...................................................a...................................................a.125 Generowanie listy cyfr rozwinięcia dziesiętnego ułamka ........................................126 Program Rozwin w Pascalu ...................................................a...................................127 Program Rozwin w C++ ...................................................a........................................128 Rozdanie kart do brydża...................................................a...............................................130 Generowanie talii kart i jej tasowanie...................................................a....................130 Rozdanie kart czterem graczom...................................................a.............................131 Wstawianie elementu do listy uporządkowanej...................................................a.....131 Program Brydz w Pascalu...................................................a......................................133 Program Brydz w C++...................................................a...........................................136 Przekazywanie wskaźnika przez wartość i referencję w C++ ..................................138 Zmienne statyczne w C i C++...................................................a................................138 Skorowidz słów pliku tekstowego...................................................a................................139 Czytanie słowa w Pascalu...................................................a......................................139 Lista słów skorowidza z podlistami numerów wierszy ............................................140 Aktualizacja listy słów skorowidza ...................................................a.......................141 Program Skorow w Pascalu ...................................................a...................................143 Czytanie słowa w C++...................................................a...........................................145 Łańcuchy dynamiczne w C++ ...................................................a...............................146 Program Skorow w C++ ...................................................a........................................146 Ćwiczenia ...................................................a...................................................a..................149 Rozdział 6. Programy obiektowe ...................................................z................... 151 Punkty..............................................a...................................................a.............................152 Pierwszy kontakt z typem obiektowym w Pascalu ...................................................a152 Dostęp do składowych obiektu ...................................................a..............................155 Metody wirtualne, konstruktor i destruktor ...................................................a...........155 Moduł Punkty w Pascalu ...................................................a.......................................156 6 Turbo Pascal i Borland C++. Przykłady Klasa w C++ i jej moduł definiujący ...................................................a.....................158 Moduł Punkty w C++ ...................................................a............................................159 Moduł Ruch przesuwania punktu w Pascalu ...................................................a.........161 Moduł Ruch przesuwania punktu w C++ ...................................................a..............161 Program przesuwania punktu w Pascalu...................................................a................162 Obiekty dynamiczne w Pascalu ...................................................a.............................163 Wywoływanie konstruktorów i destruktorów w C++...............................................164 Program przesuwania punktu w C++...................................................a.....................164 Okręgi...................................................a...................................................a........................165 Moduł Okregi w Pascalu...................................................a........................................165 Program przesuwania okręgu w Pascalu...................................................a................167 Moduł Okregi w C++...................................................a.............................................168 Program przesuwania okręgu w C++...................................................a.....................169 Łamane ...................................................a...................................................a......................170 Moduł Lamane w Pascalu...................................................a......................................170 Program przesuwania prostokąta w Pascalu ...................................................a..........172 Moduł Lamane w C++...................................................a...........................................173 Program przesuwania prostokąta w C++ ...................................................a...............174 Program przesuwania hipocykloidy w Pascalu...................................................a......175 Program przesuwania hipocykloidy w C++...................................................a...........176 Lista figur geometrycznych...................................................a..........................................178 Moduł Figury w Pascalu ...................................................a........................................178 Program Pojazd w Pascalu...................................................a.....................................179 Moduł Figury w C++ ...................................................a.............................................181 Program Pojazd w C++...................................................a..........................................182 Fontanna ...................................................a...................................................a....................183 Koncepcja typu potomnego reprezentującego kroplę wody.....................................184 Program Fontanna w Pascalu...................................................a.................................185 Program Fontanna w C++...................................................a......................................187 Osoby ...................................................a...................................................a........................189 Moduł Osoby w Pascalu ...................................................a........................................189 Program tworzący przykładową listę pracowników w Pascalu................................191 Moduł Osoby w C++ ...................................................a.............................................194 Program tworzący przykładową listę pracowników w C++ .....................................196 Edycja wiersza tekstu ...................................................a...................................................a197 Tworzenie typu obiektowego edycji łańcucha w Pascalu.........................................198 Przesyłanie danych do edycji i udostępnianie wyniku edycji...................................199 Programowanie operacji edycyjnych...................................................a.....................200 Moduł Edycja w Pascalu...................................................a........................................201 Funkcje edycji łańcucha i listy łańcuchów ...................................................a............205 Moduł Edycja w C++...................................................a.............................................206 Program Plik edycji danych osobowych w Pascalu..................................................211 Program Plik edycji danych osobowych w C++...................................................a....215 Ćwiczenia ...................................................a...................................................a..................219 Literatura ...................................................z................................... 221 Skorowidz...................................................z................................... 223 Rozdział 3. Grafika Jednym ze sposobów tworzenia grafiki na ekranie monitora komputerowego jest skła- danie obrazu z podstawowych elementów graficznych, takich jak punkty, odcinki pro- ste, wielokąty i okręgi, oraz wypełnianie obszarów zadanym kolorem lub wzorcem. Wszystkie programy zawarte w tym rozdziale działają na tej zasadzie, korzystają z bi- blioteki BGI (ang. Borland Graphics Interface — interfejs graficzny firmy Borland) i pracują w 16-kolorowym trybie graficznym VGA o rozdzielczości ekranu 640×480 pikseli. Dotyczą one następujących zagadnień:  rysowanie trójkąta Sierpińskiego (gra w chaos),  kreślenie wielokąta foremnego i gwiazdki,  wyznaczanie najmniejszego wielokąta wypukłego zawieprającego dany zbiór punktów,  zliczanie liter w pliku tekstowym i zobrazowanie wypniku w formie wykresu słupkowego,  tworzenie wykresu funkcji drgań harmonicznych tłumiponych. Gra w chaos Niekiedy bardzo proste algorytmy prowadzą do zaskakujących wyników. Jednym z nich jest zaprezentowany poniżej algorytm generowania obrazu, zwany grą w chaos1. Rysunek utworzony na ekranie monitora zaskakuje szczególnie, ponieważ całe postę- powanie jest oparte na losowości, czyli niemożności przewidywania, chaosie. 1 Właściwie jest to jedna z gier polegających na losjowym wyborze jednej z kilku prostych reguł postępowania. Przykład zaczerpnięto z książki [8]. 54 Turbo Pascal i Borland C++. Przykłady Algorytm gry w chaos Algorytm gry w chaos jest rzeczywiście bardzo prosty. Na początku wybieramy na ekranie trzy punkty P0, P1 i P2 tak, by stanowiły wierzchołki trójkąta, np. równobocz- nego, oraz dowolny punkt Q0. Jest to tzw. punkt wiodący. Następnie losujemy jeden z wierzchołków trójkąta i w środku odcinka łączącego ten wierzchołek z punktem Q0 zaznaczamy nowy punkt wiodący Q1. Ponownie losujemy wierzchołek trójkąta i w środ- ku odcinka o końcach w wylosowanym wierzchołku i punkcie Q1 zaznaczamy kolejny punkt wiodący Q2. Losowanie wierzchołka i zaznaczanie następnego punktu wiodą- cego dokładnie w połowie odcinka łączącego wylosowany wierzchołek z poprzednim punktem wiodącym powtarzamy wiele razy. Na rysunku 3.1 pokazano pięć pierwszych kroków, w których kolejnymi wylosowanymi wierzchołkpami były P1, P2, P1, P2, P0. Rysunek 3.1. Pięć pierwszych kroków gry w chaos Jaki będzie rezultat wykonania dużej liczby powtórzeń wyznaczania następnego punk- tu wiodącego i rysowania go na ekranie? Wydaje się oczywiste, że jeśli punkt wiodą- cy Q0 został wybrany na zewnątrz trójkąta P0P1P2, to po niewielkiej liczbie kroków kolejny wyznaczony punkt wiodący dostanie się do wnętrza tego trójkąta. Ponadto gdy jakiś punkt wiodący znajdzie się we wnętrzu trójkąta, każdy następny tam pozo- stanie. Można więc przypuszczać, że po dużej liczbie itperacji punkty wiodące zapełnią losowo wnętrze trójkąta. Aby się przekonać, czy rzeczywiście tak będzie, wystarczy napisać i uruchomić prosty program. Symulacja zdarzeń losowych na komputerze wymaga odpowiedniego podprogramu generującego liczby losowe. Należy jednak sobie uświadomić, że generator taki działa według ściśle określonego algorytmu, a dostarczone przez niego liczby jedynie spra- wiają wrażenie losowości. Bardziej stosowne jest więc nazywanie ich liczbami pseu- dolosowymi. Program Chaos w Pascalu W Turbo Pascalu liczby losowe generuje funkcja 4CPFQO, którą można wywoływać bez parametru lub z jednym parametrem reprezentującym wartość całkowitą dodatnią. Wartością wywołania funkcji w pierwszym przypadku jest losowa liczba rzeczywista z przedziału [0, 1), zaś w drugim losowaniu — nieujemna liczba całkowita mniejsza od zadanego parametru, np. wartością wywołania 4CPFQO  jest liczba całkowita od 0 do 48. Iteracyjne użycie funkcji 4CPFQO daje ciąg liczb o rozkładzie jednostajnym. Rozdział 3. ♦ Grafika 55 Zazwyczaj przed wykorzystaniem generatora inicjuje się go za pomocą bezparame- trowej procedury 4CPFQOKG. Generator niezainicjowany tworzy taki sam ciąg liczb za każdym uruchomieniem programu, co można wykorzystać podczas testowania pro- gramu. Pełny kod źródłowy programu w Turbo Pascalu realizującego grę w chaos jest przedstawiony na wydruku 3.1. Wydruk 3.1. Program Chaos.pas realizujący grę w chaos RTQITCO)TCAYAEJCQU WUGU TV)TCRJ EQPUV -CTVCKPVGIGT8)# 4QFKPVGIGT8)#*K ZCTTC[=?QHKPVGIGT   [CTTC[=?QHKPVGIGT   XCT CDYKPVGIGT MNQPIKPV DGIKP 4CPFQOKG +PKV)TCRJ -CTVC4QF  62 $)+  C4CPFQO   D4CPFQO   HQTMVQFQ DGIKP Y4CPFQO   C C Z=Y? FKX D D [=Y? FKX KHM VJGP2WV2KZGN CD [CP  GPF 4GCF-G[  NQUG)TCRJ GPF Tablice inicjalizowane x i y zawierają współrzędne ekranowe wierzchołków trójkąta, zmienne a i b — współrzędne bieżącego punktu wiodącego, w — indeks wylosowa- nego wierzchołka, a k — numer kolejny iteracji. Program (bez wejścia) inicjuje gene- rator liczb losowych, przełącza kartę graficzną w tryb graficzny 8)# o rozdzielczości 8)#*K (640×480 pikseli)2, rysuje 50 000 punktów wiodących w kolorze [CP (turku- sowy) za pomocą procedury 2WV2KZGN, a po wybraniu przez użytkownika dowolnego znaku na klawiaturze przełącza kartę graficzną w tryb tekstowy i kończy działanie. Faktycznie program wykonuje iterację ponad 50 000 razy. Dodatkowe 11 początko- wych kroków, w których punkt wiodący nie jest rysowany, ma na celu pominięcie punktów nienależących do wnętrza trójkąta. 2 Ścieżka dostępu podana w wywołaniu procedury +PKV)TCRJ, określająca miejsce sterownika karty graficznej (plik egavga.bgi), może być inna w przypadku innego komputera. 56 Turbo Pascal i Borland C++. Przykłady Wynik utworzony przez program na ekranie monitora jest pokazany na rysunku 3.2. Uświadamia on, jak zawodna może być intuicja. Wygenerowany obraz przedstawia tzw. trójkąt Sierpińskiego. Jest on zbiorem punktów wyjątkowo uporządkowanym, niemającym — wydawałoby się — nic wspólnego z chaosepm i losowością. Rysunek 3.2. Trójkąt Sierpińskiego po 50 000 krokach gry w chaos Program Chaos w C++ W środowisku Borland C++ jest również dostępny generator liczb losowych. Reali- zują go, podobnie jak w Pascalu, funkcje TCPFQO i TCPFQOKG, z tym że pierwsza ist- nieje tylko w wersji dla liczb całkowitych. Ich prototypy znajdują się w pliku stdlib.h. Pełny program źródłowy w Borland C++, tworzący trójkąt Sierpińskiego metodą gry w chaos, jest przedstawiony na wydruku 3.2. Wydruk 3.2. Program Chaos.cpp realizujący grę w chaos KPENWFGITCRJKEUJ KPENWFGUVFNKDJ KPENWFGEQPKQJ KPV-CTVC8)#4QF8)#*+ Z=?]_[=?]_ XQKFOCKP ] KPVCDY NQPIM TCPFQOKG  KPKVITCRJ -CTVC4QF  $ $)+  CTCPFQO   DTCPFQO   HQT MMM ] C C Z=YTCPFQO  ?  D D [=Y?  Rozdział 3. ♦ Grafika 57 KH M  RWVRKZGN CD ;#0  _ IGVEJ  ENQUGITCRJ  _ Podwójne znaki (Backslash) w tekście określającym ścieżkę dostępu do sterownikap karty graficznej w wywołaniu funkcji KPKVITCRJ wynikają z faktu, iż jest znakiem specjalnym. Każda sekwencja reprezentuje w C i C++ pojedynczy znak . Wielokąt foremny i gwiazdka Zadanie rysowania łamanej, a w szczególności wielokąta, pojawia się w wielu prak- tycznych zagadnieniach grafiki komputerowej. Na przykład proces rysowania krzy- wej, nawet bardzo złożonej, sprowadza się do narysowania łamanej o odpowiednio dużej liczbie wierzchołków leżących na tej krzywej. Technika rysowania łamanej o wierzchołkach polega na przeniesieniu pisaka (pióra) do wierzchołka początkowego P0, a następnie wykonaniu pętli rysującej kolejne odcinki dla . Tak samo postępuje się w przypadku wielokąta, który jest łamaną za- ,...,2,1= k mkniętą: PP k n P =0 PP , 1 0 k 1− P n . ,..., P n Podstawowymi narzędziami do kreślenia są:  procedura ustawienia pisaka w dowolnym punkcie ekrapnu,  procedura kreślenia odcinka od aktualnej pozycji pipsaka do jego nowej pozycji. Wyznaczanie wierzchołków wielokąta foremnego Wierzchołki wielokąta foremnego są równomiernie rozłożone na okręgu (por. rysu- nek 3.3), a ich współrzędne spełniają równania parametpryczne: x ⋅= r cos ϕ + , p y ⋅= r sin ϕ + , q 0 ≤ ϕ ≤ 2 π Rysunek 3.3. Wielokąt foremny wpisany w okrąg 58 Turbo Pascal i Borland C++. Przykłady gdzie r jest promieniem, a p i q współrzędnymi środka S tego okręgu. Niech α oznacza kąt między promieniami łączącymi punkt S z dowolnymi dwoma są- siednimi wierzchołkami: α = 2 π n Jeżeli promień okręgu łączący punkty S i P0 jest równoległy do osi y, to współrzędne wierzchołków można wyznaczyć, podstawiając do po- wyższych równań parametrycznych w miejsce parametru pϕ wartości: ,...,1,0= dla P = , y ( x k ) k k k n ϕ k ⋅= k α czyli korzystając ze wzorów: x k ⋅= r cos ϕ , p + k y k ⋅= r sin ϕ + q k Rysowanie wielokąta foremnego w Pascalu W Turbo Pascalu procedura /QXG6Q ustawia pisak w określonym punkcie ekranu, zaś .KPG6Q rysuje odcinek od bieżącej pozycji pisaka do jego nowej pozycji. Ich parame- trami są liczby całkowite określające współrzędne ekranowe punktu, do którego pisak ma być przesunięty. Zatem proces rysowania wielokąta foremnego można w tym ję- zyku zaprogramować następująco: RTQEGFWTG9KGNQMCV PRSKPVGIGTTTGCN  XCT MKPVGIGT CNHCTGCN DGIKP CNHC 2KP /QXG6Q 4QWPF T RS  HQTMVQPFQ .KPG6Q 4QWPF T EQU M CNHC RS4QWPF T UKP M CNHC  GPF Zmiana znaku (minus zamiast plus) w wyrażeniu występującym w roli drugiego para- metru w wywołaniu procedury .KPG6Q wynika z dziwnego założenia przyjętego przez projektantów komputera i twórców środowiska programowania, iż początek układu współrzędnych znajduje się w lewym górnym rogu ekranu, a oś y jest skierowana w dół3. Funkcja 4QWPF została wykorzystana w celu zaokrąglenia wartości rzeczywistej do najbliższej wartości całkowitej, użycie typu rzeczywistego spowodowałoby błąd (type mismatch — niezgodność typu). Równie dobrze można tu wykorzystać funkcję 6TWPE, która obcina wartość rzeczywistą do części całkowitpej. 3 W tym przypadku zmiana znaku nie ma znaczenia z uwdagi na symetrię wielokąta względem prostej równoległej do osi x i przechodzącej przez jego środek S. Rozdział 3. ♦ Grafika 59 Rysowanie wielokąta foremnego w C++ Języki C i C++ nie są tak rygorystyczne. Zawierają szereg mechanizmów automa- tycznego przekształcania (konwersji) typów, które są wykorzystywane, gdy jest to konieczne i ma sens. Ogólnie mówiąc, są one bardzo użyteczne i dają wyniki zgodnie z oczekiwaniami. Jednym z takich przekształceń jest zamiana wartości rzeczywistej na całkowitą, odpowiadająca pascalowskiej funkcji 6TWPE. Powyższą procedurę moż- na więc w Borland C++ zapisać nieco prościej: XQKFYKGNQMCV KPVPKPVRKPVSFQWDNGT ] KPVM FQWDNGCNHC /A2+P OQXGVQ T RS  HQT MMPM NKPGVQ T EQU M CNHC RST UKP M CNHC  _ Oczywiście użycie symbolu /A2+ (wartość π) w wyrażeniu inicjalizującym zmienną alfa oraz funkcji trygonometrycznych sin i cos wymaga włączenia pliku nagłówko- wego math.h. Wyznaczanie wierzchołków gwiazdki równoramiennej Nietrudno teraz przejść do narysowania gwiazdki równoramiennej. Jej 2n wierzchoł- ków leży przemiennie na dwóch koncentrycznych okręgpach (por. rysunek 3.4). Rysunek 3.4. Gwiazdka równoramienna i dwa okręgi ,.... = , 1 ,..., 2 n Q P n P 0 PP 1 0 , QQ będą wierzchołkami gwiazdki leżącymi, podobnie jakp w przy- Niech padku wielokąta foremnego, na okręgu o promieniu r i środku , niech rów- nież promień okręgu łączący punkty S i P0 będzie równoległy do osi y. Natomiast niech będą wierzchołkami gwiazdki leżącymi na drugim okręgu o pro- mieniu r1 i środku S. Współrzędne punktów można także wyznaczyć z równań parametrycznych okręgu. Promienie, których końcami są punkty Q , są obrócone wokół środka S zgodnie z ruchem wskazówek zegara (kieru- nek ujemny) o kąt α/2 względem promieni, których końcami są punkty P . Zatem spełnione są równości ,...,2,1= dla ( vu , Q = qp , ) S = ( n k k k k ) k k 60 Turbo Pascal i Borland C++. Przykłady u k = r 1 cos ψ k , p + v k = r 1 sin ψ + q k w których ψ k ϕ = − k α 2 ϕ = − k π n Narzucający się algorytm rysowania gwiazdki sprowadza się do przeniesienia pisaka do punktu P0 i wykonania pętli, która dla QP i rysuje dwa odcinki w przypadku wielokąta foremnego. zamiast jednego odcinka ,...,2,1= PQ k k PP k 1− k n k k 1− k Program Gwiazdka w Pascalu Opisany wyżej algorytm rysowania gwiazdki jest wykorzystany w programie w Tur- bo Pascalu przedstawionym na wydruku 3.3. Wydruk 3.3. Program Gwiazdka.pas rysowania gwiazdki równoramieinnej RTQITCO4[UQYCPKGAIYKCFMK WUGU TV)TCRJ EQPUV -CTVCKPVGIGT8)# 4QFKPVGIGT8)#*K RTQEGFWTG)YKCFMC PRSKPVGIGTTTTGCN  XCT MKPVGIGT CNHCCNHCHKRUKTGCN DGIKP CNHC2KP CNHC CNHC /QXG6Q 4QWPF T RS  HQTMVQPFQ DGIKP HKM CNHC RUKHKCNHC .KPG6Q 4QWPF T EQU RUK RS4QWPF T UKP RUK  .KPG6Q 4QWPF T EQU HK RS4QWPF T UKP HK  GPF (NQQF(KNN RS)GV QNQT  GPF XCT PKPVGIGT TTGCN DGIKP 9TKVG .KEDCTCOKQP  4GCF.P P  9TKVG 2TQOKGē  4GCF.P T  +PKV)TCRJ -CTVC4QF  62 $)+  Rozdział 3. ♦ Grafika 61 5GV QNQT .KIJV4GF  5GV(KNN5V[NG 5QNKF(KNN;GNNQY  )YKCFMC PTT  4GCF-G[  NQUG)TCRJ GPF Program wczytuje z klawiatury liczbę n ramion gwiazdki i promień r okręgu określa- jącego jej wielkość, przełącza kartę graficzną w tryb graficzny, ustawia kolor rysowa- nia linii (.KIJV4GF — jasnoczerwony) i styl wypełniania obszarów (5QNKF(KNN — pełny, kolor ;GNNQY — żółty). Następnie rysuje pośrodku ekranu gwiazdkę o 2n wierzchoł- kach leżących na przemian na okręgach o promieniach r i r/2, a w końcu zapełnia ją, poczynając od środka. Gdy użytkownik wybierze dowolny znak na klawiaturze, pro- gram powraca do trybu tekstowego i kończy działaniep. Program Gwiazdka w C++ Analogiczny program w języku Borland C++, wykorzystujący inicjalizowanie zmien- nych lokalnych wyrażeniami zbudowanymi z uprzednio określonych wartości oraz umieszczanie przypisań w wyrażeniach (funkcja gwiazdka), został przedstawiony na wydruku 3.4. Wydruk 3.4. Program Gwiazdka.cpp rysowania gwiazdki równoramieinnej KPENWFGITCRJKEUJ KPENWFGKQUVTGCOJ KPENWFGEQPKQJ KPENWFGOCVJJ KPV-CTVC8)#4QF8)#*+ XQKFIYKCFMC KPVPKPVRKPVSFQWDNGTFQWDNGT ] KPVM FQWDNGCNHC/A2+PCNHC CNHCHKRUK OQXGVQ T RS  HQT MMPM ] RUK HKM CNHC CNHC NKPGVQ T EQU RUK  RST UKP RUK  NKPGVQ T EQU HK  RST UKP HK  _ HNQQFHKNN RSIGVEQNQT  _ XQKFOCKP ] KPVP HNQCVT EQWV.KEDCTCOKQP EKP P EQWV2TQOKGē EKP T 62 Turbo Pascal i Borland C++. Przykłady KPKVITCRJ -CTVC4QF  $ $)+  UGVEQNQT .+)*64  UGVHKNNUV[NG 51.+ A(+..; ..19  IYKCFMC PTT  IGVEJ  ENQUGITCRJ  _ Zazwyczaj przejście od środowiska Turbo Pascala do Borland C++ nie sprawia kłopo- tów, gdy wykorzystuje się równoważne biblioteki standardowe. Nazwy zdefiniowa- nych w bibliotekach stałych i podprogramów są w obu środowiskach takie same, z tym że w C++ pierwsze pisane są dużymi, a drugie małymi literami. Zdarzają się jednak niespodzianki, czego przykładem są stałe 5QNKF(KNN i 51.+ A(+.. (pełne wypełnianie obszarów) użyte w dwóch ostatnich programach (por. wydpruki 3.3 i 3.4). Najmniejszy wielokąt wypukły Zbiór punktów, który dla dowolnych należących do niego dwóch punktów A i B za- wiera łączący je odcinek AB, nazywamy zbiorem wypukłym. Najmniejszy zbiór wypu- kły zawierający skończoną liczbę punktów P1, P2,..., Pn jest wielokątem, a zbiór jego wierzchołków stanowi podzbiór tego zbioru n punktów. Nie zajmiemy się tu jednak prezentacją znanych algorytmów wyznaczania najmniejszego wielokąta wypukłego4, lecz ograniczymy się do jego narysowania. Metoda polegać będzie na wyszukiwaniu i rysowaniu tylko tych odcinków PiPj dla , które leżą na brzegu wieloką- ta. W rezultacie wierzchołki najmniejszego wielokąta wypukłego zostaną wyznaczone. Nasuwa się więc pytanie: na czym polega wada takiego postępowania? Otóż istotne jest również określenie kolejności wierzchołków. Brak uporządkowania wierzchołków wielokąta może w przypadku współliniowości trzech lub większej ich liczby prowa- dzić do ponownego rysowania narysowanych wcześniej fpragmentów brzegu. ≤ ≤1 n j i Algorytm wyznaczania brzegu najmniejszego wielokąta wypukłego k k n ) k , k ( x y dla Przejdźmy teraz do sformułowania algorytmu umożliwiającego sprawdzenie, czy od- cinek PiPj określony przez dwa dowolne punkty Pi i Pj, wybrane spośród punktów , leży na brzegu najmniejszego wielokąta wypukłego P = zawierającego wszystkie te punkty. Oczywiste jest, że odcinek PiPj ma taką właści- wość wtedy i tylko wtedy, gdy wszystkie one leżą po jednej stronie prostej przecho- dzącej przez końce tego odcinka lub na niej. Rozpatrzmy przypadek . Prosta spełnia wówczas równanie ,...,2,1= x ≠ x j i 4 Można je znaleźć np. w książce [2]. Rozdział 3. ♦ Grafika 63 y = )( xp = y x j j − − y i x i ( x − ) x i + y i , ( ) k y x względem prostej zależy od znaku wyrażenia , Położenie punktu mianowicie punkt leży na prostej, gdy v = 0, nad prostą, gdy v 0, albo pod nią, gdy v 0. Zatem sprawdzenie, czy punkty o indeksach i, j określają odcinek leżący na brze- gu wielokąta, można opisać za pomocą następującej funkcji w Turbo Pascalu: xp y v − = k k k ) ( HWPEVKQP$TGI KLKPVGIGT $QQNGCP XCT MUKPVGIGT XTGCN DGIKP $TGIHCNUG U HQTMVQPFQ KH M K CPF M L VJGP DGIKP X [=L?[=K?  Z=L?Z=K? Z=M?Z=K? [=K?[=M? KHX VJGP DGIKP KHX VJGPGNUG KHUVJGPUGNUGKHU VJGP ZKV GPF GPF $TGIVTWG GPF Pętla HQT przebiega kolejno punkty i bada ich położenie względem prostej wyznaczo- nej przez punkty o indeksach i i j. Istotne działania są podejmowane, gdy rozpatrywa- ny punkt nie leży na prostej (v ≠ 0). Wtedy zmiennej z przypisana zostaje wartość 1, gdy punkt leży poniżej prostej, albo –1, gdy powyżej. Dalsze postępowanie zależy od wartości zmiennej s. Wartość zerowa s oznacza, że napotkany punkt jest pierwszym, który nie leży na prostej, a wtedy jego położenie względem niej (liczba 1 lub –1) zo- staje zapamiętane w zmiennej s. Z kolei niezerowa wartość s określa położenie wszyst- kich dotąd uwzględnionych punktów. Jeśli jest ona różna od wartości z, leżą one po in- nej stronie prostej niż rozpatrywany punkt. W takim przypadku pętla zostaje przerwana, wykonanie podprogramu zakończone, a rezultatem wywołania funkcji jest wartość HCNUG oznaczająca, że odcinek wyznaczony przez punkty Pi i Pj nie należy do brzegu wielokąta. Jeżeli wszystkie punkty leżą po jednej stronie prostej lub na niej, pętla zo- staje zakończona w sposób naturalny, a do miejsca wywołania funkcji zostaje przeka- zana wartość VTWG oznaczająca, że odcinek PiPj stanowi fragment brzegu wielokąta. Funkcja Brzeg wymaga udoskonalenia, ponieważ nie zadziała prawidłowo w przy- padku, gdy punkty Pi i Pj wyznaczają prostą pionową, tj. gdy i = (ang. divide by zero — dzielenie przez zero). Można temu zaradzić, wyliczając wartości i ności od jej kąta nachylenia względem osi x. I tak, dla prostej nie przekracza kąta 45o, korzystamy ze wzoru j , które posłużą do wybrania jednego z dwóch równań prostej, w zależ- , tj. gdy nachylenie dx ≥ dy dx dy y y x x − = − = x x i i j 64 Turbo Pascal i Borland C++. Przykłady y = dy dx ( x − x i ) + y i natomiast dla leżną od zmiennej y, co prowadzi do wzoru dx dy , czyli dla nachyleń większych, traktujemy zmienną x jako za- y = dy dx ( x − x i ) + y i Program WielWyp w Pascalu Zmodyfikowana funkcja Brzeg jest wykorzystana w przedstawionym na wydruku 3.5 programie w Turbo Pascalu, który wczytuje współrzędne punktów z pliku tekstowe- go, wykreśla te punkty w postaci małych krzyżyków i rysuje najmniejszy zawierający je wielokąt wypukły. Wydruk 3.5. Program WielWyp.pas rysowania najmniejszego wielokeąta wypukłego RTQITCO9KGNQMCVAY[RWMN[ WUGU TV)TCRJ EQPUV -CTVCKPVGIGT8)# 4QFKPVGIGT8)#*K XCT PKPVGIGT Z[CTTC[=?QHKPVGIGT RTQEGFWTG [VCL CPG XCT  CPG6GZV 0CYCUVTKPI DGIKP 9TKVG 0CYCRNKMW  4GCF.P 0CYC  #UUKIP CPG0CYC  4GUGV CPG  P YJKNGPQV QH CPG FQ DGIKP +PE P  4GCF.P CPGZ=P?[=P?  GPF  NQUG CPG  GPF HWPEVKQP$TGI KLKPVGIGT $QQNGCP XCT MFZF[UKPVGIGT XTGCN DGIKP $TGIHCNUG Rozdział 3. ♦ Grafika 65 FZZ=L?Z=K? F[[=L?[=K? KH FZ CPF F[ VJGP ZKV U HQTMVQPFQ KH M K CPF M L VJGP DGIKP KH#DU FZ #DU F[ VJGPXF[FZ Z=M?Z=K? [=K?[=M? GNUGXFZF[ [=M?[=K? Z=K?Z=M? KHX VJGP DGIKP KHX VJGPGNUG KHUVJGPUGNUGKHU VJGP ZKV GPF GPF $TGIVTWG GPF RTQEGFWTG7VYQT4[UWPGM XCT KLKPVGIGT DGIKP HQTKVQPFQ DGIKP .KPG Z=K?[=K?Z=K? [=K?   .KPG Z=K?[=K? Z=K? [=K?  GPF HQTKVQPFQ HQTLK VQPFQ KH$TGI KL VJGP.KPG Z=K?[=K?Z=L?[=L?  GPF DGIKP  [VCL CPG +PKV)TCRJ -CTVC4QF  62 $)+  7VYQT4[UWPGM 4GCF-G[  NQUG)TCRJ GPF Nazwa pliku jest podawana z klawiatury. Przyjęto założenie, że plik zwiera co najwy- żej 1000 wierszy, tj. n ≤ 1000, oraz że wiersze pliku zawierają po dwie liczby całko- wite, oddzielone co najmniej jedną spacją, określające współrzędne ekranowe kolej- nego punktu: 0 ≤ x k 0,640 ≤ y k ,480 ( k ,...,2,1 n ) = Tworząc plik, np. w edytorze Turbo Pascala, należy uważać, aby po ostatnim wierszu nie umieścić wiersza pustego. Liczba punktów (wierszy) jest obliczana w pętli w trak- cie czytania pliku według schematu: podczas gdy (dopóki) nie napotkano jeszcze końca pliku , zwiększ liczbę punktów (wstępnie zero) o jeden i wczytaj współrzędne kolejnego p unktu. 66 Turbo Pascal i Borland C++. Przykłady W funkcji Brzeg dodatkowo zabezpieczono się przed błędem w patologicznym przy- padku, gdy parametry określają punkty o takich samych współrzędnych: dla dx = dy = 0 obliczenia są przerywane, wynikiem wywołania funkcji jest wartość HCNUG. Korzy- stający z funkcji Brzeg podprogram UtworzRysunek najpierw rysuje wszystkie punk- ty, a następnie sprawdza, czy punkty o indeksach określają odcinki na brzegu najmniejszego wielokąta wypukłego, i w przypadku spełnienia warunku od- cinki takie rysuje. Tym razem wygodniejszym narzędziem rysowania jest procedura .KPG, która wymaga czterech parametrów reprezentujących współrzędne początku i końca odcinka. W przeciwieństwie do .KPG6Q, nie przenosi ona pisaka do końca ry- sowanego odcinka. ≤ ≤1 i j n Program WielWyp w C++ Na wydruku 3.6 jest przedstawiony podobny program w Borland C++, ale o bardziej zwartym w porównaniu z Pascalem kodzie dotyczącym czytania danych i sprawdza- nia, czy odcinek określony przez dwa punkty leży na pbrzegu wielokąta wypukłego. Wydruk 3.6. Program WielWyp.cpp rysowania najmniejszego wielokeąta wypukłego KPENWFGUVFKQJ KPENWFGOCVJJ KPENWFGITCRJKEUJ KPENWFGEQPKQJ KPV-CTVC8)#4QF8)#*+PZ=?[=? KPVE[VCLFCPG ] (+.  FCPG EJCTPCYC=? RTKPVH 0CYCRNKMW  IGVU PCYC  KH FCPGHQRGP PCYCTV 07.. ] HQT PHUECPH FCPGFFZ P[ P  1(P  HENQUG FCPG  TGVWTP _ GNUG TGVWTP _ KPVDTGI KPVKKPVL ] KPVMFZZ=L?Z=K?F[[=L?[=K?U FQWDNGX KH FZF[ TGVWTP HQT MMPM KH MKML KH X HCDU FZ HCDU F[ !FQWDNG F[ FZ Z=M?Z=K? [=K?[=M? FQWDNG FZ F[ [=M?[=K? Z=K?Z=M?  Rozdział 3. ♦ Grafika 67 ]  X  ! KH U UGNUGKH U TGVWTP _ TGVWTP _ XQKFWVYQTT[UWPGM ] KPVKL HQT KKPK ] NKPG Z=K?[=K?Z=K? [=K?   NKPG Z=K?[=K? Z=K? [=K?  _ HQT KKPK HQT LK LPL KH DTGI KL NKPG Z=K?[=K?Z=L?[=L?  _ XQKFOCKP ] KH E[VCLFCPG ] KPKVITCRJ -CTVC4QF  $ $)+  WVYQTT[UWPGM  IGVEJ  ENQUGITCRJ  _ GNUG ] RTKPVH 0KGWFCPGQVYCTEKGRNKMW P  IGVEJ  _ _ Program również rozpoczyna działanie od wczytania danych z pliku tekstowego, wy- korzystując funkcję czytajdane. Jednakże w przypadku podania przez użytkownika niewłaściwej nazwy pliku, informuje o nieudanym otwarciu pliku, a nie kończy się błędem (ang. file not found — plik nieznaleziony). Parametrami funkcji HQRGP są na- zwa pliku i tryb jego otwarcia (r oznacza odczyt, t — plik tekstowy). Wartością funk- cji jest wskaźnik do struktury typu (+. , gdy plik został otwarty, bądź tzw. wskaźnik pusty 07.., gdy z różnych przyczyn pliku nie udało się otworzyć. Funkcja HENQUG za- myka plik. Do wczytania dwóch współrzędnych kolejnego punktu użyto funkcji HUECPH. Jej wy- wołanie, zamieszczone w warunku kontynuacji pętli HQT, daje wartość równą liczbie wczytanych pól, gdy operacja czytania powiodła się, bądź wartość 1( (ang. end of file — koniec pliku), gdy napotkano koniec pliku. Cztery parametry wywołania ozna- czają kolejno: wskaźnik do pliku, format czytanych danych (symbole formatujące F odnoszą się do liczb całkowitych dziesiętnych) i dwa wskaźniki określające elementy tablic, których wartości mają być wczytane. 68 Turbo Pascal i Borland C++. Przykłady Wskaźniki a tablice w C i C++ Wskaźnik do zmiennej jest zazwyczaj tworzony za pomocą operatora , np. zapis P oznacza wskaźnik do zmiennej n. Wyrażeniami określającymi wskaźniki do elemen- tów Z=P? i [=P? są zatem Z=P? i [=P?, można je było zastosować w wywołaniu funk- cji HUECPH. Nazwa tablicy jest jednak traktowana jako wskaźnik do jej początkowego elementu (skutkiem tego parametrem wywołania funkcji IGVU, wczytującej nazwę pli- ku z klawiatury, jest nazwa tablicy znakowej). Ponadto poprzez dodanie wartości cał- kowitej do wskaźnika otrzymuje się wskaźnik do elementu przesuniętego o tę wartość. Zapisy Z P i [ P oraz Z=P? i [=P? są więc całkowicie równoważne. Ścisła odpowiedniość między tablicami i wskaźnikami przejawia się w dowolności używania indeksów i wskaźników w kodowaniu operacji dotyczących przetwarzania tablic. I tak, stosując jednoargumentowe operatory  i , otrzymujemy równoważne formy wyrażeń: i i i Z=? Z=? Z=? Z Z  Z  . . . . . . . . . . . . . . . . Z M . . . . . . . . . . . . . . . . Z=M? i oraz i i i Z Z  Z  Z=? Z=? Z=? . . . . . . . . . . . . . . . . . . Z=M? . . . . . . . . . . . . . . . . . . Z M i Wyrażenia warunkowe w C i C++ Niespodziankę dla Czytelnika podejmującego się przejścia od Pascala do języków C i C++ mogą stanowić wyrażenia warunkowe występujące w funkcji brzeg, określające sposób obliczania wartości zmiennych v i z, utworzone za pomocą operatora ! wy- magającego aż trzech argumentów. Ich składnia jest napstępująca: Y[TCľGPKG!Y[TCľGPKGY[TCľGPKG Najpierw obliczane jest pierwsze wyrażenie. Jeśli jego wartość jest różna od zera, ob- liczana jest wartość drugiego wyrażenia i ona zostaje potraktowana jako wartość całe- go wyrażenia warunkowego. W przeciwnym przypadku obliczana jest wartość trzecie- go wyrażenia i ona zostaje przyjęta jako wartość wynikowa. Tak więc spośród dwóch wyrażeń, drugiego i trzeciego, obliczane jest tylko pjedno. Prostym przykładem użycia wyrażenia warunkowego jest wyznaczenie wartości c ja- ko większej z a i b. Można oczywiście zastosować instrukcję warunkową KH C D EC GNUG ED ale prościej jest napisać E C D !CD Rozdział 3. ♦ Grafika 69 Wyrażenie warunkowe może występować w innych wyrażeniach, czego przykładem jest wyrażenie określające wartość zmiennej v w funkcji brzeg. Zostało ono użyte w wa- runku sterującym wykonaniem instrukcji KH. Częstotliwość występowania liter w pliku Zajmiemy się obecnie zliczaniem liter w pliku tekstowym. Warto wspomnieć, że za- gadnienie wyznaczenia częstotliwości występowania liter w tekście miało duże zna- czenie praktyczne już wiele lat przed pojawieniem się komputerów. Gdy konstruowa- no pierwsze maszyny do pisania, należało rozmieścić klawisze jej klawiatury tak, aby znaki najczęściej używane były łatwiej dostępne niż zpnaki używane rzadziej. Również alfabet Morse a został tak zbudowany, aby znakom częściej używanym odpowiadały krótsze sygnały. Program Litery w Pascalu Zakładamy, że program ma uwzględniać tylko litery alfpabetu angielskiego, oraz że ma utożsamiać litery duże i małe. Wynikiem jego działania nie mają być jednak liczby wystąpień poszczególnych liter, lecz wykres słupkowy obrazujący częstotliwości ich występowania. Naturalne wydaje się wyodrębnienie dwóch składowych programu, z których pierwsza zlicza litery w pliku, a druga tworzy grafikę. Program taki w języ- ku Turbo Pascal został przedstawiony na wydruku 3.7. Wydruk 3.7. Program Litery.pas obrazujący częstotliwość występeowania liter w pliku RTQITCO.KEDCANKVGTARNKMWAVGMUVQYGIQ WUGU TV)TCRJ EQPUV  TKXGTKPVGIGT8)# /QFGKPVGIGT8)#*K XCT .CTTC[= #  ?QHKPVGIGT RTQEGFWTG.KEGPKG XCT 2NKM6GZV 0CYCUVTKPI EEJCT DGIKP HQTE # VQ FQ .=E? 9TKVG 0CYCRNKMW  4GCF.P 0CYC  #UUKIP 2NKM0CYC  70 Turbo Pascal i Borland C++. Przykłady 4GUGV 2NKM  YJKNGPQV QH 2NKM FQ DGIKP 4GCF 2NKME  KHEKP= #   C  ?VJGP+PE .=7R CUG E ?  GPF  NQUG 2NKM  GPF RTQEGFWTG4[UQYCPKG EQPUV 01TF 1TF #  ].KEDCUđWRMÎY_ FZFKX0]4QUVCYUđWRMÎY_ 9KFVJ FZFKX]5GTQMQħèUđWRMC_  GRVJ FZ9KFVJ FKX])đúDQMQħèUđWRMC_ XCT /CZZKPVGIGT EEJCT DGIKP /CZ HQTE # VQ FQ KH.=E? /CZVJGP/CZ.=E? Z 0 FZ FKX 5GV(KNN5V[NG 5QNKF(KNN CTM)TC[  HQTE # VQ FQ DGIKP $CT Z4QWPF .=E?/CZ  Z 9KFVJ GRVJVTWG  1WV6GZV:; Z GRVJE  +PE ZFZ  GPF GPF DGIKP .KEGPKG +PKV)TCRJ TKXGT/QFG  62 $)+  4[UQYCPKG 4GCF-G[  NQUG)TCRJ GPF Procedura Liczenie oblicza liczby wystąpień poszczególnych liter w pliku tekstowym, umieszczając wynik w tablicy globalnej L. Wartościami indeksów elementów tej ta- blicy są duże litery od A do Z, typ indeksu jest więc podzbiorem typu znakowego EJCT, a element .=E? przedstawia liczbę wystąpień znaku (litery) c w tekście. Najpierw ze- rowane są wszystkie elementy tablicy L. Następnie w pętli pobierany jest z pliku ko- lejny znak c i w przypadku, gdy jest to litera, wartość elementu .=E? jest zwiększana o 1. Wcześniej jednak, gdy c jest małą literą, indeks elementu jest zamieniany na dużą literę za pomocą funkcji 7R CUG. Procedura Rysowanie rysuje dla każdej litery słupek o wysokości proporcjonalnej do liczby wystąpień tej litery w pliku. W celu uproszczenia kodu procedury i poprawie- nia jego czytelności zdefiniowano kilka stałych: N — liczba słupków (26, tj. liczba liter alfabetu angielskiego), dx — rozstaw słupków przy szerokości ekranu 640 pikse- li, Width — szerokość słupka, Depth — głębokość słupka. Najwyższy słupek, o wy- Rozdział 3. ♦ Grafika 71 sokości 440 pikseli, odpowiada literze, która pojawiła się w pliku najczęściej. Licznik wystąpień tej litery jest maksymalną wartością wszystkich elementów tablicy L. Wy- znacza się go w zmiennej Max według schematu: jeżeli kolejny element ma wartość większą od dotychcza sowej wartości zmiennej Max, przypisz zmiennej Max wartość tego elementu. Elementy są nieujemne, na wstępie należało więc wyzerować zmienną Max. Jednakże z uwagi na obliczanie wysokości słupka litery c ze wzoru )( ch = ][ cL Max 440 zmiennej Max przypisuje się na początku wartość 1. Unika się w ten sposób błędu dzielenia przez zero, gdy plik nie zawiera żadnej lpitery. Słupki są rysowane za pomocą bibliotecznej procedury $CT . Pierwsze cztery para- metry jej wywołania określają współrzędne lewego górnego i prawego dolnego rogu prostokąta stanowiącego ściankę przednią słupka, piąty — głębokość słupka, szósty zaś (VTWG) wymusza rysowanie górnego denka (dla HCNUG denko nie byłoby rysowa- ne). Wspólna wartość y = 450 dla dolnego boku ścianek przednich sprawia, że słupki „wyrastają” w górę z jednej płaszczyzny poziomej (por. rysunek 3.5). Jednoliterowe napisy pod słupkami, od y = 460, są tworzone za pomocą procedury 1WV6GZV:;. Rysunek 3.5. Częstotliwość występowania liter w pliku Litery.pas Program Litery w C++ Przystępując do omówienia analogicznego programu w Borland C++ należy przypo- mnieć, że elementy tablic są w C i C++ zawsze indeksowapne liczbami całkowitymi od zera wzwyż. Zatem element .=? będzie zawierał liczbę wystąpień litery A, .=? — liczbę wystąpień litery B, ..., .=? — liczbę wystąpień litery Z. Krótko mówiąc, licz- 72 Turbo Pascal i Borland C++. Przykłady ba wystąpień litery będącej wartością zmiennej c zostanie zapamiętana w elemencie .=E # ?. Zmienne i stałe typu EJCT są arytmetycznie traktowane identycznie jak zmien- ne typu KPV, wyrażenie E # jest więc poprawne. Jego wartością jest liczba całkowita od 0 do 25, która odpowiada jednej z liter od A do Z zawartej w zmiennej c. W celu przekształcenia małej litery na dużą wygodnie jest posłużyć się funkcją VQWRRGT. Peł- na wersja tego programu w Borland C++ została przedstapwiona na wydruku 3.8. Wydruk 3.8. Program Litery.cpp obrazujący częstotliwość występeowania liter w pliku KPENWFGUVFKQJ KPENWFGEQPKQJ KPENWFGITCRJKEUJ KPENWFGEV[RGJ FGHKPG0  #  .KEDCUđWRMÎY FGHKPG : 0 4QUVCYUđWRMÎY FGHKPG9+ 6*  : 5GTQMQħèUđWRMC FGHKPG 26* :9+ 6*  )đúDQMQħèUđWRMC KPV TKXGT8)#/QFG8)#*+.=0? KPVNKEGPKG ] (+.  RNKM EJCTPCYC=? KPVE RTKPVH 0CYCRNKMW  IGVU PCYC  KH RNKMHQRGP PCYCTV 07.. ] HQT EE0.=E ?  YJKNG EHIGVE RNKM  1( KH EVQWRRGT E   # E .=E # ?  HENQUG RNKM  TGVWTP _ GNUG TGVWTP _ XQKFT[UQYCPKG ] KPV/CZZ 0 :  EJCT UE HQT EE0E KH .=E? /CZ /CZ.=E? UGVHKNNUV[NG 51.+ A(+.. #4-)4#;  HQT EE0E ] DCTF Z .=E?  /CZZ 9+ 6* 26*   U # E QWVVGZVZ[ Z 26*U  Z  : _ _ Rozdział 3. ♦ Grafika 73 XQKFOCKP ] KH NKEGPKG ] KPKVITCRJ  TKXGT/QFG  $ $)+  T[UQYCPKG  IGVEJ  ENQUGITCRJ  _ GNUG ] RTKPVH 0KGWFCPGQVYCTEKGRNKMW P  IGVEJ  _ _ Występująca w funkcji liczenie definicja zmiennej c, służącej do pamiętania kolejne- go znaku pobranego z pliku, może rodzić pytanie: dlaczego zmienna ta jest typu KPV, a nie typu EJCT? Powodem użycia typu KPV zamiast EJCT jest typ wartości zwracanych przez funkcję HIGVE, która czyta znak z pliku i zwraca go jako wartość wynikową, a w przypadku napotkania końca pliku zwraca wartość odpowiadającą nazwie sym- bolicznej 1(, określoną w pliku nagłówkowym stdio.h jako –1. Tak więc wartościa- mi zwracanymi przez funkcję HIGVE są wszystkie możliwe znaki i dodatkowa wartość –1 typu KPV, która binarnie jest ciągiem samych jedynek. Przekształcenie jej do typu EJCT polega na obcięciu tego ciągu do 8 bitów, co daje wartość 2555. Zatem gdyby zmienna c była typu EJCT, program zawieszałby się, ponieważ wykrycie końca pliku powodowałoby przypisywanie zmiennej c wartości 255, w efekcie warunek kontynu- acji pętli YJKNG byłby zawsze spełniony. Konwersja znaku na łańcuch w C i C++ Wyjaśnienia może wymagać użycie zmiennej wskaźnikowej s w podprogramie ryso- wanie, która nie ma swojego odpowiednika w jego wersji pascalowskiej. Jest ona za- inicjalizowana jednoznakową stałą tekstową, czyli dwuelementową tablicą znakową. Wartość pierwszego elementu tablicy nie ma tu znaczenia, istotna jest zerowa wartość jej drugiego elementu oznaczająca koniec tekstu (symbol ). W pętli HQT pierwszemu elementowi tablicy jest przypisywana kolejna duża litera od A do Z, a powstały w ten sposób tekst jednoznakowy jest następnie wykorzystywany w wywołaniu funkcji QWV VGZVZ[ tworzącej napis pod słupkiem. Zabieg ten jest właściwie konwersją między typem znakowym a typem tekstowym. W językach C i C++ nie ma kompatybilności między tymi typami, nawet istnieje róż- nica między stałą znakową i stałą tekstową zawierającą jeden znak. Na przykład # to nie to samo co #. Pierwsza stała oznacza znak o wartości numerycznej 65 (kod litery A), zaś druga — tekst o długości jednego znaku, zawierający literę A i zakoń- czony znakiem . W Turbo Pascalu nie ma takiego problemu, zmiennej łańcuchowej (typu UVTKPI) można przypisać wartość znakową. 5 Przy włączonej opcji Uunsigned characters kompilator Borland C++ traktuje wartości typu EJCT jak WPUKIPGFEJCT (liczby całkowite bez znaku). Domyślnie opcja ta joest włączona. 74 Turbo Pascal i Borland C++. Przykłady Definiowanie stałych symbolicznych w C++ Zamieszczone na początku programu cztery dyrektywy FGHKPG, właściwe językowi C, są odpowiednikiem definicji stałych w pascalowskiej procedurze Rysowanie. Defi- niują one nazwy symboliczne: N, DX, WIDTH i DEPTH, z którymi wiążą określone ciągi znaków. Każde wystąpienie takiej nazwy w tekście programu, z wyjątkiem nazw w cudzysłowach, jest przez preprocesor zamieniane na odpowiadający jej ciąg zna- ków. Stosowanie dyrektyw FGHKPG prowadzi niekiedy do błędów. Np. gdyby ciąg znaków odpowiadający nazwie N nie zawierał nawiasów, ciąg odpowiadający nazwie DX określałby nieprawidłowy rozstaw słupków. W języku C++ istnieje możliwość definiowania stałych za pomocą słowa kluczowego EQPUV, co pozwala na unikanie dyrektywy FGHKPG i nieprzyjemnych problemów wy- nikających z jej stosowania. Omawiane dyrektywy lepiej jest zastąpić następującymi deklaracjami stałych: EQPUVKPV0  # .KEDCUđWRMÎY EQPUVKPV :04QUVCYUđWRMÎY EQPUVKPV9+ 6* :5GTQMQħèUđWRMC EQPUVKPV 26* :9+ 6* )đúDQMQħèUđWRMC Wykres funkcji drgań harmonicznych tłumionych Sporządzenie wykresu funkcji ciągłej jednej zmiennej sprowadza się do obliczania wartości tej funkcji w odpowiednio dużej liczbie punktów rozpatrywanego przedziału i narysowania linii łamanej o wyznaczonych w ten sposób wierzchołkach — punktach płaszczyzny. W celu zobrazowania wykresu na ekranie monitora komputerowego ko- nieczne jest przejście
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Turbo Pascal i Borland C++. Przykłady
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: