C++ :: Aufgabe #323 :: Lösung #1

1 Lösung Lösung öffentlich
#323

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ß
#1
vote_ok
von JKooP (18090 Punkte) - 26.04.2021 um 20:43 Uhr
C++ 17
Quellcode ausblenden C-Code
#include "banknotes.h"

int main()
{
    const string banknote{ "X17291528696" };
    banknotes ba{ banknote };

    cout << "Die Geldscheinnummer hat das " << (ba.is_valid_format() ? "richtige" : "falsche") << " Format!" << endl;
    cout << "Die Geldscheinnummer ist " << (ba.is_valid_bank_note() ? "gueltig" : "ungueltig") << "." << endl;
    cout << "Der Geldschein kommt aus " << ba.get_country() << "." << endl;
}

.h
Quellcode ausblenden C-Code
#pragma once
#include <iostream>
#include <string>
#include <map>
#include <regex>
using namespace std;

class banknotes
{
private:
    string bn_;
    int get_checksum(string s);
    map<int, string>nzb{
    {10, "UK"}, {10, "UK"}, {11, "SE"}, {12, "FI"},
    {13, "PT"}, {14, "AT"}, {16, "NL"}, {18, "LU"},
    {19, "IT"}, {20, "IE"}, {21, "FR"}, {22, "ES"},
    {23, "DK"}, {24, "DE"}, {25, "GR"}, {26, "BE"} };

public:
    banknotes(string bank_note) :bn_{ bank_note } {}
    bool is_valid_format();
    bool is_valid_bank_note();
    string get_country();
};

.cpp
Quellcode ausblenden C-Code
#include "banknotes.h"

int banknotes::get_checksum(string s) {
    auto t{ 0 };
    for (size_t i = 0; i < s.length() - 1; i++)
        t += s[i] - 48;
    return t;
}

bool banknotes::is_valid_format() {
    regex r("[A-Z]{1}[0-9]{11}");
    return regex_match(bn_, r);
}

bool banknotes::is_valid_bank_note() {
    auto l{ bn_[0] - 64 };
    auto n{ to_string(l) + bn_.substr(1, bn_.length() - 1) };
    auto c{ get_checksum(n) };
    auto j{ (8 - c % 9 == 0 ? 9 : 8 - c % 9) };
    return j == n[n.length() - 1] - 48;
}

string banknotes::get_country() {
    return nzb.at(bn_[0] - 64);
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2430800

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.