Soit une image numérique dont les valeurs des pixels sont représentées par des nombres hexadécimaux enregistres dans un fichier texte nomme "ImgHexa.txt" à raison d'un nombre par ligne.
Aim de crypter le contenu du fichier "Inigllexa.txt", on utilise le Principe suivant :
1- Transférer le contenu du fichier "Ilmgileln.txt" vers un tableau d'enregistrements T. Chaque enregistrement est forme de trois champs commi suit :
- He : contient le nombre hexadécimal.
- Num : contient le numéro de la ligne du nombre hexadécimal dans le fichier.
- Dec contient l'équivalent décimal du nombre hexadécimal.
2- Trier le tableau T dans l'ordre croissant des valeurs du champ Dee.
3- Générer un code. sous forme (rune chaines de caractères. pour chaque nombre décimal du tableau T et l'enregistrer ainsi que son numéro de ligne Num dans Lin fichier texte nomme "Resultat.txt". Chaque ligne du fichier contiendra le code généré suivi par son numéro de ligne séparés par un espace.
NB : Utiliser la fonction Genere ci-dessous qui permet de générer un code a partir d'un nombre décimal Nb.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Fonction generer(nb):mot Début mot<-'' r <- nb mod 3 Selon r faire 0 : y <- "Ma" 1 : y <- "Des" 2 : y <- "Son" Fin selon mot <- y+mot nb <- nb div 3 Tant que (nb!=0) faire r <- nb mod 3 Selon r faire 0 : y <- "Ma" 1 : y <- "Des" 2 : y <- "Son" Fin selon mot <- y+mot nb <- nb div 3 Fin selon retourner mot Fin |
Travail demandé :
En utilisant un éditeur de texte disponible (Bloc-notes. Notepad, Notepad++, ...), créer un fichier texte nommé "ImgHexa.txt" et y saisir les nombres hexadécimaux ci-dessous, représentant les valeurs des pixels d'une image. a raison d'un nombre par ligne.
41, 26. 4D. 2D, 37. 74, AB, 26, 85, 68, 37, 82, AE, 94, 80, 35, 44, BO, 87, 56, 8C. 8E, SD, 8B, 38, 48
Ecrire un programme en Python intitule Cryptage qui permet de crier et de remplir un fichier texte "Resultat.1x1" par le résultat de cryptage du contenu du fichier texte "ImgHexa.txt" en utilisant le principe décrit précédemment.
Dans cet algorithme, On va utiliser trois fonctions et cinq procédures:
- la fonction exposant()
- la fonction conversion_decimale()
- la procédure remplir_tableau()
- la procédure afficher_tableau()
- la procédure trier_tableau()
- la fonction generer()
- la procédure remplir_fichier_resultat()
- la procédure afficher_fichier_resultat()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Algorithme cryptage Debut index = 0 # Remplissage du tableau à partir du fichier remplir_tableau(t) # Tri du tableau selon la valeur décimale trier_tableau(t, index) print('*** Tableau T trie ***') afficher_tableau(t, index) # Génération du fichier résultat remplir_fichier_resultat(t, index) print('*** Contenu du fichier Resultat ***') afficher_fichier_resultat() Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| index | entier |
| t | tableau |
Cette fonction permet de calculer la puissance d’un nombre entier
|
1 2 3 4 5 6 7 |
Fonction exposant(n:entier;e:entier):entier p <- 1 Pour i de 0 à e-1 faire p <- p * n Fin pour retourner p Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| p | entier |
Le rôle de cette fonction est de convertir un nombre écrit en base 16 (hexadécimal) sous forme de chaîne de caractères en un nombre entier en base 10 (décimal).
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Fonction conversion_decimale(nombre_hexa:chaîne):entier decimal <- 0 # Résultat en base 10 puissance <- 1 # Représente 16^0 au départ # Parcours de la chaîne de droite à gauche Pour i de long(nombre_hexa)-1 à 0 (pas=-1) faire chiffre <- nombre_hexa[i] # Conversion du caractère en valeur numérique Si '0' <= chiffre <= '9' alors valeur <- ord(chiffre) - ord('0') Sinon valeur <- ord(chiffre) - ord('A') + 10 Fin si # Ajout de la contribution du chiffre decimal = decimal + valeur * puissance # Passage à la puissance suivante de 16 puissance <- puissance * 16 Fin pour retourner decimal Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| decimal | entier |
| puissance | entier |
| chiffre | chaîne |
| valeur | valeur |
Le rôle de cette procédure est de lire les nombres hexadécimaux contenus dans le fichier ImgHexa.txt et de remplir le tableau t avec des enregistrements contenant leurs informations.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Procédure remplir_tableau(t:tableau) # Ouverture du fichier en lecture Ouvrir (f , "ImgHexa.txt", "r") # Lecture de toutes les lignes du fichier nombres_hexa <- Lire_lignes(f) Pour nombre_hexa dans nombres_hexa faire nombre_hexa <- nombre_hexa.strip('\n') # Suppression du retour à la ligne # Création d'un enregistrement sous forme de dictionnaire enregistrement = Enregistrement( Hex=str(), # Valeur hexadécimale Num=int(), # Numéro d'ordre Dec=int() # Valeur décimale ) # Remplissage du dictionnaire enregistrement['Hex'] <- nombre_hexa enregistrement['Num'] <- index + 1 enregistrement['Dec'] <- conversion_decimale(nombre_hexa) # Stockage dans le tableau t[index] <- enregistrement index <- index + 1 Fin pour Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| f | fichier |
| nombres_hexa | chaîne |
| nombre_hexa | chaîne |
| enregistrement | Enregistrement |
| index | entier (variale globale) |
Cette procédure affiche à l’écran les n premiers enregistrements du tableau t.
|
1 2 3 4 5 |
Procédure afficher_tableau(t:tableau;n:entier): Pour i de 0 à n-1 faire Ecrire(t[i]) Fin pour Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| i | entier |
Cette procédure trie le tableau t par ordre croissant en se basant sur le champ Dec en utilisant la méthode du tri par sélection.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Procédure trier_tableau(t:tableau; n:entier) Pour i de 0 à n-2 faire min_index <- i # Recherche du plus petit élément Pour j de i à n-1 Si t[min_index]['Dec'] > t[j]['Dec'] alors min_index <- j Fin si Fin pour # Échange des éléments si nécessaire Si min_index != i alors temp <- t[i]['Hex'] t[i]['Hex'] <- t[min_index]['Hex'] t[min_index]['Hex'] <- temp temp <- t[i]['Num'] t[i]['Num'] <- t[min_index]['Num'] t[min_index]['Num'] <- temp temp <- t[i]['Dec'] t[i]['Dec'] <- t[min_index]['Dec'] t[min_index]['Dec'] <- temp Fin si Fin pour Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| i | entier |
| min_index | entier |
| j | entier |
| temp | entier |
Cette procédure trie le tableau t par ordre croissant en se basant sur le champ Dec en utilisant la méthode du tri par sélection.
|
1 2 3 4 5 6 7 8 9 10 |
Procédure remplir_fichier_resultat(t:tableau; n:entier) # Ouverture du fichier en écriture Ouvrir(f , "Resultat.txt", "w") Pour i de 0 à n-1 code <- generer(t[i]['Dec']) Ecrire(f , code + ' ' + Convch(t[i]['Num']) + '\n') Fin pour Fermer(f) Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| f | fichier |
| i | entier |
| code | chaîne |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
from numpy import * # -------------------------------------------------- # Création d'un tableau 'serie' de 100 entiers initialisés à 0 # Utilisé plus tard dans la fonction divis7 # -------------------------------------------------- serie = array([int()] * 100) # -------------------------------------------------- # Fonction qui saisit un entier n >= 5 # -------------------------------------------------- def saisie(): # Saisie initiale n = int(input('donner un nombre >=5: ')) # Vérification de la validité de la saisie while not (n >= 5): n = int(input('donner un nombre >=5: ')) # Retourner la valeur valide return n # -------------------------------------------------- # Procédure qui remplit le fichier "Nombre.txt" # avec n entiers saisis par l'utilisateur # -------------------------------------------------- def remplir_fichier_nombre(n): print('*** Remplir fichier Nombre.txt ***') # Ouverture du fichier en écriture f = open("Nombre.txt", "w") # Saisie et écriture des entiers dans le fichier for i in range(n): nbr = input('donner un entier: ') f.write(nbr + '\n') # Chaque entier est écrit sur une nouvelle ligne # Fermeture du fichier f.close() # -------------------------------------------------- # Fonction qui vérifie si un nombre est divisible par 13 # en utilisant une méthode de regroupement des 3 derniers chiffres # -------------------------------------------------- def divis13(n): s = 0 # Somme partielle sg = -1 # Alternance du signe (-1, +1) # Tant que le nombre a plus de 3 chiffres while len(n) > 3: # Prendre les 3 derniers chiffres v = int(n[len(n)-3:len(n)]) s = s + v * sg # Ajouter à la somme avec le signe sg = -sg # Inverser le signe pour la prochaine tranche n = n[0:len(n)-3] # Retirer les 3 derniers chiffres # Ajouter les chiffres restants v = int(n) s = s + v * sg # Retourner True si divisible par 13, False sinon return abs(s) % 13 == 0 # -------------------------------------------------- # Fonction qui vérifie si un nombre est divisible par 7 # en utilisant la série [1,3,2,-1,-3,-2] de manière répétitive # -------------------------------------------------- def divis7(n, serie): # Réduire le nombre à un chiffre par itérations while len(n) != 1: s = 0 k = 0 for i in range(len(n)): # Somme pondérée selon la série s = s + int(n[len(n)-1-i]) * serie[k] if k < 5: k = k + 1 else: k = 0 n = str(s) # Réduire le nombre à la somme calculée # Vérification finale : divisible par 7 si résultat = 0 ou 7 if n == '7' or n == '0': return True else: return False # -------------------------------------------------- # Procédure qui remplit les fichiers "Div13.txt" et "Div7.txt" # -------------------------------------------------- def remplir_fichiers_div(): # Ouverture des fichiers f_nbr = open("Nombre.txt", "r") # Fichier source f_div13 = open("Div13.txt", "w") # Fichier pour les nombres divisibles par 13 f_div7 = open("Div7.txt", "w") # Fichier pour les nombres divisibles par 7 # Lecture de tous les nombres nombres = f_nbr.readlines() for nombre in nombres: nombre = nombre.strip('\n') # Supprimer le saut de ligne if divis13(nombre): # Vérifier divisibilité par 13 f_div13.write(nombre + '\n') if divis7(nombre, serie): # Vérifier divisibilité par 7 f_div7.write(nombre + '\n') # Fermeture des fichiers f_nbr.close() f_div13.close() f_div7.close() # -------------------------------------------------- # Procédure qui affiche le contenu d'un fichier # -------------------------------------------------- def afficher_fichiers_div(nom_fichier): print('*** Contenu fichier ' + nom_fichier + ' ***') # Ouverture en lecture f = open(nom_fichier, "r") nombres = f.readlines() # Affichage ligne par ligne for nombre in nombres: nombre = nombre.strip('\n') print(nombre) # Fermeture du fichier f.close() # -------------------------------------------------- # Initialisation de la série utilisée pour divis7 # -------------------------------------------------- serie[0] = 1 serie[1] = 3 serie[2] = 2 serie[3] = -1 serie[4] = -3 serie[5] = -2 # -------------------------------------------------- # Programme principal # -------------------------------------------------- n = saisie() # Saisie du nombre d'entiers remplir_fichier_nombre(n) # Remplissage du fichier Nombre.txt remplir_fichiers_div() # Remplissage des fichiers Div13.txt et Div7.txt afficher_fichiers_div("Div13.txt") # Affichage des nombres divisibles par 13 afficher_fichiers_div("Div7.txt") # Affichage des nombres divisibles par 7 |
Exécution du programme

La robotique éducative joue un rôle important dans l'éducation des enfants et des jeunes en les aidant à acquérir des compétences en science et technologie.
Dans ce cadre notre site web représente une excellente ressource pour les parents, les enseignants et les enfants qui souhaitent découvrir la robotique.
Zaouiet Kontech-Jemmel-Monastir-Tunisie
+216 92 886 231
medaliprof@gmail.com
Site robotique réalisé par Mohamed Ali Haj Salah - Prof Info