Un robot est capable de se déplacer dans un terrain rectangulaire en commençant d'un point de départ et en exécutant un parcours donné sous forme d'une succession de pas.
Les pas autorisés sont :
- Vers le haut, le pas est symbolisé par 'H'
- Vers le bas, le pas est symbolisé par 'B'
- Vers la droite, le pas est symbolisé par 'D'
- Vers la gauche, le pas est symbolisé par 'G'
Le terrain où se déplace le robot est représenté sous forme d'une grille formée de NL lignes et NC colonnes avec NL et NC sont deux entiers de l'intervalle [1..100].
Initialement, le robot se trouve dans une position désignée par un numéro de ligne(L) et un numéro de colonne (C) ou L est dans l'intervalle [1..NL] et C est dans l'intervalle [1..NC].
Le parcours est exprimé ainsi sous forme d'une séquence S formée uniquement par des lettres majuscules : "H", "B", "G" et "D".
Exemple: La séquence S="HHDDDGB" décrit le parcours suivant: 2 pas vers le haut, 3 pas vers la droite, 1 pas vers le gauche et 1 pas vers le bas.
Le robot exécute pas à pas le parcours décrit par la séquence S en commençant de sa position initiale de coordonnées L et C et il s'arrête dans l'un des deux cas suivants :
- Le cas de dépassement : Quand le dernier pas exécuté par le robot est à l'origine de sa sortie de la grille, un message est affiché "Attention cas de dépassement !" suivi par le numéro du pas qui est à l'origine du dépassement.
- Le cas de fin du parcours : Le robot a exécuté tous les pas de la séquence S sans aucun cas de dépassement. Un message est affiché contenant la nouvelle position du robot sur la grille.
Exemple:
Pour NL=7 et NC=9 et avec une position initiale du robot (L=5,C=4), nous présentons deux situations de parcours.
Situation 1 (parcours sur le schéma effectué avec des flèches vides )
Pour la séquence S="DDHGGHD", Le message affiché est "Je suis à la position (3,4)"
Situation 2 (parcours sur le schéma effectué avec des flèches pleines )
Pour la séquence S="GBBBHDDDDGGHH", Le message affiché est "Attention cas de dépassement de la ligne N°7"
Nous proposons d'écrire un algorithme et un programme Python qui permettent de simuler le parcours du robot. Pour ce faire il s'agit :
- de saisir les dimensions de la grille NL et NC où se déplace le robot, sa position L et C et la séquence de parcours à suivre S.
- d'afficher le résultat final du parcours selon le procédé décrit précedemment.
Dans cet algorithme, On va utiliser 3 fonctions et une procédure :
Algorithme du programme Principal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Algorithme suivi_parcours_robot Debut Ecrire(' saisie la ligne du terrain') nl<-saisie_entier(1,100) Ecrire(' saisie la colonne du terrain') nc<-saisie_entier(1,100) # saisie la position initiale du robot Ecrire(' saisie la ligne de la position initiale du robot') l<-saisie_entier(1,nl) Ecrire(' saisie la colonne de la position initiale du robot') c<-saisie_entier(1,nc) #saisie du parcours du robot sequence_parcours<-saisie_sequence_parcours() #executier le parcours sdu robot executer_parcours(sequence_parcours,l,c,nl,nc) Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
nl | entier |
nc | entier |
l | entier |
c | entier |
sequence_parcours | chaine des caractères |
La fonction saisie_entier
Cette fonction saisit un entier entre a et b.
1 2 3 4 5 6 7 8 9 10 |
fonction saisie_entier(a,b):entier Début Ecrire("donner un entier entre "+a+" et "+b+" ")) Lire(n) Tant que (n<a) ou (n>b) faire Ecrire("donner un entier entre "+a+" et "+b+" ")) Lire(n) Fin tant que retourner n Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
n | entier |
La fonction verif_sequence
Cette fonction vérifie que la chaîne saisie est forme seulement des 4 lettres 'H', 'B', 'D' et 'G'.
1 2 3 4 5 6 7 8 9 |
fonction verif_sequence(ch:chaine):booleen Début # verifier que la chaine est forme uniquement des lettres H, B, D ou G: i<-0 Tant que (i<long(ch)-1) et (ch[i] dans {'H','B','D','G'}) faire i<-i+1 Fin tant que retourner (ch[i] dans {'H','B','D','G'}) Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
La fonction saisie_sequence_parcours
Cette fonction saisit la séquence qui décrit le parcours du robot dans le terrain.
1 2 3 4 5 6 7 8 9 10 |
fonction saisie_sequence_parcours():chaine Début Ecrire("donner une sequence de parcours forme uniquement des lettres H, B, D ou G: ") Lire(ch) Tant que (verif_sequence(ch)=Faux) faire Ecrire("donner une sequence de parcours forme uniquement des lettres H, B, D ou G: ") Lire(ch) Fin tant que return ch Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
ch | chaîne des caractères |
La fonction executer_parcours
Cette fonction vérifie que la date respecte le format J/M avec J est un entier compris entre 1 et 31 et M est un entier compris entre 1 et 12.
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 executer_parcours(ch:chaine;l:entier;c:entier;ligne:entier;colonne:entier) Début # a chaque deplacement du robot, on vérifie s'il depasse le terrain i<-0 Tant que (i<long(ch)) et (1<=l<=ligne) et (1<=c<=colonne) faire Selon ch[i] faire cas 'H': # si le robot se deplace vers le haut l<-l-1 cas 'B': # si le robot se deplace vers le bas l<-l+1 cas 'D': # si le robot se deplace vers la droite c<-c+1 cas 'G': # si le robot se deplace vers le gauche c=c-1 Fin selon i<-i+1 # deplacer vers la lettre suivante Fin tant que Si (1<=l<=ligne) et (1<=c<=colonne) alors # si le robot ne depasse pas le terrain Ecrire('Je suis à la position : '+'('+l+','+c+')') Sinon si l>ligne ou l<1 alors # si le robot depasse la ligne du terrain Ecrire('Attention cas de dépassement causé par la depassement de la ligne N°: '+l) Sinon # si le robot depasse la colonne du terrain Ecrire('Attention cas de dépassement causé par la depassement de la colonne N°: '+c) Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
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 |
from numpy import array from random import * # declaration du tableau des identifiants des cartes à puces ident=array([str]*60) # declaration du tableau des dates de creation des cartes à puces date=array([str]*60) # declaration du tableau des codes code=array([str]*60) def saisie_taille(): n=int(input("donner un entier entre 3 et 50: ")) while (n<3) or (n>50): n=int(input("donner un entier entre 3 et 50: ")) return n def verif_identifiant(ch): # verifier que l'identifiant est forme de 8 chiffres if len(ch)==8 : i=0 while (i<len(ch)-1) and ('0'<=ch[i]<='9'): i=i+1 return ('0'<=ch[i]<='9') # l'identifiant est forme de 8 chiffres else: return False # l'identifiant n'est pas forme de 8 chiffres def verif_unicite_identifiant(t,i): j=0 #verifier que le nouveau identifiant est unique while j<i and t[j]!=t[i]: j=j+1 if j==i : return True # le nouveau identifiant est unique else: return False # le nouveau identifiant n'est pas unique def verif_date(ch): if ch.find('/') >=0 : i=0 while (i<ch.find('/')) and ('0'<=ch[i]<='9'): i=i+1 if i==ch.find('/') : # verifier si le nombre des jours entre 1 et 31 if (1<=int(ch[0:ch.find('/')])<=31): i=i+1 while i<len(ch) and ('0'<=ch[i]<='9'): i=i+1 if i==len(ch): # verifier si le nombre des mois entre 1 et 12 return (1<=int(ch[ch.find('/')+1:len(ch)])<=12) else: return False else: return False else: return False else: return False def remplir(ident,date,n): # remplir le tableau des identifiants ident[0]=input("donner un identifiant N°0 forme de chiffres: ") while (verif_identifiant(ident[0])==False): ident[0]=input("donner un identifiant N°0 forme de chiffres: ") # remplir le tableau des dates de creation des cartes date[0]=input("donner date de creation identifiant N°0 forme jour/mois: ") while verif_date(date[0])==False: date[0]=input("donner date de creation identifiant N°0 forme jour/mois:") # remplir le tableau des identifiants for i in range (1,n) : ident[i]=input("donner un identifiant N°"+str(i)+" forme de chiffres: ") while (verif_identifiant(ident[i])==False) or (verif_unicite_identifiant(ident,i)==False): ident[i]=input("donner un identifiant N°"+str(i)+" forme de chiffres: ") # remplir le tableau des dates de creation des cartes date[i]=input("donner date de creation identifiant N°"+str(i)+" forme jour/mois: ") while (verif_date(date[i])==False): date[i]=input("donner date de creation identifiant N°"+str(i)+" forme jour/mois:") def generer_code(ch): #concatiner j et m ch=ch[0:ch.find('/')]+ch[ch.find('/')+1:len(ch)] x=randint(5, 64) ch=str(int(ch)*x) if len(ch)==4 :# Si le code est forme de 4 chiffres # deplacer le chiffredes milliers vers la droite du nombre return ch[1:len(ch)]+ch[0] elif len(ch)==3:# Si le code est forme de 3 chiffres return ch+'0' # ajouter 0 à la droite du nombre elif len(ch)==2: # Si le code est forme de 2 chiffres return ch+'00' # ajouter 00 à la droite du nombre elif len(ch)>4:#Si le code est forme de plus de 4 chiffres #additionner le nombre forme de 4 chiffres de gauche #au nombre forme des chiffre jusq'à sa longeur = 4 s=int(ch[0:4])+int(ch[4:len(ch)]) while (s>10000): ch=str(s) s=int(ch[0:4])+int(ch[4:len(ch)]) return str(s) def inserer_afficher_codes(ident,date,code,n): for i in range (n): code[i]=generer_code(date[i]) print(ident[i]+' : ' +date[i]+' : '+code[i]) #programme principal n=saisie_taille() remplir(ident,date,n) inserer_afficher_codes(ident,date,code,n) |
Exécution du programme:
Pour créer une application en Python et Designer QT qui contrôle le parcours du robot dans un terrain rectangulaire , on va suivre ces étapes:
a- Ouvrez Qt Designer et créez un nouveau fichier de type Main Window.
b- Ajoutez ces widgets:
QLineEdit
nommé 'nc' pour entrer le nombre des lignes du terrain.
QLineEdit
nommé 'nl' pour entrer le nombre des colonnes du terrain.
QPushButton
nommé 'remplirid_bt' pour mettre les identificateurs des cartes à puces dans le tableau IDENT.
QPushButton
nommé 'remplirdate_bt' pour mettre les dates dans le tableau DATE.
QPushButton
nommé 'afficher_bt' pour afficher la liste des identificateurs des cartes à puces ainsi que leurs dates de création et leurs codes générés.
QLabel
nommé 'tabident_label' pour contenir les identificateurs des cartes à puces.
QLabel
nommé 'tabdate_label' pour contenir les dates de création des cartes à puces.
QLabel
nommé 'tabcode_label' pour contenir les codes des cartes à puces.
QLabel
nommé 'msg' pour afficher des messages d'erreur.
QLabel
nommé 'resultat' pour contenir la liste des nouveau-nés ayant une heure de naissance miroir et les nombres des nouveau-nés pour chaque type d'heure miroir.
Enregistrez le fichier avec l'extension .ui
, par exemple tabtab-3.ui
.
Voici un exemple de script Python qui utilise l'interface graphique générée par Qt Designer.
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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
from PyQt5.uic import loadUi from PyQt5.QtWidgets import QApplication from numpy import array from random import * # declaration du tableau des identifiants des cartes à puces ident=array([str]*60) # declaration du tableau des dates de creation des cartes à puces date=array([str]*60) # declaration du tableau des codes code=array([str]*60) app = QApplication([]) windows = loadUi ("tabtab-3.ui") # Fonction qui supprime des espaces de la chaine des carcatères def supprimer_espaces (ch) : while(ch[0]==' '): # elimnier tous les espaces au début de la chaine ch=ch[1:len(ch)] while(ch[len(ch)-1]==' '): # elimnier tous les espaces a la fin de la chaine ch=ch[0:len(ch)-1] while (ch.find(' ')>0): ch=ch.replace(" ", " ") # remplacer les doubles espaces apar un seul espace return ch def verif_unicite_identifiant(t,i): j=0 #verifier que le nouveau identifiant est unique while j<i and t[j]!=t[i]: j=j+1 if j==i : return True # le nouveau identifiant est unique else: return False # le nouveau identifiant n'est pas unique def verif_unicite_identifiant(t,i): j=0 #verifier que le nouveau identifiant est unique while j<i and t[j]!=t[i]: j=j+1 if j==i : return True # le nouveau identifiant est unique else: return False # le nouveau identifiant n'est pas unique # Procedure qui remplit le tableau IDENT des identificateurs def createTabIDENT(): windows.tabident_label.clear() windows.msg.clear() global n #pour la taile du tableau a des utilisateurs ch = windows.ch1.text() if ch=="": windows.msg.setText("Veuillez remplir la chaîne") else: windows.msg.clear() # effacer le message d erreur ch= supprimer_espaces(ch) i=0 j=0 ch1='' unicite_identifiant=True # pour verifier l'unicite des identificateurs test_8chiffres=True # parcourir les caracteres de la chaine CH1 while(i<len(ch)) and (test_8chiffres) and(unicite_identifiant) and (('0'<=ch[i].upper()<='9')or (ch[i]==' ')): if (ch[i]!=' ') : ch1=ch1+ch[i] if ((ch[i]==' ') or (i==len(ch)-1)) : # remplir le tableau IDENT par des identificateurs ident[j]=ch1 if j>=1: unicite_identifiant=verif_unicite_identifiant(ident,j) test_8chiffres=(len(ch1)==8) ch1='' j=j+1 i=i+1 if (i==len(ch)) and (test_8chiffres) and (unicite_identifiant) : if 3<=j<=50: n=j tab='' for k in range (j) : tab=tab+ 'ident['+str(k)+']= '+ident[k]+ '\n' #afficher les elements du tableau windows.tabident_label.setText(tab) else: windows.msg.setText("la taille du tableau a doit etre entre 3 et 50") else: windows.msg.setText("les identifiants doivent differentes et formes de 8 chiffres") def verif_heure(ch): # verifier la longueur de la chaine if len(ch)==5: # verifier la chaine est compse des chiffres et le symbole : if ('0'<=ch[0]<='2') and ('0'<=ch[1]<='9') and (ch[2]==':') and ('0'<=ch[3]<='5') and ('0'<=ch[4]<='9'): # verifier la valeur de HH est comprise entre 0 et 23 ## verifier la valeur de MM est comprise entre 0 et 59 if (0<=int(ch[0]+ch[1])<=23) and (0<=int(ch[3]+ch[4])<=59): return True else: return False else: return False else: return False def verif_date(ch): if ch.find('/') >=0 : i=0 while (i<ch.find('/')) and ('0'<=ch[i]<='9'): i=i+1 if i==ch.find('/') : # verifier si le nombre des jours entre 1 et 31 if (1<=int(ch[0:ch.find('/')])<=31): i=i+1 while i<len(ch) and ('0'<=ch[i]<='9'): i=i+1 if i==len(ch): # verifier si le nombre des mois entre 1 et 12 return (1<=int(ch[ch.find('/')+1:len(ch)])<=12) else: return False else: return False else: return False else: return False # Procedure qui remplit un tableau des dates de creation des cartes a puce def createTabDATE(): windows.tabdate_label.clear() windows.msg.clear() ch = windows.ch2.text() if ch=="": windows.msg.setText("Veuillez remplir la chaîne") else: windows.msg.clear() # effacer le message d erreur ch= supprimer_espaces(ch) i=0 j=0 ch1='' verifdate=True # parcourir les caracteres de la chaine CH2 while(i<len(ch)) and (verifdate) and (('0'<=ch[i]<='9')or (ch[i]==' ' )or (ch[i]=='/')): if ('0'<=ch[i]<='9')or (ch[i]=='/'): ch1=ch1+ch[i] if ((ch[i]==' ') or (i==len(ch)-1)) : # remplir le tableau date par des dates de creation des cartes a puce date[j]=ch1 # verifier le format de la date Jour/Mois verifdate=verif_date(ch1) ch1='' j=j+1 i=i+1 if (i==len(ch)) and (verifdate) : if j==n: #la taille du tableau r doit etre egal a la taille du tableau IDENT tab='' for k in range (j) : tab=tab+ 'date['+str(k)+']= '+date[k]+ '\n' #afficher les elements du tableau windows.tabdate_label.setText(tab) else: windows.msg.setText("la taille du tableau DATE doit etre egal a "+str(n)) else: windows.msg.setText("Les dates doivent etre sous forme jour/mois ") def generer_code(ch): #concatiner j et m ch=ch[0:ch.find('/')]+ch[ch.find('/')+1:len(ch)] x=randint(5, 64) ch=str(int(ch)*x) if len(ch)==4 :# Si le code est forme de 4 chiffres # deplacer le chiffredes milliers vers la droite du nombre return ch[1:len(ch)]+ch[0] elif len(ch)==3:# Si le code est forme de 3 chiffres return ch+'0' # ajouter 0 à la droite du nombre elif len(ch)==2: # Si le code est forme de 2 chiffres return ch+'00' # ajouter 00 à la droite du nombre elif len(ch)>4:#Si le code est forme de plus de 4 chiffres #additionner le nombre forme de 4 chiffres de gauche #au nombre forme des chiffre jusq'à sa longeur = 4 s=int(ch[0:4])+int(ch[4:len(ch)]) while (s>10000): ch=str(s) s=int(ch[0:4])+int(ch[4:len(ch)]) return str(s) def inserer_afficher_codes(): resultat='' tab='' for i in range (n): code[i]=generer_code(date[i]) tab=tab+ 'code['+str(i)+']= '+code[i]+ '\n' resultat=resultat+ident[i]+' : ' +date[i]+' : '+code[i]+'\n' #afficher les elements du tableau Code windows.tabcode_label.setText(tab) windows.resultat.setText(resultat) windows.remplirid_bt.clicked.connect ( createTabIDENT ) windows.remplirdate_bt.clicked.connect ( createTabDATE ) windows.afficher_bt.clicked.connect ( inserer_afficher_codes ) windows.show() app.exec_() |
Exécution du programme
1) Remplissage du tableau IDENT
2) Remplissage du tableau DATE
3) Remplissage du tableau CODE et affichage des données des cartes à puces
Vous pouvez voir aussi :
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-Prof Info