Bar Code Assignment
A barcode is just a way of representing data in a visual form. - Bill Gates
Program that uses the notions of functions, functional decomposition, lists and structures as well as Turtle drawings in order to encode and to decode postal codes in different forms.
Tech Stack
- Python
- Turtle
Code
Python
# Poulin-Corriveau, Tommy ; 11 mars 2023
"""
Programme qui utilise les notions de fonctions, de décomposition fonctionnelle,
de tableaux et d'enregistrements ainsi que de dessins Tortue afin d'encoder et
de décoder des codes postaux sous différentes formes.
"""
import turtle
"""
Fonction digitToCode(digit)prend comme paramètre un chiffre de 0 à 9 et
retourne le code textuel de ce chiffre.
"""
def digitToCode(digit):
# Création d'un dictionnaire qui associe chaque chiffre
#à son code textuel correspondant
codesChiffres = {
0: "||:::",
1: ":::||",
2: "::|:|",
3: "::||:",
4: ":|::|",
5: ":|:|:",
6: ":||::",
7: "|:::|",
8: "|::|:",
9: "|:|::"
}
return codesChiffres[digit]
"""
La Fonction barCode(zipCode) prend comme paramètre un entier positif
composé de 5 chiffres et retourne le code textuel de ce nombre, si l’entier
paramètre n’est pas composé de 5 chiffres, la chaîne vide doit être retournée
comme valeur.
"""
def barCode(zipCode):
# Convertit le code postal en chaîne de caractères
zipCode_str = str(zipCode)
# Vérifie que la chaîne de caractères a une longueur
#de 5 et ne contient que des chiffres
if len(zipCode_str) != 5 or not zipCode_str.isdigit():
return ""
# Crée une liste des chiffres en convertissant chaque
#caractère de la chaîne en entier
digits = []
for d in zipCode_str:
digits.append(int(d))
# Calcule le chiffre de contrôle
digitSum = sum(digits)
controlDigit = (10 - digitSum % 10) % 10
#barre au début
code = "|"
# Parcourt la liste des chiffres et ajoute leur code textuel correspondant
for digit in digits:
code += digitToCode(digit)
# Ajoute le code textuel du chiffre de contrôle
code += digitToCode(controlDigit)
#barre à la fin
code += "|"
return code
"""
2.3 Fonction codeToDigit(code)prend comme paramètre un texte correspondant au
code de chiffre et retourne le chiffre correspondant ou -1 si le code textuel
est invalide.
"""
def codeToDigit(code):
codesChiffres = {
0: "||:::",
1: ":::||",
2: "::|:|",
3: "::||:",
4: ":|::|",
5: ":|:|:",
6: ":||::",
7: "|:::|",
8: "|::|:",
9: "|:|::"
}
#Parcourt le dictionnaire des codes textuels
for digit, digitCode in codesChiffres.items():
# Si le code textuel correspond au code en entrée,
# retourne le chiffre associé
if digitCode == code:
return digit
# Si aucun code textuel ne correspond au code en entrée,
# retourne -1 pour indiquer une valeur invalide
return -1
"""
Fonction zipCode(bars)prend comme paramètre un texte correspondant à un
code-barres et retourne le code postal correspondant ou -1 si le texte
n’est pas valide.
"""
def zipCode(bars):
# Vérifie si la longueur du code à barres est de 32 caractères
# et si le premier et le dernier caractères sont des barres verticales
if len(bars) != 32 or bars[0] != "|" or bars[-1] != "|":
return -1
# Supprime les barres verticales de début et de fin
bars = bars[1:-1]
digits = []
# Parcourt le code à barres en groupes de 5 caractères
for i in range(0, len(bars), 5):
digitCode = bars[i:i+5]
# Convertit chaque groupe de 5 caractères en un chiffre
digit = codeToDigit(digitCode)
# Si le code textuel est invalide, retourne -1
if digit == -1:
return -1
digits.append(digit)
# Extrait le chiffre de contrôle et supprime-le de la liste des chiffres
controlDigit = digits[-1]
digits = digits[:-1]
digitSum = sum(digits)
# Vérifie si la somme des chiffres et le chiffre de contrôle sont valides
if (digitSum + controlDigit) % 10 != 0:
return -1
# Convertit la liste des chiffres en un code postal (entier)
zipCode = ""
for digit in digits:
zipCode += str(digit)
return int(zipCode)
"""
La fonction dessiner(bars)prend comme paramètre un texte correspondant à un
#code-barres et on le dessine sur la fenêtre de dessin avec la tortue.
"""
def dessiner(bars):
turtle.clear()
turtle.pu()
turtle.goto(-155, 0)
turtle.pd()
turtle.pensize(5)
# Vérifie si la longueur du code à barres est de 32 caractères
# et si le premier et le dernier caractères sont des barres verticales
if len(bars) != 32 or bars[0] != "|" or bars[-1] != "|":
return
# Convertit le code à barres en une liste de caractères
codes = list(bars)
# Parcourt la liste des caractères
for code in codes:
# Si le caractère est ":", dessine une barre courte
if code == ":":
turtle.pd()
turtle.lt(90)
turtle.fd(15)
turtle.bk(15)
turtle.rt(90)
turtle.pu()
# Sinon, dessine une barre longue
else:
turtle.pd()
turtle.lt(90)
turtle.fd(30)
turtle.bk(30)
turtle.rt(90)
turtle.pu()
# Espacement entre chaque barre
turtle.fd(10)
#fonction des tests
def tests():
#tests de la fonction dessiner
dessiner(barCode(95014))
dessiner(barCode(11101))
dessiner(barCode(88345))
#tests de la fonction digitToCode
assert digitToCode(0) == "||:::"
assert digitToCode(1) == ":::||"
assert digitToCode(9) == "|:|::"
#tests de la fonction codeToDigit
assert codeToDigit("||:::") == 0
assert codeToDigit(":::||") == 1
assert codeToDigit("|:|::") == 9
assert codeToDigit("invalid_code") == -1
#tests de la fonction barCode
assert barCode(12345) == "|:::||::|:|::||::|::|:|:|::|:|:|"
assert barCode(67890) == "|:||::|:::||::|:|:|::||:::||:::|"
assert barCode(11111) == "|:::||:::||:::||:::||:::||:|:|:|"
assert barCode(00000) == ""
assert barCode(100000) == "" # Entier à 6 chiffres
tests()
© Tommy Poulin-Corriveau.