Return to Snippet

Revision: 60742
at November 12, 2012 08:38 by Dhorvat


Initial Code
//IMPLEMENTACIJA POMO�U POKAZIVA�A
using namespace std;
int sifra=1;

struct zivotinja {
       int Sifra;
       char Vrsta[30], Naziv[30];
       float Cijena;
       tm Datum;
       zivotinja *sljedeci;
       };

zivotinja *lista = new zivotinja;

void InitL(zivotinja *lista){
     lista -> sljedeci = NULL;
     }
     
int EndL(zivotinja *lista){
    zivotinja *tekuci = lista;
    int b = 1;
    while(tekuci -> sljedeci)
    {
                            tekuci = tekuci -> sljedeci;
                            b++;
                            }
    return b;
    }
    
int FirstL (zivotinja *lista)
{
    if(lista -> sljedeci == NULL) 
         return EndL (lista);
    else 
         return 0;
    }
    
int PreviousL (int pozicija, zivotinja *lista){
    if(pozicija == FirstL(lista)) 
                return -1;
    else 
         return pozicija - 1;
    }
    


zivotinja RetrieveL(int pozicija, zivotinja *lista){
           zivotinja *tekuci = lista -> sljedeci;
           for(int i = 0; i < pozicija; i++) 
                   tekuci = tekuci -> sljedeci;
           return *tekuci;
           }
           
int LocateL(int v, zivotinja *lista){
    zivotinja *tekuci = lista -> sljedeci;
    int br = 0;
    while(tekuci)
    {
                 br++;
                 tekuci = tekuci -> sljedeci;
                 }
    return br;    
    }
           
zivotinja * NextL(int pozicija, zivotinja *lista){
    if(pozicija == EndL (lista)) 
                return NULL;
    else
    {
         zivotinja tekuci = RetrieveL (pozicija, lista);
         return tekuci.sljedeci;
         }
}


void Vrati(zivotinja element,int pozicija, zivotinja* lista) {
     zivotinja *tekuci = lista -> sljedeci;
     for(int i = 0;i < pozicija; i++) 
             tekuci = tekuci -> sljedeci;
     tekuci -> Sifra = element.Sifra;
     tekuci -> Cijena = element.Cijena;
     strcpy (tekuci -> Naziv, element.Naziv);
     strcpy (tekuci -> Vrsta, element.Vrsta);
     tekuci -> Datum = element.Datum;
     }
     


void Reverse (zivotinja *lista)
{
    if(lista -> sljedeci == NULL) 
             return;

    zivotinja *prosli = NULL, *trenutni = NULL, *sljedeci = NULL;
    trenutni = lista -> sljedeci;
    while(trenutni != NULL){
        sljedeci = trenutni -> sljedeci;
        trenutni -> sljedeci = prosli;
        prosli = trenutni;
        trenutni = sljedeci;
    }
    lista -> sljedeci = prosli;
}
     
int InsertL (zivotinja *novi, int pozicija, zivotinja *lista){
     zivotinja *tekuci = lista;

     for(int i = 1; i < pozicija; i++)
             tekuci = tekuci -> sljedeci;
     novi -> sljedeci = tekuci -> sljedeci;
     tekuci -> sljedeci = novi;

     sifra++;
     if((tekuci -> sljedeci) -> Sifra == novi -> Sifra) 
                return 1;
     else 
          return 0;
     }
     

     
void DeleteL (int pozicija, zivotinja *lista){
           zivotinja *tekuci = lista->sljedeci;
           zivotinja *prethodni = lista;
           
           for(int i = 0;i < pozicija; i++)
           {
                   tekuci = tekuci -> sljedeci;
                   prethodni = prethodni -> sljedeci;
                   }
           prethodni -> sljedeci = tekuci -> sljedeci;
           delete tekuci;
     }
void DeleteAllL (zivotinja *lista)
{
     zivotinja *trenutni;
     while (lista -> sljedeci != NULL)
     {
           trenutni = lista -> sljedeci;
           lista -> sljedeci = lista -> sljedeci -> sljedeci;
           delete trenutni;
           }
 }


//IMPLEMENTACIJA POMO�U POLJA
using namespace std;
int sifra=1;
int kursor;

struct zivotinja {
       int Sifra;
       char Vrsta[50], Naziv[50];
       float Cijena;
       tm Datum;
       };

zivotinja lista[1000];

void InitL (zivotinja *lista)
{
     kursor = 1;
     }
     
int EndL(zivotinja *lista)
{
    return kursor;
    }
    
int FirstL (zivotinja *lista)
{
    return 0;
    }

zivotinja * NextL(int pozicija, zivotinja *lista)
{
    if(pozicija == EndL (lista)) 
                return lista;
    else 
         return &lista[pozicija + 1];
    }
    
int PreviousL (int pozicija, zivotinja *lista)
{
    if(pozicija == FirstL (lista)) 
         return -1;
    else 
         return pozicija - 1;
    }

zivotinja RetrieveL(int pozicija, zivotinja *lista)
{
           return *(lista + pozicija);
           }


int InsertL(zivotinja *novi, int pozicija, zivotinja *lista)
{
     --pozicija;
     (lista + pozicija) -> Sifra = novi -> Sifra;
     strcpy ((lista + pozicija) -> Naziv, novi -> Naziv);
     strcpy ((lista + pozicija) -> Vrsta, novi -> Vrsta);
     (lista + pozicija) -> Cijena = novi -> Cijena;
     (lista + pozicija) -> Datum.tm_mday = novi -> Datum.tm_mday;
     (lista + pozicija) -> Datum.tm_mon = novi -> Datum.tm_mon;
     (lista + pozicija) -> Datum.tm_year = novi -> Datum.tm_year;
     sifra++;
     kursor++;
     return((lista+pozicija) -> Sifra == novi -> Sifra);
     }

void Vrati(zivotinja element, int pozicija, zivotinja *lista)
{
     lista[pozicija] = element;
     }

void Reverse (zivotinja * lista){
     int broj_elemenata = EndL (lista) - 1;
     for(int i=0;i<=broj_elemenata/2;i++) 
             swap (lista[i], lista[broj_elemenata - i - 1]);
     
     }
     
void DeleteL(int pozicija, zivotinja *lista){
     for(int i = pozicija; i < EndL (lista); i++)
     {
             lista[i].Sifra = lista[i + 1].Sifra;
             strcpy((lista + i) -> Naziv, (lista + i + 1) -> Naziv);
             strcpy((lista + i) -> Vrsta, (lista + i + 1) -> Vrsta);
             lista[i].Cijena = lista[i + 1].Cijena;
             (lista + i) -> Datum.tm_mday = (lista + i + 1) -> Datum.tm_mday;
             (lista + i) -> Datum.tm_mon = (lista + i + 1) -> Datum.tm_mon;
             (lista + i) -> Datum.tm_year = (lista + i + 1) -> Datum.tm_year;
             }
     kursor--;
     }
void DeleteAllL (zivotinja *lista)
{
     kursor = 0;
 }

//GLAVNI PROGRAM
#include <iostream>
//#include "lista_polje.h"
#include "lista_pokazivac.h"
#include "time.h"
using namespace std;

void unos(char *znakovni_niz)
{
     cin.getline(znakovni_niz, 30);
     if (cin.gcount()==1)
        cin.getline (znakovni_niz,30);
     };

int dodaj() 
{
     zivotinja *novi = new zivotinja;
     cout << "Sifra: " << sifra << endl;
     novi -> Sifra = sifra;
     cout << "Naziv: ";
     unos (novi -> Naziv);
     cout << "Vrsta: ";
     unos (novi -> Vrsta);
     cout << "Cijena: ";
     cin >> novi -> Cijena;
     cout << "Datum dostave: " << endl;
     cout << endl;
     do
     {
          cout << "Mjesec: ";
          cin >> novi -> Datum.tm_mon;
          if (!(novi -> Datum.tm_mon < 1 || novi -> Datum.tm_mon > 12))
             break;
          cout << "Pogresan unos!" << endl;
     }while(1);
     do
     {
          cout << "Dan: ";
          cin >> novi -> Datum.tm_mday;
          if (novi -> Datum.tm_mon == 1 || novi -> Datum.tm_mon == 3 || novi -> Datum.tm_mon == 5 || 
              novi -> Datum.tm_mon == 7 || novi -> Datum.tm_mon == 8 || novi -> Datum.tm_mon == 10 || novi -> Datum.tm_mon == 12)
              if (!(novi -> Datum.tm_mday < 0 || novi -> Datum.tm_mday > 31))
                  break;
          if (novi -> Datum.tm_mon == 4 || novi -> Datum.tm_mon == 6 || novi -> Datum.tm_mon == 9 || novi -> Datum.tm_mon == 11)
              if (!(novi -> Datum.tm_mday < 0 || novi -> Datum.tm_mday > 30))
                  break;
          if (novi -> Datum.tm_mon == 2)
              if (!(novi -> Datum.tm_mday < 0 || novi -> Datum.tm_mday > 29))
                  break;
          cout << "Pogresan unos!" << endl;
     } while(1);
     cout << "Godina: ";
     do
     {
          cout << "Godina: (2000. - 2050.) ";
          cin >> novi -> Datum.tm_year;
          if (!(novi -> Datum.tm_year <= 2000 || novi -> Datum.tm_year >= 2050))
             break;
          cout << "Pogresan unos." << endl;
     }while(1);
     return (InsertL (novi, EndL (lista), lista));     
     }
void ispisi_listu() 
{
     zivotinja tekuci;
     for(int i = EndL(lista) - 1; i > 0; i--)
     {
             tekuci = RetrieveL (PreviousL (i, lista), lista);
             cout << "Sifra:\t" << tekuci.Sifra << endl;
             cout << "Naziv:\t" << tekuci.Naziv << endl;
             cout << "Vrsta:\t" << tekuci.Vrsta << endl;
             cout << "Cijena:\t" << tekuci.Cijena << endl;
             cout << "Datum dostave:\t" << tekuci.Datum.tm_mday << "." << tekuci.Datum.tm_mon << "." << tekuci.Datum.tm_year << "." << endl << endl;
             cout << "-------------------------------------------" << endl;
             }     
     }
void pretrazi_listu() {
     zivotinja tekuci;
     int br=0;
     for(int i = EndL (lista) - 1; i > 0; i--)
     {
             tekuci = RetrieveL (PreviousL (i, lista), lista);
             if(!((tekuci.Datum.tm_year < 2012 && (tekuci.Datum.tm_mon + 1) < 9) && tekuci.Datum.tm_mday <= 23))
             {
                  cout << "Sifra :" << tekuci.Sifra << endl;
                  cout << "Naziv :" << tekuci.Naziv << endl;
                  cout << "Vrsta :" << tekuci.Vrsta << endl;
                  cout << "Cijena:" << tekuci.Cijena << endl;
                  cout << "Datum :" << tekuci.Datum.tm_mday << "." << tekuci.Datum.tm_mon + 1 << "." << tekuci.Datum.tm_year << "." << endl << endl;
                  cout << "-----------------" << endl;
                  br++;
                  }
             }
     cout << "Zapisa s datumom poslije 23.9.2012.: " << br << endl;
     }
int obrisi_prema_nazivu(){
     zivotinja tekuci;
     cout << "--- Svi Zapisi ---" << endl;
     ispisi_listu ();
     cout << "Unesite naziv zivotinje za brisanje: ";
     char naziv[30];
     bool nadjeno = false;
     unos (naziv);
     for(int i = EndL (lista) - 1; i > 0 && !nadjeno; i--)
     {
             tekuci = RetrieveL (PreviousL (i,lista), lista);
             if(strcmp(naziv,tekuci.Naziv)==0){
                 cout << "--------------------------------" << endl << endl;         
                 cout << "Sifra:\t" << tekuci.Sifra << endl;
                 cout << "Naziv:\t" << tekuci.Naziv << endl;
                 cout << "Vrsta:\t" << tekuci.Vrsta << endl;
                 cout << "Cijena:\t" << tekuci.Cijena << endl;
                 cout << "Datum dostave:\t" << tekuci.Datum.tm_mday << "." << tekuci.Datum.tm_mon + 1 << "." << tekuci.Datum.tm_year << "." << endl << endl;
                 nadjeno = true;
                 char izbor;
                 cout << "Jeste li sigurni da zelite obrisati ovja zapis? (d/n)";
                 do
                 {
                      cin >>izbor;
                 } while(izbor != 'd' && izbor != 'n');
                 if(izbor == 'd') 
                                DeleteL (i-1, lista);
                 else 
                      return 0;
                 }
             }    
    return nadjeno; 
    }
int obrisi_prema_vrsti(){
     zivotinja tekuci;
     cout << "--- Svi Zapisi ---" << endl;
     ispisi_listu ();
     cout << endl;
     cout << "Unesite vrstu: ";
     char vrsta[30];
     bool nadjeno = false;
     unos(vrsta);
     for(int i = EndL (lista) - 1; i > 0; i--){
             tekuci = RetrieveL (PreviousL (i,lista), lista);
             if(strcmp (vrsta, tekuci.Vrsta) == 0)
             {
                 char izbor;
                 if(!nadjeno)
                 {
                              cout << "Zelite li obrisati sve zapise ove vrste: (d/n)" << vrsta << endl;
                              do
                              {
                                   cin >>izbor;
                              } while(izbor != 'd' && izbor != 'n');
                 }
                 if(izbor == 'd') 
                                DeleteL (i - 1, lista);
                 nadjeno = true;
                 }
             }    
    return nadjeno; 
    }
void spoji(int i, int k, int j) {
     int I = i, J = k + 1, K = 0;
     zivotinja *b = new zivotinja [j - i + 1];
     zivotinja prvi, drugi;
     while(I <= k && J <= j)
     {    
                prvi = RetrieveL (I, lista);
                drugi = RetrieveL (J, lista);
                if(prvi.Cijena > drugi.Cijena) 
                {
                               b[K++] = prvi;
                               I++; 
                               }
                else if 
                     (prvi.Cijena < drugi.Cijena)
                {
                     b[K++] = drugi;
                     J++;
                     }
                else if(strcmp (prvi.Naziv, drugi.Naziv) < 0) 
                {
                     b[K++] = drugi;
                     J++;
                     }
                else 
                {
                     b[K++] = prvi;
                     I++;
                     }
     }
     if(I > k) while(J <= j) { 
             drugi = RetrieveL (J, lista);                     
             b[K++] = drugi;
             J++;
             }
     else while(I <= k) {
          prvi = RetrieveL (I, lista);
          b[K++] = prvi;
          I++;
          }
     for(int I = 0;I <= j - i; I++) 
             Vrati (b[I], i + I, lista);
     delete [] b;
     }
void MSort(int i, int j) 
{
     if(i < j) 
     {
             int k = (i + j) / 2;
             MSort(i, k);
             MSort(k + 1, j);
             spoji(i, k, j);
             }
     }
void sortiraj() {
     int br_elem = EndL(lista)-1;
     MSort(0,br_elem-1);
     Reverse(lista);
     }
int main()
{
    InitL (lista);
    int izbor = 0;
    do 
    {
       system ("cls");
       cout << "--- I Z B O R ---" << endl;
       cout << "1) Dodaj zapis." << endl;
       cout << "2) Ispisi listu." << endl;
       cout << "3) Ispisi sve zapise nakon 23.9.2012." << endl;
       cout << "4) Brisanje pojedinacnog zapisa prema nazivu." << endl;
       cout << "5) Brisanje svih zapisa prema vrsti." << endl;
       cout << "6) Sortiraj listu." << endl;
       cout << "7) Obrisi sve zapise." << endl;
       cout << "9) Izlaz iz programa." << endl;
       cin >> izbor;
       cout << "--------------------" << endl;
       switch(izbor)
       {
                      case 1: 
                           cout << (dodaj()? "Zapis uspjesno dodan!\n" : "Zapis nije dodan\n");
                           system ("pause");
                           break;
                      case 2:
                           ispisi_listu();
                           system ("pause");
                           break;
                      case 3:
                           pretrazi_listu();
                           system ("pause");
                           break;
                      case 4:
                           if(obrisi_prema_nazivu())
                             cout << "Zapis izbrisan."<<endl<<endl;
                           else cout << "Trazeni zapis ne postoji!" << endl;
                           system ("pause");
                           break;
                      case 5:
                           if(obrisi_prema_vrsti())
                             cout << "Trazena vrsta je obrisana." << endl;
                           else cout << "Trazena vrsta ne postoji!" << endl;
                           system ("pause");
                           break;
                      case 6:
                           sortiraj ();
                           cout << "Lista sortirana." << endl;
                           system ("pause");
                           break;
                      case 7:
                           DeleteAllL (lista);
                           cout << "Lista je obrisana." << endl;
                           system ("pause");
                           break;
                      case 9:
                           cout << "Izlaz iz programa." << endl;
                           system ("pause");
                           break;
                      default:
                           cout << "Pogresan unos!" << endl;
                           system ("pause");
                      }
        }while (izbor != 9);
    return 0;
    }

Initial URL


Initial Description
Prvi zadatak; biblioteke (lista_poazivac.h, lista_polje.h), glavni program

Initial Title
SP_zadatak1_Davorin_Horvat

Initial Tags
podataka

Initial Language
C++