Validateur isbn (10 chiffres) et issn (8 chiffres)

Contenu du snippet

Ce code contient quatres modules permettant la validation de ISSN et de ISBN avec ou sans tirets. De plus, le code contient un example de leur utilisation qui est de toute façon assez simple.

Source / Exemple :


#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include <sstream>

using namespace std;

/****

  • SéparerCode :
  • Sépare le code donné en un vecteur de int et met la clé à la fin.
  • /
void SéparerCode(std::vector<int>& p_codeSéparé, const std::string& p_code) { bool valide= true; string::size_type posRecherche= 0; for (int i= 0; i != p_code.size(); ++i) { if (p_code[i] != '-') { int nb; // Nombre à être pris du code. istringstream iss(p_code.substr(posRecherche, 1)); iss >> nb; // On essaie de lire un nombre. if (iss.fail()) // Le caractère était vide ou n'était pas un chiffre. { // Si le dernier caractère est égal à X alors // la valeur 10 lui est assigné. if (i == p_code.size()-1 && toupper(p_code[i]) == 'X') nb= 10; else valide= false; } p_codeSéparé.push_back(nb); } ++posRecherche; } // Si le code contient autre chose que des tirets, des chiffres et le X de la clé // on met le size du vecteur p_codeSéparé à 1 pour qu'il ne soit pas valide. if (! valide) p_codeSéparé.resize(1); } /**** int CléDuCode(const std::vector<int>& p_codeSéparé) { int sommeDesMultiplications= 0; // p_codeSéparé.size()-1 pour ne pas compter la clé de validation dans le calcul. for (int i= 0; i != p_codeSéparé.size()-1; ++i) sommeDesMultiplications+= p_codeSéparé[i] * (p_codeSéparé.size() - i); return 11 - (sommeDesMultiplications % 11); } bool IsbnValide(const std::string& p_isbn) { //### vector<int> codeSéparé; // Les nombres du codes séparés pour calculer la clé. SéparerCode(codeSéparé, p_isbn); if (codeSéparé.size() < 10) // Le ISBN doit contenir 10 nombres. return false; return CléDuCode(codeSéparé) == codeSéparé.back(); } bool IssnValide(const std::string& p_issn) { //### vector<int> codeSéparé; // Les nombres du codes séparés pour calculer la clé. SéparerCode(codeSéparé, p_issn); if (codeSéparé.size() < 8) // Le ISSN doit contenir 8 nombres. return false; return CléDuCode(codeSéparé) == codeSéparé.back(); } int main() { string isbn= "0-306-40615-2"; cout << "0-306-40615-2 attendu -> VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "2-266-11156-6 (2)"; cout << "2-266-11156-6 (2) attendu -> VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "2864971895"; cout << "2864971895 attendu -> VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "2709816288"; cout << "2709816288 attendu -> VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "286X971895"; cout << "286X971895 attendu -> NON VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "2-236-11156-X"; cout << "2-236-11156-X attendu -> NON VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "203582633X"; cout << "203582633X attendu -> NON VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; cout << "--Continuer--"; cin >> isbn; cin.ignore(); string issn= "0317-8471"; cout << "0317-8471 attendu -> VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0361-686X"; cout << "0361-686X attendu -> VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0065-0382"; cout << "0065-0382 attendu -> VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0190-2946"; cout << "0190-2946 attendu -> VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0001-9836"; cout << "0001-9836 attendu -> VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0261-686X"; cout << "0361-686X attendu -> NON VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "006503824"; cout << "006503824 attendu -> NON VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0190-f946"; cout << "0190-2946 attendu -> NON VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0001-983X"; cout << "0001-9836 attendu -> NON VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; }

Conclusion :


Si vous trouvez des bugs n'hésitez pas à me le faire savoir.
Merci

Benjamin

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.