Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Rivin numeroiden kertolasku

Strike [30.12.2009 14:23:35]

#

Pystyisikö joku tarkka silmäinen löytämään missä on tekeleessäni vika. Itse en ole löytänyt vaikka käynyt useasti läpi.
Ohjelmana minulla pitää olla Visual Basic 2008 Express edition, enkä mitenkään hyvä ole ohjelmoimaan, joten jos joku osaisi neuvoa, neuvoisiko niiiin hel-pos-ti että tyhmäkin tajuaisi.

Tarkoituskenani ohjelmassa hakea tekstitiedosto, johon syötetty allekkain tämän tyyppisiä esim. 219A001214 tai 420L1887092. viimeinen numero on tarkiste jota ei lasketa. Samoin 4 ensimmäistä merkkiä ei lasketa, eli lasku alkaa vasta kirjaimen jälkeen. Alkuun olen saanut ohjelman tekemään niin, että ottaa huomioon vasta kirjaimen jälkeen tulevat merkit, mutta 0:lla kertomista en ole onnistunut estämään..

Laskun pitäisi olla: Kerroin on 2 1 2 1 2 1. Vasemmalta oikealle ja pitäisi vaihtua joka kierroksella, yhtä numeroa kerrallaan kertoen. Näiden kaikkien tulos jaetaan 10, jonka jakojäännös pitäisi olla tarkiste. Eli toisin sanoen, sen summan tuloksen viimeinen numero on tarkiste.

Kerrointa en siis saa vaihtumaan, siten että aloittaa kertomisen 2. osaisiko joku neuvoa mitä pitäisi tehdä.

Kiitokset etukäteen.

Option Strict On
Imports System.Console
Imports System.IO
Module Module1

    Sub Main()

        Const KORTINPITUUS1 As Integer = 10
        'Const KORTINPITUUS2 As Integer = 11

        Dim oLukija As StreamReader 'lukijan esittely
        Dim oKirjoittaja As New StreamWriter("c:\Tarkastetut.txt")
        Dim intLaskettuTm, intSyotettyTm As Integer

        'Dim strViesti As String

        Dim kortti As String '= "179A005644" testausmateriaalina tekstitiedostossa



        WriteLine("tunnistus aloitetaan tekstitiedoston haulla.")
        ReadLine()
        oLukija = New StreamReader("c:\Haetut.txt") 'Oletetaan tiedoston löytyvän
        While oLukija.Peek <> -1
            kortti = oLukija.ReadLine()
            intLaskettuTm = LaskeTarkastusmerkki(kortti)

            intSyotettyTm = CInt(kortti.Substring(KORTINPITUUS1 - 1, 1))

            if intSyotettyTm = intLaskettuTm Then
                strViesti = String.Concat("kortti ", kortti, " on oikein.")
                WriteLine(strViesti)
                oKirjoittaja.WriteLine(strViesti)
            'Else
                strViesti = String.Concat("kortti ", kortti, " on virheellinen.")
                WriteLine(strViesti)
            End If
        End While
        oKirjoittaja.Close()
        oLukija.Close()
    End Sub

    Function LaskeTarkastusmerkki(ByVal kortti As String) As Integer
        Const KORTINPITUUS1 As Integer = 10
        Dim intSumma, intTulo, intKerroin, i, intNumero, intLaskettuTM As Integer
        Dim IntSyotettyTm As Integer
        intSumma = 0
        intKerroin = 2




        For i = 4 To KORTINPITUUS1 - 2   ’aloittaa kirjaimen jälk. kertoo myös 0:lla
            intNumero = CInt(kortti.Substring(i, 1))
            intTulo = intNumero * intKerroin
            intSumma = intSumma + intTulo 'kokonaissummaa tarvitaan tarkastusmerkin päättelyssä
            Select Case intKerroin  ' vaihdetaan kerroin seuraavaa kierrosta varten
                Case 1
                    intKerroin = 1
                Case 2
                    intKerroin = 2
            End Select
        Next


        intLaskettuTM = 10 - (intSumma Mod 10)
        If intLaskettuTM = 10 Then  'muunnetaan tarkastusmerkki on yksinumeroiseksi
            intLaskettuTM = 0
        End If

                IntSyotettyTm = CInt(kortti.Substring(KORTINPITUUS1 - 1, 1)) '

        If IntSyotettyTm = intLaskettuTM Then
            Console.WriteLine(String.Concat("kortti ", kortti, " on oikein."))
        Else
            Console.WriteLine(String.Concat("kortti ", kortti, " on virheellinen."))
        End If
        ReadLine()
    End Function
End Module

Mod. lisäsi kooditagit

groovyb [30.12.2009 15:19:09]

#

For i = 1 To 4

         For n = 2 To 1 Step -1

             kerroin = n ' 2 1 2 1 2 1 2 1

         Next

Next

Hycke [30.12.2009 15:42:41]

#

tuossa on virhe...

Select Case intKerroin  ' vaihdetaan kerroin seuraavaa kierrosta varten
    Case 1
        intKerroin = 1
      ...

pitäisi olla

Select Case intKerroin  ' vaihdetaan kerroin seuraavaa kierrosta varten
    Case 1
        intKerroin = 2
    Case 2
        intKerroin = 1
End Select

Chiman [30.12.2009 15:47:45]

#

Tai lyhyemmin:

intKerroin = 3 - intKerroin ' vaihtele 1 ja 2 kierroksittain

Vastaus

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

Tietoa sivustosta