Gå til innhold

Hvordan lage en VB-counter?


Anbefalte innlegg

I dag hadde vi prøve i INB (VB-faget på skolen vår), og vi fikk tre ganske simple oppgaver:

 

a) Lag en meny for følgende oppgaver (b og c)

b) Lag et program der du skriver inn et tall, for eksempel 5 og får skrevet ut 5-gangen. Brukeren skal kunne velge hvilken tall han ønsker å skrive ut.

c) Lag et program for nedtelling. Du oppgir antall sekunder du ønsker å telle ned. For å forenkle litt så sier vi at maskina beregner 1000 tall per sekund. Tallene skal hele tiden vises på skjermen under nedtellingen. En melding skrives ut når nedtellingen er ferdig.

 

De to første gikk bra, men så kom jeg til den siste. Vi har ikke lært timer-funksjonen i VB, så den er utelukket. Oppgaven skal kun løses ved hjelp av løkker. Jeg ser for meg at det må bli en while-løkke med en for-setning i. While-løkken skriver ut tallene man vil ha på skjermen (eksempel: skriver man inn 3, vil man få ut 2, 1, 0 etter tre sekunder). For-løkken må telle til 1000 fordi maskina regner ifølge oppgaven ut 1000 tall i sekundet. Stemmer egentlig dette for alle maskiner? Jeg tenkte dette kom veldig an på prosessoren.

Kan noen hjelpe meg litt med denne oppgaven? Prøven er ferdig, og det er ingenting å gjøre noe med, men jeg hater å ikke få til ting!

Her er hva jeg har gjort til nå:

 

Option Explicit

 

Private Sub cmdTell_Click()

'deklarerer variabler

Dim tall, i As Currency

 

'validerer tekstboksen

tall = Val(txtTall)

 

'når tallet ikke er null -->

While tall <> 0

'teller ned

tall = tall - 1

 

'teller opp til tusen per runde <-- det er her det blir feil!

For i = 0 To 1000

i = i + 1

Next

 

'skriver ut tallet til formen

Form1.Print tall

Wend

End Sub

Lenke til kommentar
Videoannonse
Annonse
Hvorfor kan du ikke bare bruke timer? sette intervall til 1000 så får du nedtelling en gang i sekundet, i timer koden skriver du teller=teller-1 og skriver ut teller hvert sekund

5172881[/snapback]

Beklager, men jeg glemte å tilføye at oppgaven SKAL løses med løkker.

Lenke til kommentar

Du ma nokk bruke lokker, men hastigheten pa en maskin for og telle til 10000 varierer fra gang til gang...

 

 

Vis du har vert borti Windows API kan du bruke Sleep funksjonen, som for hele programet til og 'sove', ergo:

 

Dim X as long
For X = 3 to 1 step -1
        Print X
        Sleep 1000 ' 1sec.
next x

Denne koden vil ga fra 3 til 0 og skrive det til skjermen

 

Dim X as long, Y as long
For X = 3 to 1 step -1
        Print X
        For Y = 0 to 1000
                'Vis maskinen bruker 1 secund for og telle fra 0 til 1000...
       next Y
next x

Endret av Richard87
Lenke til kommentar
(...)
 While(TmpTime > Timer()) : DoEvents : Loop ' Samme som sleep funksjonen, men uten api kall

 

Bemerk at denne koden er særdeles lite resusssparende. Du risikerer å bruke 100% av CPU-en kun for å vente på neste beregning. I tillegg kan du ikke benytte Loop-nøkkelordet i denne konteksen - det riktige er Wend.

Lenke til kommentar

Takk for svar. I dag fikk vi tilbake prøvene, og resultatet var absolutt ikke uforutsett. Jeg fikk god, god på oppgave a og b, men oppgave c var jeg ikke helt ferdig med.

Læreren gikk gjennom prøven, og jeg var svært spent på løsningen på oppgave c. Da vi kom dit viste det seg at heller ikke læreren fikk til denne oppgaven vha løkker, og min hinting tidligere i denne posten om at det absolutt ikke er gitt at en hvilken som helst PC regner ut 1000 tall i sekundet inntraff.

Det viste seg at en elev i klassen hadde gjort denne oppgaven vha bruk av timer, noe som ikke er pensum i boka vår. Eleven fant oppgaven som et eksempel i VB 6.0 i praksis-boka, noe som selvfølgelig var bra for han. Vi bruker ikke den boken da denne ikke selges lengre (tror jeg), og i stedet bruker vi en svært mye tynnere bok fra et lite, ukjent forlag. Pensum til nå har vært operatorer, løkker, brukergrensesnitt og test-setninger.

Etter at det ikke lyktes for læreren å gjøre oppgaven slik det står i oppgaveteksten, begynte han å løse den ved bruk av timer etter elevens, altså bokens, eksempel. Læreren hadde lite/ingen erfaring med bruk av dette, og det vistes at han ikke kunne det særlig godt. Slik løste han oppgaven, og elevene fikk ingen beklagelse på oppgavens oppbygning.

Jeg fikk 5 på denne prøven, men hadde altså ikke mulighet til å få 6 gjennom å bruke pensum. Jeg prøvde mange ulike måter å løse denne oppgaven på under prøven, men ingen lyktes (jeg var inne på lærerens løsning vha to løkker som han tenkte var riktig).

Hva synes dere jeg/vi bør gjøre? Jeg synes det er trist at mange i klassen som kanskje ikke har like stor forståelse av faget som meg blir sittende igjen med toere og treere bare på grunn av en oppgave som er umulig å løse ved bruk av det vi har lært.

Håper å få noen saklige, gode svar, og også en avkreftelse/bekreftelse på om det er mulig å bruke løkker til en slik oppgave slik at den er universiell for alle PC'er.

Lenke til kommentar
Wend er noe som henger igjen fra QuickBasic, men fordi jeg har skrevet så mye C++ i det siste, skrev jeg det slik, det skulle stå Do While

 

Dim tall, i As Currency
forresten, tall blir varaint, det er ikke C du skriver :) du må skrive Dim tall As Currency, i As Currency.

5191015[/snapback]

 

Så man kan ikke skrive "dim variabel1, variabel2 as (en type)" altså? Har sett at det ble gjort et sted, så jeg tenkte det kunne gjøres slik :hmm:

Lenke til kommentar
Takk for svar. I dag fikk vi tilbake prøvene, og resultatet var absolutt ikke uforutsett. Jeg fikk god, god på oppgave a og b, men oppgave c var jeg ikke helt ferdig med.

Læreren gikk gjennom prøven, og jeg var svært spent på løsningen på oppgave c. Da vi kom dit viste det seg at heller ikke læreren fikk til denne oppgaven vha løkker, og min hinting tidligere i denne posten om at det absolutt ikke er gitt at en hvilken som helst PC regner ut 1000 tall i sekundet inntraff.

Det viste seg at en elev i klassen hadde gjort denne oppgaven vha bruk av timer, noe som ikke er pensum i boka vår. Eleven fant oppgaven som et eksempel i VB 6.0 i praksis-boka, noe som selvfølgelig var bra for han. Vi bruker ikke den boken da denne ikke selges lengre (tror jeg), og i stedet bruker vi en svært mye tynnere bok fra et lite, ukjent forlag. Pensum til nå har vært operatorer, løkker, brukergrensesnitt og test-setninger.

Etter at det ikke lyktes for læreren å gjøre oppgaven slik det står i oppgaveteksten, begynte han å løse den ved bruk av timer etter elevens, altså bokens, eksempel. Læreren hadde lite/ingen erfaring med bruk av dette, og det vistes at han ikke kunne det særlig godt. Slik løste han oppgaven, og elevene fikk ingen beklagelse på oppgavens oppbygning.

Jeg fikk 5 på denne prøven, men hadde altså ikke mulighet til å få 6 gjennom å bruke pensum. Jeg prøvde mange ulike måter å løse denne oppgaven på under prøven, men ingen lyktes (jeg var inne på lærerens løsning vha to løkker som han tenkte var riktig).

Hva synes dere jeg/vi bør gjøre? Jeg synes det er trist at mange i klassen som kanskje ikke har like stor forståelse av faget som meg blir sittende igjen med toere og treere bare på grunn av en oppgave som er umulig å løse ved bruk av det vi har lært.

Håper å få noen saklige, gode svar, og også en avkreftelse/bekreftelse på om det er mulig å bruke løkker til en slik oppgave slik at den er universiell for alle PC'er.

5190907[/snapback]

 

[off-topic]

Med mindre du utmerket deg særdeles godt, skal du heller ikke få 6, men 5.

 

Men uansett, at læreren deres er så dårlig et fag han/hun underviser i, synes eg er særdeles urovekkende. Eg (og sikkert mange andre) kunne såpass på ungdomsskolen(men nå er også spesielt interesert).

 

Den oppgaven synes eg faktisk dere skulle klagd mere på.

 

Litt av poenget med skole, er å lære. Og når læreren gir dere oppgaver dere ikke klarer å løse, så skal læreren lære dere hvordan. Og i dette tilfellet klarer ikke læreren det.

[/off-topic]

Lenke til kommentar
Med mindre du utmerket deg særdeles godt, skal du heller ikke få 6, men 5.

5191546[/snapback]

Jeg må bare presisere at jeg er greit fornøyd med karakteren min ut fra omstendighetene, men det du sier om at man er nødt til å utmerke seg er jeg uenig i. Så lenge man viser at man kan, forstår og kan anvende pensum i ulike situasjoner mener jeg at man skal få 6, men det er ikke det jeg er ute etter å diskutere nå.

Det jeg vil frem til, og som du også nevner, er at en oppgave som ikke kan løses er et feilaktig grunnlag til å sette en karakter på. Kan du/noen konfirmere at denne oppgaven ikke kan løses ut fra denne oppgaveteksten, og kun vha løkker (evt annet fra vårt pensum)?

Lenke til kommentar
Med mindre du utmerket deg særdeles godt, skal du heller ikke få 6, men 5.

5191546[/snapback]

Jeg må bare presisere at jeg er greit fornøyd med karakteren min ut fra omstendighetene, men det du sier om at man er nødt til å utmerke seg er jeg uenig i. Så lenge man viser at man kan, forstår og kan anvende pensum i ulike situasjoner mener jeg at man skal få 6, men det er ikke det jeg er ute etter å diskutere nå.

Det jeg vil frem til, og som du også nevner, er at en oppgave som ikke kan løses er et feilaktig grunnlag til å sette en karakter på. Kan du/noen konfirmere at denne oppgaven ikke kan løses ut fra denne oppgaveteksten, og kun vha løkker (evt annet fra vårt pensum)?

5193141[/snapback]

 

I utgangspunktet vil eg si at med deres utgangspunkt vil det være vanskelig/umulig for dere å løse den oppgaven. Og derav vil eg tro karakter 6 kommer inn ;)

 

I alle mine år har karakter 6 vært for de som klarer oppgaven, og utmerker seg litt i tillegg. Mulig dette er forskjell fra skole til skole. Mye annet er det.

 

Men har du prøvd GeirGrusom sitt eksempel? Dette skal fungere, dog er det korrekt at det vil presse CPU'en litt. Men det var vel ikke et krav at dere ikke skulle gjøre det? Mao, det vil løse oppgaven.

Lenke til kommentar

Fikk til det ved å bruke Timer() ja. Har ikke lært om DoEvents, og jeg klarer ikke helt å forstå koden. Hva skjer her?

TmpTime = Timer() + 1
While (TmpTime > Timer()): DoEvents: Wend

Takker nok engang for svar

Endret av mack_
Lenke til kommentar
Fikk til det ved å bruke Timer() ja. Har ikke lært om DoEvents, og jeg klarer ikke helt å forstå koden. Hva skjer her?
TmpTime = Timer() + 1
While (TmpTime > Timer()): DoEvents: Wend

Takker nok engang for svar

5193537[/snapback]

 

Eg tenker på å ikke bruke Timer.

 

Dvs, en kombinasjon med løkker, sleep og doevents.

Det skal gå, om en mer krevende for CPU'en.

Lenke til kommentar
Var det ikke eksempelet til GeirGrusom du sa da? Der er akkurat det der en del av koden.

5194281[/snapback]

 

Beklager, nå roter eg litt her :blush:

 

Eg blandet litt mellom GeirGrusom og Richard87.

Richard87's forslag vil fungere, litt avhengig av om dere har lov til å bruke API

funksjoner.

 

Men en liten ide eg fikk. Hva med å sjekke klokka? Ei løkke som sjekker om det har gått et sekund siden sist?

 

Følgende kode bruker tiden for å sjekke om det er et sekund siden sist gang. Eg har satt opp to knapper, som kalles cmdStart og cmdStopp, og en tekstboks som kalles txtTid, og en som heter txtAntall, som viser antall ganger løkken kjører.

 

Løkken og test-setningene er det viktigste du må se på. Ellers skriver denne bare ut tiden hvert sekund, dersom den har forandret seg.

 

Public bolStopp As Boolean
Public lngAntall As Long

Private Sub cmdStart_Click()
 Dim timTid As Date
 Dim lngSekund As Long
 Dim bolStartet As Boolean
 
 cmdStart.Enabled = False
 cmdStopp.Enabled = True
 Do While bolStopp = False
   lngAntall = lngAntall + 1
   txtAntall.Text = lngAntall
   If bolStartet = False Then
     timTid = Now()
     bolStartet = True
   Else
     If Second(timTid) <> lngSekund Then
       txtTid.Text = timTid
     End If
     lngSekund = Second(timTid)
     timTid = Now
   End If
   DoEvents
 Loop
End Sub

Private Sub cmdStopp_Click()
 bolStopp = True
 cmdStart.Enabled = True
 cmdStopp.Enabled = False
End Sub

Lenke til kommentar

Er det bare meg som har misforstått? Hintet om at maskinen regner 1000 ganger i et sekund er jo ikke til å ta feil av: Dette skal brukes for å finne sekundene.

 

Da kan man jo bruke en funksjon á la dette:

Private Sub CountDown()

        Dim sngStart As Single = txtStartSec.Text

        sngStart = sngStart * 1000

        Dim i As Integer = 0

        Do Until sngStart = 0

            'Siden din datamaskin regner fortere enn 1000 operasjoner pr. sec, så må dette til. Kan sløyfes i innlevering.

            Sleep(10)

 

            'Finner den nye verdien

            sngStart = sngStart - 1

 

            'Viser sekunder igjen med et decimal

            txtOut.Text = Strings.Left(CStr(sngStart / 1000), InStr(CStr(sngStart / 1000), ",") + 1)

            Application.DoEvents() 'Må til for å oppdatere formen

        Loop

    End Sub

End Sub

Lenke til kommentar
Er det bare meg som har misforstått? Hintet om at maskinen regner 1000 ganger i et sekund er jo ikke til å ta feil av: Dette skal brukes for å finne sekundene.

 

Da kan man jo bruke en funksjon á la dette:

 

5194968[/snapback]

 

Hvordan kan du være sikker på dette?

 

Løkken eg lagde viser ulikt antall utførsler fra maskin til maskin.

Mao, ulik hastighet = ulik antall utførsler.

Lenke til kommentar
Er det bare meg som har misforstått? Hintet om at maskinen regner 1000 ganger i et sekund er jo ikke til å ta feil av: Dette skal brukes for å finne sekundene.

 

Da kan man jo bruke en funksjon á la dette:

 

5194968[/snapback]

 

Hvordan kan du være sikker på dette?

 

Løkken eg lagde viser ulikt antall utførsler fra maskin til maskin.

Mao, ulik hastighet = ulik antall utførsler.

5195193[/snapback]

 

Riktig. Derfor har de spesifisert at maskinen som denne nedtellingen skal kjøre på regner 1000 ganger i sekundet.

 

Jeg er ikke "bombesikker". Men ettersom dette er en skoleoppgave, vil det med 99% sannsynlighet være en fordel å bruke opplysningene i oppgaven (det er dem som setter rammen for løsningsmetoden, og en vurdering på om man skal bruke dem eller ikke teller alltid positivt). Siden det er få opplysninger i oppgaven, kan man være rimelig sikker på at den er tatt med for å veilede, ikke villede.

 

Jeg tror poenget er at man ikke skal bruke APIer eller andre systemresurser (som klokka) for å få dette til, og jeg har presentert en måte å gjøre det på. Nå skal det bemerkes at "Application.DoEvents" vil stjele beregnigsprosesser, så den bør egentlig ikke være med i loop'en.

Lenke til kommentar

Det kan godt hende at du tar rett moskus, og at dette programmet skal lages for en bestemt maskin som beregner 1000 tall per sekund. Isåfall har jeg, og hele resten av klassen misforstått oppgaven. Hvis dette var tilfelle, hadde jeg ikke lagt meg opp i det, men når læreren prøver å vise oss hvordan vi skal gjøre det, og at han da sier at det skal fungere på hans, min, og de andre i klassen sine maskiner, da går det ikke an å gjøre det slik.

Igjen må jeg få si at vi ikke har hørt en døyt om timer(), DoEvents eller APIs hittil i år. Jeg skjønner jo at det er lov til å ha kunnskap som ikke er pensum, men i alle fag på skolen skal det være mulig å oppnå høyeste karakter selv uten å kunne et ord utenfor det som står i bok, har vært gjennomgått i timen, eller er pensum gjennom andre læringsveier. En elev skal kunne få 6 i et fag selv uten kunnskap om faget for skoleårets start.

Det er dette jeg mener ikke er mulig for oss i denne oppgaven. Dessuten er det også et meget godt argument for å sette spørsmålstegn ved oppgaven når selv ikke læreren som lagde prøven klarer å gjøre oppgaven!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...