C# :: Aufgabe #350

2 Lösungen Lösungen öffentlich

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ß

Lösungen:

vote_ok
von dany_mue (240 Punkte) - 15.02.2021 um 22:13 Uhr
Quellcode ausblenden C#-Code

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;		
		}
	}
}


vote_ok
von JKooP (18090 Punkte) - 05.03.2021 um 16:52 Uhr
NET 5.x; C# 9.x; VS-2019

Quellcode ausblenden 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
}