Visual Basic - Lab 14

I denna laboration ska du lära dig att hantera ett användbart ”verktyg” som ingår i Visual Basic: Debuggern. De flesta programmeringsmiljöer innehåller en debugger och i VB är den enkel att använda.

Du ska under laborationen studera ett program som utför så kallad bubbelsortering på ett antal tal i en vektor. Här kommer debuggern väl till pass för att förstå hur ”bubbel”-algoritmen går till. Du kommer också lära dig att skapa menyer.

Efter laborationen ska du kunna/känna till:

  • Sätta in brytpunkter i koden
  • Köra program till brytpunkten
  • Hur man enkelstegar och fortsätta köra programmet
  • Se värden på variabler
  • Använda fönstren ”Immediate Window” och ”Watch Window”
  • Kunna skapa menyer till program
  • Kunna sortera personerna i personregister

Option Explicit
Dim vektor() As Integer 'Håller reda på talen
Dim antal As Integer 'Antal tal som ska skapas och sorteras
Dim antalByten As Integer 'Hur många byten som har gjorts

Private Sub cmdSkapa_Click()

'Läs av hur många som ska skapas
antal = Val(cmbAntal.Text)

'Reservera minne för vektorn
ReDim vektor(antal)

'Generera slumptalen från 0 till 9
Dim i As Integer
For i = 1 To antal

vektor(i) = Int(Rnd * 9) + 1

Next i

'Rensa listan
lstResultat.Clear

'Nollställ antal byten
antalByten = 0

'Visa de osorterade talen
Call Visa

End Sub

Private Sub cmdSortera_Click()

'Genomför bubbelsortering

'Loopvariabler
Dim i As Integer

'Håller reda på om någon förändring skett
Dim bytt As Boolean

'Jämför tal så länge som...
Do
bytt = False

For i = 1 To antal - 1

If vektor(i) > vektor(i + 1) Then

Dim tmp As Integer
tmp = vektor(i)
vektor(i) = vektor(i + 1)
vektor(i + 1) = tmp

bytt = True
antalByten = antalByten + 1

Call Visa

End If
Next i

Loop While bytt '...några tal byter plats

End Sub

Private Sub Visa()

'Skapa en sträng med alla talen i vektorn
Dim talen As String
Dim i As Integer
For i = 1 To antal

talen = talen + " " + Str(vektor(i))

Next i

'Lägg till vilken "flytt" det är
talen = talen + " (" + Str(antalByten) + " )"

'Lägg till strängen med tal i listan
lstResultat.AddItem talen

'Visa antal byten
lblAntalByten = Str(antalByten)

End Sub

Private Sub mnu10_Click()

cmbAntal.Text = "10"
Call cmdSkapa_Click

End Sub

Private Sub mnu5_Click()

cmbAntal.Text = "5"
Call cmdSkapa_Click

End Sub

Private Sub mnu50_Click()

cmbAntal.Text = "50"
Call cmdSkapa_Click

End Sub

Private Sub mnuAvsluta_Click()

End

End Sub

Private Sub mnuSorteraTalen_Click()

Call cmdSortera_Click

End Sub

En vanlig ”uppgift” för datorer och det har forskats en hel del på hur sortering ska göras effektivt. Det finns en mängd algoritmer som är mer eller mindre effektiva. Programmet visar hur ”bubbel”-sortering går till. Bubbelsortering är inte den effektivaste men naturligtvis fungerar den och är relativt lätt att förstå.

Algoritmen går till så att tal jämförs parvis från första till sista talet. Om två tal står i fel ordning, byter man plats på dem. Algoritmen börjar sedan om igen och håller på till dess inga byten har gjorts. Då är sorteringen klar. I laborations program jämförs tal, men det går naturligtvis att sortera det mesta, till exempel strängar som innehåller efternamn.

  1. Starta programmet

  2. Välj i kombinationsrutan hur många tal som ska skapas

  3. Tryck på Skapa talen

Ett antal tal mellan 1 och 9 visas i listrutan.

  1. Tryck på Sortera

Talen sorteras efter algoritmen och programmet skriver ut talen i listrutan efter varje byte. När inga byten längre behöver göras är sorteringen klar och antalet byten visas.

  1. Skapa 50 tal och sortera dessa

  2. ”Skrolla” sedan listboxen uppåt och neråt och se hur de stora talen ”bubblar” åt höger

Brytpunkter

  1. Öppna projektet och leta reda på händelseproceduren cmdSkapa_Click()

  2. Ställ markören på raden med koden:
    vektor(i) = Int(Rnd * 9) + 1

  3. Välj Debug | Toggle Breakpoint

Raden blir röd och får en röd cirkel till vänster och du har skapat en brytpunkt.

Det finns andra sätt att skapa och ta bort brytpunkter.

  1. Klicka på den röda cirkeln och brytpunkten är borta

  2. Klicka på samma ställe igen och den är där igen

  3. Tryck på [F9] och den försvinner

  4. Se till att du har en brytpunkt på ovan angivna rad och starta programmet

  5. Klicka på Skapa talen

Programmet utför alla instruktioner fram till den där brytpunkten är och stannar sedan och väntar.

Enkelstega

  1. Välj Debug | Step Over

eller

  1. Håll [Shift] nere och tryck sedan på [F8]

Programmet utför en kodrad och väntar på att du ska göra något mer.

  1. Enkelstega tre gånger till

Studera variabler

  1. Ställ muspekaren över variabeln i och se vad som händer

Du bör få fram en liten ruta som talar om att i har värdet 3.

  1. Kontrollera vad variabeln antal har för värde

Den bör vara 5.

  1. Ställ muspekaren över variabeln vektor

Nu visas det värde som vektorn har på positionen i. Den bör vara 6.

Immediate Window
Det är inte alltid du har just den variabel du vill studera så enkelt åtkomlig. I såna fall kan du behöva använda fönstret Immediate.

  1. Öppna det genom View| Immediate Window

  2. Skriv in följande och tryck [Enter]
    print vektor(2)

Nu visas innehållet i vektorn på position 2.

Watch Window
Ibland vill man följa en variabels förändring under tiden man enkelstegar programmet. Då är Watch Window utmärkt att använda. För att det ska fungera måste du ”tala om” för debuggern vilka variabler som du vill studera.

  1. Stoppa programmet och ta bort alla brytpunkter via Debug | Clear All Breakpoints

  2. Leta rada på händelseproceduren cmdSortera_Click()

  3. Öppna fönstret Watch genom View | Watch Window

Dags att lägga till den variabel du vill studera.
  1. Markera vektor(i) och högerklicka på markeringen

  2. Välj Add Watch… och klicka sedan OK

Nu dyker variabeln upp i fönstret.
  1. Gör på samma sätt med vektor(i+1)

  2. Lägg också till variabeln i

  3. Sätt in en brytpunkt på raden med koden:
    If vektor(i) > vektor(i + 1) Then

  4. Starta programmet

  5. Skapa talen och tryck Sortera

Programmet stannar på raden med brytpunkten och du kan se variablernas värden i fönstret Watch.

  1. Enkelstega sakta fyra steg och se samtidigt hur de två värdena byter plats i vektorn

  2. Fortsätta att köra programmet

  3. Tryck nu på knappen Play igen

Programmet fortsätter och i det här fallet tills den stöter på samma brytpunkt. Om det inte finns någon brytpunkt fortsätter den tills programmet är slut eller tills det krävs någon inmatning från användaren.

  1. Enkelstega igen och se hur värdena byter plats

Observera att du samtidigt som du debuggar kan se programmets utmatning.

  1. Växla till programmet med [Alt] + [Tabb]

Step Over/Step Into

  1. Stoppa programmet men behåll brytpunkten

  2. Starta, skapa talen och klicka på Sortera

  3. Enkelstega till dess raden med följande kod blir markerad (gul):
    Call Visa

Nu har du två (minst) möjligheter. Du kan välja att enkelstega vidare i den procedur du är i eller ”gå in i” proceduren Visa.

  1. Välj Debug | Step Into och enkelstega i proceduren Visa

eller

  1. Välj Debug | Step Over utförs proceduren Visa, men du enkelstegar fortfarande i proceduren cmdSortera

Menyer
För att göra program mera lättanvända brukar man se till att det finns menyer. Där grupperar man de kommandon som hör ihop under olika menyer. Du ska nu lära dig skapa de menyer som du ser i programmet bubbel.exe.

  1. Se till att formuläret är öppet

  2. Starta verktyget ”Menu Editor”

Menyer liksom knappar har egenskaperna Caption (det som ska synas) och Name (referens till kontrollen). När du matar in Caption kan du på lämpligt ställe skriva ett ”&” och får på så sätt en snabbfunktion till menyalternativet. Du kan också ge alternativet en ”shortcut” (jfr med Visual Basic:s Run | Start som har [F5] som ”shortcut”).

  1. Skriv in &Arkiv som Caption och mnuArkiv som Name

  2. Klicka på Next och sedan på högerpilen

  3. Skriv &Avsluta som Caption och mnuAvsluta som Name

  4. Välj Ctrl-X som Shortcut och klicka sedan på OK

  5. Välj Arkiv | Avsluta i formuläret och hamnar i händelseproceduren mnuAvsluta_Click()

  6. Skriv End i proceduren

  7. Starta sedan programmet och prova

  8. Prova också Ctrl X

  9. Skapa nu samma menyer som finns i bubbel.exe

Observera att händelseproceduren Sortera | Sortera bara behöver anropa den redan skrivna händelseproceduren cmdSortera_Click(), vilken utför jobbet. Du behöver ska inte kopiera koden.

När du gör menyn som skapar talen finns också själva skapandet redan gjort. Däremot måste du se till så att kombinationsrutan får rätt värde för respektive menyval.

Fler uppgifter:

  1. Modifiera programmet så att talen sorteras i omvänd ordning

  2. Ändra så att de tal som skapas ligger mellan 1 och 99

Lösning Lab 14 - 1

Lösning Lab 14 - 2