Return to Snippet

Revision: 60489
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++