Programowanie proceduralne

Ćwiczenie 4

Funkcje

Łukasz Sztangret

Katedra Informatyki Stosowanej i Modelowania

Funkcje

#include<iostream>

using namespace std;

int potega(int li, int st);

int main()

{

int a, b, n;

cout << "Podaj liczbe\n"; cin >> a; co

c ut

u

t << "P

" o

P daj pote

t g

e e\

e n

\ "

n ;

"

; ci

c n

i

n >> n;

n

b=potega(a,n);

cout << a << " ^ " << n << " = " << b << endl; system("pause");

return 0;

}

int potega(int li, int st)

{

int wyn=li;

for (int i=2; i<=st; i++)

wyn*=li;

return wyn;

}

Argumenty domniemane

#include<iostream>

using namespace std;

int potega(int li, int st=2);

int main()

{

int

t a

,

a b

,

b n;

cout << "Podaj liczbe\n"; cin >> a; cout << "Podaj potege\n"; cin >> n; b=potega(a,n);

cout << a << " ^ " << n << " = " << b << endl; b=potega(a);

cout << a << " ^ 2 = " << b << endl; system("pause");

return 0;

}

// definicja funkcji potega jak na poprzednim slajdzie

Zadanie 1

Napisać funkcję liczącą silnię nie uŜ

u y

Ŝ waj

a ą

j c

c pę

p tli f

or

o

ani

n whi

h le.

Przesyłanie argumentów przez referencje

#include<iostream>

using namespace std;

void podwoj(int a, int &c); int main()

{

int a=1, b=10;

cout << "a = " << a << "\tb = " << b << endl; podwoj(a,b);

cout << "a = " << a << "\tb = " << b << endl; system("pause");

return 0;

}

void podwoj(int a, int &c)

{

cout << "\ta = " << a << "\tc = " << c << endl; a*=2;

c*=2;

cout << "\ta = " << a << "\tc = " << c << endl;

}

Zmienne statyczne

#include<iostream>

using namespace std;

void licznik();

int main()

{

for

o

r (

i

( nt

t i=0;

0

; i<10

1 ;

0

; i++)

licznik();

system("pause");

return 0;

}

void licznik()

{

static int ile=0;

ile++;

cout << ile << endl;

}

Wskaźniki w argumentach funkcji

#include<iostream>

using namespace std;

void podwoj(int *wsk);

int main()

{

int a;

co

c ut

u

t << "P

" o

P daj li

l c

i z

c be\

e n

\ "

n ;

"

cin >> a;

cout << "\na = " << a << endl; podwoj(&a);

cout << "a = " << a << endl; system("pause");

return 0;

}

void podwoj(int *wsk)

{

*wsk*=2;

}

Zwracanie wskaźników przez funkcje

#include<iostream>

int *podwoj(int a)

using namespace std;

{

int *w;

int *podwoj(int a);

w=&a;

int main()

*w=a*2;

{

re

r t

e u

t rn

r w

;

int a, *wsk;

cout << "Podaj liczbe\n";

}

cin >> a;

wsk=podwoj(a);

cout << "\na = " << a << endl; cout << "*wsk = " << *wsk << endl; system("pause");

return 0;

}

Zwracanie wskaźników przez funkcje int *podwoj(int a)

int *podwoj(int a)

{

{

int *w=new int;

static int b=a;

*w

* =a*2

* ;

2

int

n *

w

* ;

return w;

w=&b;

}

*w=b*2;

return w;

}

Przekazywanie tablic do funkcji

#include<iostream>

void podwoj(int a[][2])

using namespace std;

{

for (int i=0; i<2; i++)

{

void podwoj(int a[][2]);

for (int j=0; j<2; j++)

void wypisz(int a[][2]);

a[i][j]*=2;

}

int main()

wypisz(a);

{

}

int tab[][2]={1,2,3,4}; void wypisz(int a[][2]) wypisz(tab);

{

for (int i=0; i<2; i++)

podwoj(tab);

{

wypisz(tab);

for (int j=0; j<2; j++)

system("pause");

cout << a[i][j] << "\t"; cout << endl;

return 0;

}

}

cout << endl;

}

Zadanie 2

Napisać funkcję zwracającą ślad macierzy, np.

  1

2

3

4  









 5

6

7

8 





tr

 = 1 + 6 + 11 +16 = 34

 9 10 11 12





 

 

 1

 3 14 15 16 

Odbieranie tablic od funkcji

#include<iostream>

int *tworz(int a, int n)

using namespace std;

{

int *tworz(int a, int n);

int *w;

int main()

w=new int[n];

{

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

int a, b, n, *wsk;

*(w+i)=a+i;

co

c ut

u

t << "P

" o

P daj pocz

c ate

t k

e i

i koni

n e

i c

e \

c n

\ "

n ;

"

return w;

cin >> a >> b;

n=b-a+1;

}

wsk=tworz(a,n);

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

cout << *(wsk+i) << endl; system("pause");

return 0;

}

Odbieranie tablic 2-D od funkcji

#include<iostream>

int **tworz(int n)

using namespace std;

{

int **tworz(int n);

int **wsk=new int*[n];

int main()

{

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

int **t, n;

wsk[i]=new int[n];

cout << "Podaj rozmiar for (int i=0; i<n; i++)

ma

m ci

c e

i r

e zy\n

\ "

n ;

"

{

cin >> n;

t=tworz(n);

for (int j=0; j<n; j++)

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

wsk[i][j]=i*n+j;

{

}

for (int j=0; j<n; j++)

return wsk;

cout << *(*(t+i)+j) << "\t";

}

cout << endl;

}

system("pause");

return 0;

}

Zadanie 3

Napisać funkcję zwracającą macierz transponowaną, np.



T

1

2

3

1 4 7









4

5

6

=





2 5 8









7 8 9

3 6 9

Wskaźniki do funkcji

#include<iostream>

int podwoj(int a)

using namespace std;

{

return (a*2);

int podwoj(int a);

}

int potroj(int a);

int potroj(int a)

int main()

{

{

ret

e u

t r

u n

n (a

( *3);

)

int a, (*fun)(int a);

}

a=10;

fun=podwoj;

cout << (*fun)(a) << endl; fun=potroj;

cout << (*fun)(a) << endl; system("pause");

return 0;

}

Zadanie 4

Wprowadzić z klawiatury długość odcinka, następnie w zaleŜności od wyboru policzyć: pole kwadratu, pole koła lub pole trójkąta równobocznego (trzy róŜne funkcje) stosując wskaźniki do funkcji, np.

Podaj dlugosc

UWAGA!

3

Wywołanie funcji

1). Pole kwadratu

powinno wyglądać:

2). Pole kola

cin >> wybor;

3). Pole trojkata

pole=(*wsk[wybor-1])(bok);

1

Pole wynosi: 9

Wskaźnik do funkcji jako argument innej funkcji

#include<iostream>

using namespace std;

double dod (double a, double b){return (a+b);}

double ode (double a, double b){return (a-b);}

double mno (double a, double b){return (a*b);}

double dzi (double a, double b){return (a/b);}

void wprowadz(double (*wsk)(double, double)); int main()

{

int wybor;

do

d ub

u l

b e

e (*

( ws

w k

s [4

[ ])

] (

) d

( o

d ub

u l

b e,

e

, do

d ub

u l

b e)

e =

) {

= do

d d,

d

, ode

d ,

e

, mn

m o

n ,

, dz

d i

z };

cout << "Wybierz dzialanie\n"; cout << "1.Dodawanie\n2.Odejmowanie\n"; cout << "3.Mnozenie\n4.Dzielenie\n"; cin >> wybor;

wprowadz(*wsk[wybor-1]);

system("pause");

return 0;

}

void wprowadz(double (*wsk)(double, double))

{

double a, b;

cout << "Podaj dwie liczby\n"; cin >> a >> b;

cout << "Wynik = " << (*wsk)(a,b) << endl;

}

Co to jest a???

int *(*(*a)(int))[10];

Co to jest a???

int *(*(*a)(int))[10];

a

a j

es

e t

s w

sk

s a

k ź

a n

ź iki

k em

e

do

o

funkcji wywoływanej z parametrem typu int, zwracającej wskaźnik do

10-cio elementowej tablicy

wskaźników do typu int.

Co to jest a???

int (*(*a())[10])();

Co to jest a???

int (*(*a())[10])();

a

a j

es

e t

s f

u

f nkc

k j

c ą

ą wyw

y oł

o y

ł w

y an

a ą

ą bez

e

z ar

a g

r umen

e tów

ó ,

w

zwracającą wskaźnik do

10-cio elementowej tablicy

wskaźników do

funkcji wywoływanej bez parametrów zwracającej wartość typu int.

Co to jest a???

float (*(*a)(int))(double);

Co to jest a???

float (*(*a)(int))(double);

a j

es

e t

s

t wsk

s a

k źn

ź ik

i i

k e

i m

e

do

d

o

funkcji wywoływanej z parametrem typu int, zwracającej wskaźnik do

funkcji wywoływanej z parametrem typu double, zwracającej wartość typu float.

Co to jest a???

double (*(*(*a)())[10])();

Co to jest a???

double (*(*(*a)())[10])();

a jest wskaźnikiem do

funkcji wywoływanej bez parametrów, zwracającej wskaźnik do

10-cio elementowej tablicy

wskaźników do

funkcji wywoływanych bez parametrów, zwracających wartość typu double.

Argumenty z linii wywołania programu

#include<iostream>

using namespace std;

int main(int a, char *b[])

{

co

c u

o t<<"D

" o

D s

o t

s al

a e

l m

e

m p

a

p r

a a

r m

a e

m t

e ro

r w

o : "

<<a<

a <en

e dl

d <

l <en

e d

n l

d ;

l

for (int i=0; i<a; i++)

cout<<i<<" parametr to\t"<<b[i]<<endl; system("pause");

return 0;

}

Argumenty z linii wywołania programu

#include<iostream>

#include<stdlib.h>

using namespace std;

int main(int a, char *b[])

{

if (!(a-3))

{

cout<<b[1]<<"+"<<b[2]<<"="; cout<<atof(b[1])+atof(b[2])<<endl;

}

system("pause");

return 0;

}

Zadanie 5

Napisać program przyjmujący z linii wywołania programu dwie liczby oraz znak działania (+ -) jakie ma

zo

z s

o t

s ać

ć wykon

o a

n ne

n , np

n .

p

program 2 3 +

2 + 3 = 5