Reseni - Zadaci C++

Download as pdf or txt
Download as pdf or txt
You are on page 1of 21

1.

Programski jezici
Reeni zadaci

Autor: Milo Radmanovi

Programski jezici - C++

Zadatak 1
Na programskom jeziku C++ napisati program za obradu podataka u dokumentu odreenog
formata. Dokument se predstavlja klasom Dokument, iji su privatni podaci ImeDokumenta,
Format, Datum tipa char*, Veliina (u bajtovima) tipa int (jedan karakter zauzima jedan bajt) i Lista
koja predstavlja pokaziva na lanana listu, gde se u svakom elementu lanane liste pamti po
jedan karakter. U okviru ove klase definisati:
- konstruktor ;
- funkciju za pretraivanje (nalaenje pozicije) gde se u dokumentu nalazi odre|ena re, gde je
ulazni paramatar funkcije podatak tipa char*. Funkcija treba da vrati poziciju na prvu prona|
enu re. U sluaju da re ne postoji funkcija vraa nulu. U okviru f-je odtampati broj
pronaenih rei.
- Operatorsku funkciju ++, koja brie sve blanko znake iz dokumenta (liste). Voditi rauna o
veliini dokumenta.
- funkcije za upis i itanje sadraja dokumenta, kao i njegovih atributa (ImeDokumenta, Format,
Datum, Veliina);
U glavnom programu formirati objekat tipa Dokument, upisati neki tekst u dokument, nai poziciju
rei Jezici, obrisati sve blanko znake iz dokumenta i odtampati njegov sadraj.
#include <iostream.h>
#include <stdio.h>
#include <string.h>
class Dokument
{
char *ImeDokumenta, *Format, *Datum;
int Velicina;
struct ll{
char info;
struct ll *link;
};
ll *Lista;
public:
Dokument(char *ID, char *F, char *D);
int
Pretrazivanje(char *rec);
Dokument& operator--();
void Upis();
void Citanje();
};
Dokument::Dokument(char *ID, char *F, char *D)
{
ImeDokumenta = new(char[10]);
Format = new(char[10]);
Datum = new(char[10]);
strcpy(ImeDokumenta, ID);
strcpy(Format, F);
strcpy(Datum, D);
Velicina=0;
Lista=NULL;
}
void Dokument::Upis()
{
char *pom=new char[80];
ll *pom1;
int i;
cout<<"Unesite ime dokumenta\n";
cin>>pom;
strcpy(ImeDokumenta, pom);
Elektronski fakultet u Niu, 2003/2004

Programski jezici - C++

cout<<"Unesite format dokumenta\n";


cin>>pom;
strcpy(Format, pom);
cout<<"Unesite Datum kreiranja\n";
cin>>pom;
strcpy(Datum, pom);
printf("Unesite sadrzaj dokumenta\n");
gets(pom);
//cin>>pom;
Velicina=strlen(pom);
for(i=Velicina-1;i>=0;i--)
{
pom1=new ll;
pom1->info=pom[i];
pom1->link=Lista;
Lista=pom1;
}

}
void Dokument::Citanje()
{
ll *pom2;
cout<<"Ime dokumenta: "<<ImeDokumenta<<"\n";
cout<<"Format dokumenta: "<<Format<<"\n";
cout<<"Datum kreiranja: "<<Datum<<"\n";
cout<<"Velicina dokumenta: "<<Velicina<<" bajta\n";
cout<<"Sadrzaj dokumenta: ";
pom2=Lista;
while (pom2!=NULL)
{
cout<<pom2->info;
pom2=pom2->link;
}
cout<<"\n";
return;
}
int Dokument::Pretrazivanje(char *rec)
{
ll *pom3, *pom4;
int i,n,br, nadjeno, prva, brpr;
n=strlen(rec);
pom3=Lista;
br=1;
brpr=0;
prva=0;
while (pom3!=NULL)
{
nadjeno=1;
pom4=pom3;
for(i=0;i<n; i++)
{
if (pom4!=NULL && pom4->info!=rec[i])
nadjeno=0;
if (pom4==NULL)
nadjeno=0;
else
pom4=pom4->link;
}
if (nadjeno)
{
if (brpr==0)
prva=br;
Elektronski fakultet u Niu, 2003/2004

Programski jezici - C++

brpr++;
}
pom3=pom3->link;
br++;

}
cout<<"Broj pronadjenih reci je:";
cout<<brpr<<"\n";
return prva;

}
Dokument& Dokument::operator--()
{
ll *pom5, *pom6;
pom5=Lista;
pom6=NULL;
while (pom5!=NULL)
{
while (pom5->link!=NULL && pom5->info!=' ')
{
pom6=pom5;
pom5=pom5->link;
}
if (pom5->info==' ')
{
pom6->link=pom5->link;
delete pom5;
pom5=pom6->link;
Velicina--;
}
else
pom5=pom5->link;
}
return *this;
}
void main()
{
Dokument Dok("Pj",".doc","14122001");
Dok.Upis();
cout<<"Rec
je
pronadjena
na
poziciji:
"<<Dok.Pretrazivanje
("Jezici")<<"\n";
--Dok;
Dok.Citanje();
}

Elektronski fakultet u Niu, 2003/2004

Programski jezici - C++

Zadatak 2
(Nastavak na zadatak 1)
Kreirati klasu Vek javno izvedenu iz apstraktne klase Vektor. Zatieni lanovi klase Vektor su
dinamiki vektor i njegova veliina. Privatni lan klase Vek je string koji predstavlja ime vektora.
Javni lanovi klase Vek su: konstruktor i funkcija za sortiranje vektora uz tampanje imena
vektora, funkcija za sumiranje elemenata, pri emu se redefinie funkcija Suma klase Vektor tako
da se rauna suma elemenata umanjena za maksimalni element.
#include <iostream.h>
#include<string.h>
class Vektor{
protected:
int *v;
int vel;
public:
Vektor(int v1);
~Vektor(){delete v;};
int velicina(){return vel;}
int elem(int i){return v[i];};
int& operator[](int i){return v[i];};
virtual int suma();
int max();
};
Vektor::Vektor(int v1)
{
vel=v1;
v=new int[v1];
}
int Vektor::suma()
{
int j,s=0;
for (j=0;j<vel;j++)
s=s+v[j];
return s;
}
int Vektor::max()
{
int j,m=v[0];
for (j=1;j<vel;j++)
if (m<v[j])
m=v[j];
return m;
}
class Vek : public Vektor{
char* ime;
public:
Vek(int j,char*s);
void sort();
virtual int suma();
};
Vek::Vek(int j,char* s):Vektor(j)
{
ime=new char[strlen(s)];
strcpy(ime,s);
}
Elektronski fakultet u Niu, 2003/2004

Programski jezici - C++

int Vek::suma()
{
return Vektor::suma()-max();
}
void Vek::sort()
{
int i, j, pom;
for(i=0;i<vel-1;i++)
for(j=i;j<vel;j++)
if (v[i]>v[j])
{
pom=v[i];
v[i]=v[j];
v[j]=pom;
}
return;
}
void main()
{
char* str=new char[10];
cin>>str;
Vek a(4,str);
int ii;
for (ii=0;ii<a.velicina();ii++)
a[ii]=ii;
cout<<a.suma();
}

Zadatak 3
Na programskom jeziku C++ definisati apstaktnu klasu CStudenti, pri emu se za svakog
studenta pamte ime, prezime, godina studija i prosena ocena. Na osnovu ove klase definisati
klasu CStudentiRTI koja sadri procenu ocenu za predmete sa RTI smera i lananu listu LL
elemenata klase CIspit. Klasa CIspit sadri naziv ispita, smer kome ispit pripada i ocenu studenta.
Definisati sledee funkcije: virtuelnu funkciju Prosek koja izraunava prosenu ocenu za
predmete sa RTI smera na osnovu lanane liste LL i funkciju Dodaj(char * imeispita) koja u
lananu listu dodaje novi ipsit.
#include <iostream.h>
#include <string.h>
class CStudenti{
char *ime, *prezime;
int gs;
float po;
public:
CStudenti(char* ime1, char* prezime1, int gs1, float po1);
virtual void Prosek()=0;
};
CStudenti::CStudenti(char* ime1, char* prezime1, int gs1, float po1)
{
ime=new char[strlen(ime1)];
prezime=new char[strlen(prezime1)];
strcpy(ime, ime1);
strcpy(prezime, prezime1);
gs=gs1;
po=po1;
}
Elektronski fakultet u Niu, 2003/2004

Programski jezici - C++

class CIspit{
char* naziv;
char* smer;
int ocena;
public:
void Postavi(char *naziv1, char *smer1, int ocena1);
char* Uzmi_naziv(){return naziv;}
char* Uzmi_smer(){return smer;}
int Uzmi_ocenu(){return ocena;}
};
void CIspit::Postavi(char *naziv1, char *smer1, int ocena1)
{
naziv=new char[strlen(naziv1)];
smer=new char[strlen(smer1)];
strcpy(naziv,naziv1);
strcpy(smer,smer1);
ocena=ocena1;
}
class CStudentiRTI : public CStudenti{
float poRTI;
struct lista{
CIspit i;
struct lista* link;
};
lista *ll;
public:
virtual void Prosek();
void Dodaj(char* imeispita);
};
void CStudentiRTI::Prosek()
{
int s=0;
int n=0;
lista *pom;
pom=ll;
while (pom!=NULL)
{
if (strcmp(pom->i.Uzmi_smer(),"RTI")==0)
{
s=s+pom->i.Uzmi_ocenu();
n=n+1;
pom=pom->link;
}
}
poRTI=(float)(s/n);
return;
}
void CStudentiRTI::Dodaj(char* imeispita)
{
lista *pom;
lista *elem;
char* sm=new char[10];
int oc;
cin>>oc>>sm;
elem=new lista[sizeof CIspit];
elem->i.Postavi(imeispita,sm,oc);
elem->link=NULL;
if (ll==NULL)
ll=elem;
else
{
Elektronski fakultet u Niu, 2003/2004

Programski jezici - C++

pom=ll;
while (pom->link!=NULL)
pom=pom->link;
pom->link=elem;

Zadatak 4
Na programskom jeziku C++ definisati apstaktnu klasu Krug, pri emu se za svaki krug pamte
koordinate centra i poluprenik kruga. Na osnovu ove klase definisati klasu ObojeniKrug koja
sadri celobrojni podatak boja i virtualnu funkciju PromenaPoluprecnika(int novi). Za krugove ija
je boja zelena definisati posebnu klasu ZeleniKrug koja je izvedena iz klase ObojeniKrug. Ova
klasa nema default konstruktor, ve samo konstruktor sa potrebnim argumentima i konstruktor za
kopiranje. U okviru nje definisati operatorsku funkciju operator+=() za poveanje poluprenika
kruga. U glavnom programu konstruisati po jedan objekat svake klase i pozvati sve
implementirane funkcije.
#include <iostream.h>
#include <string.h>
class Krug{
protected:
float xc;
float yc;
int r;
public:
virtual void PromenaPoluprecnika(int novi)=0;
};
class ObojeniKrug : public Krug{
int boja;
public:
ObojeniKrug(float x1, float y1, int p, int boja1);
virtual void PromenaPoluprecnika(int novi);
};
ObojeniKrug::ObojeniKrug(float x1, float y1, int r1, int boja1)
{
xc=x1;
yc=y1;
r=r1;
boja=boja1;
}
void ObojeniKrug::PromenaPoluprecnika(int novi)
{
r=novi;
}
class ZeleniKrug : public ObojeniKrug{
public:
ZeleniKrug(float x2, float y2, int r2, int boja2):ObojeniKrug
(x2,y2,r2,boja2){};
ZeleniKrug& operator+=(int p);
};
ZeleniKrug& ZeleniKrug::operator+=(int p)
{
this->PromenaPoluprecnika(p);
return *this;
}
void main()
{
Elektronski fakultet u Niu, 2003/2004

Programski jezici - C++

ObojeniKrug ob(1,1,1,1);
ob.PromenaPoluprecnika(1);
ZeleniKrug z(2,2,2,2);
z+=1;

Zadatak 5
Na programskom jeziku C++ napisati program za obradu podataka o radnicima nekog preduzea.
Program treba da sadri sledee klase:
- apstraktnu klasu RADNIK, iji su privatni podaci Ime, Prezime, Adresa, BrojBodova,
DatumZaposljavanja (u formatu: mm.gggg). U okviru ove klase definisati:
- virtualnu funkciju za izraunavanje radnog staa (broja meseci provedenih na poslu), ako je
kao ulazni paramatar funkcije DatumTekuci (u formatu: mm.gggg) ;
- istu virtualnu funkciju za izraunavanje neto plate radnika;
- prijateljske operatorske funkcije za postavljanje i itanje imena, prezimena, adrese, broja
bodova i datuma zapoljavanja radnika;
- klasu RADNIK_AKTIVAN koja je izvedena iz klase RADNIK i sadri privatan podatak
IznosPoreza i sledee funkcije:
- funkcije za postavljljanje i itanje imena, prezimena, adrese, broja bodova i datuma
zapoljavanja radnika;
- funkciju za izraunavanje neto plate po formuli: 1.1*BrojBodova-IznosPoreza;
- funkciju za izraunavanje radnog staa gde se broj meseci provedenih na poslu mnoi sa
koeficijentom 0.1 (predefinisati funkciju iz roditeljske klase);
- klasu RADNIK_BOLOVANJE koja je izvedena iz klase RADNIK i sadri privatan podatak
Odbitak i sledee funkcije:
- funkcije za postavljljanje i itanje imena, prezimena, adrese, broja bodova i datuma
zapoljavanja radnika;
- funkciju za izraunavanje neto plate po formuli: 0.9*BrojBodova-Odbitak;
- funkciju za izraunavanje radnog staa gde se broj meseci provedenih na poslu mnoi sa
koeficijentom 0.08 (predefinisati funkciju iz roditeljske klase);
U glavnom programu uneti tekui datum i podatke o radnicima (aktivnim i na bolovanju) u
odgovarajue nizove, a zatim aurirati adrese svih radnika koji stanuju u ulici Bulevar Lenjina
promenom na Bulevar Nemanjia i tampati imena, prezimena i plate radnika (plata radnika se
izraunava sabiranjem odgovarajueg radnog staa i neto plate).
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
class RADNIK
{
protected:
char *ime;
char *prezime;
char *adresa;
int brojbodova;
char *DatumZaposljavanja;
public:
RADNIK(char
*ime1,
char
*prezime1,
char
*adresa1,
brojbodova1, char *DatumZaposljavanja);
char *UzmiAdresu(){return adresa;}
void PostaviAdresu(char* adr){strcpy(adresa,adr);}
char *UzmiIme(){return ime;}
char *UzmiPrezime(){return prezime;}
int UzmiBB(){return brojbodova;}

Elektronski fakultet u Niu, 2003/2004

int

Programski jezici - C++

virtual float RadniStaz(char* DatumTekuci);


virtual float NetoPlata()=0;
friend istream& operator>>(istream& d, RADNIK& r);
friend ostream& operator<<(ostream& d, RADNIK& r);

};
RADNIK::RADNIK(char
*ime1,
char
*prezime1,
char
*adresa1,
int
brojbodova1, char *DatumZaposljavanja1)
{
ime=new char[10];
prezime=new char[10];
adresa=new char[10];
DatumZaposljavanja=new char[10];
strcpy(ime,ime1);
strcpy(prezime,prezime1);
strcpy(adresa,adresa1);
brojbodova=brojbodova1;
strcpy(DatumZaposljavanja,DatumZaposljavanja1);
}
float RADNIK::RadniStaz(char* DatumTekuci)
{
int god, mes;
int godt, mest;
mes=atoi(DatumZaposljavanja);
god=(atof(DatumZaposljavanja)-mes)*1000;
mest=atoi(DatumTekuci);
godt=(atof(DatumTekuci)-mest)*1000;
if ((godt-god)==0)
return (float)(mest-mes);
else
return (float)(12-mes+mest+12*(godt-god-1));
}
istream& operator>>(istream& d, RADNIK& r)
{
return
d>>r.ime>>r.prezime>>r.adresa>>r.brojbodova>>r.DatumZaposljavanja;
}
ostream& operator<<(ostream& d, RADNIK& r)
{
return
d<<r.ime<<r.prezime<<r.adresa<<r.brojbodova<<r.DatumZaposljavanja;
}
class RADNIK_AKTIVAN : public RADNIK
{
float IznosPoreza;
public:
RADNIK_AKTIVAN(float Ip):RADNIK("","","",1,""){IznosPoreza=Ip;}
RADNIK_AKTIVAN():RADNIK("","","",1,""){IznosPoreza=0;}
float RadniStaz(char* DatumTekuci);
float NetoPlata();
};
float RADNIK_AKTIVAN::NetoPlata()
{
return RADNIK::UzmiBB()-IznosPoreza;
}
float RADNIK_AKTIVAN::RadniStaz(char *DatumTekuci)
{
return (0.1*RADNIK::RadniStaz(DatumTekuci));
}
class RADNIK_BOLOVANJE : public RADNIK
{
float Odbitak;
Elektronski fakultet u Niu, 2003/2004

10

Programski jezici - C++

public:
RADNIK_BOLOVANJE(float Od):RADNIK("","","",1,""){Odbitak=Od;}
RADNIK_BOLOVANJE():RADNIK("","","",1,""){Odbitak=0;}
float RadniStaz(char* DatumTekuci);
float NetoPlata();
};
float RADNIK_BOLOVANJE::NetoPlata()
{
return (0.9*RADNIK::UzmiBB()-Odbitak);
}
float RADNIK_BOLOVANJE::RadniStaz(char *DatumTekuci)
{
return (0.8*RADNIK::RadniStaz(DatumTekuci));
}
void main()
{
RADNIK_AKTIVAN *ra;
RADNIK_BOLOVANJE *rb;
ra=new RADNIK_AKTIVAN[2];
rb=new RADNIK_BOLOVANJE[2];
int i, n;
char *tekdat, *pom, *pom1;
tekdat=new char[10];
cin>>tekdat;
for(i=0;i<2;i++)
cin>>ra[i];
for(i=0;i<2;i++)
cin>>rb[i];
for(i=0;i<2;i++)
{
n=strlen(ra[i].UzmiAdresu());
pom=new char[n];
strcpy(pom,ra[i].UzmiAdresu());
if (strncmp(pom,"BulevarLenjina",15)==0)
{
pom1=new char[n-15];
for (int j=15; j<n; j++)
pom1[j-15]=pom[j];
ra[i].PostaviAdresu(strcat("BulevarNemanjica",pom1));
}
}
for(i=0;i<2;i++)
{
n=strlen(rb[i].UzmiAdresu());
pom=new char[n];
strcpy(pom,rb[i].UzmiAdresu());
if (strncmp(pom,"BulevarLenjina",15)==0)
{
pom1=new char[n-15];
for (int j=15; j<n; j++)
pom1[j-15]=pom[j];
rb[i].PostaviAdresu(strcat("BulevarNemanjica",pom1));
}
}
for(i=0;i<2;i++)
cout<<ra[i].UzmiIme()<<" "<<ra[i].UzmiPrezime()<<" <<ra[i].NetoPlata()
+ra[i].RadniStaz(tekdat)<<"\n";
for(i=0;i<2;i++)
cout<<rb[i].UzmiIme()<<" "<<rb[i].UzmiPrezime()<<" "<<rb[i].NetoPlata()
+rb[i].RadniStaz(tekdat)<<"\n";
Elektronski fakultet u Niu, 2003/2004

11

Programski jezici - C++

Zadatak 6
Sastaviti generiku funkciju na C++ jeziku za nalaenje fuzije dva ureena niza objekata u trei,
na isti nain ureen niz. Sastaviti glavni program koji korienjem predhodne funkcije nalazi fuziju
nizova:
a) celih brojeva ureenih po vrednosti.
b) taaka u ravni ureenih po odstojanjima od koordinatnog poetka.
c) pravougaonika ureenih po povrinama.
#include <iostream.h>
template <class T>
void fuzija(T a[], int na, T b[], int nb, T c[], int nc)
{
for(int ia=0, ib=0, ic=0; ia<na || ib<nb; ic++)
c[ic]= ia==na ? b[ib++]:
ib==nb ? a[ia++]:
a[ia]<b[ib] ? a[ia++]: b[ib++];
nc=ic;
}
class Tacka{
double x,y;
public:
friend istream& operator>>(istream& dd, Tacka& tt);
//
citanje tacke
friend ostream& operator<<(ostream& dd, const Tacka& tt);
//
upis tacke
friend int operator<(const Tacka& t1, const Tacka &t2);
};
inline istream& operator>>(istream& dd, Tacka& tt)
{ return dd>>tt.x>>tt.y;}
inline ostream& operator<<(ostream& dd, Tacka& tt)
{ return dd<<T(<<tt.x<<,<<tt.y<<);}
inline operator<(const Tacka& t1, const Tacka& t2)
{ return t1.x*t1.x+t1.y*t1.y<t2.x*t2.x+t2.y*t2.y;}
class Pravougaonik{
double a,b ;
public:
friend istream& operator>>(istream& dd, Pravougaonik& pp);
// citanje pravougaonika
friend ostream& operator<<(ostream& dd, const Pravougaonik& pp);
// upis pravougaonika
friend int operator<(const Pravougaonik& p1, const Pravougaonik&
p2);
};
inline istream& operator>>(istream& dd, Pravougaonik& pp)
{ return dd>>pp.a>>pp.b;}
inline ostream& operator<<(ostream& dd, Pravougaonik& pp)
{ return dd<<P[<<pp.a<<,<<pp.b<<];}
inline operator<(const Pravougaonik& p1, const Pravougaonik& p2)
{ return p1.a*p1.b<p2.a*p2.b;}
void main()
{
int na, nb, nc, i;
cout<<Fuzija celih brojeva:\n;
cin>>na;
Elektronski fakultet u Niu, 2003/2004

12

Programski jezici - C++

int *a=new int[na];


for(i=0;i<na;i++)
cin>>a[i];
cin>>nb;
int *b=new int[nb];
for(i=0;i<nb;i++)
cin>>b[i];
nc=na+nb;
int *c=new int[nc];
fuzija(a, na, b, nb, c, nc);
for(i=0;i<nc;i++)
cout<< <<c[i];
delete []a;
delete []b;
delete []c;
cout<<\nFuzija nizova tacaka:\n;
cin>>na;
Tacka *a=new Tacka[na];
for(i=0;i<na;i++)
cin>>a[i];
cin>>nb;
Tacka *b=new Tacka[nb];
for(i=0;i<nb;i++)
cin>>b[i];
nc=na+nb;
Tacka *c=new Tacka[nc];
fuzija(a, na, b, nb, c, nc);
for(i=0;i<nc;i++)
cout<< <<c[i];
delete []a;
delete []b;
delete []c;
cout<<\nFuzija pravougaonika:\n;
cin>>na;
Pravougaonik *a=new Pravougaonik[na];
for(i=0;i<na;i++)
cin>>a[i];
cin>>nb;
Pravougaonik *b=new Pravougaonik[nb];
for(i=0;i<nb;i++)
cin>>b[i];
nc=na+nb;
Pravougaonik *c=new Pravougaonik[nc];
fuzija(a, na, b, nb, c, nc);
for(i=0;i<nc;i++)
cout<< <<c[i];
delete []a;
delete []b;
delete []c;

Zadatak 7
Sastaviti genericku klasu na C++ -u za staticke stekove zadatih kapaciteta. U glavnom programu
prikazati mogunosti te klase (rad steka ne zavisi od tipa objekta koji se smestaju na stek).
// stek.h
template <class Pod, int kap>
Elektronski fakultet u Niu, 2003/2004

13

Programski jezici - C++

class Stek
{
Pod stek[kap]; //Stek u obliku niza
int vrh; //Indeks vrha steka
int gre; //Indikator greske
public:
Stek(){vrh=gre=0;} //Inicijalizacija
void stavi(const Pod &pod);
void uzmi (Pod &pod);
int vel() const {return vrh;} //Broj podataka na steku
void brisi() {vrh=gre=0;}
int prazan() const {return vrh==0;}
int pun() const {return vrh==kap;}
int greska() const {return gre;}
};
template <class Pod, int kap>
void Stek<Pod,kap>::stavi(const Pod &pod)
{
if (!(gre=vrh==kap))
stek[vrh++]=pod;
}
template <class Pod, int kap>
void Stek<Pod,kap>::uzmi(const Pod &pod)
{
if (!(gre=vrh==0))
pod=stek[--vrh];
}
--------------------------------------------------------------------// stek.cpp
#include <stek.h>
#include <iostream.h>
const int CVEL=10; DVEL=3;
void main()
{
int i;
double d;
Stek <int, CVEL> clb_stek; //Stek sa celobrojnim podacima
Stek <double, DVEL> dbl_stek; //Stek sa realnim podacima
while(!clb_stek.pun())
{
cin>>i;
clb_stek.stavi(i);
cout<<i;
}
while(!clb_stek.prazan())
{
clb_stek.uzmi(i);
cout<<i;
}
while(!dbl_stek.pun())
{
cin>>d;
dbl_stek.stavi(d);
}
while(!dbl_stek.prazan())
{
dbl_stek.uzmi(d);
cout<<d;
}
}

Elektronski fakultet u Niu, 2003/2004

14

Programski jezici - C++

Zadatak 8
Na programskom jeziku C++ kreirati templejtsku (ablonsku) klasu MATRICA koja u privatnom
delu sadri dimenzije matrice i dinamiku matricu iji su elementi proizvoljnog tipa. U javnom delu
definisati: konstruktor, destruktor, operatorsku funkciju za pristup elementima matrice, funkcije za
vraanje dimenzija matrice, funkciju kojom se ispituje da li matrica sadri proizvoljnu podmatricu
(podmatrica je argument funkcije tipa MATRICA) i funkcije za unos i tampanje sadraja matrice.
Kreirati klasu STR koja u privatnom delu sadri podatak tipa string, a u javnom konstruktor,
funkciju za itanje i upis stringa, destruktor i prijateljsku operatorsku funkciju za poreenje dva
stringa. U glavnom programu definisati 4 objekta tipa MATRICA, za elemente tipa STR, a potom
za elemente tipa int i tampati one matrice koje nisu podmatrice drugih matrica.
Primer: matrica X je podmatrica matrice Y.
1 2

X= 2 3
3 3

Y=

10

#include <iostream.h>
#include <string.h>
template <class Pod>
class MATRICA
{
Pod **mat;
int n,m;
public:
MATRICA(int n1,int m1);
~MATRICA();
Pod& operator()(int i,int j);
int Uzmi_n(){return n};
int Uzmi_m(){return m};
int P(MATRICA<Pod>& mat1);
void Unos();
void Stampanje();
};
template <class Pod>
MATRICA<Pod>::MATRICA(int n1, int m1)
{
int j;
n=n1;
m=m1;
mat=new Pod*[n];
for(j=0;j<n;j++)
mat[j]=new Pod[m];
}
template <class Pod>
MATRICA<Pod>::~MATRICA()
{
int j;
for(j=0;j<n;j++)
delete [] mat[j];
delete [] mat;
}
template <class Pod>
Pod& MATRICA<Pod>::operator()(int i, int j)
{
return mat[i][j];
}
template <class Pod>
Elektronski fakultet u Niu, 2003/2004

15

Programski jezici - C++

int MATRICA<Pod>::P(MATRICA<Pod>& mat1)


{
int u1,u2,i1,j1,i2,j2;
u1=0; //u1 - uslov da je matrica mat1 podmatrica tekuce matrice
if (mat1.n<=n && mat1.m<=m)
{
i1=0;
while (i1<=n-mat1.n && !u1)
{
j1=0;
while (j1<=m-mat1.m && !u1)
{
i2=0;
u2=1; //u2 - uslov da ima slaganja u poredjenju
mat1 i dela tekuce matrice
while (i2<mat1.n && u2)
{
j2=0;
while (j2<mat1.m && u2)
{
if
(!(mat[i1+i2][j1+j2]==mat1.mat
[i2][j2]))
u2=0;
j2++;
}
i2++;
if (u2)
u1=1;
}
j1++;
}
i1++;
}
}
return u1;
}
template <class Pod>
void MATRICA<Pod>::Unos()
{
int j,k;
cout<<"Unesi elemente matrice\n";
for(j=0;j<n;j++)
for(k=0;k<m;k++)
cin>>mat[j][k];
return;
}
template <class Pod>
void MATRICA<Pod>::Stampanje()
{
int j,k;
for(j=0;j<n;j++)
{
for(k=0;k<m;k++)
cout<<mat[j][k]<<" ";
cout<<"\n";
}
return;
}
class STR{
char* s;
public:
Elektronski fakultet u Niu, 2003/2004

16

Programski jezici - C++

STR(){ s=new char[2];};


STR(int i);
~STR();
friend istream& operator>>(istream& t,STR& s1);
friend ostream& operator<<(ostream& t,STR& s2);
friend int operator==(STR& s1,STR& s2);

};
STR::STR(int i)
{
s=new char[i];
}
STR::~STR()
{
delete [] s;
}
istream& operator>>(istream& t,STR& s1)
{
return t>>s1.s;
}
ostream& operator<<(ostream& t,STR& s2)
{
return t<<s2.s;
}
int operator==(STR& s1,STR& s2)
{
if (strcmp(s1.s,s2.s)==0) return 1;
else return 0;
}

void main()
{
MATRICA<STR> a1(2,2), a2(2,2), a3(1,1), a4(1,1);
MATRICA<int> b1(2,2), b2(2,2), b3(1,1), b4(1,1);
a1.Unos(); a2.Unos(); a3.Unos(); a4.Unos();
b1.Unos(); b2.Unos(); b3.Unos(); b4.Unos();
if (!a2.P(a1) && !a3.P(a1) && !a4.P(a1)) a1.Stampanje();
if (!a1.P(a2) && !a3.P(a2) && !a4.P(a2)) a2.Stampanje();
if (!a1.P(a3) && !a2.P(a3) && !a4.P(a3)) a3.Stampanje();
if (!a1.P(a4) && !a2.P(a4) && !a2.P(a4)) a4.Stampanje();
if (!b2.P(b1) && !b3.P(b1) && !b4.P(b1)) b1.Stampanje();
if (!b1.P(b2) && !b3.P(b2) && !b4.P(b2)) b2.Stampanje();
if (!b1.P(b3) && !b2.P(b3) && !b4.P(b3)) b3.Stampanje();
if (!b1.P(b4) && !b2.P(b4) && !b2.P(b4)) b4.Stampanje();
}

Zadatak 9
Napisati program na C++-u za rad sa matricama. Kreirati klasu Matrica, gde su privatni lanovi
dinamika matrica tipa double i njene dimenzije, a javni sledece funkcije: konstruktor, destruktor,
funkcija za unos matrice, funkcija za stampanje matrice, funkcija za unos matrice u datoteku
zadatog imena, funkcija za citanje matrice iz datoteke zadatog imena i funkcija za zamenu
poslednjeg elementa u prvoj vrsti matrice 0. U glavnom programu testirati ove funkcije.
#include <fstream.h>
class MATRICA
{
double **mat;
int n,m;
Elektronski fakultet u Niu, 2003/2004

17

Programski jezici - C++

public:
MATRICA(int n1,int m1);
~MATRICA();
void Unos();
void Stampanje();
void UpisDat(char* ime);
void CitanjeDat(char* ime);
void Zamena(char* ime);
};
MATRICA::MATRICA(int n1, int m1)
{
int j;
n=n1;
m=m1;
mat=new double* [n1];
for(j=0;j<n1;j++)
mat[j]=new double [m1];
}
MATRICA::~MATRICA()
{
int j;
for(j=0;j<n;j++)
delete [] mat[j];
delete [] mat;
}
void MATRICA::Unos()
{
int j,k;
cout<<"Unesi elemente matrice\n";
for(j=0;j<n;j++)
for(k=0;k<m;k++)
cin>>mat[j][k];
return;
}
void MATRICA::Stampanje()
{
int j,k;
for(j=0;j<n;j++)
{
for(k=0;k<m;k++)
cout<<mat[j][k];
cout<<"\n";
}
return;
}
void MATRICA::UpisDat(char* ime)
{
int j,k;
ofstream dat1;
dat1.open(ime,ios::binary);
if (!dat1.good())
{
cout<<"Datoteka ne moze da se otvori\n";
return;
}
for(j=0;j<n;j++)
for(k=0;k<m;k++)
if (!dat1.write((char*) &mat[j][k],sizeof(double)))
{
cout<<"Ne moze da se upise u datoteku\n";
}
Elektronski fakultet u Niu, 2003/2004

18

Programski jezici - C++

dat1.close();
return;

}
void MATRICA::CitanjeDat(char* ime)
{
int j,k;
ifstream dat2;
dat2.open(ime,ios::nocreate | ios::binary);
if (!dat2.good())
{
cout<<"Datoteka ne moze da se otvori\n";
return;
}
for(j=0;j<n;j++)
for(k=0;k<m;k++)
if (!dat2.read((char*) &mat[j][k],sizeof(double)))
{
cout<<"Ne moze da se cita iz datoteke\n";
return;
}
dat2.close();
return;
}
void MATRICA::Zamena(char* ime)
{
ofstream dat3;
double t=0;
dat3.open(ime,ios::binary | ios::ate);
if (!dat3.good())
{
cout<<"Datoteka ne moze da se otvori\n";
return;
}
dat3.seekp((m-1)*sizeof(double));
cout<<"podatak zamenjen na "<<dat3.tellp()<<" bajtu u datoteci\n";
if (!dat3.write((char*) &t,sizeof(double)))
{
cout<<"Ne moze da se upise u datoteku\n";
}
dat3.close();
return;
}
void main()
{
char c,*naziv=new char [10];
MATRICA a(2,2);
cout<<"Unesi ime datoteke\n";
cin>>naziv;
c=' ';
while (c!='k')
{
cout<<"Upis, Citanje, Zamena ili Kraj (u/c/z/k)\n";
cin>>c;
switch (c)
{
case 'u':
a.Unos();
a.UpisDat(naziv);
break;
case 'z':
a.Zamena(naziv);
break;
case 'c':
a.CitanjeDat(naziv);
Elektronski fakultet u Niu, 2003/2004

19

Programski jezici - C++

a.Stampanje();

Zadatak 10
Napisati program na C++-u kojim se tekstualna datoteka ifrira formiranjem nove tekstualne
datoteke tako to se svaki samoglasnik zamenjuje specijalnim znacima ("a"-";" "e"-":" "i"-"["
"o"-"}" "u"-"#"). Kreirati klasu SIFRIRANJE ciji su privatni lanovi ime ulazne datoteke, ime izlazne
datoteke, ulazni tok i izlazni tok, a javni sledee f-je: konsruktor, funkcija za ifriranje, funkcija za
tampanje sadraja ulazne datoteke i funkcija za tampanje sadraja izlazne datoteke. U
glavnom programu testirati ove funkcije. Predpostavlja se da se datoteka sastoji samo od malih
slova.
#include <fstream.h>
#include <string.h>
class SIFRIRANJE
{
char* ime1;
char* ime2;
ifstream dat1;
ofstream dat2;
public:
SIFRIRANJE(char *ime11, char *ime22);
~SIFRIRANJE();
void Izvrsi();
void Stampaj1();
void Stampaj2();
};
SIFRIRANJE::SIFRIRANJE(char* ime11, char* ime22)
{
ime1=new char [strlen(ime11)];
ime2=new char [strlen(ime22)];
strcpy(ime1,ime11);
strcpy(ime2,ime22);
}
SIFRIRANJE::~SIFRIRANJE()
{
}
void SIFRIRANJE::Izvrsi()
{
dat1.open(ime1);
dat2.open(ime2, ios::noreplace);
if (!dat1.good() | !dat2.good())
cout<<"jedna od datoteka ne moze da se otvori";
char zn;
while ((zn=dat1.get())!=EOF)
{
switch (zn){
case 'a': dat2.put(';');
break;
case 'e': dat2.put(':');
break;
case 'i': dat2.put('[');
break;
case 'o': dat2.put('}');
break;
Elektronski fakultet u Niu, 2003/2004

20

Programski jezici - C++

case 'u': dat2.put('#');


break;
default: dat2.put(zn);
}

}
dat1.close();
dat2.close();
return;

}
void SIFRIRANJE::Stampaj1()
{
char zn;
dat1.open(ime1);
while ((zn=dat1.get())!=EOF)
cout<<zn;
dat1.close();
return;
}
void SIFRIRANJE::Stampaj2()
{
char zn;
dat1.open(ime2);
while ((zn=dat1.get())!=EOF)
cout<<zn;
dat1.close();
return;
}
void main()
{
char *naziv1=new char [10], *naziv2=new char [10];
cout<<"Unesi ime ulazne datoteke\n";
cin>>naziv1;
cout<<"Unesi ime izlazne datoteke\n";
cin>>naziv2;
SIFRIRANJE d(naziv1,naziv2);
d.Izvrsi();
d.Stampaj1();
d.Stampaj2();
}

Elektronski fakultet u Niu, 2003/2004

21

You might also like