pii - a06 - pretrazivanje

16
PROGRAMIRANJE II A06 – Pretraživanje dr Dražen Brđanin ([email protected]) Goran Banjac ([email protected]) Danijela Zoran ([email protected]) Aleksandar Keleč ([email protected]) 2015.

Upload: -

Post on 11-Nov-2015

8 views

Category:

Documents


0 download

DESCRIPTION

c

TRANSCRIPT

PROGRAMIRANJE I (1101)

PROGRAMIRANJE IIA06 Pretraivanjedr Draen Branin([email protected])Goran Banjac([email protected])Danijela Zoran([email protected])Aleksandar Kele([email protected])2015.SEKVENCIJALNO PRETRAIVANJEPretraivanje2A06Napisati program u kojem treba u nizu cijelih brojeva pronai broj koji se navodi kao prvi argument komandne linije pomou metode sekvencijalnog pretraivanja.#include #include int seq_search(int *niz, int n, int kljuc){ for (int i = 0; i < n; i++) if (niz[i] == kljuc) return i; return -1;}int main(int argc, char **argv){ int niz[] = { 1, 2, -3, 4, 5 }, i, n = sizeof(niz) / sizeof(int), kljuc; if (argc < 2) return printf("Greska. Nema dovoljno argumenata."), 1; kljuc = atoi(argv[1]); printf("Niz:"); for (i = 0; i < n; i++) printf(" %d", niz[i]); i = seq_search(niz, n, kljuc); if (i != -1) printf("\nPronadjen element niza %d, na poziciji %d.", niz[i], i); else printf("\nElement %d nije pronadjen u nizu.", kljuc); return 0;}D:\>pretraga.exe -3Niz: 1 2 -3 4 5Pronadjen element niza -3, na poziciji 2.D:\>pretraga.exe 3Niz: 1 2 -3 4 5Element 3 nije pronadjen u nizu.

SEKVENCIJALNO PRETRAIVANJEPretraivanje3A06Napisati program u kojem treba iz datoteke, iji je naziv prvi argument komandne linije, proitati (binarno upisane) podatke o nepoznatom broju artikala i formirati odgovarajui dinamiki niz, a potom u formiranom nizu pronai i ispisati artikal iji se naziv unosi sa standardnog ulaza. Atributi artikla su naziv, koliina i cijena. Koristiti metodu sekvencijalnog pretraivanja sa straom.#include #include #include

typedef struct { char naziv[21]; double kol, cijena; } ARTIKAL;

int seq_search_straza(ARTIKAL *niz, char *kljuc){ int i = 0; while (strcmp(niz[i].naziv, kljuc)) i++; return i;}

void pisi(ARTIKAL *art){ printf("%-20s %6.2lf %6.2lf %6.2lf", art->naziv, art->kol, art->cijena, art->kol * art->cijena);}SEKVENCIJALNO PRETRAIVANJEPretraivanje4A06int main(int argc, char *argv[]) { int i, n = 0, c = 10, p; ARTIKAL *niz, art; FILE *dat; if (argc < 2) return printf("Nije naveden naziv datoteke."), 1; niz = (ARTIKAL *)malloc(c * sizeof(ARTIKAL)); if (dat = fopen(argv[1], "rb")) { do { p = fread(&art, sizeof(ARTIKAL), 1, dat); if (p) { if (n == c) niz = (ARTIKAL *)realloc(niz, (c *= 2) * sizeof(ARTIKAL)); niz[n++] = art; } } while (p); fclose(dat); } printf("Unesite naziv artikla za pretragu: "); scanf("%s", art.naziv); if (n == c) niz = (ARTIKAL *)realloc(niz, (c += 1) * sizeof(ARTIKAL)); niz[n] = art; printf("Rezultat pretrage:\n"); i = seq_search_straza(niz, art.naziv); if (i == n) printf("Nije pronadjen artikal!"); else { printf("=== ==================== ====== ====== ======\n"); printf("RB. NAZIV KOL. CIJENA UKUPNO\n"); printf("=== ==================== ====== ====== ======\n"); printf("%2d. ", i + 1), pisi(niz + i); printf("\n=== ==================== ====== ====== ======\n"); } free(niz); return 0; }D:\>artikli_pretraga.exe ARTIKLI.DATUnesite naziv artikla za pretragu: JabukeRezultat pretrage:=== ==================== ====== ====== ======RB. NAZIV KOL. CIJENA UKUPNO=== ==================== ====== ====== ====== 2. Jabuke 2.50 1.50 3.75=== ==================== ====== ====== ======D:\>artikli_pretraga.exe ARTIKLI.DATUnesite naziv artikla za pretragu: MalineRezultat pretrage:Nije pronadjen artikal!

BINARNO PRETRAIVANJEPretraivanje5A06Napisati program u kojem treba iz datoteke, iji je naziv prvi argument komandne linije, proitati podatke o nepoznatom broju studenata koji su sortirani po broju indeksa, i formirati odgovarajui dinamiki niz, a potom u formiranom nizu pronai i ispisati podatke o studentu iji se broj indeksa unosi sa standardnog ulaza. Podaci koji se vode o studentu su: indeks, ime, prezime i prosjek.#include #include #include typedef struct{ char indeks[8], ime[21], prezime[21]; double prosjek; } STUDENT;int ucitaj(FILE *in, STUDENT *s){ return fscanf(in, "%*d. %s %s %s %lf", s->indeks, s->prezime, s->ime, &s->prosjek);}int bin_search(STUDENT *niz, int n, char *kljuc){ int begin = 0, end = n - 1, sredina; do { sredina = (begin + end) / 2; if (!strcmp(niz[sredina].indeks, kljuc)) return sredina; if (strcmp(niz[sredina].indeks, kljuc) > 0) end = sredina - 1; else begin = sredina + 1; } while (begin studenti_pretraga.exe STUDENTI.TXTUnesite broj indeksa za pretragu: 1104/14Rezultat pretrage:=== ======= ==================== ==================== =======RB. INDEKS PREZIME IME PROSJEK=== ======= ==================== ==================== ======= 3. 1104/14 Nikolic Nikolina 9.81=== ======= ==================== ==================== =======D:\>studenti_pretraga.exe STUDENTI.TXTUnesite broj indeksa za pretragu: 1103/14Rezultat pretrage:Nije pronadjen student!

BINARNO PRETRAIVANJEPretraivanje7A06Napisati program koji simulira pretragu rjenika. Potrebno je uitati rijei iz datoteke rjecnik.txt i kreirati odgovarajui dinamiki niz, a potom u formiranom nizu pronai i ispisati rije koja se unosi sa standardnog ulaza. Zadatak rijeiti kombinovanjem interpolacionog i sekvencijalnog pretraivanja (prvo interpolacionim pretraivanjem locirati neku rije koja poinje istim slovom, a zatim sekvencijalnim pretraivanjem pronai eljenu rije, ako postoji).#include #include #include int inter_search(char **niz, int n, char kljuc) { int begin = 0, end = n - 1, sredina, brojilac, imenilac; do { brojilac = (kljuc - niz[begin][0]) * (end - begin); imenilac = niz[end][0] - niz[begin][0]; sredina = begin + brojilac / imenilac; if (niz[sredina][0] == kljuc) return sredina; if (kljuc < niz[sredina][0]) end = sredina - 1; else begin = sredina + 1; } while (begin = 0 && (rjecnik[i][0] == rijec[0])) { if (!strcmp(rjecnik[i], rijec)) { p = 1; break; } i--; } while (++j < n && (rjecnik[j][0] == rijec[0]) && !p) { if (!strcmp(rjecnik[j], rijec)) { p = 1; break; } } printf("Rijec %s %s postoji u rjecniku!", rijec, p ? "" : "ne"); for (i = 0; i < n; i++) free(rjecnik[i]); free(rjecnik); return 0;}

D:\>rjecnik.exeUnesite rijec za pretragu: krugRezultat pretrage:Rijec krug postoji u rjecniku!D:\>rjecnik.exeUnesite rijec za pretragu: jabukeRezultat pretrage:Rijec jabuke ne postoji u rjecniku!BINARNO PRETRAIVANJEPretraivanje9A06Program koji pogaa nenegativan broj koji je korisnik zamislio. #include int main(){ int begin = 0, end = 1, sredina, odg; printf("Zamislite prirodan broj!\n"); while (1) { printf("Da li je broj veci od %d? (1/0) ", end); scanf("%d", &odg); if (!odg) break; begin = end + 1; end *= 2; } while (begin < end) { sredina = (begin + end) / 2; printf("Da li je broj veci od %d? (1/0) ", sredina); scanf("%d", &odg); if (odg) begin = sredina + 1; else end = sredina; } printf("Zamislili ste broj: %d", end); return 0;}Zamislite prirodan broj!Da li je broj veci od 1? (1/0) 1Da li je broj veci od 2? (1/0) 1Da li je broj veci od 4? (1/0) 1Da li je broj veci od 8? (1/0) 1Da li je broj veci od 16? (1/0) 0Da li je broj veci od 12? (1/0) 0Da li je broj veci od 10? (1/0) 1Da li je broj veci od 11? (1/0) 0Zamislili ste broj: 11

11BINARNO PRETRAIVANJEPretraivanje10A06Program koji odreuje realnu nulu jednaine sa odgovarajuom preciznou, kombinacijom eksponencijalnog i binarnog pretraivanja.#include #include double rjesenje(double(*f)(double), double eps){ double begin = 0, end = 0.1, sredina; while ((*f)(begin) * (*f)(end) >= 0) end = (begin = end) * 2; while (end - begin > eps) { sredina = (begin + end) / 2.0; if ((*f)(begin) * (*f)(sredina) > 0) begin = sredina; else end = sredina; } return sredina;}int main(){ double x = rjesenje(cos, 0.01); printf("cos(%.5f)=%.5f\n", x, cos(x)); return 0;}cos(1.56875)=0.00205

SPOLJANJE PRETRAIVANJEPretraivanje11A06Napisati program u kojem treba sa standardnog ulaza uitati podatke za n studenata, a potom podatake o studentima upisati u datoteku iji je naziv prvi argument komandne linije. Atributi studenta su indeks, prezime, ime i prosjek. Pored toga, potrebno je kreirati i strukturu INDEKS, koja predstavlja look-up tabelu, pomou koje e se efikasnije pretraivati datoteka sa studentima. Atributi indeksa su kljuc i adresa. Indekse je potrebno odravati sortirane u dinamikom nizu a zatim sauvati u datoteku iji je naziv drugi argument komandne linije.#include #include #include

typedef struct { char indeks[8], ime[21], prezime[21]; double prosjek; } STUDENT;typedef struct { char kljuc[8]; int adresa; } INDEKS;

void citaj_studenta(STUDENT *st) { printf(" Indeks: "); scanf("%s", st->indeks); printf(" Prezime: "); scanf("%s", st->prezime); printf(" Ime: "); scanf("%s", st->ime); printf(" Prosjek: "); scanf("%lf", &st->prosjek);}void pisi_footer_u_fajl(FILE *dat){ fprintf(dat, "=== ======= ==================== ==================== =======\n"); }SPOLJANJE PRETRAIVANJEPretraivanje12A06void pisi_header_u_fajl(FILE *dat) { fprintf(dat, "=== ======= ==================== ==================== =======\n"); fprintf(dat, "RB. INDEKS PREZIME IME PROSJEK\n"); fprintf(dat, "=== ======= ==================== ==================== =======\n");}void upisi_studenta_u_fajl(STUDENT st, FILE *dat, INDEKS *indeksi, int rb) { INDEKS ind; strcpy(ind.kljuc, st.indeks); ind.adresa = ftell(dat); azuriraj_indekse(indeksi, ind, rb); fprintf(dat, "%2d. ", rb); fprintf(dat, "%-7s %-20s %-20s %7.2lf\n", st.indeks, st.prezime, st.ime, st.prosjek);}void upisi_indekse_u_fajl(INDEKS *niz, int n, FILE *dat) { int i; for (i = 0; i < n; i++) { fprintf(dat, "%s %d\n", niz[i].kljuc, niz[i].adresa); }}void azuriraj_indekse(INDEKS *niz, INDEKS ind, int n) { int i; for (i = n - 1; i > 0 && strcmp(ind.kljuc, niz[i - 1].kljuc) < 0; i--) niz[i] = niz[i - 1]; niz[i] = ind;}SPOLJANJE PRETRAIVANJEPretraivanje13A06int main(int argc, char *argv[]) { int i, n; FILE *dat; STUDENT st; INDEKS *indeksi; if (argc < 3) return printf("Nisu navedeni svi argumenti."), 1; do printf("n="), scanf("%d", &n); while (n < 1); indeksi = (INDEKS *)malloc(n * sizeof(INDEKS)); if (dat = fopen(argv[1], "w")) { pisi_header_u_fajl(dat); for (i = 1; i studenti_unos.exe studenti.txt indeksi.txtn=4Podaci o 1. studentu: Indeks: 1101/14 Prezime: Markovic Ime: Marko Prosjek: 8.75 . . .Podaci o 4. studentu: Indeks: 1102/14 Prezime: Aleksic Ime: Aleksandra Prosjek: 8.8SPOLJANJE PRETRAIVANJEPretraivanje14A06Napisati program u kojem treba u datoteci studenti.txt, iz prethodnog zadatka, pronai podatke o studentu iji se broj indeksa unosi sa standardnog ulaza. Potrebno je iz datoteke indeksi.txt proitati sve indeksne zapise i formirati dinamiki niz, u kojem e se na osnovu unesenog broja indeksa (kljuc), pronai odgovarajua adresa poetka zapisa o studentu u datoteci studenti.txt, te na taj nain proitati i ispisati podatke o pronaenom studentu.#include #include #include typedef struct { char indeks[8], ime[21], prezime[21]; double prosjek; } STUDENT;typedef struct { char kljuc[8]; int adresa; } INDEKS;

int bin_search(INDEKS *niz, int n, char *kljuc) { int begin = 0, end = n - 1, sredina; do { sredina = (begin + end) / 2; if (!strcmp(niz[sredina].kljuc, kljuc)) return sredina; if (strcmp(niz[sredina].kljuc, kljuc) > 0) end = sredina - 1; else begin = sredina + 1; } while (begin studenti_pretraga.exeUnesite broj indeksa za pretragu: 1102/14Rezultat pretrage:=== ======= ==================== ==================== =======RB. INDEKS PREZIME IME PROSJEK=== ======= ==================== ==================== ======= 4. 1102/14 Aleksic Aleksandra 8.80=== ======= ==================== ==================== =======D:\>studenti_pretraga.exeUnesite broj indeksa za pretragu: 1105/14Rezultat pretrage:Nije pronadjen student!

ZADACI ZA VJEBUPretraivanje16A06Napisati program za pogaanje cijelih brojeva u kojem treba iz tekstualne datoteke, iji je naziv prvi argument komandne linije, proitati sortirano upisane cijele brojeve, iz intervala [0, 20], a potom iz pet pokuaja pokuati pogoditi to vie brojeva, i ispisati na standardni izlaz broj uspjenih pogodaka. Za pretragu koristiti rekurzivno binarno pretraivanje.Napisati program koji simulira pretragu telefonskog imenika. Potrebno je uitati osobe iz datoteke imenik.txt i kreirati odgovarajui dinamiki niz, a potom u formiranom nizu pronai i ispisati osobu ije se prezime i ime unosi sa standardnog ulaza. Koristiti interpolaciono pretraivanje.Napisati program u kojem treba iz datoteke, iji je naziv prvi argument komandne linije, proitati (binarno upisane) podatke o nepoznatom broju osoba i formirati odgovarajui dinamiki niz, a potom u formiranom nizu pronai i ispisati osobu iji se JMBG unosi sa standardnog ulaza. Atributi osobe su JMBG, ime, prezime i rodjen. Napisati program kojim se porede brzine izvravanja razliitih algoritama pretraivanja na istom nizu pseudosluajnih vrijednosti.