際際滷

際際滷Share a Scribd company logo
ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 1
1. Auditorne vje転be
Raspored nastave
Izvodit e se 3 tjedna po 1h kao auditorne za cijelu grupu, u tjednu iza toga grupa se dijeli na
2 podgrupe i jedna podgrupa ima po 2h laboratorijskih vje転bi u tom tjednu, a druga u
sljedeemu. Cijeli se ciklus ponavlja 3 puta.
x 3
Pokazivai
Zadatak:
to e se ispisati izvoenjem sljedeeg programskog odsjeka?
int a=4;
int *b;
b=&a;
*b=8;
printf("%d %d",a,*b);
Rje邸enje:
int a=4;
/* prilikom izvoenja programa, simbolika oznaka a dobiva
odreenu adresu  npr. 2000 */
int *b;
/* pokaziva b pokazuje na adresu na kojoj se nalazi cijeli
broj
pretpostavimo da je b oznaka za adresu 2004. */
Adresa u 2000 2004
1. tjedan 2. tjedan 3. tjedan 4. tjedan 5. tjedan
A
1h
Auditorne
A
1h
Auditorne
A
1h
Auditorne
A C E G I K
1h
Priprema + Blitz
B D F H J L
2h
Priprema + Blitz
ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 2
memoriji: (a) (b)
Sadr転aj
memorije:
4 ?
b=&a; // inicijalizacija
Adresa u
memoriji:
2000 2004
Sadr転aj
memorije:
4 2000
*b=8;
Adresa u
memoriji:
2000 2004
Sadr転aj
memorije:
8 2000
Ispisati e se 8 8, jer se vrijednost na koju pokazuje varijabla b nalazi na istoj adresi
(b=&a), gdje i vrijednost varijable a.
Pitanje:
to bi se dogodilo da izostavimo liniju b=&a; ?
Odgovor:
Budui da pokaziva b prije pridru転ivanja vrijednosti pokazuje na nedefiniranu adresu, mo転e
doi do poku邸aja upisivanja vrijednosti 8 na adresu koja je rezervirana za pohranu drugih
varijabli ili koda, 邸to mo転e izazvati neoekivano pona邸anje ili pogre邸ku pri izvoenju
programa zbog neovla邸tenog pristupa dijelu memorije. Stoga je uvijek potrebno inicijalizirati
vrijednost pokazivaa prije upotrebe.
Zadatak:
Napisati funkciju koja e iz zadanog JMBG-a vratiti datum roenja u obliku DD.MM.GG.
Rje邸enje:
char * datum(char *jmbg) {
int d,m,g; // lokalne varijable  vrijede samo unutar
funkcije
char *p; //pokaziva je deklariran, ali nije inicijaliziran!
char c;
ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 3
sscanf(jmbg,"%2d%2d%c%2d",&d,&m,&c,&g);
//JMBG ima oblik DDMMYYYXXXXXX
p=(char *) malloc(9 * sizeof(char));
/* pokaziva je inicijaliziran i naredbom malloc zauzeta je
memorija potrebna za pohranu datuma u formatu DD.MM.GG */
sprintf(p,"%02d.%02d.%02d",d,m,g);
// datum se sprema na adresu na koju pokazuje pokaziva p
return p;
}
Polja
Zadatak:
Napisati funkciju koja rauna zbroj pozitivnih elemenata dvodimenzionalnog polja, te
prikazati poziv funkcije iz glavnog programa.
float zbroj_poz(int brred, int brstup, int maxstup, float *p )
/* brred, brstup, int maxstup  ulazni parametri funkcije;
njihova eventualna promjena u funkciji nee biti sauvana
nakon povratka u glavni program. Budui da se polje uvijek
prenosi u funkciju kao pokaziva, vrijednost lanova polja
mogue je u funkciji mijenjati */
{
int i,j;
float suma;
suma = 0.0;
for( i=0; i<brred; i++ )
for( j=0; j<brstup; j++ )
if (p[i*maxstup + j]>0) suma += p[i*maxstup + j];
/* mo転e i suma += *(p + i*maxstup + j)
nije dozvoljeno p(i,j), p[i][j] i slino  vidi
obja邸njenje */
ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 4
return suma;
}
Obja邸njenje: Dvodimenzionalno polje se u funkciju prenosi kao jednodimenzionalno.
Pohranjeno je po retcima, pa se elementu p(i,j) pristupa kao p[i*maxstup+j].
Glavni program:
#define MAXRED 100
#define MAXSTUP 20
void main() {
int red, stup;
float zbroj, mat[MAXRED][MAXSTUP];
/* ovdje slijedi postavljanje stvarnog broja redova i stupaca
(red<=MAXRED, stup<=MAXSTUP, punjenje polja */
zbroj = zbroj_poz(red, stup, MAXSTUP,(float *) mat); // poziv
f-e
}
Zapisi i Datoteke
Zadatak:
Zadana je direktna datoteka studenti.dat i struktura zapisa (vidi rje邸enje). Napisati
funkciju koja dohvaa podatke o studentu sa zadanim matinim brojem, te ga potom bri邸e iz
datoteke. ifra studenta odgovara rednom broju zapisa. Prazan zapis sadr転i 邸ifru jednaku
nuli.
Rje邸enje:
struct zapis {
int mbr;
char ime_prezime[40];
char spol;
};
struct zapis dohvati_brisi(int mbr) { // funkcija vraa
dohvaeni zapis
ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 5
FILE *f;
struct zapis z; // z je varijabla tipa 'struct zapis'
struct zapis *z1; // z1 je pokaziva na strukturu
if ((f=fopen("studenti.dat","r+b"))==NULL) exit(1);
/* ukoliko nije zadano ime datoteke, pretpostaviti da je ona
ve otvorena u glavnom programu, te se funkciji predaje
pokaziva FILE *f */
fseek(f,(mbr-1)*sizeof(zapis),SEEK_SET)
/* direktan pristup zapisu jer je zadano da 邸ifra odgovara
rednom broju zapisa */
fread(&z,sizeof(z),1,f);
z1=&z; // inicijalizacija pokazivaa z1
z1->mbr=0; // isto 邸to i (*z1).mbr=0
/* zapisi se iz direktne datoteke ne bri邸u fiziki. U
zadatku je zadano da vrijednost 0 oznaava prazan zapis */
fseek(f,-sizeof(zapis),SEEK_CUR);
/* nakon itanja potrebno se vratiti na poetak zapisa, da
bi se zapis upisao na isto mjesto */
fwrite(z1,sizeof(*z1),1,f);
fclose(f);
return z;
}
ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 5
FILE *f;
struct zapis z; // z je varijabla tipa 'struct zapis'
struct zapis *z1; // z1 je pokaziva na strukturu
if ((f=fopen("studenti.dat","r+b"))==NULL) exit(1);
/* ukoliko nije zadano ime datoteke, pretpostaviti da je ona
ve otvorena u glavnom programu, te se funkciji predaje
pokaziva FILE *f */
fseek(f,(mbr-1)*sizeof(zapis),SEEK_SET)
/* direktan pristup zapisu jer je zadano da 邸ifra odgovara
rednom broju zapisa */
fread(&z,sizeof(z),1,f);
z1=&z; // inicijalizacija pokazivaa z1
z1->mbr=0; // isto 邸to i (*z1).mbr=0
/* zapisi se iz direktne datoteke ne bri邸u fiziki. U
zadatku je zadano da vrijednost 0 oznaava prazan zapis */
fseek(f,-sizeof(zapis),SEEK_CUR);
/* nakon itanja potrebno se vratiti na poetak zapisa, da
bi se zapis upisao na isto mjesto */
fwrite(z1,sizeof(*z1),1,f);
fclose(f);
return z;
}

More Related Content

More from Aleksandar Micic (14)

Notes nyquist plot and stability criteria
Notes nyquist plot and stability criteriaNotes nyquist plot and stability criteria
Notes nyquist plot and stability criteria
Aleksandar Micic
922214 e002013
922214 e002013922214 e002013
922214 e002013
Aleksandar Micic
70
7070
70
Aleksandar Micic
Ee3054 exercises
Ee3054 exercisesEe3054 exercises
Ee3054 exercises
Aleksandar Micic
5915
59155915
5915
Aleksandar Micic
Fpw chapter 4 - digital ctrl of dynamic systems
Fpw chapter 4 - digital ctrl of dynamic systemsFpw chapter 4 - digital ctrl of dynamic systems
Fpw chapter 4 - digital ctrl of dynamic systems
Aleksandar Micic
20110326202335912
2011032620233591220110326202335912
20110326202335912
Aleksandar Micic
21950
2195021950
21950
Aleksandar Micic
1011ijaia03
1011ijaia031011ijaia03
1011ijaia03
Aleksandar Micic
0520 th m10.4
0520 th m10.40520 th m10.4
0520 th m10.4
Aleksandar Micic
Courses with instructor kevin d
Courses with instructor  kevin dCourses with instructor  kevin d
Courses with instructor kevin d
Aleksandar Micic
Lab7 8 slides
Lab7 8 slidesLab7 8 slides
Lab7 8 slides
Aleksandar Micic
Tervo za paraktikum 18 12 2014
Tervo za paraktikum 18 12 2014Tervo za paraktikum 18 12 2014
Tervo za paraktikum 18 12 2014
Aleksandar Micic
3tjedan zzv rjesenja[4]
3tjedan zzv rjesenja[4]3tjedan zzv rjesenja[4]
3tjedan zzv rjesenja[4]
Aleksandar Micic

Asp audit01

  • 1. ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 1 1. Auditorne vje転be Raspored nastave Izvodit e se 3 tjedna po 1h kao auditorne za cijelu grupu, u tjednu iza toga grupa se dijeli na 2 podgrupe i jedna podgrupa ima po 2h laboratorijskih vje転bi u tom tjednu, a druga u sljedeemu. Cijeli se ciklus ponavlja 3 puta. x 3 Pokazivai Zadatak: to e se ispisati izvoenjem sljedeeg programskog odsjeka? int a=4; int *b; b=&a; *b=8; printf("%d %d",a,*b); Rje邸enje: int a=4; /* prilikom izvoenja programa, simbolika oznaka a dobiva odreenu adresu npr. 2000 */ int *b; /* pokaziva b pokazuje na adresu na kojoj se nalazi cijeli broj pretpostavimo da je b oznaka za adresu 2004. */ Adresa u 2000 2004 1. tjedan 2. tjedan 3. tjedan 4. tjedan 5. tjedan A 1h Auditorne A 1h Auditorne A 1h Auditorne A C E G I K 1h Priprema + Blitz B D F H J L 2h Priprema + Blitz
  • 2. ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 2 memoriji: (a) (b) Sadr転aj memorije: 4 ? b=&a; // inicijalizacija Adresa u memoriji: 2000 2004 Sadr転aj memorije: 4 2000 *b=8; Adresa u memoriji: 2000 2004 Sadr転aj memorije: 8 2000 Ispisati e se 8 8, jer se vrijednost na koju pokazuje varijabla b nalazi na istoj adresi (b=&a), gdje i vrijednost varijable a. Pitanje: to bi se dogodilo da izostavimo liniju b=&a; ? Odgovor: Budui da pokaziva b prije pridru転ivanja vrijednosti pokazuje na nedefiniranu adresu, mo転e doi do poku邸aja upisivanja vrijednosti 8 na adresu koja je rezervirana za pohranu drugih varijabli ili koda, 邸to mo転e izazvati neoekivano pona邸anje ili pogre邸ku pri izvoenju programa zbog neovla邸tenog pristupa dijelu memorije. Stoga je uvijek potrebno inicijalizirati vrijednost pokazivaa prije upotrebe. Zadatak: Napisati funkciju koja e iz zadanog JMBG-a vratiti datum roenja u obliku DD.MM.GG. Rje邸enje: char * datum(char *jmbg) { int d,m,g; // lokalne varijable vrijede samo unutar funkcije char *p; //pokaziva je deklariran, ali nije inicijaliziran! char c;
  • 3. ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 3 sscanf(jmbg,"%2d%2d%c%2d",&d,&m,&c,&g); //JMBG ima oblik DDMMYYYXXXXXX p=(char *) malloc(9 * sizeof(char)); /* pokaziva je inicijaliziran i naredbom malloc zauzeta je memorija potrebna za pohranu datuma u formatu DD.MM.GG */ sprintf(p,"%02d.%02d.%02d",d,m,g); // datum se sprema na adresu na koju pokazuje pokaziva p return p; } Polja Zadatak: Napisati funkciju koja rauna zbroj pozitivnih elemenata dvodimenzionalnog polja, te prikazati poziv funkcije iz glavnog programa. float zbroj_poz(int brred, int brstup, int maxstup, float *p ) /* brred, brstup, int maxstup ulazni parametri funkcije; njihova eventualna promjena u funkciji nee biti sauvana nakon povratka u glavni program. Budui da se polje uvijek prenosi u funkciju kao pokaziva, vrijednost lanova polja mogue je u funkciji mijenjati */ { int i,j; float suma; suma = 0.0; for( i=0; i<brred; i++ ) for( j=0; j<brstup; j++ ) if (p[i*maxstup + j]>0) suma += p[i*maxstup + j]; /* mo転e i suma += *(p + i*maxstup + j) nije dozvoljeno p(i,j), p[i][j] i slino vidi obja邸njenje */
  • 4. ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 4 return suma; } Obja邸njenje: Dvodimenzionalno polje se u funkciju prenosi kao jednodimenzionalno. Pohranjeno je po retcima, pa se elementu p(i,j) pristupa kao p[i*maxstup+j]. Glavni program: #define MAXRED 100 #define MAXSTUP 20 void main() { int red, stup; float zbroj, mat[MAXRED][MAXSTUP]; /* ovdje slijedi postavljanje stvarnog broja redova i stupaca (red<=MAXRED, stup<=MAXSTUP, punjenje polja */ zbroj = zbroj_poz(red, stup, MAXSTUP,(float *) mat); // poziv f-e } Zapisi i Datoteke Zadatak: Zadana je direktna datoteka studenti.dat i struktura zapisa (vidi rje邸enje). Napisati funkciju koja dohvaa podatke o studentu sa zadanim matinim brojem, te ga potom bri邸e iz datoteke. ifra studenta odgovara rednom broju zapisa. Prazan zapis sadr転i 邸ifru jednaku nuli. Rje邸enje: struct zapis { int mbr; char ime_prezime[40]; char spol; }; struct zapis dohvati_brisi(int mbr) { // funkcija vraa dohvaeni zapis
  • 5. ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 5 FILE *f; struct zapis z; // z je varijabla tipa 'struct zapis' struct zapis *z1; // z1 je pokaziva na strukturu if ((f=fopen("studenti.dat","r+b"))==NULL) exit(1); /* ukoliko nije zadano ime datoteke, pretpostaviti da je ona ve otvorena u glavnom programu, te se funkciji predaje pokaziva FILE *f */ fseek(f,(mbr-1)*sizeof(zapis),SEEK_SET) /* direktan pristup zapisu jer je zadano da 邸ifra odgovara rednom broju zapisa */ fread(&z,sizeof(z),1,f); z1=&z; // inicijalizacija pokazivaa z1 z1->mbr=0; // isto 邸to i (*z1).mbr=0 /* zapisi se iz direktne datoteke ne bri邸u fiziki. U zadatku je zadano da vrijednost 0 oznaava prazan zapis */ fseek(f,-sizeof(zapis),SEEK_CUR); /* nakon itanja potrebno se vratiti na poetak zapisa, da bi se zapis upisao na isto mjesto */ fwrite(z1,sizeof(*z1),1,f); fclose(f); return z; }
  • 6. ALGORITMI I STRUKTURE PODATAKA - AUDITORNE VJE貼BE 2005./06. 5 FILE *f; struct zapis z; // z je varijabla tipa 'struct zapis' struct zapis *z1; // z1 je pokaziva na strukturu if ((f=fopen("studenti.dat","r+b"))==NULL) exit(1); /* ukoliko nije zadano ime datoteke, pretpostaviti da je ona ve otvorena u glavnom programu, te se funkciji predaje pokaziva FILE *f */ fseek(f,(mbr-1)*sizeof(zapis),SEEK_SET) /* direktan pristup zapisu jer je zadano da 邸ifra odgovara rednom broju zapisa */ fread(&z,sizeof(z),1,f); z1=&z; // inicijalizacija pokazivaa z1 z1->mbr=0; // isto 邸to i (*z1).mbr=0 /* zapisi se iz direktne datoteke ne bri邸u fiziki. U zadatku je zadano da vrijednost 0 oznaava prazan zapis */ fseek(f,-sizeof(zapis),SEEK_CUR); /* nakon itanja potrebno se vratiti na poetak zapisa, da bi se zapis upisao na isto mjesto */ fwrite(z1,sizeof(*z1),1,f); fclose(f); return z; }