Top Banner
06/07/22 1 Sortiranje nizova preko pokazivaca Opet program kojim se korišćenjem odgovarajuće funkcije učitani niz sortira u monotono neopadajući poredak Example No 21 main() { int float a[50]; void citaj(); void pisi(); void sort1(); printf(“\nUneti broj elemenata niza:”); scanf(“%d”,&n); printf(“\nUnesi elemente niza:\n”); citaj(a,n); sortl(a,n); printf(“Niz posle sortiranja je:\n”); pisi(a,n); }
24

Op 10 2528

Jan 24, 2015

Download

Education

Sam programski jezik je uređen konačan
skup znakova za formulisanje programa.
Njegova definicija data u ISO standardu
glasi: programski jezik je veštački jezik koji
se koristi za predstavljanje programa. Sam
program predstavlja sistem oznaka za opis
algoritama i struktura podataka pomoću
kojih ljudi komuniciraju sa računarom. Jednostavnije korišćenje mašinskog jezika dobija se uvođenjem simboličkih imena za naredbe i adreseme morijskih lokacija, a to omogućava asemblerski ili simbolički mašinski jezik. Asemblerski jezik je niskog nivoa, zbog toga što je korespodencija između asemblerskog i mašinskog jezika jedan prema jedan. Programer koristi naredbe računara na kome radi, pa stoga program nije prenosiv - ne može
se izvršiti na drugom računaru bez reprogramiranja.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Op 10 2528

04/10/23 1

Sortiranje nizova preko pokazivaca

• Opet program kojim se korišćenjem odgovarajuće funkcije učitani niz sortira u monotono neopadajući poredak

• Example No 21• main()• {• int• float a[50];• void citaj();• void pisi();• void sort1();• printf(“\nUneti broj elemenata niza:”);• scanf(“%d”,&n);

printf(“\nUnesi elemente niza:\n”); citaj(a,n); sortl(a,n); printf(“Niz posle sortiranja je:\n”); pisi(a,n); }

Page 2: Op 10 2528

04/10/23 2

void citaj(float x[],int n) { int I; for(I=0;I<n;I++) { printf(“x[%d]=“,I); scanf(“%f”,&x[I]); } } void pisi(float x[],int n) { int I; for(I=0;I<n;I++) printf(“x[%d]=%f\n,I,x[I]); }

Page 3: Op 10 2528

04/10/23 3

void razmeni(float*a,float*b) { float pom; pom=*a;*a=*b;*b=pom; } void sort(float a[],int n) { int I,j; for(I=0;I<n-1;I++) for(j=i+1;j<n;j++) if(a[i]>a[j]) razmeni(&a[I],&a[j]); }

Page 4: Op 10 2528

04/10/23 4

ISTI ALGORITAM SE MOGAO PRIMENITI U FUNKCIJI KOJA KORISTI POKAZIVACE:

void sortl(float*a,int n) { int I,j; for(I=0;n-1;I++) for(j=I+1;j<n;j++) if(*(a+I)>*(a+j)) razmeni(a+I,a+j); }

Page 5: Op 10 2528

04/10/23 5

Višedimenzionalni nizovi i pokazivaci

• Dvodimenzionalni nizovi se se u memoriji registruju po vrstama zauzimajući susedne memorijske lokacije.ako se dvodimezionalni niz deklariše na sledeći način:

• int a[3][2] ; njegovi elementi će biti raspoređeni na sledeći način: a [0][0] a [0][1] a [1][0] a [1][1] a [2][0] a [2][1]

• Imajući ovo u vidu, ako definišemo pokazivač na int tip• int * poki, dodelom• poki = a;• definiše pokazivačka promenljiva na element u nultoj vrsti i

koloni jer važi jednakost• a =& a [0][0]

Page 6: Op 10 2528

04/10/23 6

• Prema navedenoj deklaraciji važi:

• poki =& a [0][0]

• Poki+1 =& a [0][1]

• Poki+2 =& a [1][0]

• Poki+3 =& a [1][1]

• Poki+4 =& a [2][0]

• Poki+5 =& a [2][1]

• U ovom primeru a je ime dvodimenzionalnog niza a, a [0], a [1], a [2]

• su imena jednodimenzionalnih nizova koje predstavljaju vrste matrice.

• Ime niza je pokazivač na taj niz jer pokazuje na njegov prvi element, tako da važi:

• a [0] =& a [0][0]

• a [1] =& a [1][0]

• a [2] =& a [2][0]

• Ova osobina nam koristi da funkciju namenjenu za obradu jednodimenzionalnog niza koristimo pri obradi vrsta dvodimenzionalnog niza.

Page 7: Op 10 2528

04/10/23 7

Example No 22• main()• {• static float a[3][4]={• {1.0,2.0,3.0,4.0}, • {11.5,22.4,33.3,44.2},• {10.1,20.2,30.3,40.4}• };• int I;• float sredina();• for (I=0;I 3;I++)• printf(“srednja vrednost vrste %d je %f\n”,I,sredina(a[I],4));• /*a[I] je jednodimenzionalni niz od Četirielementa*/• }• float sredina(float x[],int n)• {• int I;• float suma;• for (I=0,suma= 0;I n;I++)• suma+=x[I]• return suma/n• }

Page 8: Op 10 2528

04/10/23 8

Sortiranje dvodimenzionalnog niza

• main()• {• int I,n;• int x[10][10]• void citaj();• void pisi();• void sort1();• printf(“\nUneti broj vrsta matrice:”);• scanf(“%d”,&n);

printf(“\nUnesi elemente matrice po vrstama :\n); citaj(x,n); sortl(x[I],n); printf(“matrica posle sortiranja je:\n”); pisi(x,n); }

Page 9: Op 10 2528

04/10/23 9

/*funkcija koja ucitava elemente matrice*/ void citaj(int x[][10],int n) {

int I,j; for(I=0;I<n;I++) for(j=0;j<n;j++) {

printf(“x[%d,%d]=“,I,j); scanf(“%d”,&x[I][j]); } }

/*funkcija koja ispisuje elemente matrice*/ void pisi(int x[][10],int n) {

int I,j; for(I=0;I<n;I++) {

for(j=0;j<n;j++) printf(“%3d”,x[I][j]); printf(“\n”); } }

Page 10: Op 10 2528

04/10/23 10

void razmeni(int*a,int*b) { float pom; pom=*a;*a=*b;*b=pom; } void sort(int a[],int n) { int I,j; for(I=0;I<n-1;I++) for(j=I+1;j<n;j++) if(a[I]>a[j]) razmeni(&a[I],a[j]); }

Page 11: Op 10 2528

04/10/23 11

Znakovni nizovi u jeziku c

• Jezik C nema ugrađen znakovni niz podataka . • Umesto toga, jezik C sledove znakova koji se završavaju nultim

znakom (NULL) tretira kao znakovne nizove. • Znakovni nizovi mogu se napraviti deklarisanjem niza znakova i

dodeljivanjem vrednosti njegovim elementima . • Završni znak mora biti nulti znak, koji se prikazuje kao znakovna

konstanta sa vrednošću ‘\0‘. Bez ovog znaka imate običan niz znakova.

Page 12: Op 10 2528

04/10/23 12

( Malo podsećanja)

• main()• {• char c = ‘A‘;• printf(“/ %c / %d / %o / %x \n”,c,c.c,c);• }• Izvrsavanjem programa dobija se:• /A/65//101/41• 65- ASCII dekadna vrednost• 101- ASCII oktalna vrednost • 41- ASCII heksadekadna vrednost

Page 13: Op 10 2528

04/10/23 13

A sad da sumiramo malo

• Znači izraz ‘A‘ je znakovna konstanta

• a, ”A” je prikriven, skraćeni, prikaz konstantnog znakovnog niza sastavljenog iz dve znakovne konstante ‘A‘ i ‘\0‘ .

Page 14: Op 10 2528

04/10/23 14

Inicijalizacija znakovnih nizova

• Rekli smo već da je nizovima je u C jeziku moguće dodeljivati početne vrednosti. Ako se inicijalizacija ne zadaje eksplicitno niz se inicijalizuje nulom, Međutim ako je potrebno da se niz inicijalizuje vrednostima različitim od nule potrebno je da se pri deklaraciji niza izmedju vitičastih zagrada navedu željene vrednosti razdvijene zarezom

Page 15: Op 10 2528

04/10/23 15

Inicijalizacija znakovnih nizova

• Nizovi se mogu inicijalizovati korišćenjem string konstanti. Na promer, operator

• static char tekst [ ]={• ’F’,’e’,’s’,’t’,’i’,’n’,’a’,’t’,’a’,’m’, ’s’.’e’,’m’,’e’,’n’,’t’,’e’,’m’,’

s’,’a’,’e’,’p’,’e’, ‘d’,’e’,’c’,’i’,’p’,’e’,’r’,’e’,’, ‘s’,’e’,’r’,’o’,’t’,’i’,’n’,’a’,’m’,’s’,’e’,’m’,’p’,’e’,’r’,’\0’

• }; • inicijalizuje statički niz tekst datom string konstantom

ili skraćeni oblik inicijalizacije izgleda ovako:

• static char tekst [ ]={• “Festinatam sementem saepe decipere, serotinam

semper” • };

Page 16: Op 10 2528

04/10/23 16

Nizovi karaktera i pokazivači

Pošto je ime niza ekvivalentno adresi njegovog nultog elementa ( predstavlja pokazivač na nulti element) tako je i string konstanta pokazivač na nulti element niza u kome je registrovan string.

• Operator

• Static char s[ ] = “ IBM PC” ; inicijlizije statički niz s datom string konstantom On predstavlja skraćeni oblik inicijalizacije

• Static char s[ ] = {‘I’,’B’,’M’, ‘P’,’C’, ‘\0’};

• Ako bi se izostavio završni znak to više ne bi bio string već samo niz znakova.

• Kao i kod drugih nizova ime s predstavlja pokazivač na nulti element.

• s =& s[0], *s = ‘I ’, *(s +1) = s[1] = ‘B ’,

Page 17: Op 10 2528

04/10/23 17

Nizovi karaktera i pokazivači

• Za kreiranje stringa može se koristiti i pokazivač Na primer deklaracijom

• Char *pok = “Festinatam sementem saepe decipere, serotinam semper” ;

• pokazivač pok je inicijalizovan adresom nultog znaka stringa • Ekvivalentna inicijalizacija se može realizovati sledećim operatorima • Char *pok;• pok = “Festinatam sementem saepe decipere, serotinam semper” ;• Za razne operacije nad ovim stringom dovoljno je da znamo adresu

njegovog nultog znaka

Page 18: Op 10 2528

04/10/23 18

Example N0 .... koji ispisuje string u direktnom i inverznom poretku.

• main()• {• static char s[ ]={ “Festinatam sementem saepe decipere,

serotinam semper” };• char *pok;• pok = s;• while (*pok) /*ili while (*pok!= ’\0’ ) */ • putchar (*pok++);• while (--pok >=s)• putchar (*pok);• putchar (’\n’ );• }

Page 19: Op 10 2528

04/10/23 19

Inicijalizacija stringova

• Opisom stringa pomoću niza u statičkoj memoriji se kreira niz. Svaki element niza se inicijalizuje odgovarajućim znakom a ime niza postaje sinonim adrese nultog elementa. Ime niza je konstanta pokazivačkog tipa koja se ne može menjati.

• Opisom stringa pomoću pokazivača takođe se u statičkoj memoriji kreira niz ali i rezerviše memorijski prostor za pokazivačku promenljivu koja pokazuje na početak stringa. Njena vrednost se može menjati na primer sa ++ pok da bi se definisao pokazivač na sledeći znak stringa.

Page 20: Op 10 2528

04/10/23 20

Pokazivači na stringove

• Primer funkcije kojom se na osnovu parametara koji je

• POKAZIVAČ NA STRING • ispituje da li je dati string palindrom

Page 21: Op 10 2528

04/10/23 21

Funkcija palindrom

int palindrom (char * strpok) { char *strpok1 = strpok; while (*strpok1) ++strpok; --strpok1; /* povratak unazad za jedan znak */ While (strpok<strpok1) if(*strpok++!=*strpok1--) /* poredjenje simetricnih znakova*/ return 0; return 1; }

Page 22: Op 10 2528

04/10/23 22

Nizovi pokazivača na stringove

• Koristeći niz stringova Stringu se može pristupiti preko indexa. Deklaracijom:

• Static char *jezici [4] = {“PASCAL”,”MODULA’’,”C++”, “ADA”};• Definisan je niz pokazivača jezici na stringove • Nulti pokazivač jezici [0] pokazuje na nulti string, prvi pokazivač

jezici [1] pokazuje na prvi string , tako da važi :• *jezici [0]=‘P’, *jezici [1]=‘M’, *jezici [2]=‘C’, *jezici [3]=‘A’.

jezici [0] PASCAL

MODULA

C++

ADA

jezici [1]

jezici [2]

jezici [3]

Page 23: Op 10 2528

04/10/23 23

NIZOVI POKAZIVAČA

#include <stdio.h>main(){static char *dani[] = {"Nedelja",

"Ponedeljak", "Utorak", "Sreda", "Cetvrtak", "Petak",

"Subota"}; int i;for( i = 0; i < 6; ++i ); printf( "%s\n", dani[i]);}

1004 1036 Dan[0]

1008 1044 Dan[1]

....

1032 1077 Dan[6]

1036 N

1037 e

1038 d

1039 l

1040 j

1041 a

1042 k

1043 \0

1044 P

1045 o

..... …..

1052 \0

1053 U

.... …..

1081 t

1082 a

1083 \0

.....

Adr. Vred. Naziv

Rezultat

Nedelja

Ponedeljak

Subota

\0

01

\0

Page 24: Op 10 2528

04/10/23 24

Nizovi pokazivača

• Ime niza je dani. Veličina niza nije specificirana. Prevodilac, onaj bistrooki, će izračunati veličinu niza.

• Svaki element niza je pokazivač na znak. • Zbog prisustva konstantnih znakovnih nizova u inicijalizatorskoj

listi nizovi se smeštaju negde u memoriji, a njihove adrese u NIZ DANI.

• U elementu 0 nalazi se adresa konstantnog znakovnog niza “Nedelja” a, u elementu 1 adresa niza “Ponedeljak”....