You are on page 1of 17

PROGRAMIRANJE II

A10 – Stek, red i kružni bafer

dr Dražen Brđanin (bdrazen@etfbl.net)


Goran Banjac (goran.banjac@etfbl.net)
Danijela Banjac (danijela.banjac@etfbl.net)
Aleksandar Keleč (aleksandar.kelec@etfbl.net)

2016.
A10 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>
int push(STEK *s, int podatak) {
#include <stdlib.h>
if (isFull(s)) return 0;
#define MAX 10
s->niz[++s->tos] = podatak;
return 1;
typedef struct stek {
}
int niz[MAX];
int tos;
int pop(STEK *s, int *podatak) {
} STEK;
if (isEmpty(s)) return 0;
*podatak = s->niz[s->tos--];
int isFull(STEK *s) { return s->tos == MAX - 1; }
return 1;
}
int isEmpty(STEK *s) { return s->tos == -1; }

Stek, red i kružni bafrer 2


A10 STEK
int* isprazniStek(STEK *s) {
if (isEmpty(s)) return 0;
int i = 0, *niz = (int *)malloc((s->tos + 1) * 10
Stavljanje prvih sizeof(int));
prirodnih brojeva na stek...
while (!isEmpty(s)) niz[i++]
Na= stek
s->niz[s->tos--];
je stavljen // pop(s,
broj: 1 niz + i++);
return niz;
Na stek je stavljen broj: 2
}
int main() { Na stek je stavljen broj: 3
Na STEK
int i, podatak, n, *rezultat; stekstek;
je stavljen
stek.tos broj:
= -1; 4
printf("Stavljanje prvih 10Na stek jebrojeva
prirodnih stavljen broj: 5
na stek...\n");
for (i = 1; i <= 10; i++) Na stek je stavljen broj: 6
if (push(&stek, i)) printf("Na
Na stekstek
jejestavljen
stavljen broj:
broj: %d\n",
7 i);
if (isFull(&stek)) { Na stek je stavljen broj: 8
printf("Stek je pun!\n"); printf("Pokusaj stavljanja na pun stek...\n");
Na stek je stavljen broj: 9
if (push(&stek, i)) printf("Na stek je stavljen broj: %d\n", i);
else printf("Greska! StekNa
je stek je stavljen broj: 10
pun.\n");
} Stek je pun!
Pokusaj
printf("Pokusaj skidanja broja stavljanja na pun stek...
sa steka...\n");
Greska! Stek
if (pop(&stek, &podatak)) printf("Sa stekaje
je pun.
skinut broj: %d\n", podatak);
printf("Nakon skidanja svihPokusaj
brojeva sa steka: \n");
skidanja elementa sa steka...
n = stek.tos + 1; rezultat Sa
= isprazniStek(&stek);
steka je skinut broj: 10
for (i = 0; i < n; i++) printf("%d ", rezultat[i]);
Nakon skidanja svih brojeva sa steka:
free(rezultat);
9 8 7 6je5 prazan!\n");
if (isEmpty(&stek)) printf("\nStek 4 3 2 1
return 0; Stek je prazan!
}
Stek, red i kružni bafrer 3
A10 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;

void push(CVOR **tos, ARTIKAL *art) { int pop(CVOR **tos, ARTIKAL *art) {
CVOR *novi = (CVOR*)malloc(sizeof(CVOR)); if (*tos == 0) return 0;
novi->art = *art; CVOR *p = *tos;
novi->sljedeci = *tos; *art = p->art;
*tos = novi; *tos = p->sljedeci;
} free(p);
return 1;
}

Stek, red i kružni bafrer 4


A10 STEK
void pisi(CVOR **tos) {
ARTIKAL art; int rb = 1;
printf("--- -------------------- ------ ------ ------\n");
printf("RB. NAZIV KOL. CIJENA UKUPNO\n");
printf("--- -------------------- ------ ------ ------\n");
while (pop(tos, &art))
n=2
Stavljanje
printf("%2d. %-20s %6.2lf %6.2lf %6.2lf\n",artikala
rb++, na stek...
Podaci
art.naziv, art.kol, art.cijena, o 1. *artiklu:
art.kol art.cijena);
Naziv:------
printf("--- -------------------- ------ Banane
------\n");
} Kolicina: 2
void citaj(ARTIKAL *art) { Cijena: 1.5
printf(" Naziv: "); scanf("%s",Podaci
art->naziv);
o 2. artiklu:
printf(" Kolicina: "); scanf("%lf", &art->kol);
Naziv: Jabuke
printf(" Cijena: "); scanf("%lf", &art->cijena);
} Kolicina: 3
int main() { Cijena: 1.2
int i, n; CVOR *tos = 0; ARTIKALSkidanje
art; artikala sa steka i njihov ispis...
do printf("n="), scanf("%d", &n);
---while (n < 1);
-------------------- ------ ------ ------
printf("Stavljanje artikala na stek...\n");
RB. NAZIV KOL. CIJENA UKUPNO
for (i = 0; i < n; i++) --- -------------------- ------ ------ ------
printf("Podaci o %d. artiklu:\n", i + 1), citaj(&art), push(&tos, &art);
1. Jabuke
printf("Skidanje artikala sa steka i njihov ispis...\n");
3.00 1.20 3.60
pisi(&tos); 2. Banane 2.00 1.50 3.00
return 0; --- -------------------- ------ ------ ------
}
Stek, red i kružni bafrer 5
A10 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> int dodaj(RED *red, int podatak) {
#include <stdlib.h> if (isFull(red)) return 0;
#define MAX 100 if (red->f == -1) red->f = 0;
typedef struct red { red->niz[red->r++] = podatak;
int niz[MAX]; int f, r; return 1;
} RED; }

int isFull(RED *red) { return red->r == MAX; } int obrisi(RED *red, int *podatak) {
if (isEmpty(red)) return 0;
int isEmpty(RED *red) { *podatak = red->niz[red->f++];
return red->f == -1 || red->f == red->r; return 1;
} }

Stek, red i kružni bafrer 6


A10 RED
void pisi(RED *red) {
if (red->f != -1)
for (int i = red->f; i < red->r; i++)
printf("%d ", red->niz[i]);
}
int main() {
RED red; red.f = -1; red.r = 0;
int podatak, i;
for (i = 1; i <= 10; i++)
dodaj(&red, i);
printf("Prikaz reda: ");
pisi(&red);
if (obrisi(&red, &podatak)) {
printf("\nObrisan broj %d iz reda.", podatak);
printf("\nPrikaz reda nakon brisanja: ");
pisi(&red);
}
else Prikaz reda: 1 2 3 4 5 6 7 8 9 10
printf("Greska! Red je prazan.");
Obrisan broj 1 iz reda.
printf("\nUnesite broj koji zelitereda
Prikaz dodati u red:
nakon "); scanf("%d",
brisanja: 2 3 4 5&podatak);
6 7 8 9 10
printf("Broj %d %sdodat u Unesite
red.\n", broj
podatak, dodaj(&red, podatak)
koji zelite dodati u red:? "" 22
: "nije ");
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 7
A10 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 8


A10 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;

void dodaj(CVOR **pf, CVOR **pr, STUDENT *s) {


CVOR *novi = (CVOR *)malloc(sizeof(CVOR));
novi->s = *s;
novi->sljedeci = 0;
if (*pf == 0) *pf = *pr = novi; void brisi_red(CVOR **pf, CVOR **pr) {
else { STUDENT pom;
(*pr)->sljedeci = novi; while (brisi(pf, pr, &pom));
*pr = novi; }
}
} void citaj(STUDENT *s) {
int brisi(CVOR **pf, CVOR **pr, STUDENT *s) { printf(" Indeks: ");
if (*pf == 0) return 0; scanf("%s", s->indeks);
CVOR *p = *pf; printf(" Prezime: ");
*s = p->s; scanf("%s", s->prezime);
if (*pf == *pr) *pf = *pr = 0; printf(" Ime: ");
else *pf = p->sljedeci; scanf("%s", s->ime);
free(p); printf(" Prosjek: ");
return 1; scanf("%lf", &s->prosjek);
} }
Stek, red i kružni bafrer 9
A10 RED
void pisi(CVOR *f) {
int rb = 1; ====================================================
Dodavanje [D], --------------------
printf("--- ------- -------------------- brisanje [B], prikaz [P], kraj [0]? D
-------\n");
printf("RB. INDEKS PREZIME Unesite podatke:IME PROSJEK\n");
Indeks: 1102/14
printf("--- ------- -------------------- -------------------- -------\n");
while (f) { Prezime: Bojanic
Ime: Bojana
printf("%2d. %s %-20s %-20s %7.2lf\n", rb++, f->s.indeks, f->s.prezime,
Prosjek: 10
f->s.ime, f->s.prosjek);
====================================================
f = f->sljedeci; Dodavanje [D], brisanje [B], prikaz [P], kraj [0]? D
} Unesite podatke:
printf("--- ------- -------------------- -------------------- -------\n");
Indeks: 1101/14
} Prezime: Markovic
int main() { CVOR *f = 0, *r = 0; Ime:
charMarko
c; STUDENT s;
do { Prosjek: 9.5
printf("====================================================\n");
====================================================
Dodavanje
printf("Dodavanje [D], brisanje [D],
[B], brisanje
prikaz [P],[B],
krajprikaz
[0]? [P], kraj [0]? P
"); scanf("\n%c", &c);
if (c == 'D') { printf(" --- -------
Unesite --------------------
podatke:\n"); --------------------
citaj(&s); -------
dodaj(&f, &r, &s); }
else if (c == 'B') { RB. INDEKS PREZIME IME PROSJEK
--- -------Obrisani
if (brisi(&f, &r, &s)) printf(" --------------------
su podaci o --------------------
studentu %s, %s!\n",-------
1. 1102/14 Bojanic Bojana 10.00
s.prezime, s.ime);
2. 1101/14 Markovic Marko 9.50
else printf(" Greska! Red je prazan.\n");
--- ------- -------------------- -------------------- -------
} ====================================================
else if (c == 'P') pisi(f);
Dodavanje [D], brisanje [B], prikaz [P], kraj [0]? 0
else if (c != '0') printf("
KRAJ!Nepoznata opcija - '%c'.\n", c);
} while (c != '0'); brisi_red(&f, &r); printf("KRAJ!\n"); return 0; }
Stek, red i kružni bafrer 10
A10 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;

int isFull(RED *bafer) { return (bafer->r + 1) % MAX == bafer->f; }


int isEmpty(RED *bafer) { return bafer->f == -1; }

Stek, red i kružni bafrer 11


A10 KRUŽNI BAFER
int dodaj(RED *bafer, int podatak) int pisi(RED *bafer) {
{ if (isEmpty(bafer))
if (isFull(bafer)) return 0;
return 0; int i = bafer->f;
if (bafer->f == -1) if (bafer->f <= bafer->r)
bafer->f = 0; {
bafer->r = (bafer->r + 1) % MAX; while (i <= bafer->r)
bafer->niz[bafer->r] = podatak; printf("%d ", bafer->niz[i++]);
return 1; }
} else
{
int brisi(RED *bafer, int *podatak) while (i <= MAX - 1)
{ printf("%d ", bafer->niz[i++]);
if (isEmpty(bafer)) i = 0;
return 0; while (i <= bafer->r)
*podatak = bafer->niz[bafer->f]; printf("%d ", bafer->niz[i++]);
if (bafer->f == bafer->r) }
bafer->f = bafer->r = -1; return 1;
else }
bafer->f = (bafer->f + 1) % MAX;
return 1;
}

Stek, red i kružni bafrer 12


A10 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); ===================================================
if (c == 'D') { Dodavanje[D], brisanje [B], prikaz [P], kraj [0]? D
printf(" Unesite broj: "); Unesite broj: 5
scanf("%d", &broj); ===================================================
Dodavanje[D],
if (dodaj(&bafer, broj) == 0) brisanje
printf(" Bafer je [B], prikaz [P], kraj [0]? D
pun!\n");
} Unesite broj: 6
else if (c == 'B') { Bafer je pun!
if (brisi(&bafer, &broj)) ===================================================
printf(" Obrisan je broj:Dodavanje[D],
%d\n", broj);brisanje [B], prikaz [P], kraj [0]? P
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
printf("\n Bafer je prazan!\n");
Unesite broj: 6
else printf("\n"); ===================================================
} Dodavanje[D], brisanje [B], prikaz [P], kraj [0]? P
Sadrzaj bafera:
else if (c != '0') printf(" Nepoznata opcija -2 '%c'.\n",
3 4 5 6 c);
} while (c != '0'); ====================================================
printf("KRAJ!\n"); return 0; Dodavanje [D], brisanje [B], prikaz [P], kraj [0]? 0
} KRAJ!

Stek, red i kružni bafrer 13


A10 KRUŽNI BAFER
Napisati program koji simulira obradu procesorskih instrukcija pomoću kružnog bafera.
Potrebno je koristiti sekvencijalnu reprezentaciju kružnog bafera, sa prepisivanjem.
Instrukcija se sastoji od naziva, opcode-a (oktalni podatak veličine dva bajta), ukupnog
broja operanada i (dinamičkog) niza adresa svih operanada (heksadecimalni podaci
veličine četiri bajta). Obrada instrukcije podrazumijeva ispis parametara instrukcije, nakon
čega je potrebno obrisati instrukciju iz bafera. U glavnom programu prikazivati meni prema
kojem korisnik može da dodaje instrukcije u bafer i da ih obrađuje.
#include <stdio.h>
#include <stdlib.h>
#define MAX 10

typedef struct { char naziv[MAX]; short opcode; int bro; int *adrese; } INSTRUKCIJA;

typedef struct red { INSTRUKCIJA niz[MAX]; int f, r; } RED;

int isFull(RED *bafer) {


return (bafer->r + 1) % MAX == bafer->f;
}

int isEmpty(RED *bafer) {


return bafer->f == -1;
}
Stek, red i kružni bafrer 14
A10 KRUŽNI BAFER
int dodaj(RED *bafer, INSTRUKCIJA *inst) int brisi(RED *bafer, INSTRUKCIJA *inst)
{ {
if (isFull(bafer)) if (isEmpty(bafer))
bafer->f = (bafer->f + 1) % MAX; return 0;
if (bafer->f == -1) *inst = bafer->niz[bafer->f];
bafer->f = 0; if (bafer->f == bafer->r)
bafer->r = (bafer->r + 1) % MAX; bafer->f = bafer->r = -1;
bafer->niz[bafer->r] = *inst; else
return 1; bafer->f = (bafer->f + 1) % MAX;
} return 1;
}
void citaj(INSTRUKCIJA *inst)
{
printf(" Naziv: ");
scanf("%s", inst->naziv);
printf(" Opcode: ");
scanf("%ho", &inst->opcode);
printf(" Br. operanada: ");
scanf("%u", &inst->bro);
inst->adrese = (int*)calloc(inst->bro, sizeof(int));
for (int i=0; i<inst->bro; i++) {
printf(" %d. operand (adr): ", i + 1);
scanf("%x", &inst->adrese[i]);
}
}
Stek, red i kružni bafrer 15
A10 KRUŽNI BAFER
int main() { =======================================================
RED bafer; INSTRUKCIJA instr; bafer.f = bafer.r
Dodavanje = -1;
[D], obrada [O], kraj [0]? D
char c; Naziv: ADD
do { Opcode: 20
printf("=======================================================\n");
Br. operanada: 2
printf("Dodavanje [D], obrada [O],1.kraj [0]?(adr):
operand "); f1234570
scanf("\n%c", &c); 2. operand (adr): f123456a
if (c == 'D'){ =======================================================
citaj(&instr); Dodavanje[D], obrada [O], kraj [0]? D
dodaj(&bafer, &instr); Naziv: MUL
} Opcode: 70
else if (c == 'O') { Br. operanada: 2
1. operand (adr): f0aaaa11
if (brisi(&bafer, &instr)) {
2. operand (adr): f0aaaa31
printf(" Obradjena instrukcija: %s (%o), [", instr.naziv, instr.opcode);
=======================================================
for (int i = 0; i<instr.bro; i++)
Dodavanje[D], obrada [O], kraj [0]? O
printf("%x", instr.adrese[i]), i<instr.bro-1
Obradjena instrukcija:? ADD
printf(", ") : printf("]\n");
(20), [f1234570, f123456a]
free(instr.adrese); =======================================================
} Dodavanje[D], obrada [O], kraj [0]? O
else printf(" Bafer je prazan!\n");
Obradjena instrukcija: MUL (70), [f0aaaa11, f0aaaa31]
} =======================================================
Dodavanje[D],
else if (c != '0') printf(" Nepoznata obrada
opcija [O], kraj c);
- '%c'.\n", [0]? O
} while (c != '0'); Bafer je prazan!
printf("KRAJ!\n"); =======================================================
return 0; Dodavanje[D], obrada [O], kraj [0]? 0
} KRAJ!

Stek, red i kružni bafrer 16


A10 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 17

You might also like