C# :: Aufgabe #350
2 Lösungen

Seriennummer Euro- Banknoten überprüfen (bis 2013)
Anfänger - C#
von JKooP
- 26.01.2021 um 10:26 Uhr
Jede Banknote enthält eine eindeutige Seriennummer, bestehend aus 12 Zeichen
mit folgender alphanumerischer Signatur (ab 2013 abweichend):
LNNNNNNNNNNJ (z.B. X17291528696)
L: Ländercode als Buchstabe von A bis Z (z.B. X für Deutschland, N für Österreich…)
N: 10 Ziffern von 0 bis 9
J: Prüfziffer von 1 bis 9
Berechnung der Prüfziffer:
Der Ländercode muss in eine Zahl umgewandelt werden.
Diese ergibt sich aus der Position des Buchstabens im Alphabet. (A = 1, B = 2; … X = 24)
Dann wird die Quersumme aus der entstandenen Zahl des Ländercodes und den 10 folgenden Ziffern ohne Prüfziffer gebildet.
241729152869 => 2+4+1+7+2+9+1+5+2+8+6+9 = 56
Es wird der Rest (R) der Division durch 9 ermittelt
R = 56 Modulo 9 = 2
und dann der Prüfwert (P).
P = 8 – R => 8 – 2 = 6
Wenn P = 0, dann ist J = 9, ansonsten ist J = P.
X17291528696 => gültige Banknote!
Aufgabe:
Schreibe ein Programm, welches folgende Ergebnisse liefert:
1. Prüfen, ob es sich bei der eingegebenen Seriennummer um die richtige Signatur handelt.
2. Generieren der Prüfziffer J aus dem Ländercode und den folgenden 10 Ziffern.
3. Prüfen, ob es sich bei Eingabe einer Seriennummer um eine Euro- Banknote handelt.
4. Ausgabe des zugehörigen Landes der Euro- Banknote (siehe NZB-Kennung)
Viel Spaß
mit folgender alphanumerischer Signatur (ab 2013 abweichend):
LNNNNNNNNNNJ (z.B. X17291528696)
L: Ländercode als Buchstabe von A bis Z (z.B. X für Deutschland, N für Österreich…)
N: 10 Ziffern von 0 bis 9
J: Prüfziffer von 1 bis 9
Berechnung der Prüfziffer:
Der Ländercode muss in eine Zahl umgewandelt werden.
Diese ergibt sich aus der Position des Buchstabens im Alphabet. (A = 1, B = 2; … X = 24)
Dann wird die Quersumme aus der entstandenen Zahl des Ländercodes und den 10 folgenden Ziffern ohne Prüfziffer gebildet.
241729152869 => 2+4+1+7+2+9+1+5+2+8+6+9 = 56
Es wird der Rest (R) der Division durch 9 ermittelt
R = 56 Modulo 9 = 2
und dann der Prüfwert (P).
P = 8 – R => 8 – 2 = 6
Wenn P = 0, dann ist J = 9, ansonsten ist J = P.
X17291528696 => gültige Banknote!
Aufgabe:
Schreibe ein Programm, welches folgende Ergebnisse liefert:
1. Prüfen, ob es sich bei der eingegebenen Seriennummer um die richtige Signatur handelt.
2. Generieren der Prüfziffer J aus dem Ländercode und den folgenden 10 Ziffern.
3. Prüfen, ob es sich bei Eingabe einer Seriennummer um eine Euro- Banknote handelt.
4. Ausgabe des zugehörigen Landes der Euro- Banknote (siehe NZB-Kennung)
Viel Spaß
Lösungen:

using System; namespace TJP350_Banknoten { enum Code { Litauen = 2, Lettland, Estland, Slowakei, Malta, Zypern, Slowenien, Vereinigtes_Königreich = 10, Schweden, Finnland, Portugal, Österreich, Niederlande = 16, Luxemburg = 18, Italien, Irland, Frankreich, Spanien, Dänemark, Deutschland, Griechenland, Belgien } class Program { // members static int[] serialNumber; static Code countryCode = new Code(); /// <summary> /// Main /// </summary> static void Main(string[] args) { do { Console.Clear(); if (CheckUserInput()) { if (CheckSerialNumber(serialNumber)) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Die eingegebene Seriennummer ist gültig und stammt aus dem Land {0}!", countryCode); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Die eingegebene Seriennummer ist ungültig, du kleiner Fälscher!"); } Console.ForegroundColor = ConsoleColor.White; } else { Console.WriteLine("Das Format der eingegebenen Seriennummer ist nicht gültig!"); Console.WriteLine("(Format: LNNNNNNNNNNN z.B. A12345678901)"); } // do a new test? Console.WriteLine("\r\nWeitere Eingabe (ENTER) - Abbrechen mit beliebiger Taste"); } while (Console.ReadKey().Key == ConsoleKey.Enter); } /// <summary> /// check user input /// </summary> private static bool CheckUserInput() { // user input Console.Write("Bitte Seriennummer eingeben: "); string input = Console.ReadLine().ToUpper(); // check length if (input.Length != 12) return false; // check first element (country code) if (Char.IsDigit(input[0])) return false; else input = GetCountryCode(input[0], out countryCode) + input.Substring(1); // check all elements if (!long.TryParse(input, out long result)) return false; // convert string to array serialNumber = new int[input.Length]; for (int i=0; i<input.Length; i++) { serialNumber[i] = int.Parse(input[i].ToString()); } // input pattern is correct return true; } /// <summary> /// get country code /// </summary> private static string GetCountryCode(char code, out Code countryCode) { countryCode = (Code)code - 64; return ((int)code - 64).ToString(); } /// <summary> /// check serial number /// </summary> private static bool CheckSerialNumber(int[] serialNumber) { // calculate the checksum int sum = 0; for (int i=0; i<serialNumber.Length - 1; i++) { sum += serialNumber[i]; } // validate the checksum int validationNumber = sum % 9 == 0 ? 9 : 8 - sum % 9; if (validationNumber == serialNumber[serialNumber.Length - 1]) return true; return false; } } }
NET 5.x; C# 9.x; VS-2019
C#-Code

using System; using System.Linq; using System.Text.RegularExpressions; var e = "unbekannt"; Console.Write("Bitte Geldscheinnummer eingeben: "); var n = Console.ReadLine().ToUpper(); if (!new Regex(@"[A-Z]{1}\d{11}").IsMatch(n)) { Console.WriteLine("Die Geldscheinnummer hat das falsche Format!"); return; } var l = n[0] - 64; n = l + n[1..]; var c = n[..^1].Select(x => char.GetNumericValue(x)).Sum(); var j = (8 - c % 9 == 0 ? 9 : 8 - c % 9).ToString(); if (Enum.IsDefined(typeof(Codes), l)) e = Enum.GetName(typeof(Codes), l); Console.Write($"Prüfung Geldscheinnummer: {( j == n[^1..] ? "richtig" : "falsch" )}\n"); Console.Write($"Ländercode: { e }\n"); enum Codes { UK = 10, SE, FI, PT, AT, NL = 16, LU = 18, IT, IE, FR, ES, DK, DE, GR, BE }