Bonsoir, je bloque sur un programme python que je dois écrire.
Il faut que j'écrive un programme python qui demande à l'utilisateur les 15 premiers chiffres de sa carte bancaire, qui les stocke dans une variable a, qui affiche la liste a et qui donne la clé de la carte.
Je pense que j'ai compris la première partie du programme avec la liste mais après je pense qu'il faut juste que je retranscrive le programme déjà fait ( qui permet de vérifier le numéro) et que je modifie la fin pour calculer la clé mais si c'est ce qu'il faut faire je n'y arrive pas. J'ai écrit quelque trucs mais rien ne marche pouvez-vous m'aider ?

bonsoir
dommage que tu n'aies pas recopié intégralement l'énoncé.
là, tu le racontes à ta façon et tout n'est pas très clair.
par exemple, à quoi correspond le "c" dans l'algorithme ?
a est une liste, ses éléments sont indicés.
d'après ce que je comprends, l'écriture a2k+1, avec k varie de 0 à 7, permet de cibler les 8 éléments de rang impair.
pour le reste d'une division, tu as la fonction modulo (%)
J'ai écrit quelque trucs mais rien ne marche --- montre ce que tu as fait (avec le début du programme)
ok
tu as testé ce programme donné pour voir ?
modifie ce programme pour qu'il te permette de saisir les 15 chiffres de la carte, et qui affiche la liste
le début me semble ok
erreurs :
1) for k in range (0,7)
==> k va prendre les valeurs 0, 1, 2, 3, 4, 5, 6 et pas 7
donc si tu veux que ta boucle tourne 8 fois, il faut ...?
à savoir : in range (0,7) peut se remplacer par in range (7) :
à défaut, le compteur part de 0
2) à ton avis, de quel type est l'input réalisé au début : int, float, ou str ?
parce que lorsque tu vas multiplier par 2, ensuite, le résultat risque d'être surprenant...
attention à la correspondance entre les indices impairs et les indices de la liste a :
tes 15 nombres sont numérotés de 1 à 15
n° ordre des chiffres : 1 2 3 4 5 6 7 ........ 15
mais dans la liste, ils sont indicés de 0 à 14
donc si tu veux cibler les 8 n° d'ordre impair (1, 3, 5..., 15)
faut adapter les indices dans la liste.
seconde boucle:
for k in range (1,7) : même problème que précédemment : si tu veux 7 itérations, tu dois changer le second paramètre
remarque : P = P + a[2*k] peut s'écrire P += a[2*k]
on doit calculer c dans le programme python. Le 1er algorithme que j'ai envoyé nous servait pour vérifier si un numéro de carte bancaire était bon quand on connaissait les 16 chiffres ( on devait l'utiliser pour les premières questions de l'exercice) mais comme on en a que 15 je suppose qu'on doit modifier la fin pour calculer c.
J'ai modifié un peu le programme en fonction de tes remarques mais quand je le lance ça me met un message d'erreur sur la ligne où on définit R.
oui, normal, cf mon 2) de 21h43
==> sans autre précision, un 'input' renvoie une chaine (str) et non pas un entier, comme tu le souhaites.
ainsi, si python sait multiplier une str par 2, il ne peut pas calculer un modulo !
que dois-tu rajouter, par exemple sur la ligne de "a.insert...." ?
je viens de voir :
ta dernière boucle ; l'indice de a n'est pas correct
tu souhaites accéder aux n° d'ordres pairs :
pour k = 1
2k+1 = 3
donc tu vas accéder à a[3], donc au 4ème chiffre
...et donc tu as zappé le second chiffre de la liste 
ça me met une erreur sur le print qui renvois la liste.
Merci de ton aide d'ailleurs je suis plutôt une bille en programmation.
juste pour le fun :
le programme peut être 'allégé'
P=I=R=0 --- 1 ligne au lieu de 3
et
R = 2*a[2*k] % 9
I += R
peut s'écrire I += 2*a[2*k] % 9 ---- plus besoin de la variable R
j'obtiens I=29 et P=21
il semblerait que P marche mais que I ne fasse pas le reste de la division par 9
euh, je ne comprends pas ton raisonnement, là.
je reprends ce que tu as dit plus haut :
On sait que S=I+P+c et que S est un multiple de 10
donc c=S-(I+P) sachant que S=10k
dans ton exemple
I+P = 50 --> multiple de 10 --> donc clé = 0
certes, ici, ça ne nous aide pas trop
reste à voir dans ton énoncé si la clef peut être nulle...
---
un autre exemple, plus général :
I = 29
P = 25
clé = .?
Les chiffres qui composent la clé sont compris entre 0 et 9 c'est pour ça que il y a forcément un problème dans la ligne de R.
J'ai calculé rapidement la somme des chiffres de rang pair (donc P) et j'ai trouvé 21 donc ça serait bon dans le programme mais j'ai aussi calculer I rapidement (il y a peut être une erreur ) et j'ai aussi trouvé 21 donc ça ferait S=21+21=42 donc c serait égale à 8 ce qui pourrait être possible.
Les chiffres qui composent la clé sont compris entre 0 et 9 c'est pour ça que il y a forcément un problème dans la ligne de R.
je ne vois pas le problème avec R.
R est toujours entier compris entre 0 et 8
---
S=21+21=42 donc c serait égale à 8 ==> oui
donc quelle formule tu vas écrire ?
ah non j'ai du faire une erreur et oublier le dernier chiffre en calculant I à la main et je trouve bien I=29 donc ça ferait bien S=29+21=50 et donc c qui serait égale à 0.
bonjour
@alb12
je viens de regarder plus attentivement ton lien; la différence porte sur le calcul de R :
ici, R est égal au reste de la division euclidienne par 9
tandis que sur l'algo de Luhn, si on est >9, on enlève 9
ainsi, dans le cas d'un 9 pour chiffre de rang impair :
- l'exo va calculer (2*9)%9 et retourner 0
- l'algo de Luhn va calculer (2*9)-9 et retourner 9
évidement la clef ne sera plus la même.
c'est ce à quoi tu pensais ? (merci pour ton alerte)
----
ici, l'énoncé est une photo, donc pas de risque d'erreur de recopie;
j'en déduis que le professeur a sciemment choisi cette procédure,
ne serait-ce que pour éviter des copier-coller de réponses trouvées sur le net. (?)
ah, messages croisés.
oui, ici il faut calculer la clé,
mais, sauf erreur de compréhension de ma part, il y a effectivement une différence importante entre les 2 algos, tu as raison.
Pour calculer c j'ai fait:
for k in range(0,21):
c=10*k-(I+P)
if 0<=c<=9:
print('La clé de la carte est',c)
ça me donne les bons résultats mais ça me parait pas être complétement correct par rapport a 10*k qui remplace le S mais sinon je sais pas comment le traduire
il y a bien plus simple
réfléchis à partir d'un exemple, comme tu as fait hier soir
I = 29
P = 25
quels calculs (détaillés) fais-tu à la main pour trouver la clé ?
je te cite :
"ça ferait S=21+21=42 donc c serait égale à 8 ce qui pourrait être possible."
décortique les étapes de ce raisonnement, et écris les
pas besoin d'une boucle pour trouver la clef.
Oui désolé, je suis rentrée du lycée.
Pour c, je fais I+P et ensuite je regarde combien il manque pour pouvoir avoir un multiple de 10
ici 29+21=50, il manque 0 pour avoir un multiple de 10
je te propose un peu différemment :
on fait 29+25=54 ---- oui, ça ok
60-54=6 ==> plutôt que de chercher le complément à la dizaine supérieure,
pourquoi ne pas s'intéresser d'abord au 4 du 54 ?
quel opérateur tu peux utiliser pour récupérer 4 à partir du 54 ?
ensuite, trouver 6 sera facile...
pour info:
Sur le devant d'une carte bancaire, on peut lire 16 chiffres. Les 15 premiers ont une signification (identification de la banque, du numéro de compte...) et le 16e est une clé de vérification qui permet de savoir s'il y a eu une erreur en recopiant le numéro par exemple.
Pour vérifier si un numéro est valide, on considère les 16 chiffres de la carte.
On commence par multiplier par deux tous les chiffres de rang impair (le premier, le troisième etc.). Si le résultat de la multiplication par deux dépasse 9, on soustrait 9.
On additionne tous les chiffres du numéro obtenu après ces multiplications par deux.
Si le résultat est un multiple de 10 alors le numéro est valide. Sinon, il ne l'est pas.
bonsoir alb12,
suis bien d'accord.
mais là, tu décris l'algo de Luhn, qui est différent de l'énoncé de mazel.
ah ça ! on va faire une réclamation auprès du professeur
je l'ai testé avec une vraie carte, ça marche pas ^^
Pour c=6 on fait 10-4
mais concrètement qu'est ce que je dois écrire pour (I+P)%10?
Si le programme de l'énoncé est ce que ça influe aussi sur le résultat de la question c ?

Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :