Sortowanie struktur

Sortowanie struktur
V3
  • Rejestracja:około 7 lat
  • Ostatnio:około 5 lat
  • Postów:13
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!!!!

Kopiuj
#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);
   
}

edytowany 1x, ostatnio: Vincent363
sugar_hiccup
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 2 lata
  • Postów:176
0

program się kompiluje

A to ciekawe, bo mi wywala 3 errory.


My to na arm napiszemy wszystko i zrobimy co chcemy tyle że 90% kodu to biblioteki z netu albo robota kompilatora Zdajesz sobie sprawę że tak na prawdę wyższy poziom języka może świadczyć jedynie o tym jak niskim poziomem wiedzy może dysponować bałwan,który nazwie się w rezultacie programistą i napisze działający program wciskając zleceniodawcy że tam to akurat musi być 100MHz ARM z 1M pamięci bo tak na prawdę jego pusta łepetyna nie potrafi zrealizować czegoś na innym słabszym mikrokontrolerze
V3
  • Rejestracja:około 7 lat
  • Ostatnio:około 5 lat
  • Postów:13
0

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

a co tam piszą? :)

edytowany 1x, ostatnio: Vincent363
BG
  • Rejestracja:prawie 6 lat
  • Ostatnio:około godziny
  • Postów:289
0

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

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


bool wczytajJednaOsobe(struct Osoba* osoba)
{
    std::cout << "Podaj imie: ";
    std::cin >> osoba->imie;
kq
I tak i nie, w C to może być sensowna struktura (VLS)
V3
  • Rejestracja:około 7 lat
  • Ostatnio:około 5 lat
  • Postów:13
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

BG
  • Rejestracja:prawie 6 lat
  • Ostatnio:około godziny
  • Postów:289
2

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

Zobacz pozostałe 12 komentarzy
V3
nie czuje się odważny, ani mocny z c/c++ mało przyjazny język dla mnie... btw. nie widze takiej opcji w settings/compiler
BG
O, -Weffc++ nie znałem ;)
enedil
"Clang ogólnie ma chyba czytelniejsze komunikaty niż gcc" -> często tak, ale zdarza się całkiem odwrotnie, jakiś czas temu clang mi coś takiego wyprodukował: https://imgur.com/a/myanqJQ
BG
@Vincent363: Project->build options->compiler flags
V3
Note: all programs must exist either in the "bin" sub-directory of this path or in any the "additionals paths"
V3
  • Rejestracja:około 7 lat
  • Ostatnio:około 5 lat
  • Postów:13
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 :)

BG
Przecież nie poprawiłeś tego co Ci pokazałem...
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 2 godziny
  • Postów:4935
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.


BG
Ja bym zostawił tą strukturę (co najwyżej zmienił jej nazwę). To może być wstęp do pisania klasy reprezentującej taką prostą bazę danych. Sam coś takiego studentom czasem każę zrobić.
lion137
Mam na uwadze łatwiejsze debugowanie, ale jak tak to tak:-)
V3
  • Rejestracja:około 7 lat
  • Ostatnio:około 5 lat
  • Postów:13
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 :)

edytowany 1x, ostatnio: Vincent363
BG
  • Rejestracja:prawie 6 lat
  • Ostatnio:około godziny
  • Postów:289
1

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

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

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

Kopiuj
std::cin.getline(osoba[i].imie, 20);
V3
wow ;p dzięki za info. nic o tym na zajeciach nie było! :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.