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

Struktury C, problem

+1 głos
1,174 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,300 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,570 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 (195,220 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 904 wizyt
pytanie zadane 16 stycznia 2018 w C i C++ przez mn130496 Gaduła (3,530 p.)
0 głosów
2 odpowiedzi 5,224 wizyt
pytanie zadane 13 stycznia 2018 w C i C++ przez mn130496 Gaduła (3,530 p.)
–1 głos
0 odpowiedzi 470 wizyt
pytanie zadane 19 marca 2018 w C i C++ przez danie6 Początkujący (280 p.)

93,604 zapytań

142,529 odpowiedzi

322,996 komentarzy

63,092 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

Kursy INF.02 i INF.03
...