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
For i = 1 To 4 For n = 2 To 1 Step -1 kerroin = n ' 2 1 2 1 2 1 2 1 Next Next
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
Tai lyhyemmin:
intKerroin = 3 - intKerroin ' vaihtele 1 ja 2 kierroksittain
Aihe on jo aika vanha, joten et voi enää vastata siihen.