• Nie Znaleziono Wyników

Podstawy programowania Podstawy programowania w jw języku C i C++ ęzyku C i C++

N/A
N/A
Protected

Academic year: 2021

Share "Podstawy programowania Podstawy programowania w jw języku C i C++ ęzyku C i C++"

Copied!
18
0
0

Pełen tekst

(1)

Podstawy programowania

Podstawy programowania

w j

w języku C i C++

ęzyku C i C++

Operatory i wyrażenia

Część czwarta

Roman Simiński roman.siminski@us.edu.pl www.us.edu.pl/~siminski Autor Kontakt

(2)

Operatory arytmetyczne

Operatory arytmetyczne

Operatory arytmetyczne to

+

: dodawanie (dwuargumentowy) i zachowanie znaku (jednoargumentowy),

: odejmowanie (dwuargumentowy) i zmiana znaku (jednoargumentowy),

*

: mnożenie (dwuargumentowy),

/

: dzielenie (dwuargumentowy),

%

: (dwuargumentowy)reszta z dzielenia (modulo), nie może być stosowany

do liczb rzeczywistych.

(3)

Uwaga — dzielenie na operandach całkowitych daje wynik całkowity

Uwaga — dzielenie na operandach całkowitych daje wynik całkowity

Ten kod:

int x = 5, y = 2; float f = x/y;

cout << ”Wynik dzielenia ” < < x << ”przez ” << y << ” wynosi ” << f ;

wyprodukuje:

Aby otrzymać wynik rzeczywisty jeden z operandów musi być rzeczywisty:

float x = 5; int y = 2; float f = x/y;

int x = 5, y = 2;

float f = ( float ) x/y;

Rzutowanie (konwersja) typów w wyrażeniu

(4)

Operatory relacji i operatory logiczne

Operatory relacji i operatory logiczne

Operatory relacji to :

>

,

>=

,

<

,

<=

.

Operatory porównania

==

,

!=

.

Operatory logiczne to

&&

(and) oraz

||

(or).

Wyrażenia połączone tymi operatorami oblicza się od lewej do prawej, koniec

obliczeń następuje natychmiast po określeniu wartości logicznej wyrażenia.

Operatory relacji mają wyższy priorytet niż operatory porównania.

Priorytet operatora && jest wyższy niż || a oba są niższe niż operatorów relacji i

porównania. Dlatego poniższy warunek może być zapisany bez nawiasów:

while( c >= ’A’ && c <= ’Z’ ) {

. . .

while( ( c >= ’A’ ) && ( c <= ’Z’ ) ) {

. . .

zamiast

Uwaga:

(5)

Operatory relacji i operatory logiczne, przykład wykorzystania

Operatory relacji i operatory logiczne, przykład wykorzystania

Czy rok w zmiennej całkowitej year jest przestępny?

if( ( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0 ) cout << ”Rok ” << year << ” jest rokiem przest pnym”;ę

else

cout << ”Rok ” << year << ” nie jest rokiem przest pnym”;ę

Czy zmienna znakowa c jest cyfrą lub małą literą?

if( ( c >= '0' && c <= '9' ) || ( c >= 'a' && c <= 'z' ) ) cout << ”Cyfra lub mała litera”;

else

cout << ”To nie jest ani cyfra, ani mała litera”;

Czy zmienna znakowa c jest cyfrą szesnastkową?

if( ( c>='0' && c<='9' ) || ( c>='a' && c<='f' ) || ( c>='A' && c<='F' ) ) cout << ”Cyfra szesnastkowa”;

else

(6)

Operatory zwiększania ++ i zmniejszania —―

Operatory zwiększania ++ i zmniejszania —―

Operatory

++

i

—―

zawsze powodują odpowiednio zwiększenie lub zmniejszenie

wartości argumentu. Mogą one jednak występować jako przedrostki (ang. prefix)

lub przyrostki (ang. postfix).

licznik = licznik + 1; i = i – 1; licznik++; i--; ++licznik; --i;

(7)

Operatory zwiększania ++ i zmniejszania —―

Operatory zwiększania ++ i zmniejszania —―

Wersja przedrostkowa zwiększa (zmniejsza) wartość argumentu przed użyciem

jego wartości.

Wersja przyrostkowa zwiększa (zmniejsza) wartość argumentu po użyciem jego

wartości.

int a = 5, b; b = ++a; a == 6, b == 6 int a = 5, b; b = a++; a == 6, b == 5 int licznik = 0;

cout << ”Licznik: ” << licznik;

licznik++; ...

licznik++;

cout << ”Licznik: ” << licznik;

int licznik = 0;

cout << ”Licznik: ” << licznik++; ...

(8)

Operatory zwiększania ++ i zmniejszania —―

Operatory zwiększania ++ i zmniejszania —―

for( int licznik = 10; licznik > 0; cout << endl << licznik-- << "..." ) ;

for( int licznik = 10; licznik > 0; licznik-- ) cout << endl << licznik << "...";

Wykorzystując operatory

++

i

—―

iterację:

Można zapisać krócej:

Na operatory ++ i ―― trzeba uważać:

(9)

Operatory bitowe

Operatory bitowe

Operatory bitowe mogą być stosowane do argumentów typu całkowitego, są to:

Operator

Znaczenie

&

bitowa koniunkcja (and),

|

bitowa alternatywa (or),

^

bitowa różnica symetryczna (xor),

<<

przesunięcie w lewo,

>>

przesunięcie w prawo,

~

dopełnienie jedynkowe.

z = x & y; 0...0101 0...0111 0...0101 z == 5 int x = 5, y = 7, z; z = x | y; 0...0101 0...0111 0...0111 z == 7 z = x ^ y; 0...0101 0...0111 0...0010 z == 2

(10)

Operatory bitowe, przykłady zastosowania

Operatory bitowe, przykłady zastosowania

Ustawianie pewnych bitów liczby:

flag = flag | 1; // Ustawienie najmłodszego bitu liczby flag

Zerowanie pewnych bitów liczby:

flag = flag & ~1; // Wyzerowanie najmłodszego bitu flag

Niech będzie zadeklarowana zmienna flag, o rozmiarze 1-go bajta:

unsigned char flag = 0;

Testowanie czy pewne bity liczby są ustawione:

if( flag & 1 ) // Czy najmłodszy bit jest ustawiony?

(11)

Operatory bitowe, przykłady zastosowania

Operatory bitowe, przykłady zastosowania

enum FileMode { FMReadOnly = 1, // 0...0001 FMWriteOnly = 2, // 0...0010 . . . }; . . . char znak; int fMode = 0;

cout << "Podaj tryb otwarcia\nr: odczyt\nw: zapis\n>"; cin >> znak;

switch( znak ) {

case 'r' :

case 'R' : fMode = fMode | FMReadOnly; break;

case 'w' :

case 'W' : fMode = fMode | FMWriteOnly; break;

// . . . }

(12)

Operatory bitowe, przykłady zastosowania

Operatory bitowe, przykłady zastosowania

if( fMode & FMReadOnly )

cout << "Otwarcie tylko do odczytu"; . . .

if( fMode & FMWriteOnly )

cout << "Otwarcie tylko do zapisu";

Testowanie trybu otwarcia:

fMode = fMode & ~FMReadOnly;

. . .

fMode = fMode & ~FMWriteOnly;

Czyszczenie określonego trybu otwarcia:

fMode = fMode | ( FMReadOnly | FMWriteOnly );

Ustawienie trybu otwarcia do zapisu i odczytu:

if( fMode & ( FMReadOnly | FMWriteOnly ) )

(13)

Operatory bitowe, przesunięcia bitowe

Operatory bitowe, przesunięcia bitowe

Przesunięcie o jeden bit w prawo:

unsigned char flag = 128; // 10000000 flag = flag >> 1; // 01000000 flag = flag >> 1; // 00100000

Uwaga na bit znaku:

signed char flag = 128; // 10000000 flag = flag >> 1; // 11000000 flag = flag >> 1; // 11100000

Przesunięcie o jeden bit w lewo:

unsigned char flag = 1; // 00000001 flag = flag << 1; // 00000010 flag = flag << 1; // 00000100

(14)

Operatory bitowe, przesunięcia bitowe — przykład wykorzystania

Operatory bitowe, przesunięcia bitowe — przykład wykorzystania

Ile bitów ma liczba typu int w danej implementacji (iteracja while)?

int number = 1, counter = 0; while( number != 0 )

{

number = number << 1; counter ++;

}

cout << "Liczba bitów typu int: " << counter;

Ile bitów ma liczba typu int w danej implementacji (iteracja for)?

int number = 1, counter = 0; for( ; number != 0; counter++ ) number = number << 1;

(15)

Operatory przypisania

Operatory przypisania

Przypisanie wartości jest w języku C/C++ wyrażeniem a nie instrukcją. Operator

przypisania = jest lewostronnie łączny, co umożliwia łączenie przypisań:

int i = 5, j, k, l; j = k = l = i;

Zamiast:

j = ( k = ( l = ( i + 5 ) ) + 10 ) * 2; // j == 40, k == 20, l == 10 x = sin( alfa ); if( x == 0 ) { ...

if( ( x = sin( alfa ) ) == 0 ) { ... } l = i + 5; k = l + 10; j = k * 2;

można napisać:

Często:

(16)

Operatory przypisania, cd. ...

Operatory przypisania, cd. ...

Dla większości operatorów dwuargumentowych:

+ - * / % << >> * ^ & |

można wykorzystywać specjalne operatory przypisania, pozwalające skrócić zapis

często wykorzystywanych konstrukcji, takich jak:

i = i + 2 y = y * 2 x = x << 1 j = j * ( k + 1 ) flag = flag >> k; i += 2 y *= 2 x <<= 1 j *= k + 1 flag >>= k;

(17)

Operatory przypisania, cd. ...

Operatory przypisania, cd. ...

Ogólnie, jeśli expr1 i expr2 to wyrażenia, a op to operator dwuargumentowy,

zapis:

expr1 = expr1 op expr2

można uprościć do postaci:

(18)

Operator warunkowy

Operator warunkowy

Bardzo często spotyka się pewne „symetryczne” instrukcje warunkowe, np.:

if( delta < 0 ) brak_rozw_rzecz = 1; else brak_rozw_rzecz = 0; if( a > b ) max = a; else max = b;

Można je zapisać krócej, z wykorzystaniem operatora warunkowego:

brak_rozw_rzecz = ( delta < 0 ) ? 1 : 0; max = ( a > b ) ? a : b;

Inny przykład — komunikaty w wersji polskiej lub angielskiej:

enum WERSJA_JEZYKOWA { POLSKI, ANGIELSKI }; int jezyk = POLSKI;

. . .

Cytaty

Powiązane dokumenty

void ∗malloc( size_t rozmiar ); // przydział bloku o zadanej wielkosci void ∗calloc( size_t il_elementow, size_t rozmiar); // przydział tablicy void free( void ∗wskaznik);

Obiekty, elementy, pojęcia ze świata zewnętrznego muszą zostać odwzorowane danymi w programie. Dane występujące w programie stanowią uproszczony, komputerowy

Rezultatem funkcji jest wartość różna od zera, jeżeli strumień jest w pozycji końcowej, zero w przeciwnym wypadku.. Strumień jest w pozycji końcowej, jeżeli w wyniku

W przypadku wystąpienia końca pliku lub błędu, rezultatem funkcji jest liczba, potencjalnie zerowa, bezbłędnie zapisanych bloków.. size_t fwrite( void * ptr, size_t size, size_t

Dane wejściowe  informacje dostarczone do programu przez użytkownika, w celu umożliwienia wykonania algorytmu. Dane wyjściowe  są generowane przez program i

Można powiedzieć, że jest to dobrze wyszkolony pies - odpowiada tylko na określony zestaw znanych poleceń (ang. set of known commands ). Czasami, jak pies, po prostu się zamyka i

dyrektywa preprocesora - jest to oddzielna część kompilatora, której zadaniem jest wstępne odczytanie tekstu programu i wprowadzenie w nim pewnych modyfikacji.. Prefiks

Za każdym razem, gdy kompilator napotka komentarz w twoim programie, komentarz jest do niego całkowicie niewidoczny - z jego punktu widzenia jest to tylko jedna spacja (bez względu