code barre - division euclidienne

Retrouver tous les sujets résolus.
Répondre
Cédric

code barre - division euclidienne

Message par Cédric » jeu. 29 sept. 2022 09:01

Bonjour,
je ne comprends pas pourquoi l'algorithme suivant pour une vérification de clé de contrôle ne fonctionne pas si je tape
par exemple Codebarre(9780201379624) et qu'il devrait afficher 4.
En effet, j'ai trouvé comme somme S = 96 à la fin de la boucle et donc comme clé 10-6 = 4.
Merci de votre aide !
C.

def Codebarre(L):
S=0
clé=0
for i in range(6):
S=S+L[2*i]+3*L[2*i+1]
if S%10!=0:
clé=10-S%10
return clé==L[12]
sos-math(21)
Messages : 10348
Enregistré le : lun. 30 août 2010 11:15

Re: code barre - division euclidienne

Message par sos-math(21) » jeu. 29 sept. 2022 13:01

Bonjour,
dans ton programme, tu fais référence à des indices donc cela suppose que ton argument est un objet itérable, c'est-à-dire dont on peut parcourir les valeurs.
Ici tu saisis un entier, qui n'est pas itérable. Il faudrait donc que tu mettes ton numéro entre guillemets ou apostrophes, afin que python le comprenne comme une chaine de caractère qui est bien un itérable dont on pourra lire les caractères.
Le problème est que désormais, dans ce type de données, chaque chiffre de ton code (L[..]) sera considéré comme une chaine de caractères
Il faudra alors que ces caractères soient reconvertis en entiers afin d'être réutilisés dans un calcul.
Je te propose la correction suivante (je ne me prononce pas sur la correction de l'algorithme vis-à-vis de la problématique) :

Code : Tout sélectionner

def code_barre(L):
    S = 0
    cle = 0
    for i in range(6):
        S = S + int(L[2*i]) + 3 * int(L[2*i+1])
        if S%10 !=0 :
            cle = 10 - S % 10
    return cle == int(L[12])
Et on a l'appel :

Code : Tout sélectionner

>>> code_barre('9780201379624')
True

Bonne continuation
Cédric

Re: code barre - division euclidienne

Message par Cédric » jeu. 29 sept. 2022 16:55

Merci !
Vous m'avez permis de trouver d'où venait mon erreur.
Ainsi, si je saisis Codebarre([9,7,8,0,2,0,1,3,7,9,6,2,4]) avec l'algorithme de départ, ça fonctionne !
Merci !
C.
sos-math(21)
Messages : 10348
Enregistré le : lun. 30 août 2010 11:15

Re: code barre - division euclidienne

Message par sos-math(21) » jeu. 29 sept. 2022 18:05

Bonjour
Une liste étant aussi un iterable cela marchera aussi pour le parcours des éléments
Il y aura juste que les transtypages int(…) n’auront plus d’utilité car tu manipules déjà des entiers donc il sera inutile de les convertir en entiers
Néanmoins cela ne génère pas d’erreur dans l’exécution du programme donc tu peux saisir l’un ou l’autre en argument
Bonne continuation
Répondre