Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

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

Bitte melde dich an um einen Kommentar abzugeben

Kommentare (2)

romeotango_wipy 25. Mai 2018 19:03   reply report
Version für neue Scheine ab 2013 (Zweite Serie):
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.
kuseli 17. Oktober 2017 15:24   reply report
Duplikat von
https://programmieraufgaben.ch/aufgabe/pruefziffer-auf-euro-banknoten/fy4ohgdx
'

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

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 2
Schwierigkeit: Leicht
Webcode: macy-76jt
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen