Tablica wskaźników struktur – kod do poprawy

0

Cześć, przypadkiem usunąłem cały tekst z postu więc piszę jeszcze raz.. Dostałem takie zdanie do zrobienia i stworzyłem taki kod ale on nie działa . Szukam pomocy
photo_2018-11-30_13-56-08 (1).jpg


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

struct person {

    char surname[50];
    unsigned int wiek;
    int iloscPotomkow;
    struct potomek* potomkowie[];
};

struct potomek {
    char surname[50];
    unsigned int wiek;
};

void zrobPotomka(struct person** person,int idx)
{
    struct potomek** potomek;
    potomek[idx - 1] = (struct person*)malloc(sizeof(struct person));
    potomek[idx - 1]->wiek = person->wiek;
    memcpy(potomek[idx - 1]->surname, persons[idx]->surname, persons[idx]->surname.sizeof() / "a".sizeof());
    person->iloscPotomkow + ;
    person->potomkowie[idx - 1] = potomek;
    freePersons(person[idx]);
};

bool ifPersonExist(int i, struct person** person)
{

    if (persons[i] == NULL) {
        return true;
    }
    else
        return false;
}

void printAPerson(int i, struct person* person)
{
    printf("Person(%d): %s, level %d\n", i, person->name, person->level);
}

void printPersons(struct person** persons, int num)
{
    for (int i = 0; i < num; i++) {
        if (persons[i] == NULL) {
            continue;
        }
        printAPerson(i, persons[i]);
    }
}

void createPersons(struct person** persons, int idx, const char* surname[], unsigned int level, int surnameLong)
{
    persons[idx] = (struct person*)malloc(sizeof(struct person));
    persons[idx]->level = level;
    memcpy(persons[idx]->surname, surname, surnameLong);
}

void freePersons(struct person** persons, int num)
{
    //Najpierw zwolnij pamiec dla wszystkich bohaterow
    for (int i = 0; i < num; i++) {
        if (persons[i] == NULL) {
            continue;
        }
        free(persons[i]);
    }

    //teraz usun pamiec dla tablicy
    free(persons);
}

int main()
{

    struct person** persons;

    char w;
    scanf("%c", &w);

    char surname[100];
    int age;
    int idx,idxMax=0;
    int size;

    printf("podaj ile chcesz stworzyć osób");
    scanf(&size);
    int tabOfIdx[size];
    while (i < size) {
        i++;
        switch (w) {
        case 'a':

            printf("podaj indeks do utowrzenia osoby  ");
            scanf("%d", idx);
            if (idx>idxMax){
                idxMax=idx;
            }
            if (ifPersonExist(idx)) {
                printf("podaj prosze nazwisko oraz wiek");
                scanf(&surname, &age);
                createPersons(person, idx, surname, age, surname.sizeof() / surname[0]);
            }
            else
                printf("osoba o podanym in...");
        case 'c':
    while (i < idxMax) {
          if (ifPersonExist(idx)) {
            zrobPotomka(persons,i++);
          }}
            break;
        case 'p':
            printPersons(persons, size);
            break;
        default:
        }
    }
    return 0;
}
2
  1. zdefiniuj "nie działa"
  2. czy przypadkiem "tablica potomków"nie jest po prostu "tablicą osób" będących potomkiem danej osoby? W sensie potrzebna ci ta dodatkowa struktura?
  3. Gorsze od pisania kodu po polsku, jest pisanie kodu po polsku i po angielsku. Pisz tylko po angielsku, wszystko! Jak pójdziesz do pracy i zobaczysz komentarze albo kod napisane po portugalsku albo słowacku to zrozumiesz czemu.
3

Pan profesor ma opory przed umieszczaniem zadań jako tekstu? :​/

Poprawiłem trochę czytelność, ale wciąż słabo

0
MarekR22 napisał(a):
  1. zdefiniuj "nie działa"
  2. czy przypadkiem "tablica potomków"nie jest po prostu "tablicą osób" będących potomkiem danej osoby? W sensie potrzebna ci ta dodatkowa struktura?
  3. Gorsze od pisania kodu po polsku, jest pisanie kodu po polsku i po angielsku. Pisz tylko po angielsku, wszystko! Jak pójdziesz do pracy i zobaczysz komentarze albo kod napisane po portugalsku albo słowacku to zrozumiesz czemu.

Wybacz za polsko-angielski wiem katastrofa , 1 nie rozumiem jak mam stworzyć tych potomków na bazie tego jednego, poprawiłem trochę kod , zmieniłem to co mówiłeś ale nie wiem jak wypisać dobrze te wszystkie indeksy skoro mogę podać dowolny a maks ma być dziesięć

1

Popatrz na opis ostatniej komendy z zadania (tu bym wkleił odpowiedni fragment tekstu jakby się dało :P).
Potomek to jest to samo co Osoba! Potomek to po prostu określenie relacji miedzy dwiema osobami!

0
MarekR22 napisał(a):

Popatrz na opis ostatniej komendy z zadania (tu bym wkleił odpowiedni fragment tekstu jakby się dało :P).
Potomek to jest to samo co Osoba! Potomek to po prostu określenie relacji miedzy dwiema osobami!

czyli zrobić w potomku
int iloscPotomkow;
struct person* persons[];

a w osoby co ?

0

Ależ nie.
Po prostu rozszerzasz strukturę Osoba:

struct Osoba
{
//to co miała dotychczas
    unsigned int descendantsCount;//może być 0
    Osoba *descendants;//tablica potomków, albo NULL jak nie ma potomków
};
0
MasterBLB napisał(a):

Ależ nie.
Po prostu rozszerzasz strukturę Osoba:

struct Osoba
{
//to co miała dotychczas
    unsigned int descendantsCount;//może być 0
    Osoba *descendants;//tablica potomków, albo NULL jak nie ma potomków
};

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

#define allocPersons2(persons, size)                                       \
{                                                                       \
    persons = (struct person**)malloc((sizeof(struct person*) * size));      \
    for (int i=0; i<size; i++) {                                        \
        persons[i] = NULL;                                               \
    }                                                                   \
}

struct person {

    char surname[50];
    unsigned int wiek;
    struct    person* persons;
     unsigned int descendantsCount
};

struct potomek {
    char surname[50];
    unsigned int wiek;
};
 void allocPersons(struct person** persons, int size)
{
    persons = (struct persons**)malloc((sizeof(struct persons*) * size));
    for (int i=0; i<size; i++) {
        persons[i] = NULL;
    }
}

void zrobPotomka(struct person* person,int idx)
{
    char surnameArray[45];

    strcpy(surnameArray,person->surname );

    person->persons[idx - 1] = (struct person*)malloc(sizeof(struct person));
    person->persons[idx - 1]->wiek = person->wiek;
    memcpy(persons[idx - 1]->surname, person->surname, sizeof(surnameArray)/sizeof(surnameArray[0]));
    person->descendantsCount ++ ;

    freePersons(person[idx]);
};

bool ifPersonDoesntExist( struct person** persons,int i )
{

        if (persons[i] == NULL) {
             return true;
        }
        else
            return false;

}

void printAPerson(int i, struct person* person)
{
    printf("Person(%d): %s, wiek %d\n", i, person->surname, person->wiek);
}

void printPersons(struct person** persons, int num)
{
    for (int i = 0; i < num; i++) {
        if (persons[i] == NULL) {
            continue;
        }
        printAPerson(i, persons[i]);
    }
}

void createPersons(struct person** persons, int idx, const char surname[25], unsigned int wiek, int surnameLong)
{
    persons[idx] = (struct person*)malloc(sizeof(struct person));
    persons[idx]->wiek = wiek;
    memcpy(persons[idx]->surname, surname, surnameLong);
}

void freePersons(struct person** persons, int num)
{

    for (int i = 0; i < num; i++) {
        if (persons[i] == NULL) {
            continue;
        }
        free(persons[i]);
    }

    //teraz usun pamiec dla tablicy
    free(persons);
}

int main()
{

    struct person** persons;

    char w;

    char surname[100];
    int age;

    int size,i=0;

 int idx,idxArray[size];
allocPersons(persons,size);
    printf("podaj ile chcesz stworzyć osob");
    scanf("%d", &size);

    int tabOfIdx[size];
    allocPersons(persons,size);
    while (i < size) {

      printf("podaj jaką opcje wybierasz \n");
     printf("a --- utwórz strukture pod wybranym indeksem \n");
     printf("p --- wypisz wszystkie dane z tablicy \n");
     printf("c --- utworz potomkow na bazie osoby \n");
     scanf("%c", &w);

        switch (w) {
        case 'a':

            printf("podaj indeks do utowrzenia osoby  ");
            scanf("%d", &idx);
            idxArray[i]=idx;

            if (ifPersonDoesntExist(persons,idx)) {
                printf("podaj prosze nazwisko");

                scanf("%s",&surname);

                 printf("podaj prosze  oraz wiek");
                scanf("%d",&age);
                createPersons(persons, idx, surname, age, sizeof(surname)/sizeof(surname[0]));
                 i++;
            }
            else
                printf("osoba o podanym indeksie istnieje");
                break;
        case 'c':

    for (int k=0 ; k< sizeof(idxArray)/sizeof(idxArray[0]); k++) {
          if (ifPersonDoesntExist(persons,idx)) {
            zrobPotomka(persons,k);
          }
          }

            break;
        case 'p':
            for (int k=0 ; k< sizeof(idxArray)/sizeof(idxArray[0]); k++) {
          if (ifPersonDoesntExist(persons,idx)) {
           printAPerson(idx,persons[i]);
          }
            }
            break;
        default:
             printf("dowidzenia");
        }
    }
    return 0;
}

czy o to ci chodziło ? bo teraz nie moge zrobić Potomka

2
The Best napisał(a):

(...) bo teraz nie moge zrobić Potomka


( ͡° ͜ʖ ͡ °)

A tak na serio - nie potrzebujesz klasy Potomek, po prostu zmodyfikuj zrobPotomka():

void zrobPotomka(Osoba &parent, unsigned int howManyDescendants)
{
    parent.descendantsCount = howManyDescendants;    
    parent.descendants = (Osoba*) malloc(howManyDescendants * sizeof(Osoba));//nie używałem malloc od wieków, mogą być drobne błędy

    for (int offset = 0; offset < howManyDescendants; offset++)
    {
         Osoba *descendant = parent.descendants + offset;
         descendant->surname = parent.surname;//tu uproszczenie kopiowania nazwiska
         descendant->age = 0;//w końcu dopiero co utworzony ^^
    }
}
0

A tak na serio - nie potrzebujesz klasy Potomek, po prostu zmodyfikuj zrobPotomka():

void zrobPotomka(Osoba &parent, int howManyDescendants)
{
    parent.descendantsCount = howManyDescendants;
    parent.descendants = new Osoba[howManyDescendants]; //skoro to C to przerób to na użycie malloc

    for (int offset = 0; offset < howManyDescendants; offset++)
    {
         Osoba *descendant = parent.*(descendants + offset);
         descendant->surname = parent.surname;//tu uproszczenie kopiowania nazwiska
         descendant->age = 0;//w końcu dopiero co utworzony ^^
    }
}

no ale w c właśnie to próbuje zrobić tyle że nie na wszystkich osobach a na pojedynczej i mi nie wychodzi

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