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

Tworzenie struktury - język C

0 głosów
110 wizyt
pytanie zadane 31 sierpnia 2018 w C i C++ przez Paulina42 Nowicjusz (150 p.)

Witam, natrafiłam ostatnio na zadanie z języka C, z którym mam spory problem. Mianowicie należy napisać takie fragmenty programu, które pozwolą zainicjować i wypisać następujące zmienne:

a) klasa.numer;

b) (klasa.nauczyciel+4)->nazwisko;

c) klasa.uczen[1].nazwisko;

d) klasa.uczen[3].imie[2];

e) klasa.strlen(klasa.uczen[3].nazwisko);

Nastepnie należy przypisać polom z punktów a)-d) wartości na dwa istotnie różne sposoby.

 

W poniższym kodzie wydaje mi sie ze rozwiązałam punkty a,c,d:

struct lista{
    int numer;
    struct{
        char *nazwisko;
        char *imie[5];
    } uczen[20];
} klasa;

Czy ktoś mógłby mi pomóc z punktami b oraz e? 

Oraz jak można przypisać tym polom wartości poza zwykłym przypisaniem typu: klasa.uczen[1].nazwisko = "nowak"; ?

1 odpowiedź

+1 głos
odpowiedź 31 sierpnia 2018 przez Criss Mędrzec (171,380 p.)
wybrane 31 sierpnia 2018 przez Paulina42
 
Najlepsza
struct lista{
    struct osoba_t {
        char *nazwisko;
        char *imie[5];        
    };

    int numer;
    osoba_t uczen[20];
    osoba_t nauczyciel[5];
} klasa;

Po prostu użyłem twojej struktury z nazwiskiem i imieniem do stworzenie dodatkowej tablicy `nauczyciel`. Tablica jets konwertowalna na wskaźnik, więc można napisać `(klasa.nauczyciel+4)->nazwisko;` To co do punktu b).
Co do punktu e): funkcji składowych w języku C nie można tworzyć, więc pewnie chodziło o wskaźnik do funkcji. Wyglądałoby to tak:

struct lista{
    //...
    typedef size_t(*fptr_t)(const char*); // alias dla typu wskaznika na funkcje zwracającą size_t i przyjmującą jeden arg. typu const char*
    fptr_t strlen;
} klasa;

klasa.strlen = &strlen;

size_t oraz const char* bo taką sygnature ma `strlen` z C stdlib.

Oraz jak można przypisać tym polom wartości poza zwykłym przypisaniem typu: klasa.uczen[1].nazwisko = "nowak"; ?

Generalnie ja bym zrobił tak, żeby `imie` i `nazwisko` nie były wskaźnikami, ale tablicami o jakiejś tam wystarczającej długości. Wtedy możesz sobie do nich przekopiowywać używając najlepiej strcpy. Jak ja to widze:

 

#define MAX_LEN 100

struct lista{
    struct osoba_t {
        char nazwisko[MAX_LEN];
        char imie[5][MAX_LEN];        
    };

    int numer;
    osoba_t uczen[20];
    osoba_t nauczyciel[5];
} klasa;

strcpy(klasa.uczen[4].imie[2], "whatever");

Note:
Pamiętaj, że w przypadku gdy `nazwisko` jest typu char*, to przypisanie w stylu klasa.uczen[0].nazwisko = "blahblah"; nie kopiuje stringa, tylko przypisuje do wskaźnika `nazwisko` adres do stringa "blahblah" który znajduje się w pamięci readonly. Więc dla bezpieczeństwa najlepiej, żeby nazwisko wtedy było typu const char*. Dlatego IMO rozwiązanie z tablicami i strcpy jest lepsze. No i pewnie może posłużyć jako ten alternatywny sposób przypisania o który pytałaś.

Wybacz, że tyle gotowego kodu, ale mam nadzieję, że razem z wytłumaczeniem jest ok.

komentarz 31 sierpnia 2018 przez Paulina42 Nowicjusz (150 p.)
Wytłumaczone bardzo dobrze. Dzieki wielkie za pomoc

Podobne pytania

0 głosów
3 odpowiedzi 281 wizyt
0 głosów
1 odpowiedź 138 wizyt
pytanie zadane 22 lutego 2016 w C i C++ przez Mikruuus Początkujący (330 p.)
0 głosów
1 odpowiedź 58 wizyt
pytanie zadane 14 maja w C i C++ przez DobryKurczak Obywatel (1,010 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: 275
Pasjonatów: 10 Gości: 265

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.

...