C++ :: Aufgabe #323 :: Lösung #1
1 Lösung
#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ß
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
von JKooP (18090 Punkte)
- 26.04.2021 um 20:43 Uhr
C++ 17
C-Code
.h
C-Code
.cpp
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
#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
#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
Seite 1 von 0
1
