Un nombre entier nb de k chiffrres est dit nombre de Keith s'il peut apparaltre dans une suite de nombres générés à partir de ses propres chiffres.Voiei les &tapes pour determiner si un nombre nb a k chiffres est un nombre de Keith ou non :
1- Déterminer les k premiers tonics de la suite : les k premiers termes de la suite sont les k chiffres du nombre nb en conainencant de gauche a droite.
2- Calculer le terme suivant de la suite : le terme suivant est la somme des k derniers ferules.
3- Répéter l'étape n°2 jusqu' a ce que le dernier terme calculé soit supérieur ou égal à nb
4- Verifier l'apparition du nombre nb : Si le nombre nb est un terme de la suite, alors it est un nombre de Keith sinon it n'est pas un nombre de Keith.
Exemnles
Pour nb = 14, on a done k =2 puisque 14 est un nombre forme de 2 ehiffres
1- Les 2 premiers termes de la suite sont sueeessivement : 1 et 4 (les k ehiffres de nb).
2- Le calcul du terme suivant de la suite : 5 = (1+4).
3- Le calcul des termes suivants : 9 — (4+5), puis 14 = (5+9). Arrest du calcul puisque le terme 14 est superieur ou egal a nb.

4- Verifier si 14 apparait dans la suite : puisque le terme 14 est egal a nb, done 14 est un nombre de Keith.
Pour nb = 189, on a done k --3 puisque 189 est un notnbre forme de 3 chiffres
1- Les 3 premiers termes de la suite sent successivement 1, 8 et 9 (les k chiffres de nb).
2- Le calcul du terme suivant de la suite : 18 = (1+8+9).
3- Le calcul des terries suivants : 35 = (8+9+18), puis 62 = (9+18+35). puis 115 = (18+35+62), puis 212 = (35+62+115). Arra du calcul puisque le terme 212 est supérieur ou égal à nb.

4- Verifier si 189 apparait dans la suite : puisque le terme 212 est strietement superieur a nb, done 189 n'appaxait pas dans la suite et par consequent 189 West pas un nombre de Keith.
Pour nb = 153 7, on a done k = 4 puisque 1537 est un nombre forme de 4 chiffres
1- Les 4 premiers termes de la suite sont successivement : 1, 5, 3 et 7 (les k chiffres de nb).
2- Le calcul du terme suivant de la suite : 16 = (1+5+3+7).
3- Le calcul des termes suivants : 31 = (5+3+7+16), puis 57 = (3+7+16+31), puis 111 = (7+16+31+57), puis 215 = (16+31+57+111), puis 414 = (31+57+111+215), puis 797 = (57+111+215+414), puis 1537 = (111+215+414+797). Arrêt du calcul puisque le terme 1537 est supérieur ou égal a
4- Vérifier si 1537 apparaît dans la suite puisque le terme 1537 est egal a nb, done le terme 1537 est un nombre de Keith.
On se propose d'écrire un algorithme d'un programme qui permet de :
- remplir un tableau T1 par N1 entiers sachant que chaque element du tableau doit etre un
entier compose de 2 chiffres au minimum et de 5 chiffres au maximum.
- générer un deuxieme tableau T2 contenant les elements de T1 qui sant des nombres de Keith.
- afficher les elements de T2 regroupes selon leurs nombres de chiffres conformement a l'exemple suivant
Exemple :
Pour N1 = 12 et le tableau T1 suivant :
![]()
Le tableau T2 généré sera donc :
![]()
Le programme affiche les lignes suivantes
14, 61, 47 nombre(s) de Keith de 2 chiffres.
Aucun nombre de Keith de 3 chiffres.
1537, 4788 : nombre(s) de Keith de 4 chiffres.
31331, 55604, 34285 : nombre(s) de Keith de 5 chiffres.
Travail demande
1- Ecrire un algorithme du programme principal, solution a ce problème, en le décomposant en
2- Ecrire un algorithme pour chaque module envisage.
N.B. : Le candidat est appelé a dresser les tableaux de déclaration des objets et des nouveaux types nécessaires.
Dans cet algorithme, On va utiliser trois fonctions et une procédure:
-
Algorithme du programme Principal
|
1 2 3 4 5 6 7 8 9 10 |
Algorithme vote_joueur_MVP Debut Ecrire('Remplissage du tableau tj') n<-saisie_taille(5,30) remplir_tj(tj,n) Ecrire('Votes des journalistes') m<-saisie_taille(2,50) remplir_ts(ts,m) afficher_MVP(tj,ts,n) Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| tj | tableau des chaînes des caractères |
| ts | tableau des entiers |
| n | entier |
| m | entier |
La fonction saisie_taille
Cette fonction saisit la taille du tableau entre deux bornes a et b.
|
1 2 3 4 5 6 7 8 9 10 |
fonction saisie_taille(a:entier;b:entier):entier Début Ecrire("donner un entier entre "+a+" et "+b+": ")) Lire(n) Tant que (n<a) ou (n>b) faire Ecrire("donner un entier entre "+a+" et "+b+": ")) Lire(n) Fin tant que retourner n Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| n | entier |
La fonction verif_nom
Cette fonction vérifie si la chaine est formée uniquement des lettres et/ou espaces
|
1 2 3 4 5 6 7 8 9 |
fonction verif_nom(ch:chaine):booleen Début i<-0 # verifier si la chaine est forme uniquement des lettres et/ou espaces Tant que (i<long(ch)-1) et (('A'<=Majus(ch[i])<='Z') ou ch[i]=' '): i<-i+1 Fin tant que retourner ('A'<=Majus(ch[i])<='Z') ou (ch[i]=' ') Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| i | entier |
La fonction verif_unicite
Cette fonction vérifie que le nom du joueur est distinct des autres noms du tableau tj
|
1 2 3 4 5 6 7 8 |
fonction verif_unicite(tj:tab1;i:entier):booleen Début j<-0 Tant que (j<i-1) et (t[i]!=t[j]) faire j<-j+1 Fin tant que retourner (t[i]!=t[j]) Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| j | entier |
La procédure remplir_tj
Cette procédure remplit le tableau des joueurs tj.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
procedure remplir_tj(@tj:tab1;n:entier) Début Ecrire("donner prenom et nom joueur N°0 forme des lettres et/ou espaces: ") Lire(tj[0]) # verifier la validite du nom du jour Tant que (verif_nom(tj[0])=Faux) alors Ecrire("donner prenom et nom joueur N°0 forme des lettres et/ou espaces: ") Lire(tj[0]) Fin tant que Pour i de 1 à n-1 faire Ecrire("donner prenom et nom joueur N°"+i+" forme des lettres et/ou espaces: ") Lire(tj[i]) # verifier la validite du nom du jour et son unicite dans le tableau tj Tant que (verif_nom(tj[i])=Faux) ou (verif_unicite(tj,i)=Faux) faire Ecrire("donner prenom et nom joueur N°"+i+" forme des lettres et/ou espaces: ") Lire(tj[i]) Fin tant que Fin pour Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| i | entier |
La fonction exist_joueur
Cette fonction vérifie que le nom du joueur choisi par le journaliste existe dans le tableau des joueurs tj.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
fonction exist_joueur (tj:tab1;n:entier;vote:chaine):booleen Début i<-0 Tant que (i<n-1) et (tj[i]!=vote) faire i<-i+1 Fin tant que # Si le nom du joueur existe dans le tableau tj Si tj[i]=vote alors retourner i Sinon retourner -1 Finsi Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| i | entier |
La procédure remplir_ts
Cette procédure remplit le tableau des scores ts.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
procedure remplir_ts(@ts:tab2;m:entier) Début liste_choix<-'' Pour i de 0 à m-1 faire Pour j de 0 à 2 faire Ecrire("Journaliste "+i+" donne choix joueur N°"+j+" : ")) Lire(vote) # verifier si le nom du jour existe et unique dans les choix du journaliste Tant que exist_joueur(tj,n,vote)=-1 ou Pos(liste_choix.find,vote)>=0 faire Ecrire("Journaliste "+i+" donne choix joueur N°"+j+" : ")) Lire(vote) Fin tant que liste_choix<-liste_choix+vote indice<-exist_joueur(tj,n,vote) ts[indice]<-ts[indice]+5-2*j Fin pour Fin pour Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| i | entier |
| j | entier |
| indice | entier |
| liste_choix | chaine |
La procédure afficher_MVP
Cette procédure affiche le score MVP de la saison, ainsi que le nom de chaque joueur ayant ce score.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
procedure afficher_MVP(tj:tab1;ts:tab2;n:entier) Début max<-0 # recherche du score MVP Pour i de 1 à n-1 faire Si ts[max]<ts[i] alors max<-i Finsi Fin pour Ecrire("Le score MVP est :"+ts[max]) # Recherche de(s) nom de(s) joueur(s) ayant le score MVP Pour i de 0 à n-1 faire Si ts[i]=ts[max] alors Ecrire(tj[i]) Fin si Fin pour Fin |
Déclaration des objets
| Objet | Type / Nature |
|---|---|
| i | entier |
| max | 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 71 72 73 74 75 76 77 78 79 |
from numpy import array tj=array([str]*100) # declaration du tableau des noms joueurs ts=array([int()]*100) # declaration du tableau des scores def saisie_taille(a,b): n=int(input("donner un entier entre "+str(a)+" et "+str(b)+": ")) while (n<a) or (n>b): n=int(input("donner un entier entre "+str(a)+" et "+str(b)+": ")) return n def verif_nom(ch): i=0 # verifier si la chaine est forme uniquement des lettres et/ou espaces while (i<len(ch)-1) and (('A'<=ch[i].upper()<='Z')or ch[i]==' '): i=i+1 return ('A'<=ch[i].upper()<='Z')or (ch[i]==' ') def verif_unicite(t,i): j=0 while (j<i-1) and (t[i]!=t[j]): j=j+1 return (t[i]!=t[j]) def remplir_tj(tj,n): # remplir le tableau des noms tj[0]=input("donner prenom et nom joueur N°0 forme des lettres et/ou espaces: ") # verifier la validite du nom du jour while (verif_nom(tj[0])==False): tj[0]=input("donner prenom et nom joueur N°0 forme des lettres et/ou espaces: ") for i in range (1,n) : tj[i]=input("donner prenom et nom joueur N°"+str(i)+" forme des lettres et/ou espaces: ") # verifier la validite du nom du jour et son unicite dans le tableau tj while (verif_nom(tj[i])==False) or (verif_unicite(tj,i)==False): tj[i]=input("donner prenom et nom joueur N°"+str(i)+" forme des lettres et/ou espaces: ") def exist_joueur(tj,n,vote): i=0 while (i<n-1) and (tj[i]!=vote): i=i+1 # Si le nom du joueur existe dans le tableau tj if tj[i]==vote: return i else: return -1 def remplir_ts(ts,m): # remplir le tableau des scores liste_choix='' for i in range(m): for j in range(3): vote=(input("Journaliste "+str(i)+" donne choix joueur N°"+str(j)+" : ")) # verifier si le nom du jour existe et unique dans les choix du journaliste while exist_joueur(tj,n,vote)==-1 or liste_choix.find(vote)>=0: vote=(input("Journaliste "+str(i)+" donne choix joueur N°"+str(j)+" : ")) liste_choix=liste_choix+vote indice=exist_joueur(tj,n,vote) ts[indice]=ts[indice]+5-2*j def afficher_MVP(tj,ts,n): max=0 for i in range (1,n) : if ts[max]<ts[i]: max=i print("Le score MVP est :"+str(ts[max])) for i in range(n): if ts[i]==ts[max]: print(tj[i],end=" , ") #programme principal print('Remplissage du tableau tj') n=saisie_taille(5,30) remplir_tj(tj,n) print('Votes des journalistes') m=saisie_taille(2,50) remplir_ts(ts,m) afficher_MVP(tj,ts,n) |
Exécution du programme:

Pour créer une application en Python et Designer QT afin d'automatiser l'élection du joueur MVP, on va suivre ces étapes:
a- Ouvrez Qt Designer et créez un nouveau fichier de type Main Window.
b- Ajoutez ces widgets:
QLabel nommé 'msg' pour afficher des messages d'erreur.
QLineEdit nommé 'ch1' pour entrer les noms des joueurs
QLineEdit nommé 'ch2' pour entrer les numéros des choix
QPushButton nommé 'remplirtj_bt' pour mettre les noms des joueurs dans le tableau TJ
QPushButton nommé 'remplirts_bt' pour mettre les scores dans le tableau TS
QLabel nommé 'tabtj_label' pour contenir les noms des joueurs dans le tableau TJ
QLabel nommé 'tabtj_label' pour contenir les scores dans le tableau TS
QPushButton nommé 'afficher_bt' pour rechercher le score MVP de la saison, ainsi que le nom de chaque joueur ayant ce score
QLabel nommé 'resulat' pour contenir le score MVP de la saison, ainsi que le nom de chaque joueur ayant ce score

Enregistrez le fichier avec l'extension .ui, par exemple tabtab-5.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 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
from PyQt5.uic import loadUi from PyQt5.QtWidgets import QApplication from numpy import array tj=array([str]*60) # declaration des noms des joueurs ts=array([int()]*60) # declaration du tableau scores 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 verif_unicite(t,i): j=0 while (j<i-1) and (t[i]!=t[j]): j=j+1 return (t[i]!=t[j]) # Procedure qui remplit un tableau des adherents a partir d'une chaine des caractères def createTabTJ(): windows.tabtj_label.clear() windows.msg.clear() global n #pour la taile des tableaux ch = windows.ch1.text() 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='' unicite=True # parcourir les caracteres de la chaine CH1 while (i<len(ch)) and unicite and (('A'<=ch[i].upper()<='Z') or (ch[i]==' ') or (ch[i]=='#')) : if ('A'<=ch[i].upper()<='Z') or ch[i]==' ': ch1=ch1+ch[i] if ((ch[i]=='#') or (i==len(ch)-1)) : # remplir le tableau M par les noms des joueurs ch1= supprimer_espaces(ch1) tj[j]=ch1 if j>0: unicite=verif_unicite(tj,j) ch1='' j=j+1 i=i+1 if (i==len(ch)) and (unicite) : if 1<=j<=30: n=j # pour la taille des deux tableaux tab='' for k in range (j) : tab=tab+ 'tj['+str(k)+']= '+tj[k]+ '\n' #afficher les elements du tableau windows.tabtj_label.setText(tab) else: windows.msg.setText("la taille du tableau doit etre entre 5 et 30") else: windows.msg.setText("donner prenoms et noms joueur uniques forme des lettres et/ou espaces et separes par #") # Procedure qui remplit un tableau des scores def createTabTS(): windows.tabts_label.clear() windows.msg.clear() ch = windows.ch2.text() 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='' choix=0 test_choix=True # parcourir les caracteres de la chaine CH2 while(i<len(ch)) and test_choix and (('0'<=ch[i]<='9') or (ch[i]==' ')) : choix=choix+1 if ('0'<=ch[i]<='9'): ch1=ch1+ch[i] if ((ch[i]==' ') or (i==len(ch)-1)) : # remplir le tableau ts par les votes des journalistes if (0<=int(ch1)<=n): if choix==1: ts[int(ch1)]=ts[int(ch1)]+5 elif choix==2: ts[int(ch1)]=ts[int(ch1)]+3 else: ts[int(ch1)]=ts[int(ch1)]+1 choix=0 else: test_choix=False ch1='' i=i+1 if (i==len(ch)) and test_choix : tab='' for k in range (n) : tab=tab+ 'ts['+str(k)+']= '+str(ts[k])+ '\n' #afficher les elements du tableau windows.tabts_label.setText(tab) else: windows.msg.setText("Donner des choix entre 0 et "+str(n)) def afficher_MVP(): max=0 for i in range (1,n) : if ts[max]<ts[i]: max=i resultat="Le score MVP est :"+str(ts[max])+"\n" for i in range(n): if ts[i]==ts[max]: resultat=resultat+tj[i]+" , " windows.resultat.setText(resultat) windows.remplirtj_bt.clicked.connect ( createTabTJ ) windows.remplirts_bt.clicked.connect ( createTabTS ) windows.afficher_bt.clicked.connect ( afficher_MVP ) windows.show() app.exec_() |
Exécution du programme
1) Remplissage du tableau Tj

2) Remplissage du tableau TS

3) Affichage du score MVP de la saison, ainsi que le nom de chaque joueur ayant ce score

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 Haj Salah - Prof Info