Program wysypuje się po wpisaniu osób – gdzie leży błąd?

0

Witam
napisałem taki o to program, całość kompiluje się prawidłowo. Docelowo program miał zebrać wpisane osoby podzielić na płcie i wyświetlić oddzielnie.

Program wysypuje się po wpisaniu osób czy ktoś mógłby spojrzeć na kod i naprowadzić mnie gdzie leży błąd?

#include <stdio.h>
#include <string.h>
#include <stdbool.h>


struct Osoba
{
    char imie[10];
    char nazwisko[20];
    bool plec;  //TRUE MEZCZYZNA | FALSE KOBIETA
};

struct Osoby
{
    struct Osoba osoby[40];
    int ilosc_osob;
};

void wczytajOsoby( struct Osoby * osoba );
void wczytajOsobe( struct Osoba * osoba );
void sortujOsoby( struct Osoby * osoby );
void wyswietlOsoby( struct Osoby * osoby );

int main()
{
    struct Osoby osoby;
    wczytajOsoby(&osoby);
    sortujOsoby(&osoby);
    wyswietlOsoby(&osoby);
    return 0;
}

void wczytajOsoby(struct Osoby * osoby) // WCZYTYWANIE OSOB
{
    printf( "Podaj liczbe osob:");
    scanf( "%d", &(osoby->ilosc_osob) );
    for( int i = 0; i < osoby->ilosc_osob; ++i)
        wczytajOsobe(&(osoby->osoby[i]));
}

void wczytajOsobe( struct Osoba * osoba ) // WCZYTYWANIE OSOBY
{
    puts("Podaj imie: ");
    scanf("\n%s",osoba->imie);
    puts("Podaj nazwisko: ");
    scanf("\n%s",osoba->nazwisko);
    if(strlen(osoba->nazwisko)-1 == 'a')
        {
            osoba->plec = false;
        }
    else
    {
        osoba->plec = true;
    }
}

void sortujOsoby( struct Osoby * osoby ) // SORTOWANIE OSOB
{
    for(int i=0; i < osoby->ilosc_osob; i++)
    {
        for(char schowek[20]; strcmp(osoby->osoby[i].nazwisko, osoby->osoby[i+1].nazwisko)>0;)
        {
            schowek[20]= osoby->osoby[i].nazwisko[20];
            osoby->osoby[i].nazwisko[20] = osoby->osoby[i+1].nazwisko[20];
            osoby->osoby[i+1].nazwisko[20]= schowek[20];
        }
    }
}

void wyswietlOsoby( struct Osoby * osoby )  // WYSWIETLANIE OSOB
{
    printf("MEZCZYZNI:/n");
    for(int i=0; i < osoby->ilosc_osob; i++)
        {
            if (osoby->osoby[i].plec == true)
            {
                printf("Imie:%s  Nazwisko:%s",osoby->osoby[i].imie,osoby->osoby[i].nazwisko);
            }
        }
    printf("KOBIETY:/n");
    for(int i=0; i < osoby->ilosc_osob; i++)
        {
            if (osoby->osoby[i].plec == false)
            {
                printf("Imie:%s  Nazwisko:%s",osoby->osoby[i].imie,osoby->osoby[i].nazwisko);
            }
        }
}
0
  1. W funkcji wczytajOsobe(..) masz funkcję strlen(). Co ona robi?
if(strlen(osoba->nazwisko)-1 == 'a')
  1. W funkcji sortujOsoby(..) wychodzisz poza zakres tablicy:
i < osoby->ilosc_osob
..
osoby->osoby[i+1]
  1. Sortujesz tylko nazwiska a imiona anie płeć - nie.
0
jawlo napisał(a):
  1. W funkcji wczytajOsobe(..) masz funkcję strlen(). Co ona robi?
if(strlen(osoba->nazwisko)-1 == 'a')
  1. W funkcji sortujOsoby(..) wychodzisz poza zakres tablicy:
i < osoby->ilosc_osob
..
osoby->osoby[i+1]
  1. Sortujesz tylko nazwiska a imiona anie płeć - nie.
  1. Ta linijka miała za zadanie rozpoznać czy ostatnią literą nazwiska jest "a". (taki jakby dostałem w zadaniu warunek na rozdzielanie płci)
    Poprawiłem już na
 if(osoba->nazwisko[strlen(osoba->nazwisko)-1] == 'a')
  1. No faktycznie o tym nie pomyślałem jakiś pomysł co mógłbym zrobić?
    Teoretycznie testując program nie wpisałem 40 osób więc wyjscie poza tablice nie miało miejsca.
    Poprawiłem pętle na taką
void sortujOsoby( struct Osoby * osoby ) // SORTOWANIE OSOB
{
    for(int i=0; i < osoby->ilosc_osob; i++)
    {
        for(int j=1; j <= osoby->ilosc_osob; j++)
            {
                for(char schowek[20]; strcmp(osoby->osoby[i].nazwisko, osoby->osoby[j].nazwisko)>0;)
                {
                    schowek[20]= osoby->osoby[i].nazwisko[20];
                    osoby->osoby[i].nazwisko[20] = osoby->osoby[j].nazwisko[20];
                    osoby->osoby[j].nazwisko[20]= schowek[20];
                }
            }
    }
}
  1. A to nie powinno być tak że jak przestawiam nazwiska w tablicy to przypisane im imiona i płcie idą razem z nimi?
    Przeglądając na internecie pętle na sortowanie alfabetyczne wszystkie wyglądały bardzo podobnie do mojej nikt nie sortował wszystkich wartości tylko po jednej.
0

Ta linijka miała za zadanie rozpoznać czy ostatnią literą nazwiska jest "a". (taki jakby dostałem w zadaniu warunek na rozdzielanie płci)
Poprawiłem już ())

No to masz Panią Katarzynę Fiołek. Co wtedy? :]
Pewnie Bracie powiesz, że będziesz sprawdzał ostatnią literę imienia. Będzie fajnie, póki nie dostaniesz wizytówki:

Sz. P. Pirat Barnaba

0
MasterBLB napisał(a):

Ta linijka miała za zadanie rozpoznać czy ostatnią literą nazwiska jest "a". (taki jakby dostałem w zadaniu warunek na rozdzielanie płci)
Poprawiłem już ())

No to masz Panią Katarzynę Fiołek. Co wtedy? :]
Pewnie Bracie powiesz, że będziesz sprawdzał ostatnią literę imienia. Będzie fajnie, póki nie dostaniesz wizytówki:

Sz. P. Pirat Barnaba

Ja rozumiem że to nie jest idealny pomysł na rozdzielanie wy naprawdę nie musicie mi tego udowadniać :p
Po prostu takie dostałem wytyczne w zadaniu więc się do nich stosuje.

1

Wędka zamiast ryby:

  1. Uruchom aplikację w trybie debug
  2. odtwórz crash
  3. Aplikacja się zatrzyma w momencie crash-a
  4. Znajdź okienko "Call stack"
  5. Klikaj przez jego kolejne pozycje
  6. Jak natrafisz na swój kod, to analizuj wartości zmiennych (debuger pokarze).

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