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;
cout << "Podaj potege\n"; cin >> n;
cout << "Podaj potege\n"; cin >> 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 a, b, n;
int a, 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żywając pętli for ani while.
używając pętli for ani while.
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 (int i=0; i<10; i++)
for (int i=0; i<10; 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;
cout << "Podaj liczbe\n";
cout << "Podaj liczbe\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>
using namespace std;
int *podwoj(int a);
int main()
{
int *podwoj(int a)
{
int *w;
w=&a;
*w=a*2;
return 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;
}
return w;
}
Zwracanie wskaźników przez funkcje
int *podwoj(int a)
{
int *w=new int;
*w=a*2;
int *podwoj(int a)
{
static int b=a;
int *w;
*w=a*2;
return w;
}
int *w;
w=&b;
*w=b*2;
return w;
}
Przekazywanie tablic do funkcji
#include<iostream>
using namespace std;
void podwoj(int a[][2]);
void wypisz(int a[][2]);
int main()
{
void podwoj(int a[][2])
{
for (int i=0; i<2; i++)
{
for (int j=0; j<2; j++)
a[i][j]*=2;
}
wypisz(a);
}
{
int tab[][2]={1,2,3,4};
wypisz(tab);
podwoj(tab);
wypisz(tab);
system("pause");
return 0;
}
}
void wypisz(int a[][2])
{
for (int i=0; i<2; i++)
{
for (int j=0; j<2; j++)
cout << a[i][j] << "\t";
cout << endl;
}
cout << endl;
}
Zadanie 2
Napisać funkcję zwracającą ślad
macierzy, np.
4
3
2
1
34
16
11
6
1
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
=
+
+
+
=
tr
Odbieranie tablic od funkcji
#include<iostream>
using namespace std;
int *tworz(int a, int n);
int main()
{
int a, b, n, *wsk;
cout << "Podaj poczatek i koniec\n";
int *tworz(int a, int n)
{
int *w;
w=new int[n];
for (int i=0; i<n; i++)
*(w+i)=a+i;
cout << "Podaj poczatek i koniec\n";
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;
}
return w;
}
Odbieranie tablic 2-D od funkcji
#include<iostream>
using namespace std;
int **tworz(int n);
int main()
{
int **t, n;
cout << "Podaj rozmiar
macierzy\n";
int **tworz(int n)
{
int **wsk=new int*[n];
for (int i=0; i<n; i++)
wsk[i]=new int[n];
for (int i=0; i<n; i++)
macierzy\n";
cin >> n;
t=tworz(n);
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
cout << *(*(t+i)+j) << "\t";
cout << endl;
}
system("pause");
return 0;
}
{
for (int j=0; j<n; j++)
wsk[i][j]=i*n+j;
}
return wsk;
}
Zadanie 3
Napisać funkcję zwracającą macierz
transponowaną, np.
=
9
6
3
8
5
2
7
4
1
9
8
7
6
5
4
3
2
1
T
Wskaźniki do funkcji
#include<iostream>
using namespace std;
int podwoj(int a);
int potroj(int a);
int main()
{
int podwoj(int a)
{
return (a*2);
}
int potroj(int a)
{
return (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;
}
return (a*3);
}
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;
double (*wsk[4])(double, double)={dod, ode, mno, dzi};
double (*wsk[4])(double, double)={dod, ode, mno, dzi};
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 jest wskaźnikiem
do
a jest wskaźnikiem
do
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 jest funkcją wywoływaną bez argumentów
,
a jest funkcją wywoływaną bez argumentó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 jest wskaźnikiem
do
a jest wskaźnikiem
do
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[])
{
cout<<"Dostalem parametrow: "<<a<<endl<<endl;
cout<<"Dostalem parametrow: "<<a<<endl<<endl;
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
zostać wykonane, np.
zostać wykonane, np.
program 2 3 +
2 + 3 = 5