asp auditorne vježbe 1
DESCRIPTION
ASP auditorne vježbe 1. Rekurzija. Rekurzija1. Napišite rekurzivnu funkciju za izbacivanje znamenki iz zadanog niza. Prototip funkcije treba biti: int IzbaciZnamenke (char *niz); Funkcija vraća broj izbačenih znamenki. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/1.jpg)
![Page 2: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/2.jpg)
![Page 3: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/3.jpg)
Napišite rekurzivnu funkciju za izbacivanje znamenki iz zadanog niza. Prototip funkcije treba biti:
int IzbaciZnamenke (char *niz);
Funkcija vraća broj izbačenih znamenki. Primjer: za ulazni niz "Godine 2008. je" funkcija
mijenja niz u "Godine . je" i vraća 4 jer su izbačene 4 znamenke.
2008
![Page 4: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/4.jpg)
Osnovni slučaj - kad je znakovni niz prazan, tj. sadrži samo ‘\0’
Napredovanje - znakovni niz iz koraka u korak bi se trebao približavati praznom nizu, recimo uzimanjem desnog podniza
Pravilo projektiranja – funkcioniranje izbacivanja znamenki iz niza i njihovog brojanja
Pravilo neponavljanja – izbjegavanje obavljanja istog problema odvojenim pozivima
![Page 5: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/5.jpg)
int IzbaciZnamenke (char* niz){if (*niz=='\0') return 0; //Uvjet zaustavljanja rekurzije
else { if (*niz >='0' && *niz<='9'){ //provjera
znaka strcpy(niz, niz+1); //izbacivanje znaka return 1 + IzbaciZnamenke(niz);
} return IzbaciZnamenke(niz+1);
}}
2008
![Page 6: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/6.jpg)
int IzbaciZnamenke (char* niz){if (*niz=='\0') return 0; //Uvjet zaustavljanja rekurzije else {
if (*niz >='0' && *niz<='9'){ //provjera znaka strcpy(niz, niz+1); //izbacivanje znaka
return 1 + IzbaciZnamenke(niz); }
return IzbaciZnamenke(niz+1); }
}
Primjer izvođenja za ulazni string “God.2009.”
5000 (na znak ‘G’)‘God.2009.\0’
Adresa 5000 npr. 5001 (na znak ‘o’)
5002 (na znak ‘d’)
5003 (na znak ‘.’)
5004 (na znak ‘2’)
5004 (na znak ‘0’)
5004 (na znak ‘0’)
5004 (na znak ‘9’)
5004 (na znak ‘.’)
5005 (na znak ‘\0’)
‘God.009.\0’ ‘God.09.\0’ ‘God.9.\0’ ‘God..\0’
![Page 7: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/7.jpg)
Napisati rekurzivnu funkciju za računanje ukupnog iznosa na bankovnom računu za zadani iznos glavnice, broj godina oročenja i kamatnu stopu.
Funkcija ima prototip:float kamrac(float g, int n, float
p);
![Page 8: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/8.jpg)
float kamrac(float g, int n, float p){
if(n<=0) return g;else
return (1+p/100)*kamrac(g,n-1,p);}
Rekurzija2
![Page 9: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/9.jpg)
float kamrac2 (float g, int n, float p) { if (n<=0) return g; else return kamrac2(g*(1+p/100), n-1, p);
}
Rekurzija2
Drugo rješenje:
![Page 10: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/10.jpg)
ovisi o operacijskom sustavu◦ TEXT
pohranjen program◦ DATA
inicijalizirane globalne i statičke lokalne varijable◦ BSS
neinicijalizirane globalne i statičke lokalne varijable◦ gomila (heap)
dinamički alocirana memorija (malloc)◦ stog (stack)
lokalne varijable funkcija nalazi se na dnu (najviše adrese)
DATADATA
BSSBSS
HEAPHEAP
STACKSTACK
niže adreseniže adrese
više adreseviše adrese
TEXTTEXT
![Page 11: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/11.jpg)
Napisati funkciju koja će iz ulaznog polja cijelih brojeva izbaciti sve one manje od prosjeka, a zatim i dinamički smanjiti veličinu polja na osnovu novog broja članova. Funkcija kao rezultat vraća pokazivač na navedeno polje. Prototip funkcije je:
int *izbaci_podprosj(int *polje, int *br_clanova);
Napisati i glavni program u kojem će se učitati broj elemenata, polje se dinamički alocirati te napuniti slučajno odabranim vrijednostima iz raspona [10, 1000], pozvati funkcija i ispisati novo polje te osloboditi dinamički stvorena memorija.
2010
![Page 12: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/12.jpg)
int *izbaci_podprosj(int *polje, int *br_clanova){int i, j, suma=0;float prosjek;for (i=0;i<*br_clanova;i++){ suma+=polje[i];}prosjek= (float) suma/ *br_clanova;for(i=0 ; i<*br_clanova ;){ if (polje[i] < prosjek){
for(j=i+1 ; j<*br_clanova ; j++) polje[j-1] = polje[j];
(*br_clanova)--; }
else i++;
}polje = (int*) realloc(polje, *br_clanova * sizeof(int));return polje;
}
2010
![Page 13: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/13.jpg)
int main(){ int *polje, i, br_clanova; scanf("%d",&br_clanova); polje = (int*) malloc(br_clanova * sizeof(int));
...polje = izbaci_podprosj(polje, &br_clanova);
... free(polje);
return 0;}
2010
![Page 14: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/14.jpg)
Prikažite sadržaj stoga u trenutku neposredno prije prvog izlaska iz funkcije f2 i naznačite veličine svih varijabli na stogu.
void f2(double *a, int *b, int n) {int brojac[10]={0};a[n]=b[n];brojac[n%10]++;
}void f1(int *polje, int n) {
double *polje2;int i;polje2=(double*)malloc(n*sizeof(double));for(i=0;i<n;i++)
f2(polje2,polje,n-i-1);} int main() {
int polje[100];...f1(polje, 100);
}
2011
100
polje
Povr.adr. f1
polje2
i
n-i-1
polje
polje2
Povr.adr. f2
brojac
4
4
4
4
4
4
4
4
4
40
![Page 15: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/15.jpg)
Jedan zapis datoteke organizirane po načelu raspršenog adresiranja definiran je sljedećom strukturom:
typedef struct{int sifra;char naziv[50+1];int kolicina;float cijena;
} zapis;
Zapis je prazan ako je na mjestu šifre vrijednost nula. Parametri za raspršeno adresiranje nalaze se u datoteci parametri.h i oni su:
BLOK : veličina bloka na disku
MAXZAP : očekivani maksimalni broj zapisa
C : broj zapisa u jednom pretincu
M : broj pretinaca
2007
![Page 16: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/16.jpg)
Ključ zapisa je šifra artikla, a transformacija ključa u adresu obavlja se zadanom funkcijom:
int adresa(int sifra); Napisati funkciju koja će pronaći zapis koji je najviše „udaljen“ od predviđenog pretinca. Ako pojedini zapis nije spremljen kao preljev, njegova je udaljenost 0; inače se udaljenost definira kao broj dodatnih pretinaca koje je potrebno pročitati da bi se zapis pronašao. (Primjerice, ako je M=15, adresa nekog zapisa 13, a zapis se nalazi u pretincu broj 4, udaljenost je 6). Funkcija vraća 0 ako nijedan zapis nije zapisan kao preljev; inače vraća najveću udaljenost. Ako postoji više takvih zapisa, vratiti bilo koji. Funkcija treba imati prototip:
int max_udaljenost(FILE *f, zapis *z);
2007
![Page 17: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/17.jpg)
int max_udaljenost(FILE *f, zapis *z){ zapis pretinac[C]; int i, j; int udaljenost, max = 0;
for (i = 0; i < M; i++) { fseek (f, i*BLOK, SEEK_SET); fread (pretinac, sizeof (pretinac), 1, f); for (j = 0; j < C; j++) { if (pretinac[j].sifra != 0) { /* Ako zapis nije prazan */ if (adresa(pretinac[j].sifra) != i){ udaljenost = i - adresa(pretinac[j].sifra);
if (udaljenost < 0) udaljenost += M; if (udaljenost > max){ *z = pretinac[j]; max = udaljenost;
} } } } } return max;}
2007
![Page 18: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/18.jpg)
nazivnaziv najboljenajbolje prosječnoprosječno najgorenajgore stabilanstabilan metodametoda
selection sort O(n2) O(n2) O(n2) ne biranje
insertion sort O(n) O(n2) O(n2) da umetanje
bubble sort O(n) - O(n2) da zamjena
shell sort - - O(n3/2) ne umetanje
merge sort O(nlogn) O(nlogn) O(nlogn) da spajanje
quick sort O(nlogn) O(nlogn) O(n2) ne podjela
heap sort O(nlogn) O(nlogn) O(nlogn) ne biranje
![Page 19: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/19.jpg)
Zadan je niz brojeva: 1, 5, 7, 4, 3, 6, 8, 2, 9, 0
Ilustrirajte uzlazno sortiranje zadanog niza brojeva (ispišite niz nakon svake zamjene dvaju elemenata):
a) Algoritmom shell sort za slijed koraka {4, 2, 1}. Kako izgledaju 4-, 2- i 1-sortirani nizovi?
b) Algoritmom quicksort. Stožer odaberite metodom aproksimacije medijana temeljem početnog, krajnjeg i središnjeg člana polja.
2010
![Page 20: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/20.jpg)
O(1) < O(log n) < O(n) < O(nlog n) < O(n2) < O(n3) < ...< O(2n) < O(n!)
![Page 21: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/21.jpg)
a) Napišite bilo kakvu funkciju vremenske složenosti O(2n). n neka bude neki cjelobrojni ulazni argument.
b) Kolika je vremenska složenost izračunavanja faktorijela nekog broja n u O notaciji?
c) Kolika je vremenska složenost pronalaska svih permutacija nekog niza u O notaciji (u ovisnosti o n, duljini niza )?
2012
O(n)
O(n!)
#include <math.h> void func(int n){ int pon=pow(2,n) for (i=0;i<pon;i++);}
![Page 22: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/22.jpg)
Odredite apriornu i asimptotsku složenost sljedećeg programskog odsječka i obrazložite oba odgovora:
int suma = 0, i = 0, j, k, m, n;…while(i < n){ for (j = 0; j < m; j++){ if (i == j){ for (k = 0; k < n; k++) suma+= i * j * k; } } ++i;}
2011
![Page 23: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/23.jpg)
![Page 24: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/24.jpg)
Kolika je apriorna složenost funkcije: float z (int n) {
if (n <= 1) return 1.f; return 1.f/n * z(n-1) + n /2.f *z (n-1);
}
![Page 25: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/25.jpg)
Pojednostavljeni prikaz izvođenja za poziv z(3):
3
11
2
11
2
Apriorna složenost O(2n)
![Page 26: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/26.jpg)
Kolika je apriorna složenost funkcije:float z (int *n) { (*n)--; if (*n <= 1) return 1.f; return 1.f/(*n) * z(n) + (*n) /2.f * z (n);
}
![Page 27: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/27.jpg)
Pojednostavljeni prikaz izvođenja za poziv z(4):
Apriorna složenost O(n)
4
-12
3 -2
1 0
![Page 28: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/28.jpg)
Napisati rekurzivnu funkciju za određivanje je li broj prost.Prototip funkcije je:
short jeProst(int broj, int djelitelj); Funkcija vraća 1 ako je broj prost, inače vraća 0. Pri prvom pozivu funkcije djelitelj je postavljen na 2.
2010
![Page 29: ASP auditorne vježbe 1](https://reader035.vdocuments.pub/reader035/viewer/2022062304/56813836550346895d9fe3bf/html5/thumbnails/29.jpg)
short jeProst(int broj, int i){if (broj==i) return 1; if (broj%i == 0) return 0;return jeProst (broj, i+1);
}
2010