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