Приступ члановима структуре

Као што смо видели пољима структуре приступа се помоћу оператора тачка (.).

Први операнд преставља променљиву структуралног типа, а други је идентификатор поља коме се приступа.

Нпр. у структури s пољу p се приступа са s.p

../_images/image42.png

Ако је ps показивач на структуру а p поље структуре, приступа се помоћу (*ps).p

../_images/image52.png

Заграде су обавезне јер, у недостатку заграда, због вишег приоритета оператора тачка у односу на * израз би се тумачио као *(ps.p), што значи да не показује на структуру већ на поље у структури.

Због честе употребе показивача дефинисан је бинарни оператор -> за приступ пољу p структуре на коју указује показивач ps. Пише се ps->p.

Оба бинарна оператора, . и ->, истог су приоритета и групишу се са лева на десно.

Задатак: Дефинисати структурни тип Licnost који садржи чланове типа string ime_prezime максималне дужине 30 карактера и adresa максималне дужине 40 карактера, као и члан godine типа int. Написати програм којим се уносе подаци о две особе, а затим одређује која је особа старија. Задатак решити преко вредносних променљивих а затим преко показивача.

Решење 1:

#include<stdio.h>
typedef struct
{
    char imeiprezime[30];
    char adresa[40];
    int godine;
} Licnost;

int main(void)
{
    Licnost osoba1, osoba2, stariji;
    printf("Unesi ime prve osobe: ");
    gets(osoba1.imeiprezime);
    printf("Unesi adresu prve osobe: ");
    gets(osoba1.adresa);
    printf("Unesi starost prve osobe: ");
    scanf("%d",&osoba1.godine);
    getchar();// mora da pokupi enter odnosno '\n' pre gets
    printf("Unesi ime druge osobe: ");
    gets(osoba2.imeiprezime);
    printf("Unesi adresu druge osobe: ");
    gets(osoba2.adresa);
    printf("Unesi starost druge osobe: ");
    scanf("%d", &osoba2.godine);
    if(osoba1.godine == osoba2.godine)
        printf("Osobe su istih godina\n");
    else
        {
            if (osoba1.godine<osoba2.godine)
                stariji = osoba2;
            else
                stariji = osoba1;
            printf("Starija osoba je:\n");
            printf("%s %s star: %d", stariji.imeiprezime, stariji.adresa, stariji.godine);
        }
    return 0;
}

Решење 2:

#include<stdio.h>
typedef struct
{
    char imeiprezime[30];
    char adresa[40];
    int godine;
} Licnost;

int main(void)
{
    Licnost osoba1, osoba2, stariji, *p1,*p2,*s;
    p1 = &osoba1;
    p2 = &osoba2;
    s = &stariji;
    printf("Unesi ime prve osobe: ");
    gets(p1->imeiprezime);
    printf("Unesi adresu prve osobe: ");
    gets(p1->adresa);
    printf("Unesi starost prve osobe: ");
    scanf("%d",p1->godine);
    getchar();// mora da pokupi enter odnosno '\n' pre gets 
    printf("Unesi ime druge osobe: ");
    gets(p2->imeiprezime);
    printf("Unesi adresu druge osobe: ");
    gets(p2->adresa);
    printf("Unesi starost druge osobe: ");
    scanf("%d", p2->godine);
    if (p1->godine == p2->godine)
        printf("Osobe su istih godina\n");
    else
        {
            if (p1->godine < p2->godine)
                s = p2;
            if (p2->godine < p1->godine)
                s = p1;
            printf("Starija osoba je:\n");
            printf("%s %s star:%d", s->imeiprezime, s->adresa, s->godine);
	    }
    return 0;
}

Излаз:

Unesi ime prve osobe: Pero Peric
Unesi adresu prve osobe: Mikina 25 Kraljevo
Unesi starost prve osobe: 25
Unesi ime druge osobe: Marko Markovic
Unesi adresu druge osobe: Milana Toplice 11 Nis
Unesi starost druge osobe: 36
Starija osoba je:
Marko Marкovic Miana Toplice 11 Nis star: 36

Излаз:

Unesi ime prve osobe: Pero Peric
Unesi adresu prve osobe: Mikina 25 Kraljevo
Unesi starost prve osobe: 25
Unesi ime druge osobe: Marko Markovic
Unesi adresu druge osobe: Milana Toplice 11 Nis
Unesi starost druge osobe: 25
Osobe su istih godina

Дефинисати структурни тип Datum са пољима dan, mesec, godina типа int. Дефинисати структурни тип Student који садржи поља типа стринг prezime и ime максималних дужина 20 карактера, поље dat_rodj структурног типа Datum, поље god_studija типа int и поље prosecna_ocena типа float.

  1. Иницијализовати податке за једног студента и исписати његове податке.

  2. Са стандардног улаза унети, а затим исписати податке за једног студента.

Решење 1:

#include<stdio.h>
typedef struct
{
    int dan;
    int mesec;
    int godina;
} Datum;

typedef struct
{
    char prezime[20];
    char ime[20];
    Datum dat_rodj;
    int god_studija;
    float prosecna_ocena;
} Student;

int main(void)
{
    Student std = {"Marko","Markovic", 14, 5, 1995, 3, 6.58};
    //Student std = {"Marko","Markovic",{14, 5, 1995}, 3, 6.58};
    printf("Uneli ste studenta\n");
    printf("Ime i prezime: %s %s\n", std.ime, std.prezime);
    printf("Datum rodjenja: %d.%d.%d\n",std.dat_rodj.dan, std.dat_rodj.mesec, std.dat_rodj.godina);
    printf("Godina studija: %d\n", std.god_studija);
    printf("Prosecna ocena: %.2f\n", std.prosecna_ocena);
    return 0;
}

Излаз:

Uneli ste studenta
Ime i prezime: Marko Markovic
Datum rodjenja: 14.5.1995
Godina studija: 3
Prosecna ocena: 6.58

Решење 2:

#include<stdio.h>
typedef struct
{
    int dan;
    int mesec;
    int godina;
} Datum;

typedef struct
{
    char prezime[20];
    char ime[20];
    Datum dat_rodj;
    int god_studija;
    float prosecna_ocena;
} Student;

int main(void)
{
    Student std;
    printf("Unesi ime studenta: ");
    gets(std.ime);
    printf("Unesi prezime studenta: ");
    gets(std.prezime);
    printf("Unesi datum rodjenja: ");
    scanf("%d", &std.dat_rodj.dan);
    printf("Unesi mesec rodjenja: ");
    scanf("%d", &std.dat_rodj.mesec);
    printf("Unesi godinu rodjenja: ");
    scanf("%d", &std.dat_rodj.godina);
    printf("Unesi godinu studija: ");
    scanf("%d", &std.god_studija);
    printf("Unesi prosecnu ocenu: ");
    scanf("%f", &std.prosecna_ocena);
    printf("\nUneli ste studenta\n");
    printf("Ime i prezime: %s %s\n",std.ime, std.prezime);
    printf("Datum rodjenja: %d.%d.%d\n", std.dat_rodj.dan, std.dat_rodj.mesec, std.dat_rodj.godina);
    printf("Godina studija: %d\n", std.god_studija);
    printf("Prosecna ocena: %.2f\n", std.prosecna_ocena);
    return 0;
}

Излаз:

Unesi ime studenta: Marko
Unesi prezime studenta: Markovic
Unesi datum rodjenja: 14
Unesi mesec rodjenja: 5
Unesi godinu rodjenja: 1995
Unesi godinu studija: 3
Unesi prosecnu ocenu: 6.58

Uneli ste studenta
Ime i prezime: Marko Markovic
Datum rodjenja: 14.5.1995
Godina studija: 3
Prosecna ocena: 6.58

Дефинисати структурни тип Datum са пољима dan, mesec, godina типа int. Дефинисати структурни тип Student који садржи поља типа стринг prezime и ime максималних дужина 20 карактера, поље dat_rodj структурног типа Datum, поље god_studija типа int и поља prosecna_ocena типа float. Са стандардног улаза унети а затим исписати податке за једног студента. Приступ пољима структуре одрадити преко показивача.

Решење:

#include<stdio.h>
typedef struct
{
    int dan;
    int mesec;
    int godina;
} Datum;

typedef struct
{
    char prezime[20];
    char ime[20];
    Datum dat_rodj;
    int god_studija;
    float prosecna_ocena;
} Student;

int main(void)
{
    Student std,*p;
    p = &std;
    printf("Unesi ime studenta: ");
    gets(p->ime);
    printf("Unesi prezime studenta: ");
    gets(p->prezime);
    printf("Unesi datum rodjenja: ");
    scanf("%d", p->dat_rodj.dan);
    printf("Unesi mesec rodjenja: ");
    scanf("%d", p->dat_rodj.mesec);
    printf("Unesi godinu rodjenja: ");
    scanf("%d", p->dat_rodj.godina);
    printf("Unesi godinu studija: ");
    scanf("%d", p->god_studija);
    printf("Unesi prosecnu ocenu : ");
    scanf("%f", p->prosecna_ocena);
    printf("Uneli ste studenta\n");
    printf("Ime i prezime: %s %s\n", p->ime, p->prezime);
    printf("Datum rodjenja %d.%d.%d\n", p->dat_rodj.dan, p->dat_rodj.mesec, p->dat_rodj.godina);
    printf("Godina studija %d\n", p->god_studija);
    printf("Prosecna ocena %.2f\n", p->prosecna_ocena);
    return 0;
}

Дефинисати структурни тип Tacka са пољима x, y типа float. У главном програму дефинисати показивачку променљиву p типа Tacka и резервисати меморијски простор за један податак типа Tacka. Унети и исписати једну тачку користећи показиваче.

#include<stdio.h>
#include<malloc.h>
typedef struct
{
    float x;
    float y;
} Tacka;

int main(void)
{
    Tacka *p = (Tacka*) malloc(sizeof(Tacka));
    printf("Unesi x koordinatu:");
    scanf("%f",&p->x);
    printf("Unesi y koordinatu:");
    scanf("%f",&p->y);
    printf("(%.2f, %.2f)\n", p->x, p->y);
    free(p);	
    return 0;
}

Излаз:

Unesi x koordinatu: 3.25
Unesi y koordinatu: 2.89
(3.25, 2.89)