GWIAZDKOWY PREZENT DLA GRZECZNYCH UCZNIÓW
Ten plik stworzyłem w Wordzie, więc powinien dobrze się w
nim formatować, np. do ew. wydruku.
Wyśmienitym (!?) ćwiczeniem do naszych zadań z
inf. (umiejętność rozwiązywania których na pewno będę chciał zweryfikować na
sprawdzianie) a zarazem nietrudnymi wprawkami programistycznymi są poniższe
programy w Pascalu. W Pascalu dlatego, że bardzo łatwo jest go sobie legalnie
zainstalować (patrz niżej), ale przede wszystkim dlatego, że jest on bardzo
bliski języka naturalnego i chyba prawie wszystko w tych programach da się
samemu zrozumieć. W dodatku ma bardzo czytelne i pasujące do naszych celów typy
danych! J
Programiki obrazują to, o czym mówiliśmy przez
ostatnie 2-3 informatyki, i mam nadzieję, rozjaśnią temat Ú poszerzą Wasze umiejętności i wiedzę.
Tutaj tzw. pliki źródłowe programów (ich tekstowy zapis w Pascalu):
prog1.pas prog2.pas prog3.pas prog4.pas,
a tutaj efekty ich kompilacji (czyli pliki wykonywalne, gotowe do
uruchomienia, a zapisane w języku prawie maszynowym, rozumianym przez system operacyjny
– w tym wypadku Windows):
prog1.exe prog2.exe prog3.exe prog4.exe.
(Gdyby pliki PAS jakoś się psuły (problem ze znakami końca linii), warto je
zapisać na dysku, a potem otworzyć w Wordzie i ew. przekopiować do innego
edytora).
Programy 1 i 2 same się chyba wystarczająco komentują, prog3.pas daje
możliwość sprawdzenia, jakie liczby z pewnej dziedziny (jakiej?) spełniają
pewne równanie bitowe (jakie?), więc może służyć do weryfikacji hipotez na
temat jego rozwiązania, a po (chyba nieskomplikowanych?) modyfikacjach może w
podobny sposób wspomagać rozwiązujących inne równania! J
Prog4.pas jest dosłownym zapisem jednego z zadań z naszych list. Każdy
uczeń powinien odgadnąć, którego i w której wersji (nawet nie znając treści
wszystkich zadań na pamięć!). Oczywiście również zachęcam do modyfikacji i
porównywania odpowiedzi komputera z wypracowanymi przez Was. Można mu też np.
dla jasności kazać podawać wszystkie kolejne wartości zmiennych. Pascal nie ma
niestety typu półbajtowego, ale to też nie problem, bo łatwo można go
symulować, każąc wyzerować daną zmienną, w momencie gdy zapis jej wartości
przekracza już 4 bity. Powo! J
Uwagi:
·
Pascalowy typ Byte
to liczby naturalne zapisywane – zaskoczenie: na 1 bajcie! Pascalowe „słowo” to
2 B, czasem (w niektórych wersjach Pascala) jest to typ ShortWord, a Word
zajmuje aż 4 B.
·
Jak widać, Pascal
pisze prawie jak my, tzn. zna i z powodzeniem stosuje operacje not, and,
or czy xor. Operacja div (ang. „division”, „divide”) to
tzw. dzielenie całkowite, czyli np. 17 div 5 = 3 i ogólnie x div y
to podłoga z ilorazu. Pascal (oczywiście) zna również funkcję podłoga, ale jej
użycie jest trochę niewygodne, a poza tym to div 2 działa
dokładnie, jak mówiliśmy na lekcjach, tj. robi shr 1 (Pascal
(oczywiście!) zna zresztą również tę operację).
·
Zauważcie, że zwykłe
podstawienia (przypisania) typu „a:=x” mogą mieć kolosalny wpływ na to, jak
później owe wartości są traktowane, tylko dlatego, że zmienne a i x
mogą być różnych typów (a komputer może nam nijak tego nie sygnalizować!). Tak
samo złudne są (a mają jeszcze bardziej widowiskowe efekty) działania w obrębie
typów całkowitych, na czym opierają się nasze ciekawe problemy z lekcji i zadań
oraz inne programy. J
Problemy (dla ambitnych*):
·
Po co w prog2.pas
druga zmienna typu Word, skoro przecież cały czas przesuwamy jedną liczbę
(którą wczytaliśmy jako zmienną a1)?
·
Prog3.pas, jak
widać, nie sprawdza wszystkich możliwych wartości (elementów ustalonej tam
dziedziny) – czemu? A czy potrafisz (kazać mu) zbadać jednak wszystkie? Uwaga:
zachodzi tu [poważne] niebezpieczeństwo zawieszenia komputera – w razie gdyby
program zaczął działać „w nieskończoność”, przerwać go można, wciskając delikatnie
Ctrl+C albo Ctrl+Break (Ctrl+Pause).
* - czyli, myślę, wszystkich uczniów klasy Ic?
O Pascalu można łatwo znaleźć mnóstwo rzeczy w Sieci. Na mojej stronie (http://www.math.uni.wroc.pl/~msliw)
pod „Pascal” jest minipodręcznik dla moich studentów oraz kilka linków (fully
legal) do różnych wersji Pascala – najprościej powinno być z Turbo Pascalem 5,5
(nie należy się zrażać określeniem „Antique software! J), tylko trzeba się przyzwyczaić do używania menu bez myszki i że
uruchamianie to Ctrl+F9 (co zresztą też z pikantnymi szczegółami opisałem w mym
wyżej wzmiankowanym „podręczniku”. W razie problemów z instalacją, działaniem,
Pascalem lub informatyką służę jak zwykle pomocą!
Dla ew. linuksowców: z Sieci można legalnie ściągnąć kompilatory GNU
Pascala (gpc) i Free Pascala (fpc).
Gdyby ktoś z kolei zapragnął wypróbować Te
Rzeczy w Logo (z którym i tak wszyscy mieli, mają LUB będą mieli coś
wspólnego), to niestety nie wszystko da się tak fajnie... (Ale dużo rzeczy
można, tylko nieco bardziej skomplikowanie – Zainteresowanym mogę pokazać).
Niemniej jednak da się w naszym MSWLogo (link do pobrania i zestaw
instrukcji (choć nie z innej wersji) też na mojej stronie, u dołu („Język
Logo”)) wykonywać operacje bitowe – wpiszcie np. print bitor 31 121 – a
zobaczycie bitową alternatywę liczb 31 i 121.
Jest też podobnie działająca operacja lshift, tzn. po wpisaniu print
lshift 31 2 ujrzymy, jaki jest efekt przesunięcia o 2 bity w lewo zapisu
liczby 31 (choć Lshift to dla Logo nie „Left”, tylko „Logical” shift J, a o przesunięciu w prawo o x trzeba pomyśleć jak o przesunięciu w
lewo o... – dla znających matematyczne podejście żółwia do świata nie powinno
być to żadnym zaskoczeniem!). Kłopoty pojawiają się niestety przy zbyt dużych
liczbach (na ilu bitach mieszczą się tu liczby naturalne?) – można wówczas
zobaczyć coś ujemnego! Dzieje się tak dlatego, że MSWLogo nie ma typu
naturalnego, tylko od razu całkowity i stosuje kodowanie U2. J
Program 2 da się zrealizować np. jakoś tak: (Właściwie jedną linijką! Choć
jest różnica w obsłudze za to...)
make
"a 31 while [not (:a = 0)] [make "a ashift :a -1 print :a]
make
"a 31 while [not (:a = 0)] [make "a ashift :a 1 print :a]
(make to w Logo podstawienie i w tym wypadku nazwę zmiennej musi
poprzedzać cudzysłów, a nie jak zwykle dwukropek!... J)
Łatwo (?) już chyba zrealizować pętlę z programu 3, a program 4 to np. cos
takiego:
make
"k 0 make "l 1 make "i 1
while
[:l<2006] [if (modulo :i 2)=0 [make "k :k+1] make "i :i+1 make
"l :l+1]
print :i print :k print
:l
Wszystko oczywiście można, jak to w Logu, w jednej linijeczce!... J Wystarczy wówczas jeden Enter i... heja! Tylko czytelność jakby mniejsza,
nieprawdaż?
Poza tym niestety, gdyby ktoś chciał, jak w zadaniu, ograniczać zakresy
występujących tu zmiennych, musi (podobnie jak przy półbajtach w Pascalu)
zrobić to ręcznie... (Patrz wyżej).
Miłej obsługi i
programowania!
Wasz – M.Ś.