====== Opis pseudokodu ====== ===== Informacje podstawowe ===== * Stosujemy wcięcia zgodnie z poziomami zagnieżdżania się kodu. * Wszystkie zmienne typów prymitywnych piszemy małą literą. * Wszystkie zmienne będące strukturami złożonymi piszemy dużą literą. * Wprowadzamy symbol nieoznaczony **nil**. ==== Zmienne ==== * Nie deklarujemy/definiujemy zmiennych lokalnych funkcji. * Jeżeli zachodzi potrzeba wprowadzenia nowej zmiennej po prostu to robimy. * Każda zmienna jest widzialna w zakresie całej funkcji, wyjątkiem są: * Zmienne globalne, które definiujemy w następujący sposóbglobal j * Zmienne liczące w [[#petle|pętlach]]. * Przypisanie wartości do zmiennej wykonujemy operatorem **:=**: j := 2 j := j+1 a := j ==== Komentarze ==== * Symbolem **#** rozpoczynamy komentarz który trwa do końca linii. * Brak jest komentarzy wielolinijkowych. * W przypadku kiedy należy wykonać instrukcje nie związane bezpośrednio z kontekstem rozważanego problemu, można je zastąpić opisem słownym (komentarzem) nie poprzedzonym znakiem komentarza: ... i := i*2 wczytaj a z klawiatury i := i*a wypisz i na ekran ... ==== Operatory ==== * Dostępne są podstawowe operatory arytmetyczne + - / * * Dostępne są również następujące operatory: % (modulo), ^ (potęgowanie), | (dzielenie całkowite) ===== Tablice ===== * Nazwy tablic piszemy dużymi literami. * Numerowanie elementów tablic rozpoczynamy od **1**. * Do danego elementu tablicy odnosimy się podając jego indeks w nawiasach kwadratowych po nazwie tablicy: A[1] # pierwszy element tablicy A[i] # i-ty element tablicy A[i-1] # i-1 element tablicy * Długość tablicy jest zwracana przez funkcję //length//: n := length(A) # teraz n przechowuje długość tablicy, jest to jednocześnie indeks jej ostatniego elementu. * Nie alokujemy/dealokujemy pamięci dla tablic. Zakładamy że jest to robione automatycznie. * Wyznaczanie podtablicy jest możliwe przy pomocy trzykropka: Wypełnij A ciągiem kolejnych liczb pierwszych od 2 do 17 B := A[3...length(A)-1] # Teraz B zwiera następujące wartości: 5,7,11,13 ===== Funkcje ===== * Definicję funkcji rozpoczynamy słowem **func**. * Koniec definicji funkcji oznaczamy przy pomocy **endfunc**. * Definiując funkcję specyfikujemy jedynie listę argumentów jakie przyjmuje. Nie specyfikujemy typu wartości jaką funkcja zwraca oraz typów argumentów. * Argumenty do funkcji są przekazywane przez wartość. * Szkielet przykładowej definicji funkcji (o nazwie search) wygląda następująco: func SEARCH(A, a, b) ... instrukcje wewnątrz funkcji wraz z wcięciami ... endfunc * Funkcja może zwrócić dowolną wartość w dowolnym momencie. * Zwrócenie wartości przez funkcję następuję przy pomocy słowa **return** po którym musi wystąpić wartość zwracana. * Funkcje wywołujemy pisząc jej nazwę a następnie w okrągłych nawiasach listę argumentów rozdzielonych przecinkami: a := SEARCH(A,i,j) * Zakładamy że funkcja zwracająca wartość zwraca ją w postaci **niestałej referencji**, wtedy możliwy staje się zapis: c := funkcja(A) funkcja(B) := c lub po prostu: funkcja(B) := funkcja(A) ===== Instrukcje warunkowe ===== * Będziemy stosować głównie instrukcję **if-elseif-else-endif**. * Instrukcje **elseif** oraz **else** są opcjonalne. * Dostępne są następujące operatory relacji: =, !=, >, >=, <, < =. * Warunki możemy łączyć przy pomocy następujących operatorów: * **and** - binarny - zwraca prawdę jeżeli oba warunki są prawdziwe * **or** - binarny - zwraca prawdę jeżeli przynajmniej jeden warunek jest prawdziwy. * **xor** - binarny - zwraca prawdę jeżeli jeden z warunków jest prawdą a drugi fałszem. * **not** - unarny - zwraca prawdę jeżeli warunek jest niespełniony. * Przykładowe zastosowanie instrukcji warunkowej do określenia maksymalnej z pośród trzech wartości: func MAX(a,b,c) if a > b if a > c return a else return c endif else if b > c return b else return c endif endif endfunc * Przy pomocy nawiasów okrągłych możemy grupować wyrażenia relacji, definiując równocześnie kolejności ich sprawdzania.\\ Powyższy kod może zostać przepisany także w następującej postaci: func MAX(a,b,c) if (a > b) and (a > c) return a elseif (a <= b) and (a > c) return b endif return c endfunc ===== Pętle ===== * Działanie każdej pętli może zostać przerwane w dowolnym momencie przy pomocy instrukcji **break**. * Działanie każdej pętli może zostać przerwane i natychmiast wznowione przy pomocy instrukcji **continue**. * Instrukcje **break** i **continue** odnoszą się tylko do najbardziej zagnieżdżonej pętli. ==== for ==== * Poprawna konstrukcja pętli **for** wymaga podania: * nazwy zmiennej która będzie licznikiem w danej pętli, * krańcowych wartości licznika. * Podanie kroku jest opcjonalne. Domyślną wartością kroku jest **1**. * Przykładowa pętla **for**: for zmienna in 7...17 step 2 wypisz zmienna na ekran endfor * Powyższa pętla wypisze na ekran liczby: 7,9,11,13,15,17 ==== while ==== * Pętla **while** wykonuje kod tak długo jak długo jest spełniony warunek działania pętli. * Przykład pętli **while** odpowiadający powyższej pętli **for**: zmienna := 7 while zmienna <= 17 wypisz zmienna na ekran zmienna := zmienna + 2 endwhile