Seminarski c++

16

Click here to load reader

Transcript of Seminarski c++

Page 1: Seminarski c++

Univarzitet u Prištini

Prirodno-matematički fakultetOdsek: Informatika

Seminarski radPredmet:

Objektno orjentisano programiranje u C++

Profesor: Student:prof. Dr Damnjan Radosavljević Marko Vančetović

Br. indeksa: 217

Kos. Mitrovica , 2011

Page 2: Seminarski c++

1.// bitovi.h - Klasa nizova bitova.

#ifndef _bitovi_h_#define _bitovi_h_

#include <iostream>using namespace std;

#define DUZ ((D+7)>>3) // Broj bajtova u nizu.#define MASKA (~(~0<<(D&7))) // Maska za čišćenje nekorišćenih levih // bitova poslednjeg elementa niza.

typedef unsigned char Uchar; // Skraćenice za neoznačene celobrojne tipove.typedef unsigned long Ulong;

class GPoz {}; // KLASA ZA GREŠKU: Nezadovoljena pozicija bita.

template <int D> class Bitovi { class Bit { // KLASA ZA PREDSTAVLJANJE ODABRANOG BITA U NIZU. Uchar* bajt; // Bajt u kome se nalazi bit. unsigned maska; // Maska za izdvajanje bita iz bajta. public: Bit (Uchar* niz, unsigned poz) // Konstruktor. { bajt = niz + (poz >> 3); maska = 1 << (poz & 7); } operator bool () const { // Dohvatanje vrednosti bita. return (*bajt & maska) != 0; } Bit& operator= (bool b) { // Postavljanje vrednosti bita. if (b) *bajt |= maska; else *bajt &= ~maska; return *this; } Bit& operator= (const Bit& bit) { // (za slučaj: a[i]=b[j]) return *this = bool (bit); } }; // class Bit // ČLANOVI KLASE NIZA BITOVA: Uchar niz[DUZ]; // Niz za uskladištenje bitova. public: Bitovi (Ulong k=0); // Konstruktor konverzije. Bit operator[] (int i) { // Pristup odabranom bitu: if (i<0 || i>=D) throw GPoz (); // u promenljivom nizu, return Bit (niz, i); } const Bit operator[] (int i) const { // u nepromenljivom nizu. if (i<0 || i>=D) throw GPoz (); return Bit (const_cast<Uchar*>(niz), i); } typedef const Bitovi CB; // Skraćenica za nepromenljive nizove. Bitovi operator~ () const; // ~b1 Bitovi& operator&= (CB& b2); // b1 &= b2 Bitovi& operator|= (CB& b2); // b1 |= b2 Bitovi& operator^= (CB& b2); // b1 ^= b2

Page 3: Seminarski c++

Bitovi& operator>>=(int k); // b1 >>= k Bitovi& operator<<=(int k); // b1 <<= k bool operator== (CB& b2) const; // b1 == b2 bool operator< (CB& b2) const; // b1 < b2 bool operator> (CB& b2) const; // b1 > b2 }; // class Bitovi

#define CB const Bitovi<D> // Skraćenica za nepromenljive nizove.

template <int D> Bitovi<D>::Bitovi (Ulong k) { // Konstruktor konverzije for (int i=0, j=-1, m; i<D; i++) { // (koristi desnih D bitova). if ((i & 7) == 0) { m = 1; j++; } else m <<= 1; if (k & 1) niz[j] |= m; else niz[j] &= ~m; k >>= 1; } niz[DUZ-1] &= MASKA; }

template <int D> Bitovi<D> Bitovi<D>::operator~ () const { // ~b1 Bitovi<D> b; for (int i=0; i<DUZ; i++) b.niz[i] = ~ niz[i]; b.niz[DUZ-1] &= MASKA; return b; }

template <int D> Bitovi<D>& Bitovi<D>::operator&= (CB& b2) { // b1 &= b2 for (int i=0; i<DUZ; i++) niz[i] &= b2.niz[i]; return *this; } template <int D> Bitovi<D>& Bitovi<D>::operator|= (CB& b2) { // b1 |= b2 for (int i=0; i<DUZ; i++) niz[i] |= b2.niz[i]; return *this; }

template <int D> Bitovi<D>& Bitovi<D>::operator^= (CB& b2) { // b1 ^= b2 for (int i=0; i<DUZ; i++) niz[i] ^= b2.niz[i]; niz[DUZ-1] &= MASKA; return *this; }

template <int D> Bitovi<D>& Bitovi<D>::operator>>=(int k) { // b1 >>= k for (int i=0; i<D; i++) (*this)[i] = (i+k<D) ? (*this)[i+k] : 0; return *this; }

template <int D> Bitovi<D>& Bitovi<D>::operator<<=(int k) { // b1 <<= k for (int i=D-1; i>=0; i--) (*this)[i] = (i-k>=0) ? (*this)[i-k] : 0; return *this; }

Page 4: Seminarski c++

template <int D> inline Bitovi<D> operator& (CB& b1, CB& b2) // b1 & b2 { return Bitovi<D> (b1) &= b2; }

template <int D> inline Bitovi<D> operator| (CB& b1, CB& b2) // b1 | b2 { return Bitovi<D> (b1) |= b2; }

template <int D> inline Bitovi<D> operator^ (CB& b1, CB& b2) // b1 ^ b2 { return Bitovi<D> (b1) ^= b2; }

template <int D> inline Bitovi<D> operator>> (CB& b1, int k) // b1 >> k { return Bitovi<D> (b1) >>= k; }

template <int D> inline Bitovi<D> operator<< (CB& b1, int k) // b1 << k { return Bitovi<D> (b1) <<= k; }

template <int D> bool Bitovi<D>::operator== (CB& b2) const { // b1 == b2 for (int i=0; i<DUZ; i++) if (niz[i] != b2.niz[i]) return false; return true; }

template <int D> bool Bitovi<D>::operator< (CB& b2) const { // b1 < b2 int i = DUZ-1; while (i>0 && niz[i]==b2.niz[i]) i--; return niz[i] < b2.niz[i]; }

template <int D> bool Bitovi<D>::operator> (CB& b2) const { // b1 > b2 int i =DUZ-1; while (i>0 && niz[i]==b2.niz[i]) i--; return niz[i] > b2.niz[i]; }

template <int D> inline bool operator!= (CB& b1, CB& b2) // b1 != b2 { return ! (b1 == b2); }

template <int D> inline bool operator<= (CB& b1, CB& b2) // b1 <= b2 { return ! (b1 > b2); }

template <int D> inline bool operator>= (CB& b1, CB& b2) // b1 >= b2 { return ! (b1 < b2); }

template <int D> istream& operator>> (istream& d, Bitovi<D>& b) { // Čitanje.

Page 5: Seminarski c++

b = 0; char txt[2*N]; d >> txt; // Uzimaju se u obzir najviše poslednjih D znakova. for (int i=0, j=strlen(txt)-1; j>=0 && i<D; b[i++]=txt[j--]!='0'); return d; }

template <int D> ostream& operator<< (ostream& d, CB& b) { // Pisanje. for (int i=D-1; i>=0; d << b[i--]); return d; } #endif

2.// celi.h - Klasa celih brojeva.

#ifndef _celi_h_#define _celi_h_

#include "predmet2.h"

namespace Zbirke { class Celi: public Predmet { int vr; // Vrednost broja. void pisi (ostream& d) const { d << vr; } // Pisanje. public: Celi (int v=0) { vr = v; } // Konstruktor. int operator+ () const { return vr; } // Dohvatanje vrednosti. Celi* kopija () const { return new Celi (*this); } // Dinamička kopija. };} // namespace

#endif

3.// duz.h - Klasa duži u ravni.

#ifndef _duz_h_#define _duz_h_

#include "linija.h"#include "tacka5.h"#include <cmath>using namespace std;

namespace Linije {

Page 6: Seminarski c++

class Duz: public Linija { Tacka A, B; // Krajnje tačke. public: explicit Duz (const Tacka& P=Tacka(-1,-1), // Konstruktor. const Tacka& Q=Tacka(1,1)): A(P), B(Q) {} double operator+ () const // Dužina. { return sqrt (pow(A.aps()-B.aps(),2) + pow(A.ord()-B.ord(),2)); } Linija* kopija () const // Dinamička kopija. { return new Duz (*this); } private: void pisi (ostream& dat) const // Pisanje. { Linija::pisi (dat); dat << "[duz: A" << A << ", B" << B << ']'; } };}

#endif

4.// ekspon.h - Klasa eksponencijalnih funkcija.

#ifndef _ekspon_h_#define _ekspon_h_

#include "fun3.h"#include <cmath>using namespace std;

namespace Izvodi { class Ekspon: public Fun { double a, b; void pisi (ostream& d) const // Pisanje. { d << a << "*exp(" << b << "*x)"; } public: Ekspon (double aa=1, double bb=1) // Inicijalizacija. { a = aa; b = bb; } double operator() (double x) const // Računanje vrednosti. { return a * exp (b*x); } PFun operator! () const // Stvaranje izvoda. { return PFun (new Ekspon (a*b, b)); } Ekspon* kopija () const // Stvaranje dinamičke kopije. { return new Ekspon (*this); } }; // class Ekspon} // namespace Izvodi

#endif

5.// figura1.h - Klasa geometrijskih figura u ravni.

#ifndef _figura1_h_#define _figura1_h_

Page 7: Seminarski c++

#include "tacka3.h"

class Figura { Tacka T; // Težište figure.public: Figura (const Tacka& tt=ORG): T(tt) {} // Konstruktor. virtual ~Figura () {} // Destruktor. Figura& premesti (Real x, Real y) // Premešanje figure. { T = Tacka (x, y); return *this; } Figura& pomeri (Real dx, Real dy) // Pomeranje figure. { T = Tacka (T.aps()+dx, T.ord()+dy); return *this; } virtual Real O () const =0 ; // Obim. virtual Real P () const =0 ; // Površina. virtual Figura* kopija () const =0; // Stvaranje kopije.protected: virtual void citaj (istream& d) { d >> T; } // Čitanje. virtual void pisi (ostream& d) const { d << "T=" << T; } // Pisanje. friend istream& operator>>(istream& d, Figura& f) // Uopšteno čitanje { f.citaj (d); return d; } // i friend ostream& operator<<(ostream& d, const Figura& f) //pisanje. { f.pisi (d); return d; }};

#endif

6.// sekpravi.C - Formiranje sekvencijalne binarne datoteke.

#include <fstream>using namespace std;

int main (int, const char* vpar[]) { try { ifstream ulaz (vpar[1]); if (!ulaz) throw 1; ofstream izlaz (vpar[2], ios::binary); if (!izlaz) throw 2; int n; while (ulaz >> n) { double* x = new double [n]; for (int i=0; i<n; ulaz >> x[i++]); izlaz.write ((char*)&n, sizeof(int)); izlaz.write ((char*)x, n*sizeof(double)); delete [] x; } } catch (int g) { cout << "*** Greska pri otvaranju datoteke " << vpar[g] << " ***\a\n"; return g; } return 0;}

Page 8: Seminarski c++

7.//Matrica je dijagonalana ako su joj svi članovi, osim onih na glavnoj dijagonali jednaki 0#include <iostream>using namespace std;//deklarišem promenljiveint A[10][10], i, j, M;bool contProm;int main(){

cout<<"Unesi red matrice: ";cin>>M;//Unos matricefor(i=0;i<M;i++){

for(j=0;j<M;j++){

cout<<"A["<<i<<","<<j<<"]=";cin>>A[i][j];

}}

cout<<endl;//Ispiši matricu-lepofor(i=0;i<M;i++){

cout<<endl;for(j=0;j<M;j++){

cout<<" "<<A[i][j];}

}cout<<endl;

//Proveri da li na glavnoj dijagonali postoji elemanat !=0contProm=false;

for(i=0;i<M;i++){for(j=0;j<M;j++){

if((i==j) && (A[i][j]!=0)){

contProm=true;}

}}

if (contProm==true){//ako postoji pitam da li su svi ostali =0

for(i=0;i<M;i++){

for(j=0;j<M;j++){

if((A[i][j]!=0) && (i!=j)){ cout<<"Matrica nije dijagonalna!";system("Pause");goto kraj;

Page 9: Seminarski c++

}}

}cout<<"Matrica je dijagonalna!";system ("Pause");goto kraj;

}else

{cout<<"Svi elementi na glavnoj dijagonali su nule, bez obzira na

ostale vrednosti matrica nije dijagonalna!";system("Pause");goto kraj;}

kraj:return 0;}

8.//OD svakog celog broja računa apsolutnu vrednost

#include "stdafx.h"#include<iostream>using namespace std;

int main(){

int a; cout<<"Racuna apsolutnu vrednost"<<endl<<endl; cout<<"Unesi bilo koji celi broj"<<endl; cin>>a; if(a>0)//uslov prvi

cout<<a<<endl; else//ako nije ispunjen uslov onda izvršava sledeću radnju

cout<<a*(-1)<<endl; system("pause");

return 0;}

9.//Načini pridruživanja slova

#include "stdafx.h"#include<iostream>using namespace std;int main(){

Page 10: Seminarski c++

char a,b;a='A';b=65;//ASCII vrednost slova Acout<<a<<endl;cout<<b<<endl;system ("PAUSE");return 0;

}

10.//Program koji proizvodi zvuk

#include "stdafx.h"

#include<iostream>using namespace std;int main(){

char zvuk='\a';// a je oznaka za zvuk od reči "alter"char novi_red='\n';// isto ima značenje kao endl;cout<<zvuk<<zvuk<<novi_red;system ("PAUSE");return 0;

}

11.//Načiniti program koji stepenuje uneseni broj

#include "stdafx.h"#include<iostream>#include<cmath>// uključujemo biblioteku matematičkih funkcijausing namespace std;

int main (){

float broj;//broj može biti svaki realni brojfloat eksponent;float rezultat;cout<<"Stepenovanje brojeva"<<endl;cout<<"Unesi broj koji zelis stepenovati:"<<endl;cin>>broj;cout<<"Unesi eksponent"<<endl;cin>>eksponent;rezultat=pow(broj,eksponent);//""pow" je naredba za stepenovanjecout<<"Rezultat je"<<endl;cout<<rezultat<<endl;cout<<endl;system("pause");

return 0;

Page 11: Seminarski c++

12.//Načiniti program koji negativan broj pretvara u pozitivan

#include "stdafx.h"#include <iostream>#include<cmath>using namespace std;

int main(){

float broj;float rezultat;cout<<"Unesi negativan broj"<<endl;cin>>broj;cout<<endl;rezultat=abs(broj);//"abs"je naredba za pretvaranje negativnog

broja u pozitivancout<<"Pozitivan broj je"<<endl;cout<<rezultat<<endl;cout<<endl;system("pause");return 0;

}

13./Načiniti program koji množi, sabira i oduzima dva unešena broja

#include "stdafx.h"#include<iostream>using namespace std;

int main(){

int a, b, c, d, e;//deklarisanje varijablicout<< "Osnovne racunske operacije"<<endl;cout<<"Unesite dva cela broja"<<endl;cin >> a;//Naredba koja učitava vrednost koju unese korisnikcin >> b;c=(a*b);cout<<"Proizvod je:"<<c<<endl;d=(a+b);cout<<"Zbir je:"<<d<<endl;e=(a-b);cout<<"razlika je:"<<e<<endl;cout<<"Kraj"<<endl;system("pause");return 0;

}

Page 12: Seminarski c++

14.//Načini program koji na osnovu unešene ocene ispisuje broj bodova#include "stdafx.h"#include<iostream>using namespace std;int main(){

int ocj;cout<<"Unesi ocenu:"<<endl;cin>>ocj;switch (ocj)//Naredba "switch" omogućava višestruko grananje{ //iza naredbe "switch" dolazi celobrojni izraz u vitičastoj

zagradi case 5://proverava se vrednost i ako je tačna izvršava se

naredba cout<<"Imate 90-100 bodova"<<endl;break;//"break je završetak bloka naredbicase 4: cout<<"Imate 80-89 bodova"<<endl;break;case 3: cout<<"Imate 70-79 bodova"<<endl;break;case 2:

cout<<"Imate 60-69 bodova"<<endl;break;

case 1:cout<<"Imate ispod 60 bodova"<<endl;

break;default://ako nije ništa od ponudjenog izvrašava se naredna

cout<<"Nekorektna ocena"<<endl;

}

system("pause");

return 0;}

15.//Program sa četiri računske operacije

#include "stdafx.h"#include<iostream>using namespace std;

int main(){

float a;float b;int rezultat;

Page 13: Seminarski c++

cout<<"Unesite prvi broj"<<endl;cin>>a;cout<<"Unesite drugi broj"<<endl;cin>>b;cout<<"1-sabrati"<<endl;cout<<"2-oduzeti"<<endl;cout<<"3-mnoziti"<<endl;cout<<"4-deliti"<<endl;cout<<"unesi broj racunske opeacije koju zelis

izvrsiti"<<endl<<endl;cin>>rezultat;switch(rezultat)/*naredbom case započinje deo programa koji će se

izvršavati u varijabli zavisno od toga koju računsku operaciju

želi korisnik*/{case 1: cout<<a<<"+"<<b<<"="<<a+b<<endl; break;//naredbom break se završava case 1 naredbacase 2: cout<<a<<"-"<<b<<"="<<a-b<<endl; break;case 3: cout<<a<<"*"<<b<<"="<<a*b<<endl; break;case 4:if (b==0)

{ cout<<"Deljenje sa nulom nije

dozvoljeno"<<endl;//uslov za deljenjesystem("pause");

break; } else {

cout<<a<<":"<<b<<"="<<a/b<<endl; break; }

default://Ovaj deo se izvršava ako ni jedan uslov "case" nije zadovoljen

cout<<"morate uneti 1,2,3 ili 4"<<endl;}//ovom vitičastom zagradom se završava naredba casecout<<endl;system ("PAUSE");

return 0;}