Употреба структура

Структуре представљају типове које дефинише програмер. Подаци структурних типова се сматрају појединачним подацима, без обзира на њихову сложеност. Подаци међусобно једнаких структурних типова могу међусобно да се додељују помоћу оператора за доделу вредности =. Тиме се целокупни садржај изворишног податка ископира у одредишну променљиву, поље по поље. Не смета ако се међу пољима налазе и низови! (за разлику од „обичних“ низова, који нису део структуре, које треба копирати елеменат по елеменат, у for циклусу). Адреса структурне променљиве може се добити оператором &. Такође могу да се дефинишу и подаци који су показивачи на структуре. За приступ показиваним структурама користи се оператор *.

Структуре могу да буду параметри функција. Пошто се структура, без обзира на њену сложеност, сматра једним податком, подразумевани начин преношења структуре у функције је помоћу вредности. Из истог разлога, структуре могу да буду и вредности функција. С обзиром да структуре могу да буду врло велике, препоручује се да се оне преносе у функције посредством показивача. По потреби, као заштита од мењања садржаја податка који се налази у позивајућем програму, параметар треба дефинисати као показивач на непроменљиву (const) структуру.

Чињеница да се структуре могу међусобно додељивати и да могу бити вредности функција омогућује и следећи облик задавања почетне вредности приликом дефинисања структуре:

struct tip ime=izraz;

где izraz може да буде адресни израз чији је резултат податак структурног типа или позив функције чија је вредност функције истог типа као и посматрана структура.

Од структура могу да се образују и низови. Јединична промена показивача представља промену адресе за онолико бајтова колика је величина структурног податка.
Величина структуре у оперативној меморији може да се добије оператором sizeof.

Пољима структуре приступа се помоћу бинарног оператора .
Први операнд тог оператора је податак структурног типа s, а други операнд је идентификатор поља p такве структуре: s.p
Ако је ps показивач на структуру, пољу p те структуре приступа се помоћу: (*ps).p
Заграде су неопходне.
Због врло честе употребе показивача на структуре дефинисан је и бинарни оператор -> за приступ пољу p структуре на коју показује показивач ps: ps->p

Поља структура су подаци (прости или сложени) којима може да се образује адреса изразом &s.p. ако се та адреса додељује неком показивачу px (px=&s.p) пољу x унутар структуре s може да се приступа и изразом *px.

Пример:

struct tacka {int x,y;}; 
struct tacka a,b,c,p={35,-12},q; 
struct pravougaonik {struct tacka dole_levo,gore_desno;}; 
struct pravougaonik w,x,y={{1,1},{3,3}}; 
struct krug {double r;struct tacka centar;}; 
a.x=13;a.y=-22; /* promenljiva a je tipa struct tacka. Njena polja obelezavaju se sa a.x i a.y. Dodela konstantnih vrednosti tim poljima moguca je samo pojedinacno. Notacija a={13,-22} dozvoljena je samo za dodelu pocetne vrednosti (inicijalizaciju) prilikom definisanja promenljive */
x.dole_levo.x=4;x.dole_levo.y=-5; /* promenljiva x je tipa struct pravougaonik, cija polja se obelezavaju sa x.dole_levo i x.gore_desno. Posto je x.dole_levo tipa struct tacka operator . moze jos jednom da se primeni i da se tako dodje do skalarnih polja x.dole_levo.x i x.dole_levo.y. Zapazi da se u izrazu x.dole_levo.x identifikator x pojavljuje na dva mesta. Prvi put je ime promenljive, a drugi put ime polja strukture */
x.gore_desno.x=7;x.gore_desno.y=0;
w.dole_levo=a;w.gore_desno=p; /* promeljiva w je tipa struct pravougaonik, pa su w.dole_levo i w.gore_desno tipa struct tacka. Posto su i promenljive a i p tipa struct tacka navedene dodele vrednosti su ispravne */

пример 2 – показивачи, низови, функције и структуре

/* definisanje tipa Tacka */
typedef struct {int x,y;} Tacka; /* naredbom typedef uvedena je skracenica Tacka za tip koji predstavlja strukturu sa dva polja za koordinate tacaka u ravni */
/* stvaranje tacke od zadatih koordinata */
Tacka pravi_tacku(int x, int y) /* ova funkcija sluzi za sastavljanje podatka Tacka od dva skalarna celobrojna podatka. Formiramo lokalnu promenljivu t sa zadatim vrednostima polja x i y, a zatim tu promenljivu vracamo kao vrednost funkcije */
{
Tacka t;
t.x=x;t.y=y;
return t;
}
/* izracunavanje rastojanja izmedju dve tacke */
#include<math.h>
double rastojanje (Tacka g, Tacka h) /* izracunava rastojanje izmedju dve tacke. Parametri ove funkcije su tipa Tacka */
{
return sqrt(pow(g.x-h.x,2)+pow(g.y-h.y,2));
}
/* nalazenje najblize tacke koordinatnom pocetku u nizu tacaka */
Tacka *najbliza(const Tacka a[],int n) / pronalazi u skupu tacaka onu koja je najbliza koordinatnom pocetku. Skup tacaka predstavlja se nizom a ciji su elementi tipa Tacka. Posto se sadrzaj tog niza ne menja unutar funkcije definisan je kao nepromenljiv (const) niz. Vrednost funkcije je pokazivac na elemenat niza a koji sadrzi koordinate te najblize tacke */
{
Tacka *min=a;double r=rastojanje(a[0],NULA);int i;
for(i=1;i<n;i++)
{
double s=rastojanje(a[i],NULA);
if(s<r){r=s;min=a+i;}
}
return min;
}
/* konstanta za oznacavanje koordinatnog pocetka */
const Tacka NULA={0,0}; /* globalni nepromenljivi podatak NULA uveden je za simbolicko predstavljanje koordinatnog pocetka. Modifikator const pri definisanju obezbedjuje nepromenljivost podatka NULA. Uprkos tome, NULA se ne smatra konstantom, vec samo nepromenljivim podatkom i ne sme da se koristi na mestima na kojima se izricito traze konstante */

Вама преостаје да напишете главни програм који користи ове дефинисане функције!

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се /  Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се /  Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се /  Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се /  Промени )

Повезивање са %s