Professional Documents
Culture Documents
blic
ZADACI:
Datoteke – ponavljanje
Ako je sadržaj formatirane datoteke ʺulazʺ 012012 što će ispisati sljedeći programski
odječak:
char c; int s=0;
FILE *in = fopen ("ulaz", "r");
while (fscanf(in, "%c", &c)) {
s+=c-'1';
}
printf("%d\n", s);
Pokazivači – ponavljanje
Ukoliko funkcija f treba izračunati sumu svih elemenata u matrici koju naredbu treba
umetnuti na mjesto označeno s ??? i zašto ?
int f(int *p, int m, int n, int maxstup){
int i,j,suma=0;
for(i=0; i<m ; i++){
for(j=0; j<n; j++){
suma += *p;
p++;
}
???
}
return suma;
}
Alociranje memorijskog prostora
Napisati program koji s tipkovnice učitava znakovni niz maksimalne dužina 80
karaktera, sve dok se ne unese neki specijalni znak (<ENTER>, <ESC>, <BS>..).
Znakovi se spremaju u memoriju koja se dinamički alocira prilikom unošenja
znakova. Na kraju je potrebno ispisati uneseni niz znakova.
Složenost
Koliko je asimptotsko vrijeme izvođenja, te vremena izvođenja po notaciji O, Ω i Θ
funkcije koja sortira cjelobrojno polje sljedećim algoritmom?
void sort(int * polje, int brojelem){
int i, j, minindex, pom;
for (i=0;i<brojelem-1; i++){
minindex=i;
for (j=i+1;j<brojelem; j++){
if (polje[j]<polje[minindex]) minindex=j;
}
if (i!=minindex){
pom=polje[i];
polje[i]=polje[minindex];
polje[minindex]=pom;
}
}
}
Tehnike adresiranja
U datoteku organiziranu po načelu raspršenog adresiranja pohranjuju se zapisi koji
sadrže šifru iz intervala [100000, 500000] i naziv (19 +1 znak). Fizički blok na disku je
veličine 512 okteta. Broj zapisa koje treba pohraniti je 10000, a kao metoda
transformacije ključa uzima se metoda dijeljenja s prim. brojem približno jednakim
broju pretinaca u kojem je ostatak dijeljenja adresa pretinca. Broj pretinaca je zbog
očekivanog preljeva veći za 30%. Izračunajte broj pretinaca, gustoću pakiranja, max.
broj zapisa po pretincu, te adresu pretinca u koji će se smjestiti zapis s ključem
220000.
Pozivi funkcije, stack
Koliko je elemenata dodano na sistemski stog prilikom poziva i izvršavanja funkcije
funkc (okvir stoga ne treba uzeti u obzir):
int funkc (int a,int b,int c)
{
int r1,r2;
r1=a+b;
r2=b-c;
return r1/r2;
}
Funkcija je pozvana na sljedeći način:
//poziv
funkc(10,20,30);
RJEŠENJA:
Datoteke – ponavljanje
Ispisat će se 0.
Pokazivači – ponavljanje
p += maxstup-n;
Da bi suma koja se računa na sljedeći način
suma += *p; ispravno računala potrebno je da p za prvi korak j petlje pokazuje na
prvi element i‐tog retka. Kako se p u j petlji povećava naredbom p++; potrebno ga je
za sljedeći korak petlje staviti na novi redak. To znači oduzeti za koliko se povećao, a
to je za n stupaca, i dodati max. broj stupaca tj.maxstup jer tu počinje sljedeći redak.
Alociranje memorijskog prostora
int main()
{
char *niz=NULL, znak;
int n=0;
printf("Unesite niz: ");
do{
znak=getch();
niz = (char *) realloc (niz, (n+1) * sizeof(char) );
if (niz == NULL) break;
if ( (znak < 32) || (n > 80) ){
*(niz+n) = 0;
break;
}
*(niz+n++) = znak;
printf("%c", znak);
}while(1);
printf("\nUneseni niz je: %s\n", niz);
return 0;
}
Složenost
Npr. za brojelem = 5,
za 1. korak vanjske petlje (i=0), nutarnja pelja se izvrti 4 puta, tj (brojelem ‐1) puta
za 2. korak vanjske petlje (i=1), nutarnja pelja se izvrti 3 puta, tj (brojelem ‐2) puta
za 3. korak vanjske petlje (i=2), nutarnja pelja se izvrti 2 puta, tj (brojelem ‐3) puta
za 4. korak vanjske petlje (i=3), nutarnja pelja se izvrti 2 puta, tj (brojelem ‐4) puta
Ukupni broj koraka = (brojelem ‐1)+ (brojelem ‐2)+ (brojelem ‐3)+ (brojelem ‐4)=4+3+2+1
Kada brojelem teži u beskonačno onda je to suma 1+2+3+..+ brojelem ‐1. Ukupan broj
(brelem − 1) * brelem brelem 2 brelem
koraka je onda = − .
2 2 2
brelem 2
Iz toga prozlazi da je asimptotsko vrijeme izvođenja , vrijeme izvođenja je
2
( ) ( ) ( )
Ο brelem 2 , donja granica je Ω brelem 2 pa je prema tome i Θ brelem 2 .
Tehnike adresiranja
‐veličina pretinca=512/24=21,33, pretinac će sadržavati max. 21 zapis
‐broj pretinaca=(10000/21)*1,3~620 pretinaca
‐prim. broj manji od 620 je 619
‐gustoća pakiranja=10000/(619*21) = 0,769
‐adrese pretinaca su iz intervala [0, 618]
‐zapis s ključem 220000 će se smjestiti u pretinac s adresom 335
220000 % 619=335
Pozivi funkcije, stack
Na sistemski stog je dodano 6 elemenata