složeni tipovi složeni tipovi podatakapodataka––ii dioii...
Post on 26-Jan-2021
20 Views
Preview:
TRANSCRIPT
-
Složeni tipovi Složeni tipovi podatakapodataka –– II dioII dio
Složeni tipovi ?Složeni tipovi ?
Pored dosad proučavanih (skalari, brojni Pored dosad proučavanih (skalari, brojni
nizovi i matrice) C dodatno raspolaže nizovi i matrice) C dodatno raspolaže
sledećim tipovima podataka: sledećim tipovima podataka:
StringoviStringoviStringoviStringovi
ZnakoviZnakovi
StruktureStrukture
UnijeUnije
KorisniKorisnički tipovički tipovi
Pokazivači na strukturePokazivači na strukture
Povezivanje strukturaPovezivanje struktura
Strukture i funkcije Strukture i funkcije
-
StringoviStringoviSTRING?STRING?
Stringovi Stringovi
String je jednodimenzionalni znakovni niz String je jednodimenzionalni znakovni niz
To je niz znakova koji završava nulTo je niz znakova koji završava nul--znakom (znak čiji je kod 0)znakom (znak čiji je kod 0) ’’\\0’0’
Deklaracija stringa:Deklaracija stringa:
char ime[duzina] = ”string” ;char ime[duzina] = ”string” ;char ime[duzina] = ”string” ;char ime[duzina] = ”string” ;
iliilichar ime[duzina] = { znak, znak, … , znak } ;char ime[duzina] = { znak, znak, … , znak } ;
Primjer:Primjer:char grad1[] = ”PODGORICA” ;char grad1[] = ”PODGORICA” ;
char grad2[] = { ’B’,’E’,’R’,’A’,’N’,’E’,’char grad2[] = { ’B’,’E’,’R’,’A’,’N’,’E’,’\\0’ };0’ };
OOznačavanje znakovnih i string konstanti:značavanje znakovnih i string konstanti:
’D’’D’ –– ovo je znak ovo je znak DD
””DD” ” –– ovo je string ovo je string ’D’’D’,,’’\\0’0’
-
StringoviStringoviSTRING?STRING?
Manipulacija stringomManipulacija stringomIspisivanje stringaIspisivanje stringa
ispisivanje pomoću funkcije ispisivanje pomoću funkcije
printf(printf(”%s”, string); ”%s”, string);
ispisivanje pomoću funkcije ispisivanje pomoću funkcije
putsputs((string); string);
PrimjerPrimjer:: PrimjerPrimjer::
#include #include
main()main()
{{
charchar grad[]= grad[]= ””PODGORICAPODGORICA”;”;
printfprintf(”%s(”%s\\n”, grad);n”, grad);
}}
#include #include
main()main()
{{
charchar grad[]= grad[]= ””PODGORICAPODGORICA”;”;
puts(grad);puts(grad);
}}
PODGORICA PODGORICA
-
StringoviStringoviSTRING?STRING?
Manipulacija stringomManipulacija stringomUUččitavanjeitavanje stringastringa
učitavanje pomoću funkcije učitavanje pomoću funkcije
scanf(scanf(”%s”, string); ”%s”, string);
učitavanje pomoću funkcije učitavanje pomoću funkcije
getgetss((string); string);
PrimjerPrimjer::
#include #include
PrimjerPrimjer::
#include #include
main()main()
{{
charchar teksttekst[[5050];];
printfprintf(”(”Unesi recenicu:Unesi recenicu:\\n”);n”);
scanfscanf(”(”%s%s””,, teksttekst););
printf(printf(”%s”, ”%s”, teksttekst););
}}
#include #include
main()main()
{{
charchar teksttekst[[5050];];
printfprintf(”(”Unesi recenicu:Unesi recenicu:\\n”);n”);
getgetss((teksttekst););
printf(printf(”%s”, ”%s”, teksttekst););
}}
Unesi recenicu:
NOVI SAD
NOVI
Unesi recenicu:
NOVI SAD
NOVI SAD
-
StringoviStringoviSTRING?STRING?
Primjer:Primjer: Program koji uProgram koji učitava string, a zatim ispisuje njegovu dužinu.čitava string, a zatim ispisuje njegovu dužinu.
#include #include
int strlen ( char *s )int strlen ( char *s )
{{
int i;int i;
for (i=0; *s!=for (i=0; *s!=’’\\0’0’;; i++)i++);;for (i=0; *s!=for (i=0; *s!=’’\\0’0’;; i++)i++);;
return(i)return(i);;
}}
main()main()
{{
char grad[]=”PODGORICA”;char grad[]=”PODGORICA”;
pprintf(”rintf(”Broj slovaBroj slova: %d: %d”,”,
strlen(grad) strlen(grad) ););
}}
Broj slova: 9
-
StringoviStringoviSTRING?STRING?
Primjer:Primjer: Program koji uProgram koji učitava stringčitava string i pravi kopiju tog stringai pravi kopiju tog stringa..
#include #include
voidvoid strstrcopycopy ( char *s( char *s1, char *s21, char *s2 ))
{{
while ( *s2++ = *s1++ );while ( *s2++ = *s1++ );
}}
main()main()
{{
char original[100]=”PODGORICA”;char original[100]=”PODGORICA”;
char kopija[100];char kopija[100];
strcopy(original, kopija);strcopy(original, kopija);
printf(”%sprintf(”%s\\n”, original);n”, original);
printf(”%sprintf(”%s\\n”, kopija);n”, kopija);
}}
PODGORICA
PODGORICA
-
StringoviStringovi((bibliotekabiblioteka: : string.hstring.h))
strlen() - određivanje dužine stringa bez znaka null na krajustrcmp() - poređenje kompletnih sadržaja dva stringastrncmp() - poređenje djelova sadržaja dva stringastrncmp() - poređenje djelova sadržaja dva stringastrcpy() - kopiranje jednog stringa u drugi, od početka drugogstrncpy() - kopiranje dijela jednog stringa u drugi, od početka drugogstrcat() - kopiranje jednog stringa u drugi, u produžetku sadržaja drugogstrncat() - kopiranje dela jednog stringa u drugi, u produžetku sadržaja
drugog
-
StringoviStringovi((biblioteka: string.h)biblioteka: string.h)
char rec1[ ] = "abc";char rec2[ ] = "abc";char rec3[ ] = "aeo";
printf("%s\n", strcmp(rec1, rec2)? "razliciti":"isti"); istiprintf("%s\n", strcmp(rec1, rec3)? "razliciti":"isti"); razlicitiprintf("%s\n", strcmp(rec2, rec3)? "razliciti":"isti"); razliciti
char rec3[ ] = "aeo";
-
StringoviStringovi
(biblioteka: string.h)(biblioteka: string.h)
// KOPIRANJE STRINGA
#include
#include
int main(void)
{
char bafer[6];
char rec[ ] = "abc";
strcpy(bafer, rec);
puts(bafer);
getchar();
return(0);
}
-
StringoviStringovi
// KOPIRANJE STRINGA
#include
#include
int main(void)
(biblioteka: string.h)(biblioteka: string.h)
{
char bafer[6];
char rec[ ] = "abc";
strcpy(bafer, rec);
puts(bafer);
getchar();
return(0);
}
-
StringoviStringovibiblioteka: stdlib.h)biblioteka: stdlib.h)(biblioteka: string.h)(biblioteka: string.h)
� atoi() za konverziju stringa u ceo broj, ako je to moguće� atof() za konverziju stringa u realan broj, ako je to moguće
//PRIMJER atof()#include #include #include
int main(void){char tekst1[ ] = " 2.5";char tekst2[ ] = "0005";char tekst3[ ] = "10.25 i neki tekst";char tekst4[ ] = "5e+2";char tekst5[ ] = "neki tekst 200.30";printf("\nbroj: %f", atof(tekst1)); //2.500000printf("\nbroj: %f", atof(tekst2)); //5.000000printf("\nbroj: %f", atof(tekst3)); //10.250000printf("\nbroj: %f", atof(tekst4)); //500.000000printf("\nbroj: %f", atof(tekst5)); //0.000000getchar();return(0);}
-
ZnakoviZnakoviznakoviznakovi
Znak potreban programu može biti: slovo, cifra, ostali...
• Tip promenljive za čuvanje znaka – samo jedan: char• Svaki znak je kodiran u ASCII tabeli – pomoću broja• Nema posebnih operatora za znakove!
-
ZnakoviZnakovi
ASCII ASCII TABELATABELA
-
ZnakoviZnakovi
• UPRAVLJAČKI (NEKI)
• 13, Povratak na početak reda, '\r'
• 12, Prelaz na novu stranu, '\f'
• 11, Vertikalni pomeraj, '\v'• 11, Vertikalni pomeraj, '\v'
• 10, Prelaz u nov red, '\n'
• 9, Horizontalni pomeraj, '\t'
• 8, Povratak za jedno mesto, '\b‘
• 7, Zvono
-
ZnakoviZnakovi
• Prepoznavanje slova ili cifre u znaku
Prostor u mem.
-
StruktureStruktureSTRUKTURASTRUKTURA??
StruktureStruktureStruktura je skup heterogenih podataka meStruktura je skup heterogenih podataka međusobno logički povezanihđusobno logički povezanih
Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)
Atributi?Atributi?Atributi?Atributi?
prezimevisina
ime
struct osoba struct osoba {{
char prezime[15];char prezime[15];
char ime[15];char ime[15];
int visina;int visina;
}}
-
StruktureStruktureSTRUKTURASTRUKTURA??
Deklaracija struktureDeklaracija strukture
OpOpšti oblik deklaracije:šti oblik deklaracije:
struct ime struct ime {{
tip1tip1 element1element1;;
tip2tip2 element2element2;;tip2tip2 element2element2;;
......
tipNtipN elementNelementN;;
}} lista_promjenljivih;lista_promjenljivih;
ključna riječ
ime strukture
Deklaracija
elementa (polja)
lista promjenljivih
ovog tipaPrimjer:Primjer:
struct osoba struct osoba {{
char prezime[15];char prezime[15];
char ime[15];char ime[15];
int visina;int visina;
}} student1, student2, student1, student2, klub[100];klub[100];
-
StruktureStruktureSTRUKTURASTRUKTURA??
Pristup elementima (poljima) strukturePristup elementima (poljima) strukture
Pristup pomoPristup pomoću operatoraću operatora
”.” = ELEMENT STRUKTURE ”.” = ELEMENT STRUKTURE
Primjer:Primjer:
struct osoba struct osoba {{struct osoba struct osoba {{
char prezime[15];char prezime[15];
char ime[15];char ime[15];
int visina;int visina;
}} student, student, klub[100];klub[100];
Pristup poljima:Pristup poljima:
student.prezimestudent.prezime = ”Markovic”; = ”Markovic”; klubklub[1][1].prezime.prezime = ”Jankovic”;= ”Jankovic”;
student.imestudent.ime = ”Marko”;= ”Marko”; klubklub[1][1]..ime = ”Janko”;ime = ”Janko”;
student.visinastudent.visina = 190;= 190; klubklub[1][1]..visina = 202;visina = 202;
-
StruktureStruktureSTRUKTURASTRUKTURA??
Primjer: Primjer: Ilustracija strukturaIlustracija struktura
#include #include #include #include
struct struct evid evid {{char prezime[50];char prezime[50];char ime[50];char ime[50];int maticni;int maticni;
} trazena = {"Stojanovic","Radovan",234}, osoba;} trazena = {"Stojanovic","Radovan",234}, osoba;} trazena = {"Stojanovic","Radovan",234}, osoba;} trazena = {"Stojanovic","Radovan",234}, osoba;
int main()int main(){{int a,b,c;int a,b,c;printf("Upisi Prezime Ime osobe i maticni broj ");printf("Upisi Prezime Ime osobe i maticni broj ");scanf("%s %s %d", osoba.prezime, osoba.ime, &osoba.maticni);scanf("%s %s %d", osoba.prezime, osoba.ime, &osoba.maticni);//printf("%s %s %d",osoba.prezime, osoba.ime, osoba.maticni);//printf("%s %s %d",osoba.prezime, osoba.ime, osoba.maticni);a=strcmp(osoba.prezime, trazena.prezime);a=strcmp(osoba.prezime, trazena.prezime);b=strcmp(osoba.ime, trazena.ime);b=strcmp(osoba.ime, trazena.ime);if((!a && !b)&&(osoba.maticni=trazena.maticni))if((!a && !b)&&(osoba.maticni=trazena.maticni))printf("WANTED");printf("WANTED");elseelseprintf("PASS");printf("PASS");getchar();getchar();getchar();}getchar();}
-
UnijeUnijeUNIJAUNIJA??
UnijeUnijeUnija je skup Unija je skup podataka različitih tipova smještenih u istom memorijskom prostoru.podataka različitih tipova smještenih u istom memorijskom prostoru.
Podaci u uniji nisu međusobno nezavisni, jer koriste isti memorijski prostor.Podaci u uniji nisu međusobno nezavisni, jer koriste isti memorijski prostor.
Promjena jednog podatka može dovesti i do promjene drugog podatka u uniji.Promjena jednog podatka može dovesti i do promjene drugog podatka u uniji.Promjena jednog podatka može dovesti i do promjene drugog podatka u uniji.Promjena jednog podatka može dovesti i do promjene drugog podatka u uniji.
Unija zauzima u memoriji onoliko bajtova koliko je potrebno za memorisanje Unija zauzima u memoriji onoliko bajtova koliko je potrebno za memorisanje
najvećeg podatka u unijinajvećeg podatka u uniji
MEMORIJA
Podatak1Podatak1
(2 bajta)(2 bajta)
Podatak2Podatak2
(1 bajt)(1 bajt)
Zajednička oblast
za podatak1 i za podatak2 Unija zauzima
ukupno 2 bajta
-
UnijeUnije
UNIJAUNIJA??
Deklaracija Deklaracija unijeunijeOpOpšti oblik deklaracije:šti oblik deklaracije:
union ime union ime {{
tip1tip1 element1element1;;
tip2tip2 element2element2;;tip2tip2 element2element2;;
......
tipNtipN elementNelementN;;
}} lista_promjenljivih;lista_promjenljivih;
ključna riječ
ime unije
Deklaracija
elementa (polja)
lista promjenljivih
ovog tipaPrimjer:Primjer:
union unija union unija {{
char char c;c;
intint ii;;
}} x; x;
-
UnijeUnije
UNIJAUNIJA??
Deklaracija Deklaracija unijeunijeAlternativniAlternativni oblik deklaracije:oblik deklaracije:
union ime union ime {{
tip1tip1 element1element1;;
tip2tip2 element2element2;;
Primjer:Primjer:
union unija union unija {{
char char cc;;
int iint i;;tip2tip2 element2element2;;
......
tipNtipN elementNelementN;;
}};;
unionunion ime lista_prom;ime lista_prom;
int iint i;;
floatfloat ff;;
};};
unionunion unija xunija x;;
Pristup elementima (poljima) unijePristup elementima (poljima) unijexx..i = 100;i = 100;
x.c = ’A’;x.c = ’A’;
-
UnijeUnije
UNIJAUNIJA??
Primjer:Primjer:
#include #include
union unija union unija {{
char char cc;;
4141
0101x.ix.i
x.cx.c
char char cc;;
int iint i;;
};};
main()main()
{{
union unija xunion unija x;;
x.i = 0x141;x.i = 0x141;
printf(”printf(”x.i = %dx.i = %d\\n”, x.i);n”, x.i);
printf(”printf(”x.x.cc = %= %cc\\n”, x.c);n”, x.c);
}}
MEMORIJA
x.i = 321
x.c = A
-
Korisnički tipoviKorisnički tipovi
Kako definisati vlastiti tipKako definisati vlastiti tip??
Definisanje korisniDefinisanje korisniččkihkih tipovatipovaC omogućava:C omogućava:
definisanje korisničkih tipovadefinisanje korisničkih tipova
promjenu imena postojećim tipovimapromjenu imena postojećim tipovima
Opšti oblik:Opšti oblik:
typedef staritip novitip;typedef staritip novitip;
Primjeri:Primjeri:
typedef int INTEGER;typedef int INTEGER;
INTEGER i,j;INTEGER i,j;
----------------------------------------------
typedef float NIZtypedef float NIZ[100][100];;
NIZ niz1, niz2;NIZ niz1, niz2;
----------------------------------------------
typedef typedef struct {struct {
int i;int i;
char c;char c;
}} TIPTIP;;
TIP niz[10];TIP niz[10];
-
PokazivačiPokazivači na strukturena strukture
POINTER NA POINTER NA
STRUKTURU?STRUKTURU?
Pokazivači na strukturePokazivači na strukture
Neka imamo strukturuNeka imamo strukturu
struct datum struct datum { {
Tada moTada možežemo da mo da definišemo:definišemo:
struct datum struct datum rodjen,rodjen, *pokaz *pokaz ;;
struct datum struct datum { {
int dan;int dan;
int mjesec;int mjesec;
int godina;int godina;
};};
Pokazivač na strukturu datum
(još uvijek ne pokazuje
nikakav konkretan podatak)
Ako želimo da Ako želimo da pokazpokaz pokazuje pokazuje rodjenrodjen: :
*pokaz = &rodjen ;*pokaz = &rodjen ;
pokaz sada pokazuje na
promjenljivu rodjen (sadrži
adresu promjenljive rodjen)
-
PokazivačiPokazivači na strukturena strukturePOINTER NA POINTER NA
STRUKTURU?STRUKTURU?
Pristup elementima strukturePristup elementima strukture
Neka imamoNeka imamo
struct datum struct datum { {
intint dandan;;
intint mjesecmjesec;;
intint godinagodina;;
}} rodjenrodjen, , *pokaz = &rodjen ;*pokaz = &rodjen ;
Pristup elementima strukture:Pristup elementima strukture:
rodjen.dan = 1;rodjen.dan = 1;
rodjen.mjesec = 4;rodjen.mjesec = 4;
rodjen.godina = 1985;rodjen.godina = 1985;
Pristup elementima strukture preko pokazivača:Pristup elementima strukture preko pokazivača:
(*pokaz).dan = 1;(*pokaz).dan = 1;
(*pokaz).mjesec = 4;(*pokaz).mjesec = 4;
(*pokaz).godina = 1985;(*pokaz).godina = 1985;
iliilipokazpokaz-->dan = 1;>dan = 1;
pokazpokaz-->mjesec = 4;>mjesec = 4;
pokazpokaz-->godina = 1985;>godina = 1985;
-
PokazivačiPokazivači na strukturena strukture
POINTER NA POINTER NA
STRUKTURU?STRUKTURU?
Pristup elementima strukturePristup elementima strukture
Primjer:Primjer:
#include #include
main()main()
{{
Obartiti pažnju
na pridruživanje
{{
struct datum struct datum { int dan{ int dan, , mjesecmjesec, , godina;godina; }}; ;
struct datum r, *p = &r;struct datum r, *p = &r;
pp-->dan = 1;>dan = 1;
pp-->mjesec = 4;>mjesec = 4;
pp-->godina = 1985;>godina = 1985;
printf(”Datum: %02d.%02d.%d.printf(”Datum: %02d.%02d.%d.”,”, r.dan, r.mjesec,r.godinar.dan, r.mjesec,r.godina););
}}
Datum: 01.04.1985.
-
PokazivačiPokazivači na strukturena strukturePOINTER U POINTER U
STRUKTURI?STRUKTURI?
Pokazivač u strukturiPokazivač u strukturiPokazivač može da bude element strukturePokazivač može da bude element strukture
struct primjer struct primjer { int { int *p1, *p2*p1, *p2;; }} clan;clan;
Pristup pokazivaču u strukturiPristup pokazivaču u strukturi
*clan.p1 *clan.p1 odnosnoodnosno *clan.p2*clan.p2
x=2 y=5
Primjer:Primjer:
#include #include
main()main()
{{
int x,y;int x,y;
struct primjer struct primjer { int { int *p1, *p2*p1, *p2;; }};;
struct primjer proba, *pok = &proba;struct primjer proba, *pok = &proba;
proba.p1 = &x; *proba.p1 = 2;proba.p1 = &x; *proba.p1 = 2;
pokpok-->p2 = &y; *pok>p2 = &y; *pok-->p2 = 5;>p2 = 5;
printf(”x=%d y=%dprintf(”x=%d y=%d”,”, x,yx,y););
}}
-
PokazivačiPokazivači na strukturena strukture
POVEZANE POVEZANE
STRUKTURE?STRUKTURE?
Povezane strukturePovezane strukture
Kombinovanjem pokazivača na strukturu i strukture sa pokazivačem Kombinovanjem pokazivača na strukturu i strukture sa pokazivačem
možemo da dobijemo možemo da dobijemo strukturu sa pokazivačem na istu strukturustrukturu sa pokazivačem na istu strukturu tj. tj.
imamo imamo povezane strukturepovezane strukture
struct element struct element { { informaciono
struct element struct element { {
tiptip infoinfo;;
struct element *next;struct element *next;
}} prvi, drugi;prvi, drugi;
pokazivač na istu strukturu
(omogućava povezivanje struktura i
pravljenje liste – dinamičkog niza)
informaciono
polje u strukturi
prviprvi
Aprvi.next = &drugiprvi.next = &drugi
prviprvi..infoinfo prviprvi..nextnext
drugidrugi
B
drugidrugi..infoinfo drugidrugi..nextnext
-
Povezivanje strukturaPovezivanje struktura
POVEZANE POVEZANE
STRUKTURE?STRUKTURE?
Linearna jednostruko povezana listaLinearna jednostruko povezana lista
00glavaglava
linklinkinfoinfo linklinkinfoinfo
struct element struct element { {
tiptip infoinfo;;
struct element *link;struct element *link;
}} *glava;*glava;
Linearna dvostruko povezana listaLinearna dvostruko povezana lista
glavaglava
DDinfoinfoLL
reprep00 00
-
Povezivanje strukturaPovezivanje struktura
POVEZANE POVEZANE
STRUKTURE?STRUKTURE?
Binarno stabloBinarno stabločvor
korijenkorijen
infoinfo
LL DD
Lijevo
podstablo
0 0Desno
podstablo
0
0 0 0 0
-
StruktureStrukture ii funkcijefunkcije
Argument funkcije može biti:
� struktura – po vrijednosti
� pokazivač na strukturu – po referenci� pokazivač na strukturu – po referenci
Povratna vrijednost od funkcije može biti:
� struktura
� pokazivač na strukturu
-
StruktureStrukture ii funkcijefunkcije
Struktura- argument
funkcije
struct adresa{char ime_ulice[31];int broj_ulaza; };void stampa(struct adresa x);
Deklaracija funkcije čiji
je argument struktura
Struktura se može predati funkciji kao argument, a funkcija može vratiti strukturu onome ko ju je pozvao. Predajom strukture kao argumenta u funkciju se prenose kopije svakog njenog elementa tj. vrši se prenos po vrijednosti.
void stampa(struct adresa x);main(){struct adresa a1={“Ime”, 1};stampa(a1);}void stampa(struct adresa x){printf(“%s ”, x.ime_ulice);printf(“%d ”, x.broj_ulaza}
je argument struktura
Pri pozivu funkcije
po vrijednosti strukture
formalna struktura x
dobija sadržaj stvarne
strukture a1
-
StruktureStrukture ii funkcijefunkcijePokazivač na niz struktura – argument
funkcije
struct adresa{char ime_ulice[31];int broj_ulaza; };void stampa(struct adresa niz[ ], int n);main()main(){ struct adresa spisak[ ] = {“Ime1”, 1, “Ime2”, 2, “Ime3”, 3};stampa(spisak, 3);}void stampa(struct adresa niz[ ], int n){ int i;for(i=0; i
-
StruktureStrukture ii funkcijefunkcijeStruktura rezultat od funkcije
struct adresa{char ime_ulice[31];int broj_ulaza; };struct adresa izmena(struct adresa x);main()main(){ struct adresa a1 = {“Ime1”, 1}, a2;a2 = izmena(a1);printf("%s %d ", a2.ime_ulice, a2.broj_ulaza);}struct adresa izmena(struct adresa x){ struct adresa y;strcpy(y.ime_ulice,x.ime_ulice);puts(“Novi broj ulaza”); scanf(“%d”, &y.broj_ulaza);return y;} Prima strukturu a1 preko strukture x, kopira x u
strukturu y, vraca y, struktura a2 poprime vrijednost y.
top related