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