mack_ Skrevet 18. november 2005 Del Skrevet 18. november 2005 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
trrunde Skrevet 18. november 2005 Del Skrevet 18. november 2005 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 Lenke til kommentar
mack_ Skrevet 18. november 2005 Forfatter Del Skrevet 18. november 2005 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
Richard87 Skrevet 18. november 2005 Del Skrevet 18. november 2005 (endret) 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 18. november 2005 av Richard87 Lenke til kommentar
GeirGrusom Skrevet 19. november 2005 Del Skrevet 19. november 2005 Dim X As Long Dim TmpTime As Single For X = 3 To 0 Step - 1 Print X TmpTime = Timer() + 1 While(TmpTime > Timer()) : DoEvents : Loop ' Samme som sleep funksjonen, men uten api kall Next Dermed skal det ta rundt ett sekund før den skriver et nytt tall. Lenke til kommentar
aadnk Skrevet 19. november 2005 Del Skrevet 19. november 2005 (...) 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
mack_ Skrevet 22. november 2005 Forfatter Del Skrevet 22. november 2005 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
GeirGrusom Skrevet 22. november 2005 Del Skrevet 22. november 2005 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. Lenke til kommentar
mack_ Skrevet 22. november 2005 Forfatter Del Skrevet 22. november 2005 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 Lenke til kommentar
nomore Skrevet 22. november 2005 Del Skrevet 22. november 2005 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
mack_ Skrevet 22. november 2005 Forfatter Del Skrevet 22. november 2005 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
nomore Skrevet 22. november 2005 Del Skrevet 22. november 2005 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
mack_ Skrevet 22. november 2005 Forfatter Del Skrevet 22. november 2005 (endret) 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 22. november 2005 av mack_ Lenke til kommentar
nomore Skrevet 23. november 2005 Del Skrevet 23. november 2005 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
mack_ Skrevet 23. november 2005 Forfatter Del Skrevet 23. november 2005 Var det ikke eksempelet til GeirGrusom du sa da? Der er akkurat det der en del av koden. Lenke til kommentar
nomore Skrevet 23. november 2005 Del Skrevet 23. november 2005 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 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
Moskus Skrevet 23. november 2005 Del Skrevet 23. november 2005 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
nomore Skrevet 23. november 2005 Del Skrevet 23. november 2005 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
Moskus Skrevet 23. november 2005 Del Skrevet 23. november 2005 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
mack_ Skrevet 23. november 2005 Forfatter Del Skrevet 23. november 2005 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå