• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Struktura danych C++

0 głosów
752 wizyt
pytanie zadane 29 marca 2019 w C i C++ przez Skidrowed Nowicjusz (120 p.)
edycja 29 marca 2019 przez Skidrowed

Cześć wszystkim,

czy ktoś mógłby mi zrobić porządek z kodem? Sam się już pogubiłem co i jak. Myślę, że to przez to iż najpierw zacząłem pisać program bez struktury danych, wszystko ładnie działało, a dopiero później wziąłem się za strukturę i wystąpiły problemy. 

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

struct Osoba
{
    char nazwisko[40];
    char imie[30];
    bool kobieta;
};

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

};


void wczytajOsoby( struct Osoby * osoby);
void sortujOsoby(struct Osoby * osoby);
void wypiszOsoby(struct Osoby * osoby);
void wyswietlOsobe(struct Osoby * osoby);
void wczytajOsobe(struct Osoby * osoby);


int main()
{
    struct Osoby osoby;
    wczytajOsoby( & osoby );
    sortujOsoby( & osoby );
    wypiszOsoby( & osoby );
    wyswietlOsobe( & osoby );
    wczytajOsobe( & osoby );
    return 0;
}
void wczytajOsoby( struct Osoby * osoby)
{

    printf("Ilosc danych do wpisania: ");
    scanf("%d", & osoby->ilosc_osob);

    for (int i=0;i<osoby->ilosc_osob;i++)
        wczytajOsobe( & osoby->osoby[i] );
}


bool wczytajOsobe( struct Osoba * osoba )
{
        printf("Podaj naziwsko: ");
        scanf("%s", & osoba->nazwisko);
        printf("Podaj imie: ");
        scanf("%s", osoba->imie);
        if(osoba->imie[strlen(osoba->imie)-1]=='a')
            osoba->kobieta='k';
}

void wypiszOsoby(struct Osoby * osoby )
{
    int i;
    for(i = 0; i < osoby->ilosc_osob; i++)
    {
        wyswietlOsobe( & osoba->osoba[i] );
        printf(" %s %s %c\n\n" , osoba->nazwisko, osoba->imie, osoba->kobieta ? 'k' : 'm');
    }
}

void sortujOsoby(struct Osoby * osoby)
{
        int i,j;
        struct Osoba tmp;

        int cnt;
        for(i = 1;i < cnt; ++i){
            tmp = osoby->osoby[i];
            j = i - 1;
            while (j >= 0 && strcmp(osoba->nazwisko,osoba->nazwisko)<0){
                    osoba[j + 1] = osoba[j];
                    j = j - 1;
            }
            osoba[j + 1] = tmp;
         }
}

 

2 odpowiedzi

+2 głosów
odpowiedź 29 marca 2019 przez criss Mędrzec (172,570 p.)

Masz niezgodności deklaracji z definicjami. Inne typy argumentów i inne typy zwracane. W jednej miałeś typ zwracany bool w definicji mimo, że w funkcji nie ma żadengo return, a zadeklarowana jest jako void. Generalnie wygląda jakby ktoś pisał to po pijaku, no wybacz XD


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
 
struct Osoba
{
    char nazwisko[40];
    char imie[30];
    bool kobieta;
};
 
struct Osoby
{
    struct Osoba osoby[40];
    int ilosc_osob;
    int cnt;
 
};
 
 
void wczytajOsoby( struct Osoby * osoby);
void sortujOsoby(struct Osoby * osoby);
void wypiszOsoby(struct Osoby * osoby);
void wyswietlOsobe(struct Osoba * osoba);
void wczytajOsobe(struct Osoba * osoby);
 
 
int main()
{
    struct Osoby osoby;
    wczytajOsoby( & osoby );
    sortujOsoby( & osoby );
    wypiszOsoby( & osoby );
    //wyswietlOsobe( & osoby ); //?????
    wczytajOsoby( & osoby );
    return 0;
}
void wczytajOsoby( struct Osoby * osoby)
{
 
    printf("Ilosc danych do wpisania: ");
    scanf("%d", & osoby->ilosc_osob);
 
    for (int i=0;i<osoby->ilosc_osob;i++)
        wczytajOsobe( & osoby->osoby[i] );
}
 
 
void wczytajOsobe( struct Osoba * osoba )
{
        printf("Podaj naziwsko: ");
        scanf("%s", & osoba->nazwisko);
        printf("Podaj imie: ");
        scanf("%s", osoba->imie);
        if(osoba->imie[strlen(osoba->imie)-1]=='a')
            osoba->kobieta='k';
}
 
void wypiszOsoby(struct Osoby * osoby )
{
    int i;
    for(i = 0; i < osoby->ilosc_osob; i++)
    {
        wyswietlOsobe( & osoby->osoby[i] );
        printf(" %s %s %c\n\n" , osoba->nazwisko, osoba->imie, osoba->kobieta ? 'k' : 'm');
    }
}
 
void sortujOsoby(struct Osoby * osoby)
{
        int i,j;
        struct Osoba tmp;
 
        int cnt;
        for(i = 1;i < cnt; ++i){
            tmp = osoby->osoby[i];
            j = i - 1;
            while (j >= 0 && strcmp(osoba->nazwisko,osoba->nazwisko)<0){ // w ogole nie ma czegos takiego jak `osoba`
                    osoba[j + 1] = osoba[j];
                    j = j - 1;
            }
            osoba[j + 1] = tmp; // w ogole nie ma czegos takiego jak `osoba`
         }
}

Poprawilem ci te dziwne niezgodnosci miedzy definicjami i deklaracjami, ale nadal jest troche pokopany. Ale mysle, że teraz juz sobie poradzisz.

Btw. `wyswietlOsobe` nie jest nawet zdefiniowana.

komentarz 29 marca 2019 przez Skidrowed Nowicjusz (120 p.)

Dzięki wielkie za pomoc, trochę tam poprawiłem, lecz nie mogę sobie poradzić z dwoma funkcjami. Rzucisz okiem?

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

struct Osoba
{
    char nazwisko[40];
    char imie[30];
    bool kobieta;
};

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

};


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


int main()
{
    struct Osoby osoby;
    wczytajOsoby( & osoby );
    sortujOsoby( & osoby );
    wypiszOsoby( & osoby );
    wczytajOsoby( & osoby );
    return 0;
}
void wczytajOsoby( struct Osoby * osoby)
{

    printf("Ilosc danych do wpisania: ");
    scanf("%d", & osoby->ilosc_osob);

    for (int i=0;i<osoby->ilosc_osob;i++)
        wczytajOsobe( & osoby->osoby[i] );
}


void wczytajOsobe( struct Osoba * osoba )
{
        printf("Podaj naziwsko: ");
        scanf("%s", & osoba->nazwisko);
        printf("Podaj imie: ");
        scanf("%s", osoba->imie);
        if(osoba->imie[strlen(osoba->imie)-1]=='a')
            osoba->kobieta='k';
}

void wypiszOsoby(struct Osoby * osoby )
{
    int i;
    for(i = 0; i < osoby->ilosc_osob; i++)
    {
        wyswietlOsobe( & osoby->osoby[i] );
        printf(" %s %s %c\n\n" , osoba->nazwisko, osoba->imie, osoba->kobieta ? 'k' : 'm');
    }
}

void sortujOsoby(struct Osoba * osoba)
{
        int i,j;
        struct Osoba tmp;

        int cnt;
        for(i = 1;i < cnt; ++i){
            tmp = osoby->osoby[i];
            j = i - 1;
            while (j >= 0 && strcmp(osoby->nazwisko,osoby->nazwisko)<0){
                    osoba[j + 1] = osoba[j];
                    j = j - 1;
            }
            osoby[j + 1] = tmp;
         }
}

komentarz 29 marca 2019 przez criss Mędrzec (172,570 p.)
Masz napisane. Nie ma czegoś takiego. W wypiszOsoba sens raczej ma osoby->osoby[i].nazwisko zamiast `osoba`. W sortujOsoby to samo - odwołujesz się do czegoś czego nawet nie zadeklarowales.
komentarz 29 marca 2019 przez criss Mędrzec (172,570 p.)

Btw jaki to ma sens?

strcmp(osoby->nazwisko,osoby->nazwisko)

Porównując element z nim samym nigdy niczego nie posortujesz.

komentarz 30 marca 2019 przez Skidrowed Nowicjusz (120 p.)

Poprawiłem trochę linii, zmieniłem również sortowanie (przez wstawianie), lecz mam problem z funkcją do wyświetlenia osób. Co jest nie tak?

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

struct Osoba
{
    char nazwisko[40];
    char imie[30];
    bool kobieta;
};

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


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


int main()
{
    struct Osoby osoby;

    wczytajOsoby( & osoby );
    sortujOsoby( & osoby );
    wypiszOsoby( & osoby );

    return 0;
}
void wczytajOsoby( struct Osoby * osoby)
{

    printf("Ilosc danych do wpisania: ");
    scanf("%d", & osoby->ilosc_osob);

    for (int i=0;i<osoby->ilosc_osob;i++)
        wczytajOsobe( & osoby->osoby[i] );
}


void wczytajOsobe( struct Osoba * osoba )
{
        printf("Podaj naziwsko: ");
        scanf("%s", osoba->nazwisko);
        printf("Podaj imie: ");
        scanf("%s", osoba->imie);
        if(osoba->imie[strlen(osoba->imie)-1]=='a')
            osoba->kobieta=true;
        else
            osoba->kobieta=false;

}

void wypiszOsoby(struct Osoby * osoby )
{
    int i;
    for(i = 0; i < osoby->ilosc_osob; i++)
    {
     
     wyswietlOsobe( & osoby->osoby[i] );

    }
}

bool poprzedza(struct Osoba o1, struct Osoba o2)
{
    return strcmp(o2.nazwisko, o1.nazwisko) >= 0;
}

void sortujOsoby(struct Osoba osoby[], int ile)
{
    struct Osoba pom;
    int i, j;
    for (i=1; i < ile; ++i)
        for (j = ile - 1; j >= i; --j)
    if (poprzedza(osoby[j], osoby[j - 1]))
    {
        pom = osoby[j];
        osoby[j] = osoby[j - 1];
        osoby[j - 1] = pom;
    }
}


+1 głos
odpowiedź 29 marca 2019 przez DeBos123 Nałogowiec (44,950 p.)

W liniach 65, 79 oraz 83 używasz niezadeklarowanej zmiennej osoba, a powinno być osoby.

Podobne pytania

0 głosów
1 odpowiedź 637 wizyt
0 głosów
0 odpowiedzi 330 wizyt
0 głosów
0 odpowiedzi 174 wizyt
pytanie zadane 13 lutego 2019 w C i C++ przez Mardo97 Nowicjusz (170 p.)

93,740 zapytań

142,675 odpowiedzi

323,294 komentarzy

63,319 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...