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
0 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: