Visual Basic - Lab 12

I den här laborationen ska du skapa en applikation (ett program) som använder sig av slumptalsfunktionen. Programmet ska slumpa fram ett tal mellan 1 och 6, bearbeta detta på något sätt och sedan presentera frekvensen för respektive tal, det vills gaä hur många 1:or, 2:or och så vidare det blev. Du kommer också att träna en hel del på for…next-strukturer. Efter laborationen ska du:

  • kunna använda en datastruktur som kallas vektor eller på engelska array
  • kunna använda Control Arrays
  • kunna använda kontrollen Shape

Vektorer – Arrays
Du har hittills använt variabler av typen Integer, Long, Single, Double, String och kanske några fler. Det ska du göra i den här laborationen också. Däremot ska du använda dem så att du kan hantera en grupp av till exempel heltal. Det går också att hantera objekt på formuläret, till exempel textrutor, som en grupp.

Så här deklarerar du ett heltal.
Dim x As Long

Vill du däremot deklarera en vektor (array) med heltal skriver du:
Dim frekvens(5) As Long

Du har nu reserverat plats (i datorns minne) för sex stycken heltal av typen Long. Själva heltalen får olika nummer. I det här fallet 0 till och med 5. Här följer några sätt, riktiga och felaktiga, att tilldela dessa heltal olika värden.

frekvens(0) = 3
'Ger det första talet i vektorn värdet 3

frekvens(5) = 7
'Ger det sista talet värdet 7

frekvens = 3
'FEL! Du måste ange vilket av talen som ska få ett värde.

frekvens(7) = 3
'FEL! Nummer 7 finns inte

frekvens(2) = frekvens(2) + 1
'Ökar det tredje talet med 1

Text1.Text = Str(frekvens(3))
'Visar det 4:e talet i textrutan

Uppgift 1 - Räkna frekvens:

  1. Skapa ett nytt projekt i en ny mapp (välj lämpliga namn)

  2. Skapa en knapp för att slumpa och en knapp för att nollställa

  3. Skapa en textruta som ska visa totala antalet slumpade tal

Först ska du deklarera några variabler som kan nås från alla procedurer i det aktuella formuläret.

  1. Öppna kodfönstret och skriv in följande:
    'Tvingar en att deklarera alla variabler
    Option Explicit

    'Håll reda på antalet 1:or till 6:or
    Dim frekvens(5) As Long


    'Håll reda på antalet kast
    Dim antalKast As Long

Innan programmet börjar användas ska du se till att alla variabler är initierade till rätt värde. I det här fallet ska de vara nollställda. Till det använder du naturligtvis nollställningsknappens händelseprocedur.

  1. Dubbelklicka på nollställningsknappen och skriv in följande kod:
    Dim i As Integer
    'Loop-variabel

    'Nollställ 'frekvens'-vektorn

    For i = 0 To 5

    frekvens(i) = 0  

    Next i

    'Nollställ antalet kast
    antalKast = 0

  2. Dubbelklicka på formuläret någonstans eller välj händelseproceduren Form_Load och skriv in följande kod (Observera att du troligtvis har ett annat namn på knappen)

    'Nollställ genom att anropa 'Nollställ'-knappen
    Call cmdClr_Click

Det sista du skrev gör att nollställning sker när formuläret startas och när du trycker på nollställningsknappen. Precis som vi vill ha det funktionellt och själva nollställningen finns bara på ett ställe.

Dags att skriva koden som slumpar fram ett tal.

  1. Dubbelklicka på slumpknappen och skriv följande:
    'Skapa ett slumptal: 1, 2, 3, 4, 5 eller 6

    Dim slump As Integer

    slump = Int(Rnd * 6 + 1)

    'Öka med 1 just den frekvens som 'slump' blev

    frekvens(slump - 1) = frekvens(slump - 1) + 1

Varje gång du klickar på slumpknappen körs koden ovan och ett nytt slumptal genereras och lagras i frekvens-vektorn. Observera att det står slump – 1. Det beror på att vektorn med sex platser är numrerad från 0 till 5. Observera också att koden är ganska kort men ändå utför ganska mycket.

Dags att presentera resultatet vilket också kan göras på ett ”listigt” sätt.

  1. Skapa en textruta som ska visa hur många ettor som har slumpats fram och namnge den

  2. Markera den nyss skapade textrutan och kopiera den genom att tryck [Ctrl] + [C]

  3. Tryck [Ctrl] + [C] och svara Ja på frågan om du vill skapa en Control Array (Observera vilka namn den första och den nya textrutan har)

  4. Tryck [Ctrl] + [V] ytterligare fyra gånger och placera textrutorna sedan från vänster till höger med textrutan vars namn är "textrutans namn" (0) först och "textrutans namn" (5) sist

Nu har du skapat sex textrutor som heter nästa likadant. Du kommer åt de genom att ange aktuellt nummer inom parentesen.

Dags att visa resultatet av slumpandet. Det bästa här är att skapa en generell procedur som du sedan anropar från lämpliga ställen.

  1. Skapa en generell procedur och skriv in följande kod. (Du måste nog ändra något i koden nedan. Namnen på textrutorna stämmer nog inte med dina namn)

    Dim i As Integer    'Loop-variabel

    'Skriv det nya antalen i textrutorna

    For i = 0 To 5

    txtFrekvens(i).Text = Str(frekvens(i))     'Ta värdet från 'frekvens'-vektorn

    Next i

    'Skriv totala antalet kast

    txtTotal.Text = Str(antalKast)

Nu måste du anropa proceduren från lämpliga ställen. Den ska naturligtvis anropas från slumpknappens händelseprocedur men det är lämpligt att anropa även från nollställningsproceduren.

  1. Skriv på respektive ställe något i stil med: (Update är här namnet på den procedur som du just har skapat. Byt om det behövs.)

    Call Update

  2. Provkör och se till att det fungerar

  3. Kontrollera att nollställningsfunktionen fungerar

Slumpa flera åt gången – U1

  1. Skapa en kombinationsruta där användaren kan välja hur många tal som ska slumpas vid varje tryckning

  2. Se till att det antal tal som valts verkligen slumpas när knappen trycks ned

Tipset är att använda en for…next-struktur för att göra slumpningen det aktuella antalet gånger som är valt. Själv slumpningen och lagringen av resultatet har du redan har skrivit.

Om du väljer ett stort tal, kanske 1 000 000, kommer det att ta en liten stund för programmet att utföra alla beräkningar. För att användaren ska förstå att programmet ”jobbar” brukar man byta symbol på markören. Istället för den vanliga symbolen (en pil) visas ofta ett timglas under tiden programmet är upptaget. När det är klart ska symbolen bytas ut mot den vanliga igen.

  1. Fixa ovanstående

  2. Starta Aktivitetshanteraren och titta på Prestanda

  3. Starta ditt program med ett stort tal typ 10 000 000 och kontrollera om processorn får jobba

Visa procent – U2
Intressantare än att visa antalet är kanske att frekvensen visas i procent av det totala antalet.

  1. Skapa en ny Control Array av textrutor

  2. Se till att procenttalen visas i dessa efter varje tryck på slumpknappen

  3. Nollställningsknappen ska påverka innehållet i procent-textrutorna så det är lämpligt att lägga koden för detta i den generella procedur som ovan kallades Update

Staplar – U3
”En bild säger mer än tusen ord” heter det ju. Stämmer kanske men ett diagram kan i alla fall förtydliga resultatet här. Stapeldiagram passar bra och i Visual Basic kan du använda kontrollen Shape för detta.

  1. Skapa en rektangel och prova på att ändra egenskaperna (till exempel FillColor, FillStyle och Shape) så att du får det utseende du vill ha

  2. Skapa en Control Array med sex rektanglar på samma sätt som tidigare

  3. Se till att de ändrar höjd i förhållande till frekvensen

  4. Lägg också denna kod i Update

Fundera på:

  • Varför är det lämpligt med datatypen Long istället för Integer för att hålla reda på antalet.
  • Hur skulle du lösa uppgiften om du inte hade använt vektorer och Control Arrays?
  • Vilken typ av kod har du lagt i proceduren Update? Varför ligger den där?
  • Vad händer med frekvensen om du kör väldigt många slumptal? Vad är sannolikheten att få en 6:a om du inte har fått så många hittills?

Extra uppgifter:

Färger kan också förtydliga.

  1. Färglägg den högsta stapeln med en färg och den lägsta med en annan. (se programmets U4)

  2. Gör så att den högsta stapeln alltid använder så mycket av skärmen som möjligt (se programmets U5)

Lösning Lab 12