Sortowanie bąbelkowe tablicy struktur alfabetycznie

0

Witam. Napisałem kod tworzący bazę danych którą zapisuje do pliku txt. (dodawanie osób, edytowanie, usuwanie i wyświetlanie listy osób). Mam problem z sortowaniem bąbelkowym wg. preferencji (imię, nazwisko, adres itp). Nigdzie nie moge znaleźć opisu jak to zrobić praktycznie.

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
#include <time.h>
#include <cstdlib>

using namespace std;

struct osoba
{
	string imie;
	string nazwisko;
	string ulica;
	string numer;
	string kod;
	string miejscowosc;
	string kraj;

};

int n;
short ilosc_osob; // zmienna ilosci osob
short ile_razy_otwarty; // zmienna ilosci otwarc programu 

osoba tablica_osob[100]; //tablica struktur

void Dodaj();
void Zobacz();
void Zapisz();
void Wczytaj();
void Usun();
void Edytuj();


int main()
{
	cout << " BAZA DANYCH" << endl; 
	cout << "\n\n\n";

	char wybor;

	Wczytaj();

	ile_razy_otwarty++;
	cout << "Program otwarto " << ile_razy_otwarty << " raz" << endl;

	do
	{
		cout << "\n\n\n";
		cout << "Osob w bazie: " << ilosc_osob << endl;
		cout << "\n\n";
		cout << "Wybierz co chesz zrobic:" << endl;
		cout << "1. Dodaj osobe " << endl;
		cout << "2. Zobacz wszystkie osoby " << endl;
		cout << "3. Usun osobe " << endl;
		cout << "4. Edytuj osobe " << endl;
		cout << "Podaj liczbe osob:";
		cin >> n;

		cout << "ESC koniec dzialania programu" << endl;

                wybor = _getch();

		switch (wybor)
		{
		case 49: Dodaj();
			break;
		case 50: Zobacz();
			break;
		case 51: Usun();
			break;
		case 52: Edytuj();
			break;
		}
	} while (wybor != 27);
	

	Zapisz();

	return 0;
	// system("pause");
} // koniec main

void Wczytaj()
{
	ifstream plik("osoba.txt", ios::in);

	plik >> ile_razy_otwarty;
	plik >> ilosc_osob;

	short j = 0;

	do
	{
		plik >> tablica_osob[j].imie;
		plik >> tablica_osob[j].nazwisko;
		plik >> tablica_osob[j].ulica;
		plik >> tablica_osob[j].numer;
		plik >> tablica_osob[j].kod;
		plik >> tablica_osob[j].miejscowosc;
		plik >> tablica_osob[j].kraj;

		j++;
	} while (!plik.eof());
}

void Zapisz()
{
	ofstream plik("osoba.txt", ios::out | ios::trunc);

	plik << ile_razy_otwarty << "\n";
	plik << ilosc_osob << "\n";

	for (short j = 0; j < ilosc_osob; j++)
	{
		plik << " " << endl;
		plik << "Osoba nr: " << j + 1 << endl;
		plik << tablica_osob[j].imie << endl;
		plik << tablica_osob[j].nazwisko << endl;
		plik << tablica_osob[j].ulica << endl;
		plik << tablica_osob[j].numer << endl;
		plik << tablica_osob[j].kod << endl;
		plik << tablica_osob[j].miejscowosc << endl;
		plik << tablica_osob[j].kraj << endl;
	}

}
void Dodaj()
{
	cout << "Imie: \n";
	cin >> tablica_osob[ilosc_osob].imie;

	cout << "Nazwisko: \n";
	cin >> tablica_osob[ilosc_osob].nazwisko;

	cout << "Ulica: \n";
	cin >> tablica_osob[ilosc_osob].ulica;

	cout << "Numer domu: \n";
	cin >> tablica_osob[ilosc_osob].numer;

	cout << "Kod pocztowy: \n";
	cin >> tablica_osob[ilosc_osob].kod;

	cout << "Miejscowosc: \n";
	cin >> tablica_osob[ilosc_osob].miejscowosc;

	cout << "Kraj: \n";
	cin >> tablica_osob[ilosc_osob].kraj;

	cin.ignore();

	ilosc_osob++;

	Zapisz();

	cout << "Dodano i zapisano" << endl;

}
void Zobacz()
{
	if (ilosc_osob != 0) // i>0
	{
		for (short j = 0; j < ilosc_osob; j++) //kolejne zmienne
		{
			cout << " " << endl;
			cout << " Osoba nr " << j + 1 << ": " << endl;
			cout << " Imie: " << tablica_osob[j].imie << endl;
			cout << " Nazwisko: " << tablica_osob[j].nazwisko << endl;
			cout << " Ulica: " << tablica_osob[j].ulica << endl;
			cout << " Numer domu: " << tablica_osob[j].numer << endl;
			cout << " Kod pocztowy: " << tablica_osob[j].kod << endl;
			cout << " Miejscowosc: " << tablica_osob[j].miejscowosc << endl;
			cout << "Kraj: " << tablica_osob[j].kraj << endl;
			cout << " " << endl;
		}
	}
	else
		cout << "Nie ma zadnych osob w bazie!";
}

void Usun()
{
	short kogo;

	if (ilosc_osob != 0)
	{
		cout << "Podaj numer osoby ktora chcesz usunac: ";
		cin >> kogo;
		cin.ignore();


		if (kogo > ilosc_osob)

			cout << "Brak osoby o takim numerze";

		else
		{
			for (short k = kogo; k < ilosc_osob; k++)
			{
				tablica_osob[k - 1].imie = tablica_osob[k].imie;
				tablica_osob[k - 1].nazwisko = tablica_osob[k].nazwisko;
				tablica_osob[k - 1].ulica = tablica_osob[k].ulica;
				tablica_osob[k - 1].numer = tablica_osob[k].numer;
				tablica_osob[k - 1].kod = tablica_osob[k].kod;
				tablica_osob[k - 1].miejscowosc = tablica_osob[k].miejscowosc;
				tablica_osob[k - 1].kraj = tablica_osob[k].kraj;
			}
			ilosc_osob--;

			cout << "Osoba o numerze " << kogo << " zostala usunieta!";
			cout << "  " << endl;
			Zapisz();
		}

	}
	else
	{
		cout << "Brak osoby w bazie!! Wcisnij ENTER!";
	}
}

void Edytuj()
{
	int kogo;

	if (ilosc_osob != 0)
	{
		cout << "Podaj numer osoby ktora chcesz edytowac: ";
		cin >> kogo;
		cin.ignore();

		if (kogo > ilosc_osob)
			cout << "Brak osoby o takim numerze";
		else
		{
			cout << " " << endl;
			cout << "Podaj imie osoby: \n";
			cin >> tablica_osob[kogo - 1].imie;
			cout << "Podaj nazwisko osoby: \n";
			cin >> tablica_osob[kogo - 1].nazwisko;
			cout << "Podaj ulice: \n";
			cin >> tablica_osob[kogo - 1].ulica;
			cout << "Podaj numer domu: \n";
			cin >> tablica_osob[kogo - 1].numer;
			cout << "Podaj kod pocztowy: \n";
			cin >> tablica_osob[kogo - 1].kod;
			cout << "Podaj miejscowosc: \n";
			cin >> tablica_osob[kogo - 1].miejscowosc;
			cout << "Podaj kraj: \n";
			cin >> tablica_osob[kogo - 1].kraj;

			cout << "Osoba o numerze " << kogo << " zostala zedytowana!";
			cout << " " << endl;
			Zapisz();
		}

	}
	else
	{
		cout << "Nie ma tej osoby w bazie!! Wcisnij ENTER!";
	}
}

void Sortuj()
{       Wczytaj();
	cout << " \n \n \n";
	cout << "Wybierz kryterium sortowania" << endl;
	cout << "61. Imie" << endl;
	cout << "62. Nazwisko" << endl;
	cout << "63. Ulica" << endl;
	cout << "64. Numer domu" << endl;
	cout << "65. Kod pocztowy" << endl;
	cout << "66. Miejscowosc" << endl;
	cout << "67. Kraj" << endl;

	char pytanie1;
	cin >> pytanie1;
	if (pytanie1 == 61)
	{	
		
		// sortowanie babelkowe

        zapisz();
	}

Edit1:
Zrobiłem coś takiego ale po wpisaniu przykładowych danych do tablicy program nie sortuje danych.

{	

				int a, b;
		osoba t;
		for (a = ilosc_osob - 2; a >= 0; a--)
		{
			for (b = 0; b <= a; b++)
			{
				if (tablica_osob[b].imie<tablica_osob[b + 1].imie)
				{
					t = tablica_osob[b];
					tablica_osob[b] = tablica_osob[b + 1];
					tablica_osob[b + 1] = t;
				}
			}
		}
	}
	Zapisz();
	

Podejrzewam że zrobiłem gdzieś mały błąd ale nie moge go znaleźć

0

Najlepiej zrób to lambdą z operatorem warunkowym wywołaną z generycznej funkcji sortującej.

0

Rozwiązanie proste (bez lambd):

typedef bool (&PorownanieOsob)(const osoba& a, const osoba& b);
// using PorownanieOsob =  bool (&)(const osoba& a, const osoba& b);

void sortujBombelkowo(osoba tablica_osob[], int ileOsob, PorownanieOsob cmp)
{
     … // tutaj twoje sortowanie
    if (!cmp(a, b)) {
         std::swap(a, b);
    }
    …
}

bool PorownajImie(const osoba& a, const osoba& b)
{
       return a.imie < b.imie;
}

sortujBombelkowo(tablica_osob, ilosc_osob;, PorownajImie);

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