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
Määrittele myös i Doubleksi tai Longiksi.
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
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.
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
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ä.
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
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. :)
No täytyy tässä kokeilla...
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.
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.
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?
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.
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.
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.
Juu niinpäs toimikin, oli oma moka ettei se toiminut. kiitos avusta. :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.