Binnen het ISBN-10 (International Standard Book Numbering) systeem dat tot eind 2006 gebruikt werd, kreeg elk boek een unieke code toegewezen die bestaat uit 10 cijfers. De eerste 9 daarvan geven informatie over het boek zelf, terwijl het laatste louter een controlecijfer is dat dient om foutieve ISBN-10 codes te detecteren.
Als $$x_1, \ldots, x_9$$ de eerste 9 cijfers van een ISBN-10 code voorstellen, dan wordt het controlecijfer $$x_{10}$$ als volgt berekend: \[x_{10} = (x_1+ 2x_2+ 3x_3+ 4x_4+ 5x_5+ 6x_6+ 7x_7+ 8x_8+ 9x_9)\!\!\!\!\mod{11}\,\] Het controlecijfer $$x_{10}$$ kan m.a.w. de waarden 0 tot en met 10 aannemen. Als het controlecijfer gelijk is aan 10, dan wordt dit in de ISBN-10 code genoteerd als de letter X. Op die manier wordt het controlecijfer altijd door één enkel karakter voorgesteld.
Binnen het nieuwe ISBN-13 systeem krijgt elk boek een unieke code toegewezen die bestaat uit 13 cijfers. De eerste 12 daarvan geven informatie over het boek zelf, terwijl het laatste louter een controlecijfer is dat dient om foutieve ISBN-13 codes te detecteren. Als $$x_1, \ldots, x_{12}$$ de eerste 12 cijfers van een ISBN-13 code voorstellen, dan wordt het controlecijfer $$x_{13}$$ als volgt berekend: \[\begin{align} o &= x_1 + x_3 + x_5 + x_7 + x_9 + x_{11} \\ e &= x_2 + x_4 + x_6 + x_8 + x_{10} + x_{12} \\ x_{13} &= (10 - (o + 3e)\!\!\!\!\mod{10})\!\!\!\!\!\mod{10}\end{align}\] Het controlecijfer $$x_{13}$$ kan m.a.w. de waarden 0 tot en met 9 aannemen, waardoor ISBN-13 codes uitsluitend uit cijfers bestaan.
Een ISBN-13 code heeft een vaste structuur die heel wat informatie bevat. De eerste 3 cijfers zijn ofwel 978 ofwel 979. De codes die beginnen met 978 zijn boeken waarvoor er ook een ISBN-10 code is. Na de eerste 3 cijfers volgt er eerst een aanduiding van de landengroep waar dit boek is gepubliceerd. Deze aanduiding kan 1 tot en met 5 karakters bevatten. Daarna volgt een identificatie van de uitgever en het item. Het laatste karakter is, zoals reeds beschreven werd, een controlecijfer.
De ISBN-10 code van een boek met een ISBN-13 code kan eenvoudig berekend worden. Deze berekening is wel enkel geldig voor ISBN-13 codes die beginnen met de prefix 978:
verwijder de cijfers 978 vooraan de code
verwijder het controlecijfer achteraan de code
bereken het nieuwe controlecijfer volgens de regels van ISBN-10
Definieer een klasse ISBN13 waarmee ISBN-13 codes kunnen voorgesteld worden. Bij het aanmaken van een ISBN-13 code (ISBN13) moet een getal (int) doorgegeven worden. De klasse moet er bij het aanmaken van een nieuwe ISBN-13 code (ISBN13) nog van uitgaan dat dit getal een geldige ISBN-13 code voorstelt, zonder dat dit expliciet gecontroleerd wordt. Daarnaast kan bij het aanmaken optioneel ook nog een tweede argument doorgegeven worden dat de lengte van de landaanduiding (int) van de ISBN-13 code aangeeft (standaardwaarde: 1). Als de opgegeven lengte niet in het interval $$[1, 5]$$ ligt, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige ISBN code.
Als er een ISBN-13 code $$c$$ (ISBN13) wordt doorgegeven aan de ingebouwde functie str, dan moet een stringvoorstelling (str) van ISBN-13 code $$c$$ teruggegeven worden. Hierbij worden er koppeltekens tussen de verschillende groepen geplaatst: de prefix 978 of 979, de landaanduiding, de identificatie van uitgever en item en het controlecijfer.
Als er een ISBN-13 code $$c$$ (ISBN13) wordt doorgegeven aan de ingebouwde functie repr, dan moet een string (str) teruggegeven worden die leest als een Python expressie om ISBN-13 code (ISBN13) aan te maken. Daarbij moet de lengte van de landaanduiding (int) van $$c$$ expliciet als tweede (positioneel) argument doorgegeven worden.
Op een ISBN-13 code $$c$$ (ISBN13) moet je minstens de volgende methoden kunnen aanroepen:
Een methode isgeldig waaraan geen argumenten moeten doorgegeven worden. De methode moet een Booleaanse waarde (bool) teruggeven die aangeeft of $$c$$ een geldige ISBN-13 code voorstelt.
Een methode alsISBN10 waaraan geen argumenten moeten doorgegeven worden. De methode moet een string (str) teruggeven met de voorstelling van ISBN13-code $$c$$ als ISBN-10 code. Als zo'n voorstelling niet bestaat (omdat $$c$$ geen geldige ISBN-13 code is of omdat $$c$$ niet begint met de prefix 978), dan moet de waarde None teruggegeven worden.
>>> code = ISBN13(9780136110675)
>>> print(code)
978-0-13611067-5
>>> code
ISBN13(9780136110675, 1)
>>> code.isgeldig()
True
>>> code.alsISBN10()
'0-13611067-3'
In onderstaande video legt Pythia uit hoe je deze opgave kunt aanpakken. Bekijk deze video als opstapje naar het oplossen van de oefeningen over objectgericht programmeren1.