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

Struktury C, problem

Object Storage Arubacloud
+1 głos
804 wizyt
pytanie zadane 15 grudnia 2017 w C i C++ przez fast Nowicjusz (170 p.)

Treść zadania: 

Zdefiniuj strukturę opisującą studenta ( imię, nazwisko, rok, kierunek), a następnie utwórz tablicę, której elementami są zdefiniowane wcześniej struktury. Napisz funkcje, która: wypisze wszystkich studentów danego roku.

kod:

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

struct student
{
    char imie[10];
    char nazwisko[30];
    int rok;
    char kierunek[20];
};

void wypelnij(struct student *s)
{
    printf("Podaj imie: ");
    scanf("%s", &s->imie);
    printf("Podaj nazwisko: ");
    scanf("%s", &s->nazwisko);
    printf("Podaj rok: ");
    scanf("%d", &s->rok);
    printf("Podaj kierunek: ");
    scanf("%s", &s->kierunek);
}

char studenci_z_roku(struct student *s,int n, int rok)
{
    int i;
    for(i=0; i<n; i++)
    {
        if(((s+i)->rok)==rok)
        {
            printf("\n%s %s\n", (s+i)->imie, (s+i)->nazwisko);
        }
    }

}

int main()
{
    int n,i,student_rok;
    printf("Ile studentow: ");
    scanf("%d", &n);
    struct student tab[n];
    for(i=0; i<n;i++)
    {
        printf("\nPodaj dane srudenta %d\n", i+1);
        wypelnij(tab);
    }
    printf("Wypisz studentow z roku: ");
    scanf("%d", &student_rok);
    studenci_z_roku(tab,n, student_rok);



    return 0;
}

Program nie wypisuje wszystkich studentów z podanego roku tylko ostatniego.

2 odpowiedzi

0 głosów
odpowiedź 16 grudnia 2017 przez fast Nowicjusz (170 p.)

Po zmianach działa wypisywanie studentów z danego roku. Drugim podpunktem jest wypisanie studentów z podanego kierunku z góry dzięki za pomoc i wskazówki.

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

struct student
{
    char imie[10];
    char nazwisko[30];
    int rok;
    char kierunek[20];
};

void wypelnij(struct student *s)
{
    printf("Podaj imie: ");
    scanf("%s", &s->imie);
    printf("Podaj nazwisko: ");
    scanf("%s", &s->nazwisko);
    printf("Podaj rok: ");
    scanf("%d", &s->rok);
    printf("Podaj kierunek: ");
    scanf("%s", &s->kierunek);
}

void studenci_z_roku(struct student *s,int n, int rok)
{
    int i;
    for(i=0; i<n; i++)
    {
        if(((s+i)->rok)==rok)
        {
            printf("%s %s\n", (s+i)->imie, (s+i)->nazwisko);
        }
    }

}

void studenci_z_kierunku(struct student *s,int n, char *kierunek)
{
    int i;
    for(i=0; i<n; i++)
    {
        if(((s+i)->kierunek)==kierunek)
        {
            printf("%s %s\n", (s+i)->imie, (s+i)->nazwisko);
        }
    }

}

int main()
{
    int n,i,student_rok;
    char student_kierunek[20];
    printf("Ile studentow: ");
    scanf("%d", &n);
    struct student *tab;
    tab = (struct student*)malloc( sizeof(struct student) * n );
    for(i=0; i<n;i++)
    {
        printf("\nPodaj dane srudenta %d\n", i+1);
        wypelnij(tab + i);
    }
    printf("Wypisz studentow z roku: ");
    scanf("%d", &student_rok);
    studenci_z_roku(tab,n, student_rok);

    printf("Wypisz studentow z kierunku: ");
    scanf("%s", &student_kierunek);
    studenci_z_kierunku(tab,n,student_kierunek);



    free(tab);

    return 0;
}

 

komentarz 16 grudnia 2017 przez fast Nowicjusz (170 p.)

Działa po użyciu funkcji  strcmp

        if( strcmp(((s+i)->kierunek),kier) == 0 )
        {
            printf("%s %s\n", (s+i)->imie, (s+i)->nazwisko);
        }

 

–1 głos
odpowiedź 15 grudnia 2017 przez obl Maniak (51,280 p.)
edycja 15 grudnia 2017 przez obl

Po co funkcja studenci_z_roku ma zadeklarowane, że zwraca wartość typu char, jeżeli nigdzie nie zwraca niczego?

Linijka 42:

struct student tab[n];

to nie przejdzie, bo po pierwsze zmienną typu student deklaruje się tak:

student newStudent;

a po drugie, nie możesz utworzyć w ten sposób tablicy, musisz przydzielić pamięć za pomocą funkcji malloc tak:

student *tab;
tab = (student*)malloc( sizeof(student) * n );

na koniec, gdy już kończysz robotę z studentami powinno się wtedy zwolnić pamięć funkcją free.

A i ten kod który podałeś niczego nie wypisze, bo nie ma prawa się w takiej postaci wykonać.

Edit:

W linijce 46 powinno być:

        wypelnij(tab + i);

bo inaczej wypełniasz tylko pierwszy element tablicy.

komentarz 15 grudnia 2017 przez criss Mędrzec (172,590 p.)

to nie przejdzie, bo po pierwsze zmienną typu student deklaruje się tak:
 

student newStudent;

W C konieczne jest słówko struct.

a po drugie, nie możesz utworzyć w ten sposób tablicy, musisz przydzielić pamięć za pomocą funkcji malloc

Nope, w C mamy VLA (variable-length array) i jest to dozwolone. 

komentarz 15 grudnia 2017 przez j23 Mędrzec (194,920 p.)

a po drugie, nie możesz utworzyć w ten sposób tablicy

W C99 może. W C11 VLA są opcjonalne.

Podobne pytania

0 głosów
2 odpowiedzi 489 wizyt
pytanie zadane 16 stycznia 2018 w C i C++ przez mn130496 Gaduła (3,530 p.)
0 głosów
2 odpowiedzi 4,343 wizyt
pytanie zadane 13 stycznia 2018 w C i C++ przez mn130496 Gaduła (3,530 p.)
–1 głos
0 odpowiedzi 265 wizyt
pytanie zadane 19 marca 2018 w C i C++ przez danie6 Początkujący (280 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...