Professional Documents
Culture Documents
Предавање структури
Предавање структури
ПРОГРАМИРАЊЕ
Структури
Дефинирање на структури
Структурите во C претставуваат колекции (агрегации) на
логички поврзани податоци од различни видови во единствена
целина, заради поедноставна претстава и манипулација.
Структурите во C се нехомогени структури на податоци.
Во комбинација со покажувачите претставуваат основа за
креирање на сложените динамички структури на податоци како
листи, магацини, редови, стебла, ...
Општиот облик за дефинирање на структури во C е следниов:
struct ime_na_strukturata
{
field-type field-name; /* deklaracii na promenlivi */
field-type field-name;
...
} lista_na_promenlivi;
2
Пример:
struct student struct produkt
{ {
char ime[30];
char ime[30]; float cena;
int indeks; };
float prosek;
};
struct дефинира структура со име student
student е името на структурата (податочен тип) кое се користи за
декларирање на променливи од типот структура
student содржи три елементи (членови, компоненти):
една низа од 30 знаци – ime; student
еден цел број – indeks; и ime
еден децимален број – prosek. indeks
prosek
3
Членови на структура
Структурите не можат да содржат член што претставува
структура од истиот тип (инстанца на самите себе);
На пример, променлива од типот struct vraboten не може
да е декларирана во дефиницијата на struct vraboten
Структурите може да содржат член што претставува структура
од друг тип;
Структурите може да содржат член покажувач кон структура од
истиот тип;
Со дефиницијата на структура не се резервира никаков
мемориски простор. Со неа само се воведува нов податочен
тип од кој ќе може да се декларираат променливи од типот
структура.
4
Со struct student najdobar;
5
До членовите (компонентите) на структурата се пристапува со името на
променливата од тип структура и името на членот на структурата
раздвоени со операторот точка (“.”).
najdobar.indeks = 601;
printf("%s", najdobar.ime)
scanf("%f", &najdobar.prosek);
prva_godina[i].index
prva_godina[i].ime[0]
7
Често се јавува потреба членови на една структура да бидат други
структури што се нарекува и вгнездување на структури.
8
Покажувач кон структура
Покажувач кон дадената структура може да биде
вклучен во структурата. На пример:
struct vraboten2 {
char ime[20];
char prezime[20];
int vozrast;
char pol;
double plata;
// struct vraboten2 chovek; /* greshka */
struct vraboten2 *vPok; /* pokazhuvach e ok */
};
9
Операции со структури
Единствени операции што се дозволени со
структурите се:
(=) доделување на променлива од типот структура на
друга променлива од истиот тип;
(&) земање на адресата на променлива од типот
структура;
(.) пристап до членовите на структурата;
(sizeof) одредување на должината на структурата.
najdobar = najubav;
pok = &najdobar;
i = najdobar.index
sizeof(struct student) или sizeof(najdobar)
10
Иницијализација
Структурите можат да бидат иницијализирани со
користење на иницијализаторска листа , како и низите.
За да се иницијализира структура, по името на
променливата во дефиницијата се става знакот = и во
големи загради се доделуваат вредностите на секој од
членовите на структурата посебно:
struct karta {
char *brojka;
char *boja;
};
struct karta Karta = {“Dva”, “Srce”};
11
Иницијализација (2)
Ако имаме помалку елементи во листата отколку што
има членови, тогаш останатите членови се
поставуваат на 0 или NULL ако членот е покажувач.
На променливите кои се структури кои се
дефинирани надвор од функциската дефиниција
автоматски им се доделуваат вредности 0 или NULL
на членовите ако не се експлицитно дефинирани.
Променливите кои се структури можат да бидат
иницијализирани и со наредба на доделување на
вредност на друга променлива која е структура од
истиот тип.
12
Со структурите често се работи преку покажувачи. Пристап до
членовите на структура кон која покажува даден покажувач може
да се оствари со операторот ‘->’.
#include <stdio.h>
/* definicija na struktura karta */
struct karta {
char *brojka; /* pokazhuvach brojka */
char *boja; /* pokazhuvach boja */
}; /* kraj na strukturata karta */
14
int main()
{
struct karta aCard; /* promenliva od strukturata karta */
struct karta *cardPtr; /* pokazhuvach do strukturata karta */
15
typedef
Креира синоним за веќе дефиниран тип
Вообичаено се употребува за креирање скратени имиња на
типови
Пр.
typedef int celbroj;
typedef float realen;
celbroj I,j;
realen x,y;
tocka centar(pravoagolnik p) {
tocka c;
c.x=(p.pt1.x + p.pt2.x)/2;
c.y=(p.pt1.y + p.pt2.y)/2;
return c;
}
float povrsina(pravoagolnik r) {
return((r.pt2.x-r.pt1.x)*(r.pt2.y-r.pt1.y));
}
17
Пример за употреба на структури
int main() {
tocka pt, sredina; pravoagolnik prozor;
pravoagolnik ekran={{2,3}, {4,5}};
pt.x=pt.y=0; prozor.pt1 = pt;
prozor.pt2.x = 5; prozor.pt2.y = 3;
sredina = centar(ekran);
printf("Centar na pravoagolniokot
(%3.1f,%3.1f):(%3.1f,%3.1f) e vo tockata
(%3.1f,%3.1f)\n", ekran.pt1.x, ekran.pt1.y,
ekran.pt2.x, ekran.pt2.y, sredina.x,
sredina.y);
printf("Povrsinata na pravoagolniokot
(%3.1f,%3.1f):(%3.1f,%3.1f) e %3.1f\n",
prozor.pt1.x, prozor.pt1.y, prozor.pt2.x,
prozor.pt2.y, povrsina(prozor)); return 0; }
18
Употреба на структури со функции членки
#include <stdio.h> typedef struct rect {
typedef struct point { tocka pt1,pt2;
float x,y; float povrsina(void);
void pecati(void); tocka centar(void);
} tocka; void pecati(void);
} pravoagolnik;
void tocka::pecati(void)
{ printf("(%3.1f,%3.1f)", x, y); }
void pravoagolnik::pecati(void)
{ pt1.pecati(); printf(":"); pt2.pecati(); }
tocka pravoagolnik::centar(void)
{ tocka c; c.x=(pt1.x + pt2.x)/2;
c.y=(pt1.y + pt2.y)/2; return c;}
float pravoagolnik::povrsina(void)
{ return((pt2.x-pt1.x)*(pt2.y-pt1.y)); }
19
Употреба на структури со функции членки
int main() {
tocka pt, sredina; pravoagolnik prozor;
pravoagolnik ekran={{2,3}, {4,5}};
pt.x=pt.y=0;
prozor.pt1 = pt;
prozor.pt2.x = 5;
prozor.pt2.y = 3;
sredina = ekran.centar();
27
1 /* Fig. 10.18: fig10_18.c
2 Using an enumeration type */
3 #include <stdio.h> 1 Januari
4 2 Fevruari
3 Mart
5 enum months { JAN = 1, FEB, MAR, APR, MAY, JUN,
4 April
6 JUL, AUG, SEP, OCT, NOV, DEC }; 5 Maj
7 6 Juni
8 int main() 7 Juli
9 { 8 Avgust
10 months month; 9 Septemvri
11 const char *monthName[] = { "", "Januari", "Fevruari", 10 Oktomvri
11 Noemvri
12 "Mart", "April", "Maj",
12 Dekemvri
13 "Juni", "Juli", "Avgust",
14 "Septemvri", "Oktomvri",
15 "Noemvri", "Dekemvri" };
16
17 for ( month = JAN; month <= DEC; month++ )
18 printf( "%2d%11s\n", month, monthName[ month ] );
19
20 return 0;
21 }
29
Дефинирање унија
30
Достапување до елементи на унија
На елементите од унијата се пристапува преку операторот
'.', но може само еден од елементите да се складира.
Променлива од тип union mix може да биде или int или float
или char.
Ако е дадено:
union mix fit[10], edenmix;
fit[1].broj=10;
fit[2].realen=10.7;
fit[3].bukva='a';
тогаш првите три елементи од полето fit ќе содржат
вредности од различен тип. Но во следните доделувања:
edenmix.bukva='a';
edenmix.broj=20;
втората линија ќе ја пребрише претходната вредност
(edenmix.bukva='a'), двете вредности (int и char) не може
истовремено да се чуваат.
31
Што печати програмата
#include <stdio.h>
int main()
{
union number value;
value.x = 100; /* stavi cel broj vo unijata */
printf( "%s\n%s\n%s%d\n%s%f\n\n",
"Stavi cel broj vo celobrojniot chlen",
"i ispechati gi dvata chlena.","int: ", value.x,
"double:\n", value.y );
32
value.y = 100.0; /* stavi double vo istata unija */
printf( "%s\n%s\n%s%d\n%s%f\n",
"Stavi realen broj vo unijata",
"i ispechati gi dvata chlena.",
"int: ", value.x,
"double:\n", value.y );
return 0;
}
Излезот кој се добива може да биде:
Stavi cel broj vo celobrojniot chlen
i ispechati gi dvata chlena.
int: 100
double:
-9255959211743313600000000000000000000000000000000000000000.000000
33
Прашања?
35