Bar Code Assignment

TPC, Pythonhomework
Back

Bar code image

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

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.