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 ] |