Algo en C++ pour le numéro INSSE

Signaler
-
 buffy140 -
bonjour à tous,
je sais pas si j'ai mis ma question au bon thème.
Voila je dois faire un algo en C++ qui permet d'afficher la clé de contrôle d'un numéro INSEE.
je n'arrive pas a trouver la fonctions qui permet de prendre X valeurs qui sera divisé par le modulo 97.
Voila le début du code en algo

variables
a,b,c=réel

début
a=10^3 modulo(97)
b=10^6modulo(97)
c=10^9 modulo(97)

Afficher"saisir les 13 premiers chiffres"
saisir tab(i)
"le problème est la comment je peux récuperer les restes du nombre (ex 2047 /97) qui est dans le tableau. Je veux pas
compter les variables mais faire un bloc.
pour i de 0 à

etc...
il me manque la fonction qui permettra de retourné le reste.


après voilà je bloque que la vue qu'après je pense avoir réussi.
Merci par avance
Buffy140

15 réponses

Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Salut,

pas sûr d'avoir compris la demande, toutefois je peux rappeler que l'opérateur "modulo" est le %, et d'après ce que j'ai trouvé sur le net concernant le numéro INSEE et sa clé de contrôle, tu devrais avoir un truc du genre :
int clé = 97 - (num % 97);
bonjour,
merci pour le modulo
mais concernant la récupération d'un bloc de nombres afin de faire de prendre seulement le reste de la division 97
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Je comprends toujours pas la question

Pour la "récupération" du numéro INSEE ça va dépendre de ton interface, et puis ce numéro peut être considéré comme un seul entier (ne commence pas par 0) donc je comprends pas ton histoire de "bloc de nombres".

Enfin, "prendre seulement le reste de la division [euclidienne]" est la définition exacte du modulo, je vois donc pas non plus le souci.
j'ai un numéro de 13 chiffres qui faaut faire des blocs.
ce qui donnera sur papaier
N=A*10^9+CB*10^6+C*10^3+D
je voudrais calculer A modulo97 mais je sais pas comment isoler ces chiffres afin de faire la division.
je sais pas si c'est la bonne méthode car sur la papier on le fait de cette manière. Après en C++ je sais pas.
Car ma prof veut que l'on fasse apparaître les 10^9,10^610^3
cordialement
Messages postés
4718
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
14 janvier 2021
14
sujet déplacé vers c++

cantador
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Bon, refaisons un point.

Tu parles du numéro NIR (numéro d'inscription au répertoire des personnes physiques), l'identifiant qu'on trouve sur les cartes vitales, on est d'accord ?

Pour la description des chiffres tu peux te reporter à cette page.
On remarque que le découpage en gros c'est :
1 : Sexe
2-5 : date de naissance
6-10 : lieu de naissance (C dans ta formule, uniquement pour le code commune)
11-13 : numéro d'ordre (D dans ta formule)
+14-15 : clé de contrôle
Donc déjà je comprends pas le découpage que tu nous proposes (A et CB n'ont pas de sens).

Et pour la vérification via la clé de contrôle, c'est la totalité qu'il faut diviser par 97 et pas juste la partie A.

Donc plusieurs possibilités :
- tu as mal compris l'énoncé,
- ton prof t'as donné un exercice factice.
Dans un cas comme dans l'autre il nous faut l'énoncé pour espérer comprendre ta demande. Fais déjà la démarche habituelle en algo : déterminer la(les) entrée(s) attendue(s) et déterminer la(les) sortie(s) cherchée(s).
bonsoir,
oui c'est le numéro INSEE que se trouve sur la carte vitale.
Donc on prend les 13 chiffres on divise par 97 .
Et après on calcule 97-le reste que l'on a trouvé précidément?
Cordialement
l'énoncé est:"
Un numéro INSEE composé de 15 chiffres. Les deux derniers constituent la clé K. Selon la méthode détaillée en cours vous écrivez l'algorithme qui calcule les deux chiffres de la clé K."
puis vous implémenterez en C
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Oui, tu prends le numéro dans son entier, tu récupères le reste de sa division euclidienne par 97 (grâce au modulo) que tu soustrais à 97. ça correspond à la petite formule que je t'ai mise dans ma première réponse.

Sinon j'ai l'impression que tu as les éléments du NIR et non le numéro dans son entier, d'où l'utilisation des puissances de 10 pour remonter ce NIR.

Si on imagine donc que tu as ces parties de NIR en entrée et que tu recherches la clé de contrôle en sortie tu peux déjà écrire le prototype suivant :
public int GetControlKey(int sex, int birthyear, int birthmonth, 
                         int departmentcode, int towncode,
                         int ordernum);

(pour failloter tu peux aussi déterminer les contraintes des entrées de cet algo, comme "NIR pour une personne née en France métropolitaine hors Corse")

Dans cette fonction il faut remonter le NIR depuis ses éléments et pour cela on va utiliser les puissances de 10 pour "décaler" les valeurs en les positionnant comme dans le NIR :
{
    long NIR = ordernum + towncode *10^3
                        + departmentcode *10^6
                        + birthmonth *10^8
                        + birthyear *10^10
                        + sex *10^12;
    // ...


Maintenant qu'on a remonter le NIR on a plus qu'à appliquer la petite formule définie plus haut et retourner le résultat :
    // ...
    return (97 - (NIR % 97));
}


Voili voilou. Et dans le cas où l'entrée serait directement le NIR alors ça simplifie grandement la fonction, qui peut alors s'écrire en une seule ligne :
public int GetControlKey(long NIR) { return (97 - (NIR % 97)); }


PS : il y a peut-être des erreurs de syntaxe, j'ai pas fait de C++ depuis quelques temps déjà.
bonsoir,
merci beaucoup je vais le mettre en algo et je le renvoyerait
voici mon code en algo.
Est ce que c'est correct?
Algo Clé INSEE
Variables
GetcontrolKey, sex, birthyear, brithmorth, departementcode ,towcode ,ordernum: entire
Début
Afficher « veuillez saisir vous 13 chiffres de votre numero INSSE qui se trouve sur votre carte vitale par exemple » ;*
Saisir GetControlKey ;
public int GetControlKey(int sex, int birthyear, int birthmonth,
int departmentcode, int towncode,
int ordernum);
{
long NIR = ordernum + towncode *10^3
+ departmentcode *10^6
+ birthmonth *10^8
+ birthyear *10^10
+ sex *10^12;
return (97 - (NIR % 97));
}
public int GetControlKey(long NIR) { return (97 - (NIR % 97)); }
Afficher ? la clé de contrôle est:? getControlKey ;
Fin


meric par avance
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Plusieurs petites choses à redire :
- tu as quelques fautes de frappes, d'orthographe et de syntaxe,
- si tu fais un algo linéaire pas besoin d'encapsuler le code dans une fonction,
- vu la demande de saisie au début ("veuillez saisir vos 13 chiffres de votre numero INSSE") je pense que tu es dans le cas où on te fourni directement le NIR dans son entier, donc pas besoin de le remonter avec les puissances de 10.
bonjour,
j'ai modifier l'algo:
je vous le met en citation

Algo Clé INSEE
Variables
Somme, NIR =entier
Début
Afficher « veuillez saisir vous 13 chiffres de votre numéro INSSE qui se trouve sur votre carte vitale par exemple » ;*
Saisir NIR;
somme= (97 - (NIR % 97));
Afficher ? la clé de contrôle est:? somme ;
Affciher « Donc voici votre numéro INSEE complet : » NIR,somme
Fin

Est -il correct afin de le traduire en C++ sur codeblock
Merci par avance
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
L'algo me parait correct.
Maintenant je connais pas CodeBlock, fait-il des "traduction" automatique ?
bonjour,
je ne sais pas je vais le tester. Merci beaucoup