Bill checker: un vérificateur de validité de billets européens

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 889 fois - Téléchargée 19 fois

Contenu du snippet

Voilà ma toute première source sur CS alors ne soyez pas trop méchants :) Ce code ne fait que vérifier la validité du numéro de série d'un billet, je l'ai posté pour avoir vos avis sur le code, vu que j'essaie de coder "proprement" :) Merci !

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>

int TesterValidite(char code[], int tailleCode, int positionLettre)
{
    int codeFinal[12] = {0};
    int j;
    int total = 0;
    for(j=0;j!=tailleCode;j++) 
        codeFinal[j] = code[j] - '0';
    for(j=1;j!=tailleCode;j++)
        total += codeFinal[j]; 
    total += (positionLettre / 10) + (positionLettre % 10) ;
    if((total +1) % 9) return 0;
    else return 1;
}

int main()
{
    printf("\n\n\n\n\n\n\n\n\n\n\t\t\tCode de validite : ");
    char code[13] = "";
    scanf("%s", code);
    int positionLettre = code[0] - 'A' +1;
    if(TesterValidite(code, 12, positionLettre)) printf("\n\n\n\t\t\t\tValide !\n\n\n");
    else printf("\n\n\n\t\t\t\tInvalide !\n\n\n");
    return 0;

A voir également

Ajouter un commentaire

Commentaires

LeFauve42
Messages postés
239
Date d'inscription
vendredi 20 octobre 2006
Statut
Membre
Dernière intervention
20 avril 2009
-
> Grosse erreur à ne jamais faire dans un programme:
> {
> char code[12] = "";
> scanf("%s", &code);
> //...
> }

Accessoirement, code etant un tableau (et donc un pointeur) il faudrait ecrire :
scanf("%s", code);
Ou a la rigueur :
scanf("%s", &(code[0]));

Eric
verdy_p
Messages postés
203
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
29 janvier 2019
-
oups! mettre "valide = isValid(numero)" entre parenthèses avant le "?"
verdy_p
Messages postés
203
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
29 janvier 2019
-
@CptPingu: la fonction atol() ne peut pas marcher pour convertir un si grand nombre (elle retourne un "long" qui sur un système 32-bits est identique à un "int" limité à 32-bits signé).

Ma version corrigée est plus proche de ta première version, mais n'utilise aucun tampon interne supplémentaire, ni les couteuses et dangereuses sprintf(), atol():

#include <stdio.h>

int isValid(const char* code)
{
if (strlen(code) != 12)
return 0; // mauvaise longueur !
int somme = code[0] - 'A' + 2; // rang de la lettre, +1 pour le test du modulo 9 final égal à 8.
//note : dans un modulo 9, il est inutile de décomposer unités et dizaines de la somme ci-dessus.
if (somme < 2 || somme > 27)
return 0; // ce n'est pas une lettre de 'A' à 'Z'
// traiter les 11 chiffres après la lettre
for (int i = 11 ; i > 0; i--) {
const int chiffre = code[i] - 0;
if (chiffre < 0 || chiffre > 9)
return 0; // ce n'est pas un chiffre de '0' à '9'
somme += chiffre;
}
return somme % 9 == 0; // et non 8, car on a déjà ajouté 1 ci-dessus à la somme.
}

int main(int argc, char** argv)
{
char tampon[14]; // + 1 pour un caractère excédentaire, et +1 pour le caractère nul de fin de chaîne
char* numero;
int valide;

printf("Numéro de série du billet : ");
if (argc > 1)
printf("%s\n", numero = argv[1]); // prendre le numéro depuis la ligne de commande
else // permettre de lire jusqu'à un caractère de trop en plus (afin de tester les numéros trop longs)
scanf("%13s", numero = tampon); // tampon doit donc avoir au moins 14 positions (y compris le nul final).

printf("Ce numéro %s\n",
valide = isValid(numero) ? "semble correct." : "est invalide !");

// Permet de tester aussi le statut en sortie du programme (IF ERRORLEVEL 1 ...)
return !valide;
// Convention la plus courante (DOS/Windows/Unix/Mac...) :
// statut = 0 si résultat OK, 1 si résultat faux (>1 ou <0 si exception ou abandon prématuré)
// Note: sous VMS, la convention de statut est inversée :
// statut = 1 si résultat OK, 0 si résultat faux (>1 ou <0 si exception ou abandon prématuré)
}
verdy_p
Messages postés
203
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
29 janvier 2019
-
Pour les lettres valides (premier caractère du code billet), il semble qu'actuellement on n'ait que l'une des 12 lettres suivantes: LMNPRSTUVXYZ (donc moins que les 17 pays membres : à vérifier si depuis on a des séries imprimées à Chypre, Malte, Estonie, Slovaquie, Slovénie).

Note: Même si le Vatican, Saint-Marin et Monaco ont été autorisé officiellement à utiliser l'euro et même à émettre des pièces en euros, ils n'émettent pas de billets car ils ne sont pas membres.
Le Kosovo utilise encore officiellement l'euro uniquement dans le cadre provisoire des accords de Dayton (traité de paix international dans lequel l'Union européenne est garante), mais le Kosovo n'est pas encore reconnu comme un pays et ne peut pas être membre. Les euros servent uniquement pour l'administration du territoire par l'ONU puis maintenant par un représentant de l'Union européenne, mais est encore reconnu comme partie de la Serbie. Le Monténégro a choisi unilatéralement d'utiliser l'euro, de même qu'Andorre : ils ne peuvent par émettre de billets (d'ailleurs ni l'un ni l'autre n'a encore de banque centrale nationale, uniquement un établissement national titulaire des garanties d'emprunts d'Etat dans n'importe quelle autre devise inernationale négociable sur les marchés financiers).

Andorre toutefois a été autorisé à émettre des pièces commémoratives libellés en euros, mais sans valeur marchande (des pièces commémoratives en euros, avec un design distinct, sont également autorisées dans les membres, y compris la France).

----

La Suisse n'a pas d'euros mais une association privée de banques émet des "euros WIR" sur les marchés financiers et transactions commerciales de gré à gré (sans pièces ni billets), et sans garantie du gouvernement suisse. Ce sont essentiellement des lignes de compte que peuvent détenir et s'échanger en Suisse entreprises et particuliers pour faciliter les échanges de liquidité sans avoir besoin de recourir au change avec le franc suisse.

(un peu aussi comme les "eurodollars" en Europe, dans certaines banques privées qui autorisent la tenue de compte dans cette devise, sans avoir au préalable à signer une déclaration fiscale aux Etats-Unis, comme on le fait quand on dispose d'un compte titre sur des valeurs cotées en dollars sur les marchés américains: NYSE, DASDAQ, et certaines valeurs EuroNext).

Cependant la liquidité de ces devises "bis" (dont la valeur est presque alignée sur celle de la devise première, avec un léger décalage dans le temps pouvant prendre plusieurs jours) n'est pas assurée sur tous les marchés internationaux (donc le négoce peut prendre plus de temps en cas de change, et nécessite toutefois que quelqu'un dispose de la devise originale et l'accepte en échange de la devise "bis").

----

Le franc CFA, le franc Pacifique, l'escudo du Cap-Vert sont émis avec une valeur fixe par rapport à la valeur équivalente en l'euro du franc français ou de l'escudo portugais, mais selon un accord spécial ayant permis de conserver les accords monétaires pendant l'adoption de l'euro. Mais leur cours peut être révisé sur décision des pays engagés dans ces accords monétaires. Pour le franc Pacifique, seule la France peut fixer la parité avec l'euro. Pour le franc CFA, cela se fait dans deux organisations internationales différentes ayant chacune leur banque centrale (il y a deux devises) : la France en est membre et apporte des garantie financières mais elles sont limitées ce qui a déjà conduit plusieurs fois à des révisions de leur parité par rapport au franc français et maintenant l'euro. La BCE n'apporte aucune garantie à ces devises où la France et le Portugal sont engagés.

Pour le florin des Antilles en fait sa valeur est appuyée sur un panier de devises comprenant le dollar américain (et selon des décisions d'ajustement de ce panier par les Etats antillais des Pays-Bas et l'Etat métropolitain), et pas seulement l'euro (de fait il n'y a pas de parité fixe avec l'euro).

Il en serait de même si le Royaume-Uni rejoignait l'euro pour sa livre sterling (GBP), et sa parité par rapport à la livre de Gibraltar, la livre de Jersey, la livre de Guernesey, et la livre des Falklands, avec leur propre billets et leur propre institut d'émission monétaire, même si la livre sterling y est aussi couramment échangée (à parité sous réserve des contrôles de change locaux) ; certains autres territoires britanniques utilisent soit le dollar américain, soit le dollar Caraïbes (dont la valeur est actuellement à valeur fixe par rapport au dollar américain). Ces territoires d'outre-mer britanniques (ainsi que les 3 possessions de la Couronne, en Manche et en mer d'Irlande) qui utilisent d'autres devises que la livre sterling ne sont toutefois pas dans l'union européenne, ni même formellement dans le Royaume-Uni qui assure leur défense et sécurité en accord avec les parlements locaux (pas même non plus l'île de Man qui pourtant utilise la livre sterling car cette île n'a pas d'institut monétaire local).

Les seuls territoires d'outre-mer britanniques qui utilisent la livre sterling et non une devise locale sont:
- ceux des bases de souveraineté à Chypre (il est question que ces territoires passent à l'euro pour des raisons pratiques avec la population locale, qui compte de nombreux personnels ayant la citoyenneté d'une des deux républiques ; comme c'est aussi déjà le cas pour la zone tampon gérée par l'ONU et qui joint ces deux bases, l'ensemble séparant les deux républiques qui formellement font partie toutes deux de l'Union européenne, y compris en terme de citoyenneté : à Chypre du Nord, l'euro est de plus en plus utilisé à la place de la nouvelle livre turque, ces deux devises étant utilisées de facto).
- la base militaire américaine de Diego Garcia, qui fait formellement partie du Territoire britannique de l'océan Indien (mais a été concédé aux Etats-Unis qui peuvent l'administrer contre un bail de location, mais après que dans les années 1960 dans les années 1960 la population locale y ait été évacuée de force, celle-ci poursuit aujourd'hui le gouvernement britannique devant des cours européennes) : dans cette île, qui ne fait pas non plus formellement partie du Royaume-Uni, c'est le dollar américain qui est utilisé (de même que la base américaine de Guantanamo à Cuba).

Les îles Åland sont une dépendance de la Finlande en mer Baltique mais à proximité immédiate de la Suède : on y parle le suédois et non le finnois et on n'y utilise pas l'euro comme le reste de la Finlande, mais encore la couronne suédoise (qui aurait déjà dû rejoindre l'euro mais la Suède s'est arrangée pour bloquer le processus automatique d'entrée par des dispositions techniques afin de repousser l'échéance). Ces îles finlandaises sont bien dans l'union européenne (de même que la Finlande et la Suède) même si elles un statut d'autonomie spécial au sein de la Finlande. En pratique toutefois, l'euro y circule facilement (d'autant que la couronne suédoise a stabilisé son cours par rapport à l'euro). Il n'y a pas de devise spéciale donc pas d'émissions spécifiques de pièces et billets en euros.
cptpingu
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90 -
@verdy_p: Merci pour ces précissions intéressantes. (PS: cryptage => chiffrement)

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.