Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i...

39
Przyklady programowania w C++ - kurs podstawowy Laboratorium 2 Miroslaw Dudek dla Otwartych Warsztatów Komputerowych Streszczenie Celem kursu jest szybkie nauczenie podstaw programowania obiektowego. Cechą odróż- niającą ten kurs od wielu innych kursów nauki programowania w C++ jest wykorzystanie możliwości graficznych komputera. Stąd niektóre partie materialu dotyczące samej formy programowania i różnorodności wielu funkcji bibliotecznych pojawiają się dopiero w trakcie omawiania konkretnych zadań z grupą a nie z zachowaniem tradycyjnej kolejności. Uczestnicy kursu powinni po jego zakończeniu potrafić napisać samodzielnie program prostej symula- cji komputerowej/gry komputerowej z animowaną grafiką wykorzystującą bibliotki OpenGL. Kurs realizowany jest w laboratorium komputerowym przy użyciu komputerów z systemem operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki Programy w języku C++ pisać będziemy w środowisku Linuxa korzystając z interfejsu poleceń tzw. terminala i zewnętrznych edytorów tekstu kedit lub gedit. Zakladamy, ze uczestnicy kursu nie znają Linuxa i nie posiadają go na swoich domowych komputerach. W tym przypadku, dopóki nie przyzwyczają się oni do specyfiki programowania pod Linuxem mogą korzystać z programów będących środowiskami programowania jak np. DevC++ pod Windows, które jest darmowym oprogramowaniem dla programistów w języku C i C++. Po zalogowaniu się na swoje konto linuxowe uruchamiamy terminal /konsolę w którym bę- dziemy pisać polecenia i wybieramy edytor do pisania programów. Polecam na początek kate.W tym przypadku konsola do pisania poleceń jest wbudowana do edytora i nie trzeba uruchamiać terminala poleceń. Konsola jest dostępna po kliknięciu myszą okienka o nazwie konsola. Jeśli mamy uruchomiony edytor kate to dobrze go skonfigurować pod programowanie w C++ np. ustawić podświetlanie nawiasów kolorem lub ustawić numerowanie linii programu itp. W okienku konsoli domyślnie mamy dostęp do katalogu domowego użytkownika. Jeśli np. nazwa konta użytkownika Jana Kowalskiego :) brzmi kowal to wpisując w konsoli polecenie pwd po- jawi się nazwa ścieżki dostępu do tego katalogu, np. może to być /home/kowal. Trzeba jednak mieć na uwadze, że pisząc programy w glównym katalogu domowym po jakimś czasie jego zawar- tość będzie malo czytelna. Dlatego dobrze jest utworzyć podkatalog w którym będziemy pisać swoje pierwsze programy. Powiedzmy że bedzie on nazywal się ”moje”. Możemy go utworzyć z poziomu konsoli pisząc polecenie: mkdir moje potwierdzając je przyciskiem ENTER. Kolejne polecenie ls pokaże nam zawartość katalogu kowal wraz z podkatalogiem moje. Umówimy się że w nim będziemy pisać swoje programy. Aby to zrobić trzeba przejść do tego katalogu. Robimy to poleceniem cd moje. Teraz przy pomocy edytora kate napiszemy nasz pierwszy program i zapiszemy jego treść w katalogu moje pod nazwą pierwszy.cc. Jest to tekst poniżej skladający się z kilku poleceń zakończonych średnikiem - każde polecenie w C++ kończy się średnikiem. Komentarze do tego programu są w kolejnym zalączonym wydruku pliku powitanie.cc. Nazwy programów w C++ kończymy rozszerzeniem .cc lub .cpp. W użyciu są również nazwy z rozsze- rzeniem .cxx, .C. M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 1 Material dystrybuowany bezplatnie

Transcript of Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i...

Page 1: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

Przykłady programowania w C++ - kurs podstawowy

Laboratorium 2

Mirosław Dudek dlaOtwartych Warsztatów Komputerowych

Streszczenie

Celem kursu jest szybkie nauczenie podstaw programowania obiektowego. Cechą odróż-niającą ten kurs od wielu innych kursów nauki programowania w C++ jest wykorzystaniemożliwości graficznych komputera. Stąd niektóre partie materiału dotyczące samej formyprogramowania i różnorodności wielu funkcji bibliotecznych pojawiają się dopiero w trakcieomawiania konkretnych zadań z grupą a nie z zachowaniem tradycyjnej kolejności. Uczestnicykursu powinni po jego zakończeniu potrafić napisać samodzielnie program prostej symula-cji komputerowej/gry komputerowej z animowaną grafiką wykorzystującą bibliotki OpenGL.Kurs realizowany jest w laboratorium komputerowym przy użyciu komputerów z systememoperacyjnym Linux.

1 Pierwszy edytor tekstu i pierwsze programy

1.1 Pierwsze kroki

Programy w języku C++ pisać będziemy w środowisku Linuxa korzystając z interfejsu poleceńtzw. terminala i zewnętrznych edytorów tekstu kedit lub gedit. Zakładamy, ze uczestnicy kursunie znają Linuxa i nie posiadają go na swoich domowych komputerach. W tym przypadku,dopóki nie przyzwyczają się oni do specyfiki programowania pod Linuxem mogą korzystać zprogramów będących środowiskami programowania jak np. DevC++ pod Windows, które jestdarmowym oprogramowaniem dla programistów w języku C i C++.

Po zalogowaniu się na swoje konto linuxowe uruchamiamy terminal/konsolę w którym bę-dziemy pisać polecenia i wybieramy edytor do pisania programów. Polecam na początek kate. Wtym przypadku konsola do pisania poleceń jest wbudowana do edytora i nie trzeba uruchamiaćterminala poleceń. Konsola jest dostępna po kliknięciu myszą okienka o nazwie konsola.

Jeśli mamy uruchomiony edytor kate to dobrze go skonfigurować pod programowanie wC++ np. ustawić podświetlanie nawiasów kolorem lub ustawić numerowanie linii programu itp.W okienku konsoli domyślnie mamy dostęp do katalogu domowego użytkownika. Jeśli np. nazwakonta użytkownika Jana Kowalskiego :) brzmi kowal to wpisując w konsoli polecenie pwd po-jawi się nazwa ścieżki dostępu do tego katalogu, np. może to być /home/kowal. Trzeba jednakmieć na uwadze, że pisząc programy w głównym katalogu domowym po jakimś czasie jego zawar-tość będzie mało czytelna. Dlatego dobrze jest utworzyć podkatalog w którym będziemy pisaćswoje pierwsze programy. Powiedzmy że bedzie on nazywał się ”moje”. Możemy go utworzyć zpoziomu konsoli pisząc polecenie: mkdir moje potwierdzając je przyciskiem ENTER. Kolejnepolecenie ls pokaże nam zawartość katalogu kowal wraz z podkatalogiem moje. Umówimy sięże w nim będziemy pisać swoje programy. Aby to zrobić trzeba przejść do tego katalogu. Robimyto poleceniem cd moje. Teraz przy pomocy edytora kate napiszemy nasz pierwszy program izapiszemy jego treść w katalogu moje pod nazwą pierwszy.cc. Jest to tekst poniżej składającysię z kilku poleceń zakończonych średnikiem - każde polecenie w C++ kończy się średnikiem.Komentarze do tego programu są w kolejnym załączonym wydruku pliku powitanie.cc. Nazwyprogramów w C++ kończymy rozszerzeniem .cc lub .cpp. W użyciu są również nazwy z rozsze-rzeniem .cxx, .C.

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 1 Materiał dystrybuowany bezpłatnie

Page 2: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.1 Pierwsze kroki Przykłady programowania w C++ - kurs podstawowy

1 #include <iostream>2 using namespace std ;34 int main ( ){5 cout<<"Dzien dobry, to moj pierwszy program"<<endl ;6 return 0 ;7 }

Wydruk tego programu z dodanymi pomocniczymi komentarzami (bez polskich ogonków)jest dostępny poniżej.

1 // t e dwa prawe uko sn i k i to komentarz .234 //od k on f i g u r a c j i t ermina la z a l e z e c b ed z i e czy widzimy p o l s k i e ogonki5 //akcentow i t d . d l a t e g o i ch nie bedziemy uzywac w komentarzach6789 #include <iostream> // to j e s t b i b l i o t e k a wejsc ia−wyj sc ia

1011 using namespace std ;1213 int main ( ){ // funkc ja main () r ep re z en tu j aca program glowny14 // zwraca ona wartosc ca l k ow i t a do systemu15 // f−c ja ta moze pos iadac argumenty . Wtedy j e j pos tac b ed z i e16 // nas tepu jaca : i n t main ( i n t argc , char ∗∗ argv )17 // znaczen ie argumentow to odpowiednio argc=l i c z b a parametrow18 //programu wykonawczego19 // argv=t a b l i c a parametrow programu wykonawczego − pr zyk l ad20 //programu z parametrami21 // j e s t np . w p l i k u pierwszyB . cc222324 cout<<"Dzien dobry, to moj pierwszy program"<<endl ; //wydruk lancucha25 // znakowego26 //na standardowe wy j s c i e27 // − t u t a j j e s t to ekran2829 /∗30 to t e z j e s t komentarz .3132 cout − s l u z y do przek ierowania s trumienia33 wyjsc iowego na wy j s c i e standardowe ( domyslnie j e s t to ekran )3435 symbol << − j e s t operatorem strumieniowym ktory powoduje po jawien ie s i e36 na ekran ie nas tepu jacego po nim lancucha znakowego .3738 end l − po l e c en i e p r z e j s c i a do nowej l i n i i39 ∗/4041 return 0 ; // funkc ja main () zwraca wartosc ca l k ow i t a do systemu42 //po zakonczeniu d z i a l a n i a programu − sygna l zakonczenia43 }

Napisaliśmy treść programu pierwszy.cc i mamy też jego wersję z komentarzami pod na-zwą powitanie.cc. Żeby uruchomić taki program trzeba go skompilować czyli zamienić polecenia

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 2 Materiał dystrybuowany bezpłatnie

Page 3: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.2 Inne programy Przykłady programowania w C++ - kurs podstawowy

napisane w edytorze tekstu na polecenia dla procesora komputera. Te polecenia będą tym co po-tocznie nazywa się programem komputerowym i u nas w przypadku pierwszego pliku pierwszy.ccten program wykonawczy bedzie nazywał się pierwszy.exe. W laboratorium używamy kompila-tora g++ i polecenie utworzenia programu pierwszy.exe jest następujące:

g++ -o pierwszy.exe pierwszy.cc

W wyniku otrzymujemy plik pierwszy.exe który jest naszym programem. Uruchomimy go zkonsoli poleceniem ./pierwszy.exe potwierdzając klawiszem ENTER. Pod Linuxem (i innymsystem unixopodobnym) rozszerzenie .exe nie musi być dodawane. Pliki wykonawcze są roz-poznawane ze względu na ich atrybuty. Jakie są atrybuty pliku pierwszy.exe można dowiedziećsię pisząc w konsoli polecenie ls -l pierwszy.exe. Użytkownikowi kowal powinien jako reakcjapojawić się tekst w rodzaju:

-rwxr-xr-x 1 kowal kowal 8948 2009-12-25 14:38 pierwszy.exe

gdzie pierwsze 10 znaków to tak zwane atrybuty pliku. Kreska oznacza że dany atrybut jestwyłączony. Dla nas istotne jest tylko 9 znaków od drugiego do dziesiątego reprezentujących trzykolejne trójki stanów rwx czyli czy plik jest do czytania (r), do zapisu (w) i do wykonywania(x). Pierwsza trójka dotyczy użytkownika (u) - zauważmy że wszystkie atrybuty rwx są włą-czone dla użytkownika kowal, druga trójka dotyczy grupy (g) i trzecia trójka grupa to inni (o).Prawa dostępu do plików można kontrolować. Na przykład chcąc zabronić użytkownikowi prawazapisu do pliku pierwszy.exe to wystarczy polecenie

chmod u-w pierwszy.exe

po którym kolejne trójki stanów (rwx)(rwx)(rwx) przyjmą postać (rw-)(r-x)(r-x). Czyli użyt-kownikowi (u) odjęliśmy prawa do zapisu. Chcąc dodać prawa zapisu do pliku (choćby po toaby go móc nadpisać po ponownym skompilowaniu) trzeba na to pozwolić np. poleceniem:

chmod u+w pierwszy.exe

gdzie znak ’+’ oznacza dodanie uprawnień. Podobnie można zmienić pozostałe atrybuty. Atry-buty pliku można też zmieniać przy pomocy interfejsu graficznego analogicznie jak w środowiskuWindows poprzez zmianę tzw. własności.

Wracając do kwestii kompilatora to np. skrócona forma polecenia:

g++ pierwszy.cc

wyprodukuje plik o nazwie a.out który ma włączone atrybuty wykonawcze (x) i podobniejak poprzednio uruchomienie programu nastepuje po poleceniu ./a.out potwierdzonym EN-TERem. W niektórych przypadkach proces kompilacji trzeba przeprowadzać w dwóch etapach.Przykłady takiej kompilacji omówimy kiedy będziemy łączyć kompilaty z kilku różnych językówprogramowania i przy używaniu odpluskwiacza (debugger).

1.2 Inne programy

Kolejne pierwsze programy których przykłady zamieszczamy w tym podrozdziale mają charakterczysto roboczy i służą nabyciu przyzwyczajeń pisania kodu przy pomocy edytora, deklarowaniatypów zmiennych. Wprowadzone zostają proste algorytmy dodawania, mnożenia itp. W kolej-

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 3 Materiał dystrybuowany bezpłatnie

Page 4: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.2 Inne programy Przykłady programowania w C++ - kurs podstawowy

nych rozdziałach kody programów będą już bardziej związane z konkretnym zadaniem. Przyokazji omawiania tych przykładów wprowadzane będą kolejne elementy języka programowaniaC++.

Poniżej znajduje się pierwszy przykład tej serii programów drugi.cc, który pokazuje prostedziałania na liczbach całkowitych.

12 #include <iostream> // to j e s t b i b l i o t e k a wejsc ia−wyj sc ia34 using namespace std ;56 int main ( ){ // funkc ja main () r ep re z en tu j aca program glowny78 // pr zyk l ad d e k l a r a c j i zmiennych ca l kow i t y ch i , j , k9

10 int i , j , k ;1112 // za zmienna i oraz j podstawiamy war to sc i l i c z b owe np .1314 i =4;15 j =6;16 //wynik dodawania i+j przypisu jemy zmiennej k i wypiszemy go na ekran ie1718 k=i+j ;1920 cout<<"i+j = "<<k<<endl<<endl ;2122 //wydruk j e s z c z e raz i n a c z e j zap i sany2324 cout<<i<<" + "<<j<<" = "<< k <<endl ;2526 return 0 ;27 }

Powtórzmy, że kompilacja następuje poleceniem, które w tym przypadku przyjmuje postać:g++ -o drugi.exe drugi.cc

a uruchomienie programu nastąpi po poleceniu ./drugi.exe. Ten sam program ale kiedy wartościzmiennych i i j zostają wprowadzone przy pomocy strumienia wejściowego cin jest zamieszczonyponiżej.

12 #include <iostream>34 using namespace std ;56 int main ( ){ // funkc ja main () r ep re z en tu j aca program glowny78 // pr zyk l ad d e k l a r a c j i zmiennych ca l kow i t y ch i , j , k9

10 int i , j , k ;1112 // za zmienna i oraz j podstawiamy war to sc i wczytane z k l aw ia tu ry13 // poprzez opera tor14 // strumieniowy cin1516 cout<<"wpisz wartosc caklowita i=" ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 4 Materiał dystrybuowany bezpłatnie

Page 5: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.2 Inne programy Przykłady programowania w C++ - kurs podstawowy

17 cin>>i ;18 cout<<"wpisz wartosc calkowita j=" ;19 cin>>j ;2021 cout<<endl ; //dodajemy znak p r z e j s c i a do nowej l i n i i2223 //wynik dodawania i+j wypiszemy na ekran ie2425 k=i+j ;2627 cout<<"i+j = "<<k<<endl<<endl ;2829 //wydruk j e s z c z e raz i n a c z e j zap i sany3031 cout<<i<<" + "<<j<<" = "<< k <<endl ;3233 return 0 ;34 }

Na zmiennych możemy dokonywać różne działania arytmetyczne. Zmienne rzeczywiste przy-bliżamy reprezentacją zmiennoprzecinkową m.in. typem float lub double. Nie można dokładniereprezentować liczb rzeczywistych ponieważ mamy skończoną pojemność na reprezentację man-tysy i cechy. Informacje o pojemności różnych przykładowych typów zmiennych numerycznychmożna otrzymać przy pomocy programu pojemnosci.cc, którego tekst zamieszczamy poniżej.

12 #include <iostream>34 using namespace std ;567 int main ( ){89 int a , b , c ; // pr zyk l ad d e k l a r a c j i typu ca l kow i t e go

1011 cout<<" Typ int wymaga "<<s izeof ( int)<<" bajtow"<<endl ;12 // f−c ja s i z e o f ( ) podaje pojemnosc typu numerycznego w argumencie1314 long int d=10; // pr zyk l ad d e k l a r a c j i d l u g i e j l i c z b y ca l k .1516 cout<<" Typ long int wymaga "<<s izeof ( long)<<" bajtow"<<endl ;1718 f loat f =1.5 ; // pr zyk l ad d e k l a r a c j i typu zmiennoprzecinkowego19 //w po j edync ze j p r e c y z j i2021 cout<<" Typ float wymaga "<<s izeof ( f loat)<<" bajtow"<<endl ;2223 double g =1.42; // typ zmiennoprzecinkowy w podwojnej p r e c y z j i .2425 cout<<" Typ double wymaga "<<s izeof (double)<<" bajtow"<<endl ;2627 long double h=2.1;2829 cout<<" Typ long double wymaga "<<s izeof ( long double)<<" bajtow"<<endl ;3031 char znak=’q’ ; // typ znakowy32 cout<<" Typ char wymaga "<<s izeof (char)<<" bajtow"<<endl ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 5 Materiał dystrybuowany bezpłatnie

Page 6: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.2 Inne programy Przykłady programowania w C++ - kurs podstawowy

33 return 0 ;34 }

Po skompilowaniu i uruchomieniu tego programu np. na 32 bitowym komputerze dowiemy się,że pojemność zmiennej typu numerycznego double wymaga 12 bajtow a typu float 8 bajtow.Typ int wymaga 4 bajty pamieci.Uwaga: do dzisiaj nie ma standardu zachowania pojemności danego typu numerycznego i

może zdarzyć się że na niektórych komputerach te pojemności będą inne. Często jest to przyczynąwpadek programistów. Nie jest tak w języku JAVA gdzie standard typu numerycznego jest wszędzietaki sam.

Niektóre działania na liczbach rzeczywistych, np. wzięcie pierwiastka kwadratowego czy teżwyliczenie funkcji sinus() wymaga włączenia do kodu pisanego programu specjalnej bibliotekimatematycznej. Zobacz przykład matematyczne.cc poniżej.

1 #include <iostream>2 #include <cmath> // do l a c z en i e b i b l i o t e k i matematycznej34 using namespace std ;56 int main ( ){78 double a , b ;9

10 cout<<"Wprowadz jakas wartosc numeryczna a= " ;11 cin>>a ; //wpisujemy z k l aw ia tu ry np . −12.541213 cout<<"wpisano a= "<<a<<endl ;1415 b=s q r t ( a ) ; // j e s l i a ujemne bed z i e b l ad16 cout<<"Pierwiastek("<<a<<")= "<<b<<endl ;1718 b=pow( a , 1 . 0 / 3 . 0 ) ; // funkc ja pow ()19 //uwaga , wpisanie samego 1/3 spowoduje z ao k r a g l en i e20 //do c z e s c i c a l k ow i t e j t u t a j do zera21 //a wiec t r z e b a wpisac przynajmnie j22 //w jednym mscu kropke , np . 1./32324 cout<<"Pierwiastek_trzeciego_stopnia("<<a<<")= "<<b<<endl ;2526 b=s i n ( a ∗ 2 . 5 ) ;27 cout<<"sin("<<(a ∗2 . 5 ) << ")="<<b<<endl ;2829 b=log ( a ) ; //argument musi byc dodatn i30 cout<<"Logarytm naturalny("<<a<<")= "<<b<<endl ;313233 return 0 ;34 }

W tym przypadku kompilacja programu matematyczne.cc odbywa się tak samo jak w poprzed-nich przykładach. W dalszych przykładach mogą zdarzać się biblioteki, które bedą wymagałyjawnego ich podania przy kompilacji, np. biblioteki z grafiką.

Domyślnie wynik działania na zmiennych zmiennoprzecinkowych jest zaokrąglony co możeprowadzić do błędów interpretacyjnych. Dlatego w przypadku konieczności trzymania precyzjinumerycznej na wydruku wartości zmiennej lub żądania innego formatowanego wyjścia można

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 6 Materiał dystrybuowany bezpłatnie

Page 7: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.2 Inne programy Przykłady programowania w C++ - kurs podstawowy

skorzystać z biblioteki iomanip.h. Przykład programu korzystającego z formatowanego wyjściajest poniżej.

1 #include <iostream>2 #include <cmath>3 #include <iomanip> // b i b l i o t e k a iomanip . h45 using namespace std ;67 int main ( ){89 double a , c ;

10 c=M PI ; //wartosc l i c z bowa p i =3 .1415 . . . z b i b l i o t e k i matematycznej11 a=5000.0∗ s i n ( c / 4 . 0 ) ;121314 cout<<"domyslny zapis na wyjsciu wartosci zmiennej a"<<endl ;15 cout<<a<<endl ; //domyslny wydruk1617 cout<<"zapis zmiennej a przy uzyciu biblioteki iomanip.h z dokladnoscia" ;18 cout<<"do 12 miejsc dokladnych po kropce dziesietnej"<<endl ;19 cout<<s e t p r e c i s i o n (12)<<a<<endl ;202122 cout<<"zapis zmiennej a przy uzyciu biblioteki iomanip.h z zadana " ;23 cout<<"iloscia miejsca na wypisanie tej zmiennej"<<endl ;24 cout<<s e t p r e c i s i o n (4)<< s e t f i l l (’*’)<<setw(10)<<a<<endl ;25 //wolne miejsca wypelnione gwiazdkami do s z e ro ko s c i 1026 // t u t a j s e t f i l l ( ) u s t a l a znak wype ln ia jacy po l e27 // setw () u s t a l a s z e roko sc po la28 cout<<s e t p r e c i s i o n (9)<< s e t f i l l (’ ’)<<setw(10)<<a<<endl ;29 //wolne miejsca wypelnione spac ja do s z e ro ko s c i 1030 return 0 ;31 }

Jako kolejny przykład rozważymy program wyliczający sumę i iloczyn N liczb ai któreprzyjmują wartości losowe z przedziału [0, 1). Wykorzystane zostaną pętle for. Pierwszy z nichzlicza losową sumę

suma =N∑i=1

ai = a1 + a2 + . . .+ aN (1)

i korzysta do generowania liczb pseudolosowych ai z systemowej funkcji random(). W programieużyta została również funkcja srandom() której argumentem jest liczba całkowita bedąca star-tem dla tego generatora. Jeśli jej nie użyjemy w naszym programie to funkcja random() bedziezawsze generować tą samą sekwencje losową. Kod tego programu jest umieszczony poniżej.

1 #include <iostream>2 #include <c s t d l i b > // ta b i b l i o t e k a b ed z i e potrzebna3 //do genera tora l i c z b pseudolosowych45 using namespace std ;67 int main ( ){89 int s t a r t ;

10 cout<<"liczba calkowita start dla generatora liczb losowych start= " ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 7 Materiał dystrybuowany bezpłatnie

Page 8: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.2 Inne programy Przykłady programowania w C++ - kurs podstawowy

11 cin>>s t a r t ;12 srandom ( s t a r t ) ; // i n i c j u j e genera tor l i c z b losowych , t u t a j13 // f u k c j e random ()14 // domyslnie s t a r t = 115 //a wiec j e s l i n ie damy tego po l e c en ia to c iag16 // l i c z b losowych17 // uzyskiwanych z f u n k c j i random bed z i e zawsze18 // powtarza l s i e19 //po kazdym uruchomieniu programu202122 int N; // i l e l i c z b dodac232425 cout<<"Sumujemy N losowych wartosci rzeczywistych z przedzialu [0,1)"<<endl ;26 cout<<"Podaj wartosc N=" ;2728 cin>>N;2930 double suma=0.0; // t r z e b a pamietac o wyzerowaniu zmiennej suma31 double rnd ; //zmienna , k tora b ed z i e l i c z b a losowa3233 for ( int i =0; i<N; i ++){34 rnd=(rand ()/(1 .0+RAND MAX) ) ; // zmiennej rnd przyp isu jemy35 //wartosc losowa36 // funkc ja rand () zwraca war to sc i c a l k ow i t e37 // z p r z e d z i a l u [ 0 ,RANDMAX]38 suma+=rnd ; // to samo co suma=suma+rnd39 }4041 cout<<"suma "<<N<<" losowych wartosci rzeczywistych wyniosla "<<suma<<endl ;4243 return 0 ;44 }

Podobny program ale dla iloczynu N liczb losowych

iloczyn = ΠNi=1ai = a1 × a2 × . . .× aN (2)

jest poniżej.

1 #include <iostream>2 #include <c s t d l i b > // ta b i b l i o t e k a b ed z i e potrzebna3 //do genera tora l i c z b pseudolosowych45 using namespace std ;67 int main ( ){89 int s t a r t ;

10 cout<<"liczba calkowita start dla generatora liczb losowych start= " ;11 cin>>s t a r t ;12 srandom ( s t a r t ) ; // i n i c j u j e genera tor l i c z b losowych , t u t a j13 // f u k c j e random ()14 // domyslnie s t a r t = 115 //a wiec j e s l i n ie damy tego po l e c en ia to c iag16 // l i c z b losowych

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 8 Materiał dystrybuowany bezpłatnie

Page 9: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.2 Inne programy Przykłady programowania w C++ - kurs podstawowy

17 // uzyskiwanych z f u n k c j i random bed z i e zawsze18 // powtarza l s i e19 //po kazdym uruchomieniu programu202122 int N; // i l e l i c z b pomnozyc232425 cout<<"Mnozymy N losowych wartosci rzeczywistych z przedzialu [0,1)"<<endl ;26 cout<<"Podaj wartosc N=" ;2728 cin>>N;2930 double i l o c z y n =1.0; // t r z e b a pamietac zeby na poczatku i l o c z yn=131 double rnd ; //zmienna , k tora b ed z i e l i c z b a losowa3233 for ( int i =0; i<N; i ++){34 rnd=(rand ()/(1 .0+RAND MAX) ) ; // zmiennej rnd przyp isu jemy35 //wartosc losowa36 // funkc ja rand () zwraca war to sc i c a l k ow i t e37 // z p r z e d z i a l u [ 0 ,RANDMAX]38 i l o c z y∗=rnd ; // to samo co i l o c z yn=i l o c z yn ∗rnd39 }4041 cout<<"iloczyn "<<N<<" losowych wartosci rzeczywistych wyniosl "<<i l o c zyn <<endl ;4243 return 0 ;44 }

Kolejny przykład który rozważymy dotyczy generowania liczb pierwszych gdzie wykorzystujesię różne postaci operacji dzielenia całkowitego. Jest to program liczby pierwsze.

1 #include <iostream>23 using namespace std ;456 int main ( ){78 long n ,N;9

10 cout<<"Wypisuje kolejne liczby pierwsze 2, 3, 5, ..." ;11 cout<<"sposrod zadanej liczby N liczb naturalnych"<<endl ;12 cout<<"Podaj wartosc calkowita N=" ;13 cin>>N;14 cout<<endl ;15161718 // p e t l a f o r wypisu jaca k o l e j n e l i c z b y natura lne i od 2 do N1920 for ( long i =2; i<=N; i ++){21 i f ( i ==2){22 cout<<i<<endl ;23 } else {2425 //druga p e t l a indeksowana zmienna n

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 9 Materiał dystrybuowany bezpłatnie

Page 10: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.3 Konwersje typów zmiennych Przykłady programowania w C++ - kurs podstawowy

26 for (n=2;n<i ; n++){ // t u t a j n ie dek larujemy n w p e t l i27 // bo j e s t j u z28 // zadek larowane wcze sn i e j zaraz29 //na poczatku30 // f u n k c j i main ()3132 i f ( ! ( i%n ) ) break ; //przerywamy d z i a l a n i e33 // p e t l i34 //bo j e s t l i c z b a n pr ze z35 // k tora36 //mozna p o d z i e l i c l i c z b e i3738 }3940 i f (n==i ){ // to znaczy ze nie zna l e z l i smy t a k i e j41 // l i c z b y n prze z42 // k tora d z i e l i s i e l i c z b a i43 cout<<i<<endl ; //wypisujemy wartosc i44 }454647 }48 }4950 return 0 ;51 }

1.3 Konwersje typów zmiennych

Trzeba pamietać, że typy numeryczne bardzo różnią się od siebie. Na przykład jak rozumiećdodanie liczby całkowitej do rzeczywistej? Zwykle kompilator sam wykonuje za nas ciężką pracękonwersji typu zmiennej. Nieraz trzeba mu pomóc. Zasada jest nastepująca jeśli mamy operatorprzypisania (znak ”=”) to typ prawego jego argumentu konwertowany jest do typu lewego jegoargumentu. Na przykład jeśli mamy deklaracje:

1 int k=2;2 double a =4.54;3 double d=a∗k ;

to wynik a ∗ k bedzie typu double - kompilator sam zadba o konwersję - i tym samym wartośćzmiennej d bedzie prawidłowa tj. typu double. Czasem trzeba konwersję wymusić. Na przykład:

1 double a =4.54;2 int k = ( int ) a ; // konwersja typu doub le do typu i n t

Trzeba uważać aby nie zrobić błędów konwersji. Powiedzmy, że chcemy wyliczyć 21/5.

1 int k=2;2 double a=pow(k , 1 / 5 ) ; //wynikiem bed z i e a=1 bo 1/5 b ed z i e rowne zero3 //uwaga , kon i e c zn i e do l ac zyc b i b l i o t e k e matematyczna4 double b=pow(k , 1 . / 5 ) ; // b ed z i e dobrze bo nas tap i konwersja to5 // typu doub le w wyk ladniku po t e g i

Zauważmy, ze znaki (dane typu char) to też liczby. Można więc napisać polecenia:

1 int j=’a’+1;2 cout<<j<<endl ; //wynikiem bed z i e 98 bo numer ko l e j n y znaku ’ a ’ j e s t 97

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 10 Materiał dystrybuowany bezpłatnie

Page 11: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.4 Rysowanie gwiazdek, pliki ppm Przykłady programowania w C++ - kurs podstawowy

3 char z=(char ) j ; // konwersja zmiennej c a l k ow i t e j j na typ znakowy char4 cout<<z<<endl ; //wynikiem bed z i e znak b , podobnie ’ a ’+2 to znak ’ c ’ i t d .

Zadaniem programu poniżej jest drukowanie znaków bedących wynikiem konwersji pierw-szych 256 liczb całkowitych na typ znakowy.

1 #include <iostream>2 #include <c s t d l i b >34 using namespace std ;56 int main ( ){78 char InnyZnak ;9 char KONTYNUUJ;

1011 for ( int i =0; i <256; i ++){ // p e t l a f o r1213 KONTYNUUJ=’\0’ ;1415 InnyZnak=(char ) i ;161718 cout<<i<<"\t"<<InnyZnak<<endl ;19 i f ( ! ( i %10)){20 cout<<"----------------------------------------"<<endl ;21 cout<<"Nacisnij klawisz z litera c aby kontynuowac"<<endl ;22 while (KONTYNUUJ != ’c’ ) c in>>KONTYNUUJ;23 cout<<"----------------------------------------"<<endl ;24 cout<<"nr \t symbol"<<endl ;25 }26 }2728 return 0 ;29 }

1.4 Rysowanie gwiazdek, pliki ppm

Zanim przejdziemy do pisania programów graficznych przeanalizujemy proste programy do ro-bienia grafiki rastrowej. Zacznijmy od trybu znakowego. Poniżej jest program, gwiazdki.cc, któryrysuje na ekranie gwiazdki o zadanej wysokości N liczby gwiazdek.

1 //program ry su j e gw iazdk i na ekran ie2 #include <iostream>34 using namespace std ;56 int main ( ){7 int n ;8 cout<<"Podaj wartosci n=" ;9 c in>>n ;

1011 // pon i z e j sa dwie p e t l e f o r ( ) k t o r e indeksowane sa12 // odpowiednio pr ze z zmienna i oraz j .13 //Zmienna i do tyczyc b ed z i e w ie r s zy a zmienna j kolumn14 for ( int i =0; i<n ; i ++){

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 11 Materiał dystrybuowany bezpłatnie

Page 12: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.4 Rysowanie gwiazdek, pliki ppm Przykłady programowania w C++ - kurs podstawowy

15 for ( int j =0; j<=i ; j++){16 cout<<"*" ;17 }18 cout<<endl ;19 }2021 return 0 ;22 }

Kolejny program, gwiazdki2.cc, rysuje choinkę z gwiazdek.

1 #include <iostream>2 #include <c s t d l i b >34 using namespace std ;56 int main ( int argc , char ∗∗ argv ){7 int n ;8 cout<<"Wprowadz wysokosc choinki " ;9 c in >>n ;

10 cout<<endl ;11121314 int j =1;1516 for ( int k=0;k<n/2−1;k++) cout<<"-" ;17 cout<<"X" ;18 for ( int k=n/2+1;k<n ; k++) cout<<"-" ;19 cout<<endl ;202122 for ( int i =0; i<n ; i ++){23 i f ( j<n/2){24 for ( int k=0;k<n/2−1− j ; k++) cout<<"-" ;2526 for ( int k=n/2−1− j ; k<n/2−1;k++) cout<<"X" ;27 cout<<"|" ;28 for ( int k=n/2+1;k<n/2+1+j ; k++) cout<<"X" ;2930 for ( int k=n/2+1+j ; k<n ; k++) cout<<"-" ;31 cout<<endl ;32 i f ( j<n/2) j++;33 }34 else {35 i f ( i<n/2+1){36 for ( int k=0;k<n/2−1;k++) cout<<"-" ;37 cout<<"|" ;38 for ( int k=n/2+1;k<n ; k++) cout<<"-" ;39 cout<<endl ;40 }4142 }434445 }46

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 12 Materiał dystrybuowany bezpłatnie

Page 13: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.4 Rysowanie gwiazdek, pliki ppm Przykłady programowania w C++ - kurs podstawowy

47 cout<<endl ;48 return 0 ;49 }

Zamiast rysować znaki na ekranie można skorzystać z grafiki ppm. Jest to grafika rastrowa wktórej obraz zapisany jest na siatce NxM pikseli przy czym kolor każdego piksela definiowany jestosobno jako trojka RGB gdzie każda z liczb R, G i B reprezentuje głębię koloru w skali [0,255].Litery R, G i B oznaczają kolory czerwony, zielony i niebieski. Plik ppm możemy stworzyć przypomocy edytora tekstu ale też mozna napisać program komputerowy zapisujący obraz do pliku.Przykładowy plik, który np. nazwijmy ekran1.ppm może wyglądać nastepująco:

P32 2255255 0 00 255 00 255 0255 0 0

gdzie P3 w pierwszym wierszu oznacza rodzaj grafiki, dwie liczby calkowite w drugim wierszu toliczba kolumn i wierszy naszego obrazka (tutaj są dwa wiersze i dwie kolumny czyli 4 piksele),potem skala kolorów a następnie w kolejnych wierszach są głebie kolorów RGB reprezentującychpiksele - dwa czerwone i dwa zielone. Im wiecej pikseli tym dokładniejszy i wiekszy jest rysunek.Poniżej jest program czterykolory.cc który ma już 100× 100 kwadratów.

1 #include <iostream>2 using namespace std ;345 int main ( ){67 //Najpierw piszemy symbol P3 k tory oznaczac b ed z i e ze ko l o ry8 // beda kodowane w ASCII9

10 cout<<"P3"<<endl ;1112 //potem piszemy dwie l i c z b y ca l k ow i t e N M repre z en tu j a c e13 // odpowiednio l i c z b e kolumn i l i c z b e w ie r s zy obrazka14 //np . 100 10015 // c z y l i N=100 i M=10016 //17 int N=100 , M=100;18 cout<<N<<" "<<M<<endl ;1920 //W ko l e j n e e j l i n i i po lecen piszemy maksymalna l i c z b e kolorow 2552122 cout<<255<<endl ;2324 //Nastepnie piszemy t r o j k i RGB l i c z b ca l kow i t y ch25 // z p r z e d z i a l u [ 0 , 255 ] o l i c z b i e t r o j e k rownej NxM26 //w przypadku N=M=100 10000 kwadratow2728 for ( int i =0; i<M; i ++){2930 i f ( i<M/2){

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 13 Materiał dystrybuowany bezpłatnie

Page 14: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.4 Rysowanie gwiazdek, pliki ppm Przykłady programowania w C++ - kurs podstawowy

31 for ( int j =0; j<N; j ++){32 i f ( j<N/2) cout<<255<<" "<<0<<" "<<0<<endl ;33 else cout<<0<<" "<<255<<" "<<0<<endl ;34 }35 } else {3637 for ( int j =0; j<N; j ++){38 i f ( j<N/2) cout<<0<<" "<<255<<" "<<0<<endl ;39 else cout<<255<<" "<<0<<" "<<0<<endl ;40 }41424344 }4546 }4748 return 0 ;49 }

Wynik działania tego programu przekierujemy do pliku tekstowego z rozszerzeniem .ppmzamiast na ekran jak to było w poprzednich kodach programów.

./czterykolory.exe > ekran2.ppm

W wyniku pojawi się na dysku plik ekran2.ppm który możemy oglądać dowolnym programemgraficznym - również w systemie Windows. Obrazek, który nam się pojawi ma postać jak naponiższym rysunku.

Rysunek 1:

Ta samą techniką generowania plików ppm można zrobić choinkę jak na kolejnym rysunku. Wtym przypadku kod programu jest nastepujący.

1 #include <iostream>2 #include <c s t d l i b > //nowa b i b l i o t e k a − skorzystamy z n i e j3 //do generowania l i c z b losowych45 using namespace std ;67 int main ( int argc , char ∗∗ argv ){89

10 //Najpierw piszemy symbol P3 k tory oznaczac b ed z i e ze ko l o ry11 // beda kodowane w ASCII1213 cout<<"P3"<<endl ;14

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 14 Materiał dystrybuowany bezpłatnie

Page 15: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.4 Rysowanie gwiazdek, pliki ppm Przykłady programowania w C++ - kurs podstawowy

15 //potem piszemy dwie l i c z b y ca l k ow i t e N M repre z en tu j a c e16 // odpowiednio l i c z b e kolumn i l i c z b e w ie r s zy obrazka17 //np . 100 10018 // c z y l i N=400 i M=10019 //20 int N=1000 , M=1001;21 cout<<M<<" "<<N<<endl ;22 //W ko l e j n e j l i n i i po lecen piszemy maksymalna l i c z b e kolorow 2552324 cout<<255<<endl ;2526 //Nastepnie piszemy t r o j k i RGB l i c z b ca l kow i t y ch27 // z p r z e d z i a l u [ 0 , 255 ] o l i c z b i e t r o j e k rownej NxM2829 int r , g , b ;3031 // p ierwszy w ie r s z32 for ( int k=0;k<M/2; k++) cout<<255<<" "<<0<<" "<<0<<endl ;33 cout<<0<<" "<<255<<" "<<0<<endl ;34 for ( int k=M/2+1;k<M; k++) cout<<255<<" "<<0<<" "<<0<<endl ;353637 // po z o s t a l e w i e r s z e38 for ( int i =1; i<N; i ++){39 i f ( i<N/2){40 for ( int k=0;k<M/2− i ; k++) cout<<255<<" "<<0<<" "<<0<<endl ;414243 for ( int k=M/2− i ; k<M/2; k++){44 // generujemy losowe war to sc i c a l k ow i t e g i b45 g=( int ) ( 256 . 0∗ rand ()/(1 .0+RAND MAX) ) ;46 //g j e s t l i c z b a pseudolosowa z przedz . [ 0 , 255 ]47 b=( int ) ( 256 . 0∗ rand ()/(1 .0+RAND MAX) ) ;48 //b j e s t l i c z b a pseudolosowa z przedz . [ 0 , 255 ]49 cout<<0<<" "<<g<<" "<<b<<endl ;50 }51 cout<<0<<" "<<10<<" "<<10<<endl ;525354 for ( int k=M/2+1;k<M/2+ i ; k++){55 g=( int ) ( 256 . 0∗ rand ()/(1 .0+RAND MAX) ) ;56 // l i c z b a pseudolosowa z przedz . [ 0 , 255 ]57 cout<<0<<" "<<g<<" "<<0<<endl ;58 }59 for ( int k=M/2+ i ; k<M; k++) cout<<255<<" "<<0<<" "<<0<<endl ;6061 }62 else {63 i f ( i<N/2+N/10){64 for ( int k=0;k<M/2; k++) cout<<255<<" "<<0<<" "<<0<<endl ;65 cout<<0<<" "<<10<<" "<<10<<endl ;66 for ( int k=M/2+1;k<M; k++) cout<<255<<" "<<0<<" "<<0<<endl ;6768 }69 else {70 for ( int k=0;k<M/2; k++) cout<<255<<" "<<0<<" "<<0<<endl ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 15 Materiał dystrybuowany bezpłatnie

Page 16: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.5 Instrukcje sterujące Przykłady programowania w C++ - kurs podstawowy

71 cout<<255<<" "<<0<<" "<<0<<endl ;72 for ( int k=M/2+1;k<M; k++) cout<<255<<" "<<0<<" "<<0<<endl ;7374 }75 }76 }777879 return 0 ;80 }

Rysunek 2:

1.5 Instrukcje sterujące

W kilku poprzednich programach korzystaliśmy z instrukcji warunkowej if. Składnia tego pole-cenia ma postać

if (wyrażenie) polecenie ;

np.

1 i f ( a<=0.5 && a>=−0.5) cout<<a<<endl ; // j e s l i wyrazenie w nawias ie ma wartosc2 // rozna od zera to wykonane z o s t an i e po l e c en i e cout .3 //Nastapi to j e s l i a>=0.5 i j ednoc z e sn i e a>=−5.4 // ( symbol && oznacza l o g i c z na koniunkc je ) .5 // J e s l i wartosc ta j e s t rowna zero ( c z y l i zmienna6 //a nie j e s t w zadanym p r z e d z i a l e ) to po l e c en i e7 // cout nie b ed z i e wykonane .

Jeśli zamiast jednego polecenia polecenia (w powyższym przykładzie mamy jedno polece-nie cout) mamy kilka to musimy je objąć nawiasami klamrowymi. Opcjonalnie możemy miećkilka wariantów wykonania warunku w nawiasach okrągłych. Wtedy te warianty realizowane sąpoprzez else, np.

1 i f ( a<=0.5 && a>=−0.5){

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 16 Materiał dystrybuowany bezpłatnie

Page 17: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.5 Instrukcje sterujące Przykłady programowania w C++ - kurs podstawowy

2 b=a∗a ; // przyk ladowe dwie i n s t r u k c j e3 cout<<a<<endl ; // p ierwszego wariantu4 } else { // pocza tek drug iego wariantu5 cout<<"Jestes poza przedzialem [-0.5,0.5]"<<endl ;6 }

Wyrażenia w nawiasach można łączyć logicznie w jedno wyrażenie przy pomocy operatorówlogicznych: ==, ! =, ||, && reprezentujących odpowiednio operator porównania (np. if(a == 0.5)),operator negacji (np. if(a! = 0.5)) czyli jeśli a jest różne od 0.5), operator alternatywy(np. if((a < 0.5) || (a > 3.5))) czyli albo a < 0.5 albo a > 3.5) i operator koniunkcji(np. if((a < 0.5) && (a > 3.5))) czyli a < 0.5 i a > 3.5).

Często w programach można spotkać operator warunkowy ?:. Ma on trzy argummety:wyrażenie1, wyrażenie2 i wyrażenie3 a jego składnia jest nastepująca

wyrażenie1 ? wyrażenie2 : wyrażenie3

. Sens jego uzycia można zobaczyć na poniższym przykładzie:

1 double a , b , c ;2 c in >> a >> b ;3 c = (b<0.0) ? a−b : a+b ; // j e s l i b<0 to c=a−b w przeciwnym ra z i e c=a+b

To samo tradycyjnie przy pomocy instrukcji if.

1 double a , b , c ;2 c in >> a >> b ;3 i f (b<0.0) c=a−b ;4 else c=b+a ;

Innym przypadkiem instrukcji sterującej jest instrukcja switch, którą stosuje się zamiastwielokrotnego stosowania wielowariantowych instrukcji if i else. Składnia tej instrukcji jestnastępująca

switch (wyrażenie) lista wariantów poleceń

. Wyrażenie jest typu int lub char. Na przykład niech zmienna n będzie typu int i niech jejwartość oznacza wybór odpowiedniego dnia tygodnia.

1 int n ;2 c in >> n ;3 switch (n){4 case 1 : cout<<"Pon" ; break ; // po l e c en i e break konczy wariant5 case 2 : cout<<"Wto" ; break ; // i nie pozwala na p r z e j s c i e do6 case 3 : cout<<"Sro" ; break ; // ko l e j n e go wariantu7 case 4 : cout<<"Czw" ; break ;8 case 5 : cout<<"Pia" ; break ;9 case 6 : cout<<"Sob" ; break ;

10 case 7 : cout<<"Nie" ; break ;11 default : cout<<"nie ma takiego dnia"<<endl ;12 }

W przypadku zmiennej typu znakowego przykładowe polecenie sterujące mogłoby mieć po-stać:

1 char z ;2 c in >> z ;3 switch ( z ){4 case ’a’ : cout<<"Poprawna odpowiedz" ; break ; // po l e c en i e break konczy wariant5 case ’b’ : cout<<"zla odpowiedz" ; break ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 17 Materiał dystrybuowany bezpłatnie

Page 18: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.6 Pętle iteracyjne Przykłady programowania w C++ - kurs podstawowy

6 default : // wpisanie t e j o p c j i z a b e zp i e c z a przed sy tuac j a7 // k i edy wpisany z o s t a l b y inny znak8 }

Uwaga, w przypadku wpisywania znaków lub liczb do instrukcji sterujących można skorzy-stać z bibliotek systemowych, które zadbają o to aby np. wpisany przez nas znak z klawiaturybył cyfrą lub małą literą itp. Są to funkcje isalnum, isalpha, isascii, isblank, iscntrl, isdigit,isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit. Przykładowe użycie pokazane jest wponiższym przykładzie. W przypadku Linuksa opis tych funkcji jest dostępny poprzez manpages(trzeba je zainstalować) np. pisząc w konsoli polecenie man isalpha.

1 #include <iostream>2 using namespace std ;34 int main ( ){56 char z ;78 POWTORZ: // e t y k i e t a d la po l e c en ia goto9

10 cout<<"wpisz litere alfabetu"<<endl ;11 cin>>z ;12 i f ( i s a l p h a ( z ) ) ; // sprawdza czy znak j e s t a l f a b e t y c z n y13 else {14 cout<<"Nie jest to litera alfabetu"<<endl ;15 goto POWTORZ; // po l e c en i e skoku do mie jsca16 //w programie za e t y k i e t a POWTORZ17 }1819 return 0 ;20 }

Zwykle programiści C++ unikają polecenia goto. Osobiście uważam, że czasem wygodniejest z niego skorzystać.

1.6 Pętle iteracyjne

W powyższych przykładach stosowaliśmy różnego rodzaju pętle iteracyjne, głównie pętle for.Instrukcja for ma nastepującą składnię:

for(wyrażenie1; wyrażenie2; wyrażenie3) polecenia

gdzie każde wyrażenie jest opcjonalne. Na przykład nieskończenie długo działająca pętla for mapostać

for(;;) polecenia

. Jeśli wyrażenie2 ma wartość 0 to instrukcja for kończy działanie. Pętle for z dodatkowąmożliwością przerwania jej działania lub kontynuacji jej działania z pominięciem niektórychelementów petli można obejrzeć w przykładach poniżej.

1 // p ierwsza p e t l a2 suma=0;3 int q ; // de k l a r a c j a na zewnatrz p e t l i poniewaz korzystamy4 // z war to sc i q poza p e t l a i t e r a c y j n a5 for ( q=0;q<=10;q++) suma+=q ;6 cout<<q<<"Wartosc zmiennej suma= "<<suma<<endl ;7

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 18 Materiał dystrybuowany bezpłatnie

Page 19: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.6 Pętle iteracyjne Przykłady programowania w C++ - kurs podstawowy

8 //druga p e t l a9 suma=0;

10 for ( q=10;q>=0;q−−) suma+=q ;11 cout<<q<<Wartosc zmiennej suma= "<<suma<<endl;1213 //trzecia petla14 for(q=0;q<10;q++){15 if(q==5) break; //przerywamy dzialanie petli16 cout<<"wartosc q wewnatrz p e t l i , q= "<<q<<endl;17 }18 cout<<"wartosc q poza pet la , q= "<<q<<endl;19 //czwarta petla20 for(q=0;q<10;q++){21 if(q==5) continue; //dla q==5 pominiete zostana22 //polecenia ponizej23 cout<<"wartosc q wewnatrz p e t l i , q= "<<q<<endl;24 }25 cout<<"wartosc q poza pet la , q= "<<q<<endl;

Przerywać pętle iteracyjne można też przy pomocy polecenia goto. Pętle for mogą byćzłożone jak w przykładzie poniżej.

1 const int N=8;2 char z ;34 char A[N]="program" ; //odwrocimy t e k s t5 for ( int i =0; i<N; i++) cout<<A[ i ] ; //wydruk t e k s t u na ekran ie6 cout<<endl ;78 for ( int i =0, j=N−1; i<j ; i ++,j−−){ // pr z ec inek j e s t operatorem po l ac z en ia9 z=A[ i ] ;

10 A[ i ]=A[ j ] ;11 A[ j ]=z ;12 }1314 for ( int i =0; i<N; i++) cout<<A[ i ] ; //wydruk odwroconego t e k s t u15 cout<<endl ; //na ekran ie

Inne przykłady pętli to instrukcje while() i do while().

1 // p ierwsza p e t l a2 int q=0;3 while (q<10){ // tes towane j e s t wyrazenie w nawiasach okrag l ych4 //np . wh i l e (1) oznacza nieskonczona p e t l e5 cout<<q<<endl ;6 q++;7 }89 //druga p e t l a

10 int q=0;11 do{12 cout<<q<<endl ;13 q++;14 }while (q<10); //zauwazmy ze p e t l a do wh i l e ( ) musi15 // byc wykonana co najmniej jeden raz

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 19 Materiał dystrybuowany bezpłatnie

Page 20: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.7 Funkcje Przykłady programowania w C++ - kurs podstawowy

1.7 Funkcje

Do tej pory niektóre nasze programy miały fragmenty kodu, które niepotrzebnie powtarzały się.Załóżmy, że chcemy napisać program na potegowanie liczb całkowitych. Można to zrobić jak wprzykładzie funkcja1.cc poniżej.

1 //Przyk lad programu z funkc ja2 #include <iostream>3 using namespace std ;45 long int potega ( long int aa , int w){ //Tutaj zde f in i owa l i smy funkc j e6 //Mozna t e z by l o zadek larowac pro to typ7 // f u n k c j i a j e j t r e s c napisac pod funkc ja main ()89 long int wynik=1;

1011 int i =0;12 while ( i<w){13 wynik∗=aa ;14 i ++;15 }1617 return wynik ;18 }192021 int main ( ){ // funkc ja glowna2223 long int a=5,b ;2425 b=potega ( a , 3 ) ; //wywolujemy funkc j e potega i przyp isu jemy26 // j e j wartosc zmiennej b27 cout<<a<<"^3= "<<b<<endl ; //wydruk war to sc i f u n k c j i2829 a=2;30 b=potega ( a , 4 ) ; // ko l e j n y raz wywolana func ja potega ()31 cout<<a<<"^4= "<<b<<endl ; //wydruk war to sc i f u n k c j i3233 return 0 ;34 }

Inny przykład funkcji w przykładzie funkcja2.cc, funkcja która wywołuje siebie samą.

1 #include <iostream>2 using namespace std ;34 long s i l n i a ( long n){ // pr zyk l ad f−c j i r e kurency jne j5 long wynik=1;67 i f (n>0){8 wynik∗=n∗ s i l n i a (n−1);9 }

1011 return wynik ;12 }1314 int main ( ){15 long int k ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 20 Materiał dystrybuowany bezpłatnie

Page 21: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.7 Funkcje Przykłady programowania w C++ - kurs podstawowy

16 cout<<"Wpisz wartosc k=" ;17 cin>>k ;18 cout<<endl ;1920 cout<<"Wynik "<<k<<"!= "<<s i l n i a ( k)<<endl ;21 return 0 ;22 }

Z kolei bardziej wyrafinowany przykład kod.cc z funkcją konwertującą dziesiętną liczbę cał-kowitą na jej binarny odpowiednik.

1 #include <iostream>2 #include <s t d l i b . h>34 using namespace std ;567 void i n t e g e r t o s t r i n g ( int xx , char ∗ lanc , int nn , int DLUG){8 long x=xx ;9 int l=DLUG−1;

10 long n = nn ;11 int j ;1213 for ( j =0; j<DLUG; j++) ∗( lanc+j )=’0’ ;14 ∗( lanc+DLUG)=’\0’ ;1516 i f ( ! x ) ;17 else18 {19 do20 {21 ∗( lanc+l )=’0’+x % n ;2223 x/=n ;2425 l−−;26 } while ( x ) ;27 for ( j =0; j<l ; j++) ∗( lanc+j )=’0’ ;28 ∗( lanc+DLUG)=’\0’ ;2930 }31 }323334 int main ( ){35 int N, L ;36 cout<<"Niech N i L liczby calkowite o wlasnosci N<2^L"<<endl ;37 cout<<"wpisz dwie liczby calkowite N L oddzielone spacja: " ;38 c in >> N >> L ;39 cout<<endl ;4041 char ∗LancuchBin ; // de k l a r a c j a wskaznika na znak42 //pod tym adresem bed z i e zapamietana43 // t a b l i c a r ep re z en tu jaca lancuch binarny44 // d la l i c z b y Regula 8−b i t owe j4546 LancuchBin=new char [ L ] ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 21 Materiał dystrybuowany bezpłatnie

Page 22: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.7 Funkcje Przykłady programowania w C++ - kurs podstawowy

4748 i n t e g e r t o s t r i n g (N, LancuchBin , 2 ,L ) ; //zamieniamy l i c z b e N na49 // lancuch b i towy5051 cout<<N<<"\t"<< LancuchBin<<endl ;52 return 0 ;53 }

W tym przykładzie użyliśmy dynamicznej alokacji tablicy LancuchBin[ ] - zob. podrozdział1.8

Na koniec podamy przykład gry komputerowej, której celem jest odgadnięcie wyrazu, doktórego komputer proponuje losowo dwie litery.

1 #include <iostream>2 #include <c s t d l i b >34 using namespace std ;56 void GenerujLosoweZnaki (char &z , char &zz ){ // dos tep poprzez argumenty7 // f u n k c j i w dwie s t rony8 int m, n ; // przy t a k i e j d e k l a r a c j i mozemy9 // zmieniac z , z z

10 m=n=0; // de k l a r a c j a wstepna1112 while (m==n){13 m=( int ) (256 .0∗ rand ( ) / (RAND MAX+1.0 ) ) ; z=(char ) m;14 n=( int ) (256 .0∗ rand ( ) / (RAND MAX+1.0 ) ) ; zz=(char ) n ;1516 i f ( ! ( i s l o w e r ( z ) && i s l o w e r ( zz ) ) ) m=n ;17 }1819 }2021 int main ( ){22 int N=100; // zakladamy ze wygenerowany wyraz ma maksymalnie 100 znakow23 char ∗W = new char [N ] ; //dynamiczna t a b l i c a na 100 znakow24 int Nstart ; // de k l a r a c j a zmiennej s t a r t owe j d la generatora25 // l i c z b losowych2627 cout<<"Podaj liczbe calkowita jako start generatora liczb losowych Nstart=" ;28 cin>>Nstart ;29 srandom ( Nstart ) ;3031 W[0]= ’\0’ ; // znak konca lancucha znakowego wstepnie przyp isu jemy pierwszemu32 // elementowi W[ 0 ] t a b l i c y W[ ]3334 int j =0; // indeks numerujacy znak i wprowadzanego wyrazu35 char znak , z , zz ;36 int n ,m;3738 while ( j<N){3940 GenerujLosoweZnaki ( z , zz ) ;41 cout<<"Wybierz znak "<<z<<" lub "<<zz<<" lub inny znak aby zakonczyc gre: " ;42 cin>>znak ;43 i f ( znak !=z && znak != zz ){44 cout<<"Koniec gry" ; return 0 ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 22 Materiał dystrybuowany bezpłatnie

Page 23: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

1.8 Dynamiczne alokacje pamięci Przykłady programowania w C++ - kurs podstawowy

45 } else {46 ∗(W+j )=znak ; ∗(W+j +1)=’\0’ ;47 cout<<endl<<"Dotychczasowy wyraz ma postac:"<<W<<endl ;4849 }5051 j ++;52 }535455 return 0 ;56 }

1.8 Dynamiczne alokacje pamięci

Często w trakcie pisania programu nie znamy rozmiaru tablicy danych, którą bedziemy używać.Wtedy taką tablicę alokujemy dynamicznie. Przykładowy program z alokacja dynamiczną tzw.wskaźnikami jest poniżej. Program pokazuje różne możliwości dynamicznej alokacji zmiennych.

1 #include <iostream>2 using namespace std ;34 int main ( ){56 int k=5; // de k l a r a c j a s t a t y c zna zmiennej typu i n t7 // i p r z yp i s an i e war to sc i t e j zmiennej89 //A t e r a z t roche i n a c z e j . . .

10 int ∗n ; // de k l a r a c j a wskaznika na typ i n t11 //Wtedy us ta l imy adres zmiennej n , a l e j e s z c z e t r z e b a12 // zarezerwowac d la t e j zmiennej t y l e pamieci i l e po t r z eba13 //na typ i n t .14 // i robimy to nas tepu jaco15 n=new int ; //Tutaj , zalokowana z o s t a l a pamiec o pojemnosci16 // prze znaczone j17 // d la typu i n t . Te dwa po l e c en ia mozna zap i sac t e z18 // jako jedno , l a c zn i e , t j . :19 // i n t ∗n=new in t ;20 //A t e r a z pod zadek larowany adres zmiennej n mozemy wpisac j e j wartosc :2122 ∗n=5;2324 //Wydrukujemy na ekran ie wartosc zmiennej k oraz n .25 cout<<"k= "<<k<<"\t"<<"n= "<<∗n<<endl ;2627 //Tutaj inny pr zyk l ad : dek larujemy wskaznik na i n t ( adres ) i28 // przypisu jemy go29 // adresowi zmiennej k ( s t a t y c z n e j ) .30 int ∗m= &k ;3132 cout<<"wartosc k= "<<k<<"\t"<<"wartosc m= "<<∗m<<endl ;3334 ∗m=2;35 cout<<"k= "<<k<<endl ;3637

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 23 Materiał dystrybuowany bezpłatnie

Page 24: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

Przykłady programowania w C++ - kurs podstawowy

38 int ∗ j ;39 j=n ;4041 cout<<"j= "<<∗j<<endl ;424344 int A[ 1 0 ] ; // de k l a r a c j a s t a t y c zna t a b l i c y 10 l i c z b ca l kow i t y ch4546 int ∗B=new int [ 1 0 ] ; // de k l a r a c j a dynamiczna , dek larujemy adres B47 // i alokujemy w sposob dynamiczny pamiec d la48 //10 l i c z b ca l kow i t y ch4950 int ∗C; // a t u t a j osobno , najp ierw de k l a r a c j a51 C=new int [ 1 0 ] ; //a potem a l o kac j a pamieci5253 for ( int q=0;q<10;q++){ //w p e t l i przypisu jemy war to sc i t a b l i c y A[ ] i B [ ]5455 A[ q]=q∗q ; // p ierwszy sposob56 ∗(B+q)=q∗q ; // drug i sposob575859 }606162 return 0 ;63 }

Do alokacji dynamicznych wrócimy już w przypadku późniejszych zadań. W szczególnościdotyczy to dynamicznej alokacji tablic wielowymiarowych.

2 Programowanie obiektowe

Przyjrzymy się dwóm wersjom programów napisanych w C++, z których pierwsza struktura.ccjest nieobiektowa a druga obiekt.cc obiektowa.

1 // wers ja n ieob i ek towa23 #include <iostream>4 #include <c s t d l i b >56 using namespace std ;78 int main ( ){9

10 struct Punkt{ // d e f i n i c j a typu zmiennej s t r u k t u r a l n e j11 double x , y ; // typu de f in iowanego pr ze z uzytkownika12 int ko lo r ;13 } ;1415 Punkt R; // de k l a r a c j a zmiennej typu Punkt1617 R. x=−0.15; // p r z yp i s an i e po lu x war to sc i l i c z b ow e j18 R. y =1.25; // p r z yp i s an i e po lu y war to sc i l i c z b ow e j19 R. ko l o r =12; // p r z yp i s an i e po lu ko l o r war to sc i l i c z b ow e j2021 cout<<R. x<<"\t"<<R. y<<"\t"<<R. kolor<<endl ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 24 Materiał dystrybuowany bezpłatnie

Page 25: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

Przykłady programowania w C++ - kurs podstawowy

2223 return 0 ;24 }

1 // wers ja ob iek towa23 #include <iostream>4 #include <c s t d l i b >56 using namespace std ;78 int main ( ){9

10 class Punkt{ // d e f i n i c j a typu zmiennej o b i e k t owe j11 double x , y ; // k l a s y zde f i n i owane j p r ze z uzytkownika12 int ko lo r ;13 } ;1415 Punkt R; // de k l a r a c j a o b i e k t u z k l a s y Punkt1617 R. x=−0.15; // p r z yp i s an i e po lu x war to sc i l i c z b ow e j18 R. y =1.25; // p r z yp i s an i e po lu y war to sc i l i c z b ow e j19 R. ko l o r =12; // p r z yp i s an i e po lu ko l o r war to sc i l i c z b ow e j2021 cout<<R. x<<"\t"<<R. y<<"\t"<<R. kolor<<endl ;2223 return 0 ;24 }

Na czym więc polegają różnice jeśli obie wersje są prawie identyczne - słowo struct zostałozastąpione słowem class. Różnice pojawią się jeśli zaczniemy modyfikować definicję klasy Punktwzbogacając ją o nowe możliwości jakie niosą ze sobą obiekty. Najpierw podzielimy pola klasyna prywatne i publiczne. W sekcji publicznej dodamy metody (czyli funkcje działające na rzeczobiektu danej klasy). Zmiany można zobaczyć w pliku obiekt2.cc.

1 // wers ja ob iek towa 223 #include <iostream>4 #include <c s t d l i b >56 using namespace std ;78 int main ( ){9

10 class Punkt{ // d e f i n i c j a k l a s y11 private : // dek larujemy pon i z s z e po la jako prywatne12 double x , y ; // c z y l i zabraniamy bezposredn iego dostepu do nich13 public : // pon i z e j1415 int ko lo r ; // t u t a j d e k l a r a c j a zmiennej w s e k c j i p u b l i c z n e j1617 void WpiszWartoscX (double xx ){x=xx ;}18 double WartoscX (){ return x ;}1920 void WpiszWartoscY (double yy ){y=yy ;}21 double WartoscY (){ return y ;}22 } ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 25 Materiał dystrybuowany bezpłatnie

Page 26: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

Przykłady programowania w C++ - kurs podstawowy

2324 Punkt R; // de k l a r a c j a o b i e k t u z k l a s y Punkt2526 // R. x=−0.15; // p r z yp i s an i e po lu x war to sc i l i c z b ow e j j e s t niemoz l iwe27 //bo zmienna j e s t na po lu prywatnym2829 R. WpiszWartoscX ( −0 .15) ; // wpisanie war to sc i po lu prywatnemu30 // poprzez pub l i c zna metode3132 // R. y=1.25; // p r z yp i s an i e po lu y war to sc i l i c z b ow e j j e s t niemoz l iwe33 //bo zmienna j e s t na po lu prywatnym3435 R. WpiszWartoscY ( 1 . 2 5 ) ; // wpisanie war to sc i po lu prywatnemu36 // poprzez pub l i c zna metode3738 R. ko l o r =12; // p r z yp i s an i e po lu ko l o r war to sc i l i c z b ow e j39 // j e s t d a l e j mozliwe bo j e s t na po lu publ icznym4041 cout<<R. WartoscX()<<"\t"<<R. WartoscY()<<"\t"<<R. kolor<<endl ;4243 return 0 ;44 }

Metod dla danej klasy można wprowadzać dowolnie dużo. Nie zajmują one pamięci kompu-tera po alokowaniu obiektu. Dopiero uruchomienie metody na rzecz obiektu moze spowodowaćzajęcie dodatkowej pamięci poprzez dodatkowe alokacje.

Podamy teraz parę przykładów do treningu. Pierwszy z nich to punkty.cc w którym pokazanejest jak zaalokować tablice obiektów statycznie i dynamicznie.

1 #include <iostream>2 #include <c s t d l i b >34 using namespace std ;567 class punktXY{89 private :

10 double x , y ; // po l o z en i e c z a s t k i x , y11 int nr ; //numer c z a s t k i12 public :1314 punktXY (){ x =0.0; y =0.0;} // kons t ruk t o r − s p e c j a l na metoda15 // nie zwraca wartosc i , zawsze ma16 // taka sama nazwe jak k l a s a1718 void WpiszX(double X){x=X;} //metody19 void WpiszY(double Y){y=Y;} // p r z yp i s u j a c e war to sc i20 //polom prywatnym x , y2122 void PrzesunXY (double dx , double dy ){ //metoda zmienia jaca23 x+=dx ; y+=dy ; //wartosc ( x , y ) o ( dx , dy )24 }2526 void PokazXY(){27 cout<<nr<<": "<<"\t"<<x<<"\t"<<y<<endl ;28 }

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 26 Materiał dystrybuowany bezpłatnie

Page 27: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

Przykłady programowania w C++ - kurs podstawowy

29 void WpiszNr ( int i i ){ nr=i i ;}30 } ;313233 int main ( ){34 punktXY A[ 1 0 ] ; //10 ob iek tow z k l a s y punktXY35 //powolanych s t a t y c z n i e36 punktXY ∗B=new punktXY [ 5 ] ; //5 ob iek tow powolanych dynamicznie3738 //warunek poczatkowy d la ob ie tow z t a b l i c y A:39 double rx , ry ;4041 for ( int i =0; i <10; i ++){42 A[ i ] . WpiszNr ( i ) ;43 rx=random ()/(1 .0+RAND MAX) ; //wybieramy rx losowe44 A[ i ] . WpiszX( rx ) ; // z p r z e d z i a l u [ 0 , 1 )4546 ry=random ()/(1 .0+RAND MAX) ; //przesuwamy o ry losowe47 A[ i ] . WpiszY( ry ) ; // z p r z e d z i a l u [ 0 , 1 )4849 A[ i ] . PokazXY ( ) ;50 }5152 cout<<"Wynik po 5 krokach czasowych"<<endl ;5354 for ( int t =0; t <5; t++){55 for ( int i =0; i <10; i ++){56 //przesuwamy punkty o losowe war to sc i rx , ry57 // z p r z e d z i a l u [ −0.05 ,0 .05 ]58 rx =0.1∗(0.5− random ()/(1 .0+RAND MAX) ) ;59 ry =0.1∗(0.5− random ()/(1 .0+RAND MAX) ) ;60 A[ i ] . PrzesunXY ( rx , ry ) ;61 }62 }6364 for ( int i =0; i <10; i++) A[ i ] . PokazXY ( ) ;6566 // d la p opu l a c j i B:6768 cout<<"Populacja B:"<<endl ;69 for ( int i =0; i <5; i ++){70 B[ i ] . WpiszNr ( i ) ;71 rx=random ()/(1 .0+RAND MAX) ;72 B[ i ] . WpiszX( rx ) ;7374 ry=random ()/(1 .0+RAND MAX) ;75 B[ i ] . WpiszY( ry ) ;7677 B[ i ] . PokazXY ( ) ;78 }7980 return 0 ;81 }

W kolejnym programie pudelka.cc jest przykład z przeciążeniem konstruktora.

1 //Przyk lad programu obiektowego , g d z i e w ko l e j nych krokach

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 27 Materiał dystrybuowany bezpłatnie

Page 28: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

Przykłady programowania w C++ - kurs podstawowy

2 // i t e r a c j i nape ln ianych j e s t N pude l ek .3 //Pudelko uwazane j e s t za pe lne j e l l i poziom zape l n i en i a4 // pr zek roc zy wartosc PROG56 #include <iostream>7 #include <cmath>8 #include <c s t d l i b >9

10 using namespace std ;1112 const int NN=10;1314 class Pojemnik{ // d e f i n i c j a k l a s y Pojemnik1516 private :17 int N; // l i c z b a pude l ek18 int ∗B;19 int PROG;2021 public :22 Pojemnik ( int n){ // kons t ruk t o r z parametrem .2324 N=n ;25 PROG=50;2627 B=new int [N ] ; // a l o kac j a t a b l i c y N l i c z b ca l kow i t y ch28 for ( int i =0; i<N; i++) B[ i ]=0;2930 }31 Pojemnik ( ){ // kons t ruk t o r bezparametrowy32 //Tutaj kons t ruk t o r j e s t p r zec ia zony .33 //Z kon tek s tu wynika , k to ry z nich j e s t uruchomiony34 N=NN;35 PROG=50;3637 B=new int [N ] ; // a l o ka c j a 10 l i c z b ca l kow i t y ch38 for ( int i =0; i<N; i++) B[ i ]=0;39 }4041 void Nape ln i j ( int k ){ //metoda zde f in iowana wewnatrz k l a s y42 f loat r=rand ()/(1 .0+RAND MAX) ;43 int q=r <0.5 ? 1 : 0 ;4445 i f (B[ k]<PROG)46 i f ( q !=0) B[ k]+=q ;4748 }4950 int SprawdzCzyPelny ( int k ){ //metoda5152 i f (B[ k]>=PROG) return 1 ;53 else return 0 ;5455 }5657 int PodajLiczbePelnych ( ) ; //metoda

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 28 Materiał dystrybuowany bezpłatnie

Page 29: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

Przykłady programowania w C++ - kurs podstawowy

585960 void WypiszLiczbeBoksow (){ cout<<"Liczba boksow = "<<N<<endl ;}61 int LiczbaBoksow (){ return N;} //metoda6263 } ; // kon i e c zn i e t r z e b a dac s redn i k6465 int Pojemnik : : PodajLiczbePelnych ( ){ //a t u t a j j e s t metoda zde f in iowana66 //poza k l a s a67 int l i c z b a =0;6869 for ( int i =0; i<N; i++)70 l i c z b a+=SprawdzCzyPelny ( i ) ;7172 return l i c z b a ;73 }7475 int main ( ){ // funkc ja glowna7677 int In , I l o s c =0;78 int Nboksow ;79 int krok =0;8081 Pojemnik A;8283 A. WypiszLiczbeBoksow ( ) ;8485 Pojemnik B( 1 0 0 ) ;86 B. WypiszLiczbeBoksow ( ) ;8788 Nboksow=B. LiczbaBoksow ( ) ;89 while ( I l o s c <Nboksow/3){ // Pet la i t e racy jna , g d z i e90 //w kazdym kroku nape ln iane sa boksy91 //w sposob losowy , t j . dochodz i do nich92 //0 lub 1 j ednos t ka z ap e l n i en i a9394 I l o s c=B. PodajLiczbePelnych ( ) ;95 cout<<"krok "<<krok<<": "<<I l o s c <<endl ;9697 for ( int k=0;k<Nboksow ; k++) B. Nape ln i j ( k ) ;98 krok++;99 }

100101 return 0 ;102 }

Zauważmy, że w niektórych przykładach deklarowaliśmy stałe, których wartości znane sąw trakcie kompilacji. Poniżej znajduje się pomocny program, stale.cc w którym można znaleźćwiększość stosowanych przypadków w programach C++. Przy okazji można tam znaleźć sposobyprzesłaniania zmiennych globalnych. Pokazany jest też przykład typu wyliczeniowego (enum).

1 #include <iostream>2 using namespace std ;34 // sprawdzenie czy s t a l a p i j e s t zde f in iowana5 // i j e s l i n ie to ja de f in iu j emy6 #ifndef pi

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 29 Materiał dystrybuowany bezpłatnie

Page 30: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

Przykłady programowania w C++ - kurs podstawowy

7 #define pi 3 .1415 // pr zyk l ad makropolecenia d e f i n i u j a c y s t a l a p i8 #define p ip lu s2 (2.0+ pi ) // inny pr zyk l ad makropolecenia9 #define piplusdwa 2.0+ pi

10 #endif1112 #define Sumaij ( i , j ) ( cout<<i+j<<endl ) // j e s z c z e inny pr zyk l ad13 //Uwaga , nie stawiamy srednikow141516 const int q=10; // pr zyk l ad d e k l a r a c j i s t a l e j w j e zyku C++17 // d e k l a r a c j e t e s t o s u j e s i e zawsze od l ewe j do18 // prawej1920 // cons t GG=10; // nie ma podanego typu i n i e k t o r e kompi la tory21 //moga pokazywac b l ad . W wi e k s z o s c i kompi latorow22 //domyslny j e s t t u t a j typ i n t . Nie j e s t to s tandard ANSI C++2324 double Z=15.05; //zmienna g l o ba l na252627 enum WyborKoloru {Bialy , Czerwony , N i e b i e s k i } ; // t u t a j zde f in iowane sa t r z y28 // s t a l e c a l k ow i t e29 // i pr zyp i sane sa im war to sc i30 // 0 , 1 , 2 , . . .31 //co rownoznaczne j e s t zap i sowi :32 // cons t i n t Bia ly=0;33 // cons t i n t Czerwony=1;34 // cons t i n t N i e b i e s k i =2;35 enum Kolor Inacze j {36 nieb =3,37 z o l t =030000 ,38 nr=339 } ;404142 class dane{4344 private :4546 // cons t i n t s t a l a 1 =3; //Taka de k l a r a c j a zakazana j e s t w ANSI C++4748 const int s t a l a 2 ;49 const char ∗ l a b e l k a ; //wskaznik do s t a l e j5051 WyborKoloru plama ;5253 public :5455 dane ( ) : s t a l a 2 ( 3 ) , l a b e l k a ("jakis lancuch znakowy" )56 {57 // s t a l a 2 =3; tak t e z j e s t z l e z d e k l a r a c j a s t a l e j58 // to znaczy s t a l e j n ie in i c ju j emy wewnatrz kons t ruk to ra59 plama=Czerwony ;60 }6162 void WypiszStala2 ( ){ cout<<s ta la2 <<endl ;}

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 30 Materiał dystrybuowany bezpłatnie

Page 31: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

2.1 Automaty komórkowe Przykłady programowania w C++ - kurs podstawowy

6364 } ;6566 int main ( ){6768 dane A;69 A. WypiszStala2 ( ) ;70 cout<<pip lus2<<endl ;71 cout<<piplusdwa<<endl ;7273 const int Q=5; // t u t a j mozna in i c jowac s t a l a7475 double Z ; // de k l a r a c j a l o k a l n e j zmienna Z76 Z=0.3;7778 cout<<"Z lokalne = "<<Z<<endl ;7980 cout <<"Z globalne = "<<::Z<<endl ; // p r z e s l o n i e c i e l o k a l n e j zmiennej81 // poprzez : : Z8283 // Przyp i san ie nowej war to sc i zmiennej g l o b a l n e j Z84 //po tym jak zadeklarowana z o s t a l a wc ze sn i e j zmienna l o ka l na Z8586 : : Z=10.8;8788 cout<<Z<<"\t"<<::Z<<endl ;8990 WyborKoloru ko l ;91 ko l=N i e b i e s k i ;92 cout<<"kolor="<<kol<<endl ;9394 Ko lo r Inacze j c o l o r ;95 c o l o r=z o l t ;96 cout<<co lo r <<endl ;97 cout<<nr<<endl ;9899 return 0 ;

100 }

2.1 Automaty komórkowe

Za twórcę automatów komórkowych uważa się Johna von Neunmanna. W tym rozdziale ograni-czymy się do automatów jednowymiarowych w wersji spopularyzowanej przez Stevena Wolframa(1986) tj. do automatów 8-bitowych. Automat komórkowy oznacza układ, który ewoluujew dyskretnym czasie i posiada skończoną ilość stanów w których może występować.

Rysunek 3:

Wyobraźmy sobie że chcemy zrobić wizualizację koralika poruszającego się jednostajniewzdłuż pierścienia na który jest on nanizany. Żeby nie rozwiązywać skomplikowanych równańruchu i zastanawiać się nad najlepszym algorytmem numerycznym dla nich wystarczy skorzy-stać z algorytmu automatu komórkowego. Dla uproszczenia zamiast pierścienia koralik będzie

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 31 Materiał dystrybuowany bezpłatnie

Page 32: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

2.1 Automaty komórkowe Przykłady programowania w C++ - kurs podstawowy

poruszał się po odcinku prostej na który nałożone są periodyczne warunki brzegowe, tj. jeśli ko-ralik poruszając się np. w prawą stronę dotrze do prawego końca odcinka to równoważne będziepojawieniu się koralika na lewym końcu odcinka. Koralik bedzie kontynuował ruch w prawo. Ko-lejne uproszczenie to odcinek po którym porusza się koralik będzie przybliżony dyskretną liczbąL położeń które może zająć poruszający się koralik. Miejsce w którym jest koralik będziemyreprezentować jedynką a miejsce puste zerem jak na schemacie poniżej

000000000000000000000001000000000000000000000000000

W kolejnych krokach czasowych rysować będziemy dywan czasoprzestrzenny pokazujący zmie-niające się położenie koralika. Koralików może być więcej i np. trzy pierwsze kroki ewolucjiczasowej dla 5 koralików poruszających się w prawą stronę możemy przedstawić jak niżej.

0000000001100010000000010000000000000000000000000010

0000000000110001000000001000000000000000000000000001

1000000000011000100000000100000000000000000000000000

Reguły 8-bitowe Wolframa to przyporządkowanie stanom (1 - zajęty lub 0 - pusty) trójki są-siednich węzłów (i-1,i,i+1) z poprzedniego kroku czasowego t stanu węzła środkowego (i-tego)w kolejnym kroku czasowym t + 1. W przypadku stanów zero-jedynkowych trzy węzły mają23 = 8 możliwości pojawienia się jedynek i zer. Formalnie, takie przyporządkowanie trójce bitówjednego bitu dla węzła środkowego można zapisać jako nastepujący przepis

σi(t+ 1) = Φ(σi−1(t), σi(t), σi+1(t)), (3)

gdzie Φ jest regułą Wolframa i ma postać jak na rysunku poniżej.

Rysunek 4:

Takie odwzorowanie można reprezentować liczbą dziesiętną. Jeśli popatrzymy na konfiguracjęłańcucha binarnego na Rys.4. to licząc od prawej strony mamy

240 = 1× 27 + 1× 26 + 1× 25 + 1× 24 + 0× 23 + 0× 22 + 0× 21 + 0× 20 (4)

ji wartość dziesiętna 240 jest tzw. Regułą Wolframa o numerze 240. Dla automatów 8-bitowychmamy 256 reguł.

Poniżej znajduje się program reg.cc który przypisuje liczbie dziesiętnej wartość łańcuchabinarnego o zadanej długości.

1 #include <iostream>2 #include <ca s s e r t >3 #include <s t d l i b . h>45 using namespace std ;678 class C e l l u l a r { // de k l a r a c j a k l a s y Ce l l u l a r9 private :

10 int Regula ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 32 Materiał dystrybuowany bezpłatnie

Page 33: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

2.1 Automaty komórkowe Przykłady programowania w C++ - kurs podstawowy

11 char ∗RegulaLancuchBin ; // de k l a r a c j a wskaznika na znak12 //pod tym adresem bed z i e zapamietana13 // t a b l i c a r ep re z en tu jaca lancuch binarny14 // d la l i c z b y Regula 8−b i t owe j15 public :1617 C e l l u l a r ( ){18 RegulaLancuchBin=new char [ 8 ] ;19 i f ( ! RegulaLancuchBin ){20 cout<<"brak pamieci dla tablicy RegulaLancuchBin[8]"<<endl ;21 }22 }2324 void WczytajRegule ( int dec ){2526 a s s e r t ( dec>=0 && dec <256);2728 Regula=dec ;2930 i t o s ( Regula , RegulaLancuchBin , 2 , 8 ) ; //zamieniamy l i c z b e Regula31 // na lancuch b i towy32 } ;3334 void i t o s ( int xx , char ∗ lanc , int nn , int DLUG) ;3536 void PokazRegule ( ){37 cout<<"Regula "<<Regula<<": "<<RegulaLancuchBin<<endl ;38 }3940 } ;4142 void C e l l u l a r : : i t o s ( int xx , char ∗ lanc , int nn , int DLUG){43 long x=xx ;44 int l=DLUG−1;45 long n = nn ;46 int j ;4748 for ( j =0; j<DLUG; j++) ∗( lanc+j )=’0’ ;49 ∗( lanc+DLUG)=’\0’ ;5051 i f ( ! x ) ;52 else53 {54 do55 {56 ∗( lanc+l )=’0’+x % n ;5758 x/=n ;5960 l−−;61 } while ( x ) ;62 for ( j =0; j<l ; j++) ∗( lanc+j )=’0’ ;63 ∗( lanc+DLUG)=’\0’ ;6465 }66 }

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 33 Materiał dystrybuowany bezpłatnie

Page 34: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

2.1 Automaty komórkowe Przykłady programowania w C++ - kurs podstawowy

676869 int main ( int argc , char ∗∗ argv ){70 i f ( argc !=2){71 cout<<"Poprawny format polecenia: "<<argv [0]<<" nr_reg_Wolframa"<<endl ;72 return 0 ;73 }7475 int reg=a t o i ( argv [ 1 ] ) ; //numer r e gu l y Wolframa7677 C e l l u l a r A;78 A. WczytajRegule ( reg ) ;79 A. PokazRegule ( ) ;8081 return 0 ;82 }

Kolejny program, reguly.cc, wyrysowuje dywan przestrzenny na ekranie dla zadanej reguły.

1 #include <iostream>2 #include <ca s s e r t >3 #include <s t d l i b . h>45 using namespace std ;678 class C e l l u l a r { // de k l a r a c j a k l a s y Ce l l u l a r9 private :

10 int Regula ;11 char ∗RegulaLancuchBin ; // de k l a r a c j a wskaznika na znak12 //pod tym adresem bed z i e zapamietana13 // t a b l i c a r ep re z en tu jaca lancuch binarny14 // d la l i c z b y Regula 8−b i t owe j15 public :1617 C e l l u l a r ( ){18 RegulaLancuchBin=new char [ 8 ] ;19 i f ( ! RegulaLancuchBin ){20 cout<<"brak pamieci dla tablicy RegulaLancuchBin[8]"<<endl ;21 }22 }2324 void WczytajRegule ( int dec ){25 a s s e r t ( dec>=0 && dec <256);26 Regula=dec ;27 i t o s ( Regula , RegulaLancuchBin , 2 , 8 ) ; //zamieniamy l i c z b e Regula28 // na lancuch b i towy29 } ;3031 void i t o s ( int xx , char ∗ lanc , int nn , int DLUG) ;32 void PokazRegule ( ){33 cout<<"Regula "<<Regula<<": "<<RegulaLancuchBin<<endl ;34 }3536 int ZakodujSasiedztwo ( const int &lewy , const int &srodek , const int &prawy ){37 int l i c zba dekod , reg , r e f ;38 char znak , ze ro=’0’ ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 34 Materiał dystrybuowany bezpłatnie

Page 35: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

2.1 Automaty komórkowe Przykłady programowania w C++ - kurs podstawowy

39 r e f =( int ) ze ro ;4041 reg=prawy+2∗srodek+4∗ lewy ;42 znak=∗(RegulaLancuchBin+7−reg ) ;43 l i c zba dekod =(( int ) ( znak))− r e f ;44 return l i c zba dekod ;4546 }47 } ;4849 void C e l l u l a r : : i t o s ( int xx , char ∗ lanc , int nn , int DLUG){50 long x=xx ;51 int l=DLUG−1;52 long n = nn ;53 int j ;5455 for ( j =0; j<DLUG; j++) ∗( lanc+j )=’0’ ;56 ∗( lanc+DLUG)=’\0’ ;5758 i f ( ! x ) ;59 else60 {61 do62 {63 ∗( lanc+l )=’0’+x % n ;6465 x/=n ;6667 l−−;68 } while ( x ) ;69 for ( j =0; j<l ; j++) ∗( lanc+j )=’0’ ;70 ∗( lanc+DLUG)=’\0’ ;7172 }73 }7475 void WarunkiPeriodyczne ( int &i l e f t , const int &i , int &i r i g h t , const int &L ) ;7677 int main ( int argc , char ∗∗ argv ){78 i f ( argc !=4){79 cout<<"Poprawny format polecenia: " ;80 cout<<argv [0]<<" nr_reg_Wolframa l_krok_czas l_wezlow"<<endl ;81 return 0 ;82 }8384 int reg=a t o i ( argv [ 1 ] ) ; //numer r e gu l y Wolframa85 int T=a t o i ( argv [ 2 ] ) ; // l i c z b a krokow czasowych86 int L=a t o i ( argv [ 3 ] ) ; // l i c z b a wezlow8788 C e l l u l a r A;89 A. WczytajRegule ( reg ) ;90 A. PokazRegule ( ) ;9192 int ∗Dywan=new int [ L ] ;93 int ∗DD=new int [ L ] ;94

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 35 Materiał dystrybuowany bezpłatnie

Page 36: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

2.1 Automaty komórkowe Przykłady programowania w C++ - kurs podstawowy

95 for ( int i =0; i<L ; i ++){96 Dywan [ i ]=0;97 }9899

100 int i lewy , i s rod , iprawy ;101 int slewy , ssrod , sprawy ;102103 ∗(Dywan+L/2)=1; // s t a r t104105 for ( int t =0; t<T; t++){106107 for ( int i =0; i<L ; i ++){ // przegladamy stan dywanu w c hw i l i t108 i f (∗ (Dywan+i )==1)cout<<"*" ; else cout<<" " ;109 }110 cout<<endl ;111112113 for ( int i =0; i<L ; i ++){114 i l ewy=i −1; i s r o d=i ; iprawy=i +1;115 WarunkiPeriodyczne ( i lewy , i s rod , iprawy , L ) ;116 slewy =∗(Dywan+i l ewy ) ; s s rod =∗(Dywan+i s r o d ) ; sprawy=∗(Dywan+iprawy ) ;117118 ∗(DD+i )=A. ZakodujSasiedztwo ( slewy , ssrod , sprawy ) ;119 }120121 for ( int i =0; i<L ; i ++){122 ∗(Dywan+i )=∗(DD+i ) ;123 }124 }125126127 return 0 ;128 }129130 void WarunkiPeriodyczne ( int &i lewy , const int &i , int &i prawy , const int &L){131 i f ( i ==0) i l e w y=L−1;132 else {133 i f ( i==L−1) i prawy =0;134 }135 }

Wynik działania tego programu dla reguły Wolframa o numerze 149 jest na rysunku poniżej.Kolejny program regulyPPM.cc na dysku zapisuje dywan czasoprzestrzenny w postaci pliku

ppm. Pogram ten dostępny jest wraz z innymi źródłami tego kursu. Tutaj zamieszczamy tylkofragment wprowadzający format zapisu do pliku ppm. Pozostałe części programu są jak poprzed-nio. Uwaga, zmienna L z poprzedniego programu to stała N poniżej.

1 int main ( int argc , char ∗∗ argv ){2 i f ( argc !=3){3 cout<<"Poprawny format polecenia: " ;4 cout<<argv [0]<<" nr_reg_Wolframa l_krok_czas"<<endl ;5 return 0 ;6 }78 int reg=a t o i ( argv [ 1 ] ) ; //numer r e gu l y Wolframa9 int T=a t o i ( argv [ 2 ] ) ; // l i c z b a krokow czasowych

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 36 Materiał dystrybuowany bezpłatnie

Page 37: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

2.1 Automaty komórkowe Przykłady programowania w C++ - kurs podstawowy

Rysunek 5:

1011 C e l l u l a r A;12 A. WczytajRegule ( reg ) ;13 // A. PokazRegule ( ) ;14151617 int i lewy , i s rod , iprawy ;18 int slewy , ssrod , sprawy ;192021 //Najpierw piszemy symbol P3 k tory oznaczac b ed z i e ze ko l o ry22 // beda kodowane w ASCII2324 cout<<"P3"<<endl ;2526 //potem piszemy dwie l i c z b y ca l k ow i t e N M repre z en tu j a c e27 // odpowiednio l i c z b e kolumn i l i c z b e w ie r s zy obrazka28 //np . 100 10029 // c z y l i N=400 i M=10030 //31 int N=1000 , M=1000;32 cout<<M<<" "<<N<<endl ;33 //W ko l e j n e j l i n i i po lecen piszemy maksymalna l i c z b e kolorow 2553435 cout<<255<<endl ;3637 //Nastepnie piszemy t r o j k i RGB l i c z b ca l kow i t y ch38 // z p r z e d z i a l u [ 0 , 255 ] o l i c z b i e t r o j e k rownej NxM3940 int r , g , b ;4142434445 int ∗Dywan=new int [N ] ;

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 37 Materiał dystrybuowany bezpłatnie

Page 38: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

2.1 Automaty komórkowe Przykłady programowania w C++ - kurs podstawowy

46 int ∗DD=new int [N ] ;4748 for ( int i =0; i<N; i ++){49 Dywan [ i ]=0;50 }51 ∗(Dywan+N/2)=1; // s t a r t525354 for ( int t =0; t<T; t++){5556 for ( int i =0; i<N; i ++){ // przegladamy stan dywanu w c hw i l i t57 i f (∗ (Dywan+i )==1)cout<<255<<" "<<0<<" "<<0<<endl ;58 else cout<<0<<" "<<0<<" "<<0<<endl ;59 }

Natomiast na kolejnym rysunku mamy wynik jego działania dla tej samej reguły Wolframao numerze 149.

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 38 Materiał dystrybuowany bezpłatnie

Page 39: Laboratorium 2 - if.uz.zgora.plmdudek/lab2_cz1.pdf · operacyjnym Linux. 1 Pierwszy edytor tekstu i pierwsze programy 1.1 Pierwsze kroki ... W okienku konsoli domyślnie mamy dostęp

2.1 Automaty komórkowe Przykłady programowania w C++ - kurs podstawowy

Rysunek 6: Ta sama reguła 149 ale jej wynik zrzucony został do pliku .ppm o rozdzielczości1000× 1000 pikseli. Widać strukturę fraktalną utworzonego dywanu czasoprzestrzennego.

M.R. Dudek dla < OWK/ > http://www.owk.if.uz.zgora.pl 39 Materiał dystrybuowany bezpłatnie