Un tableau en détresse a lancé un appel de secours (SOS). Pour le sauver, le commandant de la garde côte a besoin de localiser le(s) bateau(x) proche(s) de celui-ci. En s’appuyant sur leurs coordonnées (X,Y) fournis par le radar du commandant(comme l’illustre l’exemple de la figure ci-dessous), la localisation des bateaux se fait par le calcul des distances qui les séparent du bateau en détresse.
Pour aider le commandant de la garde côte, on se propose d’écrire un programme qui permet de :
1- saisir les coordonnées du bateau en détresse (Xd,Yd).
2- saisir les coordonnées de n autres bateaux dans deux tableaux Tx et Ty (avec 1≤n≤50) ou Tx contient les abscisses et Ty contient les ordonnées. Il est à noter que deux bateaux (y compris le bateau en détresse) ne peuvent pas avoir les mêmes coordonnées.
3- remplir un tableau Td par les distances qui séparent les différents bateaux du bateau en détresse.
4- afficher les coordonnées (X,Y) des bateaux, de plus proche au plus loin du bateau en détresse
N.B : La distance dAB qui sépare deux points A et B de coordonnées respectives (Xa,Ya) et (Xb,Yb) est calculée comme suit :
Exemple:
Pour les coordonnées du bateau en détresse (Xd,Yd)=(500,300), le nombre de bateaux N=5 et les deux tableaux Tx et Ty suivants :
Tx
1000 | 500 | 100.25 | -350 | 1200 |
Ty
-300 | 400 | -90 | 75 | 358.14 |
Le calcul des distances donne le tableau Td suivant :
781.02 | 100 | 558.48 | 879.28 | 702.41 |
Le programme affiche les coordonnées des tableaux dans l’ordre suivant : (500,400)(100.25,-90)(1200,358.14)(1000,-300)(-350,75)
Pour aider à localiser les bateaux proches du bateau en détresse en calculant les distances, nous allons suivre les étapes algorithmiques suivantes :
L’utilisateur saisit les coordonnées Xd et Yd du bateau en détresse.
L’utilisateur saisit les coordonnées (Xi,Yi) de chaque bateau (où i va de 0 à n).
Les coordonnées de l’abscisse de chaque bateau sont stockées dans Tx, et celles de l’ordonnée dans Ty.
Pour chaque bateau i, on calcule la distance à l’aide de la formule de la distance euclidienne :
Ces distances sont stockées dans un tableau Td.
On trie les bateaux en fonction de leurs distances au bateau en détresse en utilisant le tableau Td (distances).
Le tri sera fait de manière à ce que les coordonnées des bateaux les plus proches apparaissent en premier.
On affiche les coordonnées des bateaux triés en fonction de leur distance au bateau en détresse.
Dans cet algorithme, On va utiliser trois fonctions et trois procédures :
Algorithme du programme principal
1 2 3 4 5 6 7 8 9 10 11 12 |
Algorithme distances_bateaux Debut Ecrire("donner abscisse du bateau en detresse: ") Lire(xd) Ecrire("donner ordonee du bateau en detresse: ") Lire(yd) n<-saisie_taille() remplir(tx,ty,n,xd,yd) calcul_distance(tx,ty,td,xd,yd,n) tri(tx,ty,td) afficher(tx,ty,n) Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
xd | réel |
yd | réel |
n | entier |
tx | tableau des 30 réels |
ty | tableau des 30 réels |
td | tableau des 30 réels |
La fonction saisie_taille
Cette fonction retourne la taille du tableau entre 1 et 50 saisie par l'utilisateur.
1 2 3 4 5 6 7 8 9 10 |
Fonction saisie_taille(): Début Ecrire('donner un entier entre 1 et 50') lire (n) Tant que n<1 ou n>50 faire Ecrire('donner entre entre 1 et 50') lire (n) Fin tant que retourner n Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
n | entier |
La fonction verif_unicite
Cette fonction vérifie si les coordonnées d'un bateau ne se trouve pas les deux tableaux tx et ty.
1 2 3 4 5 6 7 8 |
Fonction verif_unicite(tx:tab,ty:tab,i:entier):booleen Début j<-0 Tant que (j<i-1) et ((tx[j]!=tx[i]) ou (ty[j]!=ty[i])): j<-j+1 Fin tant que retourner (tx[j]!=tx[i]) ou (ty[j]!=ty[i]) Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
j | entier |
La procédure remplir
Cette procédure remplit le tableau tx par les abscisses des bateaux et le tableau ty par les ordonnées de ces bateaux.
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 remplir(@tx:Tab;@ty:Tab;n:entier) Début Ecrire("donner abscisse du bateau N°0: ") Lire(tx[0]) Ecrire("donner ordonnee du bateau N°0: ")) Lire(ty[0]) Tant que (tx[0]==xd) et (ty[0]==yd) faire Ecrire("donner abscisse du bateau N°0: ") Lire(tx[0]) Ecrire("donner ordonnee du bateau N°0: ")) Lire(ty[0]) Fin tant que Pour i de 1 à n-1 faire Ecrire("donner abscisse du bateau N°"+i+": ") Lire(tx[i]) Ecrire("donner ordonnee du bateau N°"+i+":") Lire(ty[i]) Tant que ((tx[i]==xd) et (ty[i]==yd)) ou (verif_unicite(tx,ty,i)=Faux) faire Ecrire("donner abscisse du bateau N°"+i+": ") Lire(tx[i]) Ecrire("donner ordonnee du bateau N°"+i+":") Lire(ty[i]) Fin tant que Fin pour Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
La procédure calcul_distance
Cette procédure calcule les distances entre les bateaux et le bateau en détresse et les stocke dans le tableau td
1 2 3 4 5 6 |
Procedure afficher(tx:Tab;ty:Tab;@td:Tab;xd:entier;yd:entier;n:entier) Début Pour i de 0 à n-1 faire td[i]<-sqrt((xd-tx[i])*(xd-tx[i])+(yd-ty[i])*(yd-ty[i]))) Fin pour Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
La procédure tri
Cette procédure trie les coordonnées des bateaux en fonction de leurs distances au bateau en détresse en utilisant le tableau Td
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Procédure tri(tx:Tab;ty:Tab;td:Tab;n:entier) Début Pour i de 1 à n-2 faire min<-i Pour j de i+1 à n-1 faire Si (td[min]>td[j]) alors min<-j Finsi Fin pour Si min!=i alors temp<-tx[i] tx[i]<-tx[min] tx[min]<-temp temp<-ty[i] ty[i]<-ty[min] ty[min]<-temp temp<-td[i] td[i]<-td[min] td[min]<-temp Fin si Fin pour Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
j | entier |
min | entier |
temp | entier |
La procédure affiche
Cette procédure affiche les coordonnées des bateaux triés en fonction de leur distance au bateau en détresse.
1 2 3 4 5 6 |
Procédure afficher(tx:Tab;ty:Tab;n:entier) Début Pour i de 0 à n-1 faire Ecrire ('('+tx[i]+','+y[i]+')') Fin pour 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 |
import math from numpy import array tx=array([float()]*30) #declaration du tableau des abscisses ty=array([float()]*30) #declaration du tableau des ordonnees td=array([float()]*30) #declaration du tableau des distances def saisie_taille() : n=int(input("donner la taille du tableau entre 1 et 50: ")) while(n<1) or (n>50) : n=int(input("donner taille du tableau entre 1 et 50: ")) return n def verif_unicite(tx,ty,i): j=0 while (j<i-1) and ((tx[j]!=tx[i])or (ty[j]!=ty[i])): j=j+1 return (tx[j]!=tx[i])or (ty[j]!=ty[i]) def remplir(t1,t2,n,xd,yd): tx[0]=float(input("donner abscisse du bateau N°0: ")) ty[0]=float(input("donner ordonee du bateau N°0: ")) while (tx[0]==xd) and (ty[0]==yd): tx[0]=float(input("donner abscisse du bateau N°0: ")) ty[0]=float(input("donner ordonee du bateau N°0: ")) for i in range (1,n) : tx[i]=float(input("donner abscisse du bateau N°"+str(i)+": ")) ty[i]=float(input("donner ordonnee du bateau N°"+str(i)+":")) while ((tx[i]==xd) and (ty[i]==yd)) or (verif_unicite(tx,ty,i)==False) : tx[i]=float(input("donner abscisse du bateau N°"+str(i)+": ")) ty[i]=float(input("donner ordonnee du bateau N°"+str(i)+":")) def calcul_distance(tx,ty,td,xd,yd,n): for i in range (n) : td[i]=format((math.sqrt((xd-tx[i])*(xd-tx[i])+(yd-ty[i])*(yd-ty[i]))), '.2f') def tri(tx,ty,td,n): for i in range(n-1): min=i for j in range(i+1,n): if (td[min]>td[j]): min=j if min!=i: temp=tx[i] tx[i]=tx[min] tx[min]=temp temp=ty[i] ty[i]=ty[min] ty[min]=temp temp=td[i] td[i]=td[min] td[min]=temp def afficher(tx,ty,n): for i in range(n): print ('('+str(tx[i])+','+str(ty[i])+')',end=' ') print() #programme principal xd=float(input("donner abscisse du bateau en detresse: ")) yd=float(input("donner ordonee du bateau en detresse: ")) n=saisie_taille() remplir(tx,ty,n,xd,yd) calcul_distance(tx,ty,td,xd,yd,n) tri(tx,ty,td,n) afficher(tx,ty,n) |
Exécution du programme
Pour créer une application en Python pour aider à localiser les bateaux proches du bateau en détresse en calculant les distances, en utilisant Qt Designer pour l'interface graphique, suivez ces étapes :
a- Ouvrez Qt Designer et créez un nouveau fichier de type Main Window.
b- Ajoutez ces widgets:
QLineEdit
nommé 'xd' pour entrer l'abscisse du bateau en détresse.
QLineEdit
nommé 'yd' pour entrer l'ordonnée du bateau en détresse.
QLineEdit
nommé 'ch1' pour entrer les abscisses des bateaux.
QLineEdit
nommé 'ch2' pour entrer les ordonnées des bateaux.
QPushButton
nommé 'remplirtx_bt' pour exécuter le module createTabX.
QPushButton
nommé 'remplirty_bt' pour exécuter le module createTabY.
QPushButton
nommé 'remplirtd_bt' pour exécuter le module createTabD.
QPushButton
nommé 'trier_bt' pour exécuter le module tri.
QLabel
nommé 'msg' pour afficher un message d'erreur
QLabel
nommé 'tabtx_label' pour contenir les abscisses des bateaux.
QLabel
nommé 'tabty_label' pour contenir les ordonnées des bateaux.
QLabel
nommé 'tabtd_label' pour contenir les distances entre le bateau en détresse et les autres bateaux.
Enregistrez le fichier avec l'extension .ui
, par exemple tabtab-2.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 |
from PyQt5.uic import loadUi from PyQt5 import QtCore, QtGui from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui, QtWidgets import math from numpy import array tx=array([float()]*30) ty=array([float()]*30) td=array([float()]*30) app = QApplication([]) windows = loadUi ("tabtab-2.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 remplir_tableau(ch,t,tab_label,nom): global taille # taille des trois tableaux taille=0 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='' test_float=True # parcourir les caracteres de la chaine while((i<len(ch))): test_float=False if (ch[i]!=' '): ch1=ch1+ch[i] if ((ch[i]==' ') or (i==len(ch)-1)) : t[j]=float(ch1) ch1='' j=j+1 i=i+1 if (1<=j<=50): tab='' for k in range (j) : tab=tab+ nom+'['+str(k)+']= '+ str(t[k])+ '\n' #afficher les elements du tableau tab_label.setText(tab) #preciser la taille des trois tableaux: taille=j else: msg.setText("la taille des tableaux doit etre entre 1 et 50") # Procedure qui remplit le tableau TX par des abscisses a partir d'une chaine def createTabX(): ch1 = windows.ch1.text() remplir_tableau(ch1,tx,windows.tabtx_label,'tx' ) # Procedure qui remplit le tableau TY par des ordonnees a partir d'une chaine def createTabY(): ch2 = windows.ch2.text() remplir_tableau(ch2,ty,windows.tabty_label,'ty' ) # Procedure qui remplit le tableau TD par des des distance def createTabD(): xd = windows.x.text() yd = windows.y.text() windows.msg.clear() if xd!='' and yd!='' : tab='' for i in range (taille) : td[i]=format((math.sqrt((float(xd)-tx[i])*(float(xd)-tx[i])+(float(yd)-ty[i])*(float(yd)-ty[i]))), '.2f') tab=tab+'td['+str(i)+']= '+ str(td[i])+ '\n' #afficher les elements du tableau windows.tabtd_label.setText(tab) else: windows.msg.setText("Veuillir saisie xd et yd") def tri(): for i in range(taille-1): min=i for j in range(i+1,taille): if (td[min]>td[j]): min=j if min!=i: temp=tx[i] tx[i]=tx[min] tx[min]=temp temp=ty[i] ty[i]=ty[min] ty[min]=temp temp=td[i] td[i]=td[min] td[min]=temp tabtx='' tabty='' tabtd='' couple='' for k in range (taille) : tabtx=tabtx+'tx['+str(k)+']= '+ str(tx[k])+ '\n' tabty=tabty+'ty['+str(k)+']= '+ str(ty[k])+ '\n' tabtd=tabtd+'td['+str(k)+']= '+ str(td[k])+ '\n' couple=couple+'('+str(tx[k])+','+ str(ty[k])+ ') ' windows.tabtx_label.setText(tabtx) windows.tabty_label.setText(tabty) windows.tabtd_label.setText(tabtd) windows.msg.setText(couple) windows.remplirtx_bt.clicked.connect (createTabX) windows.remplirty_bt.clicked.connect (createTabY) windows.remplirtd_bt.clicked.connect (createTabD) windows.trier_bt.clicked.connect (tri) windows.show() app.exec_() |
Exécution du programme
1) Entrer les coordonnées du bateau en détresse
2) Entrer les abscisses des bateaux dans TX et les ordonnées dans TY
3) Calculer les distances entre les bateaux et le bateau en détresse et les stocke dans le tableau TD
4) Trier les coordonnées des bateaux en fonction de leurs distances au bateau en détresse en utilisant le tableau TD.
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