W3 Podstawowe pojęcia

We wcześniejszej lekcji napisaliśmy 6 programów będących implementacją algorytmu Euklidesa wyliczającego największy wspólny dzielnik. Co to jest algorytm? Mówiąc opisowo jest to sposób rozwiązania jakiegoś zadania. Bądźmy jednak bardziej drobiazgowi i przedstawy bardziej naukową definicję:

Algorytm to skończony, uporządkowany ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego zadania.

Aby jeszcze lepiej zrozumieć istotę algorytmów przanalizujmy przepis kulinarny który może być przykładem algorytmu. Oto przepis na jedną z moich ulubionych potraw czyli Placki ziemniaczane:

Placki ziemniaczane - składniki
6 dużych ziemniaków
1-2 jajka
3-4 łyżki mąki
sól
pieprz
olej

sposób przygotowania

  1. Ziemniaki umyć, obrać.
  2. Zetrzeć na tarce (małe lub duże otwory, jak lubimy).
  3. Wymieszać z mąką, jajkiem, solą i pieprzem.
  4. Rozgrzać patelnię z olejem.
  5. Placuszki smażyć z obu stron.
  6. Potem na talerz.

Jak widzimy przepis jest skończony - kiedyś w końcu zjemy pierwszego usmażonego placka. Poszczególne etapy są uporządkowane. Nieprzestrzeganie porządku zakończyłoby się powstaniem całkiem nieokreślonej potrawy najprawdobodobniej niejadalnej (tak wiem, student wszystko zje ;)). Jest jeszcze jedna analogia pomiędzy przepisem kulinarnym a algorytmem. Algorytm przetwarza jakieś dane wejściowe w dane wyjściowe. Składniki na placki (mąka, jajka, ziemniaki) są pięknie zamieniane na ciepłe, pyszne placki ziemniaczane.
Skoro już wiemy czym jest algorytm spróbujmy zdefiniować pojęcie programu:

Program to algorytm zapisany w języku komputerowym.

Wydaje się logiczne. Ale czym jest Język komputerowy?

Język komputerowy to język z określoną notacją i regułami rozumiany przez komputer.

Czyli w przeciwieństwie do języków naturalnych takich jak polski czy francuski, języki komputerowe są zrozumiałe dla maszyny. Komputer nie potrafi zrobić placków ziemniaczanych, ponieważ nie rozumie języka w którym przepis został zanotowany. Językami omawianymi w tym kursie są C, LISP, Java, PHP, Python i Ruby. Ważne jest, aby zrozumeć, że te języki mają ściśle określoną składnię (jaka kombinacja słów kluczowych i symboli jest dopuszczalna?) i semantykę (co oznaczają wyrażenia dopuszczalne przez składnię?)
Ostatnim pojęciem omawianym w dzisiejszym mocno teoretycznym odcinku jest programowanie:

Programowanie to proces układania programów dla komputerów.

Ten kurs ma Cię nauczyć właśnie programowania czyli pisania programów. Powinieneś pamiętać że ten proces najogólniej mówiąc składa się z dwóch etapów:

  • Etap projektowania(układanie algorytmu)
  • Etap implementacji(tłumaczenie algorytmu na język programowania)

Zaniedbanie pierwszego etapu jest częstym błędem początkujących programistów, czego efektem są bądź nie działające programy, badź programy kiepskiej jakości.
Przedstawmy na przykładzie algorytmu Euklidesa jak powinien wyglądać proces programowania
Najpierw wymyślamy algorytm

dopóki b ≠ 0 wykonuj
  wylicz resztę z dzielenia a przez b i podstaw ją pod a
  zamień a z b

Następnie wymyślony algorytm kodujemy w wybranym języku dla przykładu Python:

def nwd(a,b):
   while b != 0:
      a = a % b
      a, b = b, a
   return a

Zadanie
Zastanowić się nad innymi przykładami algorytmów.

W2 Sześć języków, jeden algorytm.

Zaczynamy od rzucenia Cię na głęboką wodę. Poniżej zaprezentowane są funkcje obliczające największy wspólny dzielnik (NWD) dwóch liczb naturalnych. Każda funkcja napisana jest w innym języku. Jeśli nie rozumiesz poniższych przykładów kodu, to bardzo dobrze - ten rozdział ma cię jedynie oswoić z różnymi językami programowania. Nie musisz rozumieć poszczególnych instrukcji, ważne abyś zauważył ogólne różnice i podobieństwa pomiędzy Lispem, Pythonem, Javą, C, PHP i Rubim.

C

   int nwd(int a, int b) {
      int temp;
      while(b != 0) {
         temp = a % b;
         a = b;
         b = temp;
      }
      return a;
   }

LISP

(defun nwd (a b)
(loop
  (if (= b 0) (return a)
    (prog1
      (setq a (mod a b))
      (setq temp a)
      (setq a b)
      (setq b temp)
    )
    )
)

Java

class Arytmetyka {
   static int nwd(int a, int b) {
      int temp;
      while (b!=0) {
         temp = a % b;
         a = b;
         b = temp;
      }
      return a;
   }
}

PHP

   function nwd($a, $b) {
      while ($b) {
         $temp = $a % $b;
         $a = $b;
         $b = $temp;
      }
      return $a;
   }

Python

def nwd(a,b):
   while b != 0:
      a = a % b
      a, b = b, a
   return a

Ruby

def nwd(a, b)
  while b != 0
     a = a.modulo(b)
     a, b = b, a
  end
  return a
end

W1 Nauka programowania - czyli 6 języków w 6 miesięcy

Programowanie to sztuka czy rzemiosło? To odwieczne pytanie na które próbowało lub wciąż próbuje odpowiedzieć wielu ludzi zajmujących się zawodowo informatyką. Trudno jednoznacznie odpowiedzieć na to pytanie. Najlepszą odpowiedzią wydaje się być: “Pisanie programu to po części sztuka, po części natomiast rzemiosło, a procentowa zawartość tych składników zależy od indywidualnego przysposobienia twórcy oprogramowania”. Nie da się ukryć że umiejętność pisania dobrych programów jest w dzisiejszym świecie niezwykle cenna. Wiele wskazuje na to, że w przyszłości najlepsi programiści będą celebrities na miarę dzisiejszych gwiazd kina i sportu. Dlatego już dziś powinieneś zacząć uczyć się programować. Pierwszy krok uczyniłeś zaglądając na tą stronę ;)

Wiele istniejących w sieci kursów, umożliwia nauczenie się tylko jednego, kontretnego języka. Tymczasem nie ma powodu zawężać się do jednego języka - ryzykujemy wtedy zagubienie się w składni, podczas gdy fudamentalne koncepcje w programowaniu zostają potraktowane po macoszemu. Dlatego poniższy kurs będzie oparty na sześciu wybranych językach programowania aby nauczyć Cię sztuki programowania a nie używania konkretnego języka. Oto ich wybór:

  1. C
  2. Java
  3. Lisp
  4. PHP
  5. Python
  6. Ruby

Wybór oczywiście jest subiektywny. Chciałem aby treścią kursu były języki ważne w dzisiejszym świecie programowania, czyli te które warto z różnych powodów znać. Jakkolwiek, kwestia popularności nie jest jedynym kryterium ich selekcji. Przykładowo Lisp nie jest najpopularniejszym językiem, jednak został włączony do kursu ze względu na odmienność do języków wywodzących się z C.

Oczywiście nie gwarantuje Ci, że po ukończeniu kursu będziesz guru programowania w powyżych językach. Będziesz mogł natomiast powiedzieć, że znasz ich podstawy, a jak wiadomo reszta to sprawa praktyki. Do dzieła zatem.