Un hôtel souhaite attribuer des séjours gratuits à ses résidents à l’occasion de la fête de fin d’année en se basant sur leurs numéros de réservation qui sont des entiers de 4 chiffres.
Les résidents gagnants sont ceux qui possèdent plus de nombres premiers formés à partir de leurs numéros de réservation (le nombre lui-même, les nombres formés de trois chiffres adjacents, les nombres formés de deux chiffres adjacents et les nombres formés par un seul chiffre).
Exemple : Pour les numéros de réservation suivants : T:
3322 | 4774 | 3114 | 1012 | 2537 | 2291 | 1854 | 3149 | 4766 | 1579 |
Les numéros de réservation des résidents gagnants est : 2537 et 1579 puisque :
- 2537 possède 5 nombres premiers qui sont 3, 5, 7, 53 et 37
- 1579 possède 5 nombres premiers qui sont 5, 7, 79, 157 et 1579
N.B : un nombre est dit premier s’il n’est divisible que par 1 et par lui-même. Par définition, 1 n’est pas premier.
Ecrire un programme Python qui permet de remplir un tableau T par n (10≤N≤100) numéros de réservation, puis d’afficher la liste des résidents gagnants.
Pour résoudre ce problème, voici le principe de l'algorithme qui permet de remplir un tableau T
par n
numéros de réservation, puis d'afficher la liste des résidents gagnants :
1. Remplir le tableau T
:
Générer n
numéros de réservation, chacun étant un entier de 4 chiffres. Ces numéros sont fournis comme entrée.
2. Vérifier si un nombre est premier :
Implémenter une fonction test_premier(nombre)
qui prend un entier en entrée et renvoie Vrai
si ce nombre est premier, sinon Faux
.
Un nombre est premier s'il est supérieur à 1 et n'a pas de diviseurs autres que 1 et lui-même.
3. Extraire tous les sous-nombres d'un numéro de réservation :
Pour chaque numéro de réservation dans T
, extraire tous les sous-nombres possibles en considérant les chiffres adjacents.
Pour un numéro de réservation à 4 chiffres abcd
:
- Sous-nombres de 4 chiffres : abcd
- Sous-nombres de 3 chiffres : abc
, bcd
- Sous-nombres de 2 chiffres : ab
, bc
, cd
- Sous-nombres de 1 chiffre : a
, b
, c
, d
4. Calculer le nombre de nombres premiers pour chaque numéro de réservation :
- Pour chaque numéro de réservation dans T
, utiliser la fonction test_premier(nombre)
pour vérifier si chaque sous-nombre est premier.
- Compter le nombre de sous-nombres premiers pour chaque numéro.
5. Trouver les résidents gagnants :
- Identifier les numéros de réservation ayant le plus grand nombre de sous-nombres premiers.
- Si plusieurs numéros ont le même nombre maximum de sous-nombres premiers, ils sont tous gagnants.
- Afficher les numéros de réservation correspondant aux résidents gagnants.
Dans cet algorithme, On va utiliser 3 fonctions et 2 procédures :
Algorithme du programme principal
1 2 3 4 5 6 7 8 |
Algorithme jeu_hotel Debut n<-saisie_taille() Ecrire('remplissage du tableau t') remplir(t,n) Ecrire('les numeros des reservations gagnantes sont:') reservations_gagnantes(t,n) Fin |
Déclaration des objets
Objet | Type / Nature |
t | tableau de 100 entiers |
t1 | tableau de 100 entiers |
n | entier |
m | entier |
La fonction saisie_taille
Cette fonction retourne un entier n entre 10 et 100 saisi par l'utilisateur.
1 2 3 4 5 6 7 8 9 10 |
foncttion saisie_taille():entier Début Ecrire('donner un entier entre 10 et 100') lire (n) Tant que n<10 ou n>100 faire Ecrire('donner un entier entre 10 et 100') lire (n) Fin tant que retourner n Fin |
Déclaration des objets
Objet | Type / Nature |
n | entier |
La procédure remplir
Cette procédure remplit le tableau t de n entiers distincts.
1 2 3 4 5 6 7 8 9 10 11 |
Procédure remplir(@t:Tab,n:entier) Début Pour i de 0 à n-1 faire Ecrire("donner elt N°",i," entre 1000 et 9999:") lire(t[i]) Tant que (t[i]<1000) ou (t[i]>9999) faire Ecrire("donner elt N°",i," entre 1000 et 9999:") lire(t[i]) Fin tant que Fin pour Fin |
Déclaration des objets
Objet | Type / Nature |
i | entier |
La fonction test_premier
Cette fonction teste si un entier est premier ou non.
1 2 3 4 5 6 7 8 |
Fonction test_premier(x:entier):booleen Début i<-2 Tant que (x mod i != 0) et (i < x div 2) faire i<-i+1 Fin tant que return (x mod i != 0) et x!=1 Fin |
Déclaration des objets
Objet | Type / Nature |
i | entier |
La fonction nbr_premiers
Cette fonction compte le nombre de sous-nombres premiers d'un entier donné
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 |
Fonction nbr_premiers(x:entier):entier Début ch<-Convch(x) cp<-0 # test si le nombre est premier Si test_premier(x) alors cp<-cp+1 # test si chaque chiffre du nombre est premier Pour i de 0 à 3 faire Si test_premier(Valeur(ch[i])) alors cp<-cp+1 Fin si Fin pour # test si deux chiffres adjacents du nombre est premier Pour i de 0 à 2 faire Si test_premier(Valeur(ch[i]+ch[i+1])) alors cp<-cp+1 Fin si Fin pour # test si trois chiffres adjacents du nombre est premier Pour i de 0 à 1 faire Si test_premier(int(ch[i]+ch[i+1]+ch[i+2])) alors cp<-cp+1 Fin si Fin pour retourner cp Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
ch | chaîne des caractères |
i | entier |
cp | entier |
La fonction max_premiers
Cette fonction retourne le plus grand nombre de sous-nombres premiers des entiers du tableau T .
1 2 3 4 5 6 7 8 9 10 |
Fonction max_premiers(t:Tab,n:entier) Début max<-0 Pour i de 0 à n-1 faire Si max < nbr_premiers(t[i]) alors max<-nbr_premiers(t[i]) Fin si Fin pour retourner max Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
max | entier |
i | entier |
La procédure reservations_gagnantes
Cette procédure identifie et affiche les numéros de réservation ayant le plus grand nombre de sous-nombres premiers.
1 2 3 4 5 6 7 8 9 |
Procédure reservations_gagnantes(t:Tab,n:entier) Début max<-max_premiers(t,n) Pour i de 0 à n-1 faire Si max = nbr_premiers(t[i]) alors Ecrire(t[i]) # afficher le numero gagnant de la reservation Fin si Fin pour Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
max | entier |
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 |
from numpy import array t=array([int()]*30) def saisie_taille() : n=int(input("donner un entier entre 10 et 100: ")) while(n<10) or (n>100) : n=int(input("donner un entier entre 10 et 100: ")) return n def remplir(t,n): for i in range (n) : t[i]=int(input("donner elt N°"+str(i)+" entre 1000 et 9999: ")) while (t[i]<1000) or (t[i]>9999) : t[i]=int(input("donner elt N°"+str(i)+" entre 1000 et 9999: ")) def test_premier(x) : i=2 while(x % i != 0) and (i < x // 2) : i=i+1 return (x % i != 0) and x!=1 def nbr_premiers(x): ch=str(x) cp=0 # test si le nombre est premier if test_premier(x): cp=cp+1 #print(str(x)) # test si chaque chiffre du nombre est premier for i in range(4): if test_premier(int(ch[i])): cp=cp+1 #print(str(ch[i])) # test si deux chiffres adjacents du nombre est premier for i in range(3): if test_premier(int(ch[i]+ch[i+1])): cp=cp+1 #print(str(ch[i]+ch[i+1])) # test si trois chiffres adjacents du nombre est premier for i in range(2): if test_premier(int(ch[i]+ch[i+1]+ch[i+2])): cp=cp+1 #print(str(ch[i]+ch[i+1]+ch[i+2])) return cp def max_premiers(t,n): max=0 for i in range(n): if max < nbr_premiers(t[i]) : max=nbr_premiers(t[i]) return max def reservations_gagnantes(t,n): max=max_premiers(t,n) for i in range(n): if max == nbr_premiers(t[i]) : print(str(t[i])) # afficher le numero gagnant de la reservation n=saisie_taille() print('remplissage du tableau t') remplir(t,n) print('les numeros des reservations gagnantes sont:') reservations_gagnantes(t,n) |
Exécution du programme
Pour remplir un tableau d'entiers à partir d'une chaîne de caractères en Python, vous pouvez suivre les étapes suivantes :
1- Découper la chaîne de caractères en sous-chaînes contenant les entiers.
2- Convertir chaque sous-chaîne en entier.
3- Ajouter chaque entier au tableau.
Pour créer une application en Python pour identifier et afficher les numéros de réservation ayant le plus grand nombre de sous-nombres premiers.
a- Ouvrez Qt Designer et créez un nouveau fichier de type Main Window.
b- Ajoutez ces widgets:
QLineEdit
nommé 'ch' pour entrer des entiers .
QPushButton
nommé 'remplir_bt' pour exécuter le module createTab afin de remplir le tableau à partir de la chaine 'ch'.
QPushButton
nommé 'bt_recherche' pour exécuter le module reservations_gagnantes.
QLabel
nommé 'msg' pour afficher un message d'erreur si ch est vide ou contient des valeurs non numériques ou les éléments du tableau non formé de quatre chiffres.
QLabel
nommé 'tab_label' pour afficher les éléments du tableau T.
QLabel
nommé 'resultat' pour afficher les numéros des réservations gagnantes.
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 |
from PyQt5.uic import loadUi from PyQt5 import QtCore, QtGui from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui, QtWidgets from numpy import array t=array([int()]*100) 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 # Procedure qui remplit un tableau par des entiers a partir d'une chaine des caractère def createTab(): ch = windows.ch.text() global n # pour la taille di tableau 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_4chiffres=True # parcourir les caracteres de la chaine while((i<len(ch)) and (test_4chiffres) and (('0'<=ch[i]<='9') or (ch[i]==' '))): if ('0'<=ch[i]<='9'): ch1=ch1+ch[i] if ((ch[i]==' ') or (i==len(ch)-1)) : t[j]=int(ch1) ch1='' if t[j]<1000 or t[j]>9999 : test_4chiffres=False j=j+1 i=i+1 if (i<len(ch)) or (test_4chiffres==False): windows.msg.setText("la chaine doit contenir des nombres de 4 chiffres") else : if 10<=j<=100: # test du taille du tableau n=j tab='' for k in range (j) : tab=tab+ 't['+str(k)+']= '+ str(t[k])+ '\n' #afficher les elements du tableau windows.tab_label.setText(tab) else: windows.msg.setText("Le nbr des elements doit etre entre 10 et 100") def test_premier(x) : i=2 while(x % i != 0) and (i < x // 2) : i=i+1 return (x % i != 0) and x!=1 def nbr_premiers(x): ch=str(x) cp=0 # test si le nombre est premier if test_premier(x): cp=cp+1 #print(str(x)) # test si chaque chiffre du nombre est premier for i in range(4): if test_premier(int(ch[i])): cp=cp+1 #print(str(ch[i])) # test si deux chiffres adjacents du nombre est premier for i in range(3): if test_premier(int(ch[i]+ch[i+1])): cp=cp+1 #print(str(ch[i]+ch[i+1])) # test si trois chiffres adjacents du nombre est premier for i in range(2): if test_premier(int(ch[i]+ch[i+1]+ch[i+2])): cp=cp+1 #print(str(ch[i]+ch[i+1]+ch[i+2])) return cp def max_premiers(t,n): max=0 for i in range(n): if max < nbr_premiers(t[i]) : max=nbr_premiers(t[i]) return max def reservations_gagnantes(): max=max_premiers(t,n) liste='' for i in range(n): if max == nbr_premiers(int(t[i])) : print(str(t[i])) # afficher le numero gagnant de la reservation liste=liste+str(t[i])+'\n' windows.resultat.setText(liste) windows.remplir_bt.clicked.connect ( createTab ) windows.bt_recherche.clicked.connect ( reservations_gagnantes ) windows.show() app.exec_() |
Exécution du programme
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