Program sortujacy


(Jewart) #1

witam. mam problem z programem sortującym. ma on sortować pracowników wg imienia, nazwiska i pensji. program się kompiluje jednak w pierwszej pętli for (i=0;i<5;i++) coś jest chyba nie tak. uruchamiam program, wpisuje imię i nazwisko pierwszego pracownika potem jego pensje wciskam enter a na ekranie pojawia się "Podaj imie i nazwsko 2-ego pracownika: Podaj pensje" wciskam enter i dalej "Podaj imie i nazwisko 3-ego pracownika: Podaj pensje" i tak dla wszystkich 5 pracowników. Tak jakby program wykonał tylko raz funkcje getline a potem ja omijał. mimo ze znajduje ona się w pętli for. proszę o pomoc. zależy mi na czasie. pozdrawiam i z góry dziękuje za jakikolwiek odzew.

#include 

#include 

#include 

using namespace std;

struct Pracownik{

       int pensja;

       string imie;

       string nazwisko;

       };

int main()

{

int i,j,wybor;

string osoba;

Pracownik osoby[5];

Pracownik temp;

int wsk;



for (i=0;i<5;i++) 

{    

cout<<"Podaj imie i nazwisko "<


getline(cin, osoba); // pobiera cala linie az do entera

wsk = osoba.find(" "); // szuka spacji i umiesci gdzie sie ona znajduje w 'wsk'

osoby[i].imie = osoba.substr(0, wsk); // wycina imie, czyli ciag znakow do spacji

osoby[i].nazwisko = osoba.substr(wsk+1); //wycina nazwisko, jeden znak po spacji az do konca ciagu znakow 


cout<<"Podaj pensje: ";

cin>>osoby[i].pensja;

}





system("cls");


cout<<"1. Sortowanie wg. imienia"<
cout<<"2. Sortowanie wg. nazwiska"<
cout<<"3. Sortowanie wg. pensji"<
cout<<"0. Wyjscie z programu";

cin>>wybor;

system("cls");

switch (wybor){

case 1: 

for (i=0;i<4;i++)

   for (j=i+1;j<5;j++)     

       if (osoby[i].imie>osoby[j].imie)

          {

            temp=osoby[i];

            osoby[i]=osoby[j];

            osoby[j]=temp;                        

                            }

            break;   

case 2: 

for (i=0;i<4;i++)

   for (j=i+1;j<5;j++)     

       if (osoby[i].nazwisko>osoby[j].nazwisko)

          {

            temp=osoby[i];

            osoby[i]=osoby[j];

            osoby[j]=temp;                        

                            }

            break;        

case 3: 

for (i=0;i<4;i++)

   for (j=i+1;j<5;j++)     

       if (osoby[i].pensja>osoby[j].pensja)

          {

            temp=osoby[i];

            osoby[i]=osoby[j];

            osoby[j]=temp;                        

                            }

            break;  

default:

        break;       

      }

for (i=0;i<5;i++)

   cout<


 getch(); 


}[/code]

Nie wiem czy to ma związek z problemem, ale wcześniej zamiast funkcji getline miałem zwykłe cin i nie było konieczności rozdzielania imienia i nazwiska poprze find i substr. wtedy wszystko było ok, jednak wykładowca nakazał aby program wczytywał imię i nazwisko getlinem i je potem rozdzielał.

PS program próbowałem na dwóch komputerach z windows 7 i programem DevC++ na obu to samo...


(Copycona) #2

Niewyczyszczony bufor. Zostaje tam znak nowej linii, który wyciąga się przy kolejnym przebiegu, wspomnianej przez Ciebie, pętli for wraz z getline. Tak oto ta instrukcja zostaje "pominięta".

Więcej info: jeżeli masz Symfonię C++ przeczytaj:

Proponuję dodać jako ostatnią instrukcję tej pętli to:

cin.sync(); [/code]

http://www.cplusplus.com/reference/iost ... ream/sync/

i ...

skoro używasz funkcji system() potrzebujesz jeszcze:

http://www.cplusplus.com/reference/clib ... ib/system/

[code=php]#include     


(Jewart) #3

dzięki bardzo za szybką odpowiedź, teraz już wszystko gra :slight_smile: mam natomiast inny problem. program ma robić to samo czyli sortować ale nie bąbelkowo a przez qsorta. gdy w struct Pracownik imię i nazwisko sa typu char i wczytywane przez cin to program działa. jednak gdy zamienię je na string i wczytuję getlinem wyrzuca błąd:

C:\Users\Dany\Desktop\qsort1.cpp In function `int wg_imion(const void*, const void*)':

17 C:\Users\Dany\Desktop\qsort1.cpp expected primary-expression before '*' token

17 C:\Users\Dany\Desktop\qsort1.cpp expected primary-expression before '*' token

#include 

#include 

#include 

#include 

#include 

using namespace std;

struct Pracownik{

       int pensja;

       string imie;

       string nazwisko ;

       };


 int wg_imion(const void*wsk_1, const void*wsk_2) // comparison function

{

    struct Pracownik *osoba_1 = (struct Pracownik*) wsk_1;

    struct Pracownik *osoba_2 = (struct Pracownik*) wsk_2;

    return (strcmp( string *osoba_1->nazwisko, string *osoba_2->nazwisko));

}


int main(){

int i,j,wybor,test,wsk;

string osoba ;

Pracownik osoby[5];

Pracownik temp;


for (i=0;i<5;i++) {    

cout<<"Podaj imie i nazwisko "<
//cin>>osoby[i].imie>>osoby[i].nazwisko;

getline(cin, osoba); // pobiera cala linie az do entera

wsk = osoba.find(" "); // szuka spacji i umiesci gdzie sie ona znajduje w 'wsk'

osoby[i].imie = osoba.substr(0, wsk); // wycina imie, czyli ciag znakow do spacji

osoby[i].nazwisko = osoba.substr(wsk+1); //wycina nazwisko, jeden znak po spacji az do konca ciagu znakow 

cout<<"Podaj pensje: ";

cin>>osoby[i].pensja;

cin.sync(); 

}





cout<

    //int a[] = { -2, 99, 0, -743, 2, 3, 4 };

    int size = 5;


    qsort(osoby, size, sizeof(struct Pracownik), wg_imion);


    for (int i = 0; i < size; i++) 

    {

        cout << osoby[i].nazwisko ;

    }




    return 0;

    system ("pause");

    getch();

}[/code]

(Sawyer47) #4

W komunikacie błędu na linie do której się on odnosi - 17.

return (strcmp( string *osoba_1->nazwisko, string *osoba_2->nazwisko));

Skoro zmieniłeś typo pola to musisz też zmienić sposób porównywania. std::string ma przeładowane operatory porównania, których możesz użyć.