W11 wskazniki na tablice ...

W11 wskazniki na tablice wielowymiarowe i funkcje, Politechnika Opolska, Informatyka, semestr 1
[ Pobierz całość w formacie PDF ]
WSKA
Ź
NIKI I TABLICE WIELOWYMIAROWE
1) Operacje na tablicach wielowymiarowych w zapisie indeksowym:
int
tab[ 3 ][ 5 ] ;
int
i, j ;
for
( i=0 ; i<3 ; i++ )
for
( j=0 ; j<5 ; j++ )
{
printf( ”TAB[%d, %d]= ”, i, j );
//
cout<<”TAB[”<< i <<”,”<< j <<”]=”;
scanf( ”%d” , &tab[ i ][ j ] );
//
cin >> tab[ i ] [ j ];
}
2) Reprezentacja tablicy
int
tab[3][5] w pamięci komputera:
tab
tab+1
tab+2
*
(tab+2)+3
wiersz_0
wiersz_1
wiersz_2
3) Operacje na tablicy dwuwymiarowej w zapisie wskaźnikowym:
int
tab[ 3 ][ 5 ] ;
int
i, j ;
for
( i=0 ; i<3 ; i++ )
for
( j=0 ; j<5 ; j++ )
{
printf( ” TAB[ %d , %d ]= ”, i, j );
scanf( ”%d” ,
*
(tab + i) + j );
//
scanf(”%d”, &
*
(
*
(tab + i) + j)
);
}
//
cin >>
*
(
*
(tab + i) + j)
;
4) Operacje na tablicy dwuwymiarowej bez wykorzystywania indeksów liczbowych:
int
tab[ 3 ][ 5 ] ;
int
(
*
wsk_w) [ 5 ] ;
//
wska
ź
nik na wiersz tzn. na 5-cio elementow
ą
tablic
ę
int
int
*
wsk_k ;
//
wska
ź
nik na kolumn
ę
tzn. na liczb
ę
int
for
( wsk_w = tab ; wsk_w < tab + 3 ; wsk_w++ )
for
( wsk_k =
*
wsk_w ; wsk_k <
*
wsk_w + 5 ; wsk_k++ )
{
printf( ” TAB[ %d , %d ]= ”, wsk_w
-
tab, wsk_k
-
*
wsk_w );
scanf( ”%d” , wsk_k );
}
M.Piasecki: JĘZYKI PROGRAMOWANIA (1)
-
1
-
(W11) Wskaźniki i tablice wielowymiarowe
5) RóŜnica pomiędzy „wskaźnikiem na tablicę” a „wskaźnikiem na wskaźnik”:
int
tab[ 3 ][ 5 ] ;
int i, j ;
tab[ i ][ j ] ==
*
(
*
(tab + i) + j) np. tab[ 0][ 0] ==
*
(
*
(tab+0)+0) ==
**
tab
Dlaczego
tab
jest typu
int (
*
)[5]
a nie typu
int
**
?
int
**
tabD
®
To jest „wskaźnik na wskaźnik na zmienną” (
adres adresu obiektu
):
tabD
*
tabD
**
tabD
int
**
int
*
int
int
**
tabD
®
lub wskaźnik na „
tablic
ę
wska
ź
ników
” na tablice:
tabD
int
int
int
int
int
int
**
*
tabD
int
*
**
(
t
a
b
D+1)
int
*
int
int
int
int
int
*
. . .
int
int
int
int
int
* *
( (tabD+2)+3)
//
przykładowy program tworz
ą
cy dynamiczna struktur
ę
danych j.w.
int
**
tabD = new int
*
[4];
//
lub równowa
Ŝ
nie:
for
( int i=0; i<4; i++ )
//
for( int i=0; i<4; i++ )
*(tabD+i) = new int [5];
//
tabD[ i ] = new int [5];
//
zapis liczby
111
do wybranego elementu tablicy
tabD
*
(
*
(tabD+2) + 3) = 111 ;
//
tabD[ 2 ][ 3 ] = 111 ;
//
zamiana miejscami wierszy o indeksach
1
i
3
int
*
wsk_pom ;
wsk_pom =
*
(tabD +1) ;
//
wsk_pom = tabD[0];
*
(tabD + 1) =
*
(tabD + 3) ;
//
tabD[0] = tabD[3] ;
*
(tabD + 3) = wsk_pom ;
//
tabD[3] = wsk_pom ;
M.Piasecki: JĘZYKI PROGRAMOWANIA (1)
-
2
-
(W11) Wskaźniki i tablice wielowymiarowe
int
WSKAZANIA NA FUNKCJE
®
nazwa funkcji jest stałą równą adresowi kodu funkcji w pamięci komputera
(analogicznie jak nazwa tablicy jest stałą równą adresowi tablicy),
#include <conio.h>
. . .
clrscr ; //
podanie samej nazwy funkcji jest równowa
Ŝ
ne podaniu adresu
//
i nie powoduje
Ŝ
adnej akcji (podobnie jak polecenie 10 ; )
clrscr() ; //
nazwa funkcji z nawiasami () jest traktowana jako „wywolanie
//
funkcji” tzn. polecenie wykonania fragmentu kodu umieszczo-
//
nego pod podanym adresem
®
moŜliwość pośredniego dostępu do funkcji (poprzez zmienną zawierającą adres /
wskazanie na funkcję). Ogólna postać definicji wskaźnika funkcji:
typ_zwracany_przez_funkcj
ę
(
*
nazwa_zmiennej
) (
parametry_funkcji
);
void
clrscr(
void
);
//
prototyp funkcji
clrscr()
void
(
*
nowy_clrscr) (
void
);
//
definicja zmiennej wskazuj
ą
cej na funkcj
ę
. . .
nowy_clrscr = clrscr;
//
przypisanie zmiennej
nowy_clrscr
adresu
clrscr
. . .
clrscr(); //
bezposrednie wywołaniefunkcji
clrscr()
nowy_clrscr(); //
wywolanie funkcji wskazywanej przez zmienn
ą
®
to daje moŜliwość napisania
funkcji, których parametrami s
ą
inne funkcje
!
(wywoływanie funkcji, których adresy zostaną podane dopiero w trakcie wykonywania
programu).
//
np. uniwersalna funkcja licz
ą
ca sume N elementów dowolnego ci
ą
gu
double
Suma_Ciagu(
double
(
*
Element)(
int
) ,
int
ilosc )
{
double
s = 0;
for
(
int
i = 0; i < ilosc; i++ )
s += Element( i );
}
double
Nty_Element (
int
n )
//
1, 1/2, 1/3, 1/4, 1/5, ...
{ return
( 1.0/(n+1) );
}
. . .
printf( ”Suma elementów = %lf”, Suma_Ciagu( Nty_Element , 100 );
. . .
M.Piasecki: JĘZYKI PROGRAMOWANIA (1)
-
3
-
(W11) Wskazania na funkcje
funkcja
qsort
<stdlib.h>
®
implementacja algorytmu sortowania szybkiego (ang. quick sort)
pozwalająca sortować tablice obiektów dowolnego typu
według dowolnego zadanego kryterium (funkcji definiującej relację porządku)
prototyp funkcji:
void
qsort(
void
*
base,
//
adres poczatku sortowanego obszaru
size_t
nelem,
//
ilosc sortowanych elementów
size_t
width,
//
rozmiar pojedynczego elementu
int
(
*
fcmp)(
void
*
,
void
*
)
//
adres funkcji porównuj
ą
ca
);
Przykład sortowania tablicy liczb całkowitych
#include <stdlib.h>
#include <stdio.h>
int liczby_rosnaco( const void
*
, const void
*
);
void wyswietl( int [ ], int );
void main( void )
{
int tab[10] = { 12,
-
1, 3, 0, 10, 1, 2, 6, 4, 9 };
wyswietl( tab, 10 );
qsort( tab, 10, sizeof(int), liczby_rosnaco );
wyswietl( tab, 10 );
}
int liczby_rosnaco( const void
*
wsk_1, const void
*
wsk_2)
{
int
*
wsk_liczby_1,
*
wsk_liczby_2;
wsk_liczby_1 = (int
*
)wsk_1;
wsk_liczby_2 = (int
*
)wsk_2;
return(
*
wsk_liczby_1
-
*
wsk_liczby_2 );
}
void wyswietl( int tab[ ], int ilosc )
{
int i;
for( i = 0; i<ilosc; i++ )
printf( "tab[%d]=%d\n" , i , tab[i] );
}
M.Piasecki: JĘZYKI PROGRAMOWANIA (1)
-
4
-
(W11) Wskazania na funkcje
Przykład sortowania tablicy tekstów
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int teksty_rosnaco( const void
*
wsk_1, const void
*
wsk_2)
{
return( strcmp( (char
*
) wsk_1, (char
*
) wsk_2) );
}
void main( void )
{
char tab_tekstow[5][10] = { "Opel", "Audi", "Ford", "Trabant", "Fiat" };
qsort( tab_tekstow, 5, sizeof( tab_tekstow[0] ) , teksty_rosnaco );
}
Przykład sortowania bazy danych (tablicy struktur)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char nazwisko[31];
char imie[16];
int wiek;
char plec;
float stypendium;
} ;
int wedlug_nazwisk( const void
*
wsk_1, const void
*
wsk_2)
{
struct student
*
osoba_1 = (struct student
*
) wsk_1;
struct student
*
osoba_2 = (struct student
*
) wsk_2;
return( strcmp( osoba_1
->
nazwisko, osoba_2
->
nazwisko );
}
void main( void )
{
#define MAX_IL 100
struct student baza[ MAX_IL ];
. . .
qsort( baza, MAX_IL, sizeof( struct student ), wedlug_nazwisk );
}
M.Piasecki: JĘZYKI PROGRAMOWANIA (1)
-
5
-
(W11) Wskazania na funkcje
  [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • diabelki.xlx.pl
  • Podobne
    Powered by wordpress | Theme: simpletex | © Spojrzeliśmy na siebie szukając słów, które nie istniały.