Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Polttoainelaskuri

nakke [30.10.2005 15:03:43]

#

Tervehdys kaikille!
Olen vasta viikon verran opiskellut Visual Basic 6:tta ja saanut jotain aikaiseksi, elikkäs yksinkertaisen polttoaine laskurin. Ongelma on se että jos lukuun pistää pilkun paikalle pisteen, niin ohjelma kaatuu. Milläs koodin pätkällä tuon ongelman voisi korjata?

Muutenkin voisitte hieman kyseenalaistaa meikäläisen koodia noin niinkuin opetustarkoituksessa, eli miten itse olisit tuon ohjelman koodannut. Tuntuu siltä, että tuon olisi voinut tehdä helpommoinkin.

Käytetty koodi

Option Explicit
Private Sub cmdLaske_Click()

Dim Kulutus As Variant
Dim Kilometrit As Variant
Dim Hinta As Variant

Kulutus = txtKulutus.Text
Kilometrit = txtKilometrit.Text
Hinta = txtLitrahinta.Text
If Kulutus = "" Or Kilometrit = "" Or Hinta = "" Then
    MsgBox "Anna luvut kaikkiin laatikoihin", vbCritical
ElseIf Kulutus <= 0 Or Kilometrit <= 0 Or Hinta <= 0 Then
    MsgBox "Anna positiivinen luku", vbCritical, "Anna positiivinen luku"
Else
    lblKustannukset = Kulutus * Kilometrit / 100 * Hinta
End If

End Sub

tuomas [30.10.2005 15:34:05]

#

No ensinnäkin kaikki muuttujat kannattaisi määritellä integer, long, single tai double tyyppiseksi. Variant kun voi sisältää lukuarvojen lisäksi mm. merkkijonoja. Variant käyttää myös muistia kaikista muuttujatyypeistä suurimman määrän (ei välttämättä tälläisessä pätkässä niinkään tärkeää, mutta jos sinulla olisi nyt ollut vaikka muutaman sadan tai tuhannen solun taulukko..)

Tekstilootissa arvot ovat merkkijonoina jotka kannattaa val():lla muuttaa oikeanlaiseen muuttujatyyppiin.

Kustannuksia laskettaessa kannattaa myös tarkistaa, ettei yritetä koskaan jakaa nollalla.

Dim kulutus As Double, kilometrit As Double, hinta As Double, kustannukset As Double

kulutus = Val(txtkulutus.Text) 'tekstilaatikossa oleva luku on tyyppiä merkkijono, muutetaan val():lla luvuksi.
kilometrit = Val(txtkilometrit.Text)
hinta = Val(txtlitrahinta.Text)

'kannattaa myös tarkistaa ettei yritä jakaa lukua nollalla.
If (kilometrit * hinta) <> 0 Then
    kustannukset = (kulutus * 100) / (kilometrit * hinta)
    MsgBox "Kustannukset olivat : " & kustannukset & " euroa."
End If

nakke [30.10.2005 16:03:02]

#

Aaah, on se helppoa kun sen osaa. Kiitoksia Tuomas, tässä selvisi paljon asioita aloittelijan päänupissa. Jatkan harjoituksia. Täältä tähän.

Blaze [30.10.2005 16:40:28]

#

tuomas kirjoitti:

No ensinnäkin kaikki muuttujat kannattaisi määritellä integer, long, single tai double tyyppiseksi.

Ehdottomasti. Varianttien käsittely on hitaampaa kuin OpenOfficen kääntäminen.

setä [30.10.2005 18:30:56]

#

Koska sinulla nakke oli ongelmaa desimaalipisteen kanssa niin taas kerran palaan tuon Val-funktion erikoisuuksiin. Jos tekstiruudussa on desimaalipilkku, Val-funktio ei ota desimaaleja mukaan lainkaan eikä tule mitään virheilmoitusta. Eli jossain vaiheessa ihmetellään miksi ohjelma laskee väärin. Tällasessa ohjelmassa voit laskea suoraan tekstiruuduilla muuttamatta lukuja miksikään. varmistat vain sen, ettei tekstiruutuun tule kiellettyjä merkkejä kuten piste. Tämän voi varmistaa suodatuksella tekstiruudun KeyPress-tapahtumassa:

If InStr("0123456789,." & Chr$(8), Chr$(KeyAscii)) = 0 Then KeyAscii = 0
If KeyAscii = 46 Then KeyAscii = 44

Eka lause nollaa kaikki muut kuin sallitut merkit (Chr$(8) = BackSpace). Toka lause muuttaa desimaalipisteen pilkuksi. Sitten erikseen tietenkin on tarkistettava, ettei yritä jakaa nollalla. Jos tarvitset yhteenlaskua niin käytä plusmerkin sijasta kahta peräkkäistä miinusmerkkiä. (muutoin luvut tulostuvat vain peräkkäin toistensa jatkoksi eli yhdistetään merkkijonoina kuten &-operaattorilla)

nakke [30.10.2005 19:41:35]

#

Kiitoksia setä! Tuota ihmettelinkin, että jos pilkun paikalle laittaa pisteen niin väärin laskee. Nyt kun lisäsin tuon laittamasi koodin, niin ohjelma tuntuisi toimivan niin kun halusinkin. Tarkkana saa näköjään ohjelmoinnissa olla, eikä voi olettaa että loppukäyttäjä tietäisi mitä saa ja mitä ei saa tehdä ohjelmaa käyttäessään. Kaikkeen on näköjään varauduttava.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta