 
                        Dans le but de gérer les discussions dans un groupe fermé créé au sein d'un réseau social, on se propose de réaliser une application informatique permettant d'afficher à l'administrateur du groupe :
- La liste des adhérents qui ont envoyé un même commentaire donné,
- La liste des adhérents inactifs dans le groupe, sachant qu'un adhérent est qualifié inactif s'il n'a envoyé aucun commentaire.,
Pour ce faire, on se propose de:
1- Remplir un tableau A par les noms d'utilisateurs des Na adhérents du groupe avec 6≤Na≤50, sachant qu'un nom d'utilisateur est unique et formé par une suite d'au minimum trois caractères commençant obligatoirement par une lettre majuscule.
2- Remplir un tableau M par les Nm commentaires émis par les adhérents de ce groupe avec 2≤Nm≤100 en respectant le format général suivant : NumE#commentaire, où:
- NumE est une donnée représentant l'indice de l'émetteur du commentaire dans le tableau A
- commentaire représente le texte envoyé par cf.:d. émetteur.
3- Afficher:
- le nom d'utilisateur de chaque adhérent qui a envoyé un commentaire donné.
- la liste des adhérents inactifs.
Exemple Pour Na=5, Nm= 7 et les tableaux A et M suivants :
A
| Olfa | Hichem_2018 | Mohamed | Amir@ | Salah | 
M
| 2#Help | 3#Help | 0#salutation | 2#coursinfo | 2#Algo | 0#OK | 2#Help | 
Pour M[2]='0#salutation' signifie :
- 0 est l'indice de l'émetteur dans le tableau A
- 'salutation' est le texte du commentaire
Si le commentaire saisi est "Help", alors le programme devra afficher les deux résultats suivants :
Le commentaire Help est envoyé par Amir@, Mohamed
La liste des adhérents inactifs est:
Hiechem_2018 Salah20
Pour résoudre ce problème, nous allons créer un algorithme en trois étapes :
1- Remplir les tableaux des utilisateurs et des commentaires.
2- Extraire les informations relatives aux commentaires envoyés.
3- Afficher les adhérents qui ont envoyé un commentaire donné et la liste des adhérents inactifs.
Voici un algorithme en pseudocode pour cette tâche :
1- Entrée des adhérents dans le tableau A :
Demander à l'utilisateur d'entrer les noms des adhérents.
S'assurer que chaque nom commence par une lettre et contient au moins trois caractères.
2- Entrée des commentaires dans le tableau M :
Demander à l'utilisateur d'entrer les commentaires au format "NumE#commentaire".
Extraire les indices d'émetteurs et les commentaires correspondants.
3- Trouver les adhérents ayant envoyé un commentaire donné :
Prendre un commentaire comme entrée.
Parcourir le tableau M, et pour chaque commentaire qui correspond à celui donné, afficher le nom d'utilisateur correspondant à l'indice NumE extrait.
4- Identifier les adhérents inactifs :
Parcourir le tableau A.
Vérifier si l'adhérent a envoyé un commentaire en comparant son indice avec ceux présents dans le tableau M.
Si l'indice d'un adhérent n'est pas trouvé dans M, l'ajouter à la liste des inactifs.
5- Afficher les résultats :
Afficher les adhérents ayant envoyé le commentaire donné.
Afficher la liste des adhérents inactifs.
Dans cet algorithme, On va utiliser trois fonctions et trois procédures:

Algorithme du programme Principal
| 1 2 3 4 5 6 7 8 | Algorithme adherents_commentaires Debut      na<-saisie_taille_nom()      remplir_nom(a,na)      nm<-saisie_taille_commentaire()      remplir_commentaire(m,nm,na)      afficher(a,na,m,nm) Fin | 
Déclaration des objets
| Objet | Type / Nature | 
|---|---|
| a | tableaux des chaînes | 
| m | tableaux des entiers | 
| na | entier | 
| nm | entier | 
La fonction saisie_taille_nom
Cette fonction saisit la taille du tableau des adhérents entre 6 et 50.
| 1 2 3 4 5 6 7 8 9 10 | fonction saisie_taille_nom():entier Début       Ecrire('donner un entier entre 6 et 50: ')       Lire(n)       Tant que n<6 ou n>50 faire          Ecrire('donner un entier entre 6 et 50: ')           Lire(n)       Fin tant que       retourner n  Fin | 
Déclaration des objets
| Objet | Type / Nature | 
|---|---|
| n | entier | 
La fonction saisie_taille_commentaire
Cette fonction saisit la taille du tableau des commentaires entre 3 et 100.
| 1 2 3 4 5 6 7 8 9 10 | fonction saisie_taille_nom():entier Début       Ecrire('donner un entier entre 3 et 100: ')       Lire(n)       Tant que n<3 ou n>100 faire          Ecrire('donner un entier entre 3 et 100: ')           Lire(n)       Fin tant que       retourner n  Fin | 
Déclaration des objets
| Objet | Type / Nature | 
|---|---|
| n | entier | 
La fonction verif_unicite
Cette fonction vérifie si le nom de l'adhérent existe ou non dans le tableau a.
| 1 2 3 4 5 6 7 8 | fonction verif_unicite(t:tab,i:entier):booleen Début       j<-0       Tant que t[j]!=t[i] et j<i-1 faire         j<-j+1       Fin tant que       retourner t[j]!=t[i] Fin | 
Déclaration des objets
| Objet | Type / Nature | 
|---|---|
| j | entier | 
La procédure remplir_nom
Cette procédure remplit le tableau a des adhérents par des noms commençant par une lettre majuscule.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | procedure remplir_nom(@t:tab,n:entier) Début        Ecrire("donner nom N°0 commencant par une lettre majuscule et son longueur >=3: ")      Lire(t[0])      ch<-t[0]      Tant que  ch[0]<'A' ou ch[0]>'Z' ou long(t[0])<3 faire          Ecrire("donner nom N°0 commencant par une lettre majuscule et son longueur >=3: ")         Lire(t[0])         ch<-t[0]      Fin tant que      Pour i de 1 à n-1 faire        Ecrire("donner nom N°"+str(i)+" commencant par une lettre majuscule et son longueur >=3: ")        Lire(t[i])        ch<-t[i]        Tant que  ch[0]<'A' ou ch[0]>'Z' ou long(t[i])<3 ou verif_unicite(t,i)=Faux :           Ecrire("donner nom N°"+str(i)+" commencant par une lettre majuscule et son longueur >=3: ")          Lire(t[i])          ch=t[i]         Fin tant que      Fin pour Fin | 
Déclaration des objets
| Objet | Type / Nature | 
|---|---|
| i | entier | 
| ch | chaîne des caractères | 
La procédure remplir_commentaire
Cette procédure remplit le tableau m des commentaires par des chaînes sous la forme 'NumE#commentaire' ou NumE est l'indice de l'émetteur du tableau des adhérents a.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | procedure remplir_commentaire(@m:tab,nm:tab,na:entier) Début        Pour i de 0 à nm-1 faire        Ecrire("donner commentaire N°"+str(i)+" sous forme Num#commentaire: ")        Lire(m[i])        ch<-m[i]        Tant que ch[0]<'0' ou ch[0]>na ou ch[1]!='#' ou long(m[i])<3 faire           Ecrire("donner commentaire N°"+str(i)+" sous forme Num#commentaire: ")           Lire(m[i])           ch=m[i]        Fin tant que      Fin pour  Fin | 
Déclaration des objets
| Objet | Type / Nature | 
|---|---|
| i | entier | 
| ch | chaîne des caractères | 
La procédure afficher
Cette procédure affiche les adhérents ayant envoyé le commentaire donné et la liste des adhérents inactifs.
| 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 | procedure afficher(a:tab,na:entier,m:tab,nm:entier) Début       liste_commentaires<-''       liste_adherents<-''      # afficher les commentaires et les adhérents qui les a envoye      Pour i de 0 à nm-1 faire          ch2<-m[i]         Si Pos(liste_commentaires,Sous_chaine(ch2,2,long(ch2)))<0 alors # Si le commentaire n'est pas deja affiche            Ecrire()# retour a la ligne            # afficher le commentaire et l'adherent             Ecrire('Le commentaire '+Sous_chaine(ch2,2,long(ch2))+' est envoye par '+a[Valeur(ch2[0])])             liste_commentaires=liste_commentaires+Sous_chaine(ch2,2,len(ch2))         Sinon # Si le commentaire existe deja            Ecrire(a[int(ch2[0])], end=', ') #ajouter uniquement le nom adherent         Fin si         #ajouter le nom adherent actif a la liste         liste_adherents<-liste_adherents+a[Valeur(ch2[0])]      Fin pour      Ecrire()# retour a la ligne       # afficher les adherents inactifs      Ecrire('La liste des adherents inactifs :')      Pour i de 0 à na-1 faire        Si liste_adherents.find(a[i])<0 alors          Ecrire(a[i])        Fin si      Fin pour  Fin | 
Déclaration des objets
| Objet | Type / Nature | 
|---|---|
| i | entier | 
| liste_commentaires | chaîne des caractères | 
| liste_adherents | 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 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 | from numpy import array a=array([str]*60) # declaration du tableau des noms des utilisateurs m=array([str]*60) # declaration du tableau des commentaires def saisie_taille_nom() :     n=int(input("donner un entier entre 6 et 50: "))     while(n<6) or (n>50) :       n=int(input("donner un entier entre 6 et 50: "))     return n def saisie_taille_commentaire() :     n=int(input("donner un entier entre 3 et 100: "))     while(n<3) or (n>100) :       n=int(input("donner un entier entre 3 et 100: "))     return n def verif_unicite(t,i):     j=0     while t[j]!=t[i] and j<i-1:         j=j+1     return t[j]!=t[i] def remplir_nom(t,n):     t[0]=input("donner nom N°0 commencant par une lettre majuscule et son longueur >=3: ")     ch=t[0]     while  ch[0]<'A' or ch[0]>'Z' or len(t[0])<3 :         t[0]=input("donner nom N°0 commencant par une lettre majuscule et son longueur >=3: ")         ch=t[0]     for i in range (1,n) :        t[i]=input("donner nom N°"+str(i)+" commencant par une lettre majuscule et son longueur >=3: ")        ch=t[i]        while  ch[0]<'A' or ch[0]>'Z' or len(t[i])<3 or verif_unicite(t,i)==False :          t[i]=input("donner nom N°"+str(i)+" commencant par une lettre majuscule et son longueur >=3: ")          ch=t[i] def remplir_commentaire(m,nm,na):     for i in range (nm) :        m[i]=input("donner commentaire N°"+str(i)+" sous forme Num#commentaire: ")        ch=m[i]        while  ch[0]<'0' or ch[0]>str(na) or ch[1]!='#' or len(m[i])<3:          m[i]=input("donner commentaire N°"+str(i)+" sous forme Num#commentaire: ")          ch=m[i] def afficher(a,na,m,nm):        liste_commentaires=''            liste_adherents=''        # afficher les commentaires et les adhérents qui les a envoye        for i in range(nm):                               ch2=m[i]              if liste_commentaires.find(ch2[2:len(ch2)])<0 : # Si le commentaire n'est pas deja affiche                 print()# retour a la ligne                 # afficher le commentaire et                  print('Le commentaire '+ch2[2:len(ch2)]+' est envoye par '+a[int(ch2[0])],end=', ')                    liste_commentaires=liste_commentaires+ch2[2:len(ch2)]              else: # Si le commentaire existe deja                 print(a[int(ch2[0])], end=', ') #ajouter uniquement le nom adherent              #ajouter le nom adherent actif a la liste              liste_adherents=liste_adherents+a[int(ch2[0])]        print()# retour a la ligne              # afficher les adherents inactifs        print('La liste des adherents inactifs :')        for i in range(na):            if liste_adherents.find(a[i])<0:                print(a[i]) #programme principal na=saisie_taille_nom() remplir_nom(a,na) nm=saisie_taille_commentaire() remplir_commentaire(m,nm,na) afficher(a,na,m,nm) | 
Exécution du programme

Pour créer une application en Python et Designer QT qui affiche la liste des adhérents qui ont envoyé un même commentaire donné et les adhérents inactifs, 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é 'ch1' pour entrer les nom des adhérents.
QLineEdit nommé 'ch2' pour entrer les commentaires.
QPushButton nommé 'remplirta_bt' pour mettre les nom des adhérents dans le tableau A.
QPushButton nommé 'remplirtm_bt' pour mettre les commentaires dans le tableau M.
QPushButton nommé 'afficher_bt' pour rechercher les adhérents ayant envoyé le commentaire donné et la liste des adhérents inactifs
QLabel nommé 'msg' pour afficher des messages d'erreur.
QLabel nommé 'tabta_label' pour afficher les noms des adhérents du tableau a.
QLabel nommé 'tabtm_label' pour afficher les commentaires du tableau m.
QLabel nommé 'resultat' pour afficher les adhérents ayant envoyé le commentaire donné et la liste des adhérents inactifs.

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 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 158 159 160 161 162 163 164 165 | from PyQt5.uic import loadUi from PyQt5 import QtCore, QtGui from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui, QtWidgets from numpy import array a=array([str]*30) # declaration du tableau des noms des utilisateurs m=array([str]*30) # declaration du tableau des commentaires 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 t[j]!=t[i] and j<i-1:         j=j+1     return t[j]!=t[i] # Procedure qui remplit un tableau des adherents a partir d'une chaine des caractères    def createTabA():     windows.tabta_label.clear()     windows.msg.clear()      global na #pour la taile du tableau a des utilisateurs     ch = windows.ch1.text()     verif=True     verif_majus=True     if ch=="":             windows.msg.setText("Veuillez remplir la chaîne")     else:             windows.msg.clear() # effacer le message d erreur       ch= supprimer_espaces(ch)       i=-1       j=0               ch1=''         # parcourir les caracteres de la chaine CH1       while(i<len(ch)-1) and (verif) and (verif_majus):             i=i+1             if  (ch[i]!=' '):                ch1=ch1+ch[i]             if ((ch[i]==' ') or (i==len(ch)-1)) :                 # remplir le tableau t2 par des chansons                 a[j]=ch1                                if ch1[0]<'A' or ch1[0] >'Z':                   verif_majus=False                   if j>0:                   verif=verif_unicite(a,j)                 ch1=''                 j=j+1       if (i==len(ch)-1) and (verif) and (verif_majus) :         if 1<=j<=50:                          na=j              tab=''              for k in range (j) :                 tab=tab+ 'a['+str(k)+']= '+a[k]+ '\n'              #afficher les elements du tableau                windows.tabta_label.setText(tab)           else:                  windows.msg.setText("la taille du tableau a doit etre entre 5 et 50")       else:                  windows.msg.setText("les noms des adherents doit etre uniques et commencer par une lettres majuscule ") # Procedure qui remplit un tableau des commenatires a partir d'une chaine des caractères    def createTabM():     windows.tabtm_label.clear()     windows.msg.clear()      global nm #pour la taile du tableau a des utilisateurs     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=-1       j=0               ch1=''       verif_commentaire=True         # parcourir les caracteres de la chaine CH2       while(i<len(ch)-1) and (verif_commentaire):             i=i+1             if  (ch[i]!=' '):                ch1=ch1+ch[i]             if ((ch[i]==' ') or (i==len(ch)-1)) :                 # remplir le tableau t2 par des chansons                 verif_commentaire= (0<=int(ch1[0])<=na) and (ch1[1]=='#')                   m[j]=ch1                 ch1=''                 j=j+1       if (i==len(ch)-1) and (verif_commentaire):             if 2<=j<=100:                          nm=j              tab=''              for k in range (j) :                 tab=tab+ 'm['+str(k)+']= '+m[k]+ '\n'              #afficher les elements du tableau                windows.tabtm_label.setText(tab)           else:                  windows.msg.setText("la taille du tableau a doit etre entre 2 et 100")       else:                  windows.msg.setText("les commentaires doit etre par sous forme NumE#commentaire ") def afficher():        liste_commentaires=''            liste_adherents=''        liste=''        # afficher les commentaires et les adhérents qui les a envoye        for i in range(nm):                               ch2=m[i]              if liste_commentaires.find(ch2[2:len(ch2)])<0 : # Si le commentaire n'est pas deja affiche                 liste=liste+'\n'# retour a la ligne                   # afficher le commentaire et                  liste=liste+'Le commentaire '+ch2[2:len(ch2)]+' est envoye par '+a[int(ch2[0])]+', '                    liste_commentaires=liste_commentaires+ch2[2:len(ch2)]              else: # Si le commentaire existe deja                 liste=liste+a[int(ch2[0])]+', ' #ajouter uniquement le nom adherent              #ajouter le nom adherent actif a la liste              liste_adherents=liste_adherents+a[int(ch2[0])]        liste=liste+'\n'# retour a la ligne              # afficher les adherents inactifs        liste=liste+'La liste des adherents inactifs :\n'        for i in range(na):            if liste_adherents.find(a[i])<0:                liste=liste+a[i]+' '        windows.resultat.setText(liste) windows.remplirta_bt.clicked.connect ( createTabA ) windows.remplirtm_bt.clicked.connect ( createTabM ) windows.afficher_bt.clicked.connect ( afficher ) windows.show() app.exec_() | 
Exécution du programme
1) Remplissage du tableau A des adhérents

2) Remplissage du tableau M des commentaires

3) afficher les adhérents ayant envoyé le commentaire donné et la liste des adhérents inactifs

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