Top Banner
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.
48

Seminarski Rad c++ Ognjen Kostic

Nov 29, 2015

Download

Documents

Ognjen Kostic
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Seminarski Rad c++ Ognjen Kostic

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.

StudentOgnjen Kostić, student

Index br. 032- 08/ RIT

Banja Luka, septembar 2013.

Page 2: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

Sadržaj

1. Zadaci sa matricama-----------------------------------------------------3

2. Zadaci sa brojevima------------------------------------------------------9

3. Numerički zadaci--------------------------------------------------------19

4. Razni zadaci--------------------------------------------------------------26

5. Zadaci sa polinomima--------------------------------------------------27

6. Literatura-----------------------------------------------------------------41

Panevropski univerzitet APEIRON Page 2

Page 3: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

1. 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;

Panevropski univerzitet APEIRON Page 3

Page 4: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

case 3:

cout << "det(A) = " << ruleOfSaruss(matrix) << endl;

break;

}

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] << " ";

}

Panevropski univerzitet APEIRON Page 4

Page 5: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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;

}

Panevropski univerzitet APEIRON Page 5

Page 6: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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

Panevropski univerzitet APEIRON Page 6

Page 7: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

}

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;

}

}

Panevropski univerzitet APEIRON Page 7

Page 8: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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;

}

Panevropski univerzitet APEIRON Page 8

Page 9: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

2. 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.

Panevropski univerzitet APEIRON Page 9

Page 10: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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;

Panevropski univerzitet APEIRON Page 10

Page 11: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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

Panevropski univerzitet APEIRON Page 11

Page 12: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

}

else return ( x );

}

public:

static int multiply_int( int x, int y )

{

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;

}

};

Panevropski univerzitet APEIRON Page 12

Page 13: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

int main()

{

int num1, num2;

cout << "n: "; cin >> num1;

cout << "m: "; cin >> num2;

cout << "n * m = " << math::multiply_int(num1, num2);

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 )

{

Panevropski univerzitet APEIRON Page 13

Page 14: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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

{

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;

Panevropski univerzitet APEIRON Page 14

Page 15: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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

cout << "m: "; cin >> m;

cout << "NZD(" << n << "," << m << ") = " << nzd(n, m) << endl;

return 0;

}

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 )

Panevropski univerzitet APEIRON Page 15

Page 16: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

{

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;

}

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;

}

Panevropski univerzitet APEIRON Page 16

Page 17: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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 )

{

Panevropski univerzitet APEIRON Page 17

Page 18: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

V[ i ].push_back( 1 );

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;

}

Panevropski univerzitet APEIRON Page 18

Page 19: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

3. 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 )

{

Panevropski univerzitet APEIRON Page 19

Page 20: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

return ( x * x * x ) + ( 6 * x * x ) + ( 12 * x ) + 8;

}

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;

}

Panevropski univerzitet APEIRON Page 20

Page 21: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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;

Panevropski univerzitet APEIRON Page 21

Page 22: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

}

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;

}

Panevropski univerzitet APEIRON Page 22

Page 23: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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)

Panevropski univerzitet APEIRON Page 23

Page 24: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

{

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++) {

Panevropski univerzitet APEIRON Page 24

Page 25: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

tempi = ab[k][i];

ab[k][i] = ab[bigindex][i];

ab[bigindex][i] = tempi;

}

}

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;

Panevropski univerzitet APEIRON Page 25

Page 26: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

4. 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;

}

Panevropski univerzitet APEIRON Page 26

Page 27: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

5. 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

Panevropski univerzitet APEIRON Page 27

Page 28: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

ć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) 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 znači '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);

}

}

Panevropski univerzitet APEIRON Page 28

Page 29: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

poly::poly(int inSize, double values[])

{

int i;

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

{

Panevropski univerzitet APEIRON Page 29

Page 30: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

delete[] data;

}

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

{

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

Panevropski univerzitet APEIRON Page 30

Page 31: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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

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)

{

Panevropski univerzitet APEIRON Page 31

Page 32: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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

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;

}

Panevropski univerzitet APEIRON Page 32

Page 33: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

poly poly::operator-(const poly &p)

{

poly ans;

ans = p;

- ans; //inverts

ans = ans + *this;

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

{

Panevropski univerzitet APEIRON Page 33

Page 34: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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

}

}

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;

Panevropski univerzitet APEIRON Page 34

Page 35: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

}

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

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

Panevropski univerzitet APEIRON Page 35

Page 36: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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

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;

Panevropski univerzitet APEIRON Page 36

Page 37: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

}

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

{

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;

Panevropski univerzitet APEIRON Page 37

Page 38: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

}

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

}

}

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

Panevropski univerzitet APEIRON Page 38

Page 39: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

{

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;

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

Panevropski univerzitet APEIRON Page 39

Page 40: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

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

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

Panevropski univerzitet APEIRON Page 40

Page 41: Seminarski Rad c++ Ognjen Kostic

Riješeni primjeri C++

}

6. Literatura

Predavanja prof. dr Zoran Ž. Avramovića

Zbirka zadataka iz C++, Mr Vesna Popović, Prof. dr Igor Đurović

Panevropski univerzitet APEIRON Page 41