do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
KURS JĘZYKA C++ PODSTAWY
00. Informacje ogólne - wstęp 01. Praca z konsolą - początki - cout 02. Zmienne (int, float, double) 03. Konsola cd. - cin 04. Zmienne tekstowe - (char, string) 05. Operatory 06. Instrukcje warunkowe (if - else, switch - case) 07. Pętle (for, while) 08. Instrukcje warunkowe cd. 09. Break, Continue 10. Funkcje 11. Zakresy ważności 12. Tablice zmiennych 13. Mała powtórka :))) 14. Struct - struktury 15. String, Vector - wstęp do STL 16. Wskaźniki, referencje 16a. Wskaźnik do typów prostych 16b. Wskaźnik do funkcji 16c. Operatory new i delete 16d. Referencje 17. Pliki źródłowe i nagłówkowe Zadania powtórzeniowe 18. Class - klasy 19. Konstruktor , destruktor 20. Argumenty domyślne, przeciążanie (przeładowanie) funkcji i operatorów C++ FAQ: 01. Operacje na plikach, odczyt/zapis02. Nie działa mi polecenie gotoxy() co robić ? 03. Jaki podręcznik do nauki C++ ? ostatnia aktualizacja: 29.08.2005 FUNKCJE
Funkcja - słowo które już kilka razy przewinęło się w naszym kursie, dzisiaj wyjaśniamy jego znaczenie oraz
rozpoczynamy nowy etap w pisaniu naszych programów.
Samo słowo funkcja (function) nie ma dla nas istotnego znaczenia w języku c++ (w przeciwieństwie do np PHP) natomiast znaczenie które ukrywa jest niesamowicie istotne. Co to w ogóle jest funkcja? Najprościej mówiąc jest to kawałek programu który coś robi, wyobraźmy sobie sytuację gdy mamy napisać jakiś program i wiemy z góry, że będzie się on składał z bardzo dużej ilości linii kodu, oczywiście można pisać to ciągiem ale tak utworzony program błyskawicznie stanie się nieczytelny, po prostu się w nim pogubimy, najlepiej byłoby podzielić sobie go na mniejsze kawałki - każdy taki kawałek odpowiada za realizację innej części naszego programu do tego właśnie głównie służą funkcje. Kolejną ich wielką zaletą jest to, że możemy z nich korzystać wiele razy w naszym programie. Na razie jeśli chcieliśmy policzyć np miejsca zerowe funkcji, trzeba cały kod wpisywać (logiczne) a co jeśli w dalszej części programu ponownie chcieliśmy liczyć miejsca zerowe innej funkcji? Znowu trzeba było wpisywać cały odpowiedzialny za te obliczenia kod. W takich przypadkach z pomocą przychodzą nam funkcje, nie dosyć, że kod programu po podzieleniu na mniejsze kawałki staje się bardziej czytelny to jeszcze dobrze przemyślane funkcje mogą nam służyć wielokrotnie. Na początek przyjrzyjmy się temu co tworzy nam kreator Dev-C na początku: Jest to podstawa naszego programu (punkt wyjściowy) ale równocześnie jest to funkcja z możliwości której jak na razie nieświadomie korzystaliśmy. Omówmy budowę struktury funkcji na podstawie funkcji main: int - określa nam jaką wartość zwróci nasza funkcja po zakończeniu swojego działania, w tym przypadku jest to int czyli wartość całkowitoliczbowa, oczywiście dopuszczalne są także inne możliwości np znane nam już float czy double oraz typ void (który zostanie dokładniej omówiony przy objaśnianiu wskaźników) który informuje, że funkcja nie będzie nic zwracała. main - nazwa naszej funkcji, słowo "main" jest zastrzeżone i może w programie wystąpić TYLKO 1 raz, to od funkcji main nasz program rozpoczyna swoje działanie, nazwę funkcji tworzymy podobnie jak nazwy zmiennych. (int argc, char *argv[]) - w nawiasach zaraz po nazwie funkcji występują jej parametry, w tym przypadku pierwszym parametrem jest zmienna typu int (o nazwie argc) , oraz wskaźnik do tablicy typu char (co jak na razie niewiele nam mówi ale wszystko w swoim czasie). { } - "ciało"/treść funkcji jest objęta nawiasami { oraz } , kompilator musi wiedzieć gdzie zaczyna się i gdzie kończy nasza funkcja. return 0; - na początku wspomnieliśmy coś o zwracaniu wartości przez naszą funkcję, to właśnie to , funkcja main w tym przypadku zwraca jako wynik swojego działania liczbę zero. Utwórzmy samodzielnie pierwszą funkcję: Utworzyliśmy pustą (nic nie robiącą funkcję) która nic nie zwraca (od czegoś trzeba zacząć :) ). Jak widać powyżej nowa funkcja w całości została napisana POWYŻEJ funkcji main, czemu? Program który piszemy wykonuje się "od góry do dołu" (oczywiście jest to duże uogólnienie), oczywiście kolejność wykonywania funkcji nie jest z góry zadana, jedynie wiadomo, że main zostanie wykonana jako pierwsza reszta jest na chwilę obecną nieokreślona. Kolejność wykonywania poszczególnych funkcji określa programista pisząc program. Nadal jednak nie mamy wyjaśnienienia czemu właściwie ta nowa funkcja została napisana "u góry". Przy podanym przykładzie właściwie nie ma znaczenia gdzie utworzylibyśmy naszą funkcję nad czy pod funkcją main ponieważ nigdzie do nowo utworzonej funkcji się nie odwołujemy. Lecz co będzie gdy trochę ją rozbudujemy i zechcemy ją wykorzystać ? Jak widać teraz nasza funkcja już coś robi (wyświetla napis) no i oczywiście JEST JUŻ włączona (linia pierwsza_funkcja();), teraz wyjaśnijmy co z tą kolejnością. Przed uruchomieniem programu cała jego treść (kod źródłowy czyli to co piszemy) jest przerabiana na właściwy program, kompilator pobiera od początku do końca po kolei wszystkie linie i sprawdza je w poszukiwaniu błędów a następnie jeśli wszystko jest ok przerabia na wynikowy plik exe (opisany sposób kompilacji jest znacznie uproszczony ale jak na nasze potrzeby na chwilę obecną w zupełności wystarczy). Co by się stało gdybyśmy naszą funkcję (pierwsza_funkcja) utworzyli poniżej funkcji main? Kompilator po linijce "przerabia" sobie nasz program na plik exe oczywiście robi to po kolei od góry do dołu wiec pierwszą rzeczą jaką by napotkał są pliki include - "przerobi" je następnie dociera do main zaczyna "przerabiać" w końcu dociera do linii pierwsza_funkcja(); i wywała błąd! Czemu? No jak to czemu? A skąd on ma wiedzieć co to w ogóle jest? Niestety coś mu podaliśmy ale nie napisaliśmy co to jest i co ma z tym zrobić, więc logicznym jest, że kompilacja się zatrzyma i zobaczymy komunikat o błędzie. Aby wyeliminować tego typu "zaskoczenia" tworzymy nasze funkcje powyżej funkcji main wtedy to nasze funkcje zostaną najpierw "przerobione" kompilator już będzie wiedział co to jest i jak tego używac więc gdy dotrze do funkcji main i naszej "pechowej" linii nie będzie miał już wątpliwości bo w końcu wcześniej miał już dokładny opis co z tym zrobić. Nie jest to jedyny możliwy sposób tworzenia funkcji można cały proces rozbić na dwie części tzn. powyżej funkcji main podać tylko deklarację funkcji a poniżej podać definicję - do tematyki deklaracji i definicji jeszcze powrócimy. Co z parametrami funkcji ? Aby zwiększyć możliwości funkcji można do funkcji przesyłać dodatkowe parametry. Przy tworzeniu funkcji należy podać typ parametru (np int) oraz jego nazwę którą będziemy się posługiwać wewnątrz funkcji. Rozbudowałem naszą funkcję aby pokazać mechanizm parametrów. Przy tworzeniu funkcji w nawiasach dopisałem, że funkcja będzie przyjmowała 3 parametry: 2 int i 1 string, o nazwach i_x, i_y, s_tekst. Wprowadziłem także kilka zmian do samej funkcji teraz nie tylko wyświetla ona dowolny napis ale także obsługuje jego pozycjonowanie na ekranie. Zmianie także uległo samo wywołanie funkcji, skoro funkcja ma przyjmować 3 parametry, przy wywołaniu funkcji trzeba je uwzględnić. Funkcja zwraca wartość?? W pokazanych powyżej przykładach funkcje tworzone były jako typ void wtedy funkcja nie zwraca rezultatu swojego działania. Ale co w przypadku jeśli funkcja nam coś liczy i wynik tych obliczeń będzie potrzebny w innym miejscu programu? przy tworzeniu takich funkcji musimy podać jaki rezultat funkcja ma nam zwracać oraz zadbać o to aby go zwracała: jak widać tworzona funkcja ma przed nazwą podany typ którego oczekujemy jako rezultat jej działania (int) oraz w ciele funkcji jest polecenie return i_delta; które kończy działanie funkcji jednocześnie zwracając jej rezultat. W naszym programie głównym wywołanie funkcji jest dosyć "dziwnie" przedstawione, w sposób który może wzbudzić wątpliwości. No bo właściwie jak to jest że cout ma wyświetlić funkcję? czy co?. Trzeba zastanowić się nad samą ideą zwracania rezultatu działania przez funkcję w tym wypadku jest to liczba typu int więc tak naprawdę ten nasz zapis mówi tylko tyle wyświetl (cout) na ekranie rezultat działania funkcji (liczbę typu int). Na koniec jeszcze kilka słów wyjaśnień JAK to w ogóle działa. Program rozpoczyna swoje działanie od funkcji main i po kolei wykonuje wszystkie podane rozkazy, gdy napotka na wywołanie funkcji, przenosi się do funkcji wykonuje ją, po zakończeniu jej wykonywania powraca do programu głównego kontynuując jego działanie. Oczywiście nic nie stoi na przeszkodzie aby z jednej funkcji wywołać inną funkcję (co zresztą intensywnie wykorzystujemy nawet sobie z tego nie zdając sprawy, bo np czym jest polecenie gotoxy jeśli nie funkcją która przyjmuje 2 parametry typu int? :) ). To chyba tyle podstaw na początek zabawy z funkcjami. 1. Utwórz funkcję która przyjmuje jako parametry 3 liczby float. 2. Rozbuduj ww funkcję: - dodaj do siebie wartości wszystkich trzech parametrów wejściowych - zwróć uzyskaną sumę jako wynik działania funkcji |
|