Krótki kurs programowania w języku BASIC dla ClassPad - na wybranych przykładach dr Edward Bryniarski Uniwersytet Opolski, Instytut Matematyki i Informatyki edlog@uni.opole.pl WSTĘP Nauka programowania w języku Basic dla kalkulatora CASIO ClassPad 300 jest bardzo skutecznym, nie wymagającym korzystania z pracowni komputerowej, a więc tanim, środkiem zwiększenia efektywności i uatrakcyjnienia nauczania algorytmiki, a takŝe przygotowania do opanowania arkusza kalkulacyjnego, na poziomie szkoły podstawowej i gimnazjum. Opanowanie elementów programowania na ClassPad 300 pozwala teŝ wykorzystywać kalkulator na lekcjach matematyki i na zajęciach pozalekcyjnych. WaŜne jest to, Ŝe uczeń dysponujący własnym komputerem IBM PC moŝe indywidualnie programować korzystając z emulatora ClassPad 300, ponadto moŝe przenosić na obsługę kalkulatora część sprawności uzyskanych w posługiwaniu się systemem Windows, co znacznie przyspiesza uczenie się programowania. Jakie minimum sprawności jest wymagane do programowania na ClassPad 300? Zalecamy opanowanie następujących sprawności: Uruchamianie aplikacji program Korzystanie z okna programu ładującego Obsługa edytora programów Tworzenie nowego lub poprawianie starego programu etapy Zarządzanie plikami Omówimy je krótko poniŝej.
Uruchamianie aplikacji program Z dolnego paska ekranu wywołujemy piórkiem Menu Educational i w nim wciskamy Aplikację Program. Wybór typu menu Ikona Aplikacji Program Ikona Menu Korzystanie z okna Programu Ładującego Uaktywnienie Aplikacji Program otwiera okno Programu Ładującego, pozwalające w polu Folder przeglądać listę aktualnych folderów utworzonych w pamięci kalkulatora, a w polu Name listę bieŝących plików. MoŜemy równieŝ wywoływać róŝne opcje otworzenie i edytowania plików i zmiennych, a takŝe uruchamiania programów. Z ikon w górnym pasku korzystamy analogicznie jak w programie Windows. Wybór folderów Wybór plików
Obsługa edytora programów W oknie Programu Ładującego wywołujemy Program Edytor. Z wirtualną klawiaturą zapoznajemy się najszybciej wciskając poszczególne jej opcje: Ctrl, I/O, Misc, mth, abc, cat, 2D, SMBL, itd., a następnie wybierając poszczególne znaki lub słowa. Z ikon w górnym pasku korzystamy analogicznie jak w programie Windows. Oznaczają one kolejno: - wywołanie program ładujący, - nowy program, - wybór starego programu, - zapisanie programu, - wycięcie zaznaczonego piórkiem fragmentu ekranu (przesunięcie piórkiem po ekranie), - kopiowanie zaznaczonego fragmentu ekranu, - wywołanie kopii. Tworzenie nowego lub poprawianie starego programu etapy 1. Otwórz nowy plik lub stary: Wciśnij odpowiednią ikonę lub wybierz [Edit] menu a następnie [New File] lub [Open File]. 2. Wprowadź nazwę i wciśnij [OK.] lub zaznacz juŝ istniejącą. 3. Wprowadź wyraŝenia i polecenia, które utworzą nowy program lub skorygują stary. 4. Zapisz program. 5. Wywołaj okno programu ładującego. 6. Uruchom program wciskając ikonę z trójkącikiem lub [Run] a następnie [Run] program.
Zarządzanie plikami KaŜda zmienna słuŝąca do przenoszenia danych pomiędzy programami, a nie lokalnie tylko w ramach jednego programu określona komendą Local zapisywana jest w oknie Variable Manager w stosownym folderze (po jego zaznaczeniu) jako plik z rozszerzeniem odpowiadającym typowi tej zmiennej. Okno Variable Manager dostępne z okna Programu Ładującego poprzez ostatnią ikonę w górnym pasku. Standardowe operacje na plikach (zmiennych): - Delete: kasowanie, - Rename: zmiana nazwy, - Copy: kopiowanie do innego folderu, - Move: przenoszenie do innego folderu, - Lock: blokowanie działania zmiennej, - Unlock: odblokowanie zmiennej, wykonywane są analogicznie, jak w systemie Windows. Zachęcając nauczycieli i uczniów do poznania programowania w języku Basic dla ClassPad 300, mamy nadzieję, Ŝe nie tylko będą wykorzystywać je w nauczaniu i uczeniu się algorytmiki, ale takŝe sięgną oni do perełek programistycznych z epoki mikrokomputerów i spróbuję je odtworzyć na kalkulatorze ClassPad 300 (lub ClassPad Plus).
1. Print, Input, ExpToStr, StrJoin, GoTo Lbl, If - Zadanie 1 Napisz program obliczający największy wspólny dzielnik dwóch liczb naturalnych. Schemat blokowy algorytmu obliczania największego wspólnego dzielnika przedstawia poniŝszy schemat. Prezentację programu w języku Basic dla ClassPad opiszemy w ten sposób, Ŝe będziemy tłumaczyć kolejne słowa kluczowe języka Basic uŝyte w programie, wyróŝniając wiersze programu inną czcionką, powiększoną i pogrubioną. Stosując komendę Local, ustalamy zmienne występujące po tej komendzie jako lokalne, tj. usuwane po zakończeniu wykonywania programu i nie występujące na liście Variable Manager Local A,B,C,D,A1,T,T1,T2,T3, Słowo kluczowe Print słuŝy do drukowania na ekranie łańcucha znaków, np. "Program oblicza NWD(A,B)" Print "Program oblicza NWD(A,B)" Symbole A, B,..., A1, A2,..., B1, B2,..., a, b,..., AB,...,ab,...,abc,..., są zmiennymi. Instrukcja podstawiania lub przypisania, w standardzie BASIC ma postać LET <zmienna>=<wartość> lub w metajezyku programowania <zmienna>: = <wartość>, dla ClassPad ma postać <wartość> <zmienna>, 0 A liczba 0 przypisana jest zmiennej A, zmienna A przyjmuje wartość 0 B1 A zmienna A przyjmuje wartość zmiennej B1. Słowo kluczowe Input wczytuje z klawiatury rzeczywistej lub wirtualnej (uruchamianej piórkiem) znaki kodujące wartości zmiennej występującej po tym słowie: zmiennej liczbowej, tekstowej, listowej, tablicowej. Wynik wczytania wyświetlany jest w oknie dialogowym, w którym po zmiennej moŝna umieścić komentarz wpisany po przecinku. Input A,"Podaj liczbe A:" Input B,"Podaj liczbe B:" JeŜeli chcemy wynik wydrukować w postaci NWD(liczba1, liczba2) = musimy wpisane liczby A i B zamienić na łańcuchy C i D. Konwersji typu Number na Str dokonuje polecenie ExpToStr <zmienna liczbowa, liczba >, <zmienna tekstowa>. ExpToStr A,C ExpToStr B,D Następnie potrzebne jest odpowiednie połączenie (konkatenacja) tekstów: NWD(, napis liczby1,,, napis liczby2, ). Konkatenacji tekstów dokonuje polecenie :
StrJoin <zmienna-tekstowa1,tekst1>, <zmiennatekstowa2,tekst2>,<zmienna-tekstowa>. StrJoin "NWD(",C,T1 StrJoin T1,", ",T2 StrJoin T2,D,T3 StrJoin T3,") = ",T W tym miejscu będzie potrzebny jakiś znacznik Lbs <nazwa odwołania>, do którego będzie dowoływała się instrukcja skoku GoTo <nazwa odwołania>, przesyłająca dane do miejsca odwołania. Lbl A1 Rysunek obok wyjaśnia dalszą strukturę programu obliczania NWD dwu liczb naturalnych, a zarazem wyjaśnia stosowanie instrukcji warunkowej If Else. If A B If A>B A-B A GoTo A1 Else B-A B GoTo A1 Else PrintNatural A,T Start Input A Input B If A B If A>B PrintNa tural A A-B A B-A B Stop
Instrukcja PrintNatural <wynik>, <Komentarz do wyniku> otwiera okno w którym drukuje wynik poprzedzając go w nagłówku wpisanym komentarzem. 2. For To Next Zadanie 2. Oblicz silnię z liczby n>0: n! = 1*2*...*n. Program oblicza silnię z podanej liczy N Lbl Start Input N,"Podaj liczbe N" If N=0 1 S PrintNatural S,"Silnia(N)=" GoTo Start 1 S For 1 I To N S I S Next PrintNatural S,"Silnia(N)=" Start Input S 1 S 1 I Sekwencję instrukcji, które mogą być wykonalne w sposób powtarzalny aŝ do spełnienia określonego warunku, nazywa się pętlą. W pętli najczęściej moŝna wyróŝnić pewna zmienną nazywaną zmienną sterującą pętli. Jedną z instrukcji do organizowania pętli w Basicu jest instrukcja powtórzeń For Next. W języku Basic dla ClassPad stosuje się dwie konstrukcje tych instrukcji: 1. For W1 S To W2 Step W I1, I2,...In Next 2. 2. For W1 S To W2 I1, I2,...In Next I N? S I S I+1 I Stop Print S
Gdzie W1 - <wyraŝanie arytmetyczne określające wartość początkową zmiennej sterującej>, operacja przypisania, S - <zmienna prosta - sterująca>, W2 - < wyraŝanie arytmetyczne określające wartość końcową zmiennej sterującej>, W - <wyraŝanie arytmetyczne określające wartość kroku zmiany zmiennej sterującej>. I1, I2,...In skończony ciąg instrukcji. 3. While WhileEnd Zadanie 3. Podziel liczbę naturalna A przez liczbę naturalną B, gdy A B. Oznacz iloraz całkowity przez Q i resztę przez R: A = Q*B + R. Reszta spełnia warunek 0 R < B. Skorzystaj z algorytmu Euklidesa (patrz schemat). Program oblicza iloraz całkowity Q i resztę z dzielenia R liczby naturalnej A przez liczbę naturalną B Input A Input B 0 Q A R While R B Q+1 Q R-B R Start Input A Input B 0 Q, A R WhileEnd Print Q Print R R B? Q+1 Q, R-B R Print Q Print R Stop
Do organizowania pętli w Basicu słuŝy takŝe instrukcja While WhileEnd. Instrukcja ta ma następującą konstrukcję: While <warunek> I1, I2,..., In, WhileEnd Instrukcja powoduje dotąd powtarzanie wykonywania ciągu instrukcji I1, I2,..., In, dokąd <warunek> jest prawdziwy. Uwaga: nie powinno się uŝywać komendy GoTo, Ŝeby wyjść z pętli. 4. Definiowanie funkcji i ich uŝycie w programach: Define Zadanie 4. Wykorzystując standardowe dla ClassPad operacje dodawania i potęgowania liczb: +, ^, zdefiniuj fukcję A(i,j) określoną jako sumę kwadratów dwóch licz naturalnych i, j. Następnie oblicz sumę wszystkich wartości tej funkcji, dla i przyjmującego wartości od 1 do 10 oraz dla j od 1 do 15. W Basicu dla ClassPad definicja funkcji posiada nastepujacą składnię: Define <nazwa funkcji>(<nazwa zmiennej1>,<nazwa zmiennej2>,...<nazwa n-tej zmiennej>) = <wyraŝenie określające wartości funkcji dla danych wartości przymowanych przez wymienione zmienne> Program realizujący zadanie 4 będzie miał postać: Define A(I,J)=I^2+J^2 0 S For 1 I To 10 For 1 J To 15 S+A(I,J) S Next Next Print A(2,3) Print S 5. Podprogramy: <nazwa pliku podprogramu>( ) Programy napisane w języku Basic moŝemy skracać, jeśli ich częściami są inne programy. Program będący częścią drugiego programu nazywamy podprogramem. Skrócenie danego programu zawierającego występujące po sobie podprogramy <program1>,
<program2>,..., <n-ty program> wykonujemy w ten sposób, Ŝe zapisujemy te podprogramy w folderze <nazwa folderu>, nadając im nazwy: <nazwa programu1>, <nazwa programu2>,...,<nazwa n-tego programu>, a w danym programie, teksty podprogramów zastępujemy następującymi deklaracjami wywołania podprogramów: [<nazwa folderu>]<nazwa programu1>(), [<nazwa folderu>]<nazwa programu2>(),..., [<nazwa folderu>]<nazwa n-tego programu>(). Oczywiście, podprogram moŝe teŝ zwierać podprogramy lub wywołania podprogramów. Uwaga 1: odwołania do folderów, w których zapisano podprogramy, moŝna pominąć, jeśli podprogramy zostały zapisane w tym samym folderze co program. Uwaga 2: zmienne wejściowe i wyjściowe podprogramu nie mogą być lokalne, ich typ i zaleŝności pomiędzy nimi we wszystkich programach muszą być takie same. Zobaczmy przykład: Input N Input K Podprogram zapisany w folderze library pod nazwą dim1; dane na wejściu: N, K; dane na wyjściu: S Define A(I,J)=I^2+J^2 0 S For 1 I To N For 1 J To K S+A(I,J) S Next Next Define f(n,k)=s PrintNatural f(n,k),"f(n,k)=" Rezultat skrócenia programu, po zastąpieniu podprogramu deklaracją wywołania podprogramu o nazwie dim1, jest natychmiastowy: Input N Input K library\dim1() Define f(n,k)=s PrintNatural f(n,k),"f(n,k)="
Program oblicza sumę wszystkich sum kwadratów dwu liczb naturalnych w ustalonym zakresie N, K. 6. Operacje na listach i macierzach Lista jest ciągiem o wartościach liczbowych lub tekstowych. Lista zawierająca tylko liczby jest wektorem. Do oznaczenia zmiennych, którym przypisujemy listy, uŝywamy zazwyczaj symboli: list1, list2,..., ale moŝna takŝe uŝywać innych symboli zmiennych: A,A1,...,b, b1,...,lista, dane,... Oto przykładowe przypisanie danych zmiennej list1: {2,2,"lista",5,1,"a",2,3} list1 {1,2,3} list2, {4,2.1,-3} list3 Macierze w ClassPad tworzymy według następującego przykładu. Klasyczne operacje przypisania 1 2 3 1 1 1 mat1:= 4 5 6 mat2:= 1 1 1 7 8 9 1 1 1 zastępujemy wyraŝeniami [[1,2,3][4,5,6][7,8,9]] mat1 [[1,1,1][1,1,1][1,1,1]] mat2 Typowe funkcje dla list i macierzy Print list1[3] 3-ci element listy list1 Print dim(list1) liczba elementów listy - wymiar Print list1 Print mat1[2,1] element w wierszu 2 i kolumnie 1 Print dim(mat1) liczba wierszy, liczba kolumn Print list3 3 mnoŝenie wektora przez liczbę 3 Print mat1 3 mnoŝenie macierzy przez liczbę 3 Print list2+list3 suma macierzy Print mat1+mat2 suma macierzy Print list2 list3 iloczyn tensorowy wektorów, wynikiem jest wektor o elementach będących iloczynami odpowiadających sobie współrzędnych wektorów list2, list3. W celu uzyskania iloczynu skalarnego, naleŝy jeszcze zsumować współrzędne wektora list2 list3.
Print mat1^2 potęgowanie macierzy, jej kwadrat Print mat1 mat2 iloczyn macierzy Print det(mat1) wyznacznik macierzy kwadratowej Print submat(mat1, 1,1,2,2) podmacierz od 1 wiersz do 2 wiersza oraz od 1 kolumny do 2 kolumny: SubMat(mat1, <pocz. wiersz>, <pocz. kolumna>, <końcowy wiersz>, <końcowa kolumna>) Print trn(mat1) macierz transponowana Print diag(mat1) przekątna macierzy:[1,5,9] 7. UŜywanie funkcji Conics w programie do rysowania krzywych zadanych danym równaniem Zadanie 7 Napisz program rysowania okręgu o równaniu: (x-1)^2/3^2 + (y-2)^2/4^2=1. Wykonanie Czyszczenie okna wykresu i przywracanie początkowych parametrów okna graficznego ViewWindow ClrGraph Ustalenie parametrów okna graficznego ViewWindow [wartość x min ],[wartość y min ],[wartość x scale ], [wrartość x max ],[wartość y max ],[wartość y scale ] ViewWindow -15.4, 15.4, 2, -7.6, 7.6, 2 Przypisanie zmiennej ConicsEq, której zakresem są równania, danego równania krzywej "(x-1)^2/3^2 + (y-2)^2/4^2=1" ConicsEq UŜycie komendy DrawConic rysującej krzywą o równaniu podanym przez zmienną ConicsEq DrawConics
8. Tablicowanie funkcji i wykres na podstawie danych tablicy DefaultSetup przywracanie standardowych ustawień Setup ClrGraph czyszczenie ekranu wykresu i przywracanie standardowych parametrów okna graficznego ViewWindow ViewWindow 0, 7.7, 1, -14, 110, 10 GraphType "y=" Define y1(x) = 3 x^2-2 GTSelOn 1 nadawanie numeru 1 krzywej o równaniu y1(x) 0 Fstart początkowa wartość zmiennej x, od której zaczyna się tablicowanie wartości funkcji 6 Fend końcowa wartość zmiennej x 1 Fstep krok z jakim zmieniają się wartości zmiennej x w przedziale od 1 do 6 SheetActive 1 zaznaczenie numeru 1 krzywej przeznaczonej do rysowania DispFTable tablicowanie wartości funkcji o zaznaczonym numerze Pause pauza umoŝliwiająca zapoznanie się z tablicą wartości funkcji DrawFTGCon rysowanie zaznaczonej krzywej 9. Program rysujący punkty i odcinki oraz proste i proste prostopadłe do nich ClrGraph ViewWindow 0, 30, 1, 0, 110, 10 skala 1:10 Plot 10, 30 rysowanie punktu o współrzędnych x=10, y=30 Line 10,20, 20,50 rysowanie odcinka AB o współrzędnych początku odcinka A(10,20) i końcu B(20,50) GraphType "y=" Define y3(x)=3 x-10
GTSelOn 3 NormalLine 3,15 rysowanie prostej prostopadłej do krzywej o numerze 3 w punkcie o współrzędnej x=15 Pause pauza w celu rozpoczęcia nowego zdarzenia ClrGraph czyszczenie ekranu wykres, skala 1:1 GraphType "y=" Define y2(x)=(2/5) x GTSelOn 2 Line -5,-2, 5,2 NormalLine 2,1 poniŝszy podprogram powoduje migotanie punktów 0 I While I<10 I+1 I PlotOn -6,-1 punkt P(-6,-1) staje się widoczny na ekranie PlotOff 0,0 puntkt P(0,0) staje się niewidoczny na ekranie Wait 2 ustalenie czasu trwania powyŝszego zdarzenia na 2 s PlotOff -6,-1 PlotOn 0,0 Prostopadłe narysowane w skali 1:10 Wait 2 WhileEnd Prostopadłe narysowane w skali 1:1 Równanie prostej prostopadłej
10. Włączenie tabeli i wykresów rekurencyjnych do programu Zadanie 10 Stablicuj 7 pierwszych wyrazów ciągu zadanego rekurencyjnie: a 0 = 0.01, a n+1 = -3a n 2 + 2a n. Wyniki zaznacz na wykresie. Wykonanie DefaultSetup ViewWindow 0,6, 1, -0.01, 0.3, 3 SeqType "a n+1 a 0 " "-3a n^2 + 2a n " a n+1 0 SqStart 6 SqEnd 0.01 a 0 DispSeqTbl Pause DrawSeqCon
Zadanie 10 a Stablicuj 7 pierwszych wyrazów ciągu zadanego rekurencyjnie: a 0 = 0.01, a1 = 0.2, a n+2 = -3a n 2 + 2a n+1. DefaultSetup ViewWindow 0,6, 1, -0.01, 0.3, 3 SeqType "a n+2 a 0 " "-3a n^2 + 2a n+1 " a n+2 0 SqStart 6 SqEnd 0.01 a 0 0.2 a 1 DispSeqTbl Pause DrawSeqCon 11. Włączanie funkcji sortowania listy do programu Zadanie 11 Napisz program sortujący dane listy: {8, 12,3, 6, 5, 21, 34, 0, 16, 13} list1 a) w porządku rosnącym, b) w porządku malejącym. Wykonanie zad. 11 a) MultiSortA list1 Wykonanie zad. 11 b) MultiSortD list1
12. LOSOWANIE A LISTY Zadanie 12 Napisać program tworzący losową listę pięciu liczb z zakresu od 1 do 100. Wykonanie 1: rand(1,100) A1 rand(1,100) A2 rand(1,100) A3 rand(1,100) A4 rand(1,100) A5 {A1,A2,A3,A4,A5} list Print list Wykonanie 2 Define R(I)=rand(1,100) {R(1),R(2),R(3),R(4),R(5)} list2 Print list2 Wykonanie 3 Pięcioelementową losową listę liczb od 1 do 100 otrzymujemy takŝe za pomocą instrukcji: Print randlist(5,1,100) Zadanie 12 a Napisz program drukujący literę wymienioną na liście: {"a","b","c","d","e","f"} o ile litera ta zajmuje miejsce o numerze wskazanym przez rzut kostką do gry. Sporządź sześcioelementową listę losowo wybranych liter z powyŝszej listy. Wykonanie zadania: {"a","b","c","d","e","f"} list1 Print list1[rand(1,6)] Define L(I)=list1[rand(1,6)] {L(1),L(2),L(3),L(4),L(5),L(6)} list3 Print list3
13. Iteracje Zadanie 13 Funkcja f określona jest w zbiorze X = {a, b, c, d, e, f, g} przez tablicę x a b c d e f g f(x) e f g a c d b Sporządź tablicę funkcji f 100 będącej 100-krotnym złoŝeniem tej funkcji. Sformułuj treść zadania w taki sposób, aby reprezentowała zabawę (grę) 7 osób (np. zamiana miejscami). Wykonanie zadania: SetStandard InputStr X Define f 100 (X)=Y For 1 I To 100 'Define f(x)=y StrCmp X,"a",I1 StrCmp X,"b",I2 StrCmp X,"c",I3 StrCmp X,"d",I4 StrCmp X,"e",I5 StrCmp X,"f",I6 StrCmp X,"g",I7 If I1=0 "e" Y Else If I2=0 "f" Y Else If I3=0 "g" Y Else If I4=0 "a" Y Else UWAGA! Znak równości = stosowany jest dla obliczeń na liczbach, natomiast nie ma zastosowania dla operacji na łańcuchach znaków i na listach (wektorach i macierzach). Dla ustalenia równości łańcuchów i list stosuje się odrębne programy. Łańcuchy A i B są identyczne, gdy parametr I, po realizacji instrukcji StrCmp A,B,I, przymuje wartość 0.
If I5=0 "c" Y Else If I6=0 "b" Y Y X 'Print X Next Print f 100 (X) 14. Równość list oraz zbiorów danych na listach Zadanie 14 Napisz program sprawdzający czy dwie listy są identyczne. Wykonanie zadania: {"a","b","c"} list1 {"a","b","c"} list2 program sprawdzajacy równość list lit1, list2 0 S For 1 I To dim(list1) StrCmp list1[i],list2[i],o S+O S Next If dim(list1)=dim(list2) and S=0 Print "list1 = list2" Else
Print "list1 list2" Print S Zadanie 14 a Napisz program sprawdzający równość zbiorów danych na listach list1, list2. Zbiór danych odróŝnia się od listy, traktuje się go jak skończony zbiór abstrakcyjny w teorii mnogości. Dwa zbiory są identyczne, gdy posiadają te same elementy (tutaj :posiadają te same dane). Zmienne, którym będziemy przypisywać listy traktowane jako zbiory danych, będziemy oznaczać przez set1, set2,... Wykonanie. program sprawdzający czy set2 zwiera set1 0 S1 For 1 I To dim(set1) For 1 For 1 I To dim(set2) StrCmp set1[i],set2[j],o If O=0 S1 + 1 S1 dim(set2) J Next If S1<I Print "set2 nie zwiera set1" dim(set1) I Next If dim(set1)<dim(set2) and S1= dim(set1) Print " set2 zwiera set1" program sprawdzający czy set1 zwiera set2 0 S2 For 1 I To dim(set2) For 1 For 1 I To dim(set1) StrCmp set1[i],set2[j],o If O=0 S1 + 1 S1 dim(set1) J
Next If S1<I Print "set1 nie zwiera set2" dim(set2) I Next If dim(set2)<dim(set1) and S2= dim(set2) Print " set2 zwiera set1" program sprawdzający identyczność zbiorów danych If dim(set1)=dim(set2) and S1= dim(set1) and S2= dim(set2) Print "set1 = set2" Print S PROBLEM Napisz program wykonujący sumę mnogościową dwu skończonych zbiorów danych. Napisz program wykonujący iloczyn mnogościowy dwu skończonych zbiorów danych. Jak zdefiniować produkt karteziański skończonych zbiorów danych? Jak reprezentować listę, której elementami mogą być listy? 15. Relacje i operacje na łańcuchach znaków InputStr A InputStr B StrLen A,N1 StrLen B,N2 StrCmp A,B,O1 If O1=0 Print "B zawiera A" If N1>N2 Print "B nie zawiera A" If N1<N2
StrLeft B,N1,A1 StrRight B,N1-1,R StrCmp A,A1,O2 If O2=0 Print "B zawiera A" PrintNatural R, "B rozni się od A o łancuch:" Else Print "B nie zawiera A" StrJoin "c", "abc",i Print I StrRight "asdfg",3,t1 Print T1 StrLen "asdfg",n Print N StrLeft "asdfg", 3,T2 Print T2 StrCmp "asdfg","df",o Print O 16. Szablony do tworzenia menu programów Prezentujemy trzy najbardziej typowe szablony wyboru opcji programów komputerowych. Mogą one być realizowane w kaŝdej wersji języka Basic (takŝe łatwo je przetłumaczyć na inne języki programowania. Stanowią one podstawę przy projektowaniu iterjfejsów typu interferjsu Windows. Zadanie 16 Zaprojektuj szablon wyboru indeksowanych opcji programu poprzez wybór indeksu opcji. Wykonanie ClrText Locate 14,1,"Wybierz opcje: Locate 15,11,"Opcja 1" Locate 15, 21,"Opcja 2" InputStr O, Podaj ideks opcji: StrCmp O, 1, I1 Komenda Locate xe,ye,t drukuje w oknie tekstowym łańcuch T (0<xe,ye<290).
If I1=0 Tu moŝna wywołać program 1 PrintNatural Wykonanie opcji 1 StrCmp O, 2, I2 If I2=0 Tu moŝna wywołać program 2 PrintNatural Wykonanie opcji 2 Zadanie 16 a Zaprojektuj szablon przewijanego menu programu, w którym przewijanie dokonuje się przez odznaczanie w inwersie wypunktowań opcji (kwadracik pełny przechodzi w kwadracik pusty), a wybór opcji dokonuje się przez naciśnięcie klawisza EXE (odpowiednik Enter na IBM). Wykonanie While 1 0 ctrl ClrText Locate 14,1,"Wybierz programy: Locate 15,11,"Program 1" Locate 15, 21,"Program 2" Locate 15, 31,"Program 3" Locate 15,41,"Program 4" Locate 1,11," " Locate 1,21," " Locate 1,31," " Locate 1,41," " Locate 1,51," " Locate 15,51,"Exit" Locate 1,11," " 1 edo 11 ye While ctrl 13 GetKey ctrl Wait 1 If ctrl=28
If edo=1 0 ctrl 5 edo 51 ye Locate 1,ye," " Locate 1,11," " Else 0 ctrl Locate 1,ye," " ye-10 ye edo-1 edo Locate 1,ye," " If ctrl=29 If edo=5 0 ctrl 1 edo 11 ye Locate 1,ye," " Locate 1,51," " Else 0 ctrl Locate 1,ye," " ye+10 ye edo+1 edo Locate 1,ye," " WhileEnd W kaŝdym wywołaniu Case moŝna odwołać się do wykonania jakiegoś programu/zdarzenia Switch edo
Case 1 PrintNatural "Wykonanie opcji 1" Break Case 2 PrintNatural "Wykonanie opcji 2" Break Case 3 PrintNatural "Wykonanie opcji 3" Break Case 4 PrintNatural "Wykonanie opcji 4" Break Case 5 PrintNatural "Wyjście" Stop Default Break SwitchEnd WhileEnd Zadanie 16 b Zaprojektuj szablon wyboru opcji programu przez uaktywnienia wybranego pola ekranu za pomocą piórka (odpowiednikiem na IBM jest myszka lub joistick ). 'Do komentarzy w języku polskim stosujemy podprogram EdPl (patrz następny punkt kursu) "Wb+or opcji" T EdPl() S T1 "Wyj+scie" T EdPl() S T2 While 1 ClrText Locate 14,1,T1 Locate 15,11,"Opcja 1"
Locate 15, 21,"Opcja 2" Locate 15, 31,"Opcja 3" Locate 15,41,"Opcja 4" Locate 1,11," " Locate 1,21," " Locate 1,31," " Locate 1,41," " Locate 1,51," " Locate 15,51,T2 Locate 1,11," " 0 I 1 edo 0 xe 0 ye While I 1 GetPen xe,ye Komenda GetPen xe,ye wczytuje współrzędne punktu ekranu w miejscu dotknięcia piórkiem, w zakresie 0<xe<161, 0<ye<241. UWAGA! Ekran nie pokrywa się z oknem tekstowym zazwyczaj zaczyna się dla ye=132, tak więc kaŝda współrzędna y określona komendą Locate musi być powiększona o 132 i y<241-132=39. Następna instrukcja warunkowa If określa zakresy współrzędnych kwadratów, o rozmiarach 8 na 8, drukowanych przez komendy Locate, będących polami w których uaktywniamy odpowiednie opcje za pomocą piórka. If 1 xe and xe 8 and 143 ye and ye 153 1 edo 0 xe 0 ye 1 I Locate 1,11," " Locate 1,21," " Locate 1,31," " Locate 1,41," " Locate 1,51," " If 1 xe and xe 8 and 153 ye and ye 163 2 edo 0 xe 0 ye 1 I Locate 1,11," " Locate 1,21," " Locate 1,31," "
Locate 1,41," " Locate 1,51," " If 1 xe and xe 8 and 163 ye and ye 173 3 edo 0 xe 0 ye 1 I Locate 1,11," " Locate 1,21," " Locate 1,31," " Locate 1,41," " Locate 1,51," " If 1 xe and xe 8 and 173 ye and ye 183 4 edo 0 xe 0 ye 1 I Locate 1,11," " Locate 1,21," " Locate 1,31," " Locate 1,41," " Locate 1,51," " If 1 xe and xe 8 and 183 ye and ye 193 5 edo 0 xe 0 ye 1 I Locate 1,11," " Locate 1,21," " Locate 1,31," " Locate 1,41," " Locate 1,51," " WhileEnd
Switch edo Case 1 PrintNatural "Wykonanie opcji 1" Break Case 2 PrintNatural "Wykonanie opcji 2" Break Case 3 PrintNatural "Wykonanie opcji 3" Break Case 4 PrintNatural "Wykonanie opcji 4" Break Case 5 PrintNatural "Wyjcie z programu 5" Stop Default Break SwitchEnd WhileEnd 17. Edytor polskich liter Zadanie 17 Napisz program przetwarzający łańcuch znaków, w którym litery polskie zakodowane sa przez znak "+" poprzedzający stosowną literę. Np. łańcuchy "znak+ow", "kt+orym", "zaj+ac", "d+ab". itp. kodują słowa znaków, którym, zając, dąb Gdy wczytujemy łańcuch znaków moŝemy stosować instrukcję: InputStr T,"+znak=znak pl podprogram EdPl StrLen T,N "" S For 1 I To N StrMid T,I,Z,1 StrCmp Z,"+",J '
If J=0 I+1 I If I<N+1 StrMid T,I,Z,1 'Kodowanie "+a" StrCmp Z,"a",J 547 Kod 'Kodowanie "+A" StrCmp Z,"A",J 291 Kod 'Kodownie "+e" StrCmp Z,"e",J 557 Kod 'Kodowanie "+E" StrCmp Z,"E",J 301 Kod 'Kodownie "+o" StrCmp Z,"o",J 532 Kod 'Kodowanie "+O" StrCmp Z,"O",J 276 Kod 'Kodowanie "+s" StrCmp Z,"s",J
589 Kod 'Kodowanie "+S" StrCmp Z,"S",J 333 Kod 'Kodowanie "+l" StrCmp Z,"l",J 577 Kod 'Kodowanie "+L" StrCmp Z,"L",J 321 Kod 'Kodowanie "+z" StrCmp Z,"z",J 605 Kod 'Kodowanie "+Z" StrCmp Z,"Z",J 349 Kod 'Kodowanie "+x" StrCmp Z,"x",J 604 Kod 'Kodowanie "+X" StrCmp Z,"X",J 348 Kod 'Kodowanie "+c" StrCmp Z,"c",J 548 Kod
'Kodowanie "+C" StrCmp Z,"C",J 292 Kod 'Kodowanie "+n" StrCmp Z,"n",J 578 Kod 'Kodowanie "+N" StrCmp Z,"N",J 322 Kod Else StrJoin S,Z,Si Si S Next Print S Podprogram LPl dekodujący łańcuchy znaków alfanumerycznych na łańcuchy ze znakami polskimi If J=0 NumToChr Kod,Pl If J=0 NumToChr Kod,Pl StrJoin S,Pl,Si Si S StrJoin S,Pl,Si Si S