C++ w3 tablice wskazniki funkcje


TABLICE W JĘZYKU C/C++
Ogólna postać definicji tablicy:
typ_elementu nazwa_tablicy [wymiar_1][wymiar_2] . . . [wymiar_N] ;
np.
int tablica [ 10 ]; // 10-cio elementowa tablica liczb całkowitych
char tekst [ 255 ]; // 255-cio elementowa tablica znaków
float macierz [ 5 ] [ 2 ]; // dwuwymiarowa tablica: 5 wierszy po 2 kolumny,

UWAGA:
* w języku C tablice są zawsze indeksowane od zera
np. pierwszym elementem tablicy "macierz" jest: macierz[ 0 ][ 0 ]
a ostatnim elementem jest: macierz[ wymiar_1 ( 1 ][wymiar_2 ( 1]
tzn. macierz[ 4 ][ 1 ]
* w języku C nie jest sprawdzana zgodność indeksu z wymiarami tablicy !!!
często jest to przyczyną trudnych do wykrycia błędów.
np. odwołanie: macierz[ 1 ][ 2 ] zwróci w rzeczywistości wartość pierwszego elementu z trzeciego wiersza tzn. macierz[ 2 ][ 0 ]
0 , 0
0 , 1

1 , 0
1 , 1
1 , 2
2 , 0
2 , 1

3 , 0
3 , 1

4 , 0
4 , 1

reprezentacja tej macierzy ( w pamięci komputera
0 , 0
0 , 1
1 , 0
1 , 1
2 , 0
2 , 1
3 , 0
3 , 1
4 , 0
4 , 1
(
macierz[ 1 ][ 2 ]

* Obszar pamięci zajmowany przez tablicę musi być mniejszy od 64 kB
W implementacji C++ firmy Borland to ograniczenie można obejść używając przy definicji tablicy słowo kluczowe huge .
np. definicja: long double huge tab[ 20000 ];
jest poprawna, chociaż tablica "tab" zajmuje 200 000 bajtów " 196 kB

Definicję tablicy można połączyć z inicjacją jej zawartości:
int tab[ 10 ]; // ( sama definicja bez inicjacji
int tab_inicjowana[ 10 ] = { 20, -3, 12, 1, 0, 7, -5, 100, 2, 5 };
char tab_znakow[ 5 ] = { 'a', 'B', '\n', '1', '\0' };
float macierz_A[ 3 ][ 2 ] = { {1,1}, {3.5,7.0}, {-15,100} };
float macierz_B[ 3 ][ 2 ] = { 1, 1, 3.5, 7.0, -15, 100 };
* Kolejne "inicjatory" zawsze wstawiane są do kolejnych "komórek" tablicy
(w związku z tym można pominąć wewnętrzne nawiasy klamrowe).
* Jeżeli lista inicjatorów jest krótsza niż ilość elementów tablicy to pozostałe elementy są uzupełniane zerami lub wskaźnikami NULL
np. definicja:
int tab[ 10 ] = { 20, -3, 12, 1 };
jest równoważna:
int tab[ 10 ] = { 20, -3, 12, 1, 0, 0, 0, 0, 0, 0 };
a definicja:
float macierz[ 3 ][ 2 ] = { {1}, {3.5,7.0} };
jest równoważna:
float macierz[ 3 ][ 2 ] = { {1,0}, {3.5,7.0}, {0,0} };
lub:
float macierz[ 3 ][ 2 ] = { 1, 0, 3.5, 7.0, 0, 0 };

* W języku C inicjatorami muszą być stałe, natomiast w języku C++ inicjatorami mogą być zarówno stałe jak i zmienne.

Sposoby dostępu do elementów tablicy:
poprzez podanie pozycji / indeksu elementu tablicy
(w nawiasach kwadratowych analogicznie jak w języku PASCAL) np.
int i, tablica[ 10 ]; // wczytanie 10 liczb (z ew. zmianą znaku)
for( i = 0 ; i < 10 ; i++ )
{
printf( "Tab[%2d] = ", i+1 );
scanf( "%d" , &tablica[ i ] );
if( tablica[ i ] < 0 ) // jeżeli liczba ujemna
tablica[ i ] = ((1)(tablica[ i ]; // to zmień znak
}
poprzez podanie wskaźnika / adresu elementu w pamięci komputera
(przykład znajduje się na stronie nr 6)
Przykłady operacji na tablicach
#include
void main( void )
{
#define ROZMIAR 10
int tab[ ROZMIAR ];
int i, ilosc, max, poz;
long suma;
double srednia;
for( i = 0 ; i < ROZMIAR ; i++ ) //--------- wczytanie liczb z klawiatury
{
printf( "Tab[%2d] = ", i+1 );
scanf( "%d" , &tablica[ i ] );
}
i=0; //--------------------------- zliczenie elementów niezerowych
ilosc=0;
while( ROZMIAR ( i )
if( tab[i++] )
ilosc++;
suma=0; //----------- wyznaczenie średniej z elementów dodatnich
ilosc=0;
i=0;
do
if( tab[ i ] > 0 )
{
suma += tab[ i ];
ilosc++;
}
while( ++i < ROZMIAR );
if( ilosc )
{
srednia = (double)suma / ilosc;
printf( "\nSrednia dodatnich = %.2f" , srednia );
}
else
printf( "\nNie ma elementow dodatnich" );
max=tab[0]; //----------- wyznaczenie wartości i pozycji maksimum
poz=0;
for( i=1; i if( max {
max = tab[ i ];
poz = i ;
}
printf( "\nNajwieksza wartosc jest rowna %d" , max );
printf( "i wystapila na pozycji %d" , poz+1 );
}

WSKAŹNIKI / ADRESY
Wskaźnik jest zmienną, która zawiera adres (wskazanie) początku dowolnego obszaru w pamięci komputera,
(np. może być to adres obszaru danych lub adres kodu programu)

Ogólna postać definicji wskaźnika:
typ_danych ( identyfikator wskaźnika ;
Najczęściej używane są wskaźniki "zdefiniowane" zawierające adres innej zmiennej. Taki wskaźnik zawiera informację o:
* adresie zmiennej w pamięci komputera
* typie danych przechowywanych w tej zmiennej
Przykłady definicji:
int ( wskaznik; // wskaźnik na zmienną całkowitą
double ( wsk_liczby; // wskaźnik na zmienną rzeczywistą
char ( wsk_znaku; // wskaźnik na pojedynczy znak
char ( tekst; // wskaźnik na początek łańcucha znaków
(na pierwszy znak tego łańcucha)
Można również korzystać ze wskaźników "niezdefiniowanych" (anonimowych).
Taki wskaźnik zawiera tylko informację o adresie obszaru pamięci (bez określenia typu wskazywanych danych). Definicja takiego wskaźnika ma postać:
void ( identyfikator wskaźnika ;
jest to wskaźnik na "dowolny" ciąg bajtów danych.
Ze wskaźnikami i adresami związane są dwa operatory:
* operator referencji & zwracający adres zmiennej podanej po prawej stronie tego operatora.
* operator dereferencji ( identyfikujący obszar wskazywany przez wskaźnik podany po prawej stronie tego operatora.
int liczba ;
int (wskaźnik ;
wskaznik = &liczba; // przypisanie zmiennej wskaźnik
// adresu zmiennej liczba
(wskaźnik = 10; // przypisanie 10 zawartości zmiennej
// wskazywanej przez wskaźnik
// tutaj równoważne liczba = 10
Arytmetyka wskaźników
Na wskaźnikach mogą być wykonywane następujące operacje:
* przypisania ( = )
wsk = wskaznik_zmiennej_lub_obszaru_pamięci ;
(w przypadku niezgodności typów konieczne jest dokonanie konwersji typu)
* operacje porównania ( ==, !=, <, >, <=, >= ):
wsk_1 == wsk_2 // sprawdzenie czy zmienne zawierają te same adresy
wsk_1 < wsk_2 // czy zmienna wsk_1 zawiera adres mniejszy
// od adresu zawartego w zmiennej wsk_2
* operacje powiększania lub pomniejszania wskaźnika ( +, (, ++, ((, +=, (= ) o liczbę całkowitą (tylko dla wskaźników zdefiniowanych)
powiększenie (pomniejszenie) wskaźnika o wartość N powoduje wyznaczenie adresu przesuniętego o:
N ( sizeof( typ_zmiennej_wskazywanej )
bajtów w kierunku rosnących (malejących) adresów.
np. int (x;




x





x+3








(





(



















adresy
. . .
35
36
37
38
39
40
41
42
43
44
45
46
. . .
* operacje odejmowania wskaźników tego samego typu wyznaczenie "odległości" pomiędzy dwoma adresami w pamięci.
( odległości w sensie N ( sizeof ( typ_elementu_wskazywanego ) )

Inne przykłady:
int ( wsk_liczby; // wskaźnik na liczbę typu int
int tab_A[10]; // 10-cio elementowa tablica liczb int
( identyfikator tab_A jest stałą równą adresowi
pierwszego elementu tablicy o tej samej nazwie
tzn. tab_A == &( tab_A[0] )
int ( tab_B[10]; // 10-cio elementowa tablica wskaźników na liczby int
int ( ( tab_C[10] ); // jak wyżej
( int () tab_D[10]; // jak wyżej
int ((tab_E)[10]; // wskaźnik na 10-cio elementową tablicę liczb int
PRZYKŁADY: Dostęp do tablic za pomocą indeksów i/lub wskaźników
#include // Część wspólna przykładów na tej stronie
#define ROZMIAR 10
void main(void)
{
int tab[ ROZMIAR ];
// wczytanie liczby do tablicy
( ( ( // przemnożenie elementu tablicy przez 2
// wyświetlenie elementu tablicy
}

a) int i; // dostęp za pomocą indeksu
for( i = 0; i < ROZMIAR; i++ )
{
scanf( "%d", &tab[ i ] );
tab[ i ] = 2 ( tab[ i ]; // tab[ i ] (= 2;
printf( "Tab[ %d ] = %d \n", i+1 , tab[ i ] );
}

b) int i; // dostęp za pomocą adresu i indeksu
for( i = 0; i < ROZMIAR; i++ )
{
scanf( "%d", tab + i ); // &((tab+i) == tab+i
((tab+i) = 2 ( ((tab+i); // ((tab+i) (= 2;
printf( "Tab[ %d ] = %d \n", i+1 , ((tab+i) );
}

c) int licznik, (wsk; // dostęp za pomocą wskaźnika i licznika
for( licznik=0, wsk=tab; licznik < ROZMIAR; licznik++, wsk++ )
{
scanf( "%d", wsk );
(wsk = 2((wsk; // (wsk (= 2;
printf( "Tab[ %d ] = %d \n", licznik+1 , (wsk );
}

d) int (wsk; // dostęp za pomocą wskaźnika
for( wsk=tab; wsk < tab + ROZMIAR; wsk++ )
{ // wsk < &tab[ROZMIAR] ( adres "końca tablicy"
scanf( "%d", wsk );
(wsk (= 2;
printf( "Tab[ %d ] = %d \n", wsk(tab+1 , (wsk );
}
Funkcja wysoce niezależny blok definicji i instrukcji programu (podprogram)
Każdy program napisany w języku C/C++ zawiera przynajmniej jedną funkcję o predefiniowanej nazwie: main( ). Najczęściej wykorzystuje się również wiele innych predefiniowanych funkcji np. printf(...), scanf(...), abs(...), sin(...), itp.
Można również definiować nowe(własne funkcje.
Składnia definicji funkcji:
zwracany_typ NAZWA_FUNKCJI ( lista parametrów )
{
instrukcja lub sekwencja instrukcji ;
}
przykład:
int MAX ( int liczba_1 , int liczba_2 )
{
if( liczba_1 ( liczba_2 )
return liczba_1 ;
else
return liczba_2 ;
}
* lista parametrów może być pusta lub zawierać opisy kolejnych parametrów (pooddzielane przecinkami):
main( ) main( void ) main( int argc , char( argv[ ] )
* parametry definiowane są tak jak zmienne. Uwaga: nie można grupować sekwencji parametrów tego samego typu:
int MAX ( int liczba_1, liczba_2 )
* "ciało" funkcji jest zawarte pomiędzy nawiasami: { ... } (bez średnika na końcu)
* działanie funkcji kończy się po napotkaniu polecenia return lub po wykonaniu sekwencji wszystkich instrukcji zawartych w ciele funkcji,
* jeżeli funkcja jest typu void, to używamy samego słowa return, bez żadnego wyrażenia po nim,
* jeżeli funkcja jest typu innego niż void to po poleceniu return musi się pojawić wyrażenie odpowiedniego typu (może być w nawiasach), np.:
return liczba_1; lub return( liczba_1 ) ;

Prototyp funkcji deklaracja "uprzedzająca", określa tylko nazwę funkcji oraz typy zwracanej wartości i parametrów (sam nagłówek funkcji zakończony średnikiem)

Deklaracja funkcji jest konieczna w przypadkach, gdy wywołanie funkcji występuje wcześniej niż jej definicja. Np.

// program wyznaczający maksimum 3 liczb poprzez wywołanie funkcji MAX

#include

int MAX ( int , int ) ; // Prototyp - deklaracja funkcji MAX


void main( void )
{
int a , b , c , m. ;
printf( " Podaj liczbe A = " );
scanf( " %d " , &a );
printf( " Podaj liczbe B = " );
scanf( " %d " , &b );
printf( " Podaj liczbe C = " );
scanf( " %d " , &c );

m = MAX( a , b ); // Wywolanie funkcji MAX

printf( " \n\nMaksimum z liczb A i B rowna sie = %d " , m ) ;

printf( " \n\nMaksimum z liczb B i C rowna sie = %d " , MAX( b,c ) ) ;

printf( " \n\nMaksimum z A,B,C rowna sie = %d " , MAX( a, MAX(b,c) ) ) ;

flushall();
getchar();
}



int MAX ( int liczba_1, int liczba_2 ) // Definicja funkcji MAX
{
if( liczba_1 ( liczba_2 )
return liczba_1 ;
else
return liczba_2 ;
}

M.Piasecki: JĘZYK "C" (III) 1 Tablice w języku C/C++

M.Piasecki: JĘZYK "C" (III) 4 Wskaźniki / adresy

M.Piasecki: JĘZYK "C" (III) 8 Definiowanie własnych funkcji



Wyszukiwarka

Podobne podstrony:
W10 wskazniki na tablice wielowymiarowe i funkcje
C w6 zmienne dynamiczne wskazniki funkcji
mb C E wyswietlacz tablicy wskaznikow
Demontaż tablicy wskaźników Astra F
C w5 tablice wskazniki
Cinquecento demontaż deski rozdzielczej tablicy wskaźników poradnik
Wskaźnik funkcjonalny Repty
03 Funkcje obsł zbiorów wskazań i tablic
wskazniki,tablice
tablica funkcji i operatorów typy danych
biochemiczne wskaźniki zaburzeń funkcji nerek
tablica funkcji i operatorów
Geneza i funkcjonowanie mitu arkadyjskiego
Fundacje i Stowarzyszenia zasady funkcjonowania i opodatkowania ebook
integracja funkcji
FUNKCJA CHŁODZENIE SILNIKA (FRIC) (ZESPOLONE Z KALKULATOREM
Historia państwa i prawa Polski Testy Tablice

więcej podobnych podstron