razni zadaci

35
Razni zadaci Razni zadaci Ana Zeković Zasnovano na primerima sa stranice: www.matf.bg.ac. rs /~ filip i www.matf.bg.ac.rs /~ sana

Upload: barrett-horn

Post on 30-Dec-2015

195 views

Category:

Documents


7 download

DESCRIPTION

Razni zadaci. Ana Zekovi ć Zasnovano na primerima sa stranic e : www.matf.bg.ac. rs/~ filip i www.matf.bg.ac.rs /~ sana. Odrediti tranzitivno zatvorenje relacije – najmanji nadskup date relacije koji ima osobinu tranzitivnosti. #include #include - PowerPoint PPT Presentation

TRANSCRIPT

Page 2: Razni zadaci

Odrediti tranzitivno zatvorenje relacije Odrediti tranzitivno zatvorenje relacije – – najmanji nadskup date relacije koji ima najmanji nadskup date relacije koji ima

osobinu tranzitivnosti.osobinu tranzitivnosti.

Page 3: Razni zadaci

#include <stdio.h> #include <stdlib.h> #define MAX_CVOROVA 100 int graf[MAX_CVOROVA][MAX_CVOROVA]; int broj_cvorova; /* Algoritam koji vrsi tranzitivno zatvorenje grafa, tj. relacije koju ovaj graf predstavlja. */ void Warshall() { int i, j, k;

/* Za svaka dva cvora i i j gledamo da li postoji cvor k preko koga su povezani, i u tom slucaju dodajemo granu (i,j) */ for(i = 0; i < broj_cvorova; i++)

for(j = 0; j < broj_cvorova; j++) for(k = 0; k < broj_cvorova; k++)

if(graf[i][k] && graf[k][j]) {

graf[i][j] = 1; break;

}}

Page 4: Razni zadaci

Napisati program koji Napisati program koji spiralno ispisuje matricuspiralno ispisuje matricu

Page 5: Razni zadaci

#include <stdio.h> #include <stdlib.h> void ispisi(int** a, int bv, int bk) { int n;

int i, j; for (n = 0; n<bk-n && n<bv-n; n++) { for (j = n; j<bk-n; j++)

printf("%d ", a[n][j]);

for (i = n+1; i < bv-n; i++) printf("%d ", a[i][bk-n-1]);

for (j = bk-2-n; j >= n; j--) printf("%d ", a[bv-n-1][j]);

for (i = bv-2-n; i >= n+1; i--) printf("%d ", a[i][n]);

} }

Page 6: Razni zadaci

main() { int** a;

int bv, bk; int i, j; printf("Br. vrsta : "); scanf("%d", &bv); printf("Br. kolona : "); scanf("%d", &bk); a = (int**)malloc(bv*sizeof(int*)); for (i = 0; i<bv; i++)

a[i] = (int*)malloc(bk*sizeof(int)); for (i = 0; i<bv; i++)

for (j = 0; j<bk; j++) scanf("%d", &a[i][j]);

ispisi(a, bv, bk); for (i = 0; i<bv; i++)

free(a[i]); free(a);

}

Page 7: Razni zadaci

Napisati program za izraNapisati program za izraččunavanje koeunavanje koefificijenata polinoma cijenata polinoma TnTn((xx) () (n n je datije dati prirodan broj koji se uprirodan broj koji se uččitava sa standardnog itava sa standardnog ulaza) ako je poznato da vaulaza) ako je poznato da važži:i:

TT00((xx) = 1) = 1TT11((xx) = ) = xxTTnn((xx) = 2*) = 2*x x ** T Tn-n-11((xx) ) – T– Tn-n-22((xx))

Napisati i funkciju koja Napisati i funkciju koja šštampa polinom u oblikutampa polinom u obliku TnTn((xx) = ) = aa00 + + aa11**xx11 + +... ... + + aann * * xxnn..

Rezultati programa za Rezultati programa za n n = 2, = 2, n n = 3 i = 3 i n n = 4:= 4:TT22 = = --1 + 2*1 + 2*x^x^22TT33 = = --3*3*x^x^1 + 4*1 + 4*x^x^33TT44 = 1 = 1 – – 8*x8*x^̂2 + 8*2 + 8*x^x^44

Page 8: Razni zadaci

#include <stdio.h>#include <stdlib.h>

/* Funkcija koja stampa polinom stepena n-jednostavnija verzija */

void stamp_pol(int *a, int n){

int i;printf("%d", a[0]);

for(i=1; i<=n; i++)printf(" + %d*x^%d", a[i], i);

printf("\n");}

Page 9: Razni zadaci

/* Funkcija koja stampa polinom stepena n */void stampaj_polinom(int *a, int n){

int i;if (a[0])

printf("%d", a[0]);for(i=1; i<=n; i++)

if (a[i] > 0)printf(" + %d*x^%d", a[i], i);

else if (a[i] < 0)printf(" %d*x^%d", a[i], i);

printf("\n");}

Page 10: Razni zadaci

main(){

int *t_0, *t_1, *t_n, *pom; /* Pokazivaci preko kojih cemo cuvati koeficijente polinoma */

int n; /* Stepen polinoma koji racunamo */int i, j; /* Brojaci u petljama */printf("Unesite stepen polinoma: \n");scanf("%d", &n);/* Kako polinom stepena n ima n+1 koeficijenata, prostor za nizove cemo alocirati u skladu sa tim, odnosno

rezervisacemo za sve nizove prostor velicine n+1 */

/* Koristimo funkciju calloc da bi nam popunila nizove nulama */t_0 = (int *)calloc(n+1, sizeof(int));if (t_0 == NULL) exit(1);t_1 = (int *)calloc(n+1, sizeof(int));if (t_1 == NULL){ free(t_0);

exit(1); }

Page 11: Razni zadaci

t_n = (int *)calloc(n+1, sizeof(int));if (t_n == NULL){

free(t_0);free(t_1);exit(1);

}/* Odredjujemo koeficijente po postavci zadatka */t_0[0] = 1;/* Pre nego sto pristupimo t_1[1] proveravamo da li je n>=1 jer se moze desiti da je korisnik trazio polinom T_0, odnosno da je n bilo 0. Tada ce za sve nizove biti rezervisan prostor za samo 1element. */if (n>=1){

t_1[0] = 0;t_1[1] = 1;

}

Page 12: Razni zadaci

printf("\nP_%d(x) = ", n);if (n == 0)

stampaj_polinom(t_0, 0);else if (n == 1)

stampaj_polinom(t_1, 1);else{

/* Da bismo izracunali koeficijente polinoma T_n moramo redom izracunati koeficijente polinoma T_i za i=2,3... */

for(i=2; i<=n; i++){/* Racunamo koeficijente polinoma T_i po rekurzivnojformuli datoj u postavci zadatka*/t_n[0] = -t_0[0];for(j=1; j<=i; j++)

t_n[j] = 2*t_1[j-1] - t_0[j];

Page 13: Razni zadaci

/* Podesavamo vrednosti pokazivaca da odgovarajusledecoj iteraciji. Prvo cuvamo memorijski prostor na koji je pokazivao t_0 (pre dodele t_0=t_1) da ne bi doslo do memory leack-a, a i trebace nam kasnije kao prostor za t_n */pom = t_0;t_0 = t_1;t_1 = t_n;t_n = pom;}/* Sada nam se posledji izracunati polinom nalazi u t_1 (nakondodele t_1=t_n, pa njega i stampamo */stampaj_polinom(t_1, n);

}/* Oslobadjamo memoriju */free(t_0);free(t_1);free(t_n); }

Page 14: Razni zadaci

Funkcija koja mnoFunkcija koja množži polinom skalarom i polinom skalarom

Page 15: Razni zadaci

/* Funkcija koja mnovi polinom skalarom */int* mnozenje_skalarom(int *a, int n, int c){

int *b;int i;b = (int*)calloc(n+1, sizeof(int));if (b==NULL)

exit(1);for(i=0; i<=n; i++)

b[i] = a[i] * c;return b;

}

Page 16: Razni zadaci

Funkcija koja racuna koeficijente polinoma Funkcija koja racuna koeficijente polinoma dobijenog mnozenjemdobijenog mnozenjem polinoma a polinoma a

promenljivom promenljivom

Page 17: Razni zadaci

int* mnozenje_promenljivom(int *a, int n){

int *b;int i;/* Stepen rezultujuceg polinoma proizvoda polinoma

promenljivom je za jedan veci od polaznog polinoma, znaci n+1, pa moramo da rezervisemo prostor za n+2 koeficijenta */

b = (int*)calloc(n+2, sizeof(int));if (b==NULL)

exit(1);b[0] = 0;

for(i=1; i<=n+1; i++)b[i] = a[i-1];

return b;}

Page 18: Razni zadaci

Funkcija koja racuna Funkcija koja racuna razlikurazliku dva dva polinoma a i b predstavljenih nizompolinoma a i b predstavljenih nizom

svojih koeficijenata i stepenom svojih koeficijenata i stepenom

Page 19: Razni zadaci

/* Funkcija koja racuna zbir dva polinoma a i b predstavljenih nizomsvojih koeficijenata i stepenom */int* razlika(int *a, int *b, int n){

int i;int *c;

/* Alociramo prostor za koeficijente zbira unutar funkcije (dabi mogli da izracunamo vrednosti tog niza i da ga vratimokao povratnu vrednost funkcije). */

c = (int*)calloc(n+1, sizeof(int));for(i=0; i<=n; i++)

c[i] = a[i] - b[i];return c;

}

Kako bismo izracunali razliku dva polinoma koji nisu istog stepena?

Page 20: Razni zadaci

Sastaviti program koji omoguSastaviti program koji omoguććava korisniku da ava korisniku da unosi sa tastature niz celihunosi sa tastature niz celih pozitivnih ili negativnih pozitivnih ili negativnih brojeva kojih nema vibrojeva kojih nema višše od e od n n ..NegativneNegativne vrednosti vrednosti se upisuju nase upisuju na uzastopne pozicije pouzastopne pozicije poččev od poev od poččetka etka niza, a pozitivne vrednosti na uzastopne pozicije niza, a pozitivne vrednosti na uzastopne pozicije popoččev od kraja niza. Unos se zavrev od kraja niza. Unos se završšava kada se ava kada se unese 0unese 0 ili kada je niz popunjen. Kada je unos ili kada je niz popunjen. Kada je unos zavrzavrššen, program ispisuje sadren, program ispisuje sadržžajaj popunjenog dela popunjenog dela niza.niza.

Page 21: Razni zadaci

#include <stdio.h>#include <stdlib.h>main() {

int *a; /* Pokazivac na niz celih brojeva */int n; /* Dimenzija niza */int i, j; /* Brojaci koje cemo koristiti u petljama */int br; /* Pomocna promenljiva u koju cemo ucitavati

brojeve sa ulaza */printf("Unesite broj n: \n");scanf("%d", &n);a = (int *)calloc(n, sizeof(int));if (a == NULL)

exit(1);printf("Unesite cele brojeve (0 za kraj):\n");

Page 22: Razni zadaci

/* obratite paznju: ne smemo stavitifor(i=0, j=n-1; i<=j; i++, j--) */

for(i=0, j=n-1; i <= j;){

/* Citamo novi broj sa standardnog ulaza */scanf("%d", &br);/* Ako smo uneli 0 prekidamo */if (!br) break;/* Ako je negativan broj smestamo ga na pocetak niza,a ako je pozitivan smestamo ga na kraj.Tom prilikom se odgovarajuci brojac pomera na sledece mesto u nizu (odnosno brojac negativnih za jedno mesto u desno, a brojac pozitivnih za jedno mesto u levo). */if (br<0)

a[i++] = br;else

a[j--] = br;}

Page 23: Razni zadaci

/* Ispis popunjenog dela niza. Stampamo samo one elemente koji se razlikuju od 0 */printf("Uneli ste sledece elemente: \n");for(i=0; i<n; i++)

if (a[i])printf("%d ", a[i]);

free(a);}

Page 24: Razni zadaci

Napisati program koji za datoteku Napisati program koji za datoteku ččije se ime ije se ime zadaje kao prvi argumentzadaje kao prvi argument komandne linije ispisuje komandne linije ispisuje podatak o dupodatak o dužžinama svih reinama svih rečči koje se pojavljujui koje se pojavljuju u u toj datoteci i broju retoj datoteci i broju rečči te dui te dužžine.ine.

Na primer, za datoteku:Na primer, za datoteku:

aaa aa aaa aa aaa aaaaaa aa aaa aa aaa aaa

ReRečč du dužžine 3 se pojavila 4 puta a reine 3 se pojavila 4 puta a rečč du dužžine 2 se ine 2 se pojavila 2 puta.pojavila 2 puta.

Page 25: Razni zadaci

#include <stdio.h>#include <stdlib.h>#include <string.h>#define KORAK 10

typedef struct word{

int duz; /* Duzina reci koja se pojavila u datoteci */int br; /* Broj pojavljivanja reci date duzine */

} word;

Page 26: Razni zadaci

main(){

word *a = NULL; /* Pokazivac na niz reci */word *a_pom; /* Pomocni pokazivac */int duzina = 0, alocirano = 0;int length;int i, max_i;char s[100]; /* Pomocna promenljiva u kojoj cuvamo

tekucu rec */FILE *in;in=fopen(argv[1], "r");if (in==NULL){

fprintf(stderr, "\nGreska pri otkrivanju datoteke: %s\n", argv[1]);

exit(1);}

Page 27: Razni zadaci

/* Petlja koja nam sluzi da napravimo niz svih reci koje se pojavljuju u datoteci. Osim reci koja je procitana u nizu cuvamo i broj pojavljivanja te reci. */

do{

if (duzina == alocirano){/* Niz se prosiruje za 10 elemenata vise */alocirano = alocirano + KORAK;a_pom = (word *) realloc(a, alocirano*sizeof(word));if (a_pom != NULL)

a = a_pom;else

{free(a); exit 1;

}}

Page 28: Razni zadaci

fscanf(in, "%s", s); /* Citamo tekucu rec *//* Proveravamo da li se duzina te reci ranije pojavila udatoteci i ako jeste uvecavamo njen broj pojavljivanja za 1 */length = strlen(s);for(i=0; i<duzina; i++)

if (length == a[i].duz){

a[i].br++;break;

}/* Ako se rec te duzine nije ranije pojavila onda treba da unesemo rec te duzine u niz. Kako prethodna petlja proverava da li se duzina nalazi u nizu, u slucaju da se ne nalazi vazice i=duzina. */

if (i == duzina){

a[duzina].duz = length;a[duzina].br = 1;duzina++;

}} while (!feof(in));

Page 29: Razni zadaci

/* Ispisujemo podatke o duzinama reci i broju njihovog pojavljivanja */

for(i=0; i < duzina; i++)printf("%d\t%d\n", a[i].duz, a[i].br);

}

Page 30: Razni zadaci

Napisati program koja pronalazi najduži putNapisati program koja pronalazi najduži putu stablu i ispisujeu stablu i ispisuje gaga

Page 31: Razni zadaci

#include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct _cvor { int br;

struct _cvor* levo, *desno; } cvor; void ubaci(cvor** stablo, int br) { if (*stablo == NULL) { cvor* novi = (cvor*) malloc(sizeof(cvor));

assert(novi != NULL); novi->br = br; novi->levo = novi->desno = NULL; *stablo = novi;

} else { if (br < (*stablo)->br) ubaci(&((*stablo)->levo), br);

else if (br > (*stablo)->br) ubaci(&((*stablo)->desno), br); }

}

Page 32: Razni zadaci

void obrisi(cvor* stablo) {

if (stablo != NULL) {

obrisi(stablo->levo); obrisi(stablo->desno); free(stablo);

} } void ispisi(cvor* stablo) {

if (stablo != NULL) {

ispisi(stablo->levo); printf("%d ", stablo->br); ispisi(stablo->desno);

} }

Page 33: Razni zadaci

int najduzi_put(cvor* stablo) {

if (stablo == NULL) return 0; else {

int dl = najduzi_put(stablo->levo); int dd = najduzi_put(stablo->desno); if (dl>dd)

return dl + 1;else

return dd + 1; }

}

Page 34: Razni zadaci

void ispisi_najduze_(cvor* stablo, int duzina, int tekuca_duzina, int put[])

{ if (stablo == NULL) return; put[tekuca_duzina++] = stablo->br; if (stablo->levo == NULL && stablo->desno == NULL) {

if (tekuca_duzina == duzina) { int i;

for (i = 0; i < duzina; i++) printf("%d ", put[i]);

printf("\n"); }

} else { ispisi_najduze_(stablo->levo, duzina, tekuca_duzina, put); ispisi_najduze_(stablo->desno, duzina, tekuca_duzina, put);

} }

Page 35: Razni zadaci

void ispisi_najduze(cvor* stablo) { int put[100];

ispisi_najduze_(stablo, najduzi_put(stablo), 0, put); } int main(int argc, char* argv[]) { FILE* f; int br; cvor* stablo = NULL;

if (argc < 2) { fprintf(stderr, "Navesti ime datoteke\n");

exit(1); } f = fopen(argv[1], "r"); if (f == NULL) { fprintf(stderr, "Greska prilikom otvaranja %s\n", argv[1]); exit(1); } while(fscanf(f, "%d", &br) == 1)

ubaci(&stablo, br); ispisi(stablo); printf("Duzina najduzeg puta: %d\n", najduzi_put(stablo)); ispisi_najduze(stablo); obrisi(stablo); }