/ Published in: C++
Prvi zadatak; biblioteke (lista_poazivac.h, lista_polje.h), glavni program
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
//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; }