Razni zadaci

Preview:

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

Citation preview

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

osobinu tranzitivnosti.osobinu tranzitivnosti.

#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;

}}

Napisati program koji Napisati program koji spiralno ispisuje matricuspiralno ispisuje matricu

#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]);

} }

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

}

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

#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");}

/* 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");}

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); }

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;

}

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];

/* 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); }

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

/* 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;

}

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

promenljivom promenljivom

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;}

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

/* 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?

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.

#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");

/* 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;}

/* 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);}

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.

#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;

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);}

/* 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;

}}

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

/* 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);

}

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

#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); }

}

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

} }

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; }

}

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

} }

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); }