C programs

Thursday, January 12, 2006

 

Spregnute liste

  1.  
  2. /************************************************************************************
  3. *
  4. *  Napisati C program koji demonstrira realizaciju osnovnih operacija sa dinamickom strukturom podataka
  5. *  oblika jednostruko spregnute liste. Element liste se sastoji od dva polja: podatak koji predstavlja ceo broj
  6. *  i pokazivac na sledeci element liste.
  7. *  Operacije koje treba realizovati sa jednostruko spregnutom listom su:
  8. *  - unos novog broja, po izboru korisnika (na pocetak ili kraj liste) (NAPOMENA: Zadovoljiti uslov da se u listi
  9. *       ne moze nalaziti vise od 5 istih brojeva)
  10. *  - modifikacija (umesto jednog broja treba upisati drugi broj)
  11. *  - trazenje broja u listi
  12. *  - brisanje broja iz liste (ako ima vise istih, izbrisati ih sve)
  13. *  DODATNO: Napraviti tabelarni prikaz pojavljivanja brojeva u listi
  14. *
  15. *************************************************************************************/
  16. #include <stdio.h>
  17. #define MAX 5
  18.  
  19. /**************************************************
  20. *
  21. *  struktura podataka za listu
  22. *  broj sadrzi podatak
  23. *  sledeci je pokazivac na sledeci elenetan liste
  24. *
  25. **************************************************/
  26. typedef struct cvor {
  27.     int broj;
  28.     struct cvor *sledeci;
  29.     } Tcvor;
  30.  
  31. /*************************
  32. *
  33. *  Pokazivac na cvor
  34. *
  35. **************************/
  36. typedef Tcvor *Pcvor;
  37.  
  38. /**************************************************
  39. *
  40. *  Prototipovi funkcija (detalji su u samim funkcijama)
  41. *
  42. **************************************************/
  43. void ini (Pcvor *);
  44. void unosKr (Pcvor *);
  45. void unosPoc (Pcvor *);
  46. void unosPrvi (Pcvor *);
  47. void ispis (Pcvor);
  48. void mod (Pcvor);
  49. void trazi (Pcvor);
  50. void brisi (Pcvor *);
  51. void osobodiMem (Pcvor *);
  52. int opcije(void);
  53. int prebroj(Pcvor, int);
  54. void brPon(Pcvor);
  55. /*char getch();*/
  56.  
  57.  
  58. main () {
  59.     /********************************************************************************
  60.     *
  61.     *  Definicija promenljivih
  62.     *  glava je pokazivac na prvi element liste (kad je lista prazna glava pokazuje na NULL
  63.     *  izbor je promenljiva koja sluzi za biranje opcija iz menija
  64.     *
  65.     ********************************************************************************/
  66.     Pcvor glava;
  67.     int izbor;
  68.    
  69.     /**********************************************************
  70.     *
  71.     *  Uvodna konverzacija
  72.     *
  73.     **********************************************************/
  74.     printf("\nProgram za prezentaciju osnovnih operacija jednostruko spregnute liste!\n\n");
  75.  
  76.     /***************************************
  77.     *
  78.     *  Inicijalizacija liste
  79.     *
  80.     ***************************************/
  81.     ini (&glava);
  82.    
  83.     /*******************************************************************
  84.     *
  85.     *  Prikazivanje menija na ekranu i izvrsavanje operacija koje korisnik zahteva
  86.     *  sve dok korisnik ne izabere kraj
  87.     *
  88.     ********************************************************************/
  89.         do {
  90.             izbor = opcije();
  91.             switch (izbor) {
  92.                 case 1: unosPoc(&glava);
  93.                             break;
  94.                 case 2: unosKr(&glava);
  95.                             break;
  96.                 case 3: mod(glava);
  97.                             break;
  98.                 case 4: trazi(glava);
  99.                             break;
  100.                 case 5: brisi(&glava);
  101.                             break;
  102.                 case 6: ispis(glava);
  103.                             break;
  104.                 case 7: brPon(glava);
  105.                             break;
  106.                 case 8: ;
  107.            
  108.             }
  109.            
  110.         } while (izbor!=8);
  111.        
  112.         /***************************************
  113.         *
  114.         *  Oslobadjanje zauzete memorije
  115.         *
  116.         ****************************************/
  117.         osobodiMem(&glava);
  118.  
  119. /************************************
  120. *
  121. *  Kraj programa
  122. *
  123. ************************************/
  124. printf("\n\n***KRAJ PROGRAMA***\n\n\n");
  125. return 0;
  126.  
  127. }
  128.  
  129.  
  130.  
  131.  
  132.  
  133. /******************************************************************
  134. *
  135. *  Funkcija: ini
  136. *  Svrha: postavlja vodeci pokazivac (glava) na NULL, odnosno inicijalizuje listu
  137. *
  138. ******************************************************************/
  139. void ini (Pcvor *glava) {
  140.     *glava = NULL; /*postavljanje glave liste da pokazuje na NULL, odnosno na nista*/
  141. }
  142.  
  143.  
  144.  
  145.  
  146.  
  147. /******************************************************************
  148. *
  149. *  Funkcija: unosKr
  150. *  Svrha:  unos novog clana liste i smestanje na kraj
  151. *
  152. ******************************************************************/
  153. void unosKr (Pcvor *glava) {
  154.     /***************************************************************************
  155.     *
  156.     *  Definicija lokalnih promenljivih
  157.     *  tek je tekuci element liste, a pret je prethodni (prethodni uvek kasni za 1 u odnosu na tekuci)
  158.     *  novi je element koji je unosi
  159.     *  k je broj koji se unosi
  160.     *
  161.     ****************************************************************************/
  162.     int k;
  163.     Pcvor tek, pret, novi;
  164.        
  165.         printf("\nUnos elementa na kraj liste!\n");
  166.    
  167.         /*ako se utvrdi da je lista prazna poziva se funkcija za unos prvog clana*/
  168.         if (*glava==NULL) unosPrvi (glava)
  169.             /*a ako lista nije prazna clan se dodaje na kraj*/
  170.             else {
  171.                 /*prolazak kroz listu i dolazak do poslednjeg unesenog elementa*/
  172.                 tek = *glava;
  173.                 while (tek != NULL) {
  174.                     pret = tek;
  175.                     tek = tek->sledeci;
  176.                 }
  177.                
  178.                 /*********************************************************************
  179.                 *
  180.                 *  Zauzimanje dinamicke memorije za novi clan liste, ucitavanje
  181.                 *  broja sa tastature, postaljanje pokazivaca na sledeci element
  182.                 *  na NULL i pokazivaca prethodnog elementa na upravo uneseni element
  183.                 *
  184.                 ********************************************************************/
  185.                 printf("Unesite sledeci element (smesta se na kraj): ");
  186.                 scanf("%d", &k);
  187.                 if (prebroj(*glava, k)<MAX) {
  188.                         novi = (Tcvor *)malloc(sizeof(Tcvor));
  189.                         novi->broj = k;
  190.                         novi->sledeci = NULL;
  191.                         pret->sledeci = novi;      
  192.                 }
  193.                 else printf("\n\tBroj se pojavljivao maximalan broj puta! Nije dozvoljen unos ovog broja!");
  194.     }
  195. }
  196.  
  197.  
  198.  
  199.  
  200.  
  201. /******************************************************************
  202. *
  203. *  Funkcija: unosPoc
  204. *  Svrha:  unos novog clana liste i smestanje na pocetak
  205. *
  206. ******************************************************************/
  207. void unosPoc(Pcvor *glava) {
  208.     /**************************************************************
  209.     *
  210.     *  Definisanje lokalnih promenljivih
  211.     *  novi je element koji se dodaje u listu
  212.     *  k je novi broj koji se unosi
  213.     *
  214.     **************************************************************/
  215.     int k;
  216.     Pcvor novi;
  217.    
  218.     printf("\nUnos elementa na pocetak liste!\n");
  219.    
  220.     /*ako se utvrdi da je lista prazna poziva se funkcija za unos prvog clana*/
  221.     if (*glava==NULL) unosPrvi(glava)
  222.         /*a ako lista nije prazna, elemet se unosi na pocetak liste*/
  223.         else {
  224.         /********************************************************
  225.         *
  226.         *  Zauzimanje dinamicke memorije za novi element liste, ucitavanje novog
  227.         *  elementa sa tastature, postavljanje glave da pokazuje na taj novi element,
  228.         *  i postavljanje pokazivaca novog elementa da pokazuje da dosadasnji
  229.         *  prvi element, koji je sad drugi
  230.         *
  231.         ********************************************************/
  232.         printf("Unesite sledeci elementa liste (smesta se na pocetak): ");
  233.         scanf("%d", &k);
  234.         if (prebroj(*glava, k)<MAX) {
  235.                 novi = (Tcvor *)malloc(sizeof(Tcvor));
  236.                 novi->broj = k;
  237.                 novi->sledeci = *glava;
  238.                 *glava = novi;
  239.                 }
  240.                 else printf("\n\tBroj se pojavljivao maximalan broj puta! Nije dozvoljen unos ovog broja!");
  241.     }
  242.    
  243. }
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250. /********************************************************
  251. *
  252. *  Funkcija: unosPrvi
  253. *  Svrha:  Sluzi za unos elementa ukoliko je lista prazna
  254. *     nema je smisla pozivati bez prethode prove da li glava pokazuje
  255. *         na NULL
  256. *
  257. *********************************************************/
  258. void unosPrvi (Pcvor *glava) {
  259.         /**************************************************************
  260.         *
  261.         *  Definisanje lokalnih promenljivih
  262.         *  novi je element koji se dodaje u listu
  263.         *
  264.         **************************************************************/
  265.         Pcvor novi;
  266.        
  267.         /*************************************************************
  268.         *
  269.         *  Zauzimanje dinamicke memorije za prvi element u listi, unos sa tastature,
  270.         *  postavljanje njegovog pokazivaca na NULL i postavljanje glave da pokazuje
  271.         *  ne njega
  272.         *
  273.         *************************************************************/
  274.         novi = (Tcvor *)malloc(sizeof(Tcvor));
  275.         printf("Unesite prvi element liste: ");
  276.         scanf("%d", &novi->broj);
  277.         novi->sledeci = NULL;
  278.         *glava = novi;
  279.  
  280. }
  281.  
  282.  
  283.  
  284.  
  285.  
  286. /*********************************************************
  287. *
  288. *  Funckija: ispis
  289. *  Svrha:  ispisivanje na ekranu svih clanova liste
  290. *
  291. *********************************************************/
  292. void ispis (Pcvor glava) {
  293.     /***************************************************************************
  294.     *
  295.     *  Definicija lokalnih promenljivih
  296.     *  tek je tekuci element liste, a pret je prethodni (prethodni uvek kasni za 1 u odnosu na tekuci)
  297.     *
  298.     ****************************************************************************/
  299.     Pcvor tek, pret;
  300.    
  301.     /*lista je prazna ako glava pokazuje na NULL*/
  302.     if (glava==NULL) printf("\nLista je prazna\n");
  303.     /*a ako nije prazna ispisujemo listu*/
  304.     else {
  305.    
  306.         /*************************************************************
  307.         *
  308.         *  tek se krece kroz listu dok ne naidje na pokazivac sa vrednoscu NULL, a
  309.         *  pret ga prati i ispisuje se broj na koji pokazuje prethodni.
  310.         *  Ispis se zavrsava kad tek dodje do poslednjeg elementa. Tada pret pokazuje
  311.         *  na poslednji element, a tek ima vrednost pokazivaca poslednjeg elementa,
  312.         *  odnosno NULL.
  313.         *
  314.         *************************************************************/
  315.         printf("\nIspis liste:\n\n");
  316.         tek = glava;
  317.         while (tek !=NULL) {
  318.             pret  = tek;
  319.             printf("\t%d", pret->broj);
  320.             tek = tek->sledeci;
  321.             }
  322.     }
  323.     printf("\n");
  324. }
  325.  
  326.  
  327.  
  328.  
  329.  
  330. /******************************************************************
  331. *
  332. *  Funkcija: mod
  333. *  Svrha: menja zadati broj za drugim zadatim brojem na svakom mestu gde se pojavljuje
  334. *
  335. ******************************************************************/
  336. void mod (Pcvor glava) {
  337.     /*************************************************************
  338.     *
  339.     *  Definicjia lokalnih promenljivih
  340.     *  k je broj koji se modifikuje
  341.     *  n je broj koji zamenjuje k
  342.     *  tek je tekuci element liste, a pret je prethodni (prethodni uvek kasni za 1 u odnosu na tekuci)
  343.     *  br je broj modifikovanih elemenata
  344.     *
  345.     *************************************************************/
  346.     int k, n, br=0;
  347.     Pcvor tek, pret;
  348.    
  349.     printf("\nModifikacija broja iz liste!\n\n");
  350.    
  351.     /*ako glava pokazuje na NULL lista je prazna, pa nema sta da se modifikuje*/
  352.     if (glava==NULL) {
  353.         printf("\n\tLista je prazna. Nema elemenata za modifikovanje!\n");
  354.     }
  355.     /*a ako nije prazna, unosi se broj koji treba modifikovati, i broj u koji se modifikuje taj broj*/
  356.     else {
  357.             printf("\tUnesite broj koji hocete da promenite\n\t (promenice se na svim lokacijama gde se pojavljuje): ");
  358.             scanf("%d", &k);
  359.             printf("\tUnesite broj sa kojim hocete da zamenite broj %d : ", k);
  360.             scanf("%d", &n);
  361.            
  362.             if ((prebroj(glava, k) + prebroj(glava, n))<=MAX) {
  363.            
  364.                     /*************************************************************
  365.                     *
  366.                     *  tek prolazi kroz celu listu dok ne naidje na element sa pokazivacom NULL
  367.                     *  (poslednji element), a pret ga prati i proverava da li je element jednak
  368.                     *  broj koji treba modifikovati, i ako jeste menja mu vrednost.
  369.                     *  Petlja se prekida kad tek dobije vrednost NULL. Tada pret pokazuje na posednji
  370.                     *  element, a tek ima vrednost pokazivaca poslednjeg elementa, odnosno NULL.
  371.                     *
  372.                     *************************************************************/
  373.                     tek = glava;
  374.                     while (tek != NULL) {
  375.                             pret = tek;
  376.                             if (pret->broj==k) {
  377.                                 pret->broj = n;
  378.                                 br++;
  379.                                 }
  380.                             tek = tek->sledeci;
  381.                         }
  382.                    
  383.                     if (br==0) printf("\n\tNi jedan element nije modifikovan!\n");
  384.                         else printf("Broj elemenata koji su modifikovani je: %d!\n", br);
  385.             }
  386.             else printf("\n\n\tUkoliko se izvrsi modifikacija, broj %d ce se\n\tpojavljivati u listi vise puta nego sto je to dozvoljeno!\n", n);
  387.                
  388.         }
  389. }
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396. /*******************************************************
  397. *
  398. *  Funkcija: trazi
  399. *  Svrha: proverava da li se odredjeni broj nalazi u listi
  400. *
  401. *******************************************************/
  402. void trazi (Pcvor glava) {
  403.     /********************************************************************************
  404.     *
  405.     *  Definisanje lokalnih promenljivih i enumeracije
  406.     *  k je broj koji se trazi
  407.     *  n pamti da li je broj pronadjen broj u listi
  408.     *  tek je tekuci element liste, a pret je prethodni (prethodni uvek kasni za 1 u odnosu na tekuci)
  409.     *  br je broj pojavljivanja trazenog elementa u listi
  410.     *
  411.     ********************************************************************************/
  412.     int k, br=0;
  413.     Pcvor tek, pret;
  414.    
  415.    
  416.     printf("\nPretraga liste!\n\n");
  417.    
  418.     /*ako glava pokazuje na NULL lista je prazna i nema sta da se pretrazuje*/
  419.     if (glava==NULL) {
  420.         printf("\n\tLista je prazna. Nema elemenata za pretragu!\n");
  421.         }
  422.         /*a ako nije prazna unosi se broj koji se trazi*/
  423.         else {
  424.    
  425.                 printf("\tKoji broj zelite da nadjete u listi? ");
  426.                 scanf("%d", &k);
  427.                 tek = glava;
  428.                
  429.                 /**********************************************************
  430.                 *
  431.                 *  tek i pret prolaze kroz listu (pret kasni za tek) i proverava se za svaki
  432.                 *  element liste da li je jedank trazenom broju. Ako jeste brojac se uvecava
  433.                 *  za jedan.
  434.                 *
  435.                 **********************************************************/
  436.                 while (tek != NULL) {
  437.                     pret = tek;
  438.                     if (pret->broj==k) {
  439.                             br++;
  440.                         }
  441.                         tek = tek->sledeci;
  442.                 }
  443.                
  444.                 /***********************************************************
  445.                 *
  446.                 *  Ako je brojac jedank nuli, ne postoji u listi element koji se trazi, a ako nije
  447.                 *  ispisuje se koliko puta se taj element pojavljuje
  448.                 *
  449.                 ***********************************************************/
  450.                 if (br==0) printf("\n\tTrazeni broj ne postoji u listi!\n");
  451.                     else printf("\n\tBroj puta koliko se broj %d pojavljuje u listi je: %d!\n", k, br);
  452.  
  453.                    
  454.     }
  455. }
  456.  
  457.  
  458.  
  459.  
  460.  
  461. /**********************************************************
  462. *
  463. *  Funkcija: brisi
  464. *  Svrha: brise broj koji je korisnik zadao iz liste gde god se pojavi
  465. *
  466. **********************************************************/
  467. void brisi (Pcvor *glava) {
  468.     /*****************************************************************
  469.     *
  470.     *  Definisanje lokalnih promenljivih
  471.     *  enumeracija sluzi za lakse pamcenje da li jos ima elementa u listi koje treba brisati
  472.     *  k je broj koji treba obrisati
  473.     *  n pamti da li ima jos elemenata koje treba brisati
  474.     *  br je broj obrisanih
  475.     *  tek i pret su pokazivaci na cvorove koji prolaze kroz listu
  476.     *
  477.     ******************************************************************/
  478.     enum {NEMA, IMA};
  479.     int k, n=IMA, br=0;
  480.     Pcvor tek, pret;
  481.    
  482.     printf("\nBrisanje elementa iz liste!\n\n");
  483.    
  484.     /*ako je lista prazna, nema sta da se brise*/
  485.     if (*glava==NULL) {
  486.         printf("\n\tLista je prazna. Nema elemenata za brisanje!\n");
  487.         }
  488.        
  489.         /*a ako nije, unosi se broj koji treba obrisati*/
  490.         else {
  491.    
  492.             printf("\n\tKoji broj zelite da obrisete (bice obrisan sa svih lokacija)? ");
  493.             scanf("%d", &k);
  494.            
  495.             /*ova petlja se ponavlja dok ima elemenata za brisanje*/
  496.             while (n==IMA) {
  497.                     /*trazi element koji odgovara uslovima za brisanje*/
  498.                     tek = *glava;
  499.                     pret = *glava;
  500.                     while ((tek!=NULL) && (tek->broj !=k)) {
  501.                         pret = tek;
  502.                         tek = tek->sledeci; 
  503.                     }
  504.                    
  505.                     /*ako tek pokazuje na NULL znaci da je pretraga dosla do kraja i da nije
  506.                     pronadjen ni jedan element za brisanje, pa se n postavlja na vresnost nema*/
  507.                     if (tek==NULL) {
  508.                         n = NEMA;
  509.                         }
  510.                         /*u suprotnom ako je element za brisanje prvi element liste, glava se postavlja da pokazuje na drugi
  511.                         element, a pokazivacu prvog se dodeljuje vrenost NULL*/
  512.                         else {
  513.                             if (tek==*glava) {
  514.                                 *glava = tek->sledeci;
  515.                                 tek->sledeci = NULL;
  516.                            
  517.                             }
  518.                             /*ako nije brvi element u pitanju, pokazivacu njegovog prethodnika se daje vrednost njegovog pokazivaca
  519.                             (njegov sledbenik), a njegov pokazivac se postavlja na NULL*/
  520.                             else  {
  521.                                 pret->sledeci = tek->sledeci;
  522.                                 tek->sledeci = NULL;
  523.                             }
  524.                             /*i na kraju i fizicki oslobadjamo memoriju koju je zauzimao taj element*/
  525.                             free(tek);
  526.                             /*povecavamo broj obrisanih za jedan*/
  527.                             br++;
  528.                         }
  529.                        
  530.             }
  531.         if (br==0) printf("\n\tNi jedan element nije obrisan\n");
  532.             else printf("\n\tBroj lokacija sa kojih je broj %d izbrisan je: %d!\n", k, br);
  533.         }
  534. }
  535.  
  536.  
  537.  
  538.  
  539.  
  540. /*********************************************************
  541. *
  542. *  Funkcija osobodiMem
  543. *  Svrha: brise celu listu iz dinamicke memorije
  544. *
  545. *********************************************************/
  546. void osobodiMem (Pcvor *glava) {
  547.     /**************************************************
  548.     *
  549.     *  Definisanje lokalnih promenljivih
  550.     *  tek je cvor koji se trenutno brise (prvi clan liste)
  551.     *
  552.     ***************************************************/
  553.     Pcvor tek;
  554.    
  555.         /****************************************************************
  556.         *
  557.         *  Oslobadjanje memorije se vrsi tako sto se brise prvi element iz liste, drugi se
  558.         *  postavlja da bude prvi i to se ponavlja dok svi elementi ne budu izbrisani.
  559.         *  Posto glava uzima vrednost pokazivaca prvog elementa, imace vrednost NULL kada
  560.         *  se poslednji element obrise. Samim tim i znamo da je lista prazna, jer glava ima
  561.         *  vrednost NULL.
  562.         *
  563.         *****************************************************************/
  564.         while (*glava!=NULL) {
  565.             tek = *glava;
  566.             *glava = tek->sledeci;
  567.             free(*glava);   
  568.         }
  569.    
  570. }
  571.  
  572.  
  573.  
  574.  
  575.  
  576. /**********************************************************
  577. *
  578. *  Funkcija: opcije
  579. *  Svrha:  prikazijavnje osnovnog menije za izbor
  580. *
  581. **********************************************************/
  582. int opcije () {
  583.     /***********************************************************************************
  584.     *
  585.     *  Definicija lokalnih promenljivih
  586.     *  izbor je promenljiva koji pamti sta je izabrano iz menija i to je vrednost koju f-ja vraca
  587.     *
  588.     ************************************************************************************/
  589.     int izbor=0;
  590.  
  591.     /*ispisivanje menija i ucitavanje vredosti koju je korisnik uneo sa tastature*/
  592.     printf("\n\t1) Dodaj na pocetak\n\t2) Dodaj na kraj\n\t3) Modifikuj\n\t4) Pretrazi\n\t5) Obrisi\n\t6) Ispisi\n\t7) Tabelarni prikaz\n\t8) Kraj\n");
  593.     printf("\n\tIzaberite opciju: ");
  594.     scanf("%d", &izbor);
  595.  
  596.     while ((izbor>8) || (izbor<1)) {
  597.         printf("\t\tNe postoji ta opcija!");
  598.         printf("\n\t1) Dodaj na pocetak\n\t;2) Dodaj na kraj\n\t3) Modifikuj\n\t4) Pretrazi\n\t5) Obrisi\n\t6) Ispisi\n\t7) Tabelarni prikaz\n\t8) Kraj\n");
  599.         printf("\n\tIzaberite opciju: ");
  600.         scanf("%d", &izbor);
  601.  
  602.     }
  603.    
  604.     /*vracanje ucitane vrednosti*/
  605.     return izbor;
  606.    
  607. }
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614. /*********************************************************************
  615. *
  616. *  Funkcija: prebroj
  617. *  Svrha: broji koliko puta se u listi pojavljuje neki clan
  618. *
  619. *********************************************************************/
  620. int prebroj (Pcvor glava, int broj) {
  621.     /*******************************************************
  622.     *
  623.     *  Definisanje lokalnih promenljivih
  624.     *  br pamti broj ponavljanja nekog broja u listi
  625.     *  tek i pret sluze za prolazak kroz listu
  626.     *
  627.     *******************************************************/
  628.     int br=0;
  629.     Pcvor tek, pret;
  630.    
  631.     tek = glava;
  632.     while (tek!=NULL) {
  633.         pret = tek;
  634.         if (pret->broj==broj) br++;
  635.         tek = tek->sledeci;
  636.    
  637.     }
  638.  
  639.     return br;
  640.    
  641. }
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648. /********************************************************************
  649. *
  650. *  Funkcija: brPov
  651. *  Svrha: prikazuje tabelarni prikaz koliko se puta koji broj pojavljivao u listi
  652. *
  653. ********************************************************************/
  654. void brPon(Pcvor glava) {
  655.    
  656.     /*int k;
  657.     Pcvor tek, pret;
  658.    
  659.     printf("\n\tTablearni prikaz broja pojavljivanja elemenata u listi!\n");
  660.    
  661.     tek = glava;
  662.     while (tek!=NULL) {
  663.         pret = tek;
  664.         k = prebroj(glava, pret->broj);
  665.         printf("%d se pojavljivao %d", pret->broj, k);
  666.         if (k==1) printf(" put!\n\n");
  667.             else printf(" puta!\n\n");
  668.         tek = tek->sledeci;
  669.    
  670.     }
  671.     */
  672.    
  673.     /*****************************************************************
  674.     *
  675.     *  Alternativna f-ja koja bi trebalo da bude bolja, ali ima neke bugove i ne radi kako treba
  676.     *
  677.     *****************************************************************/
  678.    
  679.    
  680.     enum {NEMA, IMA};
  681.     Pcvor tek, pret;
  682.     Pcvor novaG, noviTek, noviPret, novi;
  683.     short k;
  684.    
  685.     printf("\n\tTablearni prikaz broja pojavljivanja elemenata u listi!\n\n");
  686.    
  687.     if (glava==NULL) {
  688.         printf("\n\n\tLista je prazna. Ne postoji statistika koju treba ispisati!\n\n");
  689.     }
  690.     else {
  691.    
  692.             ini (&novaG);
  693.             tek = glava;
  694.             while (tek!=NULL) {
  695.                 pret = tek;
  696.                
  697.                
  698.                 k = NEMA;
  699.                 noviTek = novaG;
  700.                 while (noviTek!=NULL) {
  701.                     noviPret = noviTek;
  702.                     if (noviPret->broj == pret->broj) k = IMA;
  703.                     noviTek = noviTek->sledeci;
  704.                 }
  705.                
  706.                 if (k==NEMA) {
  707.                     printf("\n\tBroj pojavljivanja broja %d u listi je %d!\n\n", pret->broj, prebroj(glava, pret->broj));
  708.                    
  709.                     if (novaG==NULL) {
  710.                         novaG = (Tcvor *)malloc(sizeof(Tcvor));
  711.                         novaG->broj = pret->broj;
  712.                         novaG->sledeci = NULL;
  713.                     }
  714.                     else {
  715.                         novi = (Tcvor *)malloc(sizeof(Tcvor));
  716.                         novi->broj = pret->broj;
  717.                         novi->sledeci = novaG;
  718.                         novaG = novi;
  719.                     }
  720.                
  721.                
  722.                 }
  723.            
  724.             tek = tek->sledeci;
  725.            
  726.             }
  727.            
  728.            
  729.             osobodiMem(&novaG);
  730.            
  731.         }
  732.        
  733.  
  734.    
  735.    
  736.  
  737. }
  738.  
  739.  
  740. /*char getch() {
  741.     char c,e;
  742.     c = getchar();
  743.     e = getchar();
  744.     return c;
  745. }*/
  746.  
  747.  

Wednesday, December 21, 2005

 

Ocena studenta na osnovu tri kolokvijuma

  1. /**********************************************************************
  2. *  Napisati C program koji za svakog studenta ucitava broj indexa i osvojene bodove za
  3. *  tri zadatka A B i C, a zatim izracunava ukupan broj osvojenih bodova i na osnovu tog
  4. *  pozivom funkcije odredjuje zakljcnu ocenu.
  5. *
  6. *  Obezbediti da se rezultati stampaju u po opadajucoj vrednosti broja bodova u obliku:
  7. *
  8. *  1.  11541  21  54  32  8
  9. *  2.  11335  62  32  48  10
  10. *
  11. *  maximalan broj bodova po zadacima je 30, 30 i 40. Ocena se formiara po pravilu:
  12. *  0-54 - 5
  13. *  55-64 - 6
  14. *  65-74 - 7
  15. *  75-84 - 8
  16. *  85-94 - 9
  17. *  95-100 - 10
  18. **********************************************************************/
  19.  
  20. #include <stdio.h>
  21. #define MAX_NIZ 1000
  22.  
  23. /******************************************
  24. *
  25. *  Prototip funkcije
  26. *
  27. ******************************************/
  28. int ocena (int);
  29.  
  30.  
  31. main () {
  32.  
  33.     /*******************************************************************
  34.     *
  35.     *      Inicijalizacija promenljivih
  36.     *  stud je matrica u kojo se cuvaju brojevi indexa i bodovi svakog studenta
  37.     *  i, j, k su brojaci za petlje
  38.     *  n je broj studenata
  39.     *  pom sluzi za menjanje vrednosti prilikom sortiranja
  40.     *  again je promenljiva za ponavaljanje programa ako korisnik to zeli
  41.     *
  42.     *******************************************************************/
  43.     int stud[MAX_NIZ][6], i, j, n, pom, k;
  44.     char again='y';
  45.    
  46.  
  47.     while (again=='y') {
  48.             /******************************
  49.             *
  50.             *  Inicijalizacija matrice
  51.             *
  52.             *****************************/
  53.             for (i=0; i<MAX_NIZ; i++) for (j=0; j<4; stud[i][j++] = 0) ;
  54.            
  55.             /*****************************
  56.             *
  57.             *  Uvodna konverzavija
  58.             *
  59.             ******************************/
  60.             printf("Program za racunanje ocene studenata na osnovu bodova iz 3 testa\n");
  61.            
  62.             /****************************
  63.             *
  64.             *  Unos broja studenata
  65.             *
  66.             ****************************/
  67.             printf("\n\tZa koliko studenta zelite da racunate ocenu? ");
  68.             scanf("%d", &n);
  69.             while (n<=0 || n>MAX_NIZ) {
  70.                 printf("Broj je van opsega! Za koliko studenata zelite da racunate ocenu? ");
  71.                 scanf("%d", &n);
  72.                 }
  73.                
  74.                
  75.             /***************************
  76.             *
  77.             *  Unos matrice sa podacima
  78.             *
  79.             ***************************/
  80.             /***************************
  81.             *
  82.             *  0 - broj indexa
  83.             *  1 - broj bodova iz testa A
  84.             *  2 - broj bodova iz testa B
  85.             *  3 - broj bodova iz testa C
  86.             *  4 - ukupan broj bodova
  87.             *  5 - ocena
  88.             *
  89.             ***************************/
  90.             for (i=0; i<n; i++) {
  91.            
  92.                 /**********************************************
  93.                 *
  94.                 *  Unsos brojeva indexa
  95.                 *
  96.                 **********************************************/
  97.                 printf("\tUnesite broj indexa studenta za %d. studenta : ", i+1);
  98.                 scanf("%d", &stud[i][0]);
  99.                
  100.                 /*********************************************
  101.                 *
  102.                 *  Unos bodova iz prvog testa
  103.                 *
  104.                 **********************************************/
  105.                 printf("\tUnesite broj bodova iz testa A za %d. studenta : ", i+1);
  106.                 scanf("%d", &stud[i][1]);
  107.                 while (stud[i][1]<0 || stud[i][1]>30) {
  108.                     printf("\t\tBroj bodova je izvan osega\n\tUnesite broj bodova iz testa A za %d. studenta : ", i+1);
  109.                     scanf("%d", &stud[i][1]);
  110.                     }
  111.                    
  112.                 /**********************************************
  113.                 *
  114.                 *  Unos bodova iz drugog testa
  115.                 *
  116.                 **********************************************/
  117.                 printf("\tUnesite broj bodova iz testa B za %d. studenta : ", i+1);
  118.                 scanf("%d", &stud[i][2]);
  119.                 while (stud[i][2]<0 || stud[i][2]>30) {
  120.                     printf("\t\tBroj bodova je izvan osega\n\tUnesite broj bodova iz testa B za %d. studenta : ", i+1);
  121.                     scanf("%d", &stud[i][2]);
  122.                     }
  123.                    
  124.                 /**********************************************
  125.                 *
  126.                 *  Unos bodova iz treceg testa
  127.                 *
  128.                 **********************************************/
  129.                 printf("\tUnesite broj bodova iz testa C za %d. studenta : ", i+1);
  130.                 scanf("%d", &stud[i][3]);
  131.                 while (stud[i][3]<0 || stud[i][3]>40) {
  132.                     printf("\t\tBroj bodova je izvan osega\n\tUnesite broj bodova iz testa C za %d. studenta : ", i+1);
  133.                     scanf("%d", &stud[i][3]);
  134.                     }
  135.                
  136.                 printf("\n\n");
  137.                
  138.                 /***************************************
  139.                 *
  140.                 *  Racunanje ukupnog broja bodova
  141.                 *
  142.                 ***************************************/
  143.                 stud[i][4] = stud[i][1] + stud[i][2] + stud[i][3];
  144.                
  145.                 /**************************************
  146.                 *
  147.                 *  Racunanje ocene pomocu funkcije ocena
  148.                 *
  149.                 ***************************************/
  150.                 stud[i][5] = ocena(stud[i][4]);
  151.                
  152.             }
  153.  
  154.            
  155.             /**************************************
  156.             *
  157.             *  Sortiranje matrice na osnovu broja bodova
  158.             *
  159.             **************************************/
  160.             for (i=0; i<n-1; i++) {
  161.                 for (j=i; j<n; j++) {
  162.                     if (stud[j][4]>stud[i][4]) {
  163.                         for (k=0; k<6; k++) {
  164.  
  165.                             pom = stud[i][k];
  166.                             stud[i][k] = stud[j][k];
  167.                             stud[j][k] = pom;
  168.                            
  169.                         }         
  170.                     }      
  171.                 }   
  172.             }
  173.            
  174.             /************************************
  175.             *
  176.             *  Ispis rezultata
  177.             *
  178.             ************************************/
  179.             printf("\n\tBodovna lista: \n");
  180.             printf("    Red.br     Br. indexa   Test A   Test B   Test C   Ukupno   Ocena\n");
  181.             for (i=0; i<n; i++) {
  182.                 printf("%8d.%14d%9d%9d%9d%9d%8d\n", i+1, stud[i][0], stud[i][1], stud[i][2], stud[i][3], stud[i][4], stud[i][5])
  183.            
  184.            
  185.             }
  186.             /************************************************
  187.             *
  188.             *  Provera da li korinik zeli da ponovi program
  189.             *
  190.             ************************************************/
  191.             printf("\nDa li zelite da ponovite program? (y/n) ");
  192.             scanf("%c", &again);
  193.             scanf("%c", &again);
  194.             while (again!='y' && again !='n') {
  195.                 printf("Pogresan unos! Da li zelite da ponovite program? (y/n) ");
  196.                 scanf("%c", &again);
  197.                 scanf("%c", &again);
  198.                 }
  199.            
  200.     }
  201.     /*************************************
  202.     *
  203.     *  Kraj programa
  204.     *
  205.     *************************************/
  206.     printf("\n\n***KRAJ PROGRAMA***\n\n\n");
  207.    
  208. }
  209.  
  210. /************************************************
  211. *
  212. *  funkcija za racunanje ocene
  213. *
  214. ************************************************/
  215. int ocena (int bodovi) {
  216.     /**************************************************************
  217.     *
  218.     *      Definisanje lokalnih promenljivih
  219.     *  o je ocena na onovu broja bodova (to je vrednost koju funkcija vraca)
  220.     *
  221.     **************************************************************/
  222.     int o=0;
  223.     switch (bodovi) {
  224.         case 55: case 56: case 57: case 58: case 59: case 60: case 61: case 62:
  225.         case 63: case 64: o = 6; break;
  226.         case 65: case 66: case 67: case 68: case 69: case 70: case 71: case 72:
  227.         case 73: case 74: o = 7; break;
  228.         case 75: case 76: case 77: case 78: case 79: case 80: case 81: case 82:
  229.         case 83: case 84: o = 8; break;
  230.         case 85: case 86: case 87: case 88: case 89: case 90: case 91: case 92:
  231.         case 93: case 94: o = 9; break;
  232.         case 95: case 96: case 97: case 98: case 99: case 100: o = 10; break;
  233.         default : o = 5; break;
  234.            
  235.         }
  236.        
  237.    
  238.     return o;
  239.    
  240.     }
  241.  

Wednesday, December 14, 2005

 

Najekonomicnija kupovina frizidera

Ova verzija ispisuje najekonomicniji grad za kupovinu frizidera u svakom gradu, medjutim postoji i kod (koji je iskomentarisan) za razultat sam u odredjenom gradu. Ako Vam to treba, odkomentarisite taj kod i sklonite pelju koja vrti promenljivu grad kroz sve vrednosti od 0 do n-1! Detaljan text zadatka je u samom kodu u vidu komentara!
  1. /***********************************************************
  2. *
  3. *  Duz kruznog puta nalazi se N gradova. U svakom od njih postoji
  4. *  prodavnica bele tehnike. Poznata je cena zamrzivaca u svakom
  5. *  gradu i cena voznje do svakog grada sa povratkom. Za mestane
  6. *  svakog grada odrediti grad u kome ce najekonomicnije proci
  7. *  prilikom kupovine zamrzivaca i u kom smeru da putuju.
  8. *
  9. ************************************************************/
  10.  
  11.  
  12. #include <stdio.h>
  13. #define MAX_NIZ 50
  14.  
  15. main () {
  16.  
  17.     /******************************************
  18.     *
  19.     *  Definisanje enumeracije
  20.     *
  21.     ******************************************/
  22.     enum pozneg {NEG, POZ};
  23.  
  24.     /***********************************************************************
  25.     *
  26.     *      Deklaracija promenljivih
  27.     *  n je broj gradova
  28.     *  fridz je niz sa cenama frizidera u svakom gradu
  29.     *  put je niz sa cenom puta do svakog grada
  30.     *  i, j je brojac za petlju
  31.     *  grad je broj grada gde se kupac nalazi
  32.     *  eko1 i eko2 su nizovi sa ukupnim cenama frizidera sa putovanjem
  33.     *               u oba smera (eko1 je pozitivan smer, a eko2 negativan)
  34.     *  sumput je ukupna cena svih putovanja (putovanje u krug)
  35.     *  min1 i min2 su najmanji clanovi nizova eko1 i eko2
  36.     *  min je najmanja cena iz oba pravca
  37.     *  pozneg pamti najekonomicniji smer kretanja kupca
  38.     *  eko1grad i eko2grad pamte broj najekonomicnijeg grada
  39.     *  ekograd je broj najekonomicnijeg grada uopste
  40.     *  again je pomocna promenljiva za ponavljanje programa ako to korinsik zeli
  41.     *
  42.     **********************************************************************/
  43.     float fridz[MAX_NIZ], put[MAX_NIZ], eko1[MAX_NIZ], eko2[MAX_NIZ], sumput, min1, min2, min;
  44.     int n, i, j, grad, pozneg, eko1grad, eko2grad, ekograd;
  45.     char again = 'y';
  46.  
  47.     /*****************************************
  48.     *
  49.     *  Uvodna konverzacija
  50.     *
  51.     *****************************************/
  52.     printf("Program za odredjivanje najekonomicnije kupovine frizidera!");
  53.  
  54.     while (again=='y')
  55.     {
  56.             /*****************************************
  57.             *
  58.             *  Inicijalizacija niza
  59.             *
  60.             ******************************************/
  61.             for (i=0; i<MAX_NIZ; i++) fridz[i] = put[i] = eko1[i] = eko2[i] = 0;
  62.  
  63.             /****************************************
  64.             *
  65.             *  Unos broja gradova
  66.             *
  67.             ****************************************/
  68.             printf("\nUnesite broj gradova: ");
  69.             scanf("%d", &n);
  70.             while (n<=0 || n>MAX_NIZ) {
  71.                 printf("Unos je van opsega! Unesite ponovo broj gradova: ");
  72.                 scanf("%d", &n);
  73.             }
  74.  
  75.             /**************************************
  76.             *
  77.             *  Unos cena frizidera u svakom gradu
  78.             *
  79.             **************************************/
  80.             printf("\n\tUnos cena frizidera u svakom gradu\n");
  81.             for (i=0; i<n; i++) {
  82.                 printf("Unesite cenu frizidera u gradu %d: ", i+1);
  83.                 scanf("%f", &fridz[i]);
  84.                 while (fridz[i]<0) {
  85.                     printf("\n\tCena ne moze biti negativna! Unesite cenu frizidera u gradu %d: ", i+1);
  86.                     scanf("%f", &fridz[i]);
  87.                     }
  88.                 }
  89.  
  90.             /***************************************
  91.             *
  92.             *  Unos cena puta izmedju svakog grada i racunanje
  93.             *  ukupne cene ako bi se obisao krug kroz sve gradove
  94.             *
  95.             ***************************************/
  96.             sumput = 0;   /*postavljanje sume cena svih puteva na nulu*/
  97.             printf("\n\tUnos cena puta izmedju svaka dva grada!\n");
  98.             for (i=0; i<n; i++) {
  99.                 if (i==(n-1)) {
  100.                     printf("Unesite cenu puta izmedju gradova %d i 1 : ", i+1);
  101.                     scanf("%f", &put[i]);
  102.                     while (put[i]<0) {
  103.                         printf("\n\tCena ne moze biti negativna. Unesite cenu puta izmedju gradova %d i 1 : ", i+1);
  104.                         scanf("%f", &put[i]);
  105.                     }
  106.  
  107.                 }
  108.                 else {
  109.                     printf("Unesite cenu puta izmedju gradova %d i %d : ", i+1, i+2);
  110.                     scanf("%f", &put[i]);
  111.                     while (put[i]<0) {
  112.                         printf("\n\tCena ne moze biti negativna. Unesite cenu puta izmedju gradova %d i %d : ", i+1, i+2);
  113.                         scanf("%f", &put[i]);
  114.                     }
  115.                 }
  116.                 sumput += put[i];
  117.             }
  118.  
  119.             /*****************************************
  120.             *
  121.             *  Unos grada gde se kupac nalazi
  122.             *
  123.             *****************************************/
  124.             /*printf("\n\tU kom gradu se kupac nalazi? ");
  125.             scanf("%d", &grad);
  126.             while (grad<=0 || grad>n) {
  127.                 printf("Unesti grad je izvan opsega! U kom gradu se kupac nalazi? ");
  128.                 scanf("%d", &grad);
  129.                 }
  130.                 grad--;
  131.             */
  132.            
  133.            
  134.             /**********************************************************************
  135.             *
  136.             *  Petlja koja prolazi kroz sve gradove i ispisuje rezultate za njih
  137.             *
  138.             **********************************************************************/
  139.             for (grad=0; grad<n; grad ++) {
  140.                
  141.                 /*****************************************
  142.                 *
  143.                 *  Inicijalizacija nizova i promenljivih
  144.                 *
  145.                 ******************************************/
  146.                 for (i=0; i<n; i++) eko1[i] = eko2[i] = 0;
  147.                
  148.                
  149.                 /*****************************************
  150.                 *
  151.                 *  Kreiranje niza cena u svim gradovima zajedno sa
  152.                 *  putovanjem do tih gradova u pozitivnom smeru
  153.                 *  (suprotan kretanju kazaljke na satu)
  154.                 *
  155.                 *****************************************/
  156.                 for (i=0; i<n; i++) {
  157.                     /*************************************
  158.                     *
  159.                     *  U gradu gde se kupac nalazi troskovi su jednaki
  160.                     *  ceni frizidera u tom gradu
  161.                     *
  162.                     **************************************/
  163.                     if (i==grad) {
  164.                         eko1[i] = fridz[i];
  165.                     }
  166.                     else {
  167.                    
  168.                         /**********************************************************************
  169.                         *
  170.                         *  Ako do nekog grada moramo stici prolazeci kroz kraj kruga (put od poslednjeg do
  171.                         *  prvog grada) onda od ukupne cene putovanja kroz ceo krug oduzimamo cenu puta
  172.                         *  koji kupac ne mora da predje da bi stigao do odredjenog grada i dodajemo cenu
  173.                         *  frizidera u tom gradu
  174.                         *
  175.                         ***********************************************************************/
  176.                         if (i<grad) {
  177.                                 eko1[i] = sumput;
  178.                                 for (j=i; j<grad; j++) eko1[i] -= put[j];
  179.                                 eko1[i] += fridz[i];
  180.                                 }
  181.                         /***********************************************************************
  182.                         *
  183.                         *  Ako se do grada moze stici u pozitivnom smeru bez prolaska kroz kraj kruga (put
  184.                         *  od poslednjeg do prvog grada) onda saberemo cenu svakog puta koji kupac treba
  185.                         *  da prodje da bi stigao do odredjenog grada i dodamo cenu frizidera u tom gradu
  186.                         *
  187.                         ************************************************************************/
  188.                         if (i>grad) {
  189.                             for (j=grad; j<i; j++) eko1[i] += put[j];  ;
  190.                             eko1[i] += fridz[i];
  191.                        
  192.                             }
  193.                         }
  194.                 }
  195.                
  196.                 /*****************************************
  197.                 *
  198.                 *  Kreiranje niza cena u svim gradovima zajedno sa
  199.                 *  putovanjem do tih gradova u negativnom smeru
  200.                 *  (smer kretanja kazaljke na satu)
  201.                 *
  202.                 *****************************************/
  203.                 for (i=0; i<n; i++) {
  204.                     /*************************************
  205.                     *
  206.                     *  U gradu gde se kupac nalazi troskovi su jednaki
  207.                     *  ceni frizidera u tom gradu
  208.                     *
  209.                     **************************************/
  210.                     if (i==grad) {
  211.                         eko2[i] = fridz[i];   
  212.                         }
  213.                         else {
  214.                             /**********************************************************************
  215.                             *
  216.                             *  Ako do nekog grada moramo stici prolazeci kroz kraj kruga (put od poslednjeg do
  217.                             *  prvog grada) onda od ukupne cene putovanja kroz ceo krug oduzimamo cenu puta
  218.                             *  koji kupac ne mora da predje da bi stigao do odredjenog grada i dodajemo cenu
  219.                             *  frizidera u tom gradu
  220.                             *
  221.                             ***********************************************************************/
  222.                             if (i>grad) {
  223.                                 eko2[i] = sumput;
  224.                                 for (j=grad; j<i; j++) eko2[i] -= put[j];
  225.                                 eko2[i] += fridz[i];           
  226.                         }
  227.                         else
  228.                             /***********************************************************************
  229.                             *
  230.                             *  Ako se do grada moze stici u pozitivnom smeru bez prolaska kroz kraj kruga (put
  231.                             *  od poslednjeg do prvog grada) onda saberemo cenu svakog puta koji kupac treba
  232.                             *  da prodje da bi stigao do odredjenog grada i dodamo cenu frizidera u tom gradu
  233.                             *
  234.                             ************************************************************************/
  235.                             if (i<grad) {
  236.                                 for (j=i; j<grad; j++) eko2[i] += put[j];
  237.                                 eko2[i] += fridz[i];               
  238.                             }
  239.                     }
  240.                 }      
  241.                
  242.                
  243.                 /*******************************************
  244.                 *
  245.                 *  Trazenje najmanjeg clana nizova eko1 i eko2
  246.                 *  i broja najekonomicnijeg grada
  247.                 *
  248.                 ******************************************/
  249.                 for (eko1grad = 0, eko2grad = 0, min1 = eko1[0], min2 = eko2[0], i=1; i<n; i++) {
  250.                     if (eko1[i]<min1) {
  251.                         min1 = eko1[i];
  252.                         eko1grad = i;
  253.                         }
  254.                     if (eko2[i]<min2) {
  255.                         min2 = eko2[i];
  256.                         eko2grad = i;
  257.                         }
  258.                 }   
  259.                
  260.                 /*******************************************
  261.                 *
  262.                 *  Odredjivanje najmanje cene kod oba smera i broja
  263.                 *  grada koji je najekonomicniji i odredjivanje pravca
  264.                 *  u kom kupac treba da se krece
  265.                 *
  266.                 *******************************************/
  267.                 if (min1<min2) {
  268.                     min = min1;
  269.                     ekograd = eko1grad;
  270.                     pozneg = POZ;      
  271.                     }
  272.                     else {
  273.                         min = min2;
  274.                         ekograd = eko2grad;
  275.                         pozneg = NEG;      
  276.                     }
  277.    
  278.                
  279.                 /*****************************************
  280.                 *
  281.                 *  Ispis rezultata na ekranu
  282.                 *
  283.                 *****************************************/
  284.                 printf("\n\nIspis za grad %d!\n", grad+1);
  285.                 if (grad==ekograd) printf("\n\n\tNajekonomicnije je da kupac kupi frizider u svom gradu!\n");
  286.                 else {
  287.                     printf("\n\tNajekonomicnije grad za kupovinu frizidera je %d, i treba da idete u smeru ", ekograd+1);
  288.                     if (pozneg==NEG) printf("suprotnom od ");   
  289.                     printf("kretanja kazaljke na satu! Cena je %.2f", min);
  290.                 }
  291.            
  292.                
  293.             }
  294.             /************************************************
  295.             *
  296.             *  Provera da li korinik zeli da ponovi program
  297.             *
  298.             ************************************************/
  299.             printf("\nDa li zelite da ponovite program? (y/n) ");
  300.             scanf("%c", &again);
  301.             scanf("%c", &again);
  302.             while (again!='y' && again !='n') {
  303.                 printf("Pogresan unos! Da li zelite da ponovite program? (y/n) ");
  304.                 scanf("%c", &again);
  305.                 scanf("%c", &again);
  306.                 }
  307.                
  308.     }
  309.        
  310.    
  311.     /********************************
  312.     *
  313.     *  KRAJ PROGRAMA
  314.     *
  315.     ********************************/
  316.     printf("\n\n\t***KRAJ PROGRAMA***\n\n");
  317.     return 0;
  318.  
  319. }
  320.  

Wednesday, December 07, 2005

 

Program za sortiranje niza!

Ovo je moj prvi program za sortiranje niza, pa verovatno nije najoptimizovaniji! Mada sam ga sam pisao (bez upotrebe poznatih algoritama za sortiranje, bar ih nisam tražio, ako sam slučajno potrefio neki dobro je). U stvari ovo je bio domaći, pa samo treba da radi! Videćemo šta ocena kaže! Evo programa!
  1. /*******************************************
  2. *
  3. *  Napisati C program za sortiranje niza
  4. *
  5. ********************************************/
  6.  
  7. #include <stdio.h>
  8. #define MAX_NIZ 50
  9.  
  10. int main()
  11. {
  12.     /*****************************
  13.     *
  14.     *  definisanje enumeracije
  15.     *
  16.     ******************************/
  17.     enum bool {FALSE, TRUE};
  18.  
  19.     /*****************************
  20.     *
  21.     *         Inicijalizacija promenljivih
  22.     *  i, k, j, f su brojaci za petlje
  23.     *  n je broj elemenata niza
  24.     *  a je niz koji se unosi
  25.     *  pom se koristi za zamenu vrednosti
  26.     *  again sluzi za ponavljanje programa
  27.     *  za z postoji detaljno objasnjenje u programu
  28.     *  stop sluzi da zaustavi sortiranje ako je niz sortiran
  29.     *
  30.     ******************************/
  31.     int i, k, f, j, n, z, stop;
  32.     double a[MAX_NIZ], pom;
  33.     char again='y';
  34.  
  35.     /*****************************
  36.     *
  37.     *  Uvodna konverzacija
  38.     *
  39.     *****************************/
  40.     printf("\nProgram za sortiranje niza!\n");
  41.  
  42.     while (again=='y')
  43.     {
  44.            
  45.             /*************************
  46.             *
  47.             *  Inicijalizacija niza
  48.             *
  49.             **************************/
  50.             for (i=0; i<MAX_NIZ; a[i++]=0) ;
  51.  
  52.             /*************************
  53.             *
  54.             *  Unos broja elemenata niza
  55.             *
  56.             *************************/
  57.             printf("Koliko imate elemenata niza? ");
  58.             scanf("%d", &n);
  59.             while ((n<=0) || (n>50))
  60.             {
  61.                 printf("Pogresan unos! Koliko imate elemenata niza? ");
  62.                 scanf("%d", &n);
  63.             }
  64.  
  65.             /*************************
  66.             *
  67.             *  Unos niza
  68.             *
  69.             *************************/
  70.             printf("\nUnos niza: \n");
  71.             for (i=0; i<n; i++)
  72.             {
  73.                 printf("Unesite %d. clan niza: ", i+1);
  74.                 scanf("%lf", &a[i]);
  75.             }
  76.  
  77.             /***********************************
  78.             *
  79.             *  Ako je niz sortiran, petlja se ni ne izvrsava
  80.             *
  81.             ***********************************/
  82.             stop = TRUE;
  83.             for (f=1; f<n; f++) if (a[f-1]>a[f]) stop = FALSE;
  84.             if (stop)   printf("\n\n\tUneli ste vec sortiran niz!");
  85.                 else {
  86.  
  87.                         /************************
  88.                         *
  89.                         *  Sortiranje niza
  90.                         *
  91.                         ************************/
  92.                                 /*******************************
  93.                                 *
  94.                                 *  Glavna petlja prolazi samo do polovine niza
  95.                                 *  jer se istovremeno trazi i najveci i namanji
  96.                                 *  u nizu i stavlja na odgovarajuce mesto
  97.                                 *
  98.                                 *******************************/
  99.                                 for (i=0; i<(n/2); i++)
  100.                                 {
  101.  
  102.                                     /*********************************
  103.                                     *
  104.                                     *  Pomocna petlja se krece unutar dva fixsna
  105.                                     *  clana ('i' i 'n-1-i') i uporedjuje svaki clan
  106.                                     *  iz te unutrasnjosti sa rubnim clanivuma
  107.                                     *  i zamenjuje vrednosti, ako je potrebno.
  108.                                     *  Tako na rubna mesta dolaze najmanji i najveci
  109.                                     *  clanovi iz unutrasnjosti!
  110.                                     *
  111.                                     *********************************/
  112.  
  113.                                     for (k=i+1; k<(n-i); k++)
  114.                                     {
  115.  
  116.  
  117.                                                     /***********************************
  118.                                                     *
  119.                                                     *  Prekida petlju ako je niz vec sortiran
  120.                                                     *
  121.                                                     ***********************************/
  122.                                                     stop = TRUE;
  123.                                                     for (f=1; f<n; f++) if (a[f-1]>a[f]) stop = FALSE;
  124.                                                     if (stop) break;
  125.  
  126.                                                     /****************************************
  127.                                                     *
  128.                                                     *  Ispisuje trenutno stanje niza pre prolaska kroz petlju