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.

Download Report

Transcript 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.

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




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
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
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.
‘‘God.009.\0
God.09.\0
God.9.\0
God.2009.\0
‘God..\0’’ ’ ’ ’
5001 (na znak ‘o’)
5000 (na znak ‘G’)
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);
Rekurzija2
float kamrac(float g, int n, float p){
if(n<=0) return g;
else
return (1+p/100)*kamrac(g,n-1,p);
}
Rekurzija2
Drugo rješenje:
float kamrac2 (float g, int n, float p) {
if (n<=0) return g;
else return kamrac2(g*(1+p/100), n-1, p);
}
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
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
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
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
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) {
40 brojac
int brojac[10]={0};
a[n]=b[n];
4 Povr.adr. f2
brojac[n%10]++;
4 polje2
}
void f1(int *polje, int n) {
4 polje
double *polje2;
int i;
4 n-i-1
polje2=(double*)malloc(n*sizeof(double));
4 i
for(i=0;i<n;i++)
f2(polje2,polje,n-i-1);
4 polje2
}
int main() {
int polje[100];
...
f1(polje, 100);
}
4
Povr.adr. f1
4
polje
4
100
2011
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
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
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
naziv
najbolje
prosječno
najgore
stabilan
metoda
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
-
-
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
shell sort
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
O(1) < O(log n) < O(n) < O(nlog n) < O(n2) < O(n3) < ...< O(2n) < O(n!)
#include <math.h>
void func(int n){
int pon=pow(2,n)
for (i=0;i<pon;i++);
}
a)
b)
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?
O(n)
c)
Kolika je vremenska složenost pronalaska svih permutacija
nekog niza u O notaciji (u ovisnosti o n, duljini niza )?
O(n!)
2012
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
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);
}

Pojednostavljeni prikaz izvođenja za poziv
z(3):
3
2
2
1
1
1
Apriorna složenost O(2n)
1
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);
}
Pojednostavljeni prikaz izvođenja za poziv z(4):
4
-2
3
2
1
-1
0
Apriorna složenost O(n)
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
short jeProst(int broj, int i)
{
if (broj==i) return 1;
if (broj%i == 0) return 0;
return jeProst (broj, i+1);
}
2010