RÓŻNE FAJNE OPERATORY Operator inkrementacji ++ dodaje 1 zaś operator dekrementacji -- odejmuje 1 od wartości zmiennej, ale KIEDY??? ++a to jest pre-inkrementacja Jakie wartości program wyświetli na monitorze ? (pomyśl, a później uruchom program i sprawdź) // inkrementacja i dekrementacja int x=1; cout<<"x="<<x<<endl; x++; cout<<"x="<<x<<endl; ++x; cout<<"x="<<x<<endl; zwiększa a o 1 i zwraca a a++ to jest post-inkrementacja x--; --x; cout<<"x="<<x<<endl; cout<<"x="<<x<<endl<<endl; zwraca a, a następnie zwiększa a o 1 Język C umożliwia skrócony zapis w postaci a#=b; gdzie # to jeden z operatorów: +,-,*,/,%,&,|,^,<<,>> na przykład: x%=10; // x będzie równe reszcie z dzielenia poprzedniej wartości x przez 10 Operator warunkowy ?: w wyrażeniu (warunek) ? wartosc1 : wartosc2 zwraca jedną z dwóch wartości, zależnie od spełnienia lub nie-spełnienia warunku, na przykład int x = -7; int xb = x>=0 ? x : -x; xb będzie równe wartości bezwzględnej z x Operatory logiczne w wyrażeniach logicznych || - suma logiczna, or, lub, alternatywa && - iloczyn logiczny, and, i, koniunkcja ! – negacja, not if (wiek>=18 && plec==”dziewczyna”) cout<<”może isc za maz”; Operatory przesunięcia bitowego w lewo << lub w prawo >> o n pozycji x<<1 – oznacza przesunięcie w lewo o bit czyli mnożenie przez 2 (dopisz 0 z prawej) x>>2 – oznacza przesunięcie w prawo o 2 bity, czyli dwukrotne dzielenie przez 2 (dopisz dwa zera z lewej strony) Operacje na bitach: | suma bitowa, np. x = a | b; & iloczyn bitowy np. x = a & b; ~ negacja bitowa np. na = ~a; W kodzie U2 – uzupełnień do 2 zawsze: liczba przeciwna == negacja bitowa liczby +1 int a=1,b,c; b=a++; c=++a; cout<<"a="<<a<<" b="<<b; cout<<" c="<<c<<endl<<endl; // skrócony zapis a+=a; cout<<"a="<<a<<endl; //instrukcja warunkowa a operator warunkowy if (a%2==0) cout<<"a parzyste\n"; else cout<<"a nieparzyste\n"; string kom = a%2==0 ? "a parzyste" : "a nieparzyste"; cout<<kom<<endl; x = -7; x = x>=0?x:-x; cout<<"bezwzgl x="<<x<<endl<<endl; // iloczyn logiczny if (a%2==0 && a%3==0) cout<<"a podzielne przez 6\n"; else cout<<"a NIEpodzielne przez 6\n"; // to samo inaczej zapisane if (!(a%2) && !(a%3)) cout<<"a podzielne przez 6\n"; else cout<<"a NIEpodzielne przez 6\n"; // przesunięcie o wskazaną liczbę bitów int i=4; int j=i>>1; int k=i<<1; cout<<endl<<"i="<<i<<" j="<<j<<" k="<<k<< endl; // operacje na bitach : suma bitowa i iloczyn bitowy int bs = i | j; int bi = i & j; cout<<"bitowa suma i|j="<<bs<<endl; cout<<"bitowy iloczyn i&j="<<bi<<endl; cout<<"Czy i,j maja jakies bity takie same? "; string mes = bi>0 ? "TAK" : "NIE"; cout<<mes<<endl<<endl; // liczba przeciwna == negacja bitowa + 1 int ni = ~i; cout<<"negacja bitowa ~i="<<ni<<endl; cout<<"liczba przeciwna do i = "<<ni+1<<endl; POWTÓRZENIE INSTRUKCJI WARUNKOWEJ Przykład: Niech program pobiera z klawiatury prędkość startu rakiety z powierzchni Ziemi w km/s, a nastepnie 1. oblicza ile godzin trwałaby podróż na Księżyc, odległy od Ziemi średnio o 384 403 km, gdyby rakieta cały czas poruszała się z tą samą prędkością 2. wyświetla informację tekstową o tym jaki będzie dalszy los rakiety, wiedząc że: poniżej 7.91 km/s – rakieta spadnie na Ziemię 7.91 - 11.19 km/s – rakieta stanie się kolejnym satelitą Ziemi 11.19 - 16.7 km/s – rakieta będzie krążyć wokół Słońca jak planety 16.7 – 130 km/s – rakieta opuści nasz Uklad Słoneczny i będzie błądzić po Drodze Mlecznej powyżej 130 km/s – rakieta opuści Naszą Galaktykę (Drogę Mleczną) i poleci w nieznany Kosmos Można tak: double v; cout<<"Podaj v rakiety w km/s "; cin>>v; double godziny = 384403/v/60/60; cout<<"Do Ksiezyca doleci w "; cout<<godziny<<" godz\n"; if (v<7.91) cout<< "spadnie na Ziemię"; else if (v<11.19) cout<< "satelita"; else if (v<16.7) cout<< "planeta"; else if (v<130) cout<< "po Drodze M"; else cout<< "ku innym galaktykom"; cout<<endl; ale można i tak, choć to mniej optymalnie: double v; cout<<"Podaj v rakiety w km/s "; cin>>v; double godziny = 384403/v/60/60; cout<<"Do Ksiezyca doleci w "; cout<<godziny<<" godz\n"; if (v<7.91) cout<< "spadnie na Ziemię"; if (7.91<=v && v<11.19) cout<< "satelita"; if (11.19<=v && v<16.7) cout<< "planeta"; if (16.7<=v && v<130) cout<< "po Drodze M"; if (130<=v) cout<< "ku innym galaktykom"; cout<<endl; POWTÓRZENIE PĘTLI WHILE Przykład: Niech program oblicza wartość stałej z zadaną dokładnością, wykorzystując szereg odwrotności kolejnych liczb nieparzystych (niestety jest to szereg baaaaardzo wolno zbieżny...) Przyjmijmy M_PI jako wartość dokładną. Specyfikacja: Dane: dok - żądana dokładność, np 0.0001, typ double Wynik: pi wartość obliczona z żądaną dokładnością, typ double Zmienne pomocnicze: i - numer kolejnego wyrazu szeregu: 0, 1, 2 ,3 itd., typ int wsp - współczynnik - będzie mieć wartość na przemian: 1 i -1 Spytaj Google-a o inne szeregi przybliżające wartość (niektóre są bardzo pomysłowe i zbieżne o wiele szybciej niż ten tutaj). Spróbuj je zaprogramować. double dok; cout<<"Jaka ma być dokladnosc (np. 0.001) ? "; cin>>dok; Trzeba inkludować plik double pi=0; nagłówkowy cmath, który zawiera int i=0; definicje: tę wartość 4 można double wsp=1; wrzucić do zmiennej cout.precision(16); M_PI – stała - wartość wsp, będzie równa cout<<fixed; na przemian: 4 i -4 while (abs(pi-M_PI)>dok) abs(zmienna ) – funkcja { wartość bezwzględna argumentu pi = pi + 4*wsp/(2*i+1); cout<<i<<"\t "<<pi<<endl; wsp=-wsp; i++; } cout<<"nasze Pi = "<<pi<<", a dokladnie jest "<<M_PI<<endl; cout<<"nalezalo zsumowac "<<i<<" wyrazow szeregu"<<endl;