Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #define MAX_NAZIV 20
- typedef struct film_st //struktura FILM sa poljima naziv, zanr godina i ocena
- {
- char naziv [MAX_NAZIV];
- char zanr [MAX_NAZIV];
- unsigned godina;
- float ocena;
- }FILM;
- typedef struct cvor_st //struktura cvor sa poljem film koje sadrzi strukturu FILM i pokazivackim poljem *sledeci
- {
- FILM film;
- struct cvor_st *sledeci;
- }CVOR;
- void inicijalizacija (CVOR **); //deklaracije (prototipi) funkcija koje cemo koristiti
- void ucitavanje (FILE *,CVOR **);
- void dodaj (CVOR *,CVOR **);
- void ispisi(CVOR *);
- void min(CVOR *);
- void max(CVOR *);
- void pretraga_po_zanru(FILE *,CVOR *,char *);
- void ispisi_strukturu(FILE *izlaz,FILM niz);
- void max_ocena(FILE *izlaz,FILM niz[],int br_elem);
- void pretraga_po_godini(FILE *izlaz,int godina,CVOR *glava);
- void main (int BrArg, char *args[]) //funkcija main koja prihvata argumene komandne linije. Broj argomenata se smesta u inr BrArg a sami argumenti se kao STRINGOVI!!! smestaju u niz args.
- {
- if(BrArg!=4) // proveravamo da li postoji dovoljan bbroj argumenata komandne linije za pokretanje programa
- {
- printf("\nU komandnoj liniji morate imati ime izvrsnog fajla, ime ulazne datoteke, \ngodinu za sortiranje i zanr kao kriterijum ispisa!");
- exit(1);
- }
- FILE *ulaz,*izlaz,*fzanr; // deklarisemo pokazivace tipa FILE pomocu kojih cemo pristupiti memorijskoj lokaciji potrebnih ulaznih i izlaznih fajlova
- char naz_fajla[MAX_NAZIV+4],zanr[MAX_NAZIV];//deklarisemo i inicijalizujemo stringove u koje prihvatamo zadati zanr iz komandne linije i u drugom stringu sklapamo ime izlaznog fajla
- CVOR *glava; //deklaracija pokazivaca tipa cvor koji ce biti glava nase liste. On za sada "visi" u memoriji.
- int godina=atoi(args[2]);// iz argumenata komandne linije prihvatamo zadatu godinu. funkcijom atoi prevodimo godinu iz stringa u broj
- inicijalizacija(&glava); //pozivamo funkciju kojom inicijalizujemo glavu nase liste prosledjujemo joj adresu buduce glave liste
- ulaz=fopen(args[1],"r"); // funkcijom fopen pokazivacu ulaz prosledjujemo adresu ulaznig fajla, cije smo ime zadali pri pozivu programa
- if(ulaz==NULL) //proveravamo da li je ulazni fajl uspesno otvoren. Ovim i gore navedenik postupkom zamenjujemo funkciju safe_open koju mozemo videti u drugim primerima
- {
- printf("\nUlazni fajl nije uspesno otvoren\n");
- exit (1);
- }
- ucitavanje(ulaz,&glava); //pozivamo funkciju kojom iz ulaznog fajla, ciju adresu prosledjujemo pokazivacem ulaz, u listu ucitavamo podatke. Prosledjujemo adresu glave liste, koju smo malopre inicijalizovali, kako vismo mogli da formiramo listu
- min(glava);// pozivamo funkciju kojom odredjujemo najstariji film u listi
- max(glava);// pozivamo funkciju kojom odredjujemo najmladji film u listi
- strcpy(zanr,args[3]);// iz komandne linije prihvatamo zadati zanr i smestamo ga u string zanr
- strcpy(naz_fajla,zanr);// zadati zanr kopiramo u string u kom cemo formirati naziv izlaznog fajla
- strcat(naz_fajla,".txt");// kompletiramo naziv izlaznog fajla
- fzanr=fopen(naz_fajla,"w");// pokazivacu fzanr prosledjujemo adresu fajla u koji ispisujemo trazene podatke sortirane po upitu zanra. Ukoliko u istom direktorijumu u km se nalazi izvrsni fajl ovog programa ne postoji fajl sa tim imenom, automatski se generise
- if(fzanr!=NULL) //proveravamo da li je fajl uspesno kreiran (otvoren). Ukoliko jeste pozivamo funkciju pretraga po zanru koja ce se detaljnije objasniti dole
- {
- pretraga_po_zanru(fzanr,glava,zanr);
- }
- else
- {
- printf("\nNeuspesno kreiranje fajla %s\n",naz_fajla);
- exit(1);
- }
- izlaz=fopen("izlaz.txt","w");//otvaramo izlazni fajl i ako je on uspesno otvoren (kreiran) pozivamo funkciju pretraga po godini
- if(izlaz!=NULL)
- {
- pretraga_po_godini(izlaz,godina,glava);
- }
- else
- {
- printf("\nNeuspesno kreiranje fajla izlaz.txt\n");
- exit(1);
- }
- }
- void inicijalizacija(CVOR **glava) //Ovom funkcijom inicijalizujemo pokaazivac glave liste na NULL. To znaci da je glava liste sada ustvari lista prazna lista (gava ne pokazuje ni na sta).
- {
- *glava=NULL;// Vrednost pokazivaca glava postavljamo na NULL
- }
- void ucitavanje (FILE *ulaz,CVOR **glava)// Funkcija ucitava podatke iz ulaznog fajla i pomocu druge funkcije (dodaj) ih dodaje u listu.
- {
- FILM tmp;// pomocna struktura tipa FIM u koju privremeno ucitavamo podatke iz fajlova
- while(fscanf(ulaz,"%s%f%s%u",tmp.naziv,&tmp.ocena,tmp.zanr,&tmp.godina)!=EOF)// petlja kojom se setamo kroz fajl i kopiramo podatke iz fajla u strukturu temp
- {
- CVOR *novi=(CVOR *)malloc(sizeof(CVOR));// deklarisemo i inicijalizujemo cvor novi, kome funkcijom malloc rezervisemo potrebnu memoriu
- strcpy(novi->film.naziv,tmp.naziv);//pristupamo cvoru novi, informacionim polju film, pa u polju film pristupamo polju naziv (novi->film.naziv) i u njega iz strukture temp, polja naziv (temp.naziv) kopiramo podatke
- strcpy(novi->film.zanr,tmp.zanr);//isti postupak kao i gore. Ovde se koristi funkcija strcpy jer se stringovi kopiraju jedan u drugi, ne mogu se preneti znakom jednakosti
- novi->film.godina=tmp.godina;//brojevi se prenose znakom jednakosti
- novi->film.ocena=tmp.ocena;
- dodaj(novi,&(*glava));//pozivamo funkciju kojom novi cvor dodajemo u listu. Do poziva ove funkcije, novi cvor "visi" u memoriji racunara
- }
- }
- void dodaj (CVOR *novi,CVOR **glava)// funkcija koja ce, ako je lista prazna, postaviti da glava liste pokazuje na novoformirani cvor i time ga uciniti prvim cvorom u listi. ako lista nije prazna novi cvor dodajemo iza poslednjeg cvora u listi
- {
- CVOR *tek, *pret; //pomocni pokazivaci tipa cvor kojima se setamo kroz listu
- if(*glava == NULL) // proveravamo da li je lista prazna. Prazna je ako pokazivac glava ima vrednost NULL
- {
- *glava = novi;// ako je lista prazna, postavljamo da pokazivac glava pokazuje na cvor novi koji smo formirali u prethodnoj funkciji
- }
- else { // ako lista vec ima neke cvorove pomocnim pokazivacima se prosetamo do kraja iste i podesimo da poslednji cvor u listi pokazuje na novoformirani cvor
- tek = *glava;
- pret = *glava;
- while(tek != NULL) { // pomeranje pokazivaca tek i pret na kraj liste. Znamo da smo dosli na kraj liste jer poslednji cvor u adresnom polju ima NULL
- pret = tek;
- tek = tek->sledeci;// pokazivac tek pomeramo na sledeci cvor tako sto mu dajemo vrednost adrese sledeceg cvora. ta adresa se nalazi u polju sledeci cvora na kom se nalazimo
- }
- pret->sledeci = novi; //postavljamo u polje sledeci posednjeg cvora na listi da pokazuje na novoformirani cvor u listi i tako ga pridruzulemo listi
- }
- }
- void ispisi(CVOR *glava)// funkcija kojom prema potrebi mozemo ispisati listu na ekranu, u ovom se zadatku ne koristi
- {
- CVOR *tmp=glava;
- printf("\n\tLISTA\n");
- while(tmp!=NULL)
- {
- printf("Naziv: %s\nZanr: %s\nGodina: %u\nOcena: %0.1f\n\n",tmp->film.naziv,tmp->film.zanr,tmp->film.godina,tmp->film.ocena);
- tmp=tmp->sledeci;
- }
- }
- void min(CVOR *glava)// Funkciji prosledjujemo glavu liste jer time ustvari saljemo celu listu.
- {
- CVOR *tek=glava; //pomocni pokazivac tek postavljamo na glavu liste, tako da sad ovaj pokazivac pokazuje na isto sto i glava tacnije na prvi cvor liste
- FILM trenutni;// pomocna struktura u koju smestamo podatke iz cvorova
- trenutni=tek->film;// postavljamo u pomocnu strukturu podatke iz prvog cvora (prvi film), sa pretpostavkom da je taj film najstariji
- while(tek!=NULL)// petlja kojom se krecemo kroz listu
- {
- if(trenutni.godina>tek->film.godina)// uporedjujemo godinu iz pomocne strukture sa godinom iz cvora. ako je godina iz cvora manja od godine iz strukture, kopiramo podatke iz cvora u strukturu, pa te podatke dalje uporedjujemo
- trenutni=tek->film;
- tek=tek->sledeci;
- }
- printf("\nNajstariji film je %s\n objavljen %u godine\n",trenutni.naziv,trenutni.godina);
- }
- void max(CVOR *glava)//isti postupak kao gore, samo sto trazimo najvecu godinu (najmaladji film)
- {
- CVOR *tek=glava;
- FILM trenutni;
- trenutni=tek->film;
- while(tek!=NULL)
- {
- if(trenutni.godina<tek->film.godina)
- trenutni=tek->film;
- tek=tek->sledeci;
- }
- printf("\nNajnoviji film je %s\n objavljen %u godine\n",trenutni.naziv,trenutni.godina);
- }
- void pretraga_po_zanru(FILE *fzanr,CVOR *glava,char *zanr)// funkcijiom uporedjujemo zadati zanr sa zanrovima u listi
- {
- CVOR *tmp=glava;
- while(tmp!=NULL)
- {
- if(strcmp(tmp->film.zanr,zanr)==0)//ako se pronadje trazeni zanr ispisuje se u fajl
- {
- fprintf(fzanr,"Naziv: %s\nZanr: %s\nGodina: %u\nOcena: %0.1f\n\n",tmp->film.naziv,tmp->film.zanr,tmp->film.godina,tmp->film.ocena);
- }
- tmp=tmp->sledeci;
- }
- }
- void pretraga_po_godini(FILE *izlaz,int godina,CVOR *glava)// izdvajamo u posebnu strukturu elemente liste koji ispunjavaju zadati kriterijum, tj koji su snimljeni posle zadate godine
- {
- int br_elem=broj_elemenata(glava),i=0;// funkijom broj elemenata brojimo koliko cvorova ima u listi, da bismo zauzeli najmanje memorije
- FILM niz[br_elem+1];// niz strukture u koji smestamo filmove koji su ispunili uslov
- CVOR *tek=glava;// pomocni pokazivac koji pomeramo po listi
- while (tek!=NULL)//petlja kojim pomeramo pomocni pokazivac u listi
- {
- if(tek->film.godina>godina)// proveravamo da li je film snimljen posle zadate godine
- {
- niz[i]=tek->film;
- i++;
- }
- tek=tek->sledeci;
- }
- max_ocena(izlaz,niz,i);
- }
- void max_ocena(FILE *izlaz,FILM niz[],int br_elem)//iz niza struktura u koji smo ucitali filmove koji su snimljenji posle zadate godine izdvajamo film sa najvecom ocenom
- {
- int i;
- FILM trenutni;
- trenutni=niz[0];
- for (i=0;i<=br_elem;i++)
- {
- if(trenutni.ocena<niz[i].ocena)
- {
- trenutni=niz[i];
- }
- }
- ispisi_strukturu(izlaz,trenutni);
- }
- void ispisi_strukturu(FILE *izlaz,FILM struktura)// funkcija koja ispisuje strukturu u fajl
- {
- fprintf(izlaz,"Naziv: %s\nZanr: %s\nGodina: %u\nOcena: %0.1f\n\n",struktura.naziv,struktura.zanr,struktura.godina,struktura.ocena);
- }
- int broj_elemenata(CVOR *glava)// brojimo koliko cvorova u listi ima
- {
- int ukupno = 0;
- while(glava)
- {
- ukupno++;
- glava=glava->sledeci;
- }
- return ukupno;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement