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

Co jest nie tak z moim kodem?

0 głosów
164 wizyt
pytanie zadane 15 marca w C i C++ przez Mardo97 Nowicjusz (170 p.)

Witam wszystkich,

mam problem z dokończeniem programu którego otrzymałem do zrobienia, otóż, na początek wykonałem sam program który oczywiście działał. Musi on wczytać od użytkownika dowolną ilość osób, a następnie rozpoznać czy jest to kobieta i posortować alfabetycznie. Problem nastąpił wtedy, gdy zacząłem tworzyć struktury danych, a to, że dopiero zaczynam się ich uczyć, to oczywiście musiałem coś popsuć. Ktoś mógłby wskazać gdzie leży błąd, a najlepiej poprawić po mnie linijki kodu? Byłbym bardzo wdzięczny za wszelką pomoc. Pozdrawiam.

#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();
void sortujOsoby(struct Osoba osoba[], int cnt);
void wypiszOsoby();


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] );
}


bool wczytajOsobe( struct Osoba * osoba )
{
        printf("Podaj naziwsko: ");
        scanf("%s", osoba->nazwisko);
        printf("Podaj imie: ");
        scanf("%s", osoba[i].imie);
        if(osoba[i].imie[strlen(osoba[i].imie)-1]=='a')
            osoba[i].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[i].nazwisko, osoba[i].imie, osoba[i].kobieta ? 'k' : 'm');
    }
}

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

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

 

komentarz 15 marca przez Mardo97 Nowicjusz (170 p.)
Rozumiem, czyli argument musi być tam gdzie zadeklarowałem wczytajOsoby?
1
komentarz 15 marca przez DarthMazut Bywalec (2,430 p.)
Z tego co wiem (przynjamniej w C++ tak jest) to sygantury funkcji muszą być takie same w deklaracji i definicji.

Możesz jedynie zrezygnować w deklaracji z nadawania nazw argumentom.
komentarz 16 marca przez Mardo97 Nowicjusz (170 p.)
Mogę, ale mam takiego wykładowcę, że nie pozwoli na zrezygnowanie z tego. Dlatego chcę aby to było zrobione na tip top, także potrzebuję pomocy w tym.
1
komentarz 16 marca przez DarthMazut Bywalec (2,430 p.)
Z mojej strony mogę podpowiedzieć Ci tyle:

zamień linię 21 na coś takiego:

void wczytajOsoby( struct Osoby * osoby);

i sprawdź czy zniknał Ci błąd z linii 29. Jeśli tak to postępuj analogicznie a jeśli nie to chyba nie umiem pomóc :D
komentarz 16 marca przez Mardo97 Nowicjusz (170 p.)

Okej, prawie udało mi się poprawić kod, lecz nie wszystkie błędy dałem radę zrobić.

#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 * osoby);


int main()
{
    struct Osoby osoby;
    wczytajOsoby( & osoby );
    sortujOsoby( & osoby );
    wypiszOsoby( & osoby );
    wyswietlOsobe( & 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( & 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){
                    osoba[j + 1] = osoba[j];
                    j = j - 1;
            }
            osoba[j + 1] = tmp;
         }
}

1 odpowiedź

+1 głos
odpowiedź 16 marca przez DarthMazut Bywalec (2,430 p.)
wybrane 25 marca przez Mardo97
 
Najlepsza

Kompilator Ci wszystko napisał gdzie jest, jaki problem i jeszcze na dodatek w której linii.

W linii 34 do procedury wyswietlOsobe przekazujesz referencję do typu Osoby chociaż zadeklarowałeś, że procedura ta powinna przyjmować parametr typu Osoba.

W linii 44 próbujesz wywołać procedurę wczytajOsobe chociaż nie została ona wcześniej ani zadeklarowana ani zdefiniowana.

Linia 64: używasz nazwy osoba a parametr formalny nazywa się osoby...

Reszte sam wykminisz.

Podobne pytania

0 głosów
2 odpowiedzi 105 wizyt
pytanie zadane 5 sierpnia 2016 w C i C++ przez Jardee Początkujący (340 p.)
0 głosów
1 odpowiedź 92 wizyt
pytanie zadane 11 grudnia 2015 w C i C++ przez robertwe Gaduła (4,600 p.)
+1 głos
3 odpowiedzi 295 wizyt
pytanie zadane 29 lipca 2016 w C i C++ przez mat1911 Nowicjusz (230 p.)
Porady nie od parady
Forum posiada swój własny chat IRC, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

66,451 zapytań

113,207 odpowiedzi

239,680 komentarzy

46,704 pasjonatów

Przeglądających: 264
Pasjonatów: 13 Gości: 251

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...