wyklad 04


wykład C++
dr Gabriela Omiecińska
Tablice
Tablica jest strukturą danych zło\oną z określonej liczby elementów tego
samego typu.
Tablice zawsze zajmują ciągły obszar pamięci.
Cała tablica nosi jedną nazwę, a dostęp do poszczególnych elementów
otrzymujemy za pomocą indeksów.
typ identyfikator_tab[rozmiar1][rozmiar2]...[rozmiarN];
Rozmiar jest wyra\eniem stałym typu całkowitego, mo\liwym do
obliczenia w trakcie kompilacji.
wykład C++
dr Gabriela Omiecińska
Tablice jednowymiarowe
typ nazwa[rozmiar];
int tab[5];
float tabf[2*7];
const int ROZMIAR=5;
int tab[ROZMIAR];
#define ROZMIAR 5
int tab[ROZMIAR];
Indeksy tablic zaczynają się od zera
tab[0] tab[1] tab[2] tab[3] tab[4]
wykład C++
dr Gabriela Omiecińska
Tablice dwuwymiarowe
typ nazwa[rozmiar1][rozmiar2];
double x[2][3];
const int r1=2, r2=3;
double x[r1][r2];
Tablica ta składa się z następujących elementów:
x[0][0] x[0][1] x[0][2]
x[1][0] x[1][1] x[1][2]
wykład C++
dr Gabriela Omiecińska
Inicjalizacja tablic
1) Deklaracja tablicy na zewnątrz wszystkich funkcji programu jest
inicjalizowana zerami.
float macierz [10][2];
int main()
{
..................
}
wykład C++
dr Gabriela Omiecińska
2) Deklaracja tablicy w bloku funkcji ze słowem static
inicjalizowana jest zerami.
int main()
{
static double tab[4];
............................
}
Zmienne statyczne lokalne, czyli deklarowane ze słowem static istnieją przez cały
czas wykonywania programu (umieszczane są w tym samym obszarze danych co
zmienne globalne, które domyślnie są uwa\ane za statyczne).
wykład C++
dr Gabriela Omiecińska
3) Wypisując w nawiasach klamrowych wartości:
float tab[3]={1.1, 2.2, 3.3};
tab[0]=1.1 tab[1]=2.2 tab[2]=3.3
Gdy inicjalizujemy tablicę w deklaracji mo\na pominąć jej rozmiar
int y[ ]={1, 2, 3, 4};
y[0]=1 y[1]=2 y[2]=3 y[3]=4
Ilość elementów na liście inicjalizacyjnej mo\e być mniejsza ni\ rozmiar
tablicy, wtedy pozostałe wartości są zerami.
float tab [5]={1, 2, 3};
tab[0]=1 tab[1]=2 tab[2]=3 tab[3]=0 tab[4]=0
wykład C++
dr Gabriela Omiecińska
int x[3][2]={{10, 0}, {20, 0}, {0, 0}};
x[0][0]=10 x[0][1]=0
x[1][0]=20 x[1][1]=0
x[2][0]=0 x[2][1]=0
Tablice dwuwymiarowe umieszczane są w pamięci wierszami.
int x[3][2]={10, 0, 20, 0, 0, 0};
Je\eli przed nawiasem klamrowym zmykającym występują zera to mo\na je
pominąć w zapisie.
int x[3][2]={{10}, {20}};
int x[3][2]={10,0,20};
wykład C++
dr Gabriela Omiecińska
Błędem jest podanie większej liczby wartości inicjalizujących ni\ podany
rozmiar.
wykład C++
dr Gabriela Omiecińska
Wprowadzanie wartości do tablicy
jednowymiarowej
#define N 10
30
int main()
{
float w[N], suma;
int i;
for(i=0; i{
cout<<"w ["<cin>>w[i];
}
suma=0;
for(i=0; isuma+=w[i];
cout<<"suma wynosi "<return 0;
}
wykład C++
dr Gabriela Omiecińska
Wprowadzanie wartości do tablicy
y[0][0]=1
dwuwymiarowej
#define W 2
y[0][1]=2
#define K 3
int main() y[0][2]=2
{
y[1][0]=22
double y[W][K];
int i, j;
y[1][1]=33
for(i=0; i< W ; i++)
for( j=0; j< K; j++)
y[1][2]=11
{
cout<<"y["<cin>>y[i][j];
}
......
}
wykład C++
dr Gabriela Omiecińska
Uwaga!
W trakcie wykonywania programu nie jest ju\ sprawdzane, czy nie
przekroczyliśmy zakresu, zatem przypisanie y[100][100]=1 nie jest
sygnalizowane jako błąd.
wykład C++
dr Gabriela Omiecińska
Tablice znakowe
char imie[20];
Deklarację tablicy znakowej mo\emy połączyć z jej inicjalizacją np.
char imie[]={ A , n , i , a };
'A' 'n' 'i' 'a'
char imie[]="Ania";
Jest to tablica pięcioelementowa. Ostatnim elementem tej tablicy jest znak o
kodzie 0, czyli NULL.
'A' 'n' 'i' 'a' '\0'
wykład C++
dr Gabriela Omiecińska
char imie[4]="Ania";
Zabrakło miejsca na znak kończący NULL.
char imie[7]={ 'A', 'n', 'i', 'a'};
A n i a \0 \0 \0
cout< wykład C++
dr Gabriela Omiecińska
Funkcje do pracy na tablicach znakowych
Poza deklaracją nie mo\na przypisać wartości całej tablicy znakowej.
imie[ ]= Ania ; //błąd
Mo\na to zrobić jedynie za pomocą funkcji strcpy.
char imie[15];
strcpy(imie, Ania );
n=strlen(imie); zwraca długość ciągu znaków bez znaku NULL //4
strcat(imie, "ma psa"); dołącza do pierwszego ciągu znaków drugi
cout<Ania ma psa
wykład C++
dr Gabriela Omiecińska
char n1[20]="Ania", n2[20]="Tomek";
int i, i1, i2;
i=strcmp(n1, n2); porównuje dwa ciągi znaków
cout<i1=strcmp(n2, n2);
cout<i2=strcmp(n2, n1);
cout< wykład C++
dr Gabriela Omiecińska
Sortowanie tablic znakowych
char t[4][10];
for(int i=0;i<4;i++)
cin>>t[i];
for(int i=0; i<4; i++)
for(int j=i; j<4; j++)
if(strcmp(t[i], t[j])==1){
char temp[10];
strcpy(temp,t[i]);
strcpy(t[i],t[j]);
strcpy(t[j],temp);
}
for(int i=0; i<4; i++)
cout< wykład C++
dr Gabriela Omiecińska
Tablice a wskazniki
Podczas kompilacji nazwa tablicy przekształcana jest na stały wskaznik
do pierwszego jej elementu.
Ka\da operacja na zmiennej indeksowanej mo\e być zastąpiona operacją
na wskaznikach.
wykład C++
dr Gabriela Omiecińska
int tab[3]={1,2,3};
adres pierwszego elementu
tab &tab[0]
wartość pierwszego elementu
*tab tab[0]
wykład C++
dr Gabriela Omiecińska
int tab[10];
tab jest stałym wskaznikiem i nie mo\e być modyfikowany,
jest on nie modyfikowalną l-wartością.
Błędne są instrukcje
tab=tab+1; //błąd
tab=wsk; //błąd
Stały wskaznik mo\na przypisać niestałemu wskaznikowi.
int *wsk;
wsk=tab; wsk=&tab[0];
wsk++;
wykład C++
dr Gabriela Omiecińska
Operacje na wskaznikach.
wykład C++
dr Gabriela Omiecińska
short tab[5]={11, 22, 33, 44, 45};
Zwiększenie wartości wskaznika odbywa się skokowo, jego wartość jest
zwiększana o pewną stałą porcję zale\ną od typu danych na jaki pokazuje.
tab tab +1 tab +2 tab +3 tab +4
11 22 33 44 55
1000 1002 1004 1006 1008
typ *wsk;
(wsk+n) wskazuje na obszar odległy o n*sizeof (typ) bajtów od adresu
zawartego w wsk.
wykład C++
dr Gabriela Omiecińska
wykład C++
dr Gabriela Omiecińska
int tab[5]={11, 22, 33, 44, 55};
tab[i] oznacza to samo w notacji wskaznikowej co *(tab+i).
wsk=tab;
cout<<*wsk;
11
22
cout<<*(wsk + 1) ;
Instrukcje zwiększają wartość elementu wskazywanego:
*wsk=*wsk+1;
*wsk+= 1;
(*wsk)++;
wykład C++
dr Gabriela Omiecińska
int tab[5]={11, 22, 33, 44, 55};
wsk=tab;
cout<<*wsk;
cout<<*wsk++ ; cout<<*wsk;
wsk++;
cout<<*wsk;
wykład C++
dr Gabriela Omiecińska
Dynamiczny przydział pamięci dla tablic
float *wsk;
wsk=new float[N];
Operator new zwraca wskaznik do pierwszego elementu tablicy.
Powy\sze dwie linijki mo\na skrócić do jednej
float *wsk=new float[N];
Zwrócenie pamięci przydzielonej na tablicę
delete [ ] wsk;
Brak nawiasów nie jest sygnalizowane jako błąd,
ale nie ma gwarancji, \e program będzie
zachowywał się poprawnie.
wykład C++
dr Gabriela Omiecińska
int N;
cout<< ile elementów ma mieć wektor <cin>>N;
int *wsk;
wsk=new int[N];
*wsk=44;
wsk[0]=44;
*(wsk+1)=55;
wsk[1]=55;
*(wsk+2)=66;
wsk[2]=66;
wykład C++
dr Gabriela Omiecińska
int **tablica;
int N, M;
cin>>N>>M;
tablica = new int *[M];
for(int i=0; itablica[i] = new int [N];
for(int i=0; idelete [] tablica[i];
delete [] tablica;
wykład C++
dr Gabriela Omiecińska
Je\eli przydzielenie pamięci się nie powiodło mo\emy wywołać funkcję,
która w takim wypadku przejmie sterowanie programem. Funkcja ta nazywa
się set_new_handler(fun), argumentem tej funkcji jest wskaznik do funkcji,
która ma być wywołana w przypadku niekorzystnego przydziału pamięci.
Deklaracja tej funkcji jest w pliku nagłówkowym
wykład C++
dr Gabriela Omiecińska
#include
#include
using namespace std;
void brak_pamieci(void)
{
cout<< zabraklo pamieci <system("PAUSE");
exit(1);
}
int main( )
{
set_new_handler(brak_pamieci);
int *w1[10000];
for(int i=0; i<10000; i++)
{
w1[i]=new int[10000];
}
system("PAUSE");
return 0;
}
wykład C++
char txt[3][4]={"aaa","bbb","ccc"};
dr Gabriela Omiecińska
txt[0] txt[0]+1 txt[0]+2
a a a \0
txt txt[0]-wektor 4 elem
b b b \0
txt+1 txt[1] -wektor 4 elem
c c c \0
txt+2 txt[2] -wektor 4 elem
cout<cout<cout<txt[0] &txt[0][0]
txt[1] &txt[1][0]
txt[2] &txt[2][0]
wykład C++
dr Gabriela Omiecińska
Sama nazwa txt jest wskaznikiem do pierwszego elementu tablicy, czyli
do txt[0].
txt &txt[0]
*txt txt[0] &txt[0][0]
**txt txt[0][0]
**txt='x';
**(txt+1)='z';
*(*(txt+2)+1)='?';
Ogólnie
*(*(txt+i)+j) oznacza to samo co txt[i][j]
wykład C++
dr Gabriela Omiecińska
Działania na wskaznikach
" do wartości wskaznika mo\na dodać lub odjąć liczbę całkowitą,
" mo\na obliczyć ró\nicę wskazników,
" mo\na porównać wskaznik z zerem,
" mo\na porównywać wskazniki między sobą,
" mo\na dokonywać konwersji wskaznikowych,
wykład C++
dr Gabriela Omiecińska
Sposoby inicjalizowania wskazników:
" ustawienie wskaznika tak by pokazywał na jakiś obiekt wstawiając do
niego adres wybranego obiektu,
" wskaznik mo\na ustawić przypisując mu wartość innego wskaznika,
" wskaznikowi mo\na przypisać adres obiektu utworzonego
operatorem new,
" wskaznik mo\na ustawić na początek tablicy, nazwa tablicy jest
jednocześnie adresem jej pierwszego elementu,
" wskaznik mo\na ustawić, aby pokazywał na funkcję.


Wyszukiwarka

Podobne podstrony:
Sieci komputerowe wyklady dr Furtak
Wykład 05 Opadanie i fluidyzacja
WYKŁAD 1 Wprowadzenie do biotechnologii farmaceutycznej
mo3 wykladyJJ
ZARZĄDZANIE WARTOŚCIĄ PRZEDSIĘBIORSTWA Z DNIA 26 MARZEC 2011 WYKŁAD NR 3
Wyklad 2 PNOP 08 9 zaoczne
Wyklad studport 8
Kryptografia wyklad
Budownictwo Ogolne II zaoczne wyklad 13 ppoz
wyklad09
Sporzadzanie rachunku przepływów pienieżnych wykład 1 i 2
fcs wyklad 5
Wyklad08 Zaopatrz wWode
Wyklad3

więcej podobnych podstron