Advertisement
Guest User

Untitled

a guest
May 28th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.32 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #define MAX_NAZIV 20
  5.  
  6. typedef struct film_st //struktura FILM sa poljima naziv, zanr godina i ocena
  7. {
  8.     char naziv [MAX_NAZIV];
  9.     char zanr [MAX_NAZIV];
  10.     unsigned godina;
  11.     float ocena;
  12. }FILM;
  13.  
  14. typedef struct cvor_st //struktura cvor sa poljem film koje sadrzi strukturu FILM i pokazivackim poljem *sledeci
  15. {
  16.     FILM film;
  17.     struct cvor_st *sledeci;
  18. }CVOR;
  19.  
  20. void inicijalizacija (CVOR **); //deklaracije (prototipi) funkcija koje cemo koristiti
  21. void ucitavanje (FILE *,CVOR **);
  22. void dodaj (CVOR *,CVOR **);
  23. void ispisi(CVOR *);
  24. void min(CVOR *);
  25. void max(CVOR *);
  26. void pretraga_po_zanru(FILE *,CVOR *,char *);
  27. void ispisi_strukturu(FILE *izlaz,FILM niz);
  28. void max_ocena(FILE *izlaz,FILM niz[],int br_elem);
  29. void pretraga_po_godini(FILE *izlaz,int godina,CVOR *glava);
  30.  
  31. 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.
  32. {
  33.     if(BrArg!=4) // proveravamo da li postoji dovoljan bbroj argumenata komandne linije za pokretanje programa
  34.     {
  35.         printf("\nU komandnoj liniji morate imati ime izvrsnog fajla, ime ulazne datoteke, \ngodinu za sortiranje i zanr kao kriterijum ispisa!");
  36.         exit(1);
  37.     }
  38.     FILE *ulaz,*izlaz,*fzanr; // deklarisemo pokazivace tipa FILE  pomocu kojih cemo pristupiti memorijskoj lokaciji potrebnih ulaznih i                                    izlaznih fajlova
  39.     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
  40.     CVOR *glava; //deklaracija pokazivaca tipa cvor koji ce biti glava nase liste. On za sada "visi" u memoriji.
  41.     int godina=atoi(args[2]);// iz argumenata komandne linije prihvatamo zadatu godinu. funkcijom atoi prevodimo godinu iz stringa u broj
  42.    
  43.     inicijalizacija(&glava); //pozivamo funkciju kojom inicijalizujemo glavu nase liste prosledjujemo joj adresu buduce glave liste
  44.     ulaz=fopen(args[1],"r"); // funkcijom fopen pokazivacu ulaz prosledjujemo adresu ulaznig fajla, cije smo ime zadali pri pozivu programa
  45.    
  46.         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
  47.         {
  48.         printf("\nUlazni fajl nije uspesno otvoren\n");
  49.         exit (1);
  50.         }
  51.        
  52.     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
  53.     min(glava);// pozivamo funkciju kojom odredjujemo najstariji film u listi
  54.     max(glava);// pozivamo funkciju kojom odredjujemo najmladji film u listi
  55.     strcpy(zanr,args[3]);// iz komandne linije prihvatamo zadati zanr i smestamo ga u string zanr
  56.     strcpy(naz_fajla,zanr);// zadati zanr kopiramo u string u kom cemo formirati naziv izlaznog fajla
  57.     strcat(naz_fajla,".txt");// kompletiramo naziv izlaznog fajla
  58.    
  59.     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
  60.     if(fzanr!=NULL) //proveravamo da li je fajl uspesno kreiran (otvoren). Ukoliko jeste pozivamo funkciju pretraga po zanru koja ce se                         detaljnije objasniti dole
  61.     {
  62.     pretraga_po_zanru(fzanr,glava,zanr);
  63.     }
  64.     else
  65.     {
  66.         printf("\nNeuspesno kreiranje fajla %s\n",naz_fajla);
  67.         exit(1);
  68.     }
  69.    
  70.     izlaz=fopen("izlaz.txt","w");//otvaramo izlazni fajl i ako je on uspesno otvoren (kreiran) pozivamo funkciju pretraga po godini
  71.     if(izlaz!=NULL)
  72.     {
  73.     pretraga_po_godini(izlaz,godina,glava);
  74.     }
  75.    
  76.     else
  77.     {
  78.         printf("\nNeuspesno kreiranje fajla izlaz.txt\n");
  79.         exit(1);
  80.     }
  81.    
  82. }
  83. 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).
  84. {
  85.     *glava=NULL;// Vrednost pokazivaca glava postavljamo na NULL
  86. }
  87. void ucitavanje (FILE *ulaz,CVOR **glava)// Funkcija ucitava podatke iz ulaznog fajla i pomocu druge funkcije (dodaj) ih dodaje u listu.
  88. {
  89.     FILM tmp;// pomocna struktura tipa FIM u koju privremeno ucitavamo podatke iz fajlova
  90.  
  91.     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
  92. {
  93.         CVOR *novi=(CVOR *)malloc(sizeof(CVOR));// deklarisemo i inicijalizujemo cvor novi, kome funkcijom malloc rezervisemo potrebnu                                                  memoriu
  94.         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
  95.         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
  96.         novi->film.godina=tmp.godina;//brojevi se prenose znakom jednakosti
  97.         novi->film.ocena=tmp.ocena;
  98.         dodaj(novi,&(*glava));//pozivamo funkciju kojom novi cvor dodajemo u listu. Do poziva ove funkcije, novi cvor "visi" u memoriji                                 racunara
  99.  
  100.     }
  101. }
  102. 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
  103. {
  104.     CVOR *tek, *pret; //pomocni pokazivaci tipa cvor kojima se setamo kroz listu
  105.    
  106.      if(*glava == NULL) // proveravamo da li je lista prazna. Prazna je ako pokazivac glava ima vrednost NULL
  107.      {
  108.                 *glava = novi;// ako je lista prazna, postavljamo da pokazivac glava pokazuje na cvor novi koji smo formirali u prethodnoj                                  funkciji
  109.             }
  110.         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
  111.              tek = *glava;
  112.              pret = *glava;
  113.        
  114.                 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
  115.                  pret = tek;
  116.                     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
  117.                 }
  118.        
  119.          pret->sledeci = novi; //postavljamo u polje sledeci posednjeg cvora na listi da pokazuje na novoformirani cvor u listi i tako ga                                   pridruzulemo listi
  120.     }
  121. }
  122. void ispisi(CVOR *glava)// funkcija kojom prema potrebi mozemo ispisati listu na ekranu, u ovom se zadatku ne koristi
  123. {
  124.     CVOR *tmp=glava;
  125.     printf("\n\tLISTA\n");
  126.     while(tmp!=NULL)
  127.     {
  128.         printf("Naziv: %s\nZanr: %s\nGodina: %u\nOcena: %0.1f\n\n",tmp->film.naziv,tmp->film.zanr,tmp->film.godina,tmp->film.ocena);
  129.         tmp=tmp->sledeci;
  130.     }
  131. }
  132. void min(CVOR *glava)// Funkciji prosledjujemo glavu liste jer time ustvari saljemo celu listu.
  133. {
  134.     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
  135.     FILM trenutni;// pomocna struktura u koju smestamo podatke iz cvorova
  136.     trenutni=tek->film;// postavljamo u pomocnu strukturu podatke iz prvog cvora (prvi film), sa pretpostavkom da je taj film najstariji
  137.     while(tek!=NULL)// petlja kojom se krecemo kroz listu
  138.     {
  139.         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
  140.         trenutni=tek->film;
  141.         tek=tek->sledeci;
  142.     }
  143.     printf("\nNajstariji film je %s\n objavljen %u godine\n",trenutni.naziv,trenutni.godina);
  144.    
  145. }
  146. void max(CVOR *glava)//isti postupak kao gore, samo sto trazimo najvecu godinu (najmaladji film)
  147. {
  148.     CVOR *tek=glava;
  149.     FILM trenutni;
  150.     trenutni=tek->film;
  151.     while(tek!=NULL)
  152.     {
  153.         if(trenutni.godina<tek->film.godina)
  154.         trenutni=tek->film;
  155.         tek=tek->sledeci;
  156.     }
  157.     printf("\nNajnoviji film je %s\n objavljen %u godine\n",trenutni.naziv,trenutni.godina);
  158.    
  159. }
  160. void pretraga_po_zanru(FILE *fzanr,CVOR *glava,char *zanr)// funkcijiom uporedjujemo zadati zanr sa zanrovima u listi
  161. {
  162.     CVOR *tmp=glava;
  163.     while(tmp!=NULL)
  164.     {
  165.     if(strcmp(tmp->film.zanr,zanr)==0)//ako se pronadje trazeni zanr ispisuje se u fajl
  166.     {
  167.         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);
  168.     }
  169.     tmp=tmp->sledeci;
  170.     }
  171. }
  172. 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
  173. {
  174.     int br_elem=broj_elemenata(glava),i=0;// funkijom broj elemenata brojimo koliko cvorova ima u listi, da bismo zauzeli najmanje memorije
  175.     FILM niz[br_elem+1];// niz strukture u koji smestamo filmove koji su ispunili uslov
  176.     CVOR *tek=glava;// pomocni pokazivac koji pomeramo po listi
  177.     while (tek!=NULL)//petlja kojim pomeramo pomocni pokazivac u listi
  178.     {
  179.         if(tek->film.godina>godina)// proveravamo da li je film snimljen posle zadate godine
  180.         {
  181.             niz[i]=tek->film;
  182.             i++;
  183.         }
  184.         tek=tek->sledeci;
  185.     }
  186.     max_ocena(izlaz,niz,i);
  187.  
  188. }
  189. 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
  190. {
  191.     int i;
  192.     FILM trenutni;
  193.     trenutni=niz[0];
  194.     for (i=0;i<=br_elem;i++)
  195.     {
  196.         if(trenutni.ocena<niz[i].ocena)
  197.         {
  198.             trenutni=niz[i];
  199.         }  
  200. }
  201.    
  202.     ispisi_strukturu(izlaz,trenutni);
  203. }
  204. void ispisi_strukturu(FILE *izlaz,FILM struktura)// funkcija koja ispisuje strukturu u fajl
  205. {
  206.    
  207.         fprintf(izlaz,"Naziv: %s\nZanr: %s\nGodina: %u\nOcena: %0.1f\n\n",struktura.naziv,struktura.zanr,struktura.godina,struktura.ocena);
  208.    
  209. }
  210.  
  211. int broj_elemenata(CVOR *glava)// brojimo koliko cvorova u listi ima
  212. {
  213.     int ukupno = 0;
  214.     while(glava)
  215.     {
  216.         ukupno++;
  217.         glava=glava->sledeci;
  218.     }
  219.    
  220.     return ukupno;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement