40
Staša Vujičić Čas 13

Programiranje 1 programski jezik c

  • Upload
    fraley

  • View
    52

  • Download
    3

Embed Size (px)

DESCRIPTION

Programiranje 1 programski jezik c. Staša Vujičić Čas 13. Strukture – osnovni pojmovi. Struktura je kolekcija nekoliko promenljivih, potencijalno razli č itih tipova, koje su grupisane pod jednim imenom radi lak š eg rada sa njima. - PowerPoint PPT Presentation

Citation preview

Page 1: Programiranje 1  programski jezik c

Staša VujičićČas 13

Page 2: Programiranje 1  programski jezik c

Struktura je kolekcija nekoliko promenljivih, potencijalno različitih tipova, koje su grupisane pod jednim imenom radi lakšeg rada sa njima.

Članovima strukture pristupa se operatorom "tačka” (npr a.x). Ovaj operator ima najviši mogući prioritet.

2

Page 3: Programiranje 1  programski jezik c

Jedine operacije koje su dozvoljene nad objektom strukturnog tipa su:- dodela vrednosti strukturnog tipa promenljivoj tog tipa.

- uzimanje adrese operatorom & (čime se dobija pokazivač na strukturu)- pristup članovima strukture, operatorom tačka.

3

Page 4: Programiranje 1  programski jezik c

Kada je u pitanju odnos struktura i funkcija, važe sledeća pravila:

- struktura se može prenositi kao argument funkcije. Pri tom se prenos vrši po vrednosti (kreira se lokalna kopija) - struktura se može vraćati kao povratna vrednost funkcije.

4

Page 5: Programiranje 1  programski jezik c

Napisati program koji izračunava obim i površinu trougla i kvadrata.

/* Program uvodi strukture - geometrijske figure */

#include <stdio.h>#include <math.h> /* Zbog funkcije sqrt */

/* Tacke su predstavljene sa dve koordinate. Strukturom gradimo novi tip podataka. */

struct point{

int x;int y;

};5

Page 6: Programiranje 1  programski jezik c

/* Izracunava duzinu duzi zadatu sa dve tacke */

float segment_length(struct point A, struct point B)

{int dx = A.x - B.x;int dy = A.y - B.y;return sqrt(dx*dx + dy*dy);

}

6

Page 7: Programiranje 1  programski jezik c

/* Izracunava povrsinu trougla Heronovim obrascem. Argumenti funkcije su tri tacke koje predstavljaju temena trougla */

float Heron(struct point A, struct point B, struct point C)

{/* Duzine stranica */float a = segment_length(B, C);float b = segment_length(A, C);

float c = segment_length(A, B);/* Poluobim */float s = (a+b+c)/2;return sqrt(s*(s-a)*(s-b)*(s-c));

}7

Page 8: Programiranje 1  programski jezik c

/* Izracunava obim poligona. Argumenti funkcije su niz tacaka koje predstavljaju temena poligona kao i njihov broj */

float circumference(struct point polygon[], int num){

int i;float o = 0.0;

/* Dodajemo duzine stranica koje spajaju susedna temena */for (i = 0; i<num-1; i++)

o += segment_length(polygon[i], polygon[i+1]);

/* Dodajemo duzinu stranice koja spaja prvo i poslednje teme */

o += segment_length(polygon[num-1], polygon[0]);

return o;}

8

Page 9: Programiranje 1  programski jezik c

/* Izracunava povsinu konveksnog poligona. Argumenti funkcije su niz tacaka koje predstavljaju temena poligona kao i njihov broj */

float area(struct point polygon[], int num){/* Povrsina */

float a = 0.0;int i;

/* Poligon delimo na trouglove i posebno izracunavamo povrsinu svakoga od njih */for (i = 1; i < num -1; i++)

a += Heron(polygon[0], polygon[i], polygon[i+1]);

return a;}

9

Page 10: Programiranje 1  programski jezik c

struct point srediste (struct point a, struct point b)

{ struct point s;

s.x = (a.x + b.x) / 2; s.y = (a.y + b.y) / 2;

return s;}

10

Page 11: Programiranje 1  programski jezik c

main(){/* Definisemo dve promenljive tipa tacke */

struct point a;/* Inicijalizujemo tacku b na (1,2) */

struct point b = {1, 2};/* triangle je niz od tri tacke - trougao (0,0),

(0,1), (1,0) */struct point triangle[3];

/* square je niz od cetiri tacke - jedinicni kvadrat.

Obratiti paznju na nacin inicijalizacije niza struktura */struct point square[4] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}};

11

Page 12: Programiranje 1  programski jezik c

/* Postavljamo vrednosti koordinata tacke a*/a.x = 0; a.y = 0;

/* Gradimo trougao (0,0), (0,1), (1,0) */triangle[0].x = 0; triangle[0].y = 0;triangle[1].x = 0; triangle[1].y = 1;triangle[2].x = 1; triangle[2].y = 0;

12

Page 13: Programiranje 1  programski jezik c

/* Ispisujemo vrednosti koordinata tacaka */printf("x koordinata tacke a je %d\n", a.x);printf("y koordinata tacke a je %d\n", a.y);printf("x koordinata tacke b je %d\n", b.x);printf("y koordinata tacke b je %d\n", b.y);printf("Obim trougla je %f\n",circumference(triangle, 3));printf("Obim kvadrata je %f\n",circumference(square, 4));printf("Povrsina trougla je %f\n",Heron(triangle[0], triangle[1], triangle[2]));/* Broj tacaka je moguce odrediti i putem sizeof

*/printf("Povrsina kvadrata je %f\n",area(square, sizeof(square)/sizeof(struct

point)));}

13

Page 14: Programiranje 1  programski jezik c

Izlaz:x koordinata tacke a je 0y koordinata tacke a je 0x koordinata tacke b je 1y koordinata tacke b je 2Obim trougla je 3.414214Obim kvadrata je 4.000000Povrsina trougla je 0.500000Povrsina kvadrata je 1.000000

14

Page 15: Programiranje 1  programski jezik c

Strukture se u funkcije prenose po vrednosti. Moguće je koristiti pokazivače na strukture.

#include <stdio.h>

typedef struct point{int x, y;} POINT;

15

Page 16: Programiranje 1  programski jezik c

/* Zbog prenosa po vrednosti tacka ne moze biti ucitana */

void get_point_wrong(POINT p){

printf("x = ");scanf("%d", &p.x);printf("y = ");scanf("%d", &p.y);

}

16

Page 17: Programiranje 1  programski jezik c

/* Koriscenjem prenosa preko pokazivaca, uspevamo */

void get_point(POINT* p){

/* p->x je skraceni zapis za (*p).x */printf("x = ");scanf("%d", &p->x);printf("y = ");scanf("%d", &p->y);

}

17

Page 18: Programiranje 1  programski jezik c

main(){

POINT a = {0, 0};printf("get_point_wrong\n");get_point_wrong(a);printf("a: x = %d, y = %d\n", a.x, a.y);printf("get_point\n");get_point(&a);printf("a: x = %d, y = %d\n", a.x, a.y);

}

18

Page 19: Programiranje 1  programski jezik c

Napisati funkciju koja sabira dva kompleksna broja i rezultat vraća kao povratnu vrednost.

Napisati funkciju koja oduzima dva kompleksna broja i rezultat vraća preko liste argumenata.

Napisati program koji testira rad ovih funkcija.

19

Page 20: Programiranje 1  programski jezik c

#include<stdio.h>

typedef struct complex{

float Re,Im;} COMPLEX;

20

Page 21: Programiranje 1  programski jezik c

COMPLEX saberi(COMPLEX prvi, COMPLEX drugi)

{COMPLEX rezultat;rezultat.Re = prvi.Re + drugi.Re;rezultat.Im = prvi.Im + drugi.Im;return rezultat;

}

21

Page 22: Programiranje 1  programski jezik c

void oduzmi(COMPLEX prvi, COMPLEX drugi, COMPLEX *rezultat)

{rezultat->Re = prvi.Re - drugi.Re;rezultat->Im = prvi.Im - drugi.Im;

}

22

Page 23: Programiranje 1  programski jezik c

main(){

COMPLEX k1,k2,k3;

printf("Unesi realni i imaginarni deo prvog kompleksnog broja:\n");scanf("%f %f", &k1.Re, &k1.Im);

printf("Unesi realni i imaginarni deo drugog kompleksnog broja:\n");scanf("%f %f", &k2.Re, &k2.Im);

23

Page 24: Programiranje 1  programski jezik c

k3=saberi(k1,k2);printf("(%.2f + %.2f *i) + (%.2f + %.2f *i)

= (%.2f + %.2f *i) ",k1.Re, k1.Im, k2.Re, k2.Im, k3.Re, k3.Im);

oduzmi(k1,k2,&k3);printf("(%.2f + %.2f *i) - (%.2f + %.2f *i)

= (%.2f + %.2f *i) ",k1.Re, k1.Im, k2.Re, k2.Im, k3.Re, k3.Im);}

24

Page 25: Programiranje 1  programski jezik c

Uneti niz osoba, koje se karakterišu svojim imenom i brojem godina, sortirati po imenu a unutar istog imena, po starosti.

#include<stdio.h>#include<string.h> /*Zbog funkcija za rad sa

stringovima*/#define MAXIME 15typedef struct osoba{char ime[MAXIME]; /*Mora se ograniciti duzina

niza!*/int starost;} OSOBA;

25

Page 26: Programiranje 1  programski jezik c

main(){

OSOBA nizOsoba[100];OSOBA pom;int n, i, j;printf("Unesi broj osoba manji od 100\n");scanf("%d", &n);printf("Unesi %d osoba:\n", n);for(i=0; i<n; i++)

scanf("%s %d", &nizOsoba[i].ime,

&nizOsoba[i].starost);26

Page 27: Programiranje 1  programski jezik c

for(i=0; i<n-1; i++)for(j=i+1; j<n; j++)/*Ukoliko je ime i-te osobe leksikografski

ispred (vece od) imena druge osobe ili ako su istog imena i i-ta osoba je starija od j-te...*/

if(strcmp(nizOsoba[i].ime, nizOsoba[j].ime) >0 ||

(strcmp(nizOsoba[i].ime, nizOsoba[j].ime)==0 &&

nizOsoba[i].starost > nizOsoba[j].starost))

27

Page 28: Programiranje 1  programski jezik c

/*...razmeni mesta i-toj i j-toj osobi.*/{strcpy(pom.ime, nizOsoba[j].ime);pom.starost = nizOsoba[j].starost;strcpy(nizOsoba[j].ime, nizOsoba[i].ime);nizOsoba[j].starost = nizOsoba[i].starost;strcpy(nizOsoba[i].ime, pom.ime);nizOsoba[i].starost = pom.starost;}

28

Page 29: Programiranje 1  programski jezik c

printf("Sortiran niz je:\n");for(i=0; i<n; i++)printf("%s %d\n", nizOsoba[i].ime,

nizOsoba[i].starost);}

29

Page 30: Programiranje 1  programski jezik c

Krugovi i tačke.

#include <stdio.h>#include <math.h>

/* Struktura tacka koja predstavlja tacku u euklidskoj ravni */

struct tacka { double x; double y;};

30

Page 31: Programiranje 1  programski jezik c

/* Struktura krug sadrzi centar i poluprecnik kruga. Centar kruga je podatak tipa struct tacka. Ovim demonstriramo da clan strukture moze biti podatak bilo kog tipa, pa i druga struktura */

struct krug { struct tacka o; double r;};

31

Page 32: Programiranje 1  programski jezik c

/* Funkcija racuna rastojanje izmedju dve tacke. Ova funkcija demonstrira prenos struktura preko pokazivaca. Ovaj pristup treba uvek koristiti, cak i kada nemamo nameru da menjamo vrednost podatka unutar funkcije, zato sto je prenos pokazivaca brzi nego kopiranje citavog objekta strukturnog tipa. */

double rastojanje(struct tacka *a, struct tacka *b)

{ /* Obratiti paznju na pristup clanovima

strukture preko pokazivaca i operatora strelica */

return sqrt((a->x - b->x) * (a->x - b->x) + (a->y - b->y) * (a->y - b->y));

}32

Page 33: Programiranje 1  programski jezik c

/* Funkcija utvrdjuje da li tacka p pripada krugu k. */

int pripada_krugu(struct tacka *p, struct krug *k)

{ if(rastojanje(p, &k->o) == k->r) return 1; else return 0;}

33

Page 34: Programiranje 1  programski jezik c

/* Funkcija main */int main (){

struct tacka p; struct krug k;

/* Ucitavamo koordinate tacaka i poluprecnik kruga */

printf("Uneti koordinate tacke p: "); scanf("%lf%lf", &p.x, &p.y);

34

Page 35: Programiranje 1  programski jezik c

printf("Uneti koordinate centra kruga: "); scanf("%lf%lf", &k.o.x, &k.o.y);

printf("Uneti poluprecnik kruga: "); scanf("%lf", &k.r);

/* Ispitujemo da li tacka pripada krugu i ispisujemo odgovarajuce poruke. */

if(pripada_krugu(&p, &k)) printf("Tacka pripada krugu\n"); else printf("Tacka ne pripada krugu\n");}

35

Page 36: Programiranje 1  programski jezik c

Unija je struktura koja može čuvati (u različito vreme) objekte različitih tipova i veličina. Time se obezbeđuje manipulisanje različitim vrstama podataka u istom memorijskom području.

Unija za razliku od stukture zauzima samo onoliko prostora koliko je dovoljno za smeštanje njenog najvećeg člana. Zbog toga je u svakom trenutku moguće koristiti samo jedan od članova unije.

36

Page 37: Programiranje 1  programski jezik c

#include <stdio.h>typedef union u{

int i;float f;char c;

} u;main(){

u unija;unija.c='A';unija.i=5;

37

Page 38: Programiranje 1  programski jezik c

/* Dozvoljen je pristup samo poslednje dodeljenom clanu unije */

printf("Trenutna vrednost unije je %d\n",unija.i); /* U redu je */

/* Pogresno bi bilo da se napiseprintf("Trenutna vrednost unije je %c\

n",unija.c);*/}

38

Page 39: Programiranje 1  programski jezik c

/* Ova unija moze da sadrzi ceo ili realan broj (u jednom trenutku samo jedno od ta dva) */

typedef union ceo_ili_realan { int ceo; double realan;} Ceo_ili_realan;

39

Page 40: Programiranje 1  programski jezik c

/* Funkcija main */int main (){ Ceo_ili_realan x;

/* Koristimo x kao ceo broj */ printf("Uneti ceo broj: "); scanf("%d", &x.ceo); printf("Celobrojna vrednost: %d\n", x.ceo);

/* Koristimo x kao realan broj */ printf("Uneti realan broj: "); scanf("%lf", &x.realan); printf("Realna vrednost: %f\n", x.realan);}

40