Strona główna » Kursy » Kurs C# » Własne funkcje
 

Własne funkcje

Wstęp

W programowaniu funkcja jest to zestaw instrukcji, który przeprowadza pewne obliczenia. Na koniec może zostać zwrócona konkretna wartość, którą można wykorzystać w dalszej części programu, ale są też przypadki, gdy nic nie zwracają.

Definicja

Deklaracja funkcji zawiera informacje dotyczące tego co funkcja zwraca, jak się nazywa oraz jakie przyjmuje argumenty (oraz poziom jej dostępności o czym będzie w dalszej części kursu). Oto ogólny szkielet zapisu własnej funkcji:

  1. static zwracany_typ nazwa(lista_argumentow) {
  2.   // ciało funkcji
  3. }

Słowo static pozwala na wywołanie funkcji z głównej funkcji Main(). Dalej należy zapisać zwracany typ np. int, nazwę - jest dowolona (ale nie należy zaczynać od cyfr i innych znaków specjalnych), potem w nawiasach okrągłych podaje się liste argumentów tj. pary typ, nazwa zmiennej rozdzielone znakiem przecinka. Funkcje, które zwracają wartość powinny się kończyć instrukcją return, która powinna zwrócić jakąś wartość.

Procedury

Procedura

Najprostszym typem funkcji jest procedura. Wtedy nie jest zwracana jakakolwiek wartość, ale wciąż można przekazać jakiś argument. Przedstawiona poniżej funkcja wypisze na ekranie tekst.

  1. static void Cześć() {
  2.   Console.WriteLine("Cześć!");
  3. }

Funkcja Cześć() nic nie zwraca, ponieważ zwracanym typem jest void i z tego powodu nie musi zawierać instrukcji return. Procedura nie przyjmuje żadnych argumentów - lista jest pusta. Cała funkcja składa się z jednej instrukcji wypisania tekstu. W celu wywołania funkcji wystarczy w dowolnym miejscu w programie wpisać:

  1. Cześć();

Procedura z argumentem

Załóżmy, że tym razem chcemy napisać funkcję Wyświetl(), która pozwoli na wyświetlanie liczby. W tym celu należałoby dodać do listy argumentów funkcji argument. Zmienne zadeklarowane w funkcji Main() nie są widoczne dla innych funkcji!

  1. static void Wyświetl(int b) {
  2.   Console.WriteLine("Przekazano {0}", b);
  3. }

Funkcja Wyświetl() nie zwraca nic, ale akceptuje jeden argument do którego będzie można się odwołać przez nazwę b. Jedyna instrukcja (2.) wypisuje na ekran jaka wartość została przekazana.

Tym razem w celu wywołania tej funkcji należy w nawiasach okrągłych podać odpowiednie argumenty, ale przekazywany typ musi się zgadzać. Spójrzmy jeszcze raz na funkcję - oczekiwanym argumentem jest tutaj liczba całkowita, więc wartość takiego typu należy przekazać. Jednym ze sposobów jest przekazanie wcześniej zadeklarowanej zmiennej:

  1. int a = 7;
  2. Wyświetl(a);

Istnieje oczywiście możliwość, aby przekazywać wartości do funkcji bezpośrednio:

  1. Wyświetl(3);

Wywołując dwa poprzednie przykłady wywołania na konsoli zostanie wyświetlone:

  1. Przekazano 7
  2. Przekazano 3

Instrukcja return

Chociaż procedury nic nie zwracają to można w nich użyć instrukcji return. W funkcji oznaczałoby to przerwanie i zwrócenie wartości, a w tym przypadku tylko przerwanie. Można to zastosować do napisania procedury, która wyświetla tylko liczby parzyste.

  1. static void TylkoParzyste(int a) {
  2.   if (a % 2 == 1)
  3.     return;
  4.   Console.Write("{0} ", a);
  5. }

(2.) Na początku procedura sprawdza parzystość przekazanego argumentu a i jeśli jest nieparzysty to (3.) procedura kończy działanie, a jeśli jest parzysta to (4.) wartość zostaje wypisana.

Najlepszym sposobem na sprawdzenie działania funkcji jest wypisanie liczb parzystych z pewnego przedziału. Tutaj warto zastosować do tego celu pętle, aby uniknąć pisania dziesięć razy tej samej instrukcji:

  1. for (int i = 1; i <= 10; i++)
  2.   TylkoParzyste(i);

Na konsole zostanie wypisane:

  1. 2 4 6 8 10

Funkcje z argumentem

Suma

Istnieje możliwość napisania procedury, która przyjmie dwa argumenty, a potem wypisze ich sumę ale tego typu rozwiązanie byłoby niewygodne jeśli później tej wartości chcemy użyć. Po zakończeniu działania funkcji wynik byłby niedostępny. Z tego powodu zdecydowanie lepszym pomysłem jest napisanie funkcji, która zwróci sumę podanych liczb, a potem wypisze jej wartość inną funkcją (albo procedurą).

  1. static int Suma(int a, int b) {
  2.   int s = a + b;
  3.   return s;
  4. }

(1.) Funkcja Suma() zwraca liczbę całkowitą oraz przyjmuje dwa argumenty a i b będące liczbą całkowitą. Przekazane liczby są (2.) sumowane, a potem (3.) suma zostaje zwrócona. Przekazaną wartość trzeba teraz odczytać tam gdzie funkcja zostanie wywołana.

Napiszmy teraz przykładową funkcję Main(), która wywoła funkcję Suma() i zapisze jej wynik, aby go potem wyświetlić.

  1. int a = 3;
  2. int b = 5;
  3. int wynik = Suma(a, b);
  4. Console.WriteLine("{0} + {1} = {2}", a, b, wynik);

(2. - 3.) Przypisujemy zmiennym jakieś wartości, a potem (4.) wywołujemy funkcję i odczytujemy zwrócony wynik. Od tej pory (5.) zmienna wynik przechowuje wartość zwróconą przez funkcję Suma().

Podsumowanie

Funkcje znacząco ułatwiają pisanie. Potrafą zastąpić ten sam fragment kodu w wielu miejscach. Warto z nich korzystać, aby uzyskać prosty i przejrzysty kod. Warto pamiętać, że pisanie funkcji, która robi to samo co inna funkcja (np. wbudowana) jest niepotrzebne i niepotrzebnie zmeniejsza efektywność programu.

Zadania

Zadanie 1

a

Napisz procedurę Wyświetl(), która wyświetli na ekran dwukrotność przekazanej liczby rzeczywistej. Przykładowo dla liczby 8.1 wynikiem powinno być:

  1. 16.2

b

Napisz funkcję Mnóż(), która pomnoży pierwszy argument przez drugi i zwróci jego wartość. Funkcja powinna akceptować liczby rzeczywiste.

Przykładowo dla a = 3,14 i b = 2 wynikiem powinno być:

  1. 6.28

c

Napisz funkcję testującą, która wczyta od użytkownika dwie liczby rzeczywiste a i b, a następnie na ekran zostanie wypisany wynik 6·a·b. W funkcji testującej nie wolno korzystać z operacji matematycznych.

Przykładowo dla a = 4,1 i b = 1 wynikiem powinno być:

  1. 6*4,1*1 = 24,6