класе – неколико решених примера

1. Пројектовати на језику C++ класу тачака у равни. Предвидети стварање тачке са задатим координатама, дохватање координата, израчунавање растојања до задате тачке, читање тачке и писање тачке.
Саставити на језику C++ главни програм за приказивање могућности те класе.

Решење:

а) у заглављу је класа само декларисана, методе класе (осим малих, уграђених – inline) су дефинисане у другом фајлу

// tacka.h definicija klase tacaka u ravni, metode samo deklarisane
 class Tacka
 {
 double x,y; // koordinate
 public:
 void tacka (double a, double b)
 {x=a;y=b;} //postavljanje koordinata, stvaranje tacke
 double aps () const {return x;} // dohvatanje apscise (x osa)
 double ord() const {return y;} // dohvatanje ordinate (y osa)
 double rastojanje(Tacka)const; // rastojanje do tacke
 void citaj(); //citanje tacke
 void pisi() const; //pisanje tacke
 };
// tacka.cpp definicija metoda
 #include"tacka.h"
 #include<cmath>
 #include<iostream>
 using namespace std;
 double Tacka::rastojanje(Tacka t) const
 { return sqrt(pow(x-t.x,2)+pow(y-t.y,2)); }
 void Tacka::citaj(){cin>>x>>y;};
 void Tacka::pisi( ) const
 { cout<<'('<<x<<','<<y<<')'; }
// glavni program
 #include"tacka.cpp"
 #include<cmath>
 #include<iostream>
 using namespace std;
 int main()
 {
 cout<<"t1? "; double x,y; cin>>x>>y;
 Tacka t1; t1.tacka(x,y); // za formiranje prve tacke koristena je metoda koja formira tacku
 cout<<"t2? "; Tacka t2; t2.citaj(); // za unosenje druge tacke koristena je metoda citaj
 cout<<"t1=("<<t1.aps()<<','<<t1.ord()<<"), t2=";t2.pisi(); cout<<endl;
 // za pisanje prve tacke koristena funkcija cout, a za pisanje druge tacke koristena metoda pisi
 cout<<"rastojanje="<<t1.rastojanje(t2)<<endl;
 return 0;
 }

б) у заглављу је комплетно дефинисана класа

// tacka.h definicija klase tacaka u ravni
 #include<cmath>
 #include<iostream>
 using namespace std;
 class Tacka
 {
 double x,y; // koordinate
 public:
 void tacka (double a, double b) //postavljanje koordinata, stvaranje tacke
 {x=a;y=b;}
 double aps() const {return x;} // dohvatanje apscise (x osa)
 double ord() const {return y;} // dohvatanje ordinate (y osa)
 double rastojanje(Tacka t) const // rastojanje do tacke
 { return sqrt(pow(x-t.x,2)+pow(y-t.y,2)); }
 void citaj() //citanje tacke
 {cin>>x>>y;}
 void pisi() const //pisanje tacke
 { cout<<'('<<x<<", "<<y<<')'; }
 };
// ispitivanje klase tacaka
 #include"tacka.h"
 #include<iostream>
 using namespace std;
 int main()
 {
 cout<<"t1? "; Tacka t1; t1.citaj(); //unosenje tacke t1 pomocu metode citaj
 cout<<"t2? "; double x,y; cin>>x>>y;
 Tacka t2; t2.tacka(x,y); // formiranje tacke t2 pomocu metode tacka
 cout<<"t1=";t1.pisi();cout<<", t2=("<<t2.aps()<<", "<<t2.ord()<<')'<<endl;
 // t1 pisemo pomocu metode pisi, t2 pisemo pomocu funkcije cout
 cout<<"rastojanje="<<t1.rastojanje(t2)<<endl;
 return 0;
 }

2. Пројектовати на језику C++ класу троуглова. Предвидети испитивање да ли 3 дужи могу бити странице троугла (метода која враћа вредност treu или false), стварање троугла са страницама задатих дужина, дохватање дужина страница, израчунавање обима и површине, читање троугла са главног улаза и писање троугла на главни излаз.
Саставити на језику C++ главни програм који прочита динамички низ троуглова, уреди низ по неопадајућем редоследу површина троугла и испише добијени резултат.

Решење:

// trougao.h - Definicija klase trouglova.
 #include <iostream>
 #include <cmath>
 #include <cstdlib>
 using namespace std;
 class Trougao
 {
 double a, b, c; // Stranice trougla.
 public:
 static bool moze (double a, double b, double c) // da li su stranice prihvatljive.
 { return a>0 && b>0 && c>0 && a+b>c && b+c>a && c+a>b; }
// static - заједнички члан класе за све објекте дате класе (више детаља касније)
 void trougao (double aa, double bb, double cc) // Stvaranje trougla.
 {
 if (! moze (aa, bb, cc)) exit (1);
 a=aa; b=bb; c=cc;
 }
 double uzmiA () const { return a;} // Dohvatanje stranica.
 double uzmiB () const { return b;}
 double uzmiC () const { return c;}
 double O () const { return a + b + c;} // Obim trougla.
 double P () const // Povrsina trougla.
 {
 double s=O()/2;
 return sqrt (s * (s-a) * (s-b) * (s-c) );
 }
 bool citaj () // citanje trougla
 {
 double aa, bb, cc;
 cin >> aa >> bb >> cc;
 if ( ! moze (aa, bb, cc) ) return false;
 else {a=aa; b=bb; c=cc; return true;}
 }
 void pisi () const // pisanje trougla.
 { cout << "Troug(" << a << ", " << b << ", "<< c << ')'; }
 };
// ispitivanje klase trouglova.
 #include "trougao.h"
 #include <iostream>
 using namespace std;
 int main ()
 {
 cout << "Broj trouglova? "; int n; cin >> n;
 Trougao *niz = new Trougao [n];
 int i; for (i=0; i<n; )
 {
 cout << i+1 << ". trougao? ";
 double a, b, c; cin >> a >> b >> c;
 if (Trougao::moze(a,b,c) ) niz[i++].trougao (a, b, c);
 else cout << "*** Neprihvatljive stranice!"<<endl;
 }
 int j; for (i=0; i<n-1; i++)
 for (j=i+1; j<n; j++)
 if (niz[j].P() < niz[i].P() )
 { Trougao pom = niz[i]; niz[i] = niz[j];niz[j]=pom;}
 cout << "\nUredjeni niz trouglova:"<<endl;
 for (i=0; i<n; i++)
 {
 cout << i+1 << ": "; niz[i].pisi();
 cout << " P= " << niz[i].P() << endl;
 }
 delete [] niz;
 return 0;
 }

3. Пројектовати класу за реализацију јединственог стека за целобројне податке коришћењем динамичке структуре података. Написати главни програм за приказивање исправности добијене класе.

Решење I:

//definicija klase za stek celih brojeva, stek.h
 class Stek
 {
 static Stek *vrh; // zajednicki pokazivac na vrh steka
 Stek *preth; // pokazivac na prethodni objekat na steku
 int broj; // koristan sadrzaj objekta na steku
 public:
 static void dodaj (int i); // stavljanje novog podatka na stek
 static int uzmi (); // uzimanje podatka sa steka
 static bool prazan () {return vrh==0;} // da li je stek prazan
 static void prazni (); // praznjenje steka
 };
// definicije metoda klase stek, stek.c
 #include "stek.h"
 #include<cstdlib>
 using namespace std;
 Stek *Stek::vrh=0; // definicija vrha sa inicijalizacijom
 void Stek::dodaj(int i) // stavljanje novog podatka na stek
 {
 Stek *novi=new Stek; // dodela memorije
 novi->broj=i; // smestanje podatka u element
 novi->preth=vrh; // ukljucivanje elementa u listu
 vrh=novi;
 }
 int Stek::uzmi() // uzimanje podatka sa vrha steka
 {
 if(!vrh) exit(2); // prekid programa ako je stek prazan
 int i=vrh->broj; // pamcenje podatka sa vrha steka
 Stek *stari=vrh; // iskljucivanje elementa iz liste
 vrh=vrh->preth;
 delete stari; // oslobadjanje dodeljene memorije
 return i; // vracanje upamcenog podatka
 }
 void Stek::prazni(){while(vrh)uzmi();} // praznjenje steka
//program za ispitivanje klase stek, glavni program
 #include "stek.c"
 #include<iostream>
 using namespace std;
 int main()
 {
 for(;;)
 {
 int n;
 cout<<"\nduzina niza brojeva? "; cin>>n;
 if(!n)break;
 cout<<"niz od " <<n<<" brojeva? ";
 for(int i=0,k;i<n;i++){cin>>k;Stek::dodaj(k);}
 cout<<"niz po obrnutom redosledu:";
 while(!Stek::prazan())cout<<' '<<Stek::uzmi();cout<<endl;
 Stek::prazni();
 }
 }

Решење II:

//definicija klase za stek celih brojeva, stek.c
 #include<cstdlib>
 #include<iostream>
 using namespace std;
 class Stek
 {
 Stek *preth; // pokazivac na prethodni objekat na steku
 int broj; // koristan sadrzaj objekta na steku
 public:
 static Stek *vrh; // zajednicki pokazivac na vrh steka
 static void dodaj (int i)
 {
 Stek *novi=new Stek; // dodela memorije
 novi->broj=i; // smestanje podatka u element
 novi->preth=vrh; // ukljucivanje elementa u listu
 vrh=novi;
 } // stavljanje novog podatka na stek
 static int uzmi ()
 {
 if(!vrh) exit(2); // prekid programa ako je stek prazan
 int i=vrh->broj; // pamcenje podatka sa vrha steka
 Stek *stari=vrh; // iskljucivanje elementa iz liste
 vrh=vrh->preth;
 delete stari; // oslobadjanje dodeljene memorije
 return i; // vracanje upamcenog podatka
 } // uzimanje podatka sa steka
 static bool prazan () {return vrh==0;} // da li je stek prazan
 static void prazni (){while(vrh)uzmi();} // praznjenje steka
 };
Stek *Stek::vrh=0; // definicija vrha sa inicijalizacijom
 //program za ispitivanje klase stek, glavni program
 #include"stek.c"
 #include<iostream>
 using namespace std;
 int main()
 {
 for(;;)
 {
 int n;
 cout<<"\nduzina niza brojeva? "; cin>>n;
 if(!n) break;
 cout<<"niz od " <<n<<" brojeva? ";
 for(int i=0,k;i<n;i++) {cin>>k; Stek::dodaj(k);}
 cout<<"niz po obrnutom redosledu:";
 while(!Stek::prazan() ) cout<<' '<<Stek::uzmi(); cout<<endl;
 Stek::prazni();
 }
 }
Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s