Java - Myśleć jak programista
Z Wikibooks, biblioteki wolnych podręczników.
Autor: Allen B. Downey
Tutuł oryginału - How to Think Like a Computer Scientist, Java Version, 4th Edition
Treść oryginału dostępna jest pod adresem http://www.greenteapress.com/thinkapjava/ .
Niniejszy tekst jest tłumaczeniem powyższej pozycji. Jeżeli chciałabyś (chciałbyś) wspomóc proces tłumaczenia, twój czas i zaangażowanie są bardzo mile widziane. Zapoznaj się z oryginalnym tekstem, skoncentruj się na którymś z rozdziałów i zacznij tłumaczyć. Wszelkie przetłumaczone akapity umieść tutaj w odpowiednim rozdziale, tak aby ktoś inny nie tłumaczył po raz drugi tego, co raz już zostało przez Ciebie przetłumaczone.
Przedmowa
Dlaczego napisałem tę książkę
To jest czwarta edycja książki, którą rozpocząłem pisać w 1999 roku, kiedy uczyłem w Colby College. Uczyłem początkującą klasę informatyczną języka programowania Java. Nie znalazłem jednak podręcznika, który by mnie uszczęśliwił. Z jednej strony, istniejące podręczniki były zbyt obszerne! Nie było możliwości, by moi studenci przeczytali 800 stron gęstego, technicznego materiału, nawet gdybym tego od nich oczekiwał. I nie oczekiwałem. Większość materiałów było zbyt szczegółowych - o języku Java i jego bibliotekach. Wszystko to mogłoby się okazać nieaktualne pod koniec semestru. Wszystko to przesłaniało także materiał, który faktycznie chciałem moim studentom przekazać.
Innym problemem, z którym się spotkałem, było to, że wstęp do programowania zorientowanego obiektowo był zbyt gwałtowny. Wielu studentów, którzy do tej pory radzili sobie bardzo dobrze, rozkładali ręce, gdy dochodzili do obiektów.
[...]
[edytuj] Droga do programowania
Podstawowym celem tej książki jest nauczenie ciebie myślenia jak programista. Osobiście lubię sposób, w jaki myślą programiści, ponieważ łączą w sobie to co najlepsze w matematykach, inżynierach i naukowcach. Podobnie do matematyków programiści używają specyficznych języków w celu zapisania pomysłów (w szczególności dotyczących obliczeń). Podobnie do inżynierów, projektują układy łączące się w systemy, ewoluujące w kierunku doskonalszych rozwiązań. Podobnie do naukowców, obserwują zachowanie skomplikowanych systemów, formułują hipotezy, oraz testują je doświadczalnie.
Najważniejszą umiejętnością programisty jest rozwiązywanie problemów. Mówiąc to mam na myśli zdolność do formułowania problemów, kreatywnego myślenia na temat rozwiązania oraz zrozumiałego i właściwego wyrażania rozwiązania problemu. Dzięki temu nauka programowania jest wspaniałą okazją do ćwiczenia umiejętności rozwiązywania problemów. Dlatego właśnie nazwałem ten rozdział "Droga do programowania".
[...]
[edytuj] Czym jest język programowania?
Język programowania, którego będziesz się właśnie uczyć to Java. Jest to relatywnie nowy język (Sun wydał jego pierszą wersję w maju 1995 roku). Java jest przykładem języka programowania wysokiego poziomu. Inne języki wysokiego poziomu, o których mogłeś słyszeć to Pascal, C, C++ jak również FORTRAN.
Jak zapewne domyślasz się po nazwie "język wysokiego poziomu", istnieją również języki niskiego poziomu, czasami zwane językami maszynowymi lub asemblerami. Mówiąc najprościej, komputery potrafią bezpośrednio wykonywać wyłącznie programy napisane w języku niskiego poziomu. Dlatego programy napisane w języku wysokiego poziomu muszą zostać przetłumaczone na język niskiego poziomu zanim zostaną wykonane przez komputer. To tłumaczenie zajmuje nieco czasu, co jest pewną niedogodnością języków wysokiego poziomu.
Jednak ich zalet jest znacznie więcej. Po pierwsze, o wiele prościej jest pisać programy w języku wysokiego poziomu. Mówiąc "prościej" mam na myśli to, iż znacznie mniej czasu potrzeba, by program napisać. Jest on krótszy i bardziej czytelny, ponadto znacznie łatwiej wyszukiwać w nim błedy i wprowadzać poprawki. Po drugie, programy napisane w językach wysokiego poziomu są znacznie bardziej przenośne, tzn. można je uruchamiać na wielu rodzajach komputerów praktycznie bez potrzeby wprowadzania dodatkowych modyfikacji. Programy napisane w języku niskiego poziomu mogą być uruchamiane wyłącznie na platformie, na którą zostały napisane. W celu uruchomienia programu na innej platformie należałoby taki program przepisać od podstaw.
Ze względu na powyższe zalety, praktycznie wszystkie programy pisane są w językach wysokiego poziomu. Języki niskiego poziomu używane są w nielicznych specjalizowanych aplikacjach.
Istnieją dwie drogi przetłumaczenia programu napisanego w języku wysokiego poziomu do języka niskiego poziomu tak, by mógł być uruchomiony na komputerze: interpretacja oraz kompilacja. Interpreter to program odczytujący i jednocześnie wykonujący zawartość programu w języku wysokiego poziomu wiersz po wierszu.
Kompilator to program, który odczytuje i tłumaczy zawartość programu wysokiego poziomu w całości przed wykonaniem jakiejkolwiek komendy tego programu. Często kompilacja programu przebiega jako osobny krok. Skompilowany kod uruchamiany jest później. W tej sytuacji program napisany w języku wysokiego poziomu nazywamy kodem źródłowym, natomiast całkowicie przetłumaczony program - kodem obiektowym lub plikiem wykonywalnym.
Jako przykład proponuję ci napisać program w języku C. Być może użyjesz w tym celu edytora tekstu (edytor tekstu to uproszczony procesor tekstu). Kiedy program będzie skończony, zapiszesz go w pliku program.c, gdzie słowo program jest nazwą nadaną przez ciebie, natomiast końcówka .c jest, zgodnie z umową, rozszerzeniem nazwy pliku informującą, że plik zawiera kod źródłowy napisany w języku C.
Potem, w zależności od ulubionego środowiska programistycznego, opuścisz edytor tekstu i uruchomisz kompilator. Kompilator odczyta kod źródłowy twojego programu, przetłumaczy go i utworzy nowy plik o nazwie program.o (dla kodu obiektowego) lub program.exe (dla pliku wykonywalnego).
Język Java jest pod tym względem wyjątkowy, gdyż jest językiem zarówno kompilowanym jak i interpretowanym. Zamiast tłumaczyć programy w Javie do języka maszynowego, kompilator Javy generuje kod bajtowy Javy. Kod bajtowy jest prosty (i szybki) w interpretacji, zupełnie jak kod maszynowy. Jednocześnie jest równie przenośny jak języki wysokiego poziomu. Dzięki temu możliwa jest kompilacja programu w Javie na jednym komputerze, przesłanie kodu bajtowego do innego komputera przez sieć komputerową, oraz interpretacja kodu bajtowego przez inny komputer. Jest to zaletą języka Java, której nie posiadają inne języki wysokiego poziomu.
Choć powyższy proces może wydawać się skomplikowany, w większości środowisk programistycznych (czasem zwanych środowiskami rozwojowymi), te kroki zostały zautomatyzowane dla użytkownika. Zazwyczaj będziesz musiał tylko napisać program i nacisnąć przycisk (lub wydać pojedynczą komendę) by skompilować i uruchomić swój program. Z drugiej strony, dobrze jest znać wszystkie etapy zautomatyzowanego procesu, tak aby w sytuacji, gdy coś pójdzie nie po naszej myśli, móc zorientować się, gdzie leży przyczyna.
[edytuj] Czym jest program?
[edytuj] Co to jest debugowanie?
[edytuj] Języki formalne i naturalne
[edytuj] Pierwszy program
Tradycyjnie, pierwszym programem jaki piszą ludzie w nowym języku jest "Hello, World.". Ponieważ wszystko co ma zrobić taki program, to wyświetlić napis "Hello, World.". W języku Java program ten wygląda tak:
class Hello { // main: generate some simple output public static void main (String[] args) { System.out.println ("Witaj świecie."); } }
[...]
Wszystkie programy tworzone są za pomocą klas, które mają postać:
class NAZWAKLASY { public static void main (String[] argumenty) { KOD } }
[edytuj] Pojęcia
brak
[edytuj] Ćwiczenia
[edytuj] Zmienne i typy
[edytuj] Więcej napisów
Jak wspomniałem w poprzednim rozdziale, w main możesz umieścić tyle instrukcji ile chcesz. Na przykład aby wypisać więcej niż jedną linię:
class Hello { // main: generuje proste napisy public static void main (String[] arg) { System.out.println ("Witaj świecie."); // wyświetla pierwszą linię System.out.println ("Jak się czujesz?"); // wyświetla drugą linię } }
Jak widać, można umieszczać komentarze na końcu linii jak i samodzielnie.
Frazy, które pojawiły się w cudzysłowach są nazywane stringami ponieważ są sekwencją (ang. łańcuchem) liter. W zasadzie stringi mogą zawierać dowolną kombinację liter, liczb, znaków interpunkcyjnych i innych znaków specjalnych.
println jest skrótem od "print line" (wypisz linię), ponieważ po każdej linii dodaje specjalny znak zwany newline, który powoduje, że kursor przesuwa się do następnej linii. Następnym razem, kiedy zostanie wywołany println nowy tekst pojawi się w następnej linii.
Często wygodniej jest, aby wynik wielu instrukcji 'wypisz' znalazł się w jednej linii. Można to osiągnąć używając komendy print.
class Hello { // main: generuje proste napisy public static void main (String[] args) { System.out.print ("Żegnaj, "); System.out.println ("okrutny świecie!"); } }
W tym wypadku wynik pojawi się w pojedynczej linii: Żegnaj, okrutny świecie!. Zauważ, że pomiędzy słowem "Żegnaj" i drugim cudzysłowem znalazła się spacja. Ta spacja pojawi się na wyjściu (w wyniku), a więc wpływa na zachowanie programu.
Spacje, które znalazły się poza cudzysłowami nie wpływają na zachowanie programu. Na przykład, mogłem napisać:
class Hello { // main: generuje proste napisy public static void main (String[] args) { System.out.print ("Żegnaj, "); System.out.println ("okrutny świecie!"); } } class Hello { public static void main (String[] args){ System.out.print ("Żegnaj, "); System.out.println("okrutny świecie!"); } }
To również by zadziałało, jednak pewnie zauważyłeś, że program staje się trudniejszy do przeczytania. Nowe linie i spacje są przydatne do organizacji twojego programu wizualnie, sprawiając, że będzie łatwiejszy do przeczytania i łatwiej będzie w nim można znaleźć błędy składniowe.
[edytuj] Zmienne
Jedna z najbardziej potężnych możliwości języka programowania to możliwość manipulowania zmiennymi. Zmienna jest nazwanym miejscem które przechowuje wartość. Wartości są rzeczami, które mogą być wypisane lub przechowane i (jak zobaczymy później) możemy na nich operować. Napisy, które wypisywaliśmy ("Witaj, świecie.", "Żegnaj, ", etc.) są wartościami.
Aby przechować wartość musisz stworzyć zmienną. Jako, że wartości, które chcemy przechowywać to napisy, zadeklarujemy, że nowa zmienna będzie napisem:
String fred;
Ta instrukcja jest deklaracją, ponieważ deklaruje, że zmienna o nazwie fred jest typu String. Każda zmienna ma typ, który określa jakiego rodzaju wartości może przechowywać. Na przykład, int może przechowywać liczby całkowite i pewnie nie jest zaskoczeniem, że String może przechowywać napisy.
Pewnie zauważyłeś, że niektóre typy zaczynają się wielką literą a niektóre małą. Później nauczymy się znaczenia tej różnicy ale narazie warto to dobrze zapamiętać. Nie istnieją takie typy jak Int czy string i kompilator zaprotestuje jeśli spróbujesz ich użyć.
Aby stworzyć zmienną będącą liczbą całkowitą należy napisać int bob; gdzie bob to nadana przez ciebie nazwa tej zmiennej. Generalnie będziesz chciał nadawać zmiennym takie nazwy, które odzwierciedlają to co chcesz z nimi robić. Na przykład, jeśli zobaczysz takie deklaracje zmiennych:
String imie; String nazwisko; int godzina, minuta;
pewnie będziesz mógł zgadnąć jakie wartości są w nich przechowywane. To pokazuje także składnię deklaracji wielu zmiennych o takim samym typie: godzina i minuta są liczbami całkowitymi (typ int).
[edytuj] Przypisywanie wartości zmiennym
przypisywać można na 2 sposoby:
1. Przy tworzeniu zmiennej
int mysz = 25;
2. Po utworzeniu zmiennej
int mysz; mysz=25;
[edytuj] Wyświetlanie wartości zmiennych
Możesz wyświetlić wartość zmiennej posługując się poleceniami użytymi już przez nas do wyświetlania stringów.
class Hello{ public static void main(String[] args){ String piewszaLinia; pierwszaLinia=”Witaj ponownie!”; System.out.println(pierwszaLinia); } }
Powyższy program tworzy zmienną o nazwie pierwszaLinia, przypisuje jej wartość „Witaj ponownie!” a następnie wyświetla tą wartość. Gdy mówimy o „wyświetlaniu zmiennej”, mamy na myśli wyświetlanie wartości zmiennej. Aby wyświetlić nazwę zmiennej, musisz umieścić ją w cudzysłowie. Dla przykładu: System.out.println(„pierwszaLinia”); Gdybyśmy zechcieli dalej pójść tym torem, moglibyśmy napisać
pierwszaLinia = "Witaj ponownie!"; System.out.print ("Wartością pierwszaLinia jest "); System.out.println (pierwszaLinia);
Wynikiem tego programu jest: Wartością pierwszaLinia jest Witaj ponownie!
Należy nadmienić, że składnia polecenia wyświetlającego wartość zmiennej jest taka sama bez względu na jej typ.
int godzina, minuta; godzina = 11; minuta = 59; System.out.print ("Obecny czas to "); System.out.print (godzina); System.out.print (":"); System.out.print (minuta); System.out.println (".");
Wynikiem tego programu jest: Obecny czas to 11:59.
UWAGA: To ćwiczenie pokazuje jak wyświetlić wiele wartości w tej samej linii za pomocą kilku poleceń, poprzedzających println. Powinieneś pamiętać o dodaniu println na końcu. W wielu środowiskach wynik wyświetlania jest przechowywany bez wyświetlania dopóki nie zostanie wywołane polecenie println kiedy to wyświetlana jest od razu cała linia. Gdybyś pominąć println, program może się zakończyć bez wyświetlenia wyniku!
[edytuj] Słowa kluczowe
Kilka sekcji temu, powiedziałem, że możesz nazwać swą zmienną jak chcesz, lecz nie jest to do końca prawdą. Istnieją pewne słowa zarezerwowane przez Javę, ponieważ są one używane przez kompilator podczas analizy struktury twojego programu i jeśli ich użyjesz, jako nazw zmiennych spowoduje to zamieszanie. Słowa te, zwane słowami kluczowymi to: include, public, class, void, int i wiele innych. Pełna lista dostępna jest pod [1]. Strona ta, prowadzona przez firmę Sun, zawiera dokumentację, do której będę odwoływał się w tej książce.
Zamiast zapamiętywania listy słów kluczowych, sugerowałbym ci skorzystanie jednego z wielu środowisk programistycznych dla języka Java, oferujących możliwość podświetlania kodu. Podczas pisania różne części kodu programu podświetlane są różnymi kolorami. Dla przykładu, słowa kluczowe mogą być wyświetlane na niebiesko, ciągi znakowe na czerwono a reszta kodu czarna. Uważaj, jeśli wpiszesz nazwę zmiennej a ona podświetli się na niebiesko, bo możesz spodziewać się dziwnego zachowania kompilatora.
