1 / 29

ASP auditorne vježbe 1

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.

Download Presentation

ASP auditorne vježbe 1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ASP auditorne vježbe 1

  2. Rekurzija

  3. 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. Primjer: za ulazni niz "Godine 2008. je" funkcija mijenja niz u "Godine . je" i vraća 4 jer su izbačene 4 znamenke. 2008

  4. Rekurzija1 • 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

  5. Rekurzija1 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

  6. Rekurzija1 Primjer izvođenja za ulazni string “God.2009.” 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); } } 5005 (na znak ‘\0’) 5004 (na znak ‘.’) 5004 (na znak ‘9’) 5004 (na znak ‘0’) 5004 (na znak ‘0’) 5004 (na znak ‘2’) 5003 (na znak ‘.’) 5002 (na znak ‘d’) Adresa 5000 npr. 5001 (na znak ‘o’) ‘God..\0’ ‘God.9.\0’ ‘God.2009.\0’ ‘God.009.\0’ ‘God.09.\0’ 5000 (na znak ‘G’)

  7. Rekurzija2 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);

  8. Rekurzija2 float kamrac(float g, int n, float p){ if(n<=0) return g; else return (1+p/100)*kamrac(g,n-1,p); }

  9. Rekurzija2 float kamrac2 (float g, int n, float p) { if (n<=0) return g; else return kamrac2(g*(1+p/100), n-1, p); } Drugo rješenje:

  10. Segmenti niže adrese TEXT • 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) DATA BSS HEAP STACK više adrese

  11. Dinamička alokacija memorije 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

  12. Dinamička alokacija memorije 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

  13. Dinamička alokacija memorije 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

  14. Meh. poziva funkcije 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); } 40 brojac 4 Povr.adr. f2 4 polje2 4 polje 4 n-i-1 4 i 4 polje2 4 Povr.adr. f1 polje 4 100 4 2011

  15. Rapršeno adresiranje 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

  16. Rapršeno adresiranje 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

  17. Rapršeno adresiranje 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

  18. Sortiranje

  19. Sortiranje1 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

  20. Složenost O(1) < O(log n) < O(n) < O(nlog n) < O(n2) < O(n3) < ...< O(2n) < O(n!)

  21. Složenost1 #include <math.h> void func(int n){ int pon=pow(2,n) for (i=0;i<pon;i++); } • Napišite bilo kakvu funkciju vremenske složenosti O(2n). n neka bude neki cjelobrojni ulazni argument. • Kolika je vremenska složenost izračunavanja faktorijela nekog broja n u O notaciji? • Kolika je vremenska složenost pronalaska svih permutacija nekog niza u O notaciji (u ovisnosti o n, duljini niza )? O(n) O(n!) 2012

  22. Složenost2 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

  23. Zadatci za vježbu

  24. Složenost 3 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); }

  25. Složenost 3 • Pojednostavljeni prikaz izvođenja za poziv z(3): 3 2 2 1 1 1 1 Apriorna složenost O(2n)

  26. Složenost 4 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); }

  27. Složenost 4 Pojednostavljeni prikaz izvođenja za poziv z(4): 4 -2 3 2 -1 1 0 Apriorna složenost O(n)

  28. Rekurzija3 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

  29. Rekurzija3 short jeProst(intbroj, inti) { if (broj==i) return 1; if (broj%i == 0) return 0; return jeProst (broj, i+1); } 2010

More Related