Op 10 2528

Post on 24-Jan-2015

138 Views

Category:

Education

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

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.

Transcript

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); }

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]); }

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]); }

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); }

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]

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.

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• }

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); }

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”); } }

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]); }

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.

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

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‘ .

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

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” • };

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 ’,

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

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’ );• }

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.

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

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; }

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]

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

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”....

top related