Sortowanie bąbelkowe tablicy struktur

0

Cześć wszystkim ;).
Mam do napisania bazę danych przechowująca dane o pracownikach i umożliwiającą min. sortowanie wg wybranych pól struktury z tym, że mają być 2 algorytmy sortowania do wyboru. Pod spodem mój program:

#include <iostream>
using namespace std;

struct T_dane_pracownika
	{
		short lp;
		char imie[15];
		char nazwisko[30];
		char adres_zamieszkania[80];
		char NIP[15];
		char PESEL[15];
	};

void WCZYTAJ(T_dane_pracownika *wsk, int ilosc)
{
	for(int i=0; i<ilosc; i++)
	{
		cout << "Podaj dane " << i+1 << ". pracownika: " << endl;
		wsk[i].lp=i+1;
		cout << "Imie: "; cin >> wsk[i].imie; cout << endl;
		cout << "Nazwisko: "; cin >> wsk[i].nazwisko; cout << endl;
		cin.ignore();
		cout << "Adres zamieszkania: "; cin.getline(wsk[i].adres_zamieszkania, 80); cout << endl;
		cout << "NIP: "; cin >> wsk[i].NIP; cout << endl;
		cout << "PESEL: "; cin >> wsk[i].PESEL; cout << endl;

	}
}

void WYSWIELT_P(T_dane_pracownika *wsk, int numer)   //funkcja wyswietlajaca dane wybranego pracownika
{
	
	{
		cout << "Dane pracownika nr " << numer << ": " << endl;
		cout << "L.p.: " << wsk[numer-1].lp << endl;
		cout << "Imie: " << wsk[numer-1].imie << endl;
		cout << "nazwisko: " << wsk[numer-1].nazwisko << endl;
		cout << "Adres zamieszkania: " << wsk[numer-1].adres_zamieszkania << endl;
		cout << "NIP: " << wsk[numer-1].NIP << endl;
		cout << "PESEL: " << wsk[numer-1].PESEL << endl;
	}
}

void WYSWIELT_W(T_dane_pracownika *wsk, int ilosc)   //funkcja wyswietlajaca dane wszystkich pracownikow
{
        for(int i=0; i<ilosc; i++)
        {
				wsk[i].lp=i+1;
				cout << "L.p.: " << wsk[i].lp << endl;
                cout << "Dane pracownika nr " << i+1 << ": " << endl;
                cout << "Imie: " << wsk[i].imie << endl;
                cout << "nazwisko: " << wsk[i].nazwisko << endl;
                cout << "Adres zamieszkania: " << wsk[i].adres_zamieszkania << endl;
                cout << "NIP: " << wsk[i].NIP << endl;
                cout << "PESEL: " << wsk[i].PESEL << endl;
        }
}
//funkcje porownujace dla qsort
int wedlug_nazwisk( const void *wsk_1, const void *wsk_2)
{
	struct T_dane_pracownika *osoba_1=(struct T_dane_pracownika*)wsk_1;
	struct T_dane_pracownika *osoba_2=(struct T_dane_pracownika*)wsk_2;
	return (strcmp(osoba_1->nazwisko, osoba_2->nazwisko));
}

int wedlug_imion( const void *wsk_1, const void *wsk_2)
{
	struct T_dane_pracownika *osoba_1=(struct T_dane_pracownika*)wsk_1;
	struct T_dane_pracownika *osoba_2=(struct T_dane_pracownika*)wsk_2;
	return (strcmp(osoba_1->imie, osoba_2->imie));
}

int wedlug_NIP( const void *wsk_1, const void *wsk_2)
{
	struct T_dane_pracownika *osoba_1=(struct T_dane_pracownika*)wsk_1;
	struct T_dane_pracownika *osoba_2=(struct T_dane_pracownika*)wsk_2;
	return (strcmp(osoba_1->NIP, osoba_2->NIP));
}

int wedlug_PESEL( const void *wsk_1, const void *wsk_2)
{
	struct T_dane_pracownika *osoba_1=(struct T_dane_pracownika*)wsk_1;
	struct T_dane_pracownika *osoba_2=(struct T_dane_pracownika*)wsk_2;
	return (strcmp(osoba_1->PESEL, osoba_2->PESEL));
}

//funkcje dla sortowania babelkowego




void B_wedlug_imienia(T_dane_pracownika *wsk, int ilosc)
{
	for(int i=0; i<ilosc; i++)
	{

		if (wsk[i].imie[0] > wsk[i+1].imie[0])
		{
			cout << "JESTESMYYY TUUUU!!!";
			char *temp_imie=0, *temp_nazwisko=0, *temp_adres_zamieszkania=0, *temp_NIP=0, *temp_PESEL=0;
			//dalej nie wiem, jak przechowywac tymczasowo zawartosci pol struktur, jak to przypisywac itd
		    

		}
	}
}



int main()
{

	int rozmiar;
	do {
	cout << "Podaj liczbe pracownikow (maks. 100): ";
	cin >> rozmiar;
	}
	while(rozmiar>100);

	T_dane_pracownika *wbaza = new T_dane_pracownika[rozmiar];

	WCZYTAJ(wbaza, rozmiar);
	

	cout << "Czy chcesz dokonac sortowania? t/n";
	char pytanie1;
	cin >> pytanie1;
	if(pytanie1=='t')        //sortowanie
	{
		cout << "Wedlug czego chcesz sortowac? 1 - imie, 2 - nazwisko, 3 - PESEL, 4 - NIP";
		int pytanie2;
		cin >> pytanie2;
		if(pytanie2==1)   //sortowanie wg imienia
		{
			cout << "Wybierz algorytm sortowania: 1 - szybkie (qsort), 2 - babelkowe: ";
			int rodzaj_sort;
			cin >> rodzaj_sort;
			if(rodzaj_sort==1)						//qsort wg imienia
			{
				qsort(wbaza, rozmiar, sizeof(struct T_dane_pracownika), wedlug_imion);							
			}
			if(rodzaj_sort==2)						//babelkowe wg imienia
			{
				//do zrobienia
			}
		}

		if(pytanie2==2)   //sortowanie wg nazwiska
		{
			cout << "Wybierz algorytm sortowania: 1 - szybkie (qsort), 2 - babelkowe: ";
			int rodzaj_sort;
			cin >> rodzaj_sort;
			if(rodzaj_sort==1)	//qsort wg nazwiska
			{
				qsort(wbaza, rozmiar, sizeof(struct T_dane_pracownika), wedlug_nazwisk);
			}
			if(rodzaj_sort==2)  //babelkowe wg nazwiska
			{
				//do zrobienia
			}
		}

		if(pytanie2==3)	//sortowanie wg PESELU
		{
			cout << "Wybierz algorytm sortowania: 1 - szybkie (qsort), 2 - babelkowe: ";
			int rodzaj_sort;
			cin >> rodzaj_sort;
			if(rodzaj_sort==1)    //qsort wg PESELu
			{
				qsort(wbaza, rozmiar, sizeof(struct T_dane_pracownika), wedlug_PESEL);					
			}

			if(rodzaj_sort==2)    //babelkowe wg PESELu
			{
				//do zrobienia
			}
		}

		if(pytanie2==4)  //sortowanie wg NIPU
		{
			cout << "Wybierz algorytm sortowania: 1 - szybkie (qsort), 2 - babelkowe: ";
			int rodzaj_sort;
			cin >> rodzaj_sort;
			if(rodzaj_sort==1)   //qsort wg NIPU
			{
				qsort(wbaza, rozmiar, sizeof(struct T_dane_pracownika), wedlug_NIP);					
			}
			if(rodzaj_sort==2)   //babelkowe wg NIPU
			{
				//do zrobienia
			}
		
	    }
	}


		if(pytanie1=='t') {cout << "Sortowanie zakonczone. " << endl << endl;}

	cout << "Podaj nr pracownika, ktorego dane chcesz wyswietlic (0 - wyswietlenie wszystkich): ";
	int nr;
	cin >> nr;
	cout << endl;
    if(nr!=0) WYSWIELT_P(wbaza, nr);
	if(nr==0) WYSWIELT_W(wbaza, rozmiar);

	cin.ignore();
	cin.get();

}


 

Szybkie sortowanie (qsort) już sobie ogarnąłem i działa (możecie sprawdzić), mam natomiast problem z napisaniem sortowania bąbelkowego. Wybrałem ten algorytm, bo jest prosty, zresztą to bez większej różnicy. Ma sortować tak, jak qsort (czyli wg imienia, nazwiska, NIPu lub PESELU). Widzicie w programie funkcję B_wedlug_imienia - próbowałem tam zacząć pisać to sortowanie bąbelkowe, jednak nie wiem, jak zapamiętać w tymczasowych zmiennych wskaźnikowych (o ile to w ogóle prawidłowy typ) wartości poszczególnych pól struktur, a potem podstawić ich do innych pól struktury.

Jeżeli ktoś jest w stanie mi pomóc, będę wdzięczny ;).

0

T_dane_pracownika Tmp=wbaza[i]; wbaza[i]=wbaza[i+1]; wbaza[i+1]=Tmp;

0

Ok, dzięki, napisałem to więc w ten sposób, bezpośrednio w programie, nie w funkcji:

if(rodzaj_sort==2)						//babelkowe wg imienia
			{
				for(int i=0; i<rozmiar; i++)
				{
					if(wbaza[i].imie[0] > wbaza[i+1].imie[0])
					{
						
						T_dane_pracownika Tmp=wbaza[i]; wbaza[i]=wbaza[i+1]; wbaza[i+1]=Tmp;

					}
				}
			}

Program przechodzi, jednak gdy później każę programowi wyświetlić zawartość tablicy struktur - wywala program z błędem:

Critical error detected c0000374
ConsoleApplication1.exe has triggered a breakpoint.
The thread 0xa60 has exited with code -1073741510 (0xc000013a).
The program '[4484] ConsoleApplication1.exe' has exited with code -1073741510 (0xc000013a).

PS: jak widać, mój warunek w drugim Ifie porównuje tylko pierwsze litery imienia, może ktoś wie, jak wymyślić coś lepszego? Bo ten będzie sortował tylko wg pierwszych liter.

0

i<rozmiar ... wbaza[i+1] - wyłazisz poza zakres.

0

Miałeś rację, świetnie to działa. Teraz mam tylko problem z tym warunkiem zamiany pól... Zawsze daję warunek rozpoczęcia zamiany dwóch pól tego typu:

if(wbaza[i].NIP[0] > wbaza[i+1].NIP[0])
{ //zamiana pozycji i z i+1....}

Jak widać, sprawdza to tylko pierwsze elementy w danych polach, jest to więc mało skuteczne. Czy jest jakiś sposób, żeby sprawdzało to całą liczbę zapisaną np. pod NIPem albo wszystkie kody znaków, a nie tylko pierwszy, zapisany jako nazwisko? I imię, i nazwisko, i PESEL oraz PIN są w strukturze typami char.

I na koniec jeszcze pytanie - jak na samym końcu, już po sortowaniu, zapisać zawartość struktury do pliku i ją odczytać?

0

strcmp()

0

Masz rację, zrobiłem strcmp() dla NIPu i PESELu, jest świetnie. Dla imienia i nazwiska zostawiłem tylko pierwszy znak, bo np. wartość ASCII wyrazu "Wawasczszuk" jest większa, niż wyrazu "Ania", także nie ma sensu porównywać całych wyrażeń.

Pozostaje teraz tylko moje ostatnie pytanie:
jak zapisać to do pliku i potem odczytać (tę całą, gotową, posortowaną już na końcu strukturę) ? Nie mam pojęcia jak zapisuje się do pliku, bo jeszcze do tego nie dotarłem, a potrzebuję zrobić jeszcze tylko tę jedną rzecz.

0

ofstream fout("plik.txt");
fout<<666;
fout.close();

ifstream fin("plik.txt");
int x;
fin>>x;
fin.close();

0

Ok, teraz instrukcja:

fout<<wbaza;

Zapisuje do pliku sam adres bazy struktur. Jak to zrobić, aby zapisywała się zawartość całej bazy ?

0

jak chcesz całość zapisać binarnie, to otwórz plik w trybie binarnym i użyj metody write.

0

Nie mam pojęcia, jak to zrobić. Komendami z fstream zapisuje tylko adres tablicy. Nawet tego adresu nie mogę później wczytać do nowego wskaźnika typu strukturalnego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1