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:

- Skapa ett nytt projekt i en ny mapp (välj lämpliga namn)
- Skapa en knapp för att slumpa och en knapp för att nollställa
- 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.
- Ö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.
- 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
- 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.
- 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.
- Skapa en textruta som ska visa hur många ettor som har slumpats
fram och namnge den
- Markera den nyss skapade textrutan och kopiera den genom att tryck
[Ctrl] + [C]
- 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)
- 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.
- 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.
- 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
- Provkör och se till att det fungerar
- Kontrollera att nollställningsfunktionen fungerar
Slumpa flera åt gången – U1
- Skapa en kombinationsruta där användaren kan välja
hur många tal som ska slumpas vid varje tryckning
- 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.
- Fixa ovanstående
- Starta Aktivitetshanteraren och titta på Prestanda
- 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.
- Skapa en ny Control Array av textrutor
- Se till att procenttalen visas i dessa efter varje tryck på
slumpknappen
- 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.
- 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
- Skapa en Control Array
med sex rektanglar på samma sätt som tidigare
- Se till att de ändrar höjd i förhållande till
frekvensen
- 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.
- Färglägg den högsta stapeln med en färg och den
lägsta med en annan. (se programmets U4)
- 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 |