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.Ś.