Noms : CORRECTION
LâISBN est un numĂ©ro international normalisĂ© permettant lâidentification dâun livre dans une Ă©dition donnĂ©e.
ISBN est lâacronyme dâInternational Standard Book Number.
LâISBN a Ă©tĂ© conçu pour simplifier le traitement informatisĂ© des livres :
Par ailleurs, le caractĂšre international de cette numĂ©rotation constitue, Ă lâĂ©tranger Ă©galement, une rĂ©fĂ©rence unique pour tous les professionnels du livre.
LâISBN identifie donc de façon unique un livre quel que soit son support de publication,
imprimé ou numérique.
â Deux livres peuvent avoir le mĂȘme titre, mais auront des codes ISBN diffĂ©rents
Les parties de lâISBN : 978 2 1234 5680 3
978, signifie que lâarticle est un livre (âBooklandâ) ( 979 sera aussi employĂ© en fonction des besoins...)
Dans un code barre, les 3 premiers chiffres indiquent le pays producteur, comme 978 et 979 ne sont pas utilisés, on les a attribués aux livres...
La deuxiĂšme partie de lâISBN est le numĂ©ro identifiant le groupe national, linguistique ou gĂ©ographique.
Le 2 identifie la francophonie dans son ensemble.
1234 : Câest un numĂ©ro qui identifie un Ă©diteur en particulier.
5680 : Câest le numĂ©ro dâidentification dâune Ă©dition donnĂ©e dâune publication produite par un Ă©diteur en particulier.
3 : La cinquiĂšme partie de lâISBN est la clĂ© de contrĂŽle. Il sâagit de la partie finale de lâISBN qui est reliĂ©e aux prĂ©cĂ©dents caractĂšres de la chaĂźne par un algorithme mathĂ©matique et qui permet dâen vĂ©rifier la validitĂ©.
La clé peut varier de 0 à 9.
Ătant donnĂ© un code ISBN, est-il valide?
Dans un premier temps, examinons comment est calculée la clé de contrÎle:
Ce travail va se faire Ă la main sans utiliser un programme Python
âïž 1. On additionne les rĂ©sultats de la derniĂšre ligne :
9 + 21 + 8 + 6 + 1 + 6 + 3 + 12 + 5 + 18 + 8 + 0 = 97
âïž 2. On calcule le reste de la division par 10 de la somme obtenue :
97 = 9 x 10 + 7. Le reste est donc de 7
âïž 3. Si ce reste est 0, alors la clĂ© de contrĂŽle est 0, sinon la clĂ© de contrĂŽle est alors le rĂ©sultat de 10 - reste, soit ici :
On a 7 â 0. Donc cle = 10 - 7 = 3
Conclusion
Donc en comparant le résultat et la clé de contrÎle du code ISBN, on peut affirmer que le
code ISBN est valide ou pas.
Câest un cas typique oĂč lâinformatique est dâune aide prĂ©cieuse...
Dans un second temps, écrivons un algorithme qui permet de savoir si un code ISBN est
valide ou pas.
Il sâagit de dĂ©crire la mĂ©thode pour rĂ©soudre ce problĂšme :
âïž Quelles sont les donnĂ©es en entrĂ©es?
Le code ISBN
âïž La variable somme reçoit
La somme des 12 premiers chiffres du code ISBN. Avec les coefficients appropriés
âïž La variable reste reçoit
Le reste de la division euclidienne de la variable somme par 10
âïž
Si la variable reste est égale à 0 alors la variable cle reçoit 0
Sinon la variable cle reçoit 10 - reste
Si la variable cle est égale au 13Úme chiffre alors on retourne TRUE
Sinon on retourne FALSE
Dans un troisiĂšme temps, il faudra traduire cet algorithme dans un langage de programmation (Python dans notre cas).
Comme câest lâutilisateur qui donne le code ISBN, lâentrĂ©e sera une chaĂźne de caractĂšres.
đ ExĂ©cutez la cellule ci-dessous :
code = input("Entrez le code Ă 13 chiffres : ")
print(type(code))
Une chaßne de caractÚre étant itérable, on peut accéder à chacun des caractÚres via leurs
indices.
Par exemple :
Pour accéder au dernier caractÚre:
code[12]
(le 1er Ă©tant dâindice 0, le 13Ăšme est dâindice 12)code[-1]
, qui donne accĂšs au dernier caractĂšre. đ ExĂ©cuter la cellule ci-dessous
# A EXECUTER
# ces deux instructions donnent le mĂȘme rĂ©sultat
code = input("Entrez le code Ă 13 chiffres : ")
print(code[12])
print(code[-1])
Nous avons donc la variable code
qui contient une chaĂźne de 13 caractĂšres.
Nous savons accĂ©der Ă chacun dâentre eux et nous pouvons transformer chacun de ces caractĂšres en nombre avec la fonction int()
.
đ Pour sâen convaincre, tester le script ci-dessous, avec le code 9782123456803 et expliquer les affichage obtenus.
code = input("Entrez le code Ă 13 chiffres")
print(3*code[-1])
print(3*int(code[-1]))
Répondre ici :
premier print
333, car l'ordinateur considĂšre la variable code comme appartenant au type : "str".
Ainsi, puisque l'on lui demande de prendre le dernier caractĂšre de la chaĂźne ; on enchaĂźne par une multiplication de cette chaĂźne de caractĂšre.
De ce fait, le résultat est 3 x "3", soit "333".
deuxiĂšme print
la commande int
transforme le caractĂšre en nombre.
Le résultat est 3 x 3 = 9
Notre code est une chaĂźne de 13 caractĂšres : code = "9782123456803"
En détails :
Il faut faire la somme s1
des caractĂšres (transformĂ©s en nombre) dâindices (0, 2, 4, 6, 8, 10).
Il faut faire la somme s2
pondĂ©rĂ©e par 3 des caractĂšres (transformĂ©s en nombre) dâindices (1, 3, 5, 7, 9, 11).
Il faudra ajouter s1
et s2
.
đ VĂ©rifier que le code ci-dessous effectue bien le calcul de s1
:
code = "9782123456803"
s1 = 0 # on initialise s1 Ă 0
for i in range(0,11,2):
s1 = s1 + int(code[i])
print(s1)
Remarque:
Lâinstruction for i in range(0,11,2):
signifie que la boucle dĂ©marre Ă lâindice 0 pour aller jusquâĂ lâindice 11 non compris (soit lâindice 10) et cela avec un pas de 2.
Ăcrire une boucle qui calcule s2
.
# A faire ici
s2 = 0 # on initialise s2 Ă 0
for i in range(1,12,2):
s2 = s2 + int(code[i])*3
print(s2)
La clé de contrÎle se calcule comme suit :
s = s1 + s2
par 10. đ Ăcrire le code qui calcule cette clĂ© de contrĂŽle
# A faire ici
s = s1 + s2
reste = s % 10
if reste == 0:
cle = 0
else:
cle = 10 - reste
print(cle)
Il ne reste plus quâĂ comparer cette clĂ© calculĂ©e avec le 13Ăšme chiffre du code ISBN, sâil y a Ă©galitĂ© alors le code est valide, sinon il nâest pas valide.
Votre travail :
đ Ăcrire une fonction validite(code)
qui prend en paramĂštre un code ISBN
entrĂ© par lâutilisateur, et qui renvoie True
si ce code est valide et False
sinon.
# A faire ici
def validite(code):
assert (len(code) == 13) , "Le code ISBN doit ĂȘtre de 13 chiffres"
s1 = 0 # on initialise s1 Ă 0
s2 = 0 # on initialise s2 Ă 0
for i in range(0,11,2):
s1 = s1 + int(code[i])
for i in range(1,12,2):
s2 = s2 + int(code[i])*3
s = s1 + s2
reste = s % 10
if reste == 0:
cle = 0
else:
cle = 10 - reste
if cle == int(code[-1]):
return True
else:
return False
validite(code)
Un plus :
Si lâutilisateur se trompe en entrant par exemple 12 chiffres, Il faudrait que le programme signifie lâerreur.
Pour cela on utilise lâinstruction :
assert .........== 13 , '.....................................'
Si lâutilisateur ne rentre pas un code ISBN de 13 caractĂšres, il en sera informĂ© par lâaffichage :
AssertionError: Le code ISBN doit ĂȘtre de 13 chiffres
đ ComplĂ©ter cette instruction et la mettre au dĂ©but de la fonction.
# A faire ici
assert (len(code) == 13) , "Le code ISBN doit ĂȘtre de 13 chiffres"
Vérifier les codes ci-dessous
print(validite("9788175257665"))
print(validite("9780733426094"))
print(validite("9783161484100"))
print(validite("9780747595823"))
print(validite("9781234567897"))
print(validite("9457881702576"))
Voici un second TP qui vous conduira à écrire une fonction en Python qui vérifie la validité d'une carte vitale.
Exécuter la cellule ci-dessous
Faire les questions 1 et 2 dans les cellules prévues
from IPython.display import HTML
HTML("""<iframe width="1000" height="800" src=https://www.levavasseur.xyz/NSI_P/Python/TP/Introduction_files/res_carte_vitale.pdf type='application/pdf' allowfullscreen></iframe>""")
âïž VĂ©rifier que le n° dâINSEE 1 52 03 55 527 002 38 est valide
Répondre ici :
On a 1 52 03 55 527 002 38
Le nombre avec les 13 premier chiffre est : 1520355527002
reste = 1520355527002 - 97 x 15673768319
reste = 59
đ Ecrire une fonction qui prend en paramĂštre un n° dâINSEE et qui renvoie vrai si son n° est valide et faux sinon.
# A faire ici
def validite(code):
assert (len(code)== 15) , 'Le code de la carte vitale doit ĂȘtre de 15 chiffres'
reste = int(code[:-2]) % 97
cle = 97-reste
return cle == int(code[-2:])
validite("152035552700238")
# Autre version
def validite_bis(code):
assert (len(code)== 15) , 'Le code de la carte vitale doit ĂȘtre de 15 chiffres'
reste = int(code[:-2]) % 97
cle_calcule = 97 - reste
if int(code[-2:]) == cle_calcule :
return True
else :
return False
validite_bis("152035552700238")