La suite de Héron Alexandrie est une suite permettant de trouver une valeur approchée de la racine carrée d'un réel positif x. Elle est définie par :

Exemple
Si = 29 alors p =5, car le plus grand entier vérifiant p2 < x est 5 ( 5² = 25 < 29).
Selon la définition de la suite U, le calcul de la valeur approchée de racine carré de 29 à 10 exposant près est présenté dans le tableau suivant :

L'interface graphique "Interface_Racine.ui", comme le montre la Figure 1 ci-dessous, contient les éléments suivants :
- Un label contenant le texte "Donner la valeur de x :".
- Une zone de saisie pour saisir une valeur de x.
- Un bouton intitulé "Ajouter".
- Un bouton intitulé "Afficher Racines".
- Une table widget contenant deux colonnes "Nombre" et "Racine carrée" pour afficher le contenu du fichier "Approchee.dat".

Travail demandé
1- Ouvrir le fichier "Interface_Racine.uï" situé dans le dossier de travail et compléter l'interface graphique par les éléments manquants.
2- Ouvrir le fichier nommé "Racine.py" situé dans le dossier de travail et y apporter les modifications suivantes :
Développer le module "Racine" qui s'exécute suite à un clic sur le bouton "Ajouter" et qui permet
- d'afficher un message d'alerte (QMessagebox) indiquant une anomalie de saisie si la contrainte de saisie n'est pas respectée (voir les imprimes écran dans la page suivante), ou bien,
- d'ajouter dans le fichier "Approchee.dat" le nombre x saisi ainsi que la valeur approchée de sa racine carrée, à 10-5 près, dans le cas contraire.
- Développer le module "Afficher" qui s'exécute suite à un clic sur le bouton "Afficher Racines" et qui permet d'afficher dans la table widget le contenu du fichier "Approchee.dat".
N.B: On pourra utiliser les méthodes suivantes
setRowCount(nbrelignes)
insertRow(numligne)
setitem(numligne, numcolonne, QTableWidgetitem("valeur"))
- Modifier les instructions de la pallie exploitation de l'interface graphique "Interface_Racine.ui" par les informations nécessaires à l'appel de l'interface et aux différents modules développés.
Ci-dessous quelques captures d'écran montrant des exemples d'exécutions


a- Ouvrez Qt Designer et créez un nouveau fichier de type Main Window.
b- Ajoutez ces widgets :
- QLabel contenant le texte "Donner la valeur de x :".
- QLineEdit : zone de saisie pour saisir une valeur de x.
- QPushButton : bouton intitulé "Ajouter".
- QPushButton : bouton intitulé "Afficher Racines".
- QTableWidget : table widget contenant deux colonnes "Nombre" et "Racine carrée" pour afficher le contenu du fichier "Approchee.dat".

|
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 |
from PyQt5.QtWidgets import * from PyQt5.uic import * from pickle import dump, load # -------------------------------------------------- # Dictionnaire représentant un enregistrement # contenant : # - x : la valeur saisie # - racine : la racine carrée approchée de x # -------------------------------------------------- enregistrement = dict( x=int(), racine=float() ) # -------------------------------------------------- # Fonction qui détermine un entier p tel que : # p² ≤ x < (p+1)² # (estimation initiale pour le calcul de la racine) # -------------------------------------------------- def determiner_p(x): p = 2 while p * p <= x: p = p + 1 return p - 1 # -------------------------------------------------- # Fonction qui calcule une valeur approchée # de la racine carrée de x par la méthode de Héron # (méthode de Newton) # -------------------------------------------------- def calcul_racine(x, p, epsilon): u0 = p # Valeur initiale u1 = 0.5 * (u0 + x / u0) # Première approximation # Amélioration de l'approximation jusqu'à précision epsilon while abs(u1 - u0) > epsilon: u0 = u1 u1 = 0.5 * (u0 + x / u0) return u1 # -------------------------------------------------- # Procédure qui : # - vérifie la validité de la saisie # - calcule la racine approchée # - enregistre les résultats dans le fichier Approchee.dat # -------------------------------------------------- def remplir_fichier_approchee(): # Vérifier si le champ x est vide if w.x.text() == "": QMessageBox.critical(w, "Erreur", "Veuillez saisir une valeur pour x") # Vérifier si x est dans l'intervalle [2, 200] elif not (2 <= float(w.x.text()) <= 200): QMessageBox.critical(w, "Erreur", "Veuillez saisir une valeur entre 2 et 200") else: # Ouverture du fichier en mode ajout binaire f_approchee = open("Approchee.dat", "ab") # Récupération de la valeur saisie x = float(w.x.text()) # Détermination de p et calcul de la racine p = determiner_p(x) racine = calcul_racine(x, p, 0.00001) # Remplissage de l'enregistrement enregistrement["x"] = x enregistrement["racine"] = racine # Écriture dans le fichier dump(enregistrement, f_approchee) # Fermeture du fichier f_approchee.close() # -------------------------------------------------- # Procédure qui lit le fichier Approchee.dat # et affiche son contenu dans un QTableWidget # -------------------------------------------------- def afficher_fichier_approchee(): # Ouverture du fichier en lecture binaire f_approchee = open("Approchee.dat", "rb") row_index = 0 # Lecture séquentielle du fichier while True: try: # Lecture d'un enregistrement enregistrement = load(f_approchee) # Ajout d'une nouvelle ligne dans le tableau w.racine_widget.setRowCount(row_index + 1) # Affichage des valeurs dans le tableau w.racine_widget.setItem(row_index, 0, QTableWidgetItem(str(enregistrement["x"]))) w.racine_widget.setItem(row_index, 1, QTableWidgetItem(str(enregistrement["racine"]))) row_index = row_index + 1 except EOFError: # Fin du fichier atteinte break # Fermeture du fichier f_approchee.close() # -------------------------------------------------- # Programme principal # -------------------------------------------------- # Création de l'application Qt app = QApplication([]) # Chargement de l'interface graphique w = loadUi("interface_racine.ui") w.show() # Association des boutons aux procédures w.ajouter.clicked.connect(remplir_fichier_approchee) w.afficher.clicked.connect(afficher_fichier_approchee) # Lancement de l'application app.exec() |
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