Un gérant d’une salle de sport veut récompenser les adhérents fidèles en leur offrant un bonus sous forme d’heures d’entraînement gratuites, calculé à partir de leurs numéros d’abonnement.
Le bonus est calculé en fonction de l’ancienneté de l’adhérent, exprimée en nombre de mois par rapport à la date du jour. En effet, une heure supplémentaire est offerte pour chaque mois d’ancienneté, sachant que le bonus ne sera pris en considération que si l’ancienneté dépasse 5 ans.
Un numéro d’abonnement est formé de 10 caractères dont le premier est une lettre majuscule indiquant la catégorie de l’adhérent (A : Adulte, J : Junior, E : Enfant) suivi de 9 chiffres répartis comme suit :
- Les 4 premiers chiffres représentent l’année d’adhésion qui doit être comprise entre 2000 et
- Les 2 suivants représentent le mois d’adhésion dont la valeur doit être comprise entre 1 et
- Les 3 derniers chiffres représentent le numéro d’adhésion qu’on suppose distinct pour tous les adhérents.
Exemple :
Pour le numéro d’abonnement E201403080, l’adhérent est un enfant dont l’année d’adhésion est 2014, le mois d’adhésion est 03 (mars) et son numéro d’adhésion est 080. Le bonus accordé à cet adhérent est de 62 heures. En effet, son ancienneté est égale à cinq ans et deux mois par rapport à la date d’aujourd’hui (28/05/2019), en nombre de mois elle est égale à 62 (12*5 + 2).
On se propose d’écrire un programme Pascal qui permet :
- de saisir un entier N représentant le nombre d’adhérents de cette salle (avec 5 ≤ N ≤ 30),
- de remplir un tableau TA par les N numéros d’abonnements de ces adhérents en respectant le format décrit précédemment,
- d’afficher les numéros d’abonnements des adhérents ayant une ancienneté supérieure à 5 ans ainsi que leurs bonus correspondants
Exécution du programme:
Dans cet algorithme, On va utiliser 4 fonctions et 2 procédures:
Algorithme du programme Principal
1 2 3 4 5 6 |
Algorithme bonus_adherents Debut n<-saisie_taille() remplir(ta,n) afficher_adherents_bonus(ta,n) Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
ta | tableau des chaînes des caractères |
n | entier |
La fonction saisie_taille
Cette fonction saisit la taille du tableau entre 5 et 30.
1 2 3 4 5 6 7 8 9 10 |
fonction saisie_taille():entier Début Ecrire("donner un entier entre 5 et 30 ")) Lire(n) Tant que (n<5) ou (n>30) faire Ecrire("donner un entier entre 5 et 30 ")) Lire(n) Fin tant que retourner n Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
n | entier |
La fonction verif_numero
Cette fonction vérifie la validité du numéro d’abonnement.
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 |
fonction verif_numero(ch:chaine):booleen Début i<-1 Tant que (i<5) et ('0'<=ch[i]<='9') faire i<-i+1 Fin tant que Si (i=5) alors Si (2000<=Valeur(Sous_chaine(ch,1,5))<=2024) alors # verifier la validite de l'annee Tant que (i<7) et ('0'<=ch[i]<='9') faire i<-i+1 Fin tant que Si (i=7) alors Si 1<=Valeur(Sous_chaine(ch,5,7))<=12 alors # verifier la validite du mois Tant que i<10 et ('0'<=ch[i]<='9') faire # verifier la validite des 3 derniers chiffres du numéro d’adhésion i<-i+1 Fin tant que retourner i==10 Sinon retourner Faux Fin si Sinon retourner Faux Fin sin Sinon retourner Faux Fin si Sinon retourner Faux Fin si Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
La fonction verif_unicite
Cette fonction vérifie l'unicité du numéro d’abonnement dans le tableau des adhérents.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
fonction verif_unicite(t:tab;i:entier):booleen Début j<-0 ch<-t[0] ch2<-t[i] #verifier que les trois derniers chiffres sont uniques Tant que j<i et Sous_chaine(ch,7,10)!= Sous_chaine(ch2,7,10) alors j<-j+1 ch<-t[j] Fin tant que Si j=i alors retourner Vrai Sinon retourner Faux Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
ch | chaîne des caractères |
ch2 | chaîne des caractères |
La procédure remplir
Cette procédure remplit un tableau TA par les N numéros d’abonnements de ces adhérents en respectant le format décrit précédemment.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
procedure remplir(@t:tab;n:entier) Début Ecrire("donner numero abonnement 0 de 10 caractere sous forme categorieanneemois3chiffres: ") Lire(t[0]) ch<-t[0] Tant que (long(ch)!=10) ou (ch[0] n'est pas dans {'A','J','E'}) ou (verif_numero(t[0])==Faux) faire Ecrire("donner numero abonnement 0 de 10 caractere sous forme categorieanneemois3chiffres: ") Lire(t[0]) ch<-t[0] Fin tant que Pour i de 1 à n-1 faire Ecrire("donner numero abonnement "+i+" unique de 10 caractere sous forme categorieanneemois3chiffres: ") Lire(t[i]) ch<-t[i] Tant que (long(ch)!=10) ou (ch[0] n'est pas dans {'A','J','E'}) ou (verif_numero(t[i])=Faux) ou verif_unicite_numero(t,i)==Faux faire Ecrire("donner numero abonnement "+i+" unique de 10 caractere sous forme categorieanneemois3chiffres: ") Lire(t[i]) ch<-t[i]] Fin tant que Fin pour Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
ch | chaine des caractères |
La fonction calcul_bonus
Cette fonction calcule le bonus accordé à un adhérent du tableau.
1 2 3 4 5 6 7 8 9 |
fonction calcul_bonus(ch:chaine):entier Début today <- Convch(date()) # lire la date du systeme Si Valeur(Sous_chaine(today,0,4))-Valeur(Sous_chaine(ch,1,5)) >= 5 alors # si l'anciennete de l'adherent est >=5 # calculer et retourner le bonus retourner (Valeur(Sous_chaine(today,0,4))-Valeur(Sous_chaine(ch,1,5))*12 + Valeur(Sous_chaine(today,5,7))-Valeur(Sous_chaine(ch,5,7)) Sinon retourner 0 Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
today | chaine des caractères |
La procédure afficher_adherents_bonus
Cette procédure affiche les numéros d’abonnements des adhérents ayant une ancienneté supérieure à 5 ans ainsi que leurs bonus correspondants.
1 2 3 4 5 6 7 8 |
procedure afficher_adherents_bonus(t:tab;n:entier) Début Pour i de 0 à n-1 faire Si calcul_bonus(t[i])>0 alors Ecrire ('numero abonnement= '+t[i]+' a un bonus= '+calcul_bonus(t[i])) Fin si Fin pour Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
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 |
from numpy import array from datetime import date ta=array([str]*40) # declaration du tableau des abonnements def saisie_taille(): n=int(input("donner un entier entre 5 et 30: ")) while (n<5) or (n>30): n=int(input("donner un entier entre 5 et 30: ")) return n def verif_numero(ch): i=1 while (i<5) and ('0'<=ch[i]<='9'): i=i+1 if (i==5): if (2000<=int(ch[1:5])<=2024): # verifier l'annee while (i<7) and ('0'<=ch[i]<='9'): i=i+1 if (i==7) : if 1<=int(ch[5:7])<=12: # verifier le mois while i<10 and ('0'<=ch[i]<='9') : i=i+1 return i==10 else: return False else: return False else: return False else: return False def verif_unicite_numero(t,i): j=0 ch=t[0] ch2=t[i] #verifier que les trois derniers chiffres sont uniques while j<i>= 5 : # si l'anciennete de l'adherent est >=5 # calculer et retourner le bonus return (int(today[0:4])-int(ch[1:5]))*12 + int(today[5:7])-int(ch[5:7]) else: return 0 def afficher_adherents_bonus(t,n): for i in range (n) : if calcul_bonus(t[i])>0: print ('numero abonnement= '+t[i]+' a un bonus= '+str(calcul_bonus(t[i])) ) #programme principal n=saisie_taille() remplir(ta,n) afficher_adherents_bonus(ta,n) </i> |
Pour créer une application en Python et Designer QT qui va saisir les noms des joueurs, calculer les scores des joueurs et afficher les meilleurs, 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 numéros d'abonnements
QPushButton
nommé 'remplir_bt' pour mettre les numéros d'abonnements dans le tableau TA.
QPushButton
nommé 'trier_bt' pour trier le tableau score dans un ordre croissant.
QPushButton
nommé 'afficher_bt' pour afficher les numéros d’abonnements des adhérents ayant une ancienneté supérieure à 5 ans ainsi que leurs bonus correspondants.
QLabel
nommé 'msg' pour afficher des messages d'erreur.
QLabel
nommé 'resultat' pour contenir les numéros d’abonnements des adhérents ayant une ancienneté supérieure à 5 ans ainsi que leurs bonus correspondants.
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 |
from PyQt5.uic import loadUi from PyQt5 import QtCore, QtGui from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui, QtWidgets from datetime import date from numpy import array ta=array([str]*40) # declaration du tableau des numeros des adherents 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_numero(ch): i=1 # verifier si la chaine est forme uniquement des majuscules while (i<5) and ('0'<=ch[i]<='9'): i=i+1 if (i==5): if (2000<=int(ch[1:5])<=2024): # verifier l'annee while (i<7) and ('0'<=ch[i]<='9'): i=i+1 if (i==7) : if 1<=int(ch[5:7])<=12: # verifier le mois while i<10 and ('0'<=ch[i]<='9') : i=i+1 return i==10 else: return False else: return False else: return False else: return False def verif_unicite_numero(t,i): j=0 ch=t[0] ch2=t[i] #verifier que les trois derniers chiffres sont uniques while j<i and ch[7:10]!=ch2[7:10]: j=j+1 ch=t[j] if j==i : return True else: return False # Procedure qui remplit un tableau a partir d'une chaine des caractères def createTabTA(): windows.tabta_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=-1 j=0 ch1='' test_numero=True test_unicite=True test_long=True test_categorie=True # parcourir les caracteres de la chaine CH while (i<len(ch)-1) and test_numero and test_unicite and test_categorie and test_long: i=i+1 if (ch[i]!=' '): ch1=ch1+ch[i] if ((ch[i]==' ') or (i==len(ch)-1)) : # remplir le tableau des numeros des adherents ta[j]=ch1 test_long=(len(ch1)==10) test_categorie=(ch1[0] in {'A','J','E'}) test_numero=verif_numero(ch1) if (j>=1): test_unicite=verif_unicite_numero(ta,j) ch1='' j=j+1 if (i==len(ch)-1) and test_numero and test_unicite and test_categorie and test_long: if 5<=j<=30: n=j # pour la taille des deux tableaux tab='' for k in range (j) : tab=tab+ 'ta['+str(k)+']= '+ta[k]+ '\n' #afficher les elements du tableau windows.tabta_label.setText(tab) else: windows.msg.setText("la taille du tableau doit etre entre 5 et 30") else: windows.msg.setText("donner numero abonnement unique de 10 caractere sous forme categorieanneemois3chiffres") def calcul_bonus(ch): today = str(date.today()) # lire la date du systeme if int(today[0:4])-int(ch[1:5]) >= 5 : # si l'anciennete de l'adherent est >=5 # calculer et retourner le bonus return (int(today[0:4])-int(ch[1:5]))*12 + int(today[5:7])-int(ch[5:7]) else: return 0 def afficher_adherents_bonus(): resultat='' for i in range (n) : if calcul_bonus(ta[i])>0: resultat=resultat+ 'numero abonnement= '+ta[i]+' a un bonus= '+str(calcul_bonus(ta[i]))+'\n' windows.resultat.setText(resultat) windows.remplir_bt.clicked.connect ( createTabTA ) windows.afficher_bt.clicked.connect ( afficher_adherents_bonus ) windows.show() app.exec_() |
Exécution du programme
1) Remplissage du tableau TA des numéros d'abonnements
2) Affichage des numéros d’abonnements des adhérents ayant une ancienneté supérieure à 5 ans ainsi que leurs bonus correspondants.
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