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 |
def saisie_entier(a,b): n=int(input("donner un entier entre "+str(a)+" et "+str(b)+": ")) while (n<a) or (n>b): n=int(input("donner un entier entre "+str(a)+" et "+str(b)+": ")) return n def verif_sequence(ch): # verifier que la chaine est forme uniquement des lettres H, B, D ou G: i=0 while (i<len(ch)-1) and (ch[i] in {'H','B','D','G'}): i=i+1 return (ch[i] in {'H','B','D','G'}) def saisie_sequence_parcours(): ch=input("donner une sequence de parcours forme uniquement des lettres H, B, D ou G: ") while (verif_sequence(ch)==False): ch=input("donner une sequence de parcours forme uniquement des lettres H, B, D ou G: ") return ch def executer_parcours(ch,l,c,ligne,colonne): # a chaque deplacement du robot, on vérifie s'il depasse le terrain i=0 while (i<len(ch)) and (1<=l<=ligne) and (1<=c<=colonne) : match ch[i]: case 'H': # si le robot se deplace vers le haut l=l-1 case 'B': # si le robot se deplace vers le bas l=l+1 case 'D': # si le robot se deplace vers la droite c=c+1 case 'G': # si le robot se deplace vers le gauche c=c-1 i=i+1 if (1<=l<=ligne) and (1<=c<=colonne) : # si le robot ne depasse pas le terrain print('Je suis à la position : '+'('+str(l)+','+str(c)+')') elif l>ligne or l<1 : # si le robot depasse la ligne du terrain print('Attention cas de dépassement causé par la depassement de la ligne N°: ',str(l)) else : # si le robot depasse la colonne du terrain print('Attention cas de dépassement causé par la depassement de la colonne N°: ',str(c)) #programme principal print(' saisie la ligne du terrain') nl=saisie_entier(1,100) print(' saisie la colonne du terrain') nc=saisie_entier(1,100) # saisie la position initiale du robot print(' saisie la ligne de la position initiale du robot') l=saisie_entier(1,nl) print(' 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) |
Exécution du programme:
1) En cas de fin du parcours du robot
2) En cas de dépassement du robot des lignes du terrain
2) En cas de dépassement du robot des colonnes du terrain
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.
QLineEdit
nommé 'l' pour entrer le numéro de la ligne pour la position initiale du robot.
QLineEdit
nommé 'c' pour entrer le numéro de la colonne pour la position initiale du robot.
QLineEdit
nommé 'sequence' pour entrer le parcours du robot.
QPushButton
nommé 'bt_test' pour vérifier la validité du parcours du robot dans le terrain.
QLabel
nommé 'msg' pour afficher des messages d'erreur et le résultat de la vérification de la validité du parcours du robot .
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 |
from PyQt5.uic import loadUi from PyQt5.QtWidgets import QApplication app = QApplication([]) windows = loadUi ("robot-interface.ui") def verif_sequence(ch): # verifier que la chaine est forme uniquement des lettres H, B, D ou G: i=0 while (i<len(ch)-1) and (ch[i] in {'H','B','D','G'}): i=i+1 return (ch[i] in {'H','B','D','G'}) def test_parcours_robot(): windows.msg.clear() nl = int(windows.nl.text()) print(str(nl)) nc = int(windows.nc.text()) print(str(nc)) l = int(windows.l.text()) print(str(l)) c = int(windows.c.text()) print(str(c)) sequence=windows.sequence.text() print(sequence) if (1<=nl<=100) and (1<=nc<=100) and (1<=l<=nl) and (1<=c<=nc) and verif_sequence(sequence): i=0 while (i<len(sequence)) and (1<=l<=nl) and (1<=c<=nc) : match sequence[i]: case 'H': # si le robot se deplace vers le haut l=l-1 case 'B': # si le robot se deplace vers le bas l=l+1 case 'D': # si le robot se deplace vers la droite c=c+1 case 'G': # si le robot se deplace vers le gauche c=c-1 i=i+1 if (1<=l<=nl) and (1<=c<=nc) : # si le robot ne depasse pas le terrain windows.msg.setText('Je suis à la position : '+'('+str(l)+','+str(c)+')') elif l>nl or l<1 : # si le robot depasse la ligne du terrain windows.msg.setText('Attention depassement causé par la depassement de la ligne N°: '+str(l)) else : # si le robot depasse la colonne du terrain windows.msg.setText('Attention depassement causé par la depassement de la colonne N°: '+str(c)) else: windows.msg.setText('Verifier les dimensions , la position du robot ou la sequence du parcours') windows.bt_test.clicked.connect(test_parcours_robot) windows.show() app.exec_() |
Exécution du programme
1)En cas de fin du parcours du robot
2) En cas de dépassement du robot des lignes du terrain
1) En cas de dépassement du robot des colonnes du terrain
2)
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