Tablice jako argumenty funkcji
W języku C++ tablica jest traktowana specjalnie. Nigdy nie jest przekazywana do funkcji przez wartość. Zawsze do funkcji przekazywany jest adres pierwszego elementu tablicy. Oznacza to, że zmiany wykonane wewnątrz wywołanej funkcji nie dotyczą lokalnej kopii, ale tablicy będącej argumentem aktualnym.
C++ automatycznie przekazuje tablice do funkcji przez referencję, w związku z tym funkcja może modyfikować elementy tablicy bezpośrednio.
W wywołaniu funkcji podajemy jako argument tylko nazwę tablicy np. t
Przykład 1. Drukowanie tablicy jest realizowane w funkcji drukuj(). Rozmiar tablicy jest przypisany stałej MAX. Jest to stała, która jest zadeklarowana na zewnątrz funkcji, po to aby była rozpoznawana w całym programie.
#include <stdio.h>
const int MAX=5;
void drukuj(int t[]) {
for(int i=0;i<MAX;i++)
cout<<”element tablicy o indeksie:”<<i<<”jest równy:”<<t[i];
}
int main() {
int t[MAX];
for(int i=0;i<MAX;++i)
t[i]=i;
drukuj(t);
return 0;
}
Przykład 2. Zerowanie elementów tablicy w funkcji czysc(). Rozmiar tablicy podany jest w postaci dodatkowego argumentu.
void czysc(int t[], int l_elementow)
{
for(int i=0;i<l_elementow;++i) t[i]=0;
}
int main() {
int tab1[10];
int tab2[20];
czysc(tab1,10); //wypełni zerami całą tablicę tab1
czysc(tab2,15); //wypełni zerami pierwsze 15 elementów
tab2
return(0);
}}
Funkcje rekurencyjne
Funkcje rekurencyjne są to funkcje wywołujące same siebie.Jedną z takich funkcji rekurencyjnych jest funkcja obliczająca silnię z liczby. Definicja silni wygląda następująco:
0 != 1;
n != (n-1)!*n;
Rozpisując ten wzór, można zauważyć, że silnia to iloczyn kolejnych liczb mniejszych od tej liczby i tej liczby czyli 3!=1*2*3.
Więc funkcja licząca silnię danej liczby może wyglądać następująco:
Aby sprawdzić,jak funkcja działa, wywołujemy ją w programie:
#include <iostream>
using namespace std;
int silnia(int n)
{
if(n == 0) return 1;
return silnia(n-1)*n;
}
int main()
{
int a;
cin >> a;
cout << silnia(a) << endl;
return 0;
}
Przykładowe wyniki to:
0 != 1;
1 != 1;
2 != 2;
3 != 6;
4 != 24;
10 != 3628800
Przeciążanie funkcji
C++ pozwala na przeciążanie nazw funkcji. Polega to na tym, że kilka funkcji
może jednocześnie mieć taką samą nazwę. Funkcje te muszą różnić się przyjmowanymi
argumentami, tak aby kompilator mógł wybrać odpowiednią funkcję gdy zostanie
ona wywołana:
int dodaj(int a, int b)
{
return a+b;
}
double dodaj(double a, double b)
{
return a+b;
}
int main()
{
dodaj(5,4); // dodaj(int,int)
dodaj(5.0,4); // dodaj(double,double)
return 0;
}
Przeładowania funkcji stosujemy gdy funkcje posiadaja wspólną cechę,( np. mają wypisywać coś na ekran) a mają działać na różnych obiektach (np. na zmiennych czy tablicach).
Zadania
Utwórz funkcję, która
wypełnia tablicę n-elementową (n - argument funkcji)wartościami wprowadzonymi z klawiatury
wyświetla tablicę w sposób: element tablicy o indeksie … wynosi…
sumuje elelmenty dwóch tablic o tym samym rozmiarze
do każdego parzystego elementu tablicy dodaje 2, do ujemnego dodaje -2
szuka elementu, zadanego jako argument ,w tablicy
szuka elementu maksymalnego w tablicy
szuka elementu minimalnego w tablicy
znajduje indeks pierwszego ujemnego elementu w tablicy, jeśli nie ma takiego to zwraca wartość -1
sortuje tablice(porządkuje w sposób rosnący) - sortowanie Bąbelkowe
oblicza dla liczby rzeczywistej wartość jej potegi przy warunku:
a0 = 1 an = a*…*a=an-1*a |
liczy „rozszerzoną silnię”, działając w ten sposób, że dla liczb naturalnych działa jak zwykłą silnia natomiast dla ujemnych jak w przykładzie (5)!=(-5)*(-4)*(-3)*(-2)*(-1)
liczy sumę cyfr liczby naturalnej