Professional Documents
Culture Documents
У претходним лекцијама је објашњено како можемо направити колекције података истог типа
помоћу једнодимензионалних и вишедимензионалних низова и стрингова. На пример:
int redbr;
char prezime[20];
char ime[20];
float prosek;
Овакву колекцију података није могуће сачувати у низу, јер је низ колекција података истог типа.
Јасно је да је неопходно креирати сложени тип података који може чувати елементе различитих
типова.
Структура је сложени тип података која се састоји од одређеног броја елемената који могу бити
различитих типова. У другим програмским језицима уместо назива “структура” могу се наћи и
називи “запис” или “слог”. Елементи структурe називају се чланови структуре и обележавају се
идентификаторима. Чланови структуре могу бити било којег основног или сложеног типа
података, што значи да чланови структуре могу бити и друге структуре, низови, стрингови.
Структура је сложени тип података којег дефинише програмер. Ошти облик дефиниције
структуре, односно синтакса, изгледа овако:
struct ucenik {
int redbr;
char prezime[20];
char ime[20];
float prosek;
};
Структуре се обично дефинишу на почетку програма, пре функције main() и осталих функција, како
би се могле у њима користити.
Како је свака структура посебан тип података, то значи да се могу декларисати и иницијализовати
променљиве типа структуре. На пример, следећим кодом:
struct ucenik {
int redbr;
char prezime[20];
char ime[20];
float prosek;
}u3;
u4.redbr = 15;
u4.prezime = "Petrovic";
gets(u4.ime);
scanf("%f", &u4.prosek);
printf("%d %s %s %f", u4.redbr, u4.prezime, u4.ime, u4.prosek);
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct ucenik {
int redbr;
char prezime[20];
char ime[20];
float prosek;
};
int main(void) {
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct ucenik {
int redbr;
char prezime[20];
char ime[20];
float prosek;
};
int main(void) {
scanf("%d", &u1.redbr);
scanf("%s", &u1.prezime);
scanf("%s", &u1.ime);
scanf("%f", &u1.prosek);
scanf("%d", &u2.redbr);
printf("Unesi prezime 2. ucenika: ");
scanf("%s", &u2.prezime);
scanf("%s", &u2.ime);
scanf("%f", &u2.prosek);
scanf("%d", &u3.redbr);
scanf("%s", &u3.prezime);
scanf("%s", &u3.ime);
scanf("%f", &u3.prosek);
return 0;
Низ структура
У случајевима када нам је потребно више променљивих типа одређене структуре, није практично
да их декларишемо појединачно, што се види из претходног примера. Функционалније решење је
да декларишемо низ кога чине елементи који су типа структуре.
Низ структура декларишемо исто као и било који други низ. На пример, ако је декларисана
структура ucenik:
struct ucenik {
int redbr;
char prezime[20];
char ime[20];
float prosek;
};
struct ucenik {
int redbr;
char prezime[20];
char ime[20];
float prosek;
}ucenici[30];
Као и код низова које смо до сада користили, сваки елемент у низу има тачно одређену позицију
на основу које му се додељује јединствени индекс. Вредност индекса првог елемента је 0,
другог 1, трећег 2 итд. што значи да је индекс низа типа int.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct ucenik {
int redbr;
char prezime[20];
char ime[20];
float prosek;
}ucenici[3];
int main(void) {
int i;
scanf("%d", &ucenici[i].redbr);
scanf("%s", &ucenici[i].prezime);
scanf("%s", &ucenici[i].ime);
scanf("%f", &ucenici[i].prosek);
ucenici[i].ime, ucenici[i].prosek);
return 0;
Задатак је сада много елегантније решен, а кôд програма можемо лако преправити за евиденцију
података о било ком броју ученика променом броја елемената низа.
У следећем примеру:
typedef struct {
int redbr;
char prezime[20];
char ime[20];
float prosek;
}ucenik;
...
увели смо нови тип података структуре ucenik и дефинисали две променљиве тог типа u1 и u2.
ЗАДАТАК 4. Како би јасно видели разлику између коришћења структуре и коришћења типа
података структуре, напишите програм у којем је дефинисана структура ucenik и тип података
структуре nastavnik, па су потом додељене исписане вредности за једног ученика и једног
наставника.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
struct ucenik {
int redbr;
char prezime[20];
char ime[20];
};
typedef struct {
char prezime[20];
char ime[20];
char predmet[80];
}nastavnik;
int main(void) {
nastavnik n1;
u1.redbr = 1;
strcpy(u1.prezime, "Peric");
strcpy(u1.ime, "Pera");
puts("Ucenik:");
strcpy(n1.prezime, "Radlovacki");
strcpy(n1.ime, "Velimir");
strcpy(n1.predmet, "Programiranje");
puts("Nastavnik:");
return 0;
Угнежђене структуре
Структура може бити члан структуре (структура у структури, угнежђена структура). Члановима
угнежђене структуре приступамо користећи операторе тачка, наводећи прво променљиве типа
спољашње, па променљиве типа унутрашње (угнежђене) структуре, па име члана.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
struct kontakt {
char ulicaiBroj[80];
char mesto[30];
int pttBroj;
char telefon[20];
};
struct ucenik {
int redbr;
char prezime[20];
char ime[20];
};
int main(void) {
return 0;
Структуре и функције
ЗАДАТАК 6. Напишите програм у коме је дефинисан тип структуре ucenik и две функције – прва
функција kreirajUcenika као аргументе узима појединачне вредности чланова структуре и враћа
вредност типа структуре, а друга stampajUcenika као параметар добија структуру и исписује
вредности свих њених чланова (не враћа ништа).
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
typedef struct {
int redbr;
char prezime[20];
char ime[20];
}ucenik;
ucenik u;
u.redbr = redbr;
strcpy(u.prezime, prezime);
strcpy(u.ime, ime);
return u;
}
void stampajUcenika(ucenik u) {
};
int main(void) {
u1.redbr = 12;
strcpy(u1.prezime, "Peric");
strcpy(u1.ime, "Pera");
puts("Ucenik 1:");
stampajUcenika(u1);
puts("Ucenik 2:");
stampajUcenika(u2);
return 0;
Показивачи на структуре
Показиваче на структуре дефинишемо као и показиваче на податке било ког другог типа. На
пример, ако имамо дефинисан тип података структуре ucenik, можемо дефинисати
показивач pUcenik на тип структуре ucenik:
typedef struct {
int redbr;
char prezime[20];
char ime[20];
}ucenik;
...
ucenik *pUcenik;
typedef struct {
int redbr;
char prezime[20];
char ime[20];
}ucenik;
...
pUcenik = &u1;
typedef struct {
int redbr;
char prezime[20];
char ime[20];
}ucenik;
...
u1.redbr = 15;
strcpy(u1.ime, "Pera");
strcpy(u1.prezime, "Peric");
pUcenik = &u1;
pUcenik->ime
члановима структуре можемо приступити и на следећи начин:
(*pUcenik).ime
са напоменом да су заграде обавезне због приоритета оператора, као и да се овај начин ређе
користи.
Већ смо у претходним примерима дефинисали низ структура и додељивали вредности његовим
елементима, на пример:
typedef struct {
int redbr;
char prezime[20];
char ime[20];
}ucenik;
...
ucenik ucenici[30];
ucenici[0].redbr = 1;
strcpy(ucenici[0].prezime, "Aleksic");
strcpy(ucenici[0].ime, "Aleksa");
(ucenici+1)->redbr = 2;
strcpy((ucenici+1)->prezime, "Boric");
strcpy((ucenici+1)->ime, "Bora");
1. Комплексни број представља се у облику структуре која садржи реални и имагинарни део
комплексног броја. Пројектовати програмски модул за рад са комплексним бројевима који садржи
следеће функције:
– састављање комплексног броја од реалног и имагинарног дела
– израчунавање збира, разлике, производа и количника два комплексна броја
– читање комплексног броја преко главног улаза рачунара
– писање комплексног броја на главни излаз рачунара
Написати главни програм за приказивање могућности горњег модула.
Решење:
/* kompleks.c */
#include<math.h>
#include<stdio.h>
typedef struct {double re, im; } Kompl;
/* glavni program */
#include"kompleks.c"
main()
{
Kompl x,y,z,j={0,1};
while(1)
{
printf("\nprvi broj(re,im)? "); x=citaj();
printf("\ndrugi broj(re,im)? "); y=citaj();
if(y.re==0&&y.im==0)break;
z=zbir(x,y);printf("x+y= ");pisi(z);printf("\n");
z=razlika(x,y);printf("x-y= ");pisi(z);printf("\n");
z=proizvod(x,y);printf("x*y= ");pisi(z);printf("\n");
z=kolicnik(x,y);printf("x/y= ");pisi(z);printf("\n");
}
z=proizvod(j,j);printf("\nj^2= ");pisi(z);printf("\n");
}
2. Структура studenti садржи следећа поља: prezime, ime, broj_indeksa и mesto_stanovanja. Написати
програм који уноси податке за n студената (n<100), сортира их по пољу prezime и штампа сортиран низ.
Решење:
I – један модул, само главни програм
#include<stdio.h>
#include<string.h>
#define MAX 100
main()
{
struct studenti
{
char prezime[15];
char ime[15];
int broj_indeksa;
char mesto_stanovanja[15];
};
typedef struct {
char prezime[15];
char ime[15];
int broj_indeksa;
char mesto_stanovanja[15]; } Studenti;
/* glavni program */
#include<stdio.h>
#include<string.h>
#include"strukturaStudent.c"
#define MAX 100
main()
{
Studenti student[MAX];
int n;
printf("unesi broj studenata: ");scanf("%d", &n);
printf("\n");
printf("********************************\n"
"* PODACI O STUDENTIMA *\n"
"********************************\n");
unesi(student,n);
sortiraj(student,n);
pisi(student,n);
}
3. Написати програмски модул у коме се описује структура Tacka чија су поља координате тачке, и у
коме су описане функције за рад са структуром Tacka:
– формирање податка Tacka од два цела броја
– одређивање растојања између две тачке
– одређивање координата најближе тачке координатном почетку из датог скупа тачака.
У главном програму унети низ тачака и приказати координате најближе тачке.
Решење:
/* tacka.c */
#include<math.h>
double rastojanje (Tacka g, Tacka h)
{
return sqrt(pow(g.x-h.x,2)+pow(g.y-h.y,2));
}
/* glavni program */
#include<stdio.h>
#include"tacka.c"
main()
{
Tacka a[100], r; int i, n;
printf("unesi n: ");scanf("%d",&n);
printf("unesi elemente niza:\n");
for(i=0;i<n;i++)
{
printf("%d. x= ",i+1);scanf("%d",&a[i].x);
printf("y= ");scanf("%d",&a[i].y);
printf("\n");
}
r=*najbliza(a,n);
printf("koordinate najblize tacke koordinatnom pocetku su: x=%d, y=%d\n",r.x,r.y);
}
Zadaci za vežbu
1. Uneti ime i prezime učenika te broj opravdanih i neopravdanih časova. Ispisati ime,
2. Uneti ime, prezime te opšti uspeh za 2 učenika. Ispisati ime i prezime učenika koji ima
bolji uspeh!
3. Uneti ime, prezime učenika te ocene iz Srpskog, Matematike, Fizike i Engleskog. Ispisati
- Naziv knjige
- Naziv autora
- Tema knjige
- ID knjige
- Godina izdavanja
- Naziv knjige
- Naziv autora
- Tema knjige
- ID knjige
- Godina izdavanja