include <iostream.h> //przykład wyk. oper % - modulo
include <conlo.h>
main()
{
int i;
for(i = 0;i<64;i = i + 1) {
lf( I % 8) cout « "\t" ; //Jeśli r. Jest nlezerowa to wypis
//tabulatora
else cout « "\n" ; //przejście do nowej linii
Cout >> I;
}
getch();
Operatory bitowe:
W języku C++ operacje można wykonywać na całych słowach (mówiliśmy o tym wcześniej) lub na poszczególnych bitach słowa. Do tego drugiego typu operacji służą, do tego operatory bitowe.
Operator: |
Działanie: |
Przykład: |
& |
bitowa koniunkcja |
a = b & c; |
| |
bitowa alternatywa |
a=b|c; |
^ |
bitowa różnica symetryczna |
a = b A c; |
<< |
przesunięcie w lewo |
a = b « c; |
>> |
przesunięcie w prawo |
a = b » c; |
` |
bitowa negacja |
a = ~b |
|
|
|
//Przykład operator} bitowe:
int a = Ox0f0f; // 0000 1111 0000 1111
int b = 0x0lTO; //0000 1111 1111 0000 int c;
c = a & b; // 0000 1111 0000 0000 iloczyn bitowy
c = a | b; //0000 1111 1111 1111 suma bitowa
c = a ^ b; // 0000 0000 1111 1111 różnica symetryczna
~a // 1111 0000 1111 0000 negacja
A << 2 //0011 1100 0011 1100 przesuniecie w lewo
A >> 2 // 0000 0011 11 00 0011 przesuniecie w prawo
Inkrementacia i dekrementacia:
■ dekrementacje - odjęcie 1;
■ inkrementacja - dodanie 1;
Przykład: |
|
i = i + l; |
//i++ |
j = j - i; |
//}-- |
• operatory inkrementacji i dekrementacji mogą występować w dwóch odmianach: przedrostkowe: j ++i; -i przyrostkowej; i++ ; i— ;
» operator przedrostkowy ++i; --i; jest obliczany przed przypisaniem (nowej wartości pod i);
■ operator przyrostkowy jest obliczany po przypisaniu.
Przykład:
#include <iostream.h> //++i, i++
#include <conio.h>
void moain ()
{ int i=10, j=10;
clrscr () ;
cout « "i = " « i « endl
« "j = " « j « endl « endl;
i++; ++j;
cout « "i = " « i « endl
« "j = >> « j « endl « endl;
cout « "i = " << i-H- « endl
« "j = "<< ++j << endl « endl;
cout « "i = " << i << endl
« "j = " « j « endl;
getch () ;
Pozostałe operatory przypisania:
Operator Zapis skrócony Zapis rozwinięty
+= a += b a = a + b
-= a - = b a = a - b
*= a *= b a = a * b
/= a /= b a = a / b
%= a %= b a = a % b
<<= a <<= b a = a << b
>>= a >>= b a = a >> b
&= a &= b a =a & b
|= a|= b a = a I b
^= a^=b a = a^b
Wyrażenie warunkowe (nie instrukcja):
(warunek)? wartość1 : wartość2
Przykład: cout << ((i>5)? 15:20)
c = (x > y)? 17:56;
include <iostream.h> // wyrażenie warunkowe
include <conio.h>
main ()
{
int i;
i = 4;
cout << ((i>5)? 5:10) << endl;
i = 6;
cout << ((i>5)? 15:20) << endl;
getch();
}
Operator Sizeof:
Sizeof (nazwa_typu) //również własne typy
Sizeof (nazwa_obiektu) //np. zmienne
Program
Operator rzutowania:
(nazwa_typu) obiekt lub nazwa_typu(obiekt)
#include <conio.h>
#include <iostream.h>
mainO
{
int a = 85;
char b;
cout << "a= " << a << endl;
b = (char) a; // b = 'U'
cout << "b-- " << b << endl;
b + 'A';
a = (int b; // a = 65
cout << "a—” << a << endl;
getch();
}
Funkcje:
Funkcja jest to podprogram - fragment programu - grupujący instrukcje. Wprowadza się je w celu:
- łatwego powtarzania pewnego cyklu obliczeń (za pomocą, funkcji tworzymy jakby własne obszerne „instrukcje")
- zwiększenia przejrzystości programu
W języku C+ wszystkie podprogramy są funkcjami.
Funkcję wywołuje się przez podanie jej nazwy i w nawiasie (ewentualnych) argumentów.
Program
Przykłady deklaracji funkcji:
fłoat pole_kwadratu( float bok );
float pole_kwadratu( float); // też poprawnie
void fun( int a, float b, char C ); // f. nie zwraca wartości
int przypadek( void ); // brak argumentu
void ppp(); // brak argumentu, nie zwraca wartości
void cc(...); //argumenty? Określi się w definicji funkcji
Przykład definicji funkcji:
float pole_kwadratu( float bok ) // Uwaga: brak średnika
{
return bok*bok; // zwracanie wartości przez nazwę funkcji
}
Uwagi:
- Funkcja ma swoją nazwę, która ją identyfikuje.
- Przed odwołaniem się do nazwy wymagana jest jej deklaracja. Deklaracja, ale nie koniecznie definicja.
- Sama funkcja może być zdefiniowana później.
- Wywołanie funkcji to napisanie jej nazwy wraz z listą argumentów przesyłanych do funkcji, ujętych w nawiasy okrągłe.
Program
Przesyłanie argumentów do funkcji:
■ przez wartość,
■ przez referencję,
■ przez wskaźnik (omówimy później).
Przesyłanie argumentów przez wartość:
W definicji funkcji występują parametry formalne.
Przy wywołaniu funkcji posługujemy się parametrami aktualnymi.
- Do funkcji (przy wywołaniu) przesyłane są tylko wartości parametrów aktualnych.
- Służą one do inicjalizacji parametrów formalnych (operacje wykonywane są na parametrach formalnych).
- Parametry formalne (i inne zadeklarowane w funkcji) są tworzone na stosie (tj. wydzielonym obszarze pamięci, po wyjściu z funkcji zawartość tych zmiennych jest niszczona, a przy kolejnym wejściu jest ona przypadkowa).
- Są one kopiami parametrów aktualnych. Pokazuje to przykład:
Program
Przesyłanie argumentów przez referencje (przezwisko):
- Przy przekazywaniu argumentów do funkcji przez referencje trzeba inaczej zadeklarować funkcję np: void Zamiana(int, int &);
Lub
voidł Zamiana (int x, int &y) ;
Wywołanie
Zamiana(a, b);
- Znak & powoduje, Ze zmienna globalna b i lokalna y zajmują to samo miejsce w pamięci operacyjnej. Inaczej słowo b w pamięci ma referencje (przezwisko) y w funkcji.
- Modyfikując y w funkcji lokalnej, zmieniamy b w funkcji nadrzędnej.
Program
Uwagi:
- Obiekt zdefiniowany na zewnątrz wszystkich funkcji ma zasięg globalny.
- Zmienne globalne umieszczone są w wydzielonym obszarze pamięci, który przed uruchomieniem programu jest zerowany.
- Zmienne lokalne są zmiennymi automatycznymi.
- W momencie, gdy kończymy działanie bloku, w którym zmienne lokalne zostały powołane do życia, automatycznie przestają istnieć.
- Obiekty automatyczne komputer przechowuje na stosie.
- Należy pamiętać, że zmienne automatyczne nie są zerowane w chwili definicji.
- Jeśli nie zainicjowaliśmy Ich Jakąś wartością to przechowują one wartości przypadkowe.
Funkcje inline:
- Wywołanie funkcji wymaga czasu (kilka instrukcji na poziomie języka maszynowego by przejść w inne miejsce programu).
- Jest to istotne jeśli funkcje wykonuje się wiele razy.
- Jeśli funkcja jest krótka (w lini) to w celu przyspieszenia obliczeń używamy funkcji inline. - - Deklarujemy i definiujemy ją na początku programu (albo w pliku nagłówkowym).
- Przy jej wywołaniu kompilator umieści jej treść w miejscu wywołania.
Np. funkcja zaokrąglenia inline int zaok(float x)
{
return (x+0.5)
}
Wywołanie: j=zaok(z)+zaok(f)
Funkcje w programie składającym się z kilku plików:
- Jeśli program jest duży i nie mieści się w jednym pliku, to plik dzieli się na pliki mniejsze,
- Plik można dzielić na mniejsze w miejscu między definicjami funkcji,
- By korzystać w pliku B ze ziemnych (np Int a; float b; char c;) zadeklarowanych w pliku A, to trzeba w pliku B umieścić deklarację
extern int a ;
extern float b;
extern char c ;
(słowo extern informuje kompilator o tym, że zmienna a nicja może znajdować się w innym pliku)
Jeśli chcemy korzystać w pliku B z funkcji znajdujących się w pliku A to także musimy umieścić je w deklaracjach pliku B (nie trzeba dodawać słowa extern - jest ono domniemane).
Wygodnie jest umieścić wszystkie deklaracje funkcji (i deklaracje globalne) w specjalnym pliku - pliku nagłówkowym ( nazwa.h ) Plik ten jest bezpośrednio przed kompilacją włączany do pliku B.
To automatyczne wstawianie realizuje dyrektywa preprocesora ftnclude <nazwa.h>.
Dyrektywa include służy do wstawiania do programu plików z deklaracjami zmiennych i funkcji (np było już funkcji i/o).
Funkcje biblioteczne nie są częścią języka C++ Ktoś je napisał, a ponieważ były dobre, to zrobiono z nich standardowe biblioteki.
By z funkcji tych korzystać, trzeba dyrektywą include włączyć plik nagłówkowy z ich deklaracjami do programu - i można posługiwać się funkcjami jak swoimi.
Funkcje są zdefiniowane w pliku bibliotecznym (tam jest jej treść). Zawartość biblioteki jest dołączana do programu w procesie linkowania.
W celu ułatwienia korzystania z funkcji standardowych są one pogrupowane tematycznie.
Program