Le responsable de marketing d’une société veut créer un nom pour un nouvel article à partir de N noms de produits existants, sachant que ces derniers ont le même nombre de caractères. Le procédé ci-après a été sélectionné pour générer des propositions à utiliser dans le choix du nouveau nom.
Choisir un entier P inférieur à la longueur des noms des
Former une chaîne en concaténant le Pième caractère de chaque nom des N produits
Procéder à des permutations spirales des N lettres obtenues pour avoir N propositions à exploiter.
Le principe de la permutation spirale consiste à concaténer les différents caractères d’une chaîne de manière spirale en commençant par le dernier caractère (dernier caractère, premier caractère, avant dernier caractère, deuxième caractère, etc…).
Ce principe est illustré par l’exemple ci-dessous, qui pour une chaîne de départ "ABCDE" formée de 5 lettres et après 4 permutations spirales, on obtient la chaîne "BDECA". La 5ème permutation spirale permet de retrouver la chaîne de départ.
On se propose d’écrire un programme Python permettant :
1- de remplir un tableau Nom par les N noms des produits déjà commercialisés (avec 3 ≤ N ≤ 20), sachant que le nom d’un produit est une chaîne formée de 10 lettres majuscules,
2- de former une chaîne CH en concaténant le Pième caractère de chaque nom des N produits déjà commercialisés,
3- de procéder à des permutations spirales des N lettres de la chaîne CH,
4- d’afficher les N propositions
Dans cet algorithme, On va utiliser deux fonctions et deux procédures:
Algorithme du programme Principal
1 2 3 4 5 6 |
Algorithme nouveau_nom_article Debut n<-saisie_entier(2,30) remplir(nom,n) spirale(nom,n) Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
nom | tableaux des chaînes des caractères |
n | entier |
La fonction saisie_taille
Cette fonction saisit un entier 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 que le nom saisi est formé par des lettres majuscules.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
fonction verif_nom(ch:chaine):booleen Début Si long(ch)=10 alors #si le nom est compose de 10 caracteres i<-0 # verifier si la chaine est forme uniquement des majuscules Tant que (i<long(ch)-1) et ('A'<=ch[i]<='Z') faire i<-i+1 Fin tant que retourner ('A'<=ch[i]<='Z') Sinon retourner Faux Fin si Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
La procédure remplir
Cette procédure remplit le tableau T des noms des articles.
1 2 3 4 5 6 7 8 9 10 11 |
procedure remplir(@t:tab;n:entier) Début Pour i de 0 à n-1 faire Ecrire("donner nom article N°"+i+" forme des majuscules: ") Lire(t[i]) Tant que (verif_nom(t[i])=Faux) faire Ecrire("donner nom article N°"+i+" forme des majuscules: ") Lire(t[i]) Fin tant que Fin pour Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
La procédure spirale
Cette procédure permet de :
1- de former une chaîne CH en concaténant le Pième caractère de chaque nom des N produits déjà commercialisés,
2- de procéder à des permutations spirales des N lettres de la chaîne CH,
3- d’afficher les N propositions
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 |
procedure spirale(t:tab;n:entier) Début p<-saisie_entier(1,10) ch<-'' #former une chaîne CH en concaténant le P<sup>ième</sup> caractère de chaque nom #des N produits dt tableau T Pour i de 0 à n-1 faire ch2<-t[i] ch<-ch+ch2[p] Fin pour Ecrire('Les '+n+' propositions à utiliser sont: ') Ecrire(ch,' - ') #Faire des permutations spirales des N lettres de la chaîne CH Pour i de 0 à n-1 faire ch2<-'' pour j in de 0 à (n div 2)) faire Si (long(ch)-1-j != j): ch2<-ch2+ch[long(ch)-1-j]+ch[j] Sinon ch2<-ch2+ch[j] Fin si Fin pour Ecrire(ch2,end=' - ') ch<-ch2 Fin pour Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
ch | chaîne des caractères |
ch2 | chaîne des caractères |
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 |
from numpy import array nom=array([str]*100) # declaration du tableau des noms articles def saisie_entier(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): if len(ch)==10 : #si le nom est compose de 10 caracteres i=0 # verifier si la chaine est forme uniquement des majuscules while (i<len(ch)-1) and ('A'<=ch[i]<='Z'): i=i+1 return ('A'<=ch[i]<='Z') else: return False def remplir(t,n): # remplir le tableau des noms for i in range (n) : t[i]=input("donner nom article N°"+str(i)+" forme des majuscules: ") while (verif_nom(t[i])==False): t[i]=input("donner nom article N°"+str(i)+" forme des majuscules: ") def spirale(t,n): p=saisie_entier(1,10) ch='' for i in range (n) : ch2=t[i] ch=ch+ch2[p] print('Les '+str(n)+' propositions à utiliser sont: ') print(ch,end=' - ') for i in range (n-1) : ch2='' for j in range((n//2)+1): if (len(ch)-1-j != j): ch2=ch2+ch[len(ch)-1-j]+ch[j] else: ch2=ch2+ch[j] print(ch2,end=' - ') ch=ch2 #programme principal n=saisie_entier(2,30) remplir(nom,n) spirale(nom,n) |
Exécution du programme
Pour créer une application en Python et Designer QT qui va générer un nom pour le nouvel article, on va suivre ces étapes:
a- Ouvrez Qt Designer et créez un nouveau fichier de type Main Window.
b- Ajoutez ces widgets:
QLineEdit
nommé 'ch' pour entrer les noms des articles.
QPushButton
nommé 'remplir_bt' pour mettre les noms des articles dans le tableau Nom.
QLineEdit
nommé 'p' pour entrer le rang des caractères à concatiner.
QPushButton
nommé 'afficher_bt' pour procéder à des permutations spirales des N lettres de la chaîne CH.
QLabel
nommé 'msg' pour afficher des messages d'erreur.
QLabel
nommé 'resultat' pour afficher les N propositions pour le nouvel article.
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 |
from PyQt5.uic import loadUi from PyQt5 import QtCore, QtGui from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui, QtWidgets from numpy import array nom=array([str]*30) # declaration du tableau des noms articles 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 a partir d'une chaine des caractères def createTabNom(): windows.tabnom_label.clear() windows.msg.clear() global n #pour la taile du tableaux ch = windows.ch.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='' test_long=True # parcourir les caracteres de la chaine CH while (i<len(ch)) and test_long and (('A'<=ch[i]<='Z') or ch[i]==' ') : if ('A'<=ch[i]<='Z'): ch1=ch1+ch[i] if ((ch[i]==' ') or (i==len(ch)-1)) : # remplir le tableau nom nom[j]=ch1 test_long=(len(ch1)==10) ch1='' j=j+1 i=i+1 if (i==len(ch)): if 3<=j+1<=20: n=j # pour la taille des deux tableaux tab='' for k in range (j) : tab=tab+ 'nom['+str(k)+']= '+nom[k]+ '\n' #afficher les elements du tableau windows.tabnom_label.setText(tab) else: windows.msg.setText("la taille du tableau doit etre entre 3 et 20") else: windows.msg.setText("donner les noms forme 10 lettres majuscules") def spirale(): p = int(windows.p.text()) if 1<=p<=10: ch='' for i in range (n) : ch2=nom[i] ch=ch+ch2[p] resultat='Les '+str(n)+' propositions à utiliser sont:\n ' resultat=resultat+ch+' - ' for i in range (n-1) : ch2='' for j in range((n//2)+1): if (len(ch)-1-j != j): ch2=ch2+ch[len(ch)-1-j]+ch[j] else: ch2=ch2+ch[j] resultat=resultat+ch2+' - ' ch=ch2 windows.resultat.setText(resultat) else: windows.resultat.setText('p doit etre entre 1 et 10') windows.remplir_bt.clicked.connect ( createTabNom ) windows.afficher_bt.clicked.connect ( spirale ) windows.show() app.exec_() |
Exécution du programme
1) Remplissage du tableau Nom des noms des articles
2) Afficher les propositions des noms pour le nouvel article.
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