Szkielet programu
W niniejszej lekcji powiemy sobie o budowie samego programu oraz o pewnych regułach, których należy się trzymać pisząc program. Podstawową rzeczą każdego programu napisanego w C++ jest funkcja główna Funkcja ta zawsze nosi nazwę main. To w niej znajdują się wszystkie instrukcje, jakie program ma wykonać. Jest to trzon każdego programu. O funkcjach powiemy sobie bardziej szczegółowo kiedy indziej. Jednak na razie wiedz, że każdy program musi posiadać wspomnianą funkcję. Jej budowa może nieco różnić się w zależności od rodzaju aplikacji, lecz ogólne zasady są jednakowe. Looknij sobie.
1 2 3 4 5 6 7 |
main() { // treść programu } |
To jest najprostsza wersja. Stosujemy ją w przypadku, gdy program nie pobiera żadnych parametrów uruchomieniowych. Myślę, że każdy przynajmniej w niewielkim stopniu orientuje się w DOS’ie i potrafi odpalić program z linii poleceń. Jednak dla zupełnych nowicjuszy mała wskazówka:
1. Uruchom wierz poleceń klikając na >> start >> uruchom
2. Ukazało się okienko z polem textowym – wpisz >> notepad c:\autoexec.bat
Powinien uruchomić się program notatnik i automatycznie załadować plik autoexec.bat [zakładam, że dysk C: jest dyskiem, na którym masz zainstalowany system z serii Windows’opodobny /czytaj shit/ 🙂 ]. Jeśli kiedykolwiek zechcesz mieć w swoim programie taki 'bajer’ to wystarczy napisać tak:
1 2 3 4 5 6 7 |
main(int argc, char* argv[]) { // treść programu } |
Tym razem nasz program jest zdolny pobierać argumenty z linii wywołania. Pierwszym jest liczba owych argumentów, drugi zaś to właśnie nasze argumenty. Oczywiście to tylko takie skrótowe wyjaśnienie, gdyż funkcjami zajmiemy się szerzej w innej lekcji. Teraz powiemy sobie, jak w większości powinna wyglądać zawartość naszej funkcji głównej lub, mówiąc prościej jakie są główne elementy programu.
1. Inicjalizacja
2. Pętla główna
3. Zwolnienie zasobów
inicjalizacja
Pod pojęciem inicjalizacji [nie mylić z inicjacją!!] należy rozumieć utworzenie głównego interface’u programu, rezerwację potrzebnej pamięci, czy odczyt ustawień programu z pliku, rejestru, zdalnego servera. Ogólnie wszelkie czynności, które są niezbędne do rozpoczęcia właściwej pracy programu. Nie należy jednak bezgranicznie ufać, iż wszystkie czynności przygotowawczych wykonają się za każdym razem, bądź wykonają się prawidłowo. Przykładowo może braknąć pamięci [chociaż w obecnych czasach jest to raczej nikłe zagrożenie]. Wówczas dalsza praca raczej jest niemożliwa. Bardziej prawdopodobna, niechciana sytuacja to brak pliku z ustawieniami programu. Co wtedy? Można skorzystać z ustawień domyślnych. Jednak co w sytuacji, gdy najzupełniej program nie da rady wystartować bez tych danych? Wówczas mamy problem – ale przecież problemy, a raczej ich rozwiązywanie to nasza pasja 🙂 Należy taką ewentualność przewidzieć wcześniej i przygotować się na nią, Jeśli jednak sytuacja jest bez wyjścia, no cóż :-/ przynajmniej poinformować użytkownika o tym fakcie i zakończyć program, pamiętając także o zwolnieniu wszelkich zasobów, które program zarezerwował! Przyjmijmy jednak, że wszystko poszło pomyślnie, program jest gotowy do pracy i możemy zacząć działać – rozpoczynamy pętlę główną…
pętla główna
Samo słowo 'pętla’ jest znane chyba każdemu. Dla przykładu weźmy zabawkę znaną myślę wszystkim z dzieciństwa – kolejkę elektryczną. Puszczamy ją w ruch, a ona jedzie, jedzie, jedzie… i po chwili znajduje się na miejscu startu i znów jedzie, jedzie.. i ponownie przemierza całą drogę, aby dojechać do miejsca rozpoczęcia wycieczki. Sytuacja może trwać w nieskończoność, a my się cieszymy, bo dzieciak nie zawraca nam głowy 😉 Dokładnie tak samo działa pętla w odniesieniu do programowania. Wpadamy w jakiś fragment kodu, wykonujemy go [tzn. procesor to czyni] po czym wracamy do miejsca startu i tak w kółko, praktycznie w nieskończoność. Praktycznie, bo przecież kiedyś trzeba będzie zakończyć program i musimy to umożliwić. Zatem uzależniamy taką pętlę od pewnego warunku. Mówiąc jaśniej informujemy komputer, że zawartość pętli ma się wykonywać powiedzmy do momentu wciśnięcia jakiegoś klawisza. No i teraz już mamy z górki. Gdy użytkownik wciśnie załóżmy escape przerywamy pętlę główną. Możemy jeszcze dla pewności zapytać go o potwierdzenie zakończenia. Jeśli program operuje na plikach możemy spytać o zachowanie zmian itp. Możliwości jest jak zwykle sporo. Użytkownik potwierdził chęć zakończenia aplikacji, więc.. kończymy. Ale, ale, nie tak szybko! Przecież nie zostawimy po sobie bałaganu, gdyż jesteśmy profesjonalistami, prawda? 🙂 Musimy zatem posprzątać po sobie, czyli – zwolnić przydzielone zasoby..
zwolnienie zasobów
Tutaj sprawa jest już prosta. Zwalniamy wszelkie przydzielone przez program zasoby. Oczywiście tyczy się to programów, w których sami, świadomie rezerwujemy pamięć w sposób dynamiczny [o tym powiemy sobie dokładniej przy innej okazji]. Jednak należy pamiętać, że zwalnianie zasobów odbywa się zawsze w kolejności odwrotnej niż kolejność przydzielenia ich. Dlaczego tak jest? Pomyśl! Tworzymy obiekt A, ten skolei tworzy obiekt B, który zaś powołuje do życia obiekt C. Jeśli teraz zwolnimy obiekt A to tym samym stracimy możliwość dostępu do obiektu B, o C już nie wspominając. Rozumiesz w czym rzecz? Należy wówczas zacząć od końca i tragedii nie będzie. Wiem, że na razie to brzmi nieco sztucznie i jałowo ale wierz mi, jak przeczytasz o klasach i zapoznasz się ze wskaźnikami to wszystko stanie się jasne i klarowne. Po prostu nauczenie kogoś programowania od zupełnych podstaw ma jeden dość znaczący mankament – nie można się zbytnio do niczego odnieść, jedynie jakieś analogie z życia. Może faktycznie początki są ciężkie [???] 😉
Tak pokrótce wyjaśniliśmy sobie, jakie są elementy programu. Chciałbym jeszcze krótko nadmienić, iż wspomniane przeze mnie etapy mogą nieco się różnić w zależności od rodzaju aplikacji. Wiadomo inaczej pracują programy użytkowe – np. edytory textu, grafiki etc. jeszcze inaczej anty-viry, a już całkiem inaczej aplikacje multimedialne, czy gry! Przedstawiony schemat jest jedynie ogólnym przybliżeniem. Co prawda w samym C++ raczej ciężko byłoby stworzyć porządną grę, ale jak połączy się go z bibliotekami OpenGL, bądź DirectX to… można nieźle poszaleć 😀 [nie chcę tutaj nic obiecywać, ale być może kiedyś powstanie jakiś dział o DX, ale powtarzam – to nie jest na 100%!]. Dobra, zapoznaliśmy się już z budową programu, teraz przejdźmy do sposobu rozmieszczania kodu programu w pliku.
zasady wprowadzania kodu
Zacznę od małej porady. Chyba każdy wie, jak ważna jest podczas programowania umiejętność szybkiego pisania na klawiszach. Większość ludzi korzysta z tzw. dwupalcówki [proszę bez skojarzeń 🙂 ], co nie jest najlepsze. Jeżeli nie potrafisz jeszcze biegle pisać na klawiaturze, a myślisz poważnie o programowaniu to radzę, żebyś się tego nauczył. Pisanie wszystkimi dziesięcioma palcami znacznie przyspiesza powstawanie programu. Zobaczysz, trud włożony w naukę pisania szybko się opłaci. To tyle ględzenia o sposobach klepania. Przejdźmy do ciekawszych rzeczy.
Pisząc kod pamiętaj, że C++ posiada tzw. wolny format zapisu :-/ Oznacza to, że nie ma ściśle określonych zasad rozmieszczania kodu. Praktycznie każda instrukcja może być zapisana w jednej linii lub rozbita na kilka wierszy. Oczywiście są przypadki, gdy nie wolno tego zrobić, ale są one intuicyjnie wyczuwalne i raczej ciężko jest popełnić błąd. Zobaczmy to na przykładzie wspomnianej funkcji main. Powyższą funkcję można zapisać na wiele sposobów.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
main() { } main() { } main() { } |
Wszystkie zapisy są jak najbardziej legalne. Osobiście radzę wybrać sobie jeden ze sposobów, bo jest to najwygodniejsze. Podczas kompilacji wszystkie białe znaki są ignorowane. Stąd właśnie taka swoboda. Jeśli nie znasz jeszcze żadnego języka programowania to zapewne wydało Ci się to oczywiste. Jednak istnieją języki, w których takie manipulacje są zabronione. Przykładowo jedna instrukcja przypada na jeden wiersz. I nie ma zmiłuj się 🙂 Ta cecha wyróżnia C++ na tle innych języków. Jest jeszcze jedna ważna rzecz. Skoro każda instrukcja może być rozdzielona na kilka wierszy to należy jakoś poinformować kompilator, gdzie jest koniec. Sam przecież się nie domyśli 🙂 Prosta sprawa. Zakończenie instrukcji trzeba oznaczyć średnikiem. Oczywiście są też wyjątki, jak choćby funkcje, gdzie ten zakres jest określony przez klamry. W kodzie przedstawia się to następująco.
1 2 3 4 5 |
instrukcja pierwsza; instrukcja druga; instrukcja trzecia; |
Powyższe instrukcje można zapisać również tak:
1 2 3 |
instrukcja pierwsza; instrukcja druga; instrukcja trzecia; |
Lub w jednej linii:
1 |
instrukcja pierwsza;instrukcja druga;instrukcja trzecia; |
Jak powiedziałem wcześniej kompilatorowi jest wszystko jedno jaki sposób wybierzesz. Ze względów estetycznych umieszcza się każdą instrukcję w oddzielnym wierszu, co również jest przydatne w późniejszej analizie. To chyba wszystko. Dalej wyjaśnię, czym są komentarze.
komentarze
Podczas pisania programu często zachodzi potrzeba, aby część kodu była opatrzona kilkoma słowami opisu. Wpisanie objaśnienia w zwykły sposób oczywiście nie ma racji bytu. Co więc robić? 😮 Jest rozwiązanie. Należy zastosować komentarz :-> Komentarz to dowolny tekst poprzedzony przynajmniej dwoma znaczkami slash [//]. Wszystko, co znajduje się po za slashami jest pomijane podczas kompilacji. Tak więc możesz tam umieścić żywnie co tylko chcesz. Pamiętaj jednak, że komentarz obowiązuje jedynie w linii, w której go rozpocząłeś. W praktyce wygląda to tak:
1 2 3 4 |
//tekst komentarza - tutaj możesz napisać wszystko uwaga!!: tutaj komentarz już nie obowiązuje!! |
Chyba każdy złapał 🙂 Czasem jednak zdarza się, że komentarz jest bardziej obszerny i zajmuje kilka lub kilkanaście wierszy. Taki komentarz można wprowadzić dwojako. Pierwszy sposób już znasz. Dopiero co go poznałeś. Drugi sposób jest znacznie wygodniejszy. Tym razem posłużymy się dwoma slashami i dwiema gwiazdkami [*]. Jak się zrymowało 🙂 Co tu dużo gadać. Spójrz na przykład:
1 2 3 4 5 6 7 |
/*początek komentarza - pierwszy wiersz drugi wiersz trzeci wiersz i czwarty wiersz kończący :(*/ |
Wszelkie znaki i słowa objęte znacznikami /* i */ nie będą brały udziału w kompilacji.
Stosowanie komentarzy oczywiście nie jest obowiązkowe. Tylko od programisty zależy, czy będzie z nich korzystał, czy też nie. Pomimo, iż komentarze nie są niezbędne warto o nich czasem pamiętać i stosować. Niekiedy nawet linijka wyjaśnienia może być bardzo pomocna. Zwłaszcza jeśli po kilkumiesięcznej przerwie chcesz zmodyfikować program. Wierz mi bez komentarzy jest choler.. [ekhm naprawdę ciężko 🙂 ]. Jednakże pamięta, aby rozmieszczać je z rozwagą! Wstawianie ich jak leci też nie jest odpowiednie. Po prostu samemu zdecyduj i jeśli coś jest tak skomplikowane, że sam się w tym gubisz [a przecież samemu to napisałeś] to komentarze są jak najbardziej wskazane. W przypadku prostych instrukcji można sobie odpuścić. Jeśli będziesz tak postępował i wyrobisz w sobie taki nawyk to na pewno nie pożałujesz!
Autor: Kesay
[Artykuł pochodzi ze strony guidecpp.prv.pl, autor wyraził zgodę na publikację]