Lycée Levavasseur

NSI 1ère groupe2

TP-Le code ISBN

In [ ]:
Noms : CORRECTION

Le code ISBN d’un livre

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 :

  • les libraires peuvent passer des commandes standardisées,
  • les distributeurs ont le même code pour traiter les commandes et les retours,
  • les différentes opérations de gestion dans les bibliothèques et centres de documentation sont également facilitées.

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

L’ISBN est un numéro à 13 chiffres depuis le 1er janvier 2007

ISBN.png

(les ouvrages antérieurs avaient un ISBN à 10 chiffres).

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.

🟥 Le problème :

Étant donné un code ISBN, est-il valide?

Dans un premier temps, examinons comment est calculée la clé de contrôle:
Calcul_cle.png

À faire 1:

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...

  • Toute personne pourra vérifier la validité d’un code ISBN, sans connaître les calculs à faire.
  • On entre le code ISBN dans une zone de saisie, et un programme nous informe de la validité du code...

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 :

À faire 2:

✍️ 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).

algo_isbn.png

🟥Représentation du code ISBN :

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 :

In [1]:
code = input("Entrez le code à 13 chiffres : ")
print(type(code))
Entrez le code à 13 chiffres : 9782123456803
<class 'str'>

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:

  • puisque nous connaissons la longueur de la chaîne, on utilise l’instruction code[12] (le 1er étant d’indice 0, le 13ème est d’indice 12)
  • On peut aussi, et cela est pratique, lorsque l’on ne connaît pas à priori la longueur de la chaîne, utiliser l’instruction code[-1], qui donne accès au dernier caractère.

🐍 Exécuter la cellule ci-dessous

In [2]:
# A EXECUTER
# ces deux instructions donnent le même résultat

code = input("Entrez le code à 13 chiffres : ")

print(code[12])
print(code[-1])
Entrez le code à 13 chiffres : 9782123456803
3
3

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().

À faire 3:

🐍 Pour s’en convaincre, tester le script ci-dessous, avec le code 9782123456803 et expliquer les affichage obtenus.

In [3]:
code = input("Entrez le code à 13 chiffres")

print(3*code[-1])
print(3*int(code[-1]))
Entrez le code à 13 chiffres9782123456803
333
9

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 inttransforme le caractère en nombre.
Le résultat est 3 x 3 = 9

Les calculs :

Notre code est une chaîne de 13 caractères : code = "9782123456803"

En détails :

indice.png

  • 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 :

In [4]:
code = "9782123456803"
s1 = 0 # on initialise s1 à 0
for i in range(0,11,2):
    s1 = s1 + int(code[i])
    
print(s1)
34

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.

À faire 4:

Écrire une boucle qui calcule s2.

In [5]:
# A faire ici
s2 = 0  # on initialise s2 à 0
for i in range(1,12,2):
    s2 = s2 + int(code[i])*3
    
print(s2)
63

À faire 5:

La clé de contrôle se calcule comme suit :

  • On détermine le reste de la division de s = s1 + s2 par 10.
  • Si ce reste est nul alors la clé est égale à 0.
  • Sinon la clé est égale à 10 - reste.

🐍 Écrire le code qui calcule cette clé de contrôle

In [7]:
# A faire ici
s = s1 + s2
reste = s % 10 
if reste == 0:
    cle = 0
else:
    cle = 10 - reste
    
print(cle)
3

🟥Pour finir ... :

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.

In [8]:
# 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
In [9]:
validite(code)
Out[9]:
True

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.

In [11]:
# A faire ici
assert (len(code) == 13) , "Le code ISBN doit être de 13 chiffres"

Vérifier les codes ci-dessous image_isbn2.png

In [16]:
print(validite("9788175257665"))
print(validite("9780733426094"))
print(validite("9783161484100"))
print(validite("9780747595823"))
print(validite("9781234567897"))
True
True
True
True
True
In [15]:
print(validite("9457881702576"))
False

🟥Pour les plus rapides :

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

In [ ]:
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>""")

Exercice 1 :

✍️ 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

Exercice 2 :

🐍 Ecrire une fonction qui prend en paramètre un n° d’INSEE et qui renvoie vrai si son n° est valide et faux sinon.

In [23]:
# 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")
Out[23]:
True
In [25]:
# 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")
Out[25]:
True