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")