Yksinkertaisia laskutoimituksia

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
User avatar
TukeKoodi
Active Member
Posts: 142
Joined: Thu Feb 03, 2011 7:40 pm
Location: C:\Työpöytä

Yksinkertaisia laskutoimituksia

Post by TukeKoodi »

Eli tein ihan vasta-alkajille tommosen laskutoimitushomman. Laskut ovat joka kerta samoja, tiedän että voi toteuttaa niin että kone arpoo laskut, mutta siihen minun taitoni eivät toistaiseksi riitä, olenhan vielä itsekin aloittelija. Kommentoiti pitäisi olla aika kattava, ja ohjelma on helppo sisäistää. Tämän tarkoitus on siis selventää Input -komennon käyttö(tarkoituksia)ä
Koodi:

Code: Select all

//Jako- ja kertolaskuja:


//Alku. Tähän voi myöhemmin palata komennolla Goto
alku:
//Luodaan silmukka "valikolle" (Repeat)
Repeat
Color cbWhite
//Tekstiä
Text 0,0, "Jako- ja kertolaskupeli v.1.1"
Text 0,50, "Paina enter aloittaaksesi tai ESC poistuaksesi"
Text 0,100, "Huom! piste = pilkku (esim. 3,5 -> 3.5)"
//Ehto: JOS painetaan ENTER niin MENE kohtaan "laskut"
If KeyHit(28) Then
//Menään "teleportilla" laskuihin :D
Goto laskut
//Nollataan painetut näppäimet
ClearKeys
EndIf
//Piirretään näyttö
DrawScreen
//Silmukan lopetus, loppuu muutenkin kun mennään kohtaan "laskut"
Until EscapeKey()

//Tässä sitten "teleportin pää", laskut
laskut:
Color cbWhite
//Uusi silmukka jokaiselle laskulle
Repeat
//Ensimmäinen input -kenttä, lasku on "3.763 kertaa 10"
//Laitetaan inputin nimeksi "a$"
a$=Input ("Paljonko on 3.763 x 10? ")
//Kuten aina, piirretään näyttö
DrawScreen
//Poistutaan silmukasta ENTERillä
Until KeyHit(28)
//Suljetaan edellinen input -kenttä
CloseInput
//Ja edellinen uudestaan...
Repeat
b$=Input ("Paljonko on 5.386 : 10? ")
DrawScreen
Until KeyHit(28)
CloseInput
Repeat
c$=Input ("Paljonko on 452.4 : 100? ")
DrawScreen
Until KeyHit(28)
CloseInput
Repeat
d$=Input ("Paljonko on 34.529 : 10? ")
DrawScreen
Until KeyHit(28)
CloseInput

//Ja uudestaan...
Repeat
e$=Input ("Paljonko on 7.342 : 10? ")
DrawScreen
Until KeyHit(28)
CloseInput
Repeat
f$=Input ("Paljonko on 4.237 x 100? ")
DrawScreen
Until KeyHit(28)
CloseInput
Repeat
g$=Input ("Paljonko on 62.73 : 10? ")
DrawScreen
Until KeyHit(28)
CloseInput


//Tehdään uusi silmukka laskujen tarkistamista varten...
//JOS a$= 37.63 (tulos) JA b$= 0.5386 jne. NIIN "Kaikki oikein"
If a$="37.63" And b$="0.5386" And c$="4.524" And d$="3.4529" And e$="0.7342" And f$="423.7" And g$="6.273" Then
//JOS kaikki oikein NIIN:
Repeat
//Vihreää...
Color cbGreen
//...tekstiä
Text 0,0, "Kaikki oikein! Mahtavaa!"
Text 0,20, "Poistu painamalla ESC"
//Piirrä näyttö
DrawScreen
Until EscapeKey()
//MUUTEN: (JOS kaikki ei ole oikein)
Else
//Uusi silmukka
Repeat
//Ja nyt punaista...
Color cbRed
//Tekstiä
Text 0,0, "Joku lasku oli väärin."
Text 0,20, "Yritä uudelleen painamalla ENTER"
Text 0,40, "Poistu painamalla ESC"
//Piirrä näyttö
DrawScreen
//JOS ENTER on pohjassa NIIN MENE alkuun (Goto alku, kts. ylhäällä)
Until KeyHit(28)
Goto laskut
//Lopeta JOS
EndIf

//Joo
//-----------------
//Eli simppeli ohjelma yksinkertaisille laskutoimituksille

//www.coolbasic.com
Kertokaa mielipiteenne.
Aloittelija, koodaaja, jotain...
CbFUN :D
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: Yksinkertaisia laskutoimituksia

Post by Koodiapina »

Melko purkkainen ollakseen hyvä esimerkki. Itse tekisin kysymyksille oman tyyppikokoelman, jotta niiden lisääminen ja käsitteleminen olisi mahdollisimman vaivatonta.

Esimerkki:

Code: Select all

SCREEN 640,480

Type KYSYMYS
   Field kys$
   Field vastaus$
   Field tarjous$
EndType

kysy("2+2?","4")
kysy("Kuka on kova jätkä?","Grandi")

tarkistavastaukset()
WaitKey

Function kysy(kys$,vastaus$)
   l.KYSYMYS = New(KYSYMYS)
   l\kys = kys
   l\vastaus = vastaus

   Repeat
		l\tarjous = Input(l\kys+" ")
		DrawScreen
	Until(l\tarjous <> "" And KeyHit(cbkeyreturn))
	CloseInput
EndFunction

Function tarkistavastaukset()
   Text 0,0,"Lopputulos:"
   
   pisteet = 0
   maara = 0
   For l.KYSYMYS = Each KYSYMYS
      If Lower(l\vastaus) = Lower(l\tarjous) Then
         Color cbwhite
         Text 0,30+maara*12,"["+l\kys+"] Vastasit oikein."
         pisteet = pisteet + 1
      Else
         Color cbred
         Text 0,30+maara*12,"["+l\kys+"] Oikea vastaus olisi ollut: " + l\vastaus
      EndIf
      DrawScreen OFF
      maara = maara + 1
   Next l
   
   Color cbwhite
   Text 0,50+maara*12,"Oikeita vastauksia: "+pisteet+"/"+maara
   DrawScreen OFF
EndFunction
Jos vastaukset tarkistettaisiin heti kun kysymys on kysytty, ei tarvittaisi tyyppikokoelmiakaan.
Löysin muuten tuota koodatessani bugin CoolBasicin kääntäjästä. Seuraava koodi menee virheittä läpi, mutta tuottaa käännetyssä ohjelmassa epähalutun lopputuloksen. Kääntäjä ei siis osaa huomauttaa tällaisessa tilanteessa operaattorin puuttumisesta, vaikka se olisi tarpeen.

Code: Select all

k$ = "world!"
Print "Hello, "k  // !
WaitKey
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Yksinkertaisia laskutoimituksia

Post by Awaclus »

Itse tein joskus viime vuonna saman kaltaisen ohjelman. Koodi on purkkaisaa ja kommentoimatonta ja muuttujat epäjohdonmukaisesti nimettyjä, mutta kaipa tuosta jotain selvää saa. Tätä varten siis kyselin silloin irkissä ohjeita noiden color-kaavoihin, jos joku sattuu muistamaan.

Code: Select all

SCREEN 800, 600, 0, 0
FrameLimit 40
Text 0, 0, "Loading... please wait."
DrawScreen
arialbig = LoadFont ("Arial", 48, 1, 0, 0)
arialmed = LoadFont ("Arial", 24, 0, 0, 0)
arialsma = LoadFont ("arial", 16, 0, 0, 0)
selection = LoadImage ("Media\ship.bmp")
selected = 1
speed = 2000
difficulty = 2
numbers = 1
calculations = 25
Text 0, 0, "Loading complete! Press any key to continue."
DrawScreen
WaitKey
ClearKeys
Repeat
    SetFont arialbig
    Text 30, 30, "Math Trainer 0.1"
    SetFont arialmed
    Text 40, 90, "Start game"
    Color 255-Int(speed*255/10000), speed*255/10000, 0
    Text 40, 120, "Speed (ms): "+speed
    Color difficulty*255/5, 255-Int(difficulty*255/5), 0
    Text 40, 150, "Difficulty: "+difficulty
    Color numbers*255/4, 255-Int(numbers*255/4), 0
    Text 40, 180, "Numbers: "+numbers
    if calculations < 1000 then Color calculations*255/1000, 255-Int(calculations*255/1000),0 Else Color 255, 0, 0
    Text 40, 210, "Calculations: "+calculations
    scoreper = difficulty*numbers
    If speed < 2500 Then scoreper = scoreper*2
    If speed < 2000 Then scoreper = scoreper*2
    If speed < 1000 Then scoreper = scoreper*2
    SetFont arialsma
    Color 255, 255, 255
    Text 250, 115, "Score per calculation: "+scoreper
    If selected = 1 Then DrawImage selection, 25, 94
    If selected = 2 Then DrawImage selection, 25, 124
    If selected = 3 Then DrawImage selection, 25, 154
    If selected = 4 Then DrawImage selection, 25, 184
    If selected = 5 Then DrawImage selection, 25, 214
    If KeyHit (cbkeyup) Then selected -1
    If KeyHit (cbkeydown) Then selected +1
    If selected < 1 Then selected = 5
    If selected > 5 Then selected = 1
    If KeyDown (cbkeyright) Then rightkeydown +1
    If rightkeydown > 8 Or KeyHit (cbkeyright) Then
        If selected = 2 Then speed +100
        If selected = 3 Then difficulty +1
        If selected = 4 Then numbers +1
        If selected = 5 Then calculations +5
        rightkeydown = 0
    EndIf
    If KeyDown (cbkeyleft) Then leftkeydown +1
    If leftkeydown > 8 Or KeyHit (cbkeyleft)Then
        If selected = 2 Then speed -100
        If selected = 3 Then difficulty -1
        If selected = 4 Then numbers -1
        If selected = 5 Then calculations -5
        leftkeydown = 0    
    EndIf
    If speed < 100 Then speed = 100
    If speed > 10000 Then speed = 10000
    If difficulty > 5 Then difficulty = 5
    If difficulty < 1 Then difficulty = 1
    If numbers < 1 Then numbers = 1
    If numbers > 4 Then numbers = 4
    If calculations < 1 Then calculations = 1
    If selected = 1 Then
        If KeyHit (cbkeyreturn) Then Goto peli
        If KeyHit (cbkeyspace) Then Goto peli
        If KeyHit (cbkeyleft) Then Goto peli
        If KeyHit (cbkeyright) Then Goto peli
    EndIf
    DrawScreen
Forever

peli:
alkuaika = Timer()
SetFont arialbig
aika = Timer()
Repeat
Text 190,130, "3"
DrawScreen
Until Timer()-aika > 1000
aika = Timer()
Repeat
Text 190,130, "2"
DrawScreen
Until Timer()-aika > 1000
aika = Timer()
Repeat
Text 190,130, "1"
DrawScreen
Until Timer()-aika > 1000
aika = Timer()
difrnd = Rnd (1, difficulty)

If numbers = 1 Then numbera = Rand (1,9)
If numbers = 2 Then numbera = Rand (1,99)
If numbers = 3 Then numbera = Rand (1,999)
If numbers = 4 Then numbera = Rand (1,9999)

If numbers = 1 Then numberb = Rand (1,9)
If numbers = 2 Then numberb = Rand (1,99)
If numbers = 3 Then numberb = Rand (1,999)
If numbers = 4 Then numberb = Rand (1,9999)
ClearKeys
Repeat 
If difrnd = 1 Then Text 0, 0, ""+numbera+"+"+numberb
If difrnd = 2 Then Text 0, 0, ""+numbera+"-"+numberb
If difrnd = 3 Then Text 0, 0, ""+numbera+"*"+numberb
If difrnd = 4 Then Text 0, 0, ""+numbera+"/"+numberb
If difrnd = 5 Then Text 0, 0, ""+numbera+"^"+numberb

Locate 5, 60
answer = Int(Input ("="))
If Timer()-aika > speed Then Goto peli2
If KeyHit(cbkeyreturn) Then Goto peli2
DrawScreen
Forever

peli2:
CloseInput
If difrnd = 1 And answer = numbera+numberb Then score = score+scoreper
If difrnd = 2 And answer = numbera-numberb Then score = score+scoreper
If difrnd = 3 And answer = numbera*numberb Then score = score+scoreper
If difrnd = 4 And answer = Int(numbera/numberb) Then score = score+scoreper
If difrnd = 5 And answer = numbera^numberb Then score = score+scoreper
answer = 0
kerrat +1
If kerrat < calculations Then Goto peli
Cls
SetFont arialsma
Text 30, 30, "Your score: "+score
Text 30, 50, "Number of calculations: "+calculations
Text 30, 70, "Approx. score per calculation: "+Float(score/calculations)
Text 30, 150, "Press any key to quit."
DrawScreen

WaitKey
End
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: Yksinkertaisia laskutoimituksia

Post by legend »

Tässä on "täydellinen" esimerkki tietovisasta. Tässä ei ole käytetty kertaakaan if lausetta, joka tekee koodista lyhyen ja ehkä selkeän =D + kysymyksien määrä ei nosta koodin pituutta

Code: Select all

   Const kysymyksien_määrä = 6 'kysymyksien määrä
   Const Kysymys$ = "1+1?,Mikä on Suomen pääkaupunki?,2+2+2+2?,Minä vuonna Suomi itsenäistyi?,40-11?,Kuka on Suomen presidentti?" 'kysymykset, erotettaan pilkulla
   Const vastausA = "1,Helsinki,8,1937,39,Lipponen" 'vastaukset, erotetaan pilkulla
   Const vastausB = "2,Turku,6,1423,29,Obama"
   Const vastausC = "0,Hämeenlinna,10,1917,19,Halonen"
   Const oikein = "48,30,30,46,48,46"  'Vastaukset ovat näppäin koodina
   
   kierros As Byte =1
   pisteet As Byte =0
   
   
   
   While Not kierros -1 = kysymyksien_määrä 'pääsilmukka
       CenterText 200,20, GetWord(kysymys,kierros,",") 'tulostaa kysymyksen
       Text 20,60,"A:" + GetWord(VastausA,kierros,",") 'tulostaa vastaukset
       Text 20,80,"B:" + GetWord(VastausB,kierros,",")
       Text 20,100,"C:" + GetWord(VastausC,kierros,",")
       Text 0,0, "Pisteet: " + pisteet + "/" + (kierros-1) 'tulostaa pisteet
       
       pisteet = pisteet + KeyHit(Int(GetWord(oikein,kierros,",")))
       kierros = kierros + KeyHit(30) + KeyHit(48) + KeyHit(46) '(A,B tai C)
   
       DrawScreen
   Wend
   
   
     Locate 140,20 'tulostetaan loppu tulokset
     AddText "Pisteet: " + pisteet + "/" + (kierros-1)
     AddText "Arvosana(0-100):" + pisteet*100 / (kierros-1)
   
     DrawScreen
   WaitKey
   
Post Reply