Sortowanie struktur

0

Hej, na laborki ze studiów, muszę oddać program który wczytuje ilość osób, imie nazwisko, date urodzenia (dzien, miesiac, rok) posortować po roku i zwrócić liste nazwisk od najstarszych.
Wszystko fajnie, program się kompiluje ale wywala mi po wpisaniu wszystkich użytkowników.. Nie wiem ocb... Help!!!!

#include <iostream>

int const maxOsob = 40;

struct Data
{
	int rok;
	int miesiac;
	int dzien;
};
 
struct Osoba
{
	struct Data data;
    char imie[] ;
    char nazwisko[];
};
 
struct Osoby
{
    struct Osoba osoby[maxOsob];
    int liczba_Osob;
};

bool wczytajDate(struct Data* data)
{
    std::cout << "dzień=";
    std::cin >> data->dzien;
    if (std::cin.fail())
        return false;
    std::cout << "miesiac=";
    std::cin >> data->miesiac;
    if (std::cin.fail())
        return false;
    std::cout << "rok=";
    std::cin >> data->rok;
    if (std::cin.fail())
        return false;
    return true;
}



bool wczytajJednaOsobe(struct Osoba* osoba)
{
    std::cout << "Podaj imie: ";
    std::cin >> osoba->imie;
    std::cout << "Podaj nazwisko: ";
    std::cin >> osoba->nazwisko;
    if (std::cin.fail())
        return false;
 	if (!wczytajDate(&(osoba->data)))
        return false;
    return true;
}

void sortowanie(struct Osoby *osoby)
{

	for (int i = 1; i < osoby->liczba_Osob; i++)
		for (int j = 0; j < (osoby->liczba_Osob - i); j++) 
		{
			if (osoby->osoby[j].data.rok < osoby->osoby[j + 1].data.rok ) 
			{ 
				Osoby temp;
				temp = osoby[j];
				osoby[j] = osoby[j + 1];
				osoby[j + 1] = temp;
			}
		}
}

bool wczytajOsoby(struct Osoby* osoby)
{
    osoby->liczba_Osob = 0;
    int liczba_Osob;
    std::cout << "Podaj liczbe osob";
    std::cin >> liczba_Osob;
    if (std::cin.fail())
        return false;
    if (liczba_Osob<0 || liczba_Osob>maxOsob)
        return false;
 
    for (int i = 0; i < liczba_Osob; i++)
    {
        if (!wczytajJednaOsobe(&(osoby->osoby[i])))
            return false;
    }
    osoby->liczba_Osob = liczba_Osob;
    
    return true;
}

void wyswietl_nazwiska(struct Osoby* osoby)
{
	std::cout << "Lista nazwisk posortowanych";
	for(int i=0; i<=osoby->liczba_Osob; i++){
		std::cout << " ";
		std::cout << osoby->osoby[i].nazwisko;
	}
	
}


int main()
{
  struct Osoby osoby;
   
    if (!wczytajOsoby(&osoby))
    {
        std::cout << "Niepoprawne dane.\n";
        return 0;
    }
    
	sortowanie(&osoby);
   	wyswietl_nazwiska(&osoby);
    
    
//    sorotwanie()
//    wyswietlOsoby(&osoby);
   
}

0

program się kompiluje

A to ciekawe, bo mi wywala 3 errory.

0

ba, nawet moge wpisać wszystkie dane, i po wpisaniu wywala. eh..

a co tam piszą? :)

0

Za coś takiego programistów się zwalnia a studentów oblewa.

struct Osoba
{
...
    char imie[] ;
...
};


bool wczytajJednaOsobe(struct Osoba* osoba)
{
    std::cout << "Podaj imie: ";
    std::cin >> osoba->imie;
0

jak na kolokwium dałem typ string. to mnie oblał profesor bo nie było na zajęciach jeszcze i powinna być tablica char....
n/c

2

Ale tu nie chodzi o to ze to tablica char...

0

#include <iostream>
int const maxOsob = 40;

struct data
{
int rok;
int miesiac;
int dzien;
};

struct osoba
{
struct data Data ;
char imie[] ;
char nazwisko[];
};

struct osoby
{
struct osoba Osoby[maxOsob];
int liczba_Osob;
};

bool wczytajDate(data Data)
{
std::cout << "dzieñ=";
std::cin >>Data.dzien;
if (std::cin.fail())
return false;
std::cout << "miesiac=";
std::cin >> Data.miesiac;
if (std::cin.fail())
return false;
std::cout << "rok=";
std::cin >> Data.rok;
if (std::cin.fail())
return false;
return true;
}

void sortowanie(osoby Osoby[maxOsob])
{

struct osoby temp;
for (int i = 1; i < Osoby->Osoby.liczba_Osob; i++)
    for (int j = 0; j < Osoby->liczba_Osob - i; j++)
    {
        if (Osoby[j].Osoby->Data.rok > Osoby[j + 1].Osoby->Data.rok)
        {
            temp = Osoby[j];
            Osoby[j] = Osoby[j + 1];
            Osoby[j + 1] = temp;
        }
    }

}

bool wczytajOsoby(osoby Osoby)
{
int liczba_Osob;
std::cout << "Podaj liczbe osob";
std::cin >> Osoby.liczba_Osob;
if (std::cin.fail())
return false;
if (liczba_Osob<0 || Osoby.liczba_Osob>40)
return false;

for (int i = 0; i < Osoby.liczba_Osob; i++)
{
	std::cout << "Podaj imie: ";
	std::cin >> Osoby.Osoby[i].imie;
	std::cout << "Podaj nazwisko: ";
	std::cin >> Osoby.Osoby[i].nazwisko;
	if (std::cin.fail())
	     return false;
	if (!wczytajDate(Osoby.Osoby->Data))
	        return false;

}
Osoby.liczba_Osob = liczba_Osob;

return true;

}

void wyswietl_nazwiska( osoby Osoby)
{
std::cout << "Lista nazwisk posortowanych";
for(int i=0; i<=Osoby.liczba_Osob; i++){
std::cout << " ";
std::cout << Osoby.Osoby[i].nazwisko;
}

}

int main()
{
struct osoby Osoby;

if (!wczytajOsoby(Osoby))
{
    std::cout << "Niepoprawne dane.\n";
    return 0;
}

sortowanie(&Osoby);
wyswietl_nazwiska(Osoby);

}>

Poprawione, tym razem wysypuje się na sortowainu... ale to jutro ... a okazało się, że mój debuger nic nie znalazł bo go nie było :)

0

Popraw błędy wykryte wcześniej. Ja bym to uprościł: wywalić strukturę osoby- tworzyć tablice osób; ta tablice wysyłać do sortowania; oraz, z sortowania wydzielić logikę porownywania- osobna funkcja compare, będzie łatwiej debugować. Po dopisaniu kolejnej funkcji, bardzo dokładnie ją Testuj.

0

@lion137: Posłuchałem Twojej rady i poszło dużo łatwiej :)

Program działa i ma się dobrze, jutro idę oddać :)

#include <iostream>

const int MAX_OSOB = 40;

struct Data
{
int dzien;
int miesiac;
int rok;
}data;

struct Osoba
{
char imie[20];
char nazwisko[20];
struct Data data;
}osoba[MAX_OSOB];

void wypelnij(int* ileOsob, Osoba osoba[MAX_OSOB])
{
for (int i = 0; i < *ileOsob; i++)
{
std::cout << i + 1 << "." << std::endl;
std::cout << "Podaj imie: " << std::endl;
std::cin >> osoba[i].imie;
std::cout << " Podaj nazwisko: " << std::endl;
std::cin >> osoba[i].nazwisko;
std::cout << "Podaj dzien urodzenia:" << std::endl;
std::cin >> osoba[i].data.dzien;
std::cout << "Podaj miesiac urodzenia:" << std::endl;
std::cin >> osoba[i].data.miesiac;
std::cout << "Podaj rok urodzenia:" << std::endl;
std::cin >> osoba[i].data.rok;

}
}

void sortowanie(Osoba osoba[MAX_OSOB], int* ileOsob)
{
struct Osoba temp;
for (int i = 1; i < *ileOsob; i++)
for (int j = 0; j < *ileOsob - i; j++)
{
if (osoba[j].data.rok > osoba[j + 1].data.rok)
{
temp = osoba[j];
osoba[j] = osoba[j + 1];
osoba[j + 1] = temp;
}
}
}

void wyswietl(Osoba osoba[MAX_OSOB], int *ileOsob)
{
for (int i = 0; i < *ileOsob; i++)
{
std::cout << "";
std::cout << " Lista nazwisk według wieku uporządkowana malejąco ";
std::cout << osoba[i].nazwisko << std::endl;
}
}

int main()
{
int ileOsob=0;
std::cout << "Ilu osob dane chcesz wprowadzic? " << std::endl;
std::cin >> ileOsob;
wypelnij(&ileOsob, osoba);
wyswietl(osoba, &ileOsob);
}>

Dla potomoności, jakby ktoś miał podobny problem :)

1

OK, widzę że tego sam nie znajdziesz...
Jak wczytujesz dane do tablicy znakowej, to nie możesz tego robić tak jak to robisz

std::cin >> osoba[i].imie;

Przy takim wczytywaniu nie masz szans zabezpieczyć się przed przekroczeniem rozmiaru tablicy.
Dużo bezpieczniejsze byłoby

std::cin.getline(osoba[i].imie, 20);

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