Program.pdf

(137 KB) Pobierz
W programie są zdefiniowane następujące zmienne widziane w całej aplikacji:
Opis programu Kalkulator
W programie są zdefiniowane następujące zmienne widziane w całej aplikacji:
Private Wpis As Stack
Private WpisK As Queue
Private PamiecS As Stack
Private PamiecQ As Queue
Private DaneQ As Queue
Private BPusty As Boolean = True
Private txtWpis As String
Private SystemD As Boolean
Private Operator As Byte = 0
Private PierwszyOperator As Boolean
Private WynikChwilowy As Double
Liczby są wprowadzane do kalkulatora poprzez naciskanie odpowiednich klawiszy na
formularzu. Do każdego klawisza jest przypisana odpowiednia procedura zdarzenia, np.
wciśnięcie przycisku „2”.
Private Sub btn2_Click( ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btn2.Click
Wpis.Push("2")
Wczytanie na stos Wpis liczby 2.
WpisK.Enqueue("2")
Wczytanie do kolejki WpisK liczby 2.
If BPusty Then
lblPoleWpis.Text = Wpis.Peek
BPusty = False
– Sprawdzenie, czy etykieta lblPoleWpis jest pusta jeżeli tak, to odczytywany jest pierwszy
element ze stosu (a dokładnie z jego wierzchołka) bez jego usunięcia (metoda Peek ).
Else
lblPoleWpis.Text = lblPoleWpis.Text & Wpis.Peek
Gdy etykieta nie jest pusta, do znajdującego się tam łańcucha znaków jest dodawany
element z wierzchołka (odczyt bez usuwania – także metoda Peek ).
End If
End Sub
Podobnie działają wszystkie klawisze numeryczne (oraz klawisz przecinka), które umożliwiają
wprowadzenie wartości liczbowej do kalkulatora.
Klawisze odpowiedzialne za wybór działania powinny:
- wybrać, jakie działanie ma być wykonane;
- wykonać poprzednie działanie, np. w kolejności wciskania:
3
*
3
+
-> Zwracany jest wynik 9, do którego będzie dodana następna wartość.
Każde z działań ma swój kod.
Private Sub btnOdejmij_Click( ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnOdejmij.Click
WykonajDzialanie("-")
Wywoływana jest procedura WykonajDzialanie z parametrem „-„.
Operator = 2
Zapamiętany zostanie kod ostatniej operacji w zmiennej widzianej w całym programie (kod 2
oznacza odejmowanie).
End Sub
Kluczem do obliczeń jest procedura WykonajDzialanie , która wygląda następująco:
Private Sub WykonajDzialanie( ByVal znak As String )
Dim DblLiczba As Double
Dim strLiczba As String = ""
Dim dblWynik As Double
If Not BPusty Then
BPusty = True
Do While WpisK.Count <> 0
strLiczba = strLiczba & WpisK.Dequeue
Loop
Pobranie znaków z kolejki i utworzenie łańcucha znaków, który będzie konwertowany na
liczbę.
DblLiczba = CDbl (strLiczba)
PamiecS.Push(strLiczba)
PamiecQ.Enqueue(strLiczba)
PamiecS.Push(znak)
PamiecS - pamięć oparta na stosie.
PamiecQ.Enqueue(znak)
PamiecQ - pamięć oparta na kolejce.
DaneQ.Enqueue(DblLiczba)
Zapamiętanie wprowadzonej liczby i znaku w kolejce i na stosie (dzięki temu będzie można
odtwarzać wykonywane działania).
If Operator <> 0 Then
If Operator = 1 Then
dblWynik = DaneQ.Dequeue + DaneQ.Dequeue
End If
If Operator = 2 Then
dblWynik = DaneQ.Dequeue - DaneQ.Dequeue
End If
If Operator = 3 Then
dblWynik = DaneQ.Dequeue * DaneQ.Dequeue
End If
If Operator = 4 Then
dblWynik = DaneQ.Dequeue / DaneQ.Dequeue
End If
If Operator = 5 Then
Operator = 0
End If
W przypadku gdy wciśniemy znak „=” wartość zmiennej Operator jest ustawiana na 0 (by
nie pamiętała żadnego działania)
W zależności od wartości zmiennej Operator wykonywane jest odpowiednie działanie
i zapamiętywany wynik.
lblPoleWpis.Text = dblWynik
DaneQ.Clear()
DaneQ.Enqueue(dblWynik)
PamiecS.Push(dblWynik)
PamiecQ.Enqueue(dblWynik)
Wynik jest wyświetlany w kontrolce i jednocześnie zapamiętywany w pamięci kolejki i stosu.
End If
End If
End Sub
Wyświetlanie wykonywanych operacji jest możliwe dzięki zapamiętywaniu każdej wartości i
symbolu działania w kolejce i na stosie.
Private Sub btnDoTylu_Click( ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnDoTylu.Click
lblPoleWpis.Text = ""
lblPoleWpis.Text = PamiecS.Pop
If PamiecS.Count = 0 Then
MessageBox.Show("pamięć pusta")
End If
End Sub
Odtwarzanie do tyłu odbywa się dzięki odczytywaniu elementów ze stosu PamiecS . Trzeba
pamiętać, że pobranie elementu ze stosu powoduje jego usunięcie, czyli jest to operacja
wykonywana jednokrotnie. Podobnie wygląda procedura odczytywania działań od początku,
oparta na kolejce PamiecQ .
Private Sub btnDoPrzodu_Click( ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnDoPrzodu.Click
lblPoleWpis.Text = ""
lblPoleWpis.Text = PamiecQ.Dequeue
If PamiecQ.Count = 0 Then
MessageBox.Show("pamięć pusta")
End If
End Sub
Dzięki zmiennym PamiecQ i PamiecS nasz kalkulator otrzymał pamięć pozwalającą
odtworzyć wykonywane czynności (oczywiście jest to duże uproszczenie ponieważ w trakcie
przeglądania nasza pamięć jest czyszczona, tak więc odtworzenie jest możliwe tylko jeden
raz)
Ostatnie funkcje tego kalkulatora to konwersja pomiędzy systemem dziesiętny a binarnym
i odwrotnie.
Zamiana z systemu dziesiętny na binarny:
Private Sub btnDziesietnyNaBinarny_Click( ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles btnDziesietnyNaBinarny.Click
Dim intLiczba As Integer
Dim intReszta As Integer
Dim Binarna As Stack
If SystemD Then
Binarna = New Stack()
Zainicjowanie nowego stosu Binarna .
lblBinarny.Text = ""
intLiczba = CInt (lblPoleWpis.Text)
Do While intLiczba <> 0
Binarna.Push((intLiczba Mod 2))
Reszta z dzielenia przez 2 jest wrzucana na stos Binarna .
intLiczba = intLiczba \ 2
Loop
Do While Binarna.Count <> 0
lblBinarny.Text = lblBinarny.Text & Binarna.Pop
Loop
Odczyt ze stosu umieszczonych na nim wartości i umieszczenie ich w etykiecie lblBinary
End If
End Sub
W procedurze zamieniającej liczbę binarną na dziesiętną można wykorzystać dwa algorytmy –
klasyczny z kolejnymi potęgami liczby 2 lub z wykorzystaniem schematu Hornera.
Private Sub btnNaDziesietny_Click( ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnNaDziesietny.Click
I algorytm
Zamiana liczby binarnej na dziesiętną, w której nie został użyty schemat Hornera z danymi
pobieranymi ze stosu .
Dim intLiczbaD As Integer = 0
Dim potega As Byte = 0
If Not SystemD Then
While Wpis.Count <> 0
intLiczbaD = intLiczbaD + 2 ^ potega * Wpis.Pop
potega += 1
Zgłoś jeśli naruszono regulamin