You are on page 1of 28

ОБЈЕКТНО – ОРИЕНТИРАНО

ПРОГРАМИРАЊЕ

Структури
Дефинирање на структури
 Структурите во 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;

се креира променлива за структура со име najdobar и со


форма како што е дефинирана за структурата student.
Променливите од тип структура може да се декларираат и во
продолжение, веднаш по дефиницијата на структурата:
struct student
{
char ime[30];
int indeks;
float prosek;
} najdobar, najubav;

Променливите од тип структура може да се иницијализираат на


следниов начин:
struct student najdobar = {“Jas”, 287, 8.25};
struct produkt x = {“mleko”, 40};

5
До членовите (компонентите) на структурата се пристапува со името на
променливата од тип структура и името на членот на структурата
раздвоени со операторот точка (“.”).
najdobar.indeks = 601;
printf("%s", najdobar.ime)
scanf("%f", &najdobar.prosek);

Областа на важење на променливите (полињата) декларирани во


структурата е самата дефиниција на структурата. Имињата на
членовите на структурите се независни од другите променливи со исто
име дефинирани надвор од структурата.
struct s {
int i;
int j;
} a;
int i = 10; 10 20 50
a.i = 20;
a.j = 50;
printf(“ %d %d %d \n”, i, a.i, a.j);
6
Полиња од структури може да се формираат на следниов начин:

struct student prva_godina[500];

при што секој елемент на полето prva_godina е структура од


типот student.

До елементите (членовите) на структурата што се наоѓа на


позиција i во полето, се пристапува на следниов начин:

prva_godina[i].index

Првата буква од името на i - тиот студент:

prva_godina[i].ime[0]

7
Често се јавува потреба членови на една структура да бидат други
структури што се нарекува и вгнездување на структури.

struct finki_student finki_student


{ pol
char pol; adresa
lice
char adresa[20];
ime
struct student lice;
indeks
float stipendija; prosek
} apsolventi[100];
stipendija

Првата буква од името на i - тиот студент:


apsolventi[i].lice.ime[0]
Покажувач на структура се декларира со:
struct student *pok;

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
Со структурите често се работи преку покажувачи. Пристап до
членовите на структура кон која покажува даден покажувач може
да се оствари со операторот ‘->’.

Пример програма: pok = &najdobar;


#include <stdio.h>
pok->indeks = 123;
#include <string.h> е идентично со
struct s (*pok).indeks = 123;
{
int i;
char niza[80]; najdobar.prosek
} s, *p; е идентично со
void main() (&najdobar)->prosek
{
p = &s;
s.i = 10;
p->i = 20;
strcpy(p->niza, "Mnogu sakam strukturi");
printf("%d %d %s\n", s.i, p->i, p->niza);
}
13
Следниот програм ја демонстрира употребата на
операторите за член на структура и покажувач кон
елемент од структура

/* KOristenje na chlenovi na strukturi i


operacii so pokazhuvachi kon strukturi */

#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 */

/* vmetni gi stringovite vo aCard */


aCard.brojka = "As";
aCard.boja = "Detelina";

cardPtr = &aCard; /* dodeli i adresa na aCard na cardPtr */

printf( "%s%s%s\n%s%s%s\n%s%s%s\n", aCard.brojka, " ", aCard.boja,


cardPtr->brojka, " ", cardPtr->boja,
( *cardPtr ).brojka, " ", ( *cardPtr ).boja );
} Излезот кој се добива е:
As Detelina
As Detelina
As Detelina

15
typedef
 Креира синоним за веќе дефиниран тип
 Вообичаено се употребува за креирање скратени имиња на
типови
Пр.
typedef int celbroj;
typedef float realen;
celbroj I,j;
realen x,y;

typedef struct student kandidat;


по што наместо struct student najdobar;
можеме да пишуваме и само kandidat najdobar;
typedef kandidat * kan_ptr;
kan_ptr kp=&najdobar;
16
Пример за употреба на структури
#include <stdio.h>
typedef struct point { typedef struct rect {
float x; tocka pt1;
float y; tocka pt2;
} tocka; } pravoagolnik;

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();

printf("Centar na pravoagolniokot ");


ekran.pecati(); printf(" e vo tockata ");
sredina.pecati(); printf("\n");
printf("Povrsinata na pravoagolniokot ");
prozor.pecati();
printf(" e %3.1f\n", prozor.povrsina());
return 0;
}
Centar na pravoagolniokot (2.0,3.0):(4.0,5.0) e vo tockata (3.0,4.0)
Povrsinata na pravoagolniokot (0.0,0.0):(5.0,3.0) e 15.0
20
Енумерација
 Множество од цели броеви претставени со симболички вредности
 Енумерирани константи – слични на симболичките константи, чии
вредности автоматски се поставуваат:
 вредности почнуваа од 0 и се зголемуваат за 1 за секој
нареден симбол;
 вредностите може експлицитно да се доделат со операторот =;
 имињата на симболите мора да бидат уникатни.
Со дефиницијата на енумерација се воведува нов податочен тип.
Променливите од овој тип може да ги примаат вредностите само
на дефинираните симболички константи за тој тип.

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 }

enum boja { bela, zolta=2, crvena, sina=5, zelena, crna};

enum boja { bela, zolta=3, crvena, sina=5, zelena=4, crna};


28
Унии
 Единствена меморија која содржи различни типови на
променливи во текот на времето;
 Содржи само еден податок во даден момент истовремено;
 Членовите на унијата ја делат меморијата;
Декларирањето на унија е исто како и декларирањето на
структура:
union Number { Number
int x; xy
float y;
} br;
Преведувачот обезбедува доволно простор за чување на
најголемата променлива во дефиницијата на унијата.
Останатите променливи за сместување на своите вредности
искористуваат само дел од оваа меморија. Вредностите на
членовите на унијата се доделуваат слично како и за
структурите, со тоа што во исто време во меморијата може да
биде присутен само еден член.

29
Дефинирање унија

 Дефиницијата на унија е со зборот union.


 Со следниот пример се дефинира унија mix.
union mix { bajti
int broj; 2
float realen; 8
char bukva; 1
};
 За mix ќе биде одвоен доволен простор за
сместување на најголемиот елемент што го
содржи, т.е. float.
 Променлива од тип mix се дефинира на пример
со:
union mix fit;

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>

/* definicija na unija od broevi */


union number {
int x;
double y;
};

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

Stavi realen broj vo unijata


i ispechati gi dvata chlena.
int: 0
double:
100.000000

33
Прашања?

35

You might also like