Professional Documents
Culture Documents
C Seminarski Rad Igor Dosen
C Seminarski Rad Igor Dosen
Predmet
Vii programski jezici i RAD alati programiranje u C++
Predmetni nastavnik
Prof. dr Zoran . Avramovi, dipl.in.elek.
Student
Zadaci sa matricama
1.
#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.
#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.
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.
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;
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
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;
}
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;
}
13
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
15
16
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
19
20
21
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;
}
28
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
30
//inverts
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
34
data[i]=0;
}
int poly::checkZero()
{
if ((size==1)&&(data[0]==0))
return 1;
return 0;
}
poly poly::normalise()
{
int i;
poly::clean();
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)
poly::zero();
//return zero
*this=poly::demP(1);
else
{
for (i=0;i<size;i++)
{
data[i]=data[i]*(i+1);
}
}
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();
if (poly::checkZero()==1)
cout<<0;
if (data[size-1]!=0)
cout<<data[size-1];
if (size>1)
{
if (data[i]!=0)
{
if (data[i]>0)
cout<<"+";
cout<<data[i];
if (i!=0)
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