показивач this – решени задаци

1. Написати на језику C++ класу углова задатих у радијанима. Предвидети:

  • стварање угла на основу задатог броја радијана (подразумевано 0)

  • стварање угла на основу задатог броја степени, минута и секунди

  • дохватање величине угла у радијанима

  • дохватање делова угла (целобројне степене, минуте и секунде) и то одвојено и одједном

  • додавање вредности другог угла текућем углу

  • множење угла реалним бројем

  • читање угла са главног улаза и писање на главном излазу у радијанима и у степенима

Написати на језику C++ програм који прочита два угла, израчуна њихову средњу вредност и испише добијени резултат.

// ugao.h - definicija klase uglova
#include
using namespace std;
const double FAKTOR=3.14159265358979323/180;
class Ugao
{
	double ugao;						 //ugao u radijanima
public:
	Ugao(double u=0)	{ugao=u;}//podrazumevani konstruktor i konstruktor konverzije
	Ugao(int stp, int min=0, int sek=0);	//konstruktor na osnovu stepeni
	double rad() const{return ugao;}			// radijani
	int stp()const{return ugao/FAKTOR;}			//stepeni
	int min()const{return int(ugao/FAKTOR*60)%60;}	//minuti
	int sek() const{return int(ugao/FAKTOR*3600)%60;}	//sekunde
	void razlozi(int& st, int& mi, int& se) const;	//sve tri komponente odjednom
	Ugao& dodaj (Ugao u); 	//dodavanje ugla
	Ugao& pomnozi(double a);	//mnozenje realnim brojem
	void citaj();				//citanje u radijanima
	void citajStep();						//citanje u stepenima
	void pisi() const; 			//pisanje u radijanima
	void pisiStep() const;					//pisanje u stepenima
};

#include"ugao.h"
Ugao::Ugao(int stp, int min, int sek)		{ ugao=((sek/60.+min)/60+stp)*FAKTOR;}
void Ugao::razlozi(int& st, int& mi, int& se) const
{
	st=stp();
	mi=min();
	se=sek();
}
Ugao& Ugao::dodaj (Ugao u)
{
	ugao+=u.ugao;
	return *this;
}	//dodavanje ugla
// pokazivac *this odnosi se na tekuci objekat, podrazumevan je tako da ne mora da se definise!
Ugao& Ugao::pomnozi(double a)
{
	ugao*=a;
	return *this;
}//mnozenje realnim brojem
void Ugao::citaj(){cin>>ugao;}				//citanje u radijanima
void Ugao::citajStep()						//citanje u stepenima
{		
	int stp, min, sek;
	cin>>stp>>min>>sek;
	*this=Ugao(stp, min, sek);	
}
void Ugao::pisi() const {cout<<ugao;}			//pisanje u radijanima
void Ugao::pisiStep() const{cout<<'('<<stp()<<':'<<min()<<':'<<sek()<<')';}		
	
//ispitivanje klase uglova
#include"ugao.h"
#include
using namespace std;
int main()
{	
	Ugao u1,u2;
	cout<<"prvi ugao [rad]?";u1.citaj();
	cout<<"drugi ugao [rad]?";u2.citaj();
	Ugao sr=Ugao(u1).dodaj(u2).pomnozi(0.5);
	cout<<"srednja vrednost= ";sr.pisi();
	cout<<' ';sr.pisiStep();
	cout<<endl;
	return 0;
}

2. Пројектовати на језику C++ класу уређених скупова реалних бројева. Предвидети:
– стварање празног скупа, скупа који садржи један број и као копија другог скупа,
– уништавање скупа,
– налажење уније, пресека и разлике два скупа,
– читање скупа преко главног улаза,
– писање скупа на главни излаз, и
– дохватање броја елемената скупа.
Саставити на језику C++ главни програм за проверу исправности претходне класе.

//skup.h - Definicija klase uređenih skupova.

class Skup
{
int vel; double *niz; // Veličina i elementi skupa.
void kopiraj (const Skup &); // Kopiranje skupa.
void brisi () { delete [] niz; niz = 0; vel = 0; } // Pražnjenje skupa. Ž
public:
Skup () { niz = 0; vel = 0; } // Stvaranje praznog skupa.
Skup (double a) { // Konverzija broja u skup.
niz = new double [vel = 1];
niz[0] = a;
}
Skup (const Skup &s) { kopiraj (s);} // Inicijalizacija skupom. i
~Skup () { brisi ();} // Uništavanje skupa.
void unija (const Skup &, const Skup &) ; // Unija dva skupa. д
void presek (const Skup &, const Skup &); // Presek dva skupa.
void razlika(const Skup&, const Skup &) ; // Razlika dva skupa.
void pisi () const; // Pisanje skupa. Ž
void citaj (); // Čitanje skupa. i
int velicina () const { return vel; } // Veličina skupa.
};
// skup.cpp – Definicije metoda klase uređenih skupova.
#include "skup.h"
#include <iostream>
using namespace std;
void Skup::kopiraj (const Skup & s) { // quiranje skupa. Ј
niz = new double [vel = s.vel];
for (int i=0; i<vel; i++) niz[i] = s.niz[i];
}
void Skup::unija (const Skup & s1, const Skup & s2) { // Unija dva skupa.
Skup s;
s.niz = new double [s1.vel+s2.vel]; s.vel = 0;
for (int i=0, j=0; i<s1.vel|| j<s2.vel;)
s.niz[s.vel++] = i==s1.vel ? s2.niz[j++]:
j==s2.vel ? s1.niz[i++]:
s1.niz[i]<s2.niz[j] ? s1.niz[i++]:
s1.niz[i]>s2.niz[j] ? s2.niz[j++]:
(j++, s1.niz[i++]);
brisi (); kopiraj (s);
}

void Skup::presek (const Skup & s1, const Skup & s2) { // Presek dva skupa.
Skup s;
s.niz = new double [s1.vel<s2.vel ? s1.vel : s2.vel]; s.vel = 0;
for (int i=0, j=0; i<s1.vel && j<s2.vel;)
if (s1.niz[i] < s2.niz[j]) i++;
else if (s1.niz[i] > s2.niz[j]) j++;
else s.niz[s.vel++] = s1.niz[i++], j++;
brisi (); kopiraj (s);
}

void Skup::razlika(const Skup & s1, const Skup & s2) { // Razlika dva skupa.
Skup s;
s.niz = new double [s1.vel]; s.vel = 0;
for (int i=0, j=0; i<s1.vel; )
if (j==s2.vel)s.niz[s.vel++]=s1.niz[i++];
else if (s1.niz[i] < s2.niz[j]) s.niz[s.vel++] = s1.niz[i++];
else if (s1.niz[i] > s2.niz[j]) j++;
else i++, j++;
brisi (); kopiraj (s);
}
void Skup::pisi () const { // Pisanje skupa.
cout<<'{';
for(int i=0; i<vel; i++){cout<<niz[i];if(i<vel-1)cout<<',';}
cout<<'}';
}


void Skup::citaj () { // Čitanje skupa.
brisi();
int vel; cin >> vel;
double broj;
for (int i=0; i<vel; i++) { cin >> broj; unija (*this, broj); }
}
// Ispitivanje klase uređenih skupova.
#include "skup.h"
#include <iostream>
using namespace std;
int main()
{
char jos;
do
{
Skup s1; cout << "niz1? "; s1.citaj ();
Skup s2; cout << "niz2? "; s2.citaj();
cout << "s1 ="; s1.pisi (); cout << endl;
cout << "s2 ="; s2.pisi (); cout << endl;
Skup s; s.unija (s1, s2); cout << "s1+s2="; s .pisi (); cout << endl;
s.presek (s1, s2); cout << "s1*s2="; s .pisi (); cout << endl;
s.razlika(s1, s2); cout << "s1–s2="; s .pisi (); cout << endl;

cout << "\nJos? "; cin >> jos;
}while (jos=='d'|| jos=='D');
return 0;
}

показивач this

Методе класа, осим својих параметара, који се виде у декларацији (дефиницији) функције, имају још један скривени параметар. Тај параметар је адреса објекта за који је метода позвана, тј. адреса првог операнда оператора . или вредност првог операнда оператора ->. Тај објекат се назива текући објекат, јер је то објекат који метода обрађује. Наставите са читањем

Конструктори и деструктори – урађен пример

Написати на језику C++ класу низова целих бројева. Предвидети:

  • стварање низа задате дужине (подразумевано 10) с елементима једнаким нули

  • стварање низа од копије другог низа

  • уништавање низа

  • дохватање дужине низа

  • приступ датом елементу низа

  • израчунавање збира и средње вредности елемената низа

  • налажење вредности најмањег и највећег елемента низа

  • уређивање низа по неопадајућим вредностима елемената низа

Написати на језику C++ програм за приказивање могућности горње класе. Програм треба да обрађује произвољан број низова

// niz.h - definicija klase nizova celih brojeva
#include<cstdlib>
using namespace std;
class Niz
{
int n, *a; // duzina i pokazivac na elemente
public:
Niz(int k=10); // stvaranje niza
Niz(const Niz& niz); // inicijalizacija drugim nizom (konstruktor kopije)
~Niz(); // unistavanje niza
int duz() const; // dohvatanje duzine niza
int& elem(int i) const; // pristup datom elementu
int zbir() const; // izracunavanje zbira elemenata
double srednje() const; // izracunavanje srednje vrednosti
int najmanji() const; // nalazenje najmanjeg elementa
int najveci() const; // nalazenje najveceg elementa
void uredi(); // uredjivanje niza
};

 

#include"niz.h"
Niz::Niz(int k) // stvaranje niza
{ n=k; a=new int[n];for (int i=0; i<n; a[i++]);} // podrazumevani konstruktor i obican konstruktor
Niz::Niz(const Niz& niz) // inicijalizacija drugim nizom (konstruktor kopije)
{ n=niz.n; a=new int[n]; for (int i=0; i<n; i++) a[i]=niz.a[i]; }
Niz::~Niz(){delete[]a;} // unistavanje niza
int Niz::duz() const {return n;} // dohvatanje duzine niza
int& Niz::elem(int i) const // pristup datom elementu
{ if (i<0||i>=n) exit(1); return a[i]; }
int Niz::zbir() const // izracunavanje zbira elemenata
{ int z=0; for (int i=0; i<n; z+=a[i++]); return z; }
double Niz::srednje() const // izracunavanje srednje vrednosti
{ return n>0 ? (double) zbir()/n : 0; }
int Niz::najmanji() const // nalazenje najmanjeg elementa
{ if (n==0) exit(2); int m=a[0]; for (int i=0; i<n; i++) if (a[i]<m) m=a[i]; return m; }
int Niz::najveci() const // nalazenje najveceg elementa
{ if (n==0) exit(2); int m=a[0]; for (int i=1; i<n; i++) if(a[i]>m) m=a[i]; return m; }
void Niz::uredi() // uredjivanje niza
{ for (int i=0; i<n-1; i++) for (int j=i+1; j<n; j++) if(a[j]<a[i]) {int p=a[i]; a[i]=a[j]; a[j]=p; } }

 

// glavni program - ispitivanje klase nizova celih brojeva
#include"niz.h"
#include<iostream>
using namespace std;
int main()
{
while (true)
{
cout<<"duzina? "; int n; cin>>n; if (n<=0) break;
Niz niz(n); cout<<"niz: ";int i; for ( i=0; i<niz.duz(); i++) cin>>niz.elem(i);
cout<<"zbir ="<<niz.zbir()<<endl;
cout<<"srednje ="<<niz.srednje()<<endl;
cout<<"najmanji="<<niz.najmanji()<<endl;
cout<<"najveci ="<<niz.najveci()<<endl;
niz.uredi();
cout<<"uredjeno=";
for (i=0; i<niz.duz(); i++) cout<<niz.elem(i)<<' ';
cout<<endl<<endl;
} // tu se poziva destruktor za niz na kraju svakog prolaza (kroz while)
return 0;
}

Конструктори и деструктори

Да би класа исправно могла да се користи, односно да би могли да се исправно креирају објекти класе мора да постоји посебна метода, односно функција чланица која се назива конструктор. Наставите са читањем

Креирање пројекта у програмском језику C++

Да би класа исправно могла да се користи, односно да би могли да се исправно креирају објекти класе мора да постоји посебна метода, односно функција чланица која се назива конструктор. Наставите са читањем