Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Kertoma

Sivun loppuun

vehkis91 [08.10.2008 19:26:53]

#

Olen tässä miettinyt, että miten voin laskea VB2008 suuria kertomia? TÄmän kertoman pitäisi olla väliltä 1-100, mutta vaikka käytän doublea niin valittaa, ettei mahdu.. Eli mikä neuvoksi.

Tässä tähänastinen töherrys:

Option Explicit On
Public Class Form1

    Dim kertoma As Double

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim i As Integer
        Dim kertoma = 1

        For i = 1 To 10
            kertoma = kertoma * i
        Next i


        TextBox1.Text = kertoma

    End Sub
End Class

setä [08.10.2008 19:34:01]

#

Määrittele myös i Doubleksi tai Longiksi.

vehkis91 [08.10.2008 19:40:22]

#

Tällaista virheilmoitusta tule kun kummatkin ovat doublea.
"Aritmeettinen toiminto aiheutti ylivuodon."

Niin ja tosiaan tuolla näyttäisi olevan virhe se on

For i=1 to 100

Antti Laaksonen [08.10.2008 19:55:57]

#

Luvun 100 kertomassa on 158 numeroa, joten tavallisten lukutyyppien käyttö ei tule kysymykseen.

Ratkaisu ongelmaan on käsitellä lukuja merkkijonoina. Tällöin kuitenkin täytyy kirjoittaa itse funktio, joka kertoo kaksi merkkijonona tallennettua lukua keskenään. Tämän funktion voi toteuttaa samalla tavalla kuin ala-asteella opetettiin lukujen kertominen allekkain.

vehkis91 [08.10.2008 20:07:48]

#

No itse ajattelinkin, että pitää jotain alkaa säätään, mutta me juuri koulussa aloitimme (viiko sitten) ohjelmoimaan ja ihan alkeistehvä pitäis olla... :S. Tai sitten ope ei edes halua, että joku sen osais tehdä... :D

Teuro [08.10.2008 20:10:45]

#

Oletko ihan varma, että kysessä on kertoma, nimittäin ei kuulosta ihan alkeistehtävältä. Ettei kysessä ole klassinen 100 ekan numeron summa, joka on siis päässälaskutehtävä.

vehkis91 [08.10.2008 20:17:43]

#

Tässä tehtävä:

"Tee ohjelma, joka laskee luvun 10 kertoman. Esimerkiksi 5 kertoma tarkoittaa 1*2*3*4*5. Suunnitteluun ohje: Käy paperilla ja kynällä esim. 1*2*3*4*5 vaihe vaiheelta läpi. Muuta ohjelmaa siten, että se laskee luvun 100 kertoman. "

Teuro, tuo tehtävä oli aikaisempi, paitsi että siinä laskettiin 7 - 131. :D
Sen ohjelman toteutus kesti n2min.

EDit: ja niin tosiaan ei se ihan alkeis olekkaan, koska pyysin lisätehtäviä, ku osasin tehdä ne kaikki todella alkeistehtävät muita nopeammin. Tämä varmaan johtui siitä että osaan jo c++... :P

Antti Laaksonen [08.10.2008 20:28:02]

#

Vaihtoehtoja lienee kolme:

1. Kyseessä on todella haastava tehtävä ollakseen alkeiskurssilla.
2. VB.NET sisältää jonkin helpon tavan suurten lukujen käsittelyyn.
3. Opettaja ei huomannut, että kertoma kasvaa niin suureksi.

Mutta yritä silti toteuttaa suurten lukujen kertominen itse, niin opit jotain uutta. :)

vehkis91 [08.10.2008 20:37:06]

#

No täytyy tässä kokeilla...

Jaska [08.10.2008 21:55:38]

#

Jos likiarvo kelpaa, niin kertomaan saa muodossa a*10^n logaritmien avulla, 0<a<1. Myös Stirlingin kaavan avulla saa likiarvon ilman isoja kokonaislukuja.

Metabolix [08.10.2008 22:10:22]

#

En VB:tä varsinaisesti osaa, mutta pieni aavistus sanoo, että funktion sisällä oleva Dim määrittelee uuden muuttujan, jolloin funktion ulkopuolella määritellyllä muuttujalla ei ole merkitystä. Voin toki olla väärässäkin. Kokeile kuitenkin poistaa tuo ulkopuolinen muuttuja ja määritellä funktion sisällä Double-muuttuja, jotta tyyppi varmasti olisi Double. Siihen vastaus kyllä mahtuu, tosin tarkkuudesta täytyy tällöin tinkiä.

Luultavasti opettaja a) kaipasi tätä ratkaisua, b) teki vahingossa tuon virheen tai c) antoi tahallaan teille tehtävän, jossa havaitsette lukujen rajallisen arvoalueen.

groovyb [08.10.2008 23:31:02]

#

Dim kertoma As double
Dim luku As Double
Dim i As Integer

luku = 1

For i = 1 To 100

    kertoma = CDbl(i)
    luku = kertoma * luku

Next

Messagebox.Show(luku)

en testannu mutta toimisikohan?

Grez [08.10.2008 23:32:21]

#

Antti Laaksonen kirjoitti:

Luvun 100 kertomassa on 158 numeroa, joten tavallisten lukutyyppien käyttö ei tule kysymykseen.

Jos oletetaan että likiarvo kelpaa, niin Doublen suurin arvo on 1,79769313486232*10308, joten sen suhteen ei pitäisi olla mitään ongelmia saada 100! mahtumaan.

vehkis91 [09.10.2008 09:12:35]

#

groovyb: Tuo tulostaa vaan 100, eli ei toimi.

Grez: yritin käyttää doublea, mutta tulee juuri tuo errori, eli onko siihen sitten jotain "erikois" käskyjä että sillä voi kertoa.

Antti Laaksonen [09.10.2008 09:24:14]

#

Jos siis likiarvo kelpaa, tämä koodi ainakin toimii:

Dim kertoma As Double
Dim i As Integer
kertoma = 1
For i = 2 To 100
    kertoma = kertoma * i
Next
MsgBox(kertoma)

Myös groovyb:n esittämä koodi tuntuu toimivan yhtä lailla.

vehkis91 [09.10.2008 09:28:10]

#

Juu niinpäs toimikin, oli oma moka ettei se toiminut. kiitos avusta. :D


Sivun alkuun

Vastaus

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

Tietoa sivustosta