Euro-Banknoten (Selektionen)
Auf jeder Banknote ist eine eindeutige Seriennummer aufgedruckt. Im Falle einer Euro-Banknote hat eine solche Seriennummer folgende Struktur:
ANNNNNNNNNNJ
Hierbei ist das erste Zeichen (A) der Ländercode (z.B.: X für Deutschland, N für Österreich, P für Niederlande, Z für Belgien).
Es folgen 10 Nutzziffern (N) und als letztes Zeichen eine Prüfziffer (J).
Die Prüfziffer (J) berechnet sich wie folgt:
- Betrachte den Buchstaben des Ländercodes als Zahl. Die Zahl ergibt sich aus der Position des Buchstabens im Alphabet (1 für A, 2 für B, ..., 25 für Y, 26 für Z)
- Bilde die Quersumme aus den so erhaltenen elf oder zwölf Ziffern (Seriennummer ohne Prüfziffer)
- Berechne den Rest bei der ganzzahligen Division der Quersumme durch 9
- Berechne 8 - Rest
- Ist 8 – Rest = 0, dann gilt J = 9, in allen anderen Fällen gilt J = 8 - Rest
Ihr Programm soll
- eine beliebige Zeichenkette aus zwölf alphanumerischen Zeichen von der Tastatur einlesen und auf dem Bildschirm ausgeben
- prüfen, ob die Struktur der eingegebenen Zeichenkette der Vorgabe für eine Seriennummer (siehe oben) entspricht
- bei falscher Struktur eine Fehlermeldung am Bildschirm ausgeben
- die Prüfziffer der Seriennummer für die eingegebene Zeichenkette aus dem Ländercode und den Nutzziffern berechnen und auf dem Bildschirm ausgeben
- die so berechnete Prüfziffer (J) mit der eingegebenen Prüfziffer vergleichen
- als Ergebnis des Vergleichs einen Hinweistext auf dem Bildschirm ausgeben (z.B. „korrekte Serien-Nr.“ oder „gefälschte Banknote“)
Hinweise zum Lösungsweg
- Der Wert des Ländercodes soll mit Hilfe der ASCII-Werte der Buchstaben A bis Z berechnet werden.
- Erlauben Sie nur Großbuchstaben bei der Eingabe der Seriennummer.
- Benutzen Sie den Modulo-Operator (z. B. % oder MOD) zur Ermittlung des Divisionsrests
2 Kommentare
9 Lösung(en)
import java.util.Scanner;
/**
* Created by linus on 15.10.17.
*/
public class Main {
private String serialNumber;
private int countryCode;
public static void main(String[] args) {
new Main().init();
}
private void init() {
readSerialNumber();
checkStructure();
countryCode();
check();
good();
}
private void readSerialNumber() {
System.out.print("Seriennummer eingeben: ");
Scanner scanner = new Scanner(System.in);
serialNumber = scanner.nextLine().toUpperCase();
}
private void checkStructure() {
char a = serialNumber.charAt(0);
if(serialNumber.length() != 12) {
wrong();
} else if(!('A' <= a && a <= 'Z')) {
wrong();
}
for(int i = 1; i < serialNumber.length(); i++) {
char nj = serialNumber.charAt(i);
if(!('0' <= nj && nj <= '9')) {
wrong();
break;
}
}
}
private void countryCode() {
countryCode = serialNumber.charAt(0) - 'A' + 1;
}
private void check() {
int checksum = countryCode;
for(int i = 1; i < serialNumber.length() - 1; i++) {
char nj = serialNumber.charAt(i);
checksum += Integer.parseInt(String.valueOf(nj));
}
int remainder = checksum % 9;
int result = (8 - remainder) == 0 ? 9 : (8 - remainder);
System.out.println("Berechnete Prüfziffer: " + result);
if(result != Integer.parseInt(String.valueOf(serialNumber.charAt(serialNumber.length() - 1)))) {
wrong();
}
}
private void wrong() {
System.out.println("Seriennummer ist falsch!");
System.exit(0);
}
private void good() {
System.out.println("Seriennummer ist richtig!");
}
}
Lösung von: Name nicht veröffentlicht
import re
srn = input("Seriennummer: ")
pattern = re.compile(r"^([DEHJMNPRSTUVWXYZ])(\d{10})(\d)$", re.ASCII)
match = pattern.search(srn)
if not match:
print("Gefaelschte Banknote")
else:
lc = match.group(1)
lcn = str(ord(lc)-ord("A")+1)
print("Laendercode \"" + lc + "\" entspricht Ziffer " + lcn + ".")
prfzffr_orig = int(match.group(3))
print("Pruefziffer gegeben. " + str(prfzffr_orig))
prz_calc = 0
for i in lcn + match.group(2):
prz_calc = prz_calc + int(i)
prz_calc = 8 - (prz_calc % 9)
if prz_calc == 0:
prz_calc = 9
print("Pruefziffer berechnet:" + str(prz_calc))
if prz_calc == int(prfzffr_orig):
print("korrekte Serien-Nr.")
else:
print("gefaelschte Banknote")
Lösung von: André Trobisch ()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char serienNummer[13];
short zeichenPassend = 0;
int pruefZiffer;
puts("Bitte geben Sie die Seriennummer der Euro-Banknote ein, die sie prüfen möchten: ");
scanf("%12s", serienNummer);
for (int i = 1; i < strlen(serienNummer); i++) {
if (serienNummer[i] < 48 || serienNummer[i] > 57) {
zeichenPassend = 1;
break;
}
}
if (serienNummer[0] < 65 || serienNummer[0] > 91) {
puts("Ungültiger Ländercode an erster Stelle!");
} else if (strlen(serienNummer) < 12) {
puts("Seriennummer ist zu kurz!");
} else if (zeichenPassend) {
puts("Die Seriennummer darf nur aus einem Buchstaben und 11 Ziffern bestehen!");
} else {
pruefZiffer = (int) serienNummer[0] - 64;
for (int i = 1; i < strlen(serienNummer) - 1; i++) {
pruefZiffer += serienNummer[i] - '0';
}
pruefZiffer = ((8 - pruefZiffer % 9) == 0) ? 9 : 8 - pruefZiffer % 9;
if (pruefZiffer != serienNummer[11] - '0') {
printf("Prüfziffer ungültig! Errechnete Prüfziffer: %d", pruefZiffer);
} else {
printf("Die eingegebene Seriennummer ist gültig! Errechnete Prüfziffer: %d", pruefZiffer);
}
}
return (EXIT_SUCCESS);
}
Lösung von: Swen Krüger ()
//Farben
static void ueberschrift()
{
Console.ForegroundColor = ConsoleColor.Magenta;
Console.BackgroundColor = ConsoleColor.Gray;
}
static void gruen()
{
Console.ForegroundColor = ConsoleColor.DarkGreen;
}
static void rot()
{
Console.ForegroundColor = ConsoleColor.DarkRed;
}
static void nix()
{
Console.ResetColor();
}
static string Umwandlung(string Eingabe)
{
Eingabe = Convert.ToString(Console.ReadLine());
Eingabe = Eingabe.Replace("A", "1");
Eingabe = Eingabe.Replace("B", "2");
Eingabe = Eingabe.Replace("C", "3");
Eingabe = Eingabe.Replace("D", "4");
Eingabe = Eingabe.Replace("E", "5");
Eingabe = Eingabe.Replace("F", "6");
Eingabe = Eingabe.Replace("G", "7");
Eingabe = Eingabe.Replace("H", "8");
Eingabe = Eingabe.Replace("I", "9");
Eingabe = Eingabe.Replace("J", "10");
Eingabe = Eingabe.Replace("K", "11");
Eingabe = Eingabe.Replace("L", "12");
Eingabe = Eingabe.Replace("M", "13");
Eingabe = Eingabe.Replace("N", "14");
Eingabe = Eingabe.Replace("O", "15");
Eingabe = Eingabe.Replace("P", "16");
Eingabe = Eingabe.Replace("Q", "17");
Eingabe = Eingabe.Replace("R", "18");
Eingabe = Eingabe.Replace("S", "19");
Eingabe = Eingabe.Replace("T", "20");
Eingabe = Eingabe.Replace("U", "21");
Eingabe = Eingabe.Replace("V", "22");
Eingabe = Eingabe.Replace("W", "23");
Eingabe = Eingabe.Replace("X", "24");
Eingabe = Eingabe.Replace("Y", "25");
Eingabe = Eingabe.Replace("Z", "26");
return Eingabe;
}
static string Ausnahme(string Eingabe)
{
if (Eingabe.Length != 13)
{
Console.WriteLine();
rot();
Console.WriteLine("Die Eingabe erfüllt nicht die Struktur.");
Console.WriteLine();
nix();
}
return Eingabe;
}
static void Main(string[] args)
{
string Entscheidung = "";
do
{
string Eingabe = "";
string Ausnahm = "";
int pruef = 0;
Int32 Ausgabe;
List<int> Ausgabee = new List<int>();
do
{
ueberschrift();
Console.Write("Geben Sie den Code auf einem Euro-Schein ein: ");
nix(); gruen();
Eingabe = Umwandlung(Eingabe);
nix();
Ausnahm = Ausnahme(Eingabe);
} while (Eingabe.Length != 13);
//definiert die Prüfvariable
for (int i = Eingabe.Length - 1; i < Eingabe.Length; i++)
{
string ein = Eingabe.Substring(i, 1);
Int32.TryParse(ein, out Ausgabe);
pruef = Ausgabe;
}
//wandelt die Ziffern einzeln um, damit man daraus eine Quersumme bilden kann
for (int i = 0; i < Eingabe.Length - 1; i++)
{
string ein = Eingabe.Substring(i, 1);
Int32.TryParse(ein, out Ausgabe);
Ausgabee.Add(Ausgabe);
}
//Berechnung. Rundet das Ergebnis auf.
Console.WriteLine();
rot();
double rest = 0;
rest = (double)Ausgabee.Sum() / 9;
rest = Math.Ceiling(rest);
rest = 8 - rest;
//Ausgabe des Ergebnis
if (rest == 0)
{
Console.WriteLine("DIe Prüfziffer beträgt 9.");
if (pruef == 9)
{
Console.WriteLine("Die Banknote ist echt.");
}
if (pruef != 9)
{
Console.WriteLine("Die Banknote ist eine Fälschung.");
}
}
if (rest != 0)
{
Console.WriteLine("Die Prüfziffer beträgt: " + rest);
if (rest == pruef)
{
Console.WriteLine("Die Banknote ist echt.");
}
if (rest != pruef)
{
Console.WriteLine("Die Banknote ist eine Fälschung.");
}
}
nix();
Console.WriteLine();
Console.Write("Möchten Sie noch eine Banknote prüfen ? ");
Entscheidung = Convert.ToString(Console.ReadLine());
Console.WriteLine();
}while(Entscheidung=="ja"|| Entscheidung == "j");
}
Lösung von: Goo Muck (Uni)
using System;
using System.Linq;
namespace Banknoten
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Gebe den Banknoten Code ein:");
string Code = Console.ReadLine().Replace(" ", string.Empty).ToUpper();
//Erfasse Ländercode
int Land = Convert.ToInt32(Convert.ToChar(Code.Substring(0, 1))) - 64;
Code = Code.Remove(0, 1);
Code = Land.ToString() + Code;
//Berechne die Quersumme
int Quersumme = 0;
for (int i = 0; i < Code.Length - 1; i++)
{
Quersumme += Int32.Parse(Convert.ToString(Code[i]));
}
int Rest = Quersumme % 9;
if ((8 - Rest == 0 && Code.Substring(Code.Length - 1, 1) == "9") || (8 - Rest != 0 && Int32.Parse(Code.Substring(Code.Length - 1, 1)) == 8 - Rest))
Console.WriteLine("Der Code ist richtig");
else
Console.WriteLine("Der Code ist falsch");
Console.ReadLine();
}
}
}
Lösung von: Tobias Golz (Wilhelm Büchner Hochschule)
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Banknotes
{
public static void main(String[] args)
{
int givenCheckNumber, calculatedCheckNumber;
// Getting serial number
System.out.println("Bitte geben Sie die Seriennummer ihrer Banknote ein: ");
Scanner sc = new Scanner(System.in);
String serial = sc.next();
// Check, if the input string is a valid serial
String s = checkIfValid(serial) ? "Das ist eine Seriennummer." : "Das ist keine Seriennummer!" ;
// print the result
System.out.println(s);
// calculate the check digit based on the given serial
calculatedCheckNumber = calculateCheckDigit(serial);
System.out.println(calculatedCheckNumber);
// getting the given check digit
givenCheckNumber = Character.getNumericValue(serial.charAt(serial.length()-1));
// output the right message if the given digit is equal to the calculated one or not.
String message = (givenCheckNumber == calculatedCheckNumber) ? "Korrekte Banknote." : "Gefälschte Banknote!" ;
System.out.println(message);
sc.close();
}
private static boolean checkIfValid(String number)
{
Pattern p = Pattern.compile("[A-Z]{1}[0-9]{11}");
Matcher m = p.matcher(number);
return m.matches();
}
private static int calculateCheckDigit(String serial)
{
char c;
int crossSum = 0;
// loop runs not for the last digit since it is the check number to compare with
for (int i = 0; i < serial.length()-1; i++)
{
c = serial.charAt(i);
if(i == 0)
{
// treating the country code character like a number from 1 to 26
c -= 64;
crossSum += Integer.valueOf(c);
}
else
{
crossSum += Character.getNumericValue(c);
}
}
// calculate the check digit with the cross sum and the formula
return (8 - (crossSum % 9) == 0) ? 9 : 8 - (crossSum % 9);
}
}
Lösung von: Name nicht veröffentlicht
function isValidEuroSerial(str) {
let a = str.substr(0,1).toUpperCase(),
n = str.substr(1, 10),
j = str.substr(11);
if (str.length != 12) {
console.log('UngültigeEingabe');
return false;
}
if (a.charCodeAt(0) < 65 || a.charCodeAt(0) > 90) {
console.log('Ungültiger Ländercode');
return false;
}
if ((isNaN(parseInt(n)) || isNaN(parseInt(j)))) {
console.log('Ungültige Nutz- oder Prüfziffer');
return false;
}
a = a.charCodeAt(0);
let cSum = eval((a + n).split('').join('+'));
let c = 8 - (cSum % 9);
if (c == 0) c = 9;
if (j != c) {
console.log('Gefälschte Banknote');
return false;
} else {
console.log('Korrekte Seriennummer');
return true;
}
}
isValidSerialNumber(prompt('Seriennummer:'));
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
// NET Core 3.x; C# 8.x
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace CS_Aufgabe_Eurobanknoten
{
enum Codes
{
UK = 10, SE, FI, PT, AT, NL = 16, LU = 18, IT, IE, FR, ES, DK, DE, GR, BE
}
class Program
{
static void Main(string[] args)
{
var e = "unknown";
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..] }\n");
Console.Write($"Ländercode: { e }");
}
}
}
Lösung von: Jens Kelm (@JKooP)
// C++ 14 | VS-2022
#include <iostream>
#include <string>
#include <numeric>
#include <map>
std::string get_country(char country_code) {
const std::map<char, std::string> codes{
{'J', "GBR"}, { 'K', "SWE"}, {'L', "FIN"}, { 'M', "PRT"}, {'N', "AUT"}, { 'P', "NLD"}, {'R', "LUX"}, { 'S', "ITA"},
{'T', "IRL"}, { 'U', "FRA"}, {'V', "ESP"}, { 'W', "DNK"}, {'X', "DEU"}, { 'Y', "GRC"}, {'Z', "BEL"} };
auto f{ codes.find(country_code) };
if (f != codes.end()) return f->second;
return "unknown";
}
void validate(const std::string& serial_number) {
const auto cty_cod{ std::toupper(serial_number[0]) - 64};
const auto ser_num{ std::to_string(cty_cod) + serial_number.substr(1) };
const auto dgt_sum{ std::accumulate(ser_num.begin(), ser_num.end() - 1, 0, [](auto a, auto b) { return a + (b - '0'); })};
const auto chk_dgt{ ser_num.substr(ser_num.length() - 1)[0] - '0'};
const auto rem{ 8 - dgt_sum % 9 };
const auto rem_com{ rem == 0 ? 9 : rem };
std::cout << "Geldscheinnummer ist: " << (chk_dgt == rem_com ? "" : "un") << "gueltig\n";
std::cout << "Laendercode: " << get_country(cty_cod + 64) << "\n";
}
int main() {
validate("N15000723228");
}
Lösung von: Jens Kelm (@JKooP)
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 2 |
Schwierigkeit: | Leicht |
Webcode: | macy-76jt |
Autor: | () |
Kommentare (2)
Am Anfang stehen nun zwei Buchstaben. Der erste Buchstabe gibt kein Land mehr an, sondern steht für eine bestimmte Druckerei. Der zweite Buchstabe steht für eine druckereiinterne Zuordnung. Es folgen dann 9 Ziffern und am Ende die Prüfziffer. Aus den Buchstaben erhält man wie oben beschrieben nun 4 Ziffern. Diese 4 Ziffern addiert man ebenso zu den 9 folgenden Ziffern. Statt wie oben von 8 subtrahiert man am Ende von 7.
https://programmieraufgaben.ch/aufgabe/pruefziffer-auf-euro-banknoten/fy4ohgdx
'