 
                        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