Strukture. Strukturirani (složeni) tip podataka koji definiše korisnik. Razlike u odnosu na niz

Like dokumenter
Zadatak 1 strukture (C110) P2: Jedanaesta nedelja Strukture i liste. Strukture na jeziku C (2) Strukture na jeziku C (1)

/* Adresu promenjive x zapamticemo u novoj promeljivoj. Nova promenljiva je tipa pokazivaca na int (int*) */ int* px;

1. 0BLINEARNE STRUKTURE PODATAKA

Objektno orijentisano programiranje 2. Tipovi podataka u C#

Složeni tipovi podataka

Del 1 En oversikt over C-programmering

Programiranje 1 grupno spremanje (zadaci) datoteke

Kapittel 1 En oversikt over C-språket

Del 4 Noen spesielle C-elementer

1 REALNE FUNKCIJE REALNE VARIJABLE

ALUMINIJSKE VODILICE ZA ODJELJIVANJE PROSTORA

Uvod u Veb i Internet tehnologije HTML

Izmena i dopuna konkursne dokumentacije

4. Grafič ke funkčije

1. DHB-E 18/21/24 Sli art ELEKTRONIČKI PROTOČNI GRIJAČ VODE

Dagens tema INF2270. Cs preprosessor. Separat kompilering av C funksjoner. C og minnet. Dag Langmyhr,Ifi,UiO: Forelesning 5. februar 2007 Ark 1 av 15

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

IN 147 Program og maskinvare

IN 147 Program og maskinvare

Cs preprosessor. Dagens tema. Betinget kompilering

Primena računara u fizičkoj hemiji. Profesor: Miloš Mojović Asistent: Aleksandar Ignjatović

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

IN 147 Program og maskinvare

Dagens tema: Datastrukturer

Dagens tema INF1070. Signaturer. Typekonvertering. Pekere og vektorer. struct-er. Definisjon av nye typenavn. Lister

EKSAMENSOPPGAVE. INF-1100 Innføring i programmering og datamaskiners virkemåte. Ingen. Elektronisk (WiseFlow) Robert Pettersen

Dagens tema. Adresser som parametre Dynamisk allokering Signaturer Definisjon av nye typenavn Typekonvertering Pekere og vektorer

Del 2 Tabeller, arrays, strenger

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

Signaturer. Dagens tema. En vanlig feil int-funksjon. Dette kan noen ganger gi rare feilmeldinger: INF1070 INF1070 INF1070 INF1070

do minimalno 8 kreativnih objava mjesečno Povlaštena cijena nakon završetka akcije: 900,00 kn

Sveučilište u Zagrebu PMF Matematički odsjek. Mreže računala. Vježbe 04. Zvonimir Bujanović Slaven Kožić Vinko Petričević

IN 147 Program og maskinvare

Minneområder Det er vanlig å dele opp minnet til en prosess i disse ulike områdene: Fast minne Store og små indianere «align» ing struct er

EKSAMENSOPPGAVE. INF-1100 Innføring i programmering og datamaskiners virkemåte. Teorifagb, hus 3, og og Adm.bygget, Aud.max og B.

Kako dostaviti logo. USBnet. Powered by

MATLAB matrični laboratorij Interaktivni alat (kalkulator), programski jezik, grafički procesor

TERMINSKI PLAN RADNO VREME VOJVOĐANSKE BANKE ZA PRIJEM I IZVRŠENJE NALOGA PLATNOG PROMETA

Dagens tema INF1070. Info om C. Cs preprosessor. Feilsøking. Dag Langmyhr,Ifi,UiO: Forelesning 31. januar 2005 Ark 1 av 29

Informasjon om C. Dagens tema INF1070 INF1070 INF1070 INF1070. Den viktigste kilden til informasjon om C (utenom en god. C-funksjonene.

Programmeringsspråket C Del 3. Hans Petter Taugbøl Kragset

MINIMARK stampac za industrijsko obelezavanje

IN 147 Program og maskinvare

Vektorer. Dagens tema. Deklarasjon. Bruk

Dagens tema INF1070. Vektorer (array er) Tekster (string er) Adresser og pekere. Dynamisk allokering

Eksamen FSP5822/PSP5514 Bosnisk nivå II Elevar og privatistar / Elever og privatister. Nynorsk/Bokmål

Dagens tema. Dynamisk allokering Signaturer Definisjon av typer og nye typenavn Typekonvertering Pekere, vektorer og lister Dokumentasjon

Tru64: Uvod - alati i naredbe. Dinko Korunić, InfoMAR d.o.o. v1.2, travanj 2006.

Pekere og vektorer. Dagens tema. I C gjelder en litt uventet konvensjon:

Dagens tema. Det siste om C Pekere og vektorer. Pekere til pekere. Vanlige pekerfeil. struct-er og typedef. Lister. Feilsøking

Neprekidne funkcije nestandardni pristup

Dagens tema C, adresser og pekere

Ark 3 av 26. printf("i adresse %08x ligger b med verdien %d.\n", &b, b); printf("i adresse %08x ligger a med verdien %d.

Løsningsforslag til eksamen i IN 147 og IN 147A

PC i multimedija 3. deo: Audio

Programmeringsspråket C Del 3. Michael Welzl

Programmeringsspråket C

IN 147 Program og maskinvare

1 - Prvi deo upitnika

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Kartlegging av leseferdighet Trinn 2 og 3 på bosnisk

Oppgave 1 JK-flip-flop (Total vekt 20%)

OSNOVNI KONCEPTI GRAFIČKOG PROGRAMIRANJA Interaktivna manipulacija oblikom igra glavnu ulogu u CAD/CAM/CAE sistemima. Programiranje koje kreira

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

GJØVIK INGENIØRHØGSKOLE

Ord og begreper. Norsk Morsmål: Tegning (hvis aktuelt)

Dagens tema INF2270. Signaturer. Typekonvertering. Pekere og vektorer. struct er. Definisjon av nye typenavn. Lister. Info om C

EKSAMENSOPPGAVE. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: JA / NEI Hvis JA: ca. kl. 10:30

C++ versus Java 1. C++ versus Java

PROJEKTOVANJE SOFTVERA

Oving 2. Oppgave 1. #include <stdio.h> int main(int argc, char **argv) { char *navn = argv[1]; printf ("Navnet ditt er %s\n", navn); } Oppgave 2

Repetisjon fra sist - 1: Plan for dagen. Repetisjon fra sist 2: Hva jeg glemte sist: Nyttige Kommandoer

Uvod u web dizajn i obrada slike

Dagens tema. Mer om C Enkle datatyper Sammensatte datatyper: Vektorer og matriser Tekster Mengder Strukturer Unioner Ringbuffere

Poštovani poslovni partneri,

Likovna umjetnost umjetnost, matematika i algoritmi

SETNINGER OG SETNINGSLEDD REČENICE I DELOVI REČENICE

Rapport Semesteroppgave i datasikkerhet Harald Dahle (795955) og Joakim L. Gilje (796196)

Datatyper og typesjekking

FIZIČKO-TEHNIČKA MERENJA: MERENJE POLOŽAJA, POMERAJA I NIVOA

MONTAŽA I SERVISIRANJE RAUNARA

E K S A M E N. Grunnleggende datakunnskap og programmering 98HINDA / 98HINDB / 98HINEA 98HDMUA / 98HDMUB / 98HINGA

VOLKSWAGEN Golf V (1K) V TDi (AZV) Motor -> Priručnik za popravak -> Remen razvodnog mehanizma: uklanjanje/postavljanje

Datatyper og typesjekking

1 ØVING I WINDOWS FRA CHRISTIAN ANDOLO

Programmeringsspråket C

Činjenice o hepatitisu A, B i C i o tome kako izbjeći zarazu

ELEKTROTEHNIČKI FAKULTET UNIVERZITETA U BEOGRADU PROGRAMIRANJE 2 MATERIJALI ZA PRIPREMU ISPITA. verzija:

Neko kao ti. Sara Desen. Prevela Sandra Nešović

SECURIT table za pisanje kredom TABLE STONE ZA PISANJE KREDOM ILI KREDA MARKEROM...

MODIFIKACIJE METODA MATEMATIČKOG PROGRAMIRANJA I PRIMENE

Projekat EUROWEB+ Ovo je program namenjem isključivo razmeni, a ne celokupnim studijama.

BAŠTENSKI PROGRAM. SMM RODA COMPANY d.o.o.

Eksamen FSP5819 Bosnisk I PSP5512 Bosnisk nivå I. Nynorsk/Bokmål

ZBIRKA PRAKTIČNIH RADOVA IZ KOMPLETA DIJELOVA MT- radio

Repetisjon. INF gruppe 13

INF2100. Oppgaver 23. og 24. september 2010

Datatyper og typesjekking

Transkript:

Strukture Strukture Strukturirani (složeni) tip podataka koji definiše korisnik sastoji se od više komponenti komponente imaju identifikatore ne moraju biti istog tipa struktura se smatra jednim objektom (može biti i vrednost funkcije) Razlike u odnosu na niz kod niza istorodne komponente -zasebni objekti, identifikuju se indeksima vrednost funkcije ne može da bude niz (može pokazivač) Koristi se za složene objekte logički povezane informacije Strukture Strukture Definicija naredbom struct + ime + opis struct tacka {int x, y; a, b, c; struct pravougaonik {struct tacka dole_levo, gore_desno;; struct krug {double r; struct tacka centar;; komponente vidljive samo unutar strukure kojoj pripadaju mogu ista imena u različitim strukturama mogu ista imena kao promenljive 1

Strukture Strukture definisanje promenljivih ovog tipa moguće pozvati se na ranije definisanu strukturu (za poziv na tip mora: struct + identifikator strukture - kao kod enum) dati njen opis direktno (može se izostaviti identifikator strukture) dodela početnih vrednosti niz vrednosti unutar zagrada (kao kod niza) konstantni izrazi dodeljuju se sukcesivnim komponenatama strukture broj i tipovi vrednosti moraju da se slažu sa komponentama, više vrednosti nije dozvoljeno ako je manje vrednosti, preostale komponente se inicijalizuju nulama Strukture Strukture dodela početnih vrednosti u obliku izraza koji predstavlja poziv funkcije koja je tipa te strukture struct tacka p = {35, -12, q; struct pravougaonik w, x, y = {{1, 1, {3, 3; mogu se definisati i nizovi struktura ako se sa typedef definiše strukturni tip, njegov identifikator se može koristiti kao oznaka tipa i bez službene reči struct 2

Strukture typedef struct {char ime[16], prezime[16]; ime; typedef struct { char dan, mesec; short int godina; datum; typedef struct { char maticni_broj[13]; ime osoba; datum datum_rodjenja; char adresa[30]; gradjanin; dozvoljena dodela vrednosti (=) za promenljive istog strukturnog tipa prepišu se sve komponente gradjanin g1, g2, g3; dve strukturne promenjive su istog tipa ako: su definisane istom naredbom za njihovu definiciju se koristi isti identifikator tipa Primer: a i b različitog tipa imaju isti opis struct {int x,y; a; struct {int x,y; b; 3

moguća primena adresnog operatora, kao i pokazivači na strukture struct krug *p; struktura može biti i argument funkcije (po vrednosti) kao i vrednost funkcije kako niz ne može biti vrednost funkcije, može struktura sa nizom kao jednom komponentom od struktura mogu da se prave nizovi veličina strukture se dobija sa sizeof (ne mora da bude zbir komponenti ako postoje neka ograničenja u smeštanju) za pristup komponentama se koristi binarni operator tačka (.) a.x (*p).r (zagrade su neophodne!!!) zbog čiste upotrebe pokazivača na strukture - binarni operator -> a.x=13; a.z=-22; a={13,-22 (samo inicijalizacija!!!) x.dole_levo.x=4; x.dole_levo.y=-5; x.gore_desno.x=7; x.gore_desno.y=0; w.dole_levo=a; w.gore_desno=p; p->r 4

/* definisanje tipa Tacka */ struct tacka {int x,y;; typedef struct tacka Tacka; /* formiranje tačke od zadatih komponenti*/ Tacka pravi_tacku (int x, int y) { Tacka t; t.x=x; t.y=y; return t;... /* izračunavanje rastojanja između tačaka */ #include <math.h> double rastojanje (Tacka g, Tacka h) { return sqrt(pow(g.x-h.x,2)+pow(g.y-h.y,2)); const Tacka NULA = {0,0;... Dinamičke strukture podataka /* nalaženje tačke najbliže koordinatnom početku */ Tacka * najbliza(tacka a[], int n) { Tacka *min = a; double r = rastojanje(a[0],nula), s; for (int i=1; i<n; i++) { s = rastojanje(a[i],nula); if (s<r) {r=s; min=a+i; return min; strukture pogodne za formiranje složenih dinamičkih struktura podataka (promenljiva i veličina i logička povezanost) obično se sastoje od korisnog sadržaja i pokazivača na druge objekte 5

Dinamičke strukture podataka Dinamičke strukture podataka Primer linearne liste za predstavljanje nizova objekata dinamičko stvaranje, brisanje, preuređivanje objekata u listi typedef struct element { int broj; struct element *sled ; Element; sled -pokazivač na naredni član liste definicija moguća jer je u trenutku deklaracije pokazivača, identifikator strukture je već definisan nemoguća "rekurzivna" definicija kada je komponenta strukture sama ta struktura Dinamičke strukture podataka Dinamičke strukture podataka Linearna lista typedef struct element { int broj; struct element *sled ; Element; Element *niz; sled -pokazivač na naredni član liste niz pokazivač na početak liste dodavanje, brisanje i uređivanje elemenata iskazuje podešavanje pokazivača nedostaci: dodatni prostor za pokazivače samo sekvencijalan ali ne i direktan pristup 6

Dinamičke strukture podataka Dinamičke strukture podataka Druga primena -binarno stablo koren i dva podstabla može da se definiše rekurzivno jer je bilo koji podskup povezanih čvorova -stablo struct Cvor { int broj; struct Cvor *levi, *desni; *stablo; stablo -pokazivač na koreni čvor bolje definisati sa typedef kao u primeru sa listom Unije Unije strukturirani tipovi koji omogućavaju da se u isti memorijski prostor smeštaju podaci različitih tipova u različitim vremenskim intervalima naredba union (sintaksa kao za struct) struct { union { int i; int i; double d; double d; char *c; char *c; s; u; 7

Unije Unije s: s.i s.d s.c u: u.i u.d u.c za razliku od strukture, u jednom momentu samo jedna komponenta ima definisanu vrednost sizeof s а) б) sizeof u veličina određena najvećom komponentom Unije Polja bitova programer treba da vodi računa o konzistentnom korišćenju komponenti (posledice su nepredvidive ako se upiše u jednu, a koristi druga komponenta) struktura čije su komponente dužine nekoliko bitova (pakuju se na mašinski zavisan način) često za opisivanje hardverskih registara programi koji koriste polja bitova su obično mašinski zavisni 8

Polja bitova Polja bitova Standard ne definiše: deklaracija da li polje bitova može da bude duže od mašinske reči kao za strukturne tipove da li komponenta može da bude duža od mašinske reči da li komponenta može da prelazi granicu reči da li se ređaju zdesna ili obrnuto sve komponente moraju da budu unsigned int dužina polja se navodi u bitovima Polja bitova Jednostruko ulančane liste struct { unsigned int n:1, z:1, prio:4; status_reg; status_reg.prio=5; if (status_reg.n!= 1 && status_reg.z!= 0)... lst: 5 3 2 6 5 3 NULL typedef struct elem { int broj; struct elem *sled; Elem; 9

Obilazak liste određivanje broja elemenata Obilazak liste ispisivanje svih elemenata intduz (Elem *lst) { Elem *tek; int n = 0; for (tek=lst; tek; tek=tek->sled) n++; return n; void pisi (Elem *lst) { Elem *tek; for (tek=lst; tek; tek=tek->sled) printf ("%d ", tek->broj); printf ("\n"); Dodavanje novog elementa na početak liste Dodavanje novog elementa na kraj liste Elem *na_pocetak (Elem *lst, int b) { Elem *novi = malloc (sizeof(elem)); novi->broj = b; novi->sled = lst; lst = novi; return lst; Elem *na_kraj (Elem *lst, int b) { Elem *tek, *novi = malloc (sizeof(elem)); novi->broj = b; novi->sled = NULL; if (!lst) lst = novi; else { for (tek=lst; tek->sled; tek=tek->sled); tek->sled = novi; return lst; 10

Umetanje elementa u rastuće uređenu listu Sortiranje liste metodom izbora Elem *umetni (Elem *lst, int b) { Elem *tek = lst, *pret = NULL, *novi; while (tek && tek->broj < b) { pret = tek; tek = tek->sled; novi = malloc (sizeof(elem)); novi->broj = b; novi->sled = tek; if (!pret) lst = novi; else pret->sled = novi; return lst; void uredi (Elem *lst) { Elem *i, *j; int p; for (i=lst; i; i=i->sled) for (j=i->sled; j; j=j->sled) if (j->broj < i->broj) { p = i->broj; i->broj = j->broj; j->broj = p; Brisanje svih elemenata liste Izostavljanje elemenata sa datom vrednošću (1) void brisi (Elem *lst) { Elem *stari; while (lst) { stari = lst; lst = lst->sled; free (stari); Elem *izostavi (Elem *lst, int b) { Elem *tek = lst, *pret = NULL, *stari; while (tek) if (tek->broj!= b) { pret = tek; tek = tek->sled; 11

Izostavljanje elemenata sa datom vrednošću (2) Dvostruko ulančane liste else { /* ako se element izostavlja */ stari = tek; tek = tek->sled; if (!pret) lst = tek; else pret->sled = tek; free (stari); return lst; prvi: NULL 5 3 6 2 NULL typedef struct elem { int broj; struct elem *sled, *pret; Elem; typedef struct { Elem*prvi, *posl Lista; :posl Prazna lista i obilazak liste Ispisivanje liste u napred Prazna lista: oba pokazivača su NULL Lista lst = {NULL, NULL; Obilazak u napred: for (tek=lst.prvi; tek; tek=tek->sled) { Obilazak u nazad: for (tek=lst.posl; tek; tek=tek->pret) { void pisi_unapred (Lista lst) { Elem *tek; for (tek=lst.prvi; tek; tek=tek->sled) printf ("%d ", tek->broj); printf ("\n"); 12

Ispisivanje liste u nazad Nalaženje prve pojave broja void pisi_unazad (Lista lst) { Elem *tek; for (tek=lst.posl; tek; tek=tek->pret) printf ("%d ", tek->broj); printf ("\n"); Elem *nadji_prvi (Lista lst, int b) { Elem *tek; for (tek=lst.prvi; tek; tek=tek->sled) if (tek->broj == b) return tek; return NULL; Nalaženje poslednje pojave broja Dodavanje na početak Elem *nadji_posl (Lista lst, int b) { Elem *tek; for (tek=lst.posl; tek; tek=tek->pret) if (tek->broj == b) return tek; return NULL; void na_pocetak (Lista *plst, int b) { Elem *novi = malloc (sizeof(elem)); novi->broj = b; novi->sled = plst->prvi; novi->pret = NULL; if (! plst->posl) plst->posl = novi; else plst->prvi->pret = novi; plst->prvi = novi; 13

Dodavanje na kraj Brisanje svih elemenata void na_kraj (Lista *plst, int b) { Elem *novi = malloc (sizeof(elem)); novi->broj = b; novi->pret = plst->posl; novi->sled = NULL; if (! plst->prvi) plst->prvi = novi; else plst->posl->sled = novi; plst->posl = novi; Izostavljanje prve pojave broja void brisi (Lista *plst) { Elem *tek = plst->prvi, *stari; while (tek) { stari = tek; tek = tek->sled; free (stari); plst->prvi = plst->posl = NULL; Izostavljanje poslednje pojave broja void izostavi_prvi (Lista *plst, int b) { Elem *tek = nadji_prvi (*plst, b); if (tek) { if (! tek->pret) plst->prvi = tek->sled; else tek->pret->sled = tek->sled; if (! tek->sled) plst->posl = tek->pret; else tek->sled->pret = tek->pret; free (tek); void izostavi_posl (Lista *plst, int b){ Elem *tek = nadji_posl (*plst, b); if (tek) { if (! tek->pret) plst->prvi = tek->sled; else tek->pret->sled = tek->sled; if (! tek->sled) plst->posl = tek->pret; else tek->sled->pret = tek->pret; free (tek); 14