Низови

Низ је сложени тип податка. Представља “скуп” података истог типа. Сваки од појединачних података унутар низа назива се елеменат низа и може му се приступити на основу његовог редног броја у низу. Низ се описује помоћу имена низа (заједничко је за све елементе низа, а сваки елеменат поред имена низа има и свој редни број), типа променљиве елемената низа и величине низа, односно броја елемената низа. Наставите са читањем

Модуларно програмирање – задаци

1. Написати програм који претвара правоугле координате у поларне. Применити модуларно програмирање и глобалне променљиве.

/* podaci.h - globalni podaci u zasebnoj datoteci + deklaracija funkcije */
double x,y,r,fi; /*definicija globalnih podataka*/
void polar ();
/* funkcija.c - definicija funkcije u zasebnoj datoteci*/
#include"podaci.h"
#include
extern double x,y,r,fi; /* deklaracija globalnih podataka*/
void polar ()/*definicija funkcije*/
{
	r=sqrt(x*x+y*y);
	fi=(x==0&&y==0)?0:atan2(y,x);
}
/* glavni program u zasebnoj datoteci */
#include"podaci.h"
#include
extern double x,y,r,fi; /* deklaracija globalnih podataka*/
void polar (void);/*deklaracija (prototip) funkcije - ne mora, ali nije greska ako se i ovde deklarise */
int main()
{	while(printf("x,y?"),scanf("%lf%lf",&x,&y),x!=1E38)
	{	polar();/* kada koristimo globalne promenljive funkcja polar nema parametre, zato sto su podaci koje ona koristi – globalne promenljive */
		printf("r,fi=%f, %f\n",r,fi);
	}
	return 0;
}

2. Формирати програмски модул који израчунава реципрочну вредност броја (1/x) и n-ти степен броја x. У главном програму израчунати formula

/* funkcije.h */
float rec (float x);
float xn (float x,int n);
/* funkcije.c */
float rec (float x){return 1/x;}
float xn (float x,int n)
{
int i;float f=1;
for(i=1;i<=n;i++)f=f*x;
return f;
}
/* glavni program */
#include 
#include "funkcije.h"
int main()
{
    int i,n;float x,s=1;
    printf("unesi x i n");scanf("%d%f",&n,&x);
    for(i=1;i<=n;i++)s=s+rec(i*x);
    printf("s=%f",s);
    return 0;
}

3. Применом програмског модула из претходног задатка у главном програму израчунати formula1

/* glavni program. Ostali fajlovi se dodaju u projekat pomocu Add files to project */
#include 
#include "..\recxnan\funkcije.h" /*ovde navodimo putanju do fajla! */
int main()
{
    int i,n;float x,s=1;
    printf("unesi x i n");scanf("%d%f",&n,&x);
    for(i=1;i<=n;i++)s=s+rec(i*xn(x,i));
    printf("s=%f",s);
    return 0;
}

4. Применом програмског модула из претходног задатка у главном програму израчунати вредност израза formula2

/* glavni program. Kao i u prethodnom zadatku, i ovde fajlove programskog modula treba dodati pomocu Add files to project */
#include 
#include "..\recxnan\funkcije.h" /*ovde navodimo putanju do fajla! */

int main()
{
    float x,a,b,c,y;
    printf("unesi x,a,b,c");scanf("%f%f%f%f",&x,&a,&b,&c);
y=a*xn(x,4)+b*xn(x,2)+c;
printf("y=%f",y);
    return 0;}

показивач 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;
}