Programowanie w C++
Transkrypt
Programowanie w C++
Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IFJ PAN 6 lipca 2015 M. Trzebiński C++ 1/16 Uruchomienie maszyny w CC1 Otworzyć stronę: www.cloud.ifj.edu.pl Zaloguj się Maszyny wirtualne → Nowa maszyna Obraz: praktyki 2015 Sprzęt: 2 cpu Zasoby: Adres IP: none Dołącz dysk: zaznaczyć opcję podpięcia swojego dysku Dołącz obraz ISO: none VNC: zaznaczyć Nadać maszynie nazwę i utworzyć. Poczekać, aż status maszyny zmieni się z init na running Kliknąć na utworzoną maszynę → rozwinie się okno z jej statusem Kliknąć Konsola graficzna (VNC) Zalogować się na konto student M. Trzebiński C++ 2/16 Przygotowanie środowiska pracy Otworzyć LXTerminal (skrót jest dostępny np. na pasku zadań) Zamontować dysk: Sprawdzić, czy dysk /dev/vda1 jest widoczny: sudo fdisk -l Zamontować dysk do katalogu /media: sudo mount -t ext4 /dev/vda1 /media/ Zmienić właściciela katalogu: sudo chown student /media/ Sprawdzić, czy wszystko działa: cd /media echo ”Witaj swiecie!” > witaj.txt cat witaj.txt Proszę pamiętać, że wszystko należy zapisywać w katalogu /media. Dane zapisane w innych miejscach (np. w katalogu /home) zostaną skasowane wraz ze zniszczeniem maszyny wirtualnej! M. Trzebiński C++ 3/16 Tworzenie minimalnego, działającego programu Otworzyć dowolny edytor tekstu: @ > leafpad program1.cpp & 1 2 3 i n t main ( ) { return 0; } Program zawiera funkcję główną main(). W tym przypadku funkcja ta zwraca (return) liczbę całkowitą (int); tutaj jest to 0. Wszystkie polecenia wykonywane w ramach tej funkcji muszą się znaleźć pomiędzy nawiasami klamrowymi. Skompilować program: @ > g++ -o program1 program1.cpp Uruchomić program: @ > ./program1 M. Trzebiński C++ 4/16 Witaj świecie @ > leafpad program1.cpp & 1 2 3 4 5 6 7 8 #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; i n t main ( ) { c o u t << ” W i t a j s w i e c i e ! ” << e n d l ; return 0; } Program przekierowuje (<<) do konsoli (cout, ang. console output) napis Witaj swiecie! oraz znak końca linii (endl). Polecenia te nie są podstawowe w języku C++. Ich definicja znajduje się w osobnej bibliotece (iostream), którą należy dołączyć do programu (#include). Ponadto, polecenia znajdują się w przestrzeni nazw std. Kompilator jest o tym informowany przez dyrektywę using namespace. Każdy ciąg poleceń kończymy średnikiem. @ > g++ -o program1 program1.cpp && .program1 M. Trzebiński C++ 5/16 Środowisko programistyczne i komentarze @ > geany program1.cpp & Bo kolorowanie składni oraz inne ułatwienia są przydatne :) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; i n t main ( ) { /∗ t o j e s t k o m en ta r z w kilku l i n i j k a c h ∗/ // A t o k o m en ta r z w j e d n e j l i n i i c o u t << ” W i t a j s w i e c i e ! ” << e n d l ; return 0; } Skompilować program: kliknąć symbol cegiełki Uruchomić program: kliknąć symbol koła zębatego M. Trzebiński C++ 6/16 Definiowanie zmiennych 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 i n t main ( ) { i n t a ; // d e k l a r a c j a z m i e n n e j t y p u c a l k o w i t e g o ( i n t e g e r ) // z m i en n e mozna d e k l a r o w a c po k i l k a , o d d z i e l a j a c j e p r z e c i n k a m i // mozne t e z p r z y p i s a c im w a r t o s c p o cz a tk o w a int b = 3 , c = 10; f l o a t A = 1 0 . 2 5 ; // l i c z b a z m i e n n o p r z e c i n k o w a ( p o j e d y n c z a p r e c y z j a ) d o u b l e B ; // l i c z b a z m i e n n o p r z e c i n k o w a ( p o d w o jn a p r e c y z j a ) B = 0 . 0 1 5 ; // p r z y p i s a n i e z m i e n n e j B w a r t o s c i 0 . 0 1 5 B = 1 . 2 5 e5 ; // a t e r a z z m i en n a B ma w a r t o s c 125000 c h a r z n a k = ’A ’ ; // p o j e d y n c z y z n a k s t r i n g c i a g = ” C i a g znakow b l a , b l a , b l a . . . ” ; // c i a g znakow ; b i b l i o t e k a <s t r i n g >; n a m es p a ce s t d b o o l p = t r u e , f = f a l s e ; // z m i en n a l o g i c z n a prawda / f a l s z a = b ; // p r z y p i s a n i e l i c z b i e a w a r t o s c i b a = a + 1 ; // z w i e k s z e n i e w a r t o s c i a o 1 a += 1 ; // jw . a++; // jw . a a a a = = = = b b b b + − ∗ / c; c; c; c; // p r z y p i s a n i e // o d ejm o w a n i e // m n o z en i e // d z i e l e n i e l i c z b i e a w a r t o s c i sumy b + c return 0; } M. Trzebiński C++ 7/16 Zadania 1. Jaki jest wynik działań 1/2 oraz 1./2.? 2. Zadeklarować zmienne całkowite i1 = 2, i2 = 3 oraz zmiennoprzecinkowe f1 = 0.5, f2 = 2.5. Stworzyć i wyświetlić zmienne a = i1 + i2, b = f1 + f2, c = i1 + f2, d = i1 / i2, e = i1 / f1, f = i1 * f1, g = f1 * i1. 3. Wyświetlić resztę z dzielenia 12331 przez 334 (przydatny link: www.google.pl). M. Trzebiński C++ 8/16 Pętle 1 2 3 4 5 6 7 8 9 10 11 12 i n t main ( ) { f o r ( i n t a =0; a <100; a++) { c o u t << ” Wyswietlam l i c z b e c a l k o w i t a \ t ” << a << e n d l ; } f o r ( d o u b l e b = −3.5; b < 3 . 5 ; b +=0.5) { c o u t << ” Wyswietlam l i c z b e z m i e n n o p r z e c i n k o w a \ t ” << a << e n d l ; } return 0; } Pętle służą do wielokrotnego wykonywania poleceń. W powyższym kodzie wykorzystana jest pętla for. Wykonywana jest do czasu, gdy wartość zadeklarowanej zmiennej o ustalonej wartości początkowej (int a=0) nie przekroczy danej wartości (a<100). Po każdej iteracji zmienna a ma zostać zwiększona o 1. Drugi przykład jest analogiczny, liczba typu double jest zwiększana o 0.5. M. Trzebiński C++ 9/16 Warunki if, else, else if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 i n t main ( ) { f o r ( i n t a =0; a <100; a++) { i f ( a <10) c o u t << a << e n d l ; // w y s w i e t l a j e z e l i j e s t ono m n i e j s z e n i z 10 e l s e i f ( a <50) // w yk o n a j , j e z e l i p o w yz s z y w a r u n ek n i e j e s t s p e l n i o n y i a j e s t m n i e j s z e n i z 50 { // w a r u n k i em moze b yc o b j e t y c h k i l k a l i n i j e k c o u t << ” ponad ” << e n d l ; c o u t << ” 50 ” << e n d l ; } e l s e c o u t << ” Ponad\ t ” << a << e n d l ; // w yk o n a j gdy w s z y s t k i e p o p r z ed n i e warunki n i e sa s p e l n i o n e } return 0; } Porównanie wartości: a > b, a < b // a większe niż b, a mniejsze niż b a >= b, a <= b // a większe lub równe b, a mniejsze lub równe b a == b //a równe b a! = b //a nie równe b Operacje logiczne: A&&B // koniunkcja logiczna (A i B) A||B // alternatywa logiczna (A lub B) !A // negacja logiczna (nieprawda że A)C++ M. Trzebiński 10/16 Instrukcje continue i break 1 2 3 4 5 6 7 8 9 10 i n t main ( ) { f o r ( i n t a =0; a <100; a++) { i f ( a <10) c o n t i n u e ; i f ( a==50) b r e a k ; c o u t << ” Wyswietlam \ t ” << a << e n d l ; } c o u t << ” K o n i e c ! ” << e n d l ; return 0; } Powyższy program wyświetli liczby od 10 do 49. W pętli najpierw sprawdzany jest warunek a < 10 jeżeli jest spełniony to program wraca do początku pętli, zwiększając zmienną a (w tym przykładzie o 1). Instrukcje po linijce z continue nie są wykonywane. Jeżeli wartość a będzie wynosić 50, to pętla zostanie zakończona (break). M. Trzebiński C++ 11/16 Funkcje 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 void wyswietl ( s t r i n g napis ){ c o u t << n a p i s << e n d l ; } d o u b l e x pow ( d o u b l e x , i n t y ) { d o u b l e w yn i k = x ; f o r ( i n t a =1; a<y ; a++) w yn i k ∗= x ; r e t u r n w yn i k ; } i n t main ( ) { w y s w i e t l ( ” P o c z a t e k p r o g r a m u” ) ; double a ; a = x pow ( 1 0 . , 4 ) ; c o u t << w y s w i e t l ( ” 3 . 5 ˆ 4 w y n o s i : ” ) << x pow ( 3 . 5 , 4 ) << e n d l ; return 0; } W programie znajdują się trzy funkcje. Każda z nich jest innego typu – program oczekuje, że funkcja będzie zwracać (return) określoną wartość: main jest typu całkowitego (int), x pow zwraca liczbę z podwójną precyzją (double), wyswietl jest typu void – nie zwraca wartości. Funkcja wyswietl przyjmuje jeden parametr (typu string): napis, a funkcja x pow dwa parametry (pierwszy typu double, drugi int). M. Trzebiński C++ 12/16 Zadania 1. Napisać program, który sprawdzi czy 113 jest liczbą pierwszą. 2. Napisać funkcję, która sprawdzi czy liczba podana w argumencie jest pierwsza. 3. Przyśpieszyć funkcję z pkt. 3, aby nie szukała dalej po pierwszym stwierdzeniu podzielności. 4. Wypisać 1000 pierwszych liczb pierwszych. 5. Porównać czas działania programu z pkt. 5 w przypadku zastosowania przyśpieszenia (pkt. 4) i przeciwnym. 6. Zabezpieczyć funkcję z pkt. 4 tak, aby działała tylko w przypadku podania dodatniej liczby całkowitej. W innych przypadkach ma informację o błędzie. M. Trzebiński C++ 13/16 Klasy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 c l a s s Wektor{ p u b l i c : // prawo d o s t e p u : p u b l i c z n e v o i d u s ta w ( d o u b l e , d o u b l e ) ; // d e k l a r a c j a f u n k c j i d o u b l e d l u g o s c ( ) ; // d e k l a r a c j a f u n k c j i p r i v a t e : // prawo d o s t e p u : p r y w a t n e ( w i d o c z n e z poziomu k l a s y ) d o u b l e x , y ; // d e k l a r a c j a z m i en n ych } ; // k l a s e konczymy s r e d n i k i e m // d e f i n i c j a f u n k c j i ” u s ta w ” z k l a s y ” Wektor ” v o i d Wektor : : u s ta w ( d o u b l e a , d o u b l e b ) { x = a; y = b; } // d e f i n i c j a f u n k c j i ” d l u g o s c ” z k l a s y ” Wektor ” v o i d Wektor : : d l u g o s c ( ) { r e t u r n s q r t ( x∗ x + y∗ y ) ; } i n t main ( ) { Wektor v ; // u t w o r z e n i e o b i e k t u k l a s y ” Wektor ” v . u s ta w ( 3 . , 4 . ) ; c o u t << v . d l u g o s c ( ) << e n d l ; return 0; } W programie znajdują się klasa Wektor. Zawiera deklaracje dwóch zmiennych (x oraz y) oraz dwóch funkcji (ustaw(double, double), dlugosc()). Funkcje są zdefiniowane w dalszej części programu. Kompilator wie, że należą one do klasy przez określenie Wektor:: w definicji funkcji. M. Trzebiński C++ 14/16 Struktura programu Plik program.h zawiera informacje o: bibliotekach, przestrzeniach nazw, klasach, funkcjach. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; c l a s s Wektor{ public : v o i d u s ta w ( d o u b l e , d o u b l e ) ; double dlugosc () ; private : double x , y ; }; v o i d Wektor : : u s ta w ( d o u b l e a , d o u b l e b ) {x = a ; y = b ; } v o i d Wektor : : d l u g o s c ( ) { r e t u r n s q r t ( x ∗x + y∗ y ) ; } Plik program.cpp zawiera program główny. 1 2 3 4 5 6 7 8 #i n c l u d e ” p r o g r a m . h” i n t main ( ) { Wektor v ; v . u s ta w ( 3 . , 4 . ) ; c o u t << v . d l u g o s c ( ) << e n d l ; return 0; } M. Trzebiński C++ 15/16 Zadania 1. Dodać funkcję, która skaluje wektor o zadaną liczbę. Definicje mają się znajdować w pliku .h. 2. Zmienić współrzędne na public zdefiniować operator dodawania dwóch wektorów. M. Trzebiński C++ 16/16