PROGRAMIRANJE II A 12 Stek red i kruni

  • Slides: 18
Download presentation
PROGRAMIRANJE II A 12 – Stek, red i kružni bafer dr Dražen Brđanin Goran

PROGRAMIRANJE II A 12 – Stek, red i kružni bafer dr Dražen Brđanin Goran Banjac Danijela Banjac Aleksandar Keleč (bdrazen@etfbl. net) (goran. banjac@etfbl. net) (danijela. banjac@etfbl. net) (aleksandar. kelec@etfbl. net) 2015.

A 12 STEK Napisati program u kojem treba: • definisati linearnu strukturu sa LIFO

A 12 STEK Napisati program u kojem treba: • definisati linearnu strukturu sa LIFO disciplinom pristupa (STEK) koja služi za smještanje cijelih brojeva, pri čemu je potrebno koristiti sekvencijalnu reprezentaciju steka, • definisati funkciju koja stavlja broj na stek, • definisati funkciju koja skida broj sa steka, • definisati funkciju koja provjerava da li je stek prazan, • definisati funkciju koja provjerava da li je stek pun, • definisati funkciju koja skida sve brojeve sa steka i prebacuje ih u niz, • u glavnom programu ilustrovati rad sa stekom tj. definisanim funkcijama. #include <stdio. h> #include <stdlib. h> #define MAX 100 typedef struct stek { int niz[MAX]; int tos; } STEK; Stek, red i kružni bafrer 2

A 12 STEK int is. Full(STEK *s) { return s->tos == MAX - 1;

A 12 STEK int is. Full(STEK *s) { return s->tos == MAX - 1; } int is. Empty(STEK *s) { return s->tos == -1; } int* isprazni. Stek(STEK *s) { int *niz, i = 0; if (is. Empty(s)) return 0; niz = (int *)malloc((s->tos + 1)*sizeof(int)); while (!is. Empty(s)) niz[i++] = s->niz[s->tos--]; return niz; } int push(STEK *s, int podatak) { if (is. Full(s)) return 0; s->niz[++s->tos] = podatak; return 1; } int pop(STEK *s, int *podatak) { if (is. Empty(s)) return 0; *podatak = s->niz[s->tos--]; return 1; } Stek, red i kružni bafrer 3

A 12 STEK int main() { int i, podatak, n, *rezultat; STEK stek; stek.

A 12 STEK int main() { int i, podatak, n, *rezultat; STEK stek; stek. tos = -1; Stavljanje prvih 10 prirodnih brojeva na stek. . . printf("Stavljanje Naprvih stek 10 jeprirodnih stavljenbrojeva broj: na 1 stek. . . n"); for (i = 1; i <= Na 10; stek i++) je stavljen broj: 2 if (push(&stek, Na i))stek je stavljen broj: 3 printf("Na stek je stavljen broj: %dn", i); Na stek je stavljen broj: 4 if (is. Full(&stek)) printf("Stek je pun!n"); Na stek je broj: 5 printf("Pokusaj stavljanja na stavljen pun stek. . . n"); Na printf("Na stek je stavljen broj: 6 broj: %dn", i); if (push(&stek, i)) stek je stavljen Na stek stavljen broj: 7 else printf("Greska! Stek je pun. n"); printf("Pokusaj skidanja sa steka. . . n"); Na stek broja je stavljen broj: 8 if (pop(&stek, &podatak)) Na stek je stavljen broj: 9 printf("Sa steka skinut %dn", podatak); Najestek je broj: stavljen broj: 10 printf("Nakon skidanja svih brojeva sa steka: n"); Stek je pun! n = stek. tos; Pokusaj stavljanja na pun stek. . . rezultat = isprazni. Stek(&stek); Greska! Stek je pun. if (rezultat != 0) { skidanja elementa sa steka. . . for (i = 0; i<n. Pokusaj + 1; i++) printf("%d ", Sa rezultat[i]); steka je skinut broj: 10 free(rezultat); }Nakon skidanja svih brojeva sa steka: if (is. Empty(&stek)) je prazan!n"); 9 8 printf("n. Stek 7 6 5 4 3 2 1 return 0; Stek je prazan! } Stek, red i kružni bafrer 4

A 12 STEK Napisati program u kojem treba: • definisati tip ARTIKAL kojim se

A 12 STEK Napisati program u kojem treba: • definisati tip ARTIKAL kojim se reprezentuje artikal (podaci koji se vode o artiklu su: naziv, količina i cijena), • definisati linearnu strukturu sa LIFO disciplinom pristupa (STEK) koja služi za smještanje artikala, pri čemu je potrebno koristiti ulančanu reprezentaciju steka, • definisati funkciju koja stavlja novi artikal na stek, • definisati funkciju koja skida artikal sa steka, • definisati funkciju koja formatirano ispisuje podatke o svim artiklima. #include <stdio. h> #include <stdlib. h> typedef struct { char naziv[21]; double kol, cijena; } ARTIKAL; typedef struct cvor { ARTIKAL art; struct cvor *sljedeci; } CVOR; Stek, red i kružni bafrer 5

A 12 STEK void push(CVOR **tos, ARTIKAL art) { CVOR *novi = (CVOR*)malloc(sizeof(CVOR)); novi->art

A 12 STEK void push(CVOR **tos, ARTIKAL art) { CVOR *novi = (CVOR*)malloc(sizeof(CVOR)); novi->art = art; if (*tos == 0) { novi->sljedeci = 0; *tos = novi; return; } novi->sljedeci = *tos; *tos = novi; } int pop(CVOR **tos, ARTIKAL *art) { if (*tos == 0) return 0; CVOR *p = *tos; *art = p->art; *tos = p->sljedeci; free(p); return 1; } void citaj(ARTIKAL *art) { printf(" Naziv: "); scanf("%s", art->naziv); printf(" Kolicina: "); scanf("%lf", &art->kol); printf(" Cijena: "); scanf("%lf", &art->cijena); } void pisi(CVOR *tos) { ARTIKAL art; int rb = 1; printf("--- ---------- ------n"); printf("RB. NAZIV KOL. CIJENA UKUPNOn"); printf("--- ---------- ------n"); while (pop(&tos, &art)) printf("%2 d. %-20 s %6. 2 lfn", rb++, art. naziv, art. kol, art. cijena, art. kol*art. cijena); printf("--- ---------- ------n"); } Stek, red i kružni bafrer 6

A 12 STEK int main() { int i, n; CVOR *tos = 0; ARTIKAL

A 12 STEK int main() { int i, n; CVOR *tos = 0; ARTIKAL art 1, art 2; n=2 do printf("n="), Stavljanje scanf("%d", &n); artikala na stek. . . while (n < 1); Podaci o 1. artiklu: printf("Stavljanje artikala na stek. . . n"); Naziv: Banane for (i = 0; i < n; i++) Kolicina: 2 { 1. 5 printf("Podaci o Cijena: %d. artiklu: n", i + 1); citaj(&art 1); Podaci o 2. artiklu: push(&tos, art 1); Naziv: Jabuke } Kolicina: 3 Cijena: 1. 2 printf("Skidanje artikala sa steka i njihov ispis. . . n"); Skidanje artikala sa steka i njihov ispis. . . pisi(tos); return 0; } Stek, red i kružni bafrer --RB. --1. 2. -----------NAZIV ----------Jabuke Banane ----------KOL. -----3. 00 2. 00 ------CIJENA -----1. 20 1. 50 ------UKUPNO -----3. 60 3. 00 ------ 7

A 12 RED Napisati program u kojem treba: • definisati linearnu strukturu sa FIFO

A 12 RED Napisati program u kojem treba: • definisati linearnu strukturu sa FIFO disciplinom pristupa (RED) koja služi za smještanje cijelih brojeva, pri čemu je potrebno koristiti sekvencijalnu reprezentaciju reda, • definisati funkciju koja dodaje novi broj u red, • definisati funkciju koja briše broj iz reda, • definisati funkciju koja provjerava da li je red prazan, • definisati funkciju koja provjerava da li je red pun, • definisati funkciju koja ispisuje sve brojeve iz reda, • u glavnom programu ilustrovati rad sa redom tj. definisanim funkcijama. #include <stdio. h> #include <stdlib. h> #define MAX 100 typedef struct red { int niz[MAX]; int f, r; } RED; Stek, red i kružni bafrer 8

A 12 RED int is. Full(RED *red) { return red->r == MAX; } int

A 12 RED int is. Full(RED *red) { return red->r == MAX; } int is. Empty(RED *red) { return red->f == -1 || red->f == MAX; } int obrisi(RED *red, int *podatak) { if (is. Empty(red)) return 0; *podatak = red->niz[red->f++]; return 1; } int dodaj(RED *red, int podatak) { if (is. Full(red)) return 0; if (red->f == -1) red->f = 0; red->niz[red->r++] = podatak; return 1; } void pisi(RED *red) { if (red->f != -1) for (int i = red->f; i < red->r; i++) printf("%d ", red->niz[i]); } Stek, red i kružni bafrer 9

A 12 RED int main() { RED red; red. f = -1; red. r

A 12 RED int main() { RED red; red. f = -1; red. r = 0; int podatak; for (int i = 1; i <= 10; i++) dodaj(&red, i); printf("Prikaz reda: "); pisi(&red); if (obrisi(&red, &podatak)) { printf("n. Obrisan broj %d iz reda. ", podatak); printf("n. Prikaz reda nakon brisanja: "); pisi(&red); } else printf("Greska! Red je prazan. "); Prikaz reda: 1 2 3 4 5 6 7 8 9 10 printf("n. Unesite broj koji zelite dodati u red: "); Obrisan broj 1 iz reda. scanf("%d", &podatak); Prikaz ureda nakon brisanja: 2 3 4 5 podatak) 6 7 8 9? 10 printf("Broj %d %sdodat red. n", podatak, dodaj(&red, "" : "nije "); Unesite broj koji zelite dodati u red: 22 printf("Prikaz reda nakon dodavanja: "); pisi(&red); Broj 22 dodat u red. return 0; Prikaz reda nakon dodavanja: 2 3 4 5 6 7 8 9 10 22 } Stek, red i kružni bafrer 10

A 12 RED Napisati program u kojem treba: • definisati tip STUDENT kojim se

A 12 RED Napisati program u kojem treba: • definisati tip STUDENT kojim se reprezentuje student (podaci koji se vode o studentu su: indeks, prezime, ime i prosjek), • definisati linearnu strukturu sa FIFO disciplinom pristupa (RED) koja služi za smještanje podataka o studentima, pri čemu je potrebno koristiti ulančanu reprezentaciju reda, • definisati tip CVOR kojim se reprezentuje element reda, • definisati funkciju koja dodaje novog studenta u red, • definisati funkciju koja briše studenta iz reda, • definisati funkciju koja briše sve studente iz reda, • definisati funkciju koja formatirano ispisuje podatke o svim studentima koji su u redu, • definisati funkciju koja omogućava učitavanje podataka o studentu, • u glavnom programu prikazivati meni prema kojem korisnik može da vrši: § dodavanje podataka o novom studentu, § brisanje podataka, § prikaz podataka o svim studentima, Stek, red i kružni bafrer 11

A 12 RED #include <stdio. h> #include <stdlib. h> typedef struct { char indeks[8],

A 12 RED #include <stdio. h> #include <stdlib. h> typedef struct { char indeks[8], prezime[21], ime[21]; double prosjek; } STUDENT; typedef struct cvor { STUDENT s; struct cvor *sljedeci; } CVOR; CVOR *f = 0, *r = 0; void dodaj(STUDENT *s) { CVOR *novi = (CVOR *)malloc(sizeof(CVOR)); novi->s = *s; novi->sljedeci = 0; if (f == 0 && r == 0) { f = r = novi; return; } r->sljedeci = novi; r = novi; } void brisi_red() { while (brisi()); } Stek, red i kružni bafrer int brisi() { CVOR *p = f; if (f == 0) { return 0; } if (f == r) { f = r = 0; } else { f = f->sljedeci; } free(p); return 1; } 12

A 12 RED void citaj(STUDENT *s) { printf(" Indeks: "); scanf("%s", s->indeks); printf(" Prezime:

A 12 RED void citaj(STUDENT *s) { printf(" Indeks: "); scanf("%s", s->indeks); printf(" Prezime: "); scanf("%s", s->prezime); printf(" Ime: "); scanf("%s", s->ime); printf(" Prosjek: "); scanf("%lf", &s->prosjek); } void pisi() { CVOR *p = f; int rb = 1; printf("--- ------------printf("RB. INDEKS PREZIME printf("--- ------------while (p != 0) { printf("%2 d. %s %-20 s %7. 2 lfn", p->s. ime, p->s. prosjek); p = p->sljedeci; } printf("--- ------------} Stek, red i kružni bafrer ----------n"); IME PROSJEKn"); ----------n"); rb++, p->s. indeks, p->s. prezime, ----------n"); 13

A 12 RED int main() { ========================== char c; Dodavanje [D], brisanje [B], prikaz

A 12 RED int main() { ========================== char c; Dodavanje [D], brisanje [B], prikaz [P], kraj [0]? D STUDENT *s = (STUDENT*)malloc(sizeof(STUDENT)); Unesite podatke: do { Indeks: 1102/14 printf("==========================n"); Prezime: Bojanic printf("Dodavanje [D], brisanje prikaz [P], kraj [0]? "); Ime: [B], Bojana scanf("n%c", &c); Prosjek: 10 if (c == 'D') { ========================== printf(" Unesite podatke: n"); Dodavanje [D], brisanje [B], prikaz [P], kraj [0]? D citaj(s); Unesite podatke: Indeks: 1101/14 dodaj(s); Prezime: Markovic } Ime: Marko else if (c == 'B') { Prosjek: 9. 5 if (brisi()) printf(" Obrisani su ========================== podaci o studentu!n"); Dodavanje [D], brisanje [B], prikaz [P], kraj [0]? P else printf(" Greska! Red je prazan. n"); -------------------} RB. INDEKS PREZIME else if (c == 'P') pisi(); -------------------else if (c != '0') printf("1. 1102/14 Nepoznata opcija - '%c'. n", c); Bojanic Bojana } while (c != '0'); 2. 1101/14 Markovic Marko brisi_red(); -------------------printf("KRAJ!n"); ========================== return 0; Dodavanje [D], brisanje [B], prikaz [P], kraj [0]? 0 KRAJ! } Stek, red i kružni bafrer ------PROSJEK ------10. 00 9. 50 ------- 14

A 12 KRUŽNI BAFER Napisati program u kojem treba: • definisati linearnu strukturu kružni

A 12 KRUŽNI BAFER Napisati program u kojem treba: • definisati linearnu strukturu kružni bafer koja služi za smještanje cijelih brojeva, pri čemu je potrebno koristiti sekvencijalnu reprezentaciju bafera, bez prepisivanja, • definisati funkciju koja dodaje novi broj u bafer, • definisati funkciju koja briše broj iz bafera, • definisati funkciju koja provjerava da li je bafer prazan, • definisati funkciju koja provjerava da li je bafer pun, • definisati funkciju koja ispisuje sve brojeve iz bafera, • u glavnom programu prikazivati meni prema kojem korisnik može da vrši: § dodavanje broja u bafer, § brisanje broja iz bafera, § prikaz svih brojeva u baferu. #include <stdio. h> #include <stdlib. h> #define MAX 5 typedef struct red { int niz[MAX]; int f, r; } RED; Stek, red i kružni bafrer 15

A 12 KRUŽNI BAFER int is. Full(RED *bafer) { return (bafer->r + 1) %

A 12 KRUŽNI BAFER int is. Full(RED *bafer) { return (bafer->r + 1) % MAX == bafer->f; } int is. Empty(RED *bafer) { return bafer->f == -1; } int brisi(RED *bafer, int *podatak) { if (is. Empty(bafer)) return 0; *podatak = bafer->niz[bafer->f]; if (bafer->f == bafer->r) bafer->f = bafer->r = -1; else bafer->f = (bafer->f + 1) % MAX; return 1; } int dodaj(RED *bafer, int podatak) { if (is. Full(bafer)) return 0; if (bafer->f == -1) bafer->f = 0; bafer->r = (bafer->r + 1) % MAX; bafer->niz[bafer->r] = podatak; return 1; } Stek, red i kružni bafrer int pisi(RED *bafer) { if (is. Empty(bafer)) return 0; int i = bafer->f; if (bafer->f <= bafer->r) { while (i <= bafer->r) printf("%d ", bafer->niz[i++]); } else { while (i <= MAX - 1) printf("%d ", bafer->niz[i++]); i = 0; while (i <= bafer->r) printf("%d ", bafer->niz[i++]); } return 1; } 16

A 12 KRUŽNI BAFER int main() { RED bafer; bafer. f = bafer. r

A 12 KRUŽNI BAFER int main() { RED bafer; bafer. f = bafer. r = -1; char c; int broj; ========================== do { Dodavanje[D], brisanje [B], prikaz [P], kraj [0]? D printf("==========================n"); Unesite broj: 1 printf("Dodavanje[D], brisanje [B], . . . prikaz [P], kraj [0]? "); ========================== scanf("n%c", &c); Dodavanje[D], brisanje [B], prikaz [P], kraj [0]? D if (c == 'D') { Unesite broj: 5 printf(" Unesite broj: "); ========================== scanf("%d", &broj); brisanje prikaz [P], kraj [0]? D if (dodaj(&bafer, broj) Dodavanje[D], == 0) printf(" Bafer[B], je pun!n"); Unesite broj: 6 } Bafer je pun! else if (c == 'B') { ========================== if (brisi(&bafer, &broj)) Dodavanje[D], brisanje [B], prikaz [P], kraj [0]? P printf(" Obrisan je broj: %dn", broj); Sadrzaj bafera: 1 2 3 4 5 else printf(" Bafer je ========================== prazan!n"); } Dodavanje[D], brisanje [B], prikaz [P], kraj [0]? B else if (c == 'P') { Obrisan je broj: 1 printf(" Sadrzaj bafera: "); ========================== if (pisi(&bafer) == 0) Dodavanje[D], brisanje [B], prikaz [P], kraj [0]? D Unesite broj: 6 printf("n Bafer je prazan!n"); ========================== else printf("n"); Dodavanje[D], brisanje [B], prikaz [P], kraj [0]? P } bafera: 2 3 4 - 5'%c'. n", 6 else if (c != '0') printf(" Sadrzaj Nepoznata opcija c); ========================== } while (c != '0'); Dodavanje [D], brisanje [B], prikaz [P], kraj [0]? 0 printf("KRAJ!n"); return 0; KRAJ! } Stek, red i kružni bafrer 17

A 12 ZADACI ZA VJEŽBU 1. Napisati program koji čita riječi iz datoteke čiji

A 12 ZADACI ZA VJEŽBU 1. Napisati program koji čita riječi iz datoteke čiji se naziv navodi kao prvi argument komandne linije i upisuje ih nazad u datoteku, ali u obrnutom poretku. Za čuvanje riječi u programu potrebno je koristiti ulančanu reprezentaciju steka. 2. Napisati program koji provjerava da li je unesena riječ palindrom pomoću steka. Potrebno je koristiti sekvencijalnu reprezentaciju steka. 3. Napisati program koji ilustruje rad prioritetnog reda. U red je potrebno smiještati studente, pri čemu studenti sa većim prosjekom imaju viši prioritet, tj. potrebno je da se nalaze u redu ispred studenata sa nižim prioritetom. Definisati tip STUDENT kojim se reprezentuje student (podaci koji se vode o studentu su: indeks, prezime, ime i prosjek). 4. Napisati program za obradu artikala. Potrebno je koristiti kružni bafer za čuvanje artikala. Artikal se smatra obrađenim nakon što se doda u kružni bafer, tako da nakon obrade više nije potreban, tj. moguće ga je prebrisati novim artiklom koji dođe u bafer. Definisati tip ARTIKAL kojim se reprezentuje artikal (podaci koji se vode o artiklu su: naziv, količina i cijena). Stek, red i kružni bafrer 18