Wstęp do języka C/C++
Transkrypt
Wstęp do języka C/C++
Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IV edycja, 2016 r. IFJ PAN M. Trzebiński C++ 1/14 Przygotowanie środowiska pracy Niniejsza prezentacja stanowi minimalny wstęp do praktyk. Dyskutowane komendy będą często używane w praktyce. Przed praktykami należy dokładnie zapoznać się z treścią kursu i samodzielnie wykonać zadania! Proszę nie przesyłać nam odpowiedzi. Ćwiczenia można wykonywać używając dowolnego kompilatora C/C++. Wiele darmowych programów jest dostępnych w sieci. Przykłady instalacji oraz uruchamiania można znaleźć w Internecie. Ważne! W przypadku jakichkolwiek problemów z instalacją należy szukać pomocy w Internecie lub u kolegów. To samo dotyczy problemów z kompilacją, działaniem programu, itp. W czasie trwania praktyk będziemy używali narzędzi zainstalowanych i przetestowanych w chmurze CC1. Nie będzie trzeba posiadać kompilatora na własnym komputerze. Proszę nie zwracać się o pomoc do koordynatorów praktyk! W Internecie istnieje bardzo dużo kursów C++, którymi można się wspomóc. Dla przykładu: http://cpp0x.pl/kursy/Kurs-C++/1 http://miroslawzelent.pl/kurs-c++/ http://main.edu.pl/en/user.phtml?op=show&page=cpp&c=70000 M. Trzebiński C++ 2/14 Tworzenie minimalnego, działającego programu 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ć i uruchomić program. Jaki jest wynik? Dodatek: kompilacja i uruchomienie programu z terminala (Linuks) Skompilować program (trzeba być w zawierającym go katalogu): $ g++ -o program1 program1.cpp Uruchomić program: $ ./program1 M. Trzebiński C++ 3/14 Witaj świecie 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. Skompilować i uruchomić program. Jaki jest wynik? M. Trzebiński C++ 4/14 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++ 5/14 Zadania 1. Jaki jest wynik działań 1/2 (obie liczby typu int) oraz 1./2. (obie liczby typu double)? Czy otrzymane wartości są takie same? 2. Zadeklarować zmienne całkowite i1 = 2, i2 = 3 oraz zmiennoprzecinkowe f1 = 0.5, f2 = 2.5. Stworzyć i wyświetlić na ekran 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. M. Trzebiński C++ 6/14 Pętle 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 ( ) { 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 ” << b << 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++ 7/14 Warunki if, else, else if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #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 ( ) { 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) M. Trzebiński C++ 8/14 Instrukcje continue i break 1 2 3 4 5 6 7 8 9 10 11 12 13 #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 ( ) { 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++ 9/14 Funkcje 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; 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++ 10/14 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. 2, aby nie szukała dalej po pierwszym stwierdzeniu podzielności. 4. Wypisać 1000 pierwszych liczb pierwszych. 5. 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++ 11/14 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 26 27 #i n l c 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{ 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 znajduje 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++ 12/14 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++ 13/14 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++ 14/14