You are on page 1of 39

PANEVROPSKI UNIVERZITET APEIRON

FAKULTET POSLOVNE INFORMATIKE


Redovne studije
Smjer Poslovna informatika

Predmet
Vii programski jezici i RAD alati programiranje u C++

Rijeeni primjeri iz C++


(seminarski rad)

Predmetni nastavnik
Prof. dr Zoran . Avramovi, dipl.in.elek.

Student

Igor Doen, Sigurnost IS II


Index br. 15-10/VPI-5
Banja Luka, rujan 2012.

Zadaci sa matricama
1.

Nainiti program na C++-u za izraunavanje determinante kvadratne matrice Ann.


( Sugestija: Nainiti program koji realizira Sarusovo pravilo.)
Posebni dodaci n=3,Ann=?

#include <iostream>
#include <vector>
using namespace std;
int secondDegree(vector< vector<int> > a)
{
return a[0][0] * a[1][1] - a[1][0] * a[0][1];
}
int ruleOfSaruss(vector< vector<int> > a)
{
return a[0][0] * a[1][1] * a[2][2] + a[0][1] *a[1][2] * a[2][0] + a[0][2] * a[1][0] * a[2][1] - a[2][0] * a[1][1] * a[0]
[2] - a[2][1] * a[1][2] * a[0][0] - a[2][2] * a[1][0] * a[0][1];
}
int main()
{
// Unosi se redak po redak.
int n;
cout << "n: "; cin >> n;
//int *matrix = new int[n][n];
vector< vector<int> > matrix( n, vector<int>(n));
for( int i = 0; i < n; ++i )
{
for( int j = 0; j < n; ++j)
{
cout << "A[" << i + 1 << "][" << j + 1 << "]: ";
cin >> matrix[i][j];
}
}
switch(n)
{
case 2:
cout << "det(A) = " << secondDegree(matrix) << endl;
break;
case 3:
cout << "det(A) = " << ruleOfSaruss(matrix) << endl;
break;

}
return 0;
}

2.

Nainiti program u C++-u za stupnjevanje kvadratne matrice Ann na stupanj k.


( Sugestija: Nainiti program za mnoenje dvije matrice. )
Posebni dodaci n=3, Ann=?

#include <iostream>
#include <vector>
using namespace std;
vector< vector<int> > multiply(vector< vector<int> > a, vector< vector<int> > b)
{
int sum;
vector< vector<int> > mat( a.size(), vector<int>(a.size()));
for( int i = 0; i < a.size(); ++i )
{
for( int j = 0; j < a.size(); ++j )
{
sum = 0;
for( int k = 0; k < a.size(); ++k )
{
sum = sum + a[i][k]*b[k][j];
}
mat[i][j] = sum;
}
}
return mat;
}
void printMatrix( vector< vector<int> > a)
{
for( int i = 0; i < a.size(); ++i )
{
for( int j = 0; j < a.size(); ++j )
{
cout << a[i][j] << " ";
}
cout << endl;
}
}

int main()
{
// Unosi se redak po redak.
int n, k;
cout << "n: "; cin >> n;
cout << "k: "; cin >> k;
vector< vector<int> > matrix( n, vector<int>(n) );
for( int i = 0; i < n; ++i )
{
for( int j = 0; j < n; ++j)
{
cout << "A[" << i + 1 << "][" << j + 1 << "]: ";
cin >> matrix[i][j];
}
}
vector< vector<int> > tmp, solution;
tmp = matrix;
solution = multiply(matrix, tmp);
for ( int degree = 3; degree <= k; ++degree )
{
solution = multiply(solution, matrix);
}
printMatrix( solution );
return 0;
}

Nainiti program u C++-u za nalaenje inverze matrice date kvadratne matrice Ann.

3.

Posebni dodaci n=3, Ann=?


#include <iostream>
using namespace std;
int GetMinor(float **src, float **dest, int row, int col, int order)
{
int colCount = 0,rowCount = 0;
for(int i = 0; i < order; i++ )
{
if( i != row )
{
colCount = 0;
for( int j = 0; j < order; j++ )
{
if( j != col )
{
dest[ rowCount ][ colCount ] = src[ i ][ j ];
colCount++;
}
}
rowCount++;
}
}
return 1;
}
double CalcDeterminant( float **mat, int order )
{
if( order == 1 )
return mat[0][0];
float det = 0;
float **minor;
minor = new float*[ order - 1 ];
for( int i = 0; i < order - 1; ++i )
minor[i] = new float[order-1];
for(int i = 0; i < order; i++ )
{
GetMinor( mat, minor, 0, i , order );
det += ( i % 2 == 1?-1.0:1.0) * mat[ 0 ][ i ] * CalcDeterminant( minor, order - 1 );
}

for( int i = 0; i < order - 1; ++i )


delete [ ] minor[ i ];
delete [ ] minor;
return det;
}
void matInverse( float **A, int order, float **Y )
{
double det = 1.0 / CalcDeterminant( A, order );
float *temp = new float[ ( order - 1 ) * ( order - 1 ) ];
float **minor = new float *[ order - 1 ];
for( int i = 0; i < order - 1; ++i)
minor[ i ] = temp + ( i * ( order - 1 ) );
for( int j = 0; j < order; ++j )
{
for( int i = 0; i < order; ++i )
{
GetMinor( A, minor, j, i, order );
Y[ i ][ j ] = det * CalcDeterminant( minor, order - 1 );
if( ( i + j ) % 2 == 1)
Y[ i ][ j ] = -Y[ i ][ j ];
}
}
delete [] temp;
delete [] minor;
}
void print( float **matrix, int n )
{
for( int i = 0; i < n; ++i )
{
for( int j = 0; j < n; ++j )
{
cout << matrix[i][j] << " ";
}
cout << endl;
}
}
int main()
{
float **matrix, **sol, num;
int n;

cout << "stupanj matrice: "; cin >> n;


matrix = new float*[n];
sol = new float*[n];
for ( int i = 0; i < n; ++i )
{
matrix[i] = new float[n];
sol[i] = new float[n];
for( int j = 0; j < n; ++j )
{
cout << "A[" << i + 1 << ", " << j + 1 << "]: "; cin >> num;
matrix[i][j] = num;
}
}
cout << "Matrica A: " << endl;
print( matrix, n );
cout << "Inverz Matrice A: " << endl;
matInverse( matrix, n, sol );
print( sol, n );
return 0;
}

Zadaci sa brojevima
1. Nainiti program na C++-u za nalaenje prvih n prostih brojeva.
Poseban dodatak: n=20
#include <iostream>
using namespace std;
bool prost(int broj);
int main() {
int i=0, n; // brojac i moramo postaviti na 0 (moze zapravo i na 2 jer 0 i 1 znamo da nisu prosti, ali MORAMO
mu dati neku pocetnu vrijednost)
cout << "Prvih koliko prostih brojeva? ";
cin >> n;
for(i=0; n; i++) { // vrti petlju poevi od i=0 i uveavaj i za 1 sve dok je n razlicit od 0 (jer ga umanjujemo pa ce
doc na nulu)
if (prost(i)) { // provjeri uz pomoc funkcije je li i prost
cout << i << " ";// ako je, ispisi ga
n--; // i umanji n za 1
}
}
system("PAUSE");
}
bool prost(int broj) {
if (broj<2) return false; // ako je broj manji od 2, preskacemo ga jer je 2 prvi prosti broj;
bool prost=true; // za pocetak pretpostavimo da je broj prost i pokusajmo dokazati drugacije
int brojac;
for (brojac=2; brojac<broj; brojac++) {
if (broj%brojac==0) {
prost=false; // ako je djeljiv s nekim brojem u intervalu [2, broj> onda to znaci da nije prost
}
}
return prost;
}

bool je tip podataka koji moe biti true ili false, to nam je odlino za ovakav tip provjere jer ili
je, ili nije prost. Dakle uz main funkciju emo imati jo jednu. Trebat e nam neki broja n koji
govori koliko prostih brojeva ispisujemo i jo 1 broja, nazovimo ga i koji emo uveavat za 1 i
provjeravat jeli prost sve dok ne naemo n prostih brojeva.

2. Nainiti program za C++-u za nalaenje svih prostih brojeva manjih od zadatog


prirodnog broja n.
Poseban podatak n=100
#include <stdio.h>
#include <stdlib.h>
int prost(unsigned int broj)
{
int i;
for(i=2; i<broj; i++)
if(broj % i == 0)
return 0;
return 1;
}
int main()
{
int i;
for(i=1; i<=100; i++)
if(prost(i) == 1)
printf("%d\t", i);
system("PAUSE");
return 0;
}

3. Nainiti program u C++-u za pronalaenje svih prostih brojeva izmeu dva zadata
prirodna broja m i n.
Posebni dodaci m=10 n=100
#include <iostream>
#include <climits>
#include <vector>
using namespace std;
int main()
{
int n = SHRT_MAX, i, k;
int *arr = new int[n];
vector<int> p_nums;
int lower_bound, upper_bound;
cout << "m: "; cin >> lower_bound;
cout << "n: "; cin >> upper_bound;
for( i = 0; i < n; ++i )
arr[ i ] = i + 2;

for( i = 0; i < n; ++i )


{
if( arr[ i ] != 0 )
{
for( k = i + 1; k < n; ++k )
{
if( arr[ k ] != 0 )
{
if( arr[ k ] % arr[ i ] == 0 )
arr[k] = 0;
}
}
}
}
for( i = lower_bound; i <= upper_bound; ++i )
if( arr[ i ] != 0 && arr[ i ] <= upper_bound && arr[ i ] >= lower_bound)
p_nums.push_back( arr[ i ] );
for( i = 0; i < p_nums.size() ; ++i )
cout << p_nums[ i ] << endl;
cout << endl;
}

4. Nainiti program u C++-u za runo mnoenje dva viecifrena prirodna broja.


#include <iostream>
#include <string>
using namespace std;
class math {
private:
static int multiply_int( int x, int y, int z )
{
if ( y > 1 )
{
x += z;
y--;
return multiply_int( x, y, z );
}
else return ( x );
}
public:
static int multiply_int( int x, int y )

10

{
int z = x;
if ( x != 0 && x != 1 && x != (-1) )
{
if ( y == 1 ) return x;
if ( y > 1 )
{
y--;
x += z;
return ( multiply_int( x, y, z ) );
}
else if ( y < (-1) )
{
y = ( 0 - y );
int a = multiply_int( x, y );
a = ( 0 - a );
return ( a );
}
else if ( y == -1 )
{
x = 0 - x;
return ( x );
}
else return 0;
}
else if ( x == 1 ) return y;
else if ( x == (-1) )
{
y = 0 - y;
return ( y );
}
else return 0;
}
};
int main()
{
int num1, num2;
cout << "n: "; cin >> num1;
cout << "m: "; cin >> num2;
cout << "n * m = " << math::multiply_int(num1, num2);

11

cout << endl;


system("PAUSE");
return 0;
}

5. Nainiti program za tono dijeljenje dva viecifrena broja na zadan broj decimala.
( Sugestija oponaati runo dijeljenje brojeva )
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double n, m;
cout << "n: "; cin >> n;
cout << "m: "; cin >> m;
cout << setprecision (9) << n / m << endl;
cout << endl;
return 0;
}

6. Nainiti program na C++-u za izraunavanje binomnih koeficijenata.


#include <iostream>
using namespace std;
int binom( int n, int k )
{
int polje[ n ][ n ];
for( int i = 0; i <= n ; ++i )
{
for( int j = 0; j <= i ; ++j )
{
if( j == 0 || j == i ) polje[ i ][ j ] = 1;
else polje[ i ][ j ] = polje[ i - 1 ][ j - 1 ] + polje[ i - 1 ][ j ];
}
}
return polje[ n ][ k ];
}
int main()

12

{
int n, k;
// uvjet: n > k > 0
cout << "n: "; cin >> n;
cout << "k: "; cin >> k;
cout << "binom(" << n << "," << k << ") = " << binom(n, k) << endl;
return 0;
}

7. Nainiti program na C++-u za nalaenje NZD dva prirodna broja.


#include <iostream>
using namespace std;
int nzd( int a, int b )
{
int tmp;
while ( a > 0 )
{
if ( a < b )
{
tmp = a;
a = b;
b = tmp;
}
a -= b;
}
return b;
}
int main()
{
int n, m;
cout << "n: "; cin >> n;
cout << "m: "; cin >> m;
cout << "NZD(" << n << "," << m << ") = " << nzd(n, m) << endl;
return 0;
}

13

8. Nainiti program na C++-u za konvertiranje dekadnog broja u binarni (cijeli,racionalni).


#include <iostream>
using namespace std;
void binary( int number ) {
int remainder;
if( number <= 1 )
{
cout << number;
return;
}
remainder = number % 2;
binary(number >> 1);
cout << remainder;
}
int main()
{
int n; cout << "n: "; cin >> n; binary( n ); cout << endl; return 0;
}

9. Nainiti program
( cijeli,racionalni).

na

C++-u

za

konvertiranje

binarnog

broja

dekadni

#include <iostream>
#include <cmath>
using namespace std;
int binToBase10( int n )
{
int output = 0;
for( int i = 0; n > 0; ++i )
{
if( n % 10 == 1 )
{
output += pow(2.0, i);
}
n /= 10;
}
return output;
}
int main()
{
int binInt; cout << "binary: "; cin >> binInt; cout << binToBase10( binInt ) << endl; system("pause"); return 0;
}

14

10. Nainiti program na C++-u za nalaenje savrenih brojeva.


#include<iostream>
using namespace std;
int main()
{
int brojac,zbroj,N;
cout<<"Program ispituje da li je odabrani prirodni broj savrsen.";
upis:cout<<endl<<"Upisi prirodni broj: ";
cin>>N;
zbroj=0;
if (N<=0)
goto upis;
for (brojac=1;brojac<=(N-1);brojac++)
{
if(N%brojac==0)
{
zbroj=zbroj+brojac;
}
}
if(zbroj==N)
cout<<"Broj "<<N<<" je savrsen."<<endl;
else
cout<<"Broj "<<N<<" nije savrsen."<<endl;
system("PAUSE");
return 0;
}

15

11. Nainiti program na C++-u za nalaenje Amstrongovih brojeva.


#include <iostream>
using namespace std;
bool isArmstrong( int n )
{
bool is = false;
if( n > 99 && n < 1000 )
{
int f = n / 100;
int s = (n / 10) % 10;
int t = n % 10;
if(f * f * f + s * s * s + t * t * t == n)
{
is = true;
}
}
return is;
}
int main( )
{
int n; cout << "n: "; cin >> n; cout << ( isArmstrong( n ) ? "true" : "false" ) << endl; return 0;
return 0;
}

12. Nainiti program na C++-u za ispitivanje Paskalovog trougla.


#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
vector< vector< int > > pascal( int n )
{
vector< vector< int > > V( n, vector< int >( ) );
V[0].push_back(1);
V[0].push_back(0);
for ( int i( 1 ); i < n; ++i )
{
V[ i ].push_back( 1 );

16

for ( int j( 1 ); j < i + 1; ++j )


{
V[ i ].push_back( V[ i - 1][ j ] + V[ i - 1 ][ j - 1 ] );
}
V[ i ].push_back( 0 );
}
for( int i( 0 ); i < n; ++i )
{
V[ i ].resize( V[ i ].size( ) - 1 );
}
for ( int i( 0 ); i < V.size( ); ++i )
{
for ( int j( 0 ); j < V[ i ].size( ); ++j )
{
cout << setw( 5 ) << V[ i ][ j ];
}
cout << endl;
}
return V;
}
int main( )
{
int n; cout << "n: "; while ( !(cin>>n) ) { cin.clear(); cin.ignore(1000,'\n'); cout << "err! pokusaj ponovo. trazi se
cijeli broj."; cin >> n; }
vector< vector< int > > arr; arr = pascal( n );
return 0;
}

17

Numeriki zadaci
1. Nainiti program na C++-u za nalaenje nule funkcije zadate funkcije jedne nezavisno
promjenjive metodom seice, u zadatom intervalu a,b u kome se nalazi jedinstvena nula
i to sa traenom tonou sa kojom se nula nalazi.
Posebni podaci: donja granica intervala a=1, gornja granica intervala b=5 i traena
tonost epsilon =0,001 za funkciju y=f(x)=
#include <iostream>
#include <cmath>
using namespace std;
int main( )
{
double m, r, i, xi, xi1;
const double EPSILON = .001;
xi = 1.0;
xi1 = 0.0;
cout << "r: "; cin >> r;
cout << "i: "; cin >> i;
m = i - 1;
while( abs( xi1 - xi ) >= EPSILON )
{
xi1 = xi;
xi = xi + ( (-1) * pow( xi, i ) + r ) / ( i * (pow( xi, m ) ));
}
cout << " answer: " << xi << endl;
system("pause");
return 0;
}

2. Nainiti program na C++-u za nalaenje nule funkcije zadate funkcije jedne nezavisno
promjenjive metodom polovljenja intervala, u zadatom intervalu a,b u kome se nalazi
jedinstvena nula i to sa traenom tonou sa kojom se nula nalazi.
Posebni podaci: donja granica intervala a=1, gornja granica intervala b=5, i traena
tonost epsilon =0,001 za funkciju y=f(x)=
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
double f( double x = 0 )
{
return ( x * x * x ) + ( 6 * x * x ) + ( 12 * x ) + 8;
}

18

int i( double a, double b, double tolerance )


{
return round( log2(( abs( b - 2 ) ) / tolerance ) );
}
int main(int argc, char** argv)
{
double a = 1e11;
double b = -1e11;
double c = 0;
double y = 0;
int iterations = i(a, b, 1e-12 );
cout << "iterations: " << iterations << endl;
for (int i = 0; i < iterations; ++i )
{
c = (a + b) / 2;
cout << i << ":\nc = " << c << endl;
y = f(c);
cout << "y = " << c << endl;
if (y < 0)
{
b = c;
cout << "b = " << c << endl;
}
else if (y > 0)
{
a = c;
cout << "a = " << c << endl;
} else {
break;
}
}
cout << "root: " << c;
cout << endl;
system("pause");
return 0;
}

19

3. Nainiti program na C++-u za rjeavanje kvadratne jednadbe.


#include<iostream>
#include<cmath>
using namespace std;
int main ()
{
float a,b,c;
cout<<"Unesi koeficijente kvadratne jednadzbe :"<<endl;
cout<<"a = ";
cin>>a;
cout<<"b = ";
cin>>b;
cout<<"c = ";
cin>>c;
float diskr=(b*b)-(4*a*c);
cout<<"Jednadzba ima ";
if(diskr==0)
cout<<"dvostruki realni korijen,rjesenje je: X1 = X2 = "<<(-b/(2*a))<<endl;
else if(diskr>0)
cout<<"dva realna rjesenja,rjesenja su: X1 = "<<(-b+sqrt(diskr))/(2*a)<<" i X2 = "<<(-b-sqrt(diskr))/(2*a)<<endl;
else
cout<<"dva kompleksna korjena "<<endl;
getchar ();
system("PAUSE");
return 0;
}

4. Nainiti program na C++-u za nalaenje mainske nule ( 0+ ,1+ ).


#include <iostream>
#include <cmath>
using namespace std;
int main()
{
float n, m;
cout << "n: "; cin >> n; cout << "m: "; cin >> m; cout << pow(n, -m) << endl;
system("pause");
return 0;
}

20

5. Nainiti program na C++-u za izraunavanje najveeg interger-a i real-a koji se mogu


smjestiti u raunalu.
#include <iostream>
using namespace std;
int main( )
{
int i = 1; while( i > 0) { i++; }; cout << i - 1 << endl;
double d = 1.0; while( d > 0 ) d++; cout << d - 1 << endl;
return 0;
}

6. Nainiti program na C++-u za nalaenje faktorijela zadatog nenegativnog cijelog broja


rekurzijom i iteracijom.
#include <iostream>
using namespace std;
int factorial_recursion( int num )
{
int tmp;
if( num <= 1 ) return 1;
tmp = num * factorial_recursion(num - 1);
return tmp;
}
int factorial_iteration( int num )
{
int factorial( num );
for( int n( num - 1 ); n > 0; factorial *= n, --n );
return factorial;
}
int main()
{
int num; cout << "n: "; cin >> num;
int factorial( num );
int factorial_iter = factorial_iteration( factorial );
int factorial_rec = factorial_recursion( factorial );
cout << "factorial_iter: " << factorial_iter << endl;
cout << "factorial_rec: " << factorial_rec << endl;
return 0;
}

21

7. Nainiti program na C++-u za utvrivanje koji je to najvei prirodan broj iji se


faktorijel moe predstaviti u raunalu i obliku inerger broja.
#include <iostream>
using namespace std;
int main( )
{
int i = 1; while( i > 0) { i++; }; cout << i - 1 << endl;
double d = 1.0; while( d > 0 ) d++; cout << d - 1 << endl;
system("pause");
return 0;
}

8. Nainiti program na C++-u za rjeavanje sistema linearnih jednadbi Gausovoim


metodom eliminacije.
#include <iostream>
#include <cmath>
double *linsolve( double** A, int n, double * vec, int m, double &residual, int &flag);
int main(void) {
double **A;
double *rhs;
double *x;
double res = 0.0;
int flag = 0;
A = new double* [2];
for (int i=0; i<2; i++) A[i] = new double [2];
A[0][0] = 2.0;
A[0][1] = A[1][0] = 0.0;
A[1][1] = 4.0;
rhs = new double[2];
rhs[0] = 7.0;
rhs[1] = 8.0;
x = linsolve( A, 2, rhs, 2, res, flag );
for (int i=0; i<2; i++) {
std::cout << x[i] << std::endl;
}
return 0;
}
double *linsolve( double** A, int n, double * vec, int m, double &residual, int &flag)
{

22

double **ab;
double *x;
int i,j,k,l,np1,nm1,kp1,bigindex;
double sumr, rowmax, scale, big, tempb, tempi, qout, sum;
ab = new double* [n];
x = new double [n];
for (i=0; i<n; i++) ab[i] = new double [n+1];
np1 = n+1;
nm1 = n-1;
for (i=0; i<n; i++) {
rowmax = 0.0;
for (j=0; j<n; j++) {
rowmax = rowmax > fabs( A[i][j] ) ? rowmax : fabs(A[i][j]);
}
if ( rowmax == 0.0 ) {
flag = -1;
return( NULL );
}
scale = 1.0 / rowmax;
for (j=0; j<n; j++) {
ab[i][j] = A[i][j] * scale;
}
ab[i][n] = vec[i] * scale;
}
for (k=0; k<n-1; k++) {
big = 0.0;
for (i=k; i<n; i++) {
tempb = fabs( A[i][k] );
if ( big >= tempb ) continue;
big = tempb;
bigindex = i;
}
if ( big == 0.0 ) {
flag = -2;
return NULL;
}
if ( bigindex != k ) {
for (i=k; i<n+1; i++) {
tempi = ab[k][i];
ab[k][i] = ab[bigindex][i];
ab[bigindex][i] = tempi;

23

}
}
kp1 = k+1;
for (i=kp1; i<n; i++) {
qout = ab[i][k] / ab[k][k];
for (j=kp1; j<n+1; j++) {
ab[i][j] = ab[i][j] - qout * ab[k][j];
}
}
}
if ( ab[n-1][n-1] == 0.0 ) {
flag = -3;
return NULL;
}
x[n-1] = ab[n-1][n] / ab[n-1][n-1];
for (i=1; i<=n; i++) {
k = n - i;
sum = 0.0;
for (j=k+1; j<n; j++) {
sum += ab[k][j] * x[j];
}
x[k] = ( ab[k][n] - sum ) / ab[k][k];
}
residual = 0.0;
for (i=0; i<n; i++) {
sumr = 0.0;
for (j=0; j<n; j++) {
sumr += A[i][j] * x[j];
residual = residual > fabs(sumr-vec[i]) ? residual : fabs(sumr-vec[i]);
flag = 0;
}
}
std::cout << "sol: " << *x << std::endl;
system("pause");
return 0;
}

24

Razni zadaci
1. Nainiti program na C++-u za unapreivanje vremena nalaenja n-tog Fibonaijevog
broja koritenjem iteracije i rekurzije.
#include <iostream>
#include <ctime>
#include <vector>
using namespace std;
int fibb( int n )
{
if( n <= 1 ) return n;
else return fibb( n - 1 ) + fibb( n - 2 );
}
int fibb_iter( int n )
{
int fib[ ] = { 0, 1, 1 };
for( int i = 2; i <= n; ++i )
{
fib[ i % 3 ] = fib[ ( i - 1 ) % 3 ] + fib[ ( i - 2 ) % 3 ];
//cout << "fib(" << i << ") = " << fib[ i % 3 ] << endl;
}
return fib[ n % 3 ];
}
int main( )
{
int n; cout << "n: "; cin >> n;
int t1 = clock( );
cout << "fibb: " << fibb( n ) << endl;
cout << "time: " << ( ( float ) t1 ) / CLOCKS_PER_SEC << " secs\n";
int t2 = clock( );
cout << "fibb_iter: " << fibb_iter( n ) << endl;
cout << "time: " << ( (float) t2) / CLOCKS_PER_SEC << " secs\n";
retun 0;
}

25

Zadaci sa polinomima
1. Nainiti program na C++-u za nalaenje zbira dva zadata polinoma P(x) i Q (x), stepena
m i n,retrospektivno.
Posebni podaci:m=4, n=3,
P(x)=
Q(x)=
2. Nainiti program na C++-u za nalaenje razlike dva zadata polinoma P(x) i Q(x),
stepena m i n, retrospektivno.
Posebni podaci:m=4, n=3,
P(x)=
Q(x)=
3. Nainiti program na C++-u za nalaenje proizvoda dva zadata polinoma P(x) i
Q(x),stepena m i n, retrospektivno.
Posebni podaci:m=4, n=3,
P(x)=
Q(x)=
4. Nainiti program na C++-u za nalaenje kolinika dva zadata polinoma P(x) i
Q(x),stepena m i n, retrospektivno.
Posebni podaci:m=4, n=3,
P(x)=
Q(x)=
5. Nainiti program na C++-u za nalaenje izvoda funkcije y=f(x) zadate u formi polinoma
stepena n.
Posebni podaci:n=5, y=f(x)=
6. Nainiti program na C++-u za nalaenje k-tog izvoda polinoma stepena n.
Posebni podaci: n=3,k=1,P(x)=
7. Nainiti program na C++-u za nalaenje integrala polinoma stepena n.
Posebni podaci: n=2,P(x)=
8. Nainiti program na C++-u za nalaenje vrijednosti polinoma stepena n u datoj toki x.
( Sugestija: isprogramirati Heronov obrazac ).
Posebni podaci: n=4,x=1, P(x)=
Rjeenje sam napravio ovako. U poly.h datoteci ti se nalazi definicija klase polinom. Definicija
klase znaci da smo tamo definirali tipove podataka za metode (funkcije unutar klase) i atribute
(varijable unutar klase). I sad ima u poly.cpp, implementaciju svake metode koju smo
definirali u poly.h, znaci ako u polinom klasi imamo definiranu metodu poly::integrate(), onda
emo u datoteci poly.cpp opisat sto ta metoda radi,znai napisat emo funkciju poly::integrate()
{ ... opis sto ta funkcija radi ... }. tu moe primijetiti ovo 'poly::' to ti oznaava da metoda
integrate() pripada klasi poly. Znaci ovo gleda kao funkciju koja pripada(agregirana je)
nekome(tj.) neemu, u ovom sluaju klasi poly. E i dok tako fino agregira sve funkcije u jednu
26

klasu, znaci ima jedan veliki nacrt kue, onda ode u main funkciju i kae tamo u main
funkciji ajd im ti izgradu 'kuu' prema tom nacrtu koji sam definirao i to u mainu ti izgleda
ovako:
poly varijab( n );
E sad tu znaci 'poly' oznaava tip podataka, 'varijab' ti oznaava varijablu (handle sa kojim
radi) i ovaj n u zagradama oznaava stupanj polinoma (jer smo tako definirali u nacrtu klase
poly).Sad kad si definirao svoj polinom 'varijab', nad njim moe zgodno radit neke operacije
koje smo definirali unutar klase, npr:
varijab.integrate( );
U ovom sluaju ce varijab polinom biti integriran, drugim rijeima objekt varijab ce pozvat onu
funkciju poly::integrate( ) i izvrit algoritam integriranja. Takoer u klasi ima overloadane
operatore(+, -, *, /)..sto to znaci? Pa poto smo definirali svoju klasu, za nju elimo i definirat
neke operacije koje nam slue za rad sa polinomom npr, ako definira dva polinoma, npr:
poly p1;
poly p2;
overloadani operatori(zapravo poseban tip funkcije unutar klase) znae da moemo jednostavno
napravit zbrajanje, oduzimanje, mnoenje, itd., primjer:
p1 * p2, p1-p2, itd...
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#include "poly.h"
poly::poly(int inSize)
{
try{
size = inSize;
data = new double[size];
}
catch (...)
{
throw (allocFail);
}
}
poly::poly(int inSize, double values[])
{
int i;

27

try
{
size = inSize;
data = new double[size];
} catch (...)
{
throw (allocFail);
}
if (data != NULL)
{
for (i=0; i<size; i++)
data[i] = values[size-1-i];
}
}

poly::poly(poly &orig)
{
int i;
try
{
size = orig.size;
data = new double[size];
} catch (...)
{
throw (allocFail);
}
for (i=0; i<size; i++)
data[i] = orig.data[i];
}
poly::~poly()
{
delete[] data;
}

void poly::setCoef(int term, double value)


{

28

if (term >= 0 && term < size)


data[term] = value;
}

double poly::getCoef(int term)


{
if (term >= 0 && term < size)
return data[term];
else return 0;
}

int poly::getSize()
{
return size;
}
poly poly::operator+(const poly &p)
{
int i;
poly ans(p.size);
if (size == p.size)
{
for (i=0; i<size; i++)
ans.data[i] = data[i] + p.data[i];
}
else if (size > p.size)
{
ans = ans.proP((size)-(p.size));
for (i=0; i<p.size; i++)
ans.data[i] = data[i] + p.data[i];
for (i=p.size; i<size; i++)
ans.data[i] = data[i];
return ans;
}
else if (size < p.size)
{
for (i=0; i<size; i++)

29

ans.data[i] = data[i] + p.data[i];


for (i=size; i<p.size; i++)
ans.data[i] = p.data[i];
}
return ans;
}
poly poly::operator*(const poly &p)
{
double set1[]={0};
poly ans(1,set1);
int i;
for (i=0;i<p.size;i++)
{
ans = ans + poly::proP(i) * p.data[i];
}
return ans;
}
poly poly::operator/(const poly &p)
{
poly ans;
ans.zero();
int i;
if (size>=p.size)
{
poly temp = *this;
poly top = *this;
poly bot(p.size);
for (i=0;i<bot.size;i++)
bot.data[i] = p.data[i];
bot.clean();
ans=ans.proP(top.size - bot.size);
ans.zero();

30

for ( i=0 ;i < ans.size ; i++)


{
if (bot.checkZero()!=1)
{
ans.data[ans.size-1-i]=temp.data[temp.size-1-i]/bot.data[bot.size-1];
temp = top - ans * bot;
}
}
}
return ans;
}

poly poly::operator+(double value)


{
poly ans;
ans = *this;
ans.data[0]= data[0]+value;
return ans;
}

poly poly::operator-(double value)


{
poly ans;
ans = *this;
ans.data[0]= data[0]-value;
return ans;
}
poly poly::operator-(const poly &p)
{
poly ans;
ans = p;
- ans;

//inverts

ans = ans + *this;


return ans;
}
poly poly::operator*(double value)
{

31

poly ans(size);
int i;
for (i=0; i<size; i++)
{
ans.data[i] = data[i] * value;
}
return ans;
}
poly poly::operator/ (double value)
{
poly ans(size);
int i;
for (i=0; i<size; i++)
{
ans.data[i] = data[i] / value;
}
return ans;
}
poly &poly::operator=(const poly &p) {
int i;
if (&p != this)
{
if (size != p.size)
{
try
{
delete[] data;
size = p.size;
data = new double[size];
} catch (...)
{
throw (allocFail);
}
}
if (data != NULL)
{
for (i=0; i<size; i++)
data[i] = p.data[i];//

32

}
}
return *this;
}
poly operator*(double value, const poly &p)
{
poly ans(p.size);
int i;
for (i=0; i<p.size; i++)
ans.data[i] = p.data[i] * value;
return ans;
}
poly operator+(double value, const poly &p)
{
poly ans(p.size);
p.data[0]= p.data[0] + value;
ans = p;
return ans;
}
poly operator-(double value, const poly &p)
{
poly ans(p.size);
p.data[0]= p.data[0] - value;
ans = p;
return ans;
}
poly poly::operator-()
{
*this = *this * -1.0;
return (*this );

//

}
poly poly::operator+()
{
return *this;

//

}
double &poly::operator[](int term)
{
if (term < 0) return data[0];

33

else if (term > size) return data[size];


else return data[term];
}
poly poly::proP(int value)
{
int i;
poly ans(size+value);
for (i=0;i<size;i++)
ans.data[i+value]=data[i];
for (i=0;i<value;i++)
ans.data[i]=0;
return ans;
}
poly poly::demP(int value)
{
int i;
poly ans(size-value);
for (i=0;i<size-value;i++)
ans.data[i]=data[i+value];
return ans;
}
void poly::clean()
{
int i;
int j = int(size);
for (i=0;i<j-1;i++)
{
if (data[size-1]==0 )
size = size -1;
}
}
void poly::zero()
{
int i;
for (i=0;i<size;i++)

34

data[i]=0;
}
int poly::checkZero()
{
if ((size==1)&&(data[0]==0))
return 1;
return 0;
}
poly poly::normalise()
{
int i;
poly::clean();

//remove multiple leading zero's

for (i=0;i<size;i++)
{
if (poly::checkZero()!=1)//check for zero
{
data[i]=data[i]/data[size-1];//divide by highest coeff
}
}
return *this;
}
poly poly::differenciate()
{
int i;
poly::clean();
if (size==1)

// if only x^0 term

poly::zero();

//return zero

*this=poly::demP(1);

//demote each term

else
{
for (i=0;i<size;i++)
{
data[i]=data[i]*(i+1);

//divide each term by old index

}
}
return *this;
}
poly poly::integrate()

35

{
int i;
*this=poly::proP(1);

//promote poly

for (i=1;i<size;i++)
{
data[i]=data[i]/(i);//divide promoted coefficients
}

//by exponent

return *this;
}
float poly::evaluate(float xValue)
{
float retValue=0;
int i;
for (i=0;i<size;i++)
{
retValue = retValue + pow(xValue,i);//adds all evaluated terms
}
return retValue;
}
void poly::print()
{
int i;
poly::clean();

//remove leading zeros

if (poly::checkZero()==1)

// if poly is all zero just print zero

cout<<0;
if (data[size-1]!=0)

//check not zero and

cout<<data[size-1];

//print highest without leading '+'

if (size>1)

//if size>1 print x^

cout<<"x^"<<size-1<<" ";//print highest without lead '+'


for (i=size-2; i>=0; i--)

//loop through the remainder

{
if (data[i]!=0)

//only print non-zero

{
if (data[i]>0)

//only print '+' for positives

cout<<"+";
cout<<data[i];
if (i!=0)

//do not print 'x^' for x^0 term


cout<<"x^"<<i<<" ";

36

}
//

cout<<endl;

}
void poly::fullPrint()
{
int i;
for (i=0; i<size-1; i++)
{
cout << data[i] <<"x^"<<i<<" ";
if (data[i+1]>=0)
cout<<"+";
}
cout << data[size-1]<<"x^"<<i;
}
int main( )
{
int m, n;
double *Px, *Qx, inCoeff;
cout << "P(x)->m: "; cin >> m; // broj koeficijenata polinoma P
Px = new double[m];
for( int i = 0; i < m; ++i )
{
cout << "P( x )->koeficijent uz x^" << m - 1 - i << ": "; cin >> inCoeff;
Px[ i ] = inCoeff;
}
cout << "Q( x )->n: "; cin >> n; // broj koeficijenata polinoma Q
Qx = new double[n];
for( int i = 0; i < n; ++i )
{
cout << "Q( x )->koeficijent uz x^" << n - 1 - i << ": "; cin >> inCoeff;
Qx[ i ] = inCoeff;
}
poly p1(m, Px); delete Px; cout << "P(x) = "; p1.print( ); cout << endl;
poly p2(n, Qx); delete Qx; cout << "Q(x) = "; p2.print( ); cout << endl;
poly t( m ), tmp( m ), integral( m ); t = tmp = integral = p1;

37

// Polinomi::1
poly pZbr( max( m, n ) );
pZbr = p1 + p2;
cout << " P( x ) + Q( x ) = "; pZbr.print( ); cout << endl;
// Polinomi::2
poly pRaz( max( m, n ) );
pRaz = p1 - p2;
cout << " P( x ) - Q( x ) = "; pRaz.print( ); cout << endl;
// Polinomi::3
poly pPro( m + n );
pPro = p1 * p2;
cout << " P( x ) * Q( x ) = "; pPro.print( ); cout << endl;
// Polinomi::4
poly pKol( m - n );
pKol = p1 / p2;
cout << " P( x ) / Q( x ) = "; pKol.print( ); cout << endl;
// Polinomi::5 (aka. izvod funkcije)
poly pDiff( m ); pDiff = p1;
pDiff.differenciate( );
cout << " P( x ).differenciate() = "; pDiff.print( ); cout << endl;
// Polinomi::6
int k;
cout << "k(k-ta derivacija) od P(x): "; cin >> k;
for( int i = 0; i < k; ++i )
{
tmp.differenciate( );
}
cout << "k-ti izvod P(x): "; tmp.print( ); cout << endl;
// Polinomi::7
integral.integrate( );
cout << " P(x).integrate( ): "; integral.print( ); cout << endl;

38

// Polinomi::8
int x; cout << "unesite tocku x za P( x ):"; cin >> x;
double cache = t[ m - 1 ]; cout << "Heronov algoritam: ";
cout << x << " | " << cache << " ";
for( int i = ( m - 1 ); i != 0; --i )
{
cache = ( cache * x ) + t[ i - 1 ];
cout << cache << " ";
}
cout << endl;
system("pause");
return 0;
}

39

You might also like