Elementy programowania w Basic dla ClassPad
Transkrypt
Elementy programowania w Basic dla ClassPad
Krótki kurs programowania w języku BASIC dla ClassPad - na wybranych przykładach dr Edward Bryniarski Uniwersytet Opolski, Instytut Matematyki i Informatyki [email protected] 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 IfEnd 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 StrJoin StrJoin StrJoin "NWD(",C,T1 T1,", ",T2 T2,D,T3 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 – Then – Else – IfEnd. If A≠ ≠B Then If A>B Then A-B⇒ ⇒A GoTo A1 Else B-A⇒ ⇒B GoTo A1 IfEnd Else PrintNatural A,T IfEnd 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 Then 1⇒ ⇒S PrintNatural S,"Silnia(N)=" GoTo Start IfEnd 1⇒ ⇒S For 1⇒ ⇒I To N S× ×I⇒ ⇒S Next PrintNatural S,"Silnia(N)=" 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 Start Input S 1 ⇒ S 1 ⇒ I I≤ ≤N ? S× ×I ⇒ S I+1 ⇒ I Print S Stop 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 Start 0⇒ ⇒Q A⇒ ⇒R Input A Input B While R≥ ≥B Q+1⇒ ⇒Q R-B⇒ ⇒R 0 ⇒ Q A ⇒ R R≥ ≥B ? WhileEnd Print Q Print R , 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] → Print dim(list1) Print list1 Print mat1[2,1] Print dim(mat1) 3-ci element listy list1 → → → liczba elementów listy - wymiar element w wierszu 2 i kolumnie 1 liczba wierszy, liczba kolumn → mnoŜenie wektora przez liczbę 3 mat1× ×3 → mnoŜenie macierzy przez liczbę 3 list2+list3 → suma macierzy mat1+mat2 → suma macierzy list2× ×list3 → iloczyn tensorowy wektorów, Print list3× ×3 Print Print Print Print 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 → Print det(mat1) → iloczyn macierzy 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) Print diag(mat1) → → macierz transponowana 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ść xmin],[wartość ymin],[wartość xscale], [wrartość xmax],[wartość ymax],[wartość yscale] 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 → czyszczenie ekranu wykresu i przywracanie standardowych parametrów okna graficznego ViewWindow ClrGraph ViewWindow 0, 7.7, 1, -14, 110, 10 GraphType "y=" Define y1(x) = 3× ×x^2-2 GTSelOn 1 0⇒ ⇒Fstart → → nadawanie numeru 1 krzywej o równaniu y1(x) początkowa wartość zmiennej x, od której zaczyna się tablicowanie wartości funkcji → końcowa 1⇒ ⇒Fstep → krok z 6⇒ ⇒Fend wartość zmiennej x 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 Plot 10, 30 → → skala 1:10 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: a0 = 0.01, an+1 = -3an2 + 2an. Wyniki zaznacz na wykresie. Wykonanie DefaultSetup ViewWindow 0,6, 1, -0.01, 0.3, 3 SeqType "an+1a0" "-3an^2 + 2an" ⇒ an+1 0 ⇒ SqStart 6 ⇒ SqEnd 0.01 ⇒ a0 DispSeqTbl Pause DrawSeqCon Zadanie 10 a Stablicuj 7 pierwszych wyrazów ciągu zadanego rekurencyjnie: a0 = 0.01, a1 = 0.2, an+2 = -3an2 + 2an+1. DefaultSetup ViewWindow 0,6, 1, -0.01, 0.3, 3 SeqType "an+2a0" "-3an^2 + 2an+1" ⇒ an+2 0 ⇒ SqStart 6 ⇒ SqEnd 0.01 ⇒ a0 0.2 ⇒ a1 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) rand(1,100) rand(1,100) rand(1,100) rand(1,100) ⇒ ⇒ ⇒ ⇒ ⇒ A1 A2 A3 A4 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 f(x) a e b f c g d a e c f d g b Sporządź tablicę funkcji f100 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 f100(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 Then "e" ⇒ Y Else If I2=0 Then "f" ⇒ Y Else If I3=0 Then "g" ⇒ Y Else If I4=0 Then "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 Then "c" ⇒ Y Else If I6=0 Then "b" ⇒ Y IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd Y ⇒ X 'Print X Next Print f100(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 Then Print "list1 = list2" Else Print "list1 ≠ list2" IfEnd 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 Then S1 + 1 ⇒ S1 dim(set2) ⇒ J IfEnd Next If S1<I Then Print "set2 nie zwiera set1" dim(set1) ⇒ I Next If dim(set1)<dim(set2) and S1= dim(set1) Then Print " set2 zwiera set1" IfEnd ‘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 Then S1 + 1 ⇒ S1 dim(set1) ⇒ J IfEnd Next If S1<I Then Print "set1 nie zwiera set2" dim(set2) ⇒ I Next If dim(set2)<dim(set1) and S2= dim(set2) Then Print " set2 zwiera set1" IfEnd ‘program sprawdzający identyczność zbiorów danych If dim(set1)=dim(set2) and S1= dim(set1) and S2= dim(set2) Then Print "set1 = set2" IfEnd 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 Then Print "B zawiera A" IfEnd If N1>N2 Then Print "B nie zawiera A" IfEnd If N1<N2 Then StrLeft B,N1,A1 StrRight B,N1-1,R StrCmp A,A1,O2 If O2=0 Then Print "B zawiera A" PrintNatural R, "B rozni się od A o łancuch:" Else Print "B nie zawiera A" IfEnd IfEnd 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 Then ‘Tu moŜna wywołać program 1 PrintNatural „Wykonanie opcji 1” IfEnd StrCmp O,”2”, I2 If I2=0 Then ‘Tu moŜna wywołać program 2 PrintNatural „Wykonanie opcji 2” IfEnd 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 Then If edo=1 Then 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," □" IfEnd IfEnd If ctrl=29 Then If edo=5 Then 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," □" IfEnd IfEnd WhileEnd ‘W kaŜdym wywołaniu Case moŜna odwołać się do wykonania jakiegoś programu/zdarzenia Switch edo Case 1 PrintNatural Break Case 2 PrintNatural Break Case 3 PrintNatural Break Case 4 PrintNatural Break Case 5 PrintNatural Stop Default Break SwitchEnd WhileEnd "Wykonanie opcji 1" "Wykonanie opcji 2" "Wykonanie opcji 3" "Wykonanie opcji 4" "Wyjście" 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 Locate Locate Locate Locate Locate Locate Locate Locate Locate 0⇒ ⇒I 1⇒ ⇒edo 0⇒ ⇒xe 0⇒ ⇒ye 15, 21,"Opcja 2" 15, 31,"Opcja 3" 15,41,"Opcja 4" 1,11,"■" Komenda GetPen xe,ye wczytuje 1,21,"■" współrzędne punktu ekranu w miejscu 1,31,"■" dotknięcia piórkiem, w zakresie 0<xe<161, 1,41,"■" 0<ye<241. 1,51,"■" UWAGA! Ekran nie pokrywa się z oknem tekstowym – zazwyczaj zaczyna się dla 15,51,T2 ye=132, tak więc kaŜda współrzędna y 1,11,"■" While I≠ ≠1 określona komendą Locate musi być powiększona o 132 i y<241-132=39. Następna instrukcja warunkowa If –IfEnd 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. GetPen xe,ye If 1≤ ≤xe and xe≤ ≤8 and 143≤ ≤ye and ye≤ ≤153 Then 1⇒ ⇒edo 0⇒ ⇒xe 0⇒ ⇒ye 1⇒ ⇒I Locate 1,11,"□" Locate 1,21,"■" Locate 1,31,"■" Locate 1,41,"■" Locate 1,51,"■" IfEnd If 1≤ ≤xe and xe≤ ≤8 and 153≤ ≤ye and ye≤ ≤163 Then 2⇒ ⇒edo 0⇒ ⇒xe 0⇒ ⇒ye 1⇒ ⇒I Locate 1,11,"■" Locate 1,21,"□" Locate 1,31,"■" Locate 1,41,"■" Locate 1,51,"■" IfEnd If 1≤ ≤xe and xe≤ ≤8 and 163≤ ≤ye and ye≤ ≤173 Then 3⇒ ⇒edo 0⇒ ⇒xe 0⇒ ⇒ye 1⇒ ⇒I Locate 1,11,"■" Locate 1,21,"■" Locate 1,31,"□" Locate 1,41,"■" Locate 1,51,"■" IfEnd If 1≤ ≤xe and xe≤ ≤8 and 173≤ ≤ye and ye≤ ≤183 Then 4⇒ ⇒edo 0⇒ ⇒xe 0⇒ ⇒ye 1⇒ ⇒I Locate 1,11,"■" Locate 1,21,"■" Locate 1,31,"■" Locate 1,41,"□" Locate 1,51,"■" IfEnd If 1≤ ≤xe and xe≤ ≤8 and 183≤ ≤ye and ye≤ ≤193 Then 5⇒ ⇒edo 0⇒ ⇒xe 0⇒ ⇒ye 1⇒ ⇒I Locate 1,11,"■" Locate 1,21,"■" Locate 1,31,"■" Locate 1,41,"■" Locate 1,51,"□" IfEnd WhileEnd Switch edo Case 1 PrintNatural Break Case 2 PrintNatural Break Case 3 PrintNatural Break Case 4 PrintNatural Break Case 5 PrintNatural Stop Default Break SwitchEnd WhileEnd "Wykonanie opcji 1" "Wykonanie opcji 2" "Wykonanie opcji 3" "Wykonanie opcji 4" "Wyjcie z programu 5" 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 'LPl() If J=0 Then I+1⇒ ⇒I If I<N+1 Then StrMid T,I,Z,1 'Kodowanie "+a" StrCmp Z,"a",J 547⇒ ⇒Kod LPl() 'Kodowanie "+A" StrCmp Z,"A",J 291⇒ ⇒Kod LPl() 'Kodownie "+e" StrCmp Z,"e",J 557⇒ ⇒Kod LPl() 'Kodowanie "+E" StrCmp Z,"E",J 301⇒ ⇒Kod LPl() 'Kodownie "+o" StrCmp Z,"o",J 532⇒ ⇒Kod LPl() 'Kodowanie "+O" StrCmp Z,"O",J 276⇒ ⇒Kod LPl() 'Kodowanie "+s" StrCmp Z,"s",J 589⇒ ⇒Kod LPl() 'Kodowanie "+S" StrCmp Z,"S",J 333⇒ ⇒Kod LPl() 'Kodowanie "+l" StrCmp Z,"l",J 577⇒ ⇒Kod LPl() 'Kodowanie "+L" StrCmp Z,"L",J 321⇒ ⇒Kod LPl() 'Kodowanie "+z" StrCmp Z,"z",J 605⇒ ⇒Kod LPl() 'Kodowanie "+Z" StrCmp Z,"Z",J 349⇒ ⇒Kod LPl() 'Kodowanie "+x" StrCmp Z,"x",J 604⇒ ⇒Kod LPl() 'Kodowanie "+X" StrCmp Z,"X",J 348⇒ ⇒Kod LPl() 'Kodowanie "+c" StrCmp Z,"c",J 548⇒ ⇒Kod LPl() 'Kodowanie "+C" StrCmp Z,"C",J 292⇒ ⇒Kod LPl() 'Kodowanie "+n" StrCmp Z,"n",J 578⇒ ⇒Kod LPl() 'Kodowanie "+N" StrCmp Z,"N",J 322⇒ ⇒Kod LPl() IfEnd Else StrJoin S,Z,Si Si⇒ ⇒S IfEnd Next Print S ‘Podprogram LPl dekodujący łańcuchy znaków alfanumerycznych na łańcuchy ze znakami polskimi If J=0 Then NumToChr Kod,Pl If J=0 Then NumToChr Kod,Pl StrJoin S,Pl,Si Si⇒ ⇒S IfEndStrJoin S,Pl,Si Si⇒ ⇒S IfEnd