Exercice 20
On se propose dans ce TP d'illustrer graphiquement sur une fenêtre PyQt5 Python la notion de nombre premier de Sophie German. Pour cela, on vous propose d'utiliser l'outil visuel graphique Qt Designer pour créer l'interface graphique suivante qui demande à l'utilisateur de saisir un entier n et de lui afficher en cliquant sur le bouton de commande 'Validate', la liste des nombres premiers de Sophie German qui sont inférieur ou égaux à n comme le montre la figure ci-dessous:
Rappel : Un nombre n est appelé un nombre de Sophie German si n et 2n+1 sont tous les deux premiers. Exemple n = 5 est de Sophie German car n = 5 et 2n+1=11 sont tous les deux premiers par contre n = 7 n'est pas un nombre de Sophie German car 2n+1 = 15 n'est pas premier.
1) - Créer à l'aide de Qt Designer, l'interface graphique sous le nom library.ui en respectant le nommage suivant:
- lineEdite_n : désigne le nom du champ de saisie
- lbl_result : nom du label qui affiche la liste des nombres de Sophie german (liste en rouge)
- btn_validate : nom du bouton 'Validate' qui valide l'action
- btn_cancel : nom du bouton 'Annuler ' qui annule l'opération
2) - Générer à partir du fichier graphique library.ui un fichier Python library.py à l'aide de la commande cmd:
pyuic5 -x library.ui -o library.py
3) - Créer un script python sous forme de fonction qui prend en entrée un entier n et qui renvoie la liste des nombres premiers de Sophie German qui sont inférieurs ou égaux à n.
4) - Créer un fichier python main.py dans lequel importer le contenu du fichier library.py et y ajouter le code de bouton de commande 'btn_validate' qui réalise l'action.
Solution
Question 1) et 2)
Code du fichier library.py
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 |
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(526, 292) self.label = QtWidgets.QLabel(Form) self.label.setGeometry(QtCore.QRect(20, 10, 461, 31)) font = QtGui.QFont() font.setPointSize(18) font.setBold(True) font.setWeight(75) self.label.setFont(font) self.label.setStyleSheet("color: rgb(0, 0, 127);") self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(Form) self.label_2.setGeometry(QtCore.QRect(20, 80, 151, 16)) font = QtGui.QFont() font.setPointSize(11) font.setBold(True) font.setWeight(75) self.label_2.setFont(font) self.label_2.setStyleSheet("color: rgb(0, 0, 255);") self.label_2.setObjectName("label_2") self.btn_validate = QtWidgets.QPushButton(Form) self.btn_validate.setGeometry(QtCore.QRect(370, 240, 141, 31)) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.btn_validate.setFont(font) self.btn_validate.setStyleSheet("background-color: rgb(0, 0, 0);\n" "color: rgb(255, 255, 0);") self.btn_validate.setObjectName("btn_validate") self.lineEdit_n = QtWidgets.QLineEdit(Form) self.lineEdit_n.setGeometry(QtCore.QRect(190, 70, 301, 31)) font = QtGui.QFont() font.setPointSize(11) font.setBold(True) font.setWeight(75) self.lineEdit_n.setFont(font) self.lineEdit_n.setStyleSheet("color: rgb(255, 0, 0);") self.lineEdit_n.setObjectName("lineEdit_n") self.label_3 = QtWidgets.QLabel(Form) self.label_3.setGeometry(QtCore.QRect(10, 140, 391, 16)) font = QtGui.QFont() font.setPointSize(11) font.setBold(True) font.setWeight(75) self.label_3.setFont(font) self.label_3.setStyleSheet("color: rgb(0, 0, 255);") self.label_3.setObjectName("label_3") self.btn_cancel = QtWidgets.QPushButton(Form) self.btn_cancel.setGeometry(QtCore.QRect(220, 240, 141, 31)) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.btn_cancel.setFont(font) self.btn_cancel.setStyleSheet("background-color: rgb(0, 0, 0);\n" "color: rgb(255, 255, 0);") self.btn_cancel.setObjectName("btn_cancel") self.lbl_result = QtWidgets.QLabel(Form) self.lbl_result.setGeometry(QtCore.QRect(10, 180, 501, 31)) font = QtGui.QFont() font.setPointSize(12) font.setBold(False) font.setWeight(50) self.lbl_result.setFont(font) self.lbl_result.setStyleSheet("color: rgb(255, 0, 0);") self.lbl_result.setObjectName("lbl_result") self.line = QtWidgets.QFrame(Form) self.line.setGeometry(QtCore.QRect(10, 110, 481, 21)) self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.label.setText(_translate("Form", "Nombres premiers de Sophie German")) self.label_2.setText(_translate("Form", "Saisir la valeur de n")) self.btn_validate.setText(_translate("Form", "Valider")) self.label_3.setText(_translate("Form", "Liste des nombres premiers de Sophie German")) self.btn_cancel.setText(_translate("Form", "Annuler")) self.lbl_result.setText(_translate("Form", "Result ...")) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_()) |
Question 3)
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 |
# fonction qui teste la primalité d'un nombre def test_prim(n): # initialisation du nombr de diviseurs de n d = 0 for k in range(2, n): if n%k == 0: d = d + 1 # un nombre est premier s'il ne possède aucun diviseur strict 1 < K < n if d > 0 : return False else: return True print(test_prim(n)) # output : True print(test_prim(m)) # output : False # Fonction qui détermine la liste des nombres premiers de sophie german def sophie(n): # initialisation de la liste des nombres premiers de sophie german list_german = [] for k in range(2, n+1): if test_prim(k) and test_prim(2*k+1): list_german.append(k) return list_german # Exemple n = 200 print(sophie(n)) # output: [2, 3, 5, 11, 23, 29, 41, 53, 83, 89, 113, 131, 173, 179, 191] |
Question 4)
Code du fichier main.py
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 |
import sys from library import * # fonction qui teste la primalité d'un nombre def test_prim(n): # initialisation du nombr de diviseurs de n d = 0 for k in range(2, n): if n%k == 0: d = d + 1 # un nombre est premier s'il ne possède aucun diviseur strict 1 < K < n if d > 0 : return False else: return True # Fonction qui détermine la liste des nombres premiers de sophie german def sophie(n): # initialisation de la liste des nombres premiers de sophie german list_german = [] for k in range(2, n+1): if test_prim(k) and test_prim(2*k+1): list_german.append(k) return list_german def action(): n = int(ui.lineEdit_n.text()) list_german = sophie(n) ui.lbl_result.setText(str(list_german)) app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() ui = Ui_Form() ui.setupUi(Form) ui.btn_validate.clicked.connect(action) Form.show() sys.exit(app.exec_()) |
Younes Derfoufi
CRMEF OUJDA