c++ seminarski rad igor dosen

45
PANEVROPSKI UNIVERZITET APEIRON FAKULTET POSLOVNE INFORMATIKE Redovne studije Smjer Poslovna informatikaPredmet Viši programski jezici i RAD alati – programiranje u C++ „Riješeni primjeri iz C++” (seminarski rad) Predmetni nastavnik Prof. dr Zoran Ž. Avramović, dipl.inž.elek.

Upload: pigo01

Post on 18-Apr-2015

650 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: C++ Seminarski Rad Igor Dosen

PANEVROPSKI UNIVERZITET APEIRONFAKULTET POSLOVNE INFORMATIKE

Redovne studijeSmjer „Poslovna informatika”

PredmetViši programski jezici i RAD alati – programiranje u C++

„Riješeni primjeri iz C++”

(seminarski rad)

Predmetni nastavnikProf. dr Zoran Ž. Avramović, dipl.inž.elek.

StudentIgor Došen, Sigurnost IS II

Index br. 15-10/VPI-5

Banja Luka, rujan 2012.

Page 2: C++ Seminarski Rad Igor Dosen

Zadaci sa matricama

1. Načiniti program na C++-u za izračunavanje determinante kvadratne matrice Ann.

( Sugestija: Načiniti 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;

2

Page 3: C++ Seminarski Rad Igor Dosen

}

return 0;

}

2. Načiniti program u C++-u za stupnjevanje kvadratne matrice Ann na stupanj k.

( Sugestija: Načiniti program za množenje 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;

}

}

3

Page 4: C++ Seminarski Rad Igor Dosen

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;

}

4

Page 5: C++ Seminarski Rad Igor Dosen

3. Načiniti program u C++-u za nalaženje inverze matrice date kvadratne matrice Ann.

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 );

}

5

Page 6: C++ Seminarski Rad Igor Dosen

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;

6

Page 7: C++ Seminarski Rad Igor Dosen

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;

}

7

Page 8: C++ Seminarski Rad Igor Dosen

Zadaci sa brojevima

1. Načiniti program na C++-u za nalaženje 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 počevši od i=0 i uvečavaj 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 može biti true ili false, što nam je odlično 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 uvećavat za 1 i provjeravat jeli prost sve dok ne nađemo n prostih brojeva.

8

Page 9: C++ Seminarski Rad Igor Dosen

2. Načiniti program za C++-u za nalaženje 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. Načiniti program u C++-u za pronalaženje svih prostih brojeva između 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;

9

Page 10: C++ Seminarski Rad Igor Dosen

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. Načiniti program u C++-u za ručno množenje dva višecifrena 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

Page 11: C++ Seminarski Rad Igor Dosen

{

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

Page 12: C++ Seminarski Rad Igor Dosen

cout << endl;

system("PAUSE");

return 0;

}

5. Načiniti program za točno dijeljenje dva višecifrena broja na zadan broj decimala.

( Sugestija oponašati ručno 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. Načiniti program na C++-u za izračunavanje 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

Page 13: C++ Seminarski Rad Igor Dosen

{

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. Načiniti program na C++-u za nalaženje 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

Page 14: C++ Seminarski Rad Igor Dosen

8. Načiniti 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. Načiniti program na C++-u za konvertiranje binarnog broja u dekadni ( cijeli,racionalni).

#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

Page 15: C++ Seminarski Rad Igor Dosen

10. Načiniti program na C++-u za nalaženje savršenih 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

Page 16: C++ Seminarski Rad Igor Dosen

11. Načiniti program na C++-u za nalaženje 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. Načiniti 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

Page 17: C++ Seminarski Rad Igor Dosen

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

Page 18: C++ Seminarski Rad Igor Dosen

Numerički zadaci

1. Načiniti program na C++-u za nalaženje nule funkcije zadate funkcije jedne nezavisno promjenjive metodom sečice, u zadatom intervalu a,b u kome se nalazi jedinstvena nula i to sa traženom točnošću sa kojom se nula nalazi.

Posebni podaci: donja granica intervala a=1, gornja granica intervala b=5 i tražena točnost 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. Načiniti program na C++-u za nalaženje nule funkcije zadate funkcije jedne nezavisno promjenjive metodom polovljenja intervala, u zadatom intervalu a,b u kome se nalazi jedinstvena nula i to sa traženom točnošću sa kojom se nula nalazi.

Posebni podaci: donja granica intervala a=1, gornja granica intervala b=5, i tražena točnost 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

Page 19: C++ Seminarski Rad Igor Dosen

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

Page 20: C++ Seminarski Rad Igor Dosen

3. Načiniti program na C++-u za rješavanje kvadratne jednadžbe.

#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. Načiniti program na C++-u za nalaženje mašinske 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

Page 21: C++ Seminarski Rad Igor Dosen

5. Načiniti program na C++-u za izračunavanje najvećeg interger-a i real-a koji se mogu smjestiti u računalu.

#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. Načiniti program na C++-u za nalaženje 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

Page 22: C++ Seminarski Rad Igor Dosen

7. Načiniti program na C++-u za utvrđivanje koji je to najveći prirodan broj čiji se faktorijel može predstaviti u računalu 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. Načiniti program na C++-u za rješavanje sistema linearnih jednadžbi 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

Page 23: C++ Seminarski Rad Igor Dosen

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

Page 24: C++ Seminarski Rad Igor Dosen

}

}

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

Page 25: C++ Seminarski Rad Igor Dosen

Razni zadaci

1. Načiniti program na C++-u za unapređivanje vremena nalaženja n-tog Fibonačijevog broja korištenjem 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

Page 26: C++ Seminarski Rad Igor Dosen

Zadaci sa polinomima

1. Načiniti program na C++-u za nalaženje 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. Načiniti program na C++-u za nalaženje 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. Načiniti program na C++-u za nalaženje 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. Načiniti program na C++-u za nalaženje količnika dva zadata polinoma P(x) i Q(x),stepena m i n, retrospektivno.

Posebni podaci:m=4, n=3,

P(x)=

Q(x)=

5. Načiniti program na C++-u za nalaženje izvoda funkcije y=f(x) zadate u formi polinoma stepena n.

Posebni podaci:n=5, y=f(x)=

6. Načiniti program na C++-u za nalaženje k-tog izvoda polinoma stepena n.

Posebni podaci: n=3,k=1,P(x)=

7. Načiniti program na C++-u za nalaženje integrala polinoma stepena n.

Posebni podaci: n=2,P(x)=

8. Načiniti program na C++-u za nalaženje vrijednosti polinoma stepena n u datoj točki x.

( Sugestija: isprogramirati Heronov obrazac ).

Posebni podaci: n=4,x=1, P(x)=

Rješenje 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,znači napisat ćemo funkciju poly::integrate() { ... opis sto ta funkcija radi ... }. tu možeš primijetiti ovo 'poly::' to ti označava da metoda integrate() pripada klasi poly. Znaci ovo gledaš kao funkciju koja pripada(agregirana je)

26

Page 27: C++ Seminarski Rad Igor Dosen

nekome(tj.) nečemu, u ovom slučaju klasi poly. E i dok tako fino agregiraš sve funkcije u jednu klasu, znaci imaš jedan veliki nacrt kuće, onda odeš u main funkciju i kažeš tamo u main funkciji ajd im ti izgradu 'kuću' prema tom nacrtu koji sam definirao i to u mainu ti izgleda ovako:

poly varijab( n );

E sad tu znaci 'poly' označava tip podataka, 'varijab' ti označava varijablu (handle sa kojim radiš) i ovaj n u zagradama označava stupanj polinoma (jer smo tako definirali u nacrtu klase poly).Sad kad si definirao svoj polinom 'varijab', nad njim možeš zgodno radit neke operacije koje smo definirali unutar klase, npr:

varijab.integrate( );

U ovom slučaju ce varijab polinom biti integriran, drugim riječima objekt varijab ce pozvat onu funkciju poly::integrate( ) i izvršit algoritam integriranja. Također u klasi imaš overloadane operatore(+, -, *, /)..sto to znaci? Pa pošto smo definirali svoju klasu, za nju želimo i definirat neke operacije koje nam služe za rad sa polinomom npr, ako definiraš dva polinoma, npr:

poly p1;

poly p2;

overloadani operatori(zapravo poseban tip funkcije unutar klase) znače da možemo jednostavno napravit zbrajanje, oduzimanje, množenje, 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

Page 28: C++ Seminarski Rad Igor Dosen

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

Page 29: C++ Seminarski Rad Igor Dosen

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

Page 30: C++ Seminarski Rad Igor Dosen

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

Page 31: C++ Seminarski Rad Igor Dosen

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

Page 32: C++ Seminarski Rad Igor Dosen

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

Page 33: C++ Seminarski Rad Igor Dosen

}

}

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

Page 34: C++ Seminarski Rad Igor Dosen

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

Page 35: C++ Seminarski Rad Igor Dosen

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

else

{

*this=poly::demP(1); //demote each term

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

{

data[i]=data[i]*(i+1); //divide each term by old index

}

}

return *this;

}

poly poly::integrate()

35

Page 36: C++ Seminarski Rad Igor Dosen

{

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

Page 37: C++ Seminarski Rad Igor Dosen

}

// 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

Page 38: C++ Seminarski Rad Igor Dosen

// 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

Page 39: C++ Seminarski Rad Igor Dosen

// 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