sortowanie struktury

0

mam taki oto algorytm sortowania struktury:

for(i=1;i<number_of_people-2;i++)
        {
                for(j=number_of_people;j>=1;j--)
                {
                        while((people[j].surname[k]!=NULL)&&(people[j-1].surname[k]!=NULL))
                        {
                                if((people[j].surname[k]!=people[j-1].surname[k])&&(people[j].surname[k]<people[j-1].surname[k]))
                                {
                                        temp=people[j];
                                        people[j]=people[j-1];
                                        people[j-1]=temp;
                                        break;
                                }
                                else k++;
                        }
                }
        }

wydaje się że wszystko w zapisie jest ok ale jednak sortuje wg. nazwiska nie w sposób alfabetyczny lecz w jakiś bliżej nieokreślony, jeżeli ktoś ma jakiś pomysł gdize jest bład to proszę o odpowiedz.

0

jezeli nazwisko nie jest jakims AnsiStringiem tylko tablica char[] to nie mozesz tak jej porownac, tylko musisz uzyc strcmp().

0

zauważ że porównuje nie całe tablice tylko ich elementy [k] co zrobić można

(people[j].surname[k]!=people[j-1].surname[k])
</cpp>
0

A nie prościej zdefiniować funkcję do porównywania 2 struktur (instancji struktur? ;>) i użyć qsort ze stdliba ?

pzdr,
y.

0

Moja propozycja jest taka:
zakladajac ze struktura wyglada mniej wiecej tak:


```cpp
struct osoba {
  string imie,nazwisko;
};

mozna zdefiniowac funkcje porownujaca:
bool porownaj(const osoba& lewa,const osoba& prawa) {
  return lewa.nazwisko<prawa.nazwisko ||
  lewa.nazwisko==prawa.nazwisko && lewa.imie<lewa.imie;
}

Teraz zalaczajac plik naglowkowy algorithm uzywasz funkcji sort (zakladam ze masz tablice osob):
osoba tab[100];
sort(tablica,tablica+100,porownaj);

0

thx ale gdyby ktoś przejrzał ten kod w poszukiwaniu błędów bo musze to zrobić bąbelkowym...

0

Heh, trudno wyczuć co Ty za struktury wymyśliłeś? I czemu napisy porównujesz przy pomocy != ? Czy to są obiekty czy to char * ? Poza tym w bąbelkowym było porównywanie praktycznie każdy z każdym czyli 2 pętle for, zaś u Ciebie jeszcze jakieś while się pojawia.

pzdr,
y.

0

Dokladnie tego nie analizowalem ale nie widze definicji zmiennej k ktorej uzywasz, moze to powoduje bledy?
Zamiast porownywac znak po znaku nie lepiej uzyc funkcji bibliotecznych ze string.h?
Moglbys tez zamiescic ta strukture.

0

cały kod

struct person
{
        char name[100];
        char surname[100];
        char phone[100];
};

int compare(char a,char b);
void swap(person *a,person *b);

void main()
{
        int i,j,k=0,number_of_people=7;
        person people[10];
        ifstream in;
        in.open("d:\d.in");
        if(in.fail())
        {
                cout<<"error while opening the file";
                exit(1);
        }
        for(i=0;i>-1;i++)
        {
                if(in.eof()) break;
                in>>people[i].name;
                in>>people[i].surname;
                in>>people[i].phone;
        }
        in.close();
        for(i=1;i<number_of_people-2;i++)
        {
                for(j=number_of_people;j>=1;j--)
                {
                        while((people[j].surname[k]!=NULL)&&(people[j-1].surname[k]!=NULL))
                        {
                                if(compare(people[j].surname[k],people[j-1].surname[k])==1)
                                {
                                        swap(&people[j],&people[j-1]);
                                        break;
                                }
                                else
                                {
                                        if(people[j].surname[k]>people[j-1].surname[k]) break;
                                        else k++;
                                }

                        }
                }
        }
        for(i=0;i<7;i++)
        {
                cout<<people[i].name<<" "<<people[i].surname<<" "<<people[i].phone<<"\n";
        }
        getch();
}

int compare(char a,char b)
{
        if((a!=b)&&(a<b)) return 1;
        else return 0;
}

void swap(person *a,person *b)
{
        person temp;
        temp=*a;
        *a=*b;
        *b=temp;
}

rozbiłem to tylko na funkcje ale to dalej to samo i ten sam problem

0

Jesli musi byc babelkowo.. a moze byc string zamiast tablicy char[]??


```cpp
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

//----------------------

class person {

public:

	friend istream& operator>>(istream& is,person& p) {
		return is>>p.surname>>p.name>>p.phone;
	}
	
	friend ostream& operator<<(ostream& os,const person& p) {
		return os<<p.surname<<" "<<p.name<<" "<<p.phone;
	}
	
	friend bool operator>(const person& left,const person& right) {
		return left.surname>right.surname ||
		left.surname==right.surname && left.name>right.name;
	}

private:

	string surname,name,phone;

};

//----------------------

void swap(person& left,person& right) {
	person tmp=left;
	left=right;
	right=tmp;
}

//----------------------

void bubble(person* arr,const unsigned size) {
	for(unsigned i=0;i<size;++i)
		for(unsigned j=0;j<size-1;++j) if(arr[j]>arr[j+1]) swap(arr[j],arr[j+1]);
}

//######################

int main(){
	const unsigned max=10;
	person people[max];
	ifstream in("in.txt");
	if(!in) {
		cout<<"error opening file";
		return 1;
	}
	unsigned N=0;
	for(;N<max && in>>people[N];++N);
	in.close();
	bubble(people,N);
	ofstream out("out.txt");
	if(!out) {
		cout<<"error creating file";
		return -1;
	}
	for(unsigned i=0;i<N-1;++i) out<<people[i]<<endl;
	out<<people[N-1];
	out.close();
}

0

thx

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