Quersummen Berechnung 15 Stelliger Nummer für Pürfziffernberechnung nach Modulo 10

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Eierlein.

    Quersummen Berechnung 15 Stelliger Nummer für Pürfziffernberechnung nach Modulo 10

    Hi,

    Auch wenn der Titel erstmal kompliziert zu lesen ist, ist die Aufgabenstellung bzw die bitte um Hilfe nicht soo schlimm.

    Mein ziel ist eine Prüfziffernberechnung nach Modulo 10

    Hier mal ein Kleines beispiel

    Nummer 302 569 854785969

    Hier muss nun von links nach rechts jede zahl abwechseln mit 1 & 2 Gewichtet werden, also

    3 *2 =6
    0 *1 =0
    2 *2 =4
    5 *1 =5
    6 *2 =12


    Und so weiter .

    Nun habe ich erstmal was zusammen geschrieben das die Nummer gesplittet wird.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Check_Number = CheckNumber.Text
    3. Dim len = 1
    4. Dim list = New List(Of String)
    5. For i = 0 To Check_Number.Length - 1 Step len
    6. Dim part = If(i + len > Check_Number.Length, Check_Number.Substring(i), Check_Number.Substring(i, len))
    7. list.Add(part)
    8. Next
    9. Dim result = list.ToArray()
    10. Dim No1 As Integer = result(0) * 2
    11. End Sub


    Ich kann wie schon hier im Script angedeutet alle zahlen problemlos in einem arry durch berechnen jeweils *2 und *1

    Das Problem ist ich muss später die Quersumme aller zahlen berechnen bei 6*2 Kommt 12 raus die Quersumme ist aber 3 und ich bin grade leicht überfordert wie ich das alles schreiben kann ohne Kilometer weise code

    Ich hoffe meine Erklärung ist verständlich.

    Ich suche eine art arry quersummenberechnung
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Richtig, aber die Quersumme hier wäre 18 :)
    Ich muss alle 15 zahlend abwechseln mit 2 und 1 gewichten und dann von jeder zahl die Quersumme berechnen.

    Ich dachte an eine funktion ala

    VB.NET-Quellcode

    1. Public Class Class1
    2. Private Function Quersumme(ByVal Zahl As String)
    3. Dim Sum As Integer = 0
    4. For Each C As Char In Zahl.ToCharArray
    5. Try
    6. Sum += C.ToString
    7. Catch ex As Exception
    8. End Try
    9. Next
    10. Return Sum
    11. End Function
    12. End Class


    Das Problem ich habe mir Programmieren durch YouTube und co beigebracht und Klassen Programmierung bisher selten betrieben, und weis nicht wie ich die Parameter in die klasse sende um sie zu berechnen und das Ergebnis also (Return) im Haupt Code ab zu rufen.


    Wenn es eine bessere Lösung gebe gern her damit.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Hier ein VBA CODE:

    Beachte das der VBA-String bei 1 beginnt, der .net String bei 0.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub test()
    3. Dim z$
    4. z = "302569 854785969"
    5. Debug.Print z
    6. Debug.Print
    7. Debug.Print "Quersumme = "; QSum(z)
    8. End Sub
    9. Function QSum(z As String) As Integer
    10. Dim i%, tmp$, sum&, m%
    11. z = Replace(z, " ", "")
    12. For i = 1 To Len(z)
    13. If i Mod 2 = 1 Then m = 2 Else m = 1
    14. tmp = tmp$ & CStr(Val(Mid$(z, i, 1) * m))
    15. Debug.Print i, tmp 'Nur zur INFO
    16. Next
    17. For i = 1 To Len(tmp)
    18. sum = sum + Val(Mid$(tmp, i, 1))
    19. QSum = sum
    20. Next
    21. End Function


    Testausgabe:

    Quellcode

    1. 302569 854785969
    2. 1 6
    3. 2 60
    4. 3 604
    5. 4 6045
    6. 5 604512
    7. 6 6045129
    8. 7 604512916
    9. 8 6045129165
    10. 9 60451291658
    11. 10 604512916587
    12. 11 60451291658716
    13. 12 604512916587165
    14. 13 60451291658716518
    15. 14 604512916587165186
    16. 15 60451291658716518618
    17. Quersumme = 90


    Wie soll's mit Modulo 10 weitergehen? ?(
    Edit mein fehler sry ja richtig
    1. Beginnend von links werden alle Ziffern abwechselnd mit 1 und 2 gewichtet (PZ = 1. Stelle = Gewicht 1).

    2. Die Quersumme über alle Produkte wird errechnet.

    3. Von der Quersumme wird der ganzzahlige Rest zum nächst kleineren Vielfachen von 10 bestimmt (Modulo 10).

    4. Die Prüfziffer ergibt sich nach Substraktion des Restes von 10.
    • Ist die Differenz 10, gilt p = 0


    NummerSchritt 1: GewichtungSchritt 2:Produkte fürQuersumme
    32
    6
    010
    8216
    313
    428
    212
    326
    111
    020
    313
    122
    818
    7214
    616
    9218
    p1-

    Quersumme66
    Schritt 3: Quersumme modulo 10
    66 ÷ 10 =6 Rest 6
    Schritt 4: Differenz
    10 - 6 = 4
    Endergebnis Prüfziffer
    4



    Selbst wenn ich nur die hälfte von deinem script verstehe habe ich trotzdem das Problem wie ich nun die Funktion in einer klasse abrufe da ich ja oben schon geschrieben habe das ich damit meine Problemchen habe

    Möchte die Funktion nicht im Hauptteil, aber sonst siehts gut aus muss aber trotzdem erstmal dahinter steigen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „bigbase“ ()

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function Quersumme(ByVal input As String) As Integer
    2. Const ZERO_OFFSET As Integer = &H30
    3. Dim value As Integer = 0
    4. Dim index As Integer = 1
    5. For Each charackter As Char In input
    6. If charackter >= "0"c AndAlso charackter <= "9"c Then // Ist nummer
    7. Dim innerValue As Integer = (Convert.ToInt32(charackter) - ZERO_OFFSET) * ((index And &B1) + 1)
    8. ' wie wir wissen wird binär die Zahl 1 mit 0b0001 dargestellt und die zwei 0b0010 und die drei 0b0011
    9. ' alle geraden zahlen haben also ein 0 am ende im binär sinne
    10. ' und alle geraden ein 0' den index binär verundet mit 0b0001, folgt das wir nur die eine 0 oder eine 1 habe
    11. If innerValue < 10 Then
    12. value += innerValue
    13. Else
    14. value += 1
    15. value += innerValue - 10
    16. End If
    17. End If
    18. index += 1
    19. Next
    20. Return 10 - (value Mod 10)
    21. End Function

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Facebamm“ ()

    @Facebamm

    Danke aber da ist das hier einfacher

    VB.NET-Quellcode

    1. Public Shared Function Quersumme(ByVal Zahl As String)
    2. Dim Sum As Integer = 0
    3. For Each C As Char In Zahl.ToCharArray
    4. Try
    5. Sum += C.ToString
    6. Catch ex As Exception
    7. End Try
    8. Next
    9. Return Sum
    10. End Function


    Zusätzlich hat habe ich dan immer noch nicht das abwechselnde Gewichten

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub test()
    3. Dim z$
    4. z = "308342310318769"
    5. Debug.Print z
    6. Debug.Print
    7. Debug.Print "Prüfziffer = "; PZ(z)
    8. End Sub
    9. Function PZ(z As String) As Integer
    10. Dim i&, tmp$, Qsum&, m%, diff%
    11. z = Replace(z, " ", "")
    12. For i = 1 To Len(z)
    13. If i Mod 2 = 1 Then m = 2 Else m = 1
    14. tmp = tmp$ & CStr(Val(Mid$(z, i, 1) * m))
    15. Debug.Print i, tmp 'Nur zur INFO
    16. Next
    17. For i = 1 To Len(tmp)
    18. Qsum = Qsum + Val(Mid$(tmp, i, 1))
    19. Next
    20. Debug.Print "Quersumme :"; Qsum 'Nur zur INFO
    21. Qsum = Qsum Mod 10
    22. Debug.Print "Qsum Mod 10 : "; Qsum 'Nur zur INFO
    23. diff = 10 - Qsum
    24. If diff = 10 Then diff = 0
    25. Debug.Print "Diff.: "; diff 'Nur zur INFO
    26. PZ = diff
    27. End Function


    Ausgabe:

    Quellcode

    1. 308342310318769
    2. 1 6
    3. 2 60
    4. 3 6016
    5. 4 60163
    6. 5 601638
    7. 6 6016382
    8. 7 60163826
    9. 8 601638261
    10. 9 6016382610
    11. 10 60163826103
    12. 11 601638261032
    13. 12 6016382610328
    14. 13 601638261032814
    15. 14 6016382610328146
    16. 15 601638261032814618
    17. Quersumme : 66
    18. Qsum Mod 10 : 6
    19. Diff.: 4
    20. Prüfziffer = 4
    Öhm, dann sollte das aber nicht gehen Oo Quersummen Berechnung 15 Stelliger Nummer für Pürfziffernberechnung nach Modulo 10
    zudem deine Rückgabe fehlt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Facebamm“ ()

    Hab das ganze jetzt umgesetzt funktioniert eigentlich auch ......aber

    In der Ausgabedatei fehlen führende nullen die werden leider weggelöscht, da der Präfix fast immer gleich ist und ich eigentlich nur die letzten 9 nummern + Prüfzahl brauche musste ich die Nummer splitten

    VB.NET-Quellcode

    1. Option Explicit On
    2. Imports System.IO
    3. Imports System.Text.RegularExpressions
    4. Public Class Form1
    5. Dim Check_Number As String
    6. Dim Startnumber As String
    7. Dim i As Integer = 0
    8. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    9. Check_Number = praefix.Text & CheckNumber.Text
    10. Startnumber = CheckNumber.Text
    11. Do Until i = NumericUpDown1.Text
    12. i = i + 1
    13. Dim W As New StreamWriter(Environment.CurrentDirectory & "\Output.txt", True)
    14. W.WriteLine((Startnumber & QSumB.PZ(Check_Number)))
    15. W.Close()
    16. Check_Number = Check_Number + 1
    17. Startnumber = Startnumber + 1
    18. Loop
    19. End Sub
    20. End Class


    VB.NET-Quellcode

    1. Public Class QSumB
    2. Public Shared Function PZ(z As String) As Integer
    3. Dim i&, tmp$, Qsum&, m%, diff%
    4. For i = 1 To Len(z)
    5. If i Mod 2 = 1 Then m = 2 Else m = 1
    6. tmp = tmp$ & CStr(Val(Mid$(z, i, 1) * m))
    7. Next
    8. For i = 1 To Len(tmp)
    9. Qsum = Qsum + Val(Mid$(tmp, i, 1))
    10. Next
    11. Qsum = Qsum Mod 10
    12. diff = 10 - Qsum
    13. If diff = 10 Then diff = 0
    14. PZ = diff
    15. End Function
    16. End Class
    What :?:

    bigbase schrieb:

    VB.NET-Quellcode

    1. Option Explicit On
    2. ' ...
    3. Dim i As Integer = 0
    4. ' ...
    5. Do Until i = NumericUpDown1.Text
    6. ' ...
    7. Check_Number = Check_Number + 1
    8. Startnumber = Startnumber + 1


    Option Strict On

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @bigbase Du weist einer Integer-Variavlen einen String zu und solch.
    Machst Du Option Strict On:
    Visual Studio - Empfohlene Einstellungen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    bigbase schrieb:

    Aber mein Problem leider bisher nicht gelöst
    Das sehe ich mir an, wenn Dein Code Strict On ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    :thumbsup: Hier der VB.Net CODE mit Strict On

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.Convert
    4. Module Module1
    5. Sub Main()
    6. Dim zahl As String = "308342310318769"
    7. Debug.Print("Zahl = " & zahl)
    8. Debug.Print("")
    9. Debug.Print("Prüfziffer = " & PZ(zahl))
    10. End Sub
    11. Function PZ(z As String) As Integer
    12. Dim Qsum As Integer, m As Integer, diff As Integer
    13. Dim tmp As String = ""
    14. z = z.Replace(" ", "")
    15. For i As Integer = 0 To z.Length - 1
    16. If i Mod 2 = 0 Then m = 2 Else m = 1
    17. tmp &= (Convert.ToInt16(z.Substring(i, 1)) * m).ToString
    18. Debug.Print(z.Substring(i, 1) & vbTab & m & vbTab & tmp)
    19. Next
    20. For i = 0 To tmp.Length - 1
    21. Qsum += Convert.ToInt16(tmp.Substring(i, 1))
    22. Next
    23. Debug.Print("Quersumme : " & Qsum) 'Nur zur INFO
    24. Qsum = Qsum Mod 10
    25. Debug.Print("Qsum Mod 10 : " & Qsum) 'Nur zur INFO
    26. diff = 10 - Qsum
    27. If diff = 10 Then diff = 0
    28. Debug.Print("Diff.: " & diff) 'Nur zur INFO
    29. PZ = diff
    30. End Function
    31. End Module