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