Czym jest programowanie? Z jednej strony to wiedza jak zmusić „czarną skrzynkę” do zachowania zgodnego z życzeniem programisty. Znajomość jej wnętrza, tego jak działa. Widzieć „tryby” kręcące się w jej wnętrzu i rozumieć te ruchy. Z drugiej strony to znajomość języka w jakim z nami zechce ta skrzynka porozmawiać. Języków jest wiele, wnętrze zaś takiej skrzynki podobne jest do siebie z innymi jej podobnymi. Mało jest dużo różniących się od siebie, zazwyczaj różnice to niuanse. Poznać jedną, to jak poznać wszystkie. A język? Język to słownik pojęć, które dana skrzynka „rozumie” oraz zasad w jaki sposób należy je ze sobą zestawiać. Wiele języków ma podobne cechy, często jednak różnią się bardziej niż początkowo się wydaje. Wchodząc wgłąb dostrzegamy strukturę takiego języka, poznając więcej jak jeden zaczynamy dostrzegać, że coraz mniej są do siebie podobne mimo uprzedniego wrażenia. A jednak są podobne – wszystkie języki stanowią pomost pomiędzy użytkownikiem, a „czarną skrzynką” – jednostką mikroprocesorową wyposażoną w pamięć, interfejsy wejścia/wyjścia, procesor… wszystkie niezależnie jakie w końcu tłumaczą nasze zamiary na wewnętrzny, maszynowy język komputera. Wszystkie są nakładką na jego wewnętrzny język poleceń niezrozumiały, lub wybitnie trudny do zrozumienia dla człowieka. Dlatego są, dla uproszczenia, dla łatwości programowania. Uprzednio praktycznie wszystkie języki były na styku człowiek-maszyna, teraz coraz częściej można wyróżnić kolejną generację języków wysokiego poziomu na styku maszyna-maszyna. Pojawiają się języki wytwarzane przez sztuczną inteligencję służące do programowania sztucznej inteligencji. Postęp nabiera rozpędu.
W zakresie zajęć z Podstaw Programowania poznamy język wysokiego poziomu, ale zanim to nastąpi postaramy się wpierw zrozumieć to co intuicyjnie sami czynimy – sekwencjonowanie czynności od pomysłu do rezultatu. Rozłożymy to co się dzieje w naszych głowach niejako „z automatu” i zapiszemy to w liniach opisu poleceń – napiszemy program, krok po kroku.
Gdy mamy do wykonania jakąś czynność, odruchowo wiemy jak się za nią zabrać. Jeśli jednak mamy zlecić zadanie komuś, to musimy je opisać i ewentualnie wskazać sekwencję postępowania, aby ten ktoś doszedł do rezultatu o który nam/jemu chodzi. Najprostszym więc zatem sposobem opisu listy kroków jest język naturalny np:
- weź dowolną liczbę naturalną należącą do zbioru N i zapamiętaj ją pod nazwą L,
- skopiuj ją do pamięci i zapamiętaj pod inną nazwą M,
- zmniejsz wartość liczby spod nazwy M o 1.
- podziel L / M i sprawdź wynik czy jest liczbą naturalną i całkowitą?!
Jeśli tak to idź do kroku 5, jeśli nie wróć do kroku 3. - Czy liczba spod nazwy M równa się wartości 1?
Jeśli tak to napisz, że liczba zapisana pod nazwą L jest liczbą pierwszą, jeśli nie to napisz, że liczba zapisana pod nazwą L nie może być liczbą pierwszą, bo ma podzielniki całkowite inne niż ona sama i liczba 1. - Zakończ sprawdzanie liczby spod nazwy L.
Co właśnie zrobiliśmy? Napisaliśmy program sprawdzający czy dana liczba jest liczbą pierwszą. Zapisaliśmy go w postaci listy czynności do wykonania, zapisaliśmy go językiem naturalnym. Jak najbardziej stworzyliśmy algorytm. Czy jest on zrozumiały dla nas – TAK, a czy dla komputera?! To zależy ;-). Są programy potrafiące zamieniać listę poleceń języka naturalnego na polecenia w semantyce1słownictwo języka i syntaktyce2składnia języka danego języka programowania, ale było by to niewłaściwe i niebezpieczne podejście, bowiem przy pewnym skomplikowaniu naszego programu takie tłumaczenie mogłoby odbiegać od naszych zamiarów. Dlatego też należy zapisać algorytm w sposób bardziej jednoznaczny.
Innym sposobem zapisu algorytmu jest notacja w postaci schematu blokowego.

Także i w tym przypadku są systemy potrafiące przełożyć notację blokową na działający program w danym języku, są one dużo bardziej wiarygodne niż w przypadku analizy języka naturalnego, jednakże nadal nie są właściwym sposobem zaawansowanego programowania. Systemy takie nie do końca potrafią „wyczuć” intencje programisty, a więc dobry programista znając medium w którym programuje potrafi go skomponować w maksymalnie efektywny sposób, co przekłada się na prostotę, styl, szybkość działania i bezawaryjność rozwiązania.
Pewną dygresją będzie uwaga, że w poprzedzających rozważaniach raz mówiliśmy o programie, a raz o algorytmie, stosując to wymiennie. Prawdą jest, że algorytm nie jest programem, ani program algorytmem. Dopuszczenie tego powyżej miało na celu doprowadzenie do tego momentu i zastanowienie się co to jest algorytm, a co to jest program.
Algorytm to uporządkowany ciąg poleceń skutkujących realizacją zamierzenia programisty, a program to zaimplementowany (wdrożony) algorytm w konkretnym języku programowania. Jak widać, nie ma programu bez algorytmu, a algorytm może istnieć bez programu. Często jednak początkujący programiści usiłują pisać programy bez algorytmu, co powoduje powstanie chaosu i mnóstwa błędów. Dlatego też należy nauczyć się tworzyć algorytmy, które dużo łatwiej logicznie sprawdzić, a potem dopiero implementować je w programie. Oszczędza takie podejście dużo pracy związanej z „odpluskwianiem” programu z błędów, czasem błędów tak dużych, że program łatwiej jest napisać od nowa niż poprawiać już napisany.
Trzecią (choć nie ostatnią) notacją algorytmu jest tzw. pseudokod, czyli coś co wygląda jak kod programu, jednak nim nie jest. W tej notacji można „przemycić” charakterystyczne sposoby znane z konkretnego języka programowania, które mają służyć uproszczeniu zapisu algorytmu, a z uwagi na powszechność wiedzy na temat tego języka programowania, będące zrozumiałymi dla innych (znających ten język programowania). Przykładem takiego zapisu jest poniższy przykład:
Procedure twórz_mrówkę(id_mrówki)
inicjalizuj_mrówkę(id_mrówki)
inicjalizuj_pamięć_mrówki()
while istnieją niedogrzane węzły and ładunek >0 do
P=oblicz_prawdopodobieństwo_przejść(L)
następny_węzeł = wybierz_następny_węzeł(P)
przenieś_mrówkę(następny_węzeł)
L=aktualizuj_wewnętrzny_stan()
end while
uwolnij_zasoby_mrówki(id_mrówki)
end procedure
Powyższy przykład nie jest sensu stricte programem, ale ścisłym odniesieniem do niego z użyciem wspomnianego pseudokodu.
W następnych tematach podniesiona zostanie tematyka zapisu w postaci schematów blokowych jako najłatwiejsza do zrozumienia metoda nauki tworzenia algorytmów.
Zadanie do samodzielnego wykonania: Spróbuj znaleźć inne sposoby zapisu algorytmów, przestudiuj i zanotuj je.