• 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?

VPS Starter Arubacloud
0 głosów
279 wizyt
pytanie zadane 15 marca 2019 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 2019 przez Mardo97 Nowicjusz (170 p.)

 

Błędów jest akurat sporo, nie mam pojęcia dlaczego tak się dzieje

komentarz 15 marca 2019 przez Secrus Nałogowiec (32,880 p.)
Przeczytaj treść błędów (te na czerwono), zrozumiesz co jest źle, bo kompilator dokładnie mówi co i jak jest źle...
komentarz 15 marca 2019 przez DarthMazut Bywalec (2,990 p.)
Dlaczego tak często używasz słowa kluczowego 'struct'? Skoro zadeklarowałeś na początku, że Osoba to struktura to już nie musisz potem tego powtarzać, kompilator wie, że taki typ jest strukturą. Czy w C jest inaczej niż w C++ pod tym względem?
komentarz 15 marca 2019 przez Secrus Nałogowiec (32,880 p.)
musisz używać 'struct <nazwa>' wszedzie w C. obejsciem jest owinięcie deklaracji struct w typdefa
komentarz 15 marca 2019 przez DarthMazut Bywalec (2,990 p.)
dobrze wiedzieć.
komentarz 15 marca 2019 przez Mardo97 Nowicjusz (170 p.)
Właśnie nie bardzo rozumiem treść tych błędów, znaczy znam angielski ale nie wiem dlaczego tak się dzieje, a to dopiero są moje pierwsze podrygi z programowaniem - przykładowo, w linii 29 zrobiłem wskazanie na "osoby" oraz zadeklarowałem wcześniej wczytajOsoby, lecz z jakiegoś powodu nie chce on tego przyjąć, . W C jednak trzeba za każdym razem pisać struct (tak mi się wydaje, po obejrzeniu kilka programów ze strukturami).
2
komentarz 15 marca 2019 przez DarthMazut Bywalec (2,990 p.)
No ale popatrz: zadeklarowałeś wczytajOsoby jako procedurę, która nie przyjmuje żadnych argumentów, a potem definiujesz ją już z argumentem...
komentarz 15 marca 2019 przez Mardo97 Nowicjusz (170 p.)
Rozumiem, czyli argument musi być tam gdzie zadeklarowałem wczytajOsoby?
1
komentarz 15 marca 2019 przez DarthMazut Bywalec (2,990 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 2019 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 2019 przez DarthMazut Bywalec (2,990 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 2019 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 2019 przez DarthMazut Bywalec (2,990 p.)
wybrane 25 marca 2019 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 190 wizyt
pytanie zadane 5 sierpnia 2016 w C i C++ przez Jardee Początkujący (420 p.)
0 głosów
1 odpowiedź 89 wizyt
pytanie zadane 25 marca 2020 w C i C++ przez Atman Użytkownik (810 p.)
0 głosów
1 odpowiedź 132 wizyt
pytanie zadane 11 grudnia 2015 w C i C++ przez robertwe Gaduła (4,620 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...