Sortowanie struktury

0

Mam takie pytanie.Jak posortowac ta strukture wedlug imienia i jeśli dajmy na to imiona są takie same to wedlug dochodów?

 
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>

using namespace std;
struct pracownicy
{
	char imie[20];
	float przychod;
	char nazwisko[30];
	int wiek;
     
};
void wpisz(pracownicy pracownik)
{
	int wybor=1;
	ofstream plik1("dane_pracownikow.dat",ios::binary | ios::app | ios::out);
	while(wybor)
	{
		
		cout << "Podaj imie pracownika : " << endl;
		cin >> pracownik.imie;
		cout << "Podaj dochod pracownika : " << endl;
		cin >> pracownik.przychod;
		cout << "Podaj nazwisko pracownika : " << endl;
		cin >> pracownik.nazwisko;
		cout << "Podaj wiek pracownika : " << endl;
		cin >> pracownik.wiek;
		plik1.write(reinterpret_cast<char*>(&pracownik),sizeof(pracownicy));
		cout << "Chcesz wpisywac kolejnego pracownika? 1 - TAK, 0 - NIE" << endl;
		cin >> wybor;
		
	}
	
	plik1.close();
}
void wypisz(pracownicy pracownik)
{
	int i=1;
	cout << "------Pracownicy------" << endl;
	ifstream plik("dane_pracownikow.dat",ios::binary);
	for(;;)
        	{
				plik.read(reinterpret_cast<char*>(&pracownik),sizeof(pracownicy));

				if(plik.eof()) 
					break;
					
				cout<<i<<" "<<pracownik.imie<<" "<<pracownik.przychod<<"   "<< pracownik.nazwisko <<" "<< pracownik.wiek  <<endl;
				i++;
			}
	plik.close();
}
void zamiana(pracownicy pracownik)
{
	int k;
	cout << "Podaj numer rekordu ktory chcesz edytowac: " << endl;
	cin >> k;
	cout << "Podaj imie pracownika: " << endl;
	cin >> pracownik.imie;
	cout << "Podaj nazwisko pracownika: " << endl;
	cin >> pracownik.nazwisko;
	cout << "Podaj dochod pracownika : " << endl;
	cin >> pracownik.przychod;
	cout << "Podaj wiek pracownika : " << endl;
	cin >> pracownik.wiek;
	ofstream plik3("dane_pracownikow_zamiana.dat",ios::binary | ios::in | ios::ate);
	plik3.seekp(sizeof(struct pracownicy)*(k-1));
	plik3.write(reinterpret_cast<char*>(&pracownik),sizeof(pracownicy));
	plik3.close();
	
}
void przepisz(pracownicy pracownik)
{
	int i=1;
	ifstream plik("dane_pracownikow.dat",ios::binary);
	ofstream plik1("dane_przepisane.dat",ios::binary | ios::trunc | ios::out);
		while (1)
        	{
				plik.read(reinterpret_cast<char*>(&pracownik),sizeof(pracownicy));

				if(plik.eof()) 
					break;
				
				if((pracownik.przychod>1000)&&(pracownik.przychod<5000)) 
					{
						plik1.write(reinterpret_cast<char*>(&pracownik),sizeof(pracownicy));
					}
			}
	plik.close();
	plik1.close();
	ifstream plik3("dane_przepisane.dat",ios::binary);	
	cout << "pracownicy O PRZYCHODZIE WIEKSZYM NIZ 1000 ORAZ MNIEJSZYM NIZ 5000" << endl;
	while (1)
        	{
				plik3.read(reinterpret_cast<char*>(&pracownik),sizeof(pracownicy));

				if(plik3.eof()) 
					break;
					
				cout<<i<<" "<<pracownik.imie<<" "<<pracownik.nazwisko<<"  "<<pracownik.wiek<<"  "<<pracownik.przychod<<endl;
				i++;
			}
	plik3.close();
		
}
void przepisz_dochody(pracownicy pracownik)
{
	int i=1;
	ifstream plik("dane_pracownikow.dat",ios::binary);
	ofstream plik1("dane_dochody.dat",ios::binary | ios::trunc | ios::out);
		while (1)
        	{
				plik.read(reinterpret_cast<char*>(&pracownik),sizeof(pracownicy)); 

				if(plik.eof()) 
					break;
					
				plik1.write(reinterpret_cast<char*>(&pracownik.przychod),sizeof(pracownik.przychod));
			}
	plik.close();
	plik1.close();
	ifstream plik3("dane_dochody.dat",ios::binary);
	cout << "--------------DOCHODY----------------" << endl;	
	while (1)
        	{
				plik3.read(reinterpret_cast<char*>(&pracownik.przychod),sizeof(pracownik.przychod));

				if(plik3.eof()) 
					break;
					
				cout<<i<<" "<<pracownik.przychod<<endl;
				i++;
			}
	plik3.close();
}

void wyszukaj_pracownika(pracownicy pracownik)
{
char im[30];
cin>>im;
	ifstream plik("dane_pracownikow.dat",ios::binary);
	int i=1;
		while (1)
        	{
				plik.read(reinterpret_cast<char*>(&pracownik),sizeof(pracownicy));

				if(plik.eof()) 
					break;
					
				if(!strcmp(pracownik.imie,im))
				cout<<" "<<pracownik.nazwisko<<"  "<<pracownik.wiek<<"  "<<pracownik.przychod<<endl;
				
			}
	plik.close();
	
}
bool usun_pracownika(pracownicy pracownik)
{
char t[20];

bool u=false; 

cout<<"Podaj tytul: ";

cin>>t;

ifstream plik("dane_pracownikow.dat", ios::binary);

ofstream zapis("dane2.dat", ios::binary);

zapis.seekp(0,ios::beg); 
if(!plik or !zapis) return 0; 
while(1)

{
plik.read(reinterpret_cast<char*>(&pracownik),sizeof(pracownicy));
if(plik.eof()) break;
if(strcmp(pracownik.imie,t)) zapis.write(reinterpret_cast<char*>(&pracownik),sizeof(pracownicy)); 
else u=true; 
}
plik.close();
zapis.close();
system("dane_pracownikow.dat"); 
system("ren dane2.dat dane.dat");
return u; 
}		

 void sortowanie_po_imieniu(pracownicy pracownik)
 {
 
 
 
 }
 void wypisz_dochody(pracownicy pracownik)
{
  int i=0;
        char im[30];
        cout<<"podaj imie pracow ";
        cin>>im;
        ifstream plik("dane_pracownikow.dat",ios::binary);
        for(;;)
        {
                plik.read(reinterpret_cast<char*>(&pracownik),sizeof(pracownicy));
                if(plik.eof())
                break;
                if(!strcmp(pracownik.imie,im))
                cout<<" "<<pracownik.przychod;
               
 
 
 
        }
 
 plik.close();
 
}
main()
{
	int wybor;
	ofstream plik1("dane_pracownikow.dat",ios::binary | ios::app | ios::out);
pracownicy pracownik;
char znak;
do{

	cout << "--------MENU--------" << endl
	 << "1. Wpisanie danych pracownikow." << endl
	<< "2. Wypisanie danych pracownikow. " << endl
 << "3. Zmiana informacji o pracowikach . " << endl
	<< "4. Przepisz dane o '1000 < przychod < 5000' do nowego pliku!" << endl
 << "5. Przepisz same dochody pracownikow do nowego pliku" << endl
 <<" 6. Wyszukaj pracownika"<<endl
 <<" 7. Usun pracownika"<<endl
 <<" 8. Sortowanie po imieniu"<<endl
 <<" 9. wypisz dochody jakiejs osoby"<<endl
	 << "0. EXIT " << endl
	 << "Twoj wybor: " << endl;
	cin >> wybor;		
	switch(wybor)
		{
					case 1:
						{
							
							wpisz(pracownik);
							
						}
					break;
					
					case 2:
						{
							
							wypisz(pracownik);
							
						}
					break;
					
					case 3:
						{
							
							wypisz(pracownik);
							zamiana(pracownik);
							
						
						}
					break;
					
					case 4:
						{
							
							przepisz(pracownik);
							
						}
					break;
					
					case 5:
						{
							przepisz_dochody(pracownik);
						
						}
					break;
					case 6 :
						wyszukaj_pracownika(pracownik);
					break;
					
					case 7 :
						usun_pracownika(pracownik);
						if(!usun_pracownika(pracownik)) cout<<"Nie udalo sie usunac rekordu z pracownicy.dat"<<endl;
					break;
					case 8 :
						sortowanie_po_imieniu(pracownik);
						
						break;
				   case 9:
				   	wypisz_dochody(pracownik);
				   	break;
					case 0:
						{
						system("cls");
						cout << "Konczymy program. " << endl;
						}
					break;
					
					default:
						{
						system("cls");
						cout << "Zly wybor! " << endl;
						}
					break;
		
		}
		cout<<"dalej czy zakonczyc   \n ?"
		" wcisnij t ,aby dalej n,aby przerwac ";
		cin>>znak;
	}while(znak!='n');
system ("Pause");      
}
0
int cmp(pracownicy A,pracownicy B)
  {
   int v=strcmp(A.imie,B.imie);
   if(!v) v=(A.przychod>B.przychod)-(A.przychod<B.przychod);
   return v;
  }

Dalej używasz dowolny algorytm sortowania (no prawie), ale zamiast:
if(A.przychod>B.przychod) ...
używasz:
if(cmp(A,B)>0) ...

0
struct Pracownicy {
    char imie[20];
    float przychod;
    char nazwisko[30];
    int wiek;
    bool operator() (const Pracownicy& _pp, const Pracownicy& _dp) {
         int result = strcmp(_pp.imie, _dp.imie); 
	 return result ? result > 0 : _pp.przychod > _dp.przychod;
    }
} 

// (...)
std::sort(pracownicy.begin(), pracownicy.end(), Pracownicy());

0

To jak zrobić by to było optymalnie zrobione?:P

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