Lekcja 3

advertisement
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;
Download