Revision: 60489
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at November 10, 2012 21:48 by hackerma3x
Initial Code
#include <iostream>
#include "lista_polje.h"
//#include "lista_pok.h"
using namespace std;
bool Dodaj(Lista*);
void IspisListe(Lista*);
void Pretrazi_Datum(Lista*);
bool BrisanjeUnosa(Lista*);
bool BrisanjeVrste(Lista*);
void Sortiranje(Lista*);
int main() {
Lista* L = new Lista;
InitL(L);
short izb;
do {
cout << "____________________________________________________________________" << endl;
cout << endl << "IZBORNIK" << endl;
cout << "____________________________________________________________________" << endl;
cout << " 1. Dodavanje zivotinje" << endl;
cout << " 2. Ispis liste zivotinja" << endl;
cout << " 3. Ispis svih zivotinja dostavljenih nakon 23.rujna 2012." << endl << endl;
cout << " 5. Brisati unos prema nazivu zivotinje" << endl;
cout << " 6. Brisati sve zivotinje odredjene vrste" << endl;
cout << " 7. Sortiranje liste" << endl << endl;
cout << " 9. Izlaz iz programa" << endl;
cout << "____________________________________________________________________" << endl;
cout << "Odabir: ";
cin >> izb;
switch(izb) {
case 1:
if(Dodaj(L) ) cout << endl << "Zapis uspjesno dodan u listu." << endl;
cout << "____________________________________________________________________" << endl;
break;
case 2:
IspisListe(L);
cout << "____________________________________________________________________" << endl;
break;
case 3:
Pretrazi_Datum(L);
cout << "____________________________________________________________________" << endl;
break;
case 5:
if(BrisanjeUnosa(L) ) cout << "Unos je uspjesno obrisan." << endl;
cout << "____________________________________________________________________" << endl;
break;
case 6:
if(BrisanjeVrste(L) ) cout << "Brisanje uspjesno obavljeno." << endl;
cout << "____________________________________________________________________" << endl;
break;
case 7:
Sortiranje(L);
cout << "____________________________________________________________________" << endl;
break;
case 9: break;
default:
cout << "Pogresan unos." << endl;
cout << "____________________________________________________________________" << endl;
}
cout << endl;
} while(izb!=9);
delete L;
return 0;
}
bool Dodaj(Lista* L) {
cout << "Dodavanje nove zivotinje u listu" << endl << endl;
static int sifra = 1;
// kreiranje novog zapisa (**sifra - automatski)
Zivotinja* nova = new Zivotinja;
while(1) {
nova->sifra = sifra++;
cout << "Sifra(*auto): " << nova->sifra << endl;
// unesi podatke
cin.ignore();
cout << "Naziv: ";
cin.getline(nova->naziv, 50);
cout << "Vrsta: ";
cin.getline(nova->vrsta, 50);
cout << "Cijena: ";
cin >> nova->cijena;
// unosa datuma
while(1) {
cout << "Datum dostave (dd mm gggg): ";
cin >> nova->dat_dostave.dan >> nova->dat_dostave.mjesec;
cin >> nova->dat_dostave.godina;
if(nova->dat_dostave.dan>=1 && nova->dat_dostave.dan<=31 &&
nova->dat_dostave.mjesec>=1 && nova->dat_dostave.mjesec<=12 &&
nova->dat_dostave.godina>=1000 && nova->dat_dostave.dan<=9999)
break;
cout << "Pogresan unos. dan(1-31) mjesec(1-12) godina(1000-9999)" << endl;
}
// potvrda unosa
char dn;
cout << "Potvrda unosa? (d/n)";
cin >> dn;
if(dn=='d' || dn=='D') break;
cout << endl << "Ponovni unos" << endl << endl;
}
// dodavanje zapisa
return InsertL(*nova, EndL(L), L);
}
void IspisListe(Lista* L) {
cout << "Ispis liste zivotinja od kraja" << endl << endl;
// ispis liste kraj --> pocetak
for(Element tren=EndL(L); (tren=PreviousL(tren, L))!=ERROR_CODE; )
cout << RetrieveL(tren, L) << endl;
}
void Pretrazi_Datum(Lista* L) {
Zivotinja z1;
int br = 0;
// pretrazi listu pocetak..kraj
for(Element tren=FirstL(L); tren!=EndL(L); tren=NextL(tren, L) ) {
z1 = RetrieveL(tren, L);
int dd=(z1.dat_dostave.godina*10000)+(z1.dat_dostave.mjesec*100)+z1.dat_dostave.dan;
// ispisi ako je datum dostave > 23.09.2012.
if(dd>20120923){
cout << z1 << endl;
br++;
}
}
// ispisi broj zivotinja sa datumom > 23.09.2012.
cout << "Ukupan broj ispisanih zivotinja: " << br << endl;
}
bool StrJednako(char* s1, char* s2, int n, int n2) {
if(n != n2) return false;
for(int i=0; i<n; i++)
if(s1[i] != s2[i]) return false;
return true;
}
bool BrisanjeUnosa(Lista* L) {
cout << "Brisanje unosa prema nazivu zivotinje" << endl;
// unesi naziv
char naziv[50];
cin.ignore();
cout << "Naziv: ";
cin.getline(naziv, 50);
// pretrazi listu $->naziv
Zivotinja z1;
for(Element tren=FirstL(L); tren!=EndL(L); tren=NextL(tren, L) ) {
z1 = RetrieveL(tren, L);
// ako je naziv pronadjen
if(StrJednako(naziv, z1.naziv, strlen(naziv), strlen(z1.naziv) ) ) {
cout << "Zivotinja je pronadjena: " << endl;
cout << z1 << endl;
// potvrda brisanja
char dn;
while(1) {
cout << endl << "Izbrisati unos? (d/n): ";
cin >> dn;
// brisanje
if(dn=='d' || dn=='D')
if(DeleteL(LocateL(z1, L), L) == -1) return 0;
else return 1;
// ne brisanje
if(dn=='n' || dn=='N') return 0;
cout << "Pogresan unos." << endl;
}
}
}
return 0;
}
bool BrisanjeVrste(Lista* L) {
cout << "Brisanje svih zivotinja odredjene vrste" << endl;
// unesi vrstu
char vrsta[50];
cin.ignore();
cout << "Vrsta: ";
cin.getline(vrsta, 50);
// potvrda unosa
char dn;
while(1) {
cout << endl << "Izbrisati sve zivotinje vrste '" << vrsta << "' iz liste? (d/n): ";
cin >> dn;
if(dn=='d' || dn=='D') break;
if(dn=='n' || dn=='N') return 0;
cout << "Pogresan unos." << endl;
}
// pretrazivanje liste $->vrsta
int br = 0;
Zivotinja z1;
for(Element tren=FirstL(L); tren!=EndL(L); ) {
z1 = RetrieveL(tren, L);
// ako je vrsta pronadjena
if(StrJednako(vrsta, z1.vrsta, strlen(vrsta), strlen(z1.vrsta) ) )
// brisanje elementa liste
if(DeleteL(LocateL(z1, L), L) ) {
br++;
continue;
}
// nastavka pretrazivanja liste
tren = NextL(tren, L);
}
// ispis broja izbrisanih unosa
cout << "Broj uspjesno izbrisanih unosa: " << br << endl;
if(br) return 1;
else return 0;
}
int BrojElemenata(Lista* L) {
int br=0;
for(Element tren=FirstL(L); tren!=EndL(L); tren=NextL(tren, L) ) br++;
return br;
}
bool Provjera(Zivotinja z1, Zivotinja z2) {
// ako je cijena manja
if(z1.cijena<z2.cijena) return true;
// ako je cijena ista i naziv veci 0
// ako je cijena ista i naziv manji 1
if(z1.cijena==z2.cijena) {
int manji = (strlen(z1.naziv)<strlen(z2.naziv)) ? strlen(z1.naziv) : strlen(z2.naziv);
for(int i=0; i<manji; i++)
if(z1.naziv[i]>z2.naziv[i]) return false;
else if(z1.naziv[i]<z2.naziv[i]) return true;
}
return false;
}
void Spoji(Zivotinja p[], int i, int k, int j) {
int poc1=i, poc2=k+1, c=0;
Zivotinja* p2 = new Zivotinja[j-i+1];
while(poc1<=k && poc2<=j)
if(Provjera(p[poc1], p[poc2]) ) p2[c++]=p[poc1++];
else p2[c++]=p[poc2++];
if(poc1>k)
while(poc2<=j) p2[c++]=p[poc2++];
else
while(poc1<=k) p2[c++]=p[poc1++];
for(int m=i; m<=j; m++) p[m]=p2[m-i];
delete[] p2;
}
void MerSort(Zivotinja polje[], int i, int j) {
if(i<j) {
int k = (i+j) / 2;
MerSort(polje, i, k);
MerSort(polje, k+1, j);
Spoji(polje, i, k, j);
}
}
void MerSort(Zivotinja polje[], int n) {
MerSort(polje, 0, n-1);
}
void Sortiranje(Lista* L) {
cout << "Sortiranje liste" << endl;
int broj_el=BrojElemenata(L), i=0;
// slozi novo polje od liste
Zivotinja* polje = new Zivotinja[broj_el];
for(Element nova=FirstL(L); nova!=EndL(L); nova=NextL(nova, L) )
polje[i++] = RetrieveL(nova, L);
// izbrisi elemente liste
DeleteAllL(L);
// sortiraj
MerSort(polje, broj_el);
// napravi listu od polja (obrnuti redoslijed)
for(int i=0; i<broj_el; i++)
InsertL(polje[i], FirstL(L), L);
// izbrisi polje
delete[] polje;
}
// hackerma3x (2012)
Initial URL
Initial Description
Glavna datoteka primjer operacija nad listom
Initial Title
SP - Zadatak 1 - ATP Liste
Initial Tags
Initial Language
C++