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