Ch. 00 · Leçon 1
Recueil d'exercices : tableaux, chaînes et sous-programmes
Ce que vous saurez faire
- →S'entraîner à la manipulation de tableaux et de chaînes de caractères
- →Concevoir des solutions modulaires avec fonctions et procédures
- →Distinguer les contextes d'appel d'une fonction et d'une procédure
- →Réviser les notions du programme via un devoir de synthèse
id: 33-1344-recueil-exercices-tableaux-sous-programmes slug: 33-1344-recueil-exercices-tableaux-sous-programmes titre: 'Recueil d''exercices : tableaux, chaînes et sous-programmes' chapitre: 0 chapitre_titre: Séries d'exercices et devoirs lecon: 1 niveau: 4eme-sci ordre: 100 prerequis: [] duree_estimee_min: 180 mots_cles:
- tableaux
- chaines
- sous-programmes
- fonctions
- procedures
- algorithmique
- exercices
- devoir langages:
- analyse
- python objectifs:
- S'entraîner à la manipulation de tableaux et de chaînes de caractères
- Concevoir des solutions modulaires avec fonctions et procédures
- Distinguer les contextes d'appel d'une fonction et d'une procédure
- Réviser les notions du programme via un devoir de synthèse status: published source_pdf: 33_1344.pdf source_pages:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12 kind: exercices
Ce recueil regroupe plusieurs séries d'exercices, un devoir de synthèse et un sujet de travaux pratiques portant sur les tableaux, les chaînes de caractères et les sous-programmes (fonctions et procédures).
Série d'exercices N°1
Exercice 1 — Somme des nombres extraits de chaînes
Écrire un algorithme permettant de :
- Remplir un tableau T par n chaînes non vides et dont la taille maximale est 6 caractères, avec 2 ≤ n ≤ 15.
- Calculer et afficher la somme des nombres extraits des chaînes de chaque élément du tableau T.
Le nombre extrait de la chaîne contenue dans la case i de T est formé par la concaténation de tous les chiffres de la chaîne parcourue de gauche à droite.
Exemple : Si n = 5 et que le tableau T contient :
| R2*s3 | 1lhj5 | 3?0e | Ak!r | EY21 |
|---|
Alors la somme S = 23 + 15 + 30 + 0 + 21 = 89. Le programme affichera la valeur de S.
Exercice 2 — Cryptage d'une phrase
On se propose de crypter une phrase composée par des lettres majuscules et des espaces en utilisant le principe de cryptage suivant :
- L'espace ne sera pas crypté.
- Choisir aléatoirement deux entiers p et q avec 2 ≤ p ≤ 10 et 2 ≤ q ≤ 10.
- Chaque lettre d'ordre alphabétique i sera remplacée par la lettre d'ordre alphabétique j avec :
j = (p*i + q) Mod 26 + 1
Exemple : Pour la phrase ph = "ON VA REUSSIR AU BAC", si p = 3 et q = 4, la phrase cryptée est "XU SH GTPJJEG HP QHN".
En effet, la lettre "O" est d'ordre alphabétique i = 15, elle sera remplacée par la lettre d'ordre alphabétique j = (3*15 + 4) Mod 26 = 24, qui est la lettre "X".
Écrire l'algorithme intitulé Codage qui permet de saisir une phrase, choisir p et q et afficher son code selon le principe décrit précédemment.
Exercice 3 — Nombres abondants et déficients
Écrire un algorithme qui permet de saisir un entier positif et d'afficher s'il est abondant ou déficient.
Exemple : 12 est abondant. En effet, les diviseurs de 12 sauf lui-même sont 1, 2, 3, 4 et 6. Comme 1 + 2 + 3 + 4 + 6 = 16 et 12 < 16, alors 12 est dit abondant.
Exemple : 10 est déficient. En effet, les diviseurs de 10 sauf lui-même sont 1, 2 et 5. Comme 1 + 2 + 5 = 8 et 10 > 8, alors 10 est dit déficient.
Exercice 4 — Tautogramme
Exemple : la chaîne "Le lion lape le lait lentement" est un tautogramme.
Écrire un algorithme permettant de saisir une chaîne de caractères composée uniquement de lettres et d'espaces (on suppose que deux mots consécutifs sont séparés par un seul espace) puis afficher un message indiquant si cette chaîne est tautogramme ou non.
Exercice 5 — Nombres premiers factoriels
Exemples :
- 7 est un nombre premier factoriel car 7 est un nombre premier et il s'écrit sous la forme 3! + 1.
- 719 est un nombre premier factoriel car 719 est premier et il s'écrit sous la forme 6! - 1.
On se propose d'écrire un programme permettant de remplir un tableau T par N entiers positifs (avec 2 ≤ N ≤ 10) et d'afficher tous les nombres premiers factoriels.
Série d'exercices N°2
Exercice 1 — Validité d'appels de sous-programmes
Pour chacune des propositions suivantes, mettre V (vrai) si la réponse est correcte et F (faux) dans le cas contraire.
Procédure P(N : entier ; @T : tab)
| Appel | V/F |
|---|---|
Ecrire(P(N, T)) | ? |
P(N, T) | ? |
P(N : Entier ; @T : Tab) | ? |
X ← P(N, T) | ? |
Fonction F(x : entier ; y : réel ; ch : chaîne) : booléen
| Appel | V/F |
|---|---|
Ecrire(F(3, "DS1", 2)) | ? |
F(20, 3.75, "Bon")) | ? |
Ecrire(F(50.75, 12.50, "")) | ? |
Si F(10, 20, "F") alors Ecrire("OK") | ? |
Voir le corrigé
Procédure P(N : entier ; @T : tab) — une procédure ne fait pas partie d'une expression :
Ecrire(P(N, T))❌ une procédure ne peut pas être utilisée dans une expressionP(N, T)✓P(N : Entier ; @T : Tab)❌ c'est l'entête, pas un appelX ← P(N, T)❌ une procédure ne retourne pas de valeur
Fonction F(x : entier ; y : réel ; ch : chaîne) : booléen — une fonction peut être insérée dans une expression :
Ecrire(F(3, "DS1", 2))❌ le 3ᵉ paramètre doit être une chaîne, pas un entierF(20, 3.75, "Bon"))❌ une fonction ne peut pas être appelée seule (sa valeur doit être utilisée)Ecrire(F(50.75, 12.50, ""))❌ le 1ᵉʳ paramètre doit être un entierSi F(10, 20, "F") alors Ecrire("OK")✓ (l'entier 20 sera converti en réel)
Exercice 2 — Rôle de fonctions
Soient les fonctions suivantes :
Fonction F1(a, b : entier) : entier
Début
R ← 0
Pour i de 1 à b faire
R ← R + a
Fin pour
Retourner R
Fin
Fonction F2(a, b : entier) : entier
Début
R ← 1
Pour i de 1 à b faire
R ← R * a
Fin pour
Retourner R
Fin
Fonction F3(a, b : entier) : entier
Début
P ← 0
Pour i de a à b faire
P ← P + i
Fin pour
Retourner P
Fin
Fonction F4(a, b : entier) : entier
Début
Répéter
Si a > b alors a ← a - b
Sinon b ← b - a
FinSi
Jusqu'à a = b
Retourner a
Fin
Fonction F5(a, b : entier) : entier
Début
Répéter
Si a > b alors a ← a mod b
Sinon b ← b mod a
FinSi
Jusqu'à a*b = 0
Si a = 0 alors R ← b
Sinon R ← a
FinSi
Retourner R
Fin
Valider chacune des propositions suivantes en mettant V si elle est correcte ou F si elle est fausse.
a. Pour calculer le produit de a par b, on peut faire appel à la fonction : F1, F2, F3, F4, F5
b. Pour calculer aᵇ, on peut faire appel à : F1, F2, F3, F4, F5
c. Pour calculer le PGCD des entiers a et b, on peut faire appel à : F1, F2, F3, F4, F5
d. Pour calculer la somme des entiers de l'intervalle [a, b], on peut faire appel à : F1, F2, F3, F4, F5
Voir le corrigé
- F1 calcule
a × b(somme de b fois a). - F2 calcule
a^b(produit de b fois a). - F3 calcule la somme des entiers de l'intervalle [a, b].
- F4 calcule le PGCD par soustractions successives.
- F5 calcule le PGCD par divisions (modulo) successives.
| Question | F1 | F2 | F3 | F4 | F5 |
|---|---|---|---|---|---|
| a. Produit de a par b | V | F | F | F | F |
| b. aᵇ | F | V | F | F | F |
| c. PGCD de a et b | F | F | F | V | V |
| d. Somme des entiers de [a, b] | F | F | V | F | F |
Problème — Gestion des discussions d'un groupe
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érant est qualifié inactif s'il n'a envoyé aucun commentaire.
Travail demandé : écrire un algorithme qui permet de :
- Remplir un tableau A par les noms d'utilisateurs de Na adhérents du groupe avec 5 < 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.
- Remplir un tableau M par 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 cet émetteur.
- 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 :
| Indice | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| A | Olfa | Hichem_2018 | Mohamed | Amir@ | Salah20 |
| Indice | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| M | 2#Help me | 3#Help | 0#Mes salutations | 2#cours info | 2#Algo | 0#OK | 3#Help |
Pour cet exemple, M[2] signifie :
- Indice dans le tableau A de l'émetteur du commentaire : 0
- Texte du commentaire : Mes salutations
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 : Hichem_2018
Salah20
Devoir de synthèse N°1
Lycée Pilote 15 octobre 1963 Bizerte — Matière : informatique — Date : 07/12/2021 — Durée : 1h30
Exercice 1 (6 points)
A. Valider chacune des propositions ci-dessous en mettant V si vrai ou F dans le cas contraire :
-
L'instruction qui permet d'affecter à une variable X une valeur aléatoire de l'intervalle [2, 10] est :
X ← 2 + aléa(0, 8)X ← 2 + aléa(0, 9)X ← aléa(2, 10)
-
Une structure de données tableau peut :
- Contenir des éléments de types différents
- Être déclarée avec une taille maximale variable
- Avoir des indices de cases de type scalaire
-
Une fonction est :
- Un sous-programme qui peut rendre un seul résultat
- Un sous-programme qui doit rendre un seul résultat
- Un cas particulier d'une procédure
B. Afin de réaliser les tâches décrites dans la première colonne du tableau suivant, un élève fournit les propositions ci-dessous. Remplir la colonne « correction » en apportant les corrections nécessaires pour que ces propositions soient les plus adéquates relativement au choix de la structure itérative.
| Tâche | Proposition |
|---|---|
| Saisir un entier positif n | Ecrire(" n = ") Lire(n) Tant que (n<0) faire Ecrire(" n = ") Lire(n) Fintantque |
| Chercher la taille maximale dans un tableau T de taille n | I←0, max ← T[0] Répéter Si T[i]> max alors Max ← T[i] Finsi i←i+1 jusqu'à (i>n-1) |
| Vérifier l'existence d'une chaîne de caractère Ch dans un tableau T de n chaînes | Trouve←faux Pour i de 0 à n-1 faire Si T[i]=ch alors Trouve ← vrai Finsi Finpour |
Voir le corrigé
A.
X ← 2 + aléa(0, 8)✓ ;X ← 2 + aléa(0, 9)❌ ;X ← aléa(2, 10)✓- Tableau : éléments de types différents ❌ ; taille maximale variable ❌ ; indices scalaires ✓
- Une fonction « peut » rendre un seul résultat ❌ ; « doit » rendre un seul résultat ✓ ; cas particulier d'une procédure ✓
B. Corrections (passage à une structure plus adéquate) :
| Tâche | Correction |
|---|---|
| Saisir un entier positif n | Répéter Ecrire("Saisir n :") Lire(n) Jusqu'à n ≥ 0 |
| Max d'un tableau | I ← 1 Max ← T[0] Pour i de 1 à n-1 faire Si T[i] > max alors max ← T[i] Finsi Fin pour |
| Existence d'une chaîne | Trouve ← faux i ← 0 Tant que (T[i] ≠ ch) et (i < n) faire i ← i + 1 Fin tant que puis Trouve ← (i < n) |
Exercice 2 (6 points)
Soit MAT et SCO, deux tableaux contenant respectivement les matricules (la matricule est une chaîne numérique de longueur 6) et les scores (un score est un entier de l'intervalle [20..120]) de N (4 ≤ N ≤ 18) employés qui ont participé à un concours sur dossier pour le passage d'un grade.
On se propose d'écrire l'algorithme d'un programme permettant d'afficher les matricules ayant réussi dans ce concours. Pour cela on procède de la manière suivante :
- On calcule la moyenne des scores moysc.
- Une matricule gagnante est celle ayant un score ≥ moysc.
Exemple : Pour N = 4 :
| MAT | 001254 | 112547 | 993258 | 770055 |
|---|---|---|---|---|
| SCO | 38 | 112 | 99 | 25 |
Le programme affichera :
La moysc dans ce concours est égale à 68.5
La liste des employés qui ont réussi dans ce concours est :
L'employé 112547 avec un score égal à 112.
L'employé 993258 avec un score égal à 99.
Algorithme du programme principal :
0) Début grade
1) N ← saisie_N
2) Remplirmat(MAT, N)
3) Remplirscore(SCO, N)
4) S ← calcul_moysc(SCO, N)
5) Affiche(MAT, SCO, N, moysc)
6) Fin grade
Travail demandé :
- Compléter les déclarations nécessaires pour le programme principal.
- Développer le module Remplirmat qui permet de remplir un tableau MAT par N matricules en respectant les contraintes décrites ci-dessus.
- Développer le module Remplirscore qui permet de remplir un tableau SCO par N scores en respectant les contraintes décrites ci-dessus.
- Développer le module calcul_moysc qui permet de calculer la moysc de ce concours.
- Développer le module Affiche qui permet d'afficher la moyenne des scores ainsi que la liste des matricules gagnantes.
Exercice 3 (10 points) — IMEI et formule de Luhn
L'IMEI (International Mobile Equipment Identity) est un numéro composé de 15 chiffres. Ce numéro permet à un opérateur de réseau GSM d'identifier le mobile appelant et ainsi de l'autoriser ou non à se connecter.
Un numéro est dit un IMEI s'il vérifie la formule de LUHN décrite ci-dessous :
- Calculer la somme S des chiffres du numéro en appliquant le principe suivant :
- Doubler les valeurs des chiffres de rang impair.
- Si le double est supérieur ou égal à 10, alors il sera remplacé par la somme de ses chiffres.
- Si la somme est un multiple de 10, alors le nombre est en accord avec la formule LUHN et dans ce cas il est valide, sinon il est dit invalide.
Exemples :
-
Le nombre 354365039281174 est un IMEI, car en appliquant la formule LUHN on obtient 60 qui est un multiple de 10.
Étape 1 : 3 5*2 4 3*2 6 5*2 0 3*2 9 2*2 8 1*2 1 7*2 4 Étape 2 : 3 10 4 6 6 10 0 6 9 4 8 2 1 14 4 Étape 3 : 3 1+0 4 6 6 1+0 0 6 9 4 8 2 1 1+4 4 Étape 5 : S = 3+1+4+6+6+1+0+6+9+4+8+2+1+5+4 = 60 -
100000000001111 n'est pas un IMEI car en appliquant la formule LUHN on obtient 7 qui n'est pas un multiple de 10.
Travail demandé : On se propose d'écrire une solution modulaire d'un programme qui permet de déterminer et d'afficher si un numéro de 15 chiffres (chaîne de caractères) donné est un IMEI ou non en appliquant la formule LUHN.
Travaux pratiques N°1 — Planning des Scouts Tunisiens
L'Association SCOUTS TUNISIENS (الكشافة التونسية) est une organisation de jeunesse. Elle procure aux jeunes des deux sexes une éducation globale et les prépare à entrer dans la vie sociale suivant la méthode scoute mondiale qui correspond avec la réalité tunisienne.
Cet organisme organise durant l'année plusieurs activités et évènements. Afin d'encourager le travail bénévole, on veut concevoir et produire un programme qui facilite et organise ces activités.
Donc l'agent chargé du planning annuel dans l'association :
- Saisit les évènements et les activités qui vont être réalisés durant l'année.
- Entre une date, le programme affiche les évènements et les activités pour cette date.
Écrire un programme Python qui permet de :
- Remplir un tableau par n évènements (3 ≤ n ≤ 30) où chaque évènement est saisi sous la forme suivante :
nom événement-jour/mois. Un évènement est valide :- s'il contient les caractères
"-"et"/", - 1 ≤ jour ≤ 31 et 1 ≤ mois ≤ 12,
- Nom événement est une chaîne de lettres et peut contenir des espaces.
- s'il contient les caractères
- Saisir une date sous la forme J/M et afficher tous les évènements de cette date.
Exemple : Si N = 5 :
| Aid revolution -14/1 | Discovering-7/3 | Campagne Nettoyage-12/4 | Visite Sahara-17/5 | Campagne vaccin-12/4 |
|---|
Si la date saisie est 12/4, le programme affichera :
Les activités pour le 12/4 :
Compagne Nettoyage
Campagne vaccin
Série 3 — Les sous-programmes
Exercice 1 — Fonction mystère
Soit la fonction suivante :
Fonction Anonyme(X, Y : Entier) : Entier
Début
S ← 0
Tant que Y ≠ 0 Faire
Si Y Mod 2 ≠ 0 Alors S ← S + X Fin si
X ← X * 2
Y ← Y Div 2
Fin Tant que
Retourner S
Fin
- Exécuter la fonction pour les valeurs suivantes de x et y :
- a. x = 10 et y = 2
- b. x = 6 et y = 6
- Quel est le rôle de cette fonction ?
Voir le corrigé
a. x = 10, y = 2 :
| N° | Instruction | X | Y | S |
|---|---|---|---|---|
| 01 | ··· | ? | ? | ? |
| 02 | ··· | ? | ? | ? |
| 03 | ··· | ? | ? | ? |
| 04 | ··· | ? | ? | ? |
b. x = 6, y = 6 :
| N° | Instruction | X | Y | S |
|---|---|---|---|---|
| 01 | ··· | ? | ? | ? |
| 02 | ··· | ? | ? | ? |
| 03 | ··· | ? | ? | ? |
| 04 | ··· | ? | ? | ? |
| 05 | ··· | ? | ? | ? |
Rôle : la fonction calcule le produit X × Y par la méthode dite de la multiplication russe (ou multiplication paysanne).
Exercice 2 — Procédure Somcar
Soient les algorithmes suivants :
Début
X ← 6
y ← 5
z ← 0
Somcar(x, y, z)
Ecrire(x, y, z)
Fin
Procédure Somcar(x1, x2, s : entier)
Début
X1 ← x1 * x2
X2 ← x2 * x2
S ← x1 + x2
Fin
- Trouver le résultat fourni par l'algorithme ci-dessus.
- Que faut-il ajouter à la procédure Somcar pour avoir un résultat correct ?
- Remplacer dans ce programme la procédure par une fonction.
Voir le corrigé
-
Les paramètres
x1,x2,ssont passés par valeur : aucune modification n'est répercutée surx,y,z. Le programme affiche donc6 5 0. -
Il faut passer les paramètres par variable (utiliser
@) pour ceux qui doivent être modifiés. Si l'on souhaite seulement récupérer la somme des carrés, seulsdoit être passé par variable. De plus, l'algorithme calcule mal la somme des carrés (il devrait êtreS ← x1*x1 + x2*x2).
Procédure Somcar(x1, x2 : entier ; @s : entier)
Début
s ← x1*x1 + x2*x2
Fin
- Version fonction :
Fonction Somcar(x1, x2 : entier) : entier
Début
Retourner x1*x1 + x2*x2
Fin
Appel : z ← Somcar(x, y).
Exercice 3 — Sous-programmes de saisie et de remplissage
- Écrire l'algorithme d'un sous-programme qui permet de saisir un entier premier.
- Écrire l'algorithme d'un sous-programme qui permet de saisir une chaîne de caractères majuscules.
- Écrire l'algorithme d'un sous-programme qui permet de saisir une chaîne de caractères numérique.
- Écrire l'algorithme d'un sous-programme qui permet de remplir un tableau par 10 entiers distincts deux à deux.
- Écrire l'algorithme d'un sous-programme qui permet de remplir un tableau par 10 entiers distincts.
- Écrire l'algorithme d'un sous-programme qui permet de remplir un tableau par 10 entiers triés dans l'ordre croissant.
Exercice 4 — Entiers impairs et palindromes
Écrire un programme qui cherche et affiche les n premiers entiers naturels positifs impairs et palindromes (n étant un entier naturel tel que 5 < n < 20).
Exemple : 121 est un entier impair et palindrome.
Exercice 5 — Caractères distincts d'une phrase
PHRASE est une chaîne comportant un minimum de 5 caractères. On se propose d'écrire un programme qui saisit Phrase puis affiche sans répétition :
- les caractères de PHRASE qui sont des lettres (minuscules ou majuscules, accentués ou non)
- les autres caractères de PHRASE (chiffres, ponctuation, etc.)
Exercice 6 — Nombres amis
Écrire un programme permettant de déterminer et d'afficher tous les nombres amis compris entre 1 et 1000.
Exercice 7 — Fusion de deux tableaux triés
On se propose d'écrire un programme permettant de remplir deux tableaux V1 et V2 respectivement par N et M entiers (avec N et M deux entiers de l'intervalle [2..20] et les éléments de V1 et V2 sont saisis dans un ordre strictement croissant), puis de fusionner les éléments de ces deux tableaux dans un tableau V3 en éliminant les redondances et en gardant l'ordre croissant des éléments. Enfin, le programme affichera les éléments du tableau V3.
Exemple : Si N = 5, M = 7 :
| V1 | 4 | 7 | 8 | 9 | 12 |
|---|
| V2 | 0 | 2 | 4 | 7 | 10 | 12 | 28 |
|---|
Alors le tableau V3 contiendra :
| V3 | 0 | 2 | 4 | 7 | 8 | 9 | 10 | 12 | 28 |
|---|
Exercice 8 — Nombres premiers jumeaux
Par exemple, 3 et 5 sont jumeaux ainsi que 41 et 43.
Écrire un programme qui cherche et affiche tous les nombres premiers jumeaux consécutifs ≤ à 400.
Exemple 2 — Saisir, remplir et afficher un tableau
Objectif : Remplir puis afficher un tableau t par n entiers donnés avec 5 ≤ n ≤ 10.
Procédure Saisir (@ n : entier)
Début
Répéter
Ecrire ("Taille du tableau : ")
Lire (n)
Jusqu'à n ∈ [5..10]
Fin
Procédure Remplir (@t : tab, n : entier)
Début
Pour i de 0 à n-1 faire
Ecrire ("T[", i, "] = ")
Lire (t[i])
FinPour
Fin
Procédure Afficher (t : tab, n : entier)
Début
Pour i de 0 à n-1 faire
Ecrire (t[i])
FinPour
Fin
# Algorithme du programme principal
ALGORITHME Exemple_Tableau
DÉBUT
Saisir (n)
Remplir (t, n)
Afficher (t, n)
FIN
T.D.O.G
| Objet | Type/Nature |
|---|---|
| n | entier |
| t | tab |
| Saisir | Procédure |
| Remplir | Procédure |
| Afficher | Procédure |
T.D.N.T
| Type |
|---|
| Tab = tableau de 10 entier |
Procédure Saisir (@ n : entier)
Début
Répéter
Ecrire ("Taille du tableau : ")
Lire (n)
Jusqu'à n ∈ [5..10]
Fin
Procédure Remplir (@t : tab, n : entier)
Début
Pour i de 0 à n-1 faire
Ecrire ("T[", i, "] = ")
Lire (t[i])
FinPour
Fin
Procédure Afficher (t : tab, n : entier)
Début
Pour i de 0 à n-1 faire
Ecrire (t[i])
FinPour
Fin
# Algorithme du programme principal
ALGORITHME Exemple_Tableau
DÉBUT
Saisir (n)
Remplir (t, n)
Afficher (t, n)
FIN
T.D.O.G
| Objet | Type/Nature |
|---|---|
| n | entier |
| t | tab |
| Saisir | Procédure |
| Remplir | Procédure |
| Afficher | Procédure |
T.D.N.T
| Type |
|---|
| Tab = tableau de 10 entier |
from numpy import array
# la procédure saisir qui permet de saisir
# la taille du tableau t
def Saisir():
global n
n = int(input("Taille du tableau : "))
while not(n in range(5, 11)):
n = int(input("Taille du tableau : "))
# la procédure remplir qui permet de remplir
# le tableau t
def Remplir(n):
global t
t = array([int()] * n)
for i in range(n):
t[i] = int(input("T[" + str(i) + "] = "))
# la procédure afficher qui permet d'afficher
# les éléments du tableau t
def Afficher(t, n):
for i in range(n):
print(t[i], " ")
# Programme principal
Saisir()
Remplir(n)
Afficher(t, n)
Application 1 — Divisibilité par 13
Pour vérifier si un nombre est divisible par 13, il suffit de :
- Éliminer le chiffre des unités et ajouter son quadruple (4 fois) au nombre restant.
- Répéter cette transformation jusqu'à obtenir un résultat strictement inférieur à 52.
- Le nombre de départ est divisible par 13 si et seulement si le résultat final est 13, 26 ou 39.
Écrire un algorithme puis sa traduction en Python qui permet de :
- saisir un tableau de
Nentiers supérieurs à 20 dans un ordre croissant (3 ≤ N ≤ 20). - déterminer les nombres du tableau qui sont divisibles par 13 en utilisant le principe ci-dessus et les afficher par ordre décroissant.
Exemple : pour N = 6, le tableau T peut contenir :
| 52 | 312 | 459 | 1664 | 4165 | 41503 |
|---|
Le programme affichera :
1664
312
52
Explications :
- 312 est divisible par 13 car 31 + (4×2) = 39, qui est divisible par 13.
- 1664 est divisible par 13 car 166 + (4×4) = 182 et 18 + (4×2) = 26, qui est divisible par 13.
- 41503 n'est pas divisible par 13 car 4150 + (4×3) = 4162, puis 416 + (4×2) = 424, puis 42 + (4×4) = 58, puis 5 + (4×8) = 37, qui n'est pas divisible par 13.
Travaux pratiques N°2 — Génération d'un mot de passe à partir d'une adresse e-mail
Important :
- Une solution modulaire au problème est exigée.
- Enregistrer au fur et à mesure votre programme dans le dossier
bac2022se trouvant sur la racineC:\en lui donnant comme nom votre nom.
Pour envoyer et recevoir des messages électroniques via Internet, chaque utilisateur doit avoir un compte de messagerie caractérisé par une adresse e-mail ayant la forme suivante :
Nom_utilisateur@domaine.suffixe
Dans une adresse e-mail valide, les conditions suivantes sont respectées :
- Le nom d'utilisateur est formé par des caractères alphanumériques, commence obligatoirement par une lettre, et peut contenir les caractères spéciaux suivants : l'underscore
_, le tiret-. - Le caractère
@doit figurer une seule fois juste après le nom d'utilisateur. domaineetsuffixesont deux chaînes de lettres.
Travail demandé :
Écrire un programme Python qui permet de saisir une adresse e-mail qui remplit les conditions précédentes, puis de générer et d'afficher le mot de passe qui lui correspond en respectant la règle suivante.
Si la longueur du nom d'utilisateur est paire, on ajoute au nom d'utilisateur :
- une lettre aléatoire du nom du domaine,
- la dernière lettre du suffixe,
- la longueur du domaine.
Si la longueur du nom d'utilisateur est impaire, on ajoute au nom d'utilisateur :
- la première lettre du nom du domaine,
- la première lettre du suffixe,
- la longueur du domaine multipliée par la longueur du suffixe.
Exemple : si l'utilisateur saisit Anas_Fehri@Gmail.com, le programme affichera :
Le mot de passe correspondant est : Anas_Fehriam5
où Anas_Fehri est le nom d'utilisateur, a une lettre aléatoire du domaine (Gmail), m la dernière lettre du suffixe (com), et 5 la longueur du domaine.
Voir le corrigé
Proposition de correction Python (modulaire) :
from random import randint
# ------ fonction lettre : chaine de lettres -------
def lettre(ch):
i = 0
while i < len(ch) and "A" <= ch[i].upper() <= "Z":
i = i + 1
return (i == len(ch))
# --- fonction verif : chaine alphanumérique pouvant contenir "-" et "_" ---
def verif(ch):
i = 0
while i < len(ch) and (("A" <= ch[i].upper() <= "Z")
or ("0" <= ch[i] <= "9")
or (ch[i] == "-")
or (ch[i] == "_")):
i = i + 1
return (i == len(ch))
# --- fonction valide : premier caractère est une lettre / @ existe 1 fois ---
def valide(ch):
p = ch.find("@")
test = "A" <= ch[0].upper() <= "Z" and (p != 0) and (p != -1)
if test:
ch = ch[:p] + ch[p+1:len(ch)]
if ch.find("@") != -1:
test = False
return test
# --- fonction saisie : saisir l'adresse e-mail ---
def saisie():
ch = input("saisie votre adresse email: ")
p1 = ch.find("@"); p2 = ch.find(".")
while (not verif(ch[:p1])
or not valide(ch)
or not lettre(ch[p1+1:p2])
or not lettre(ch[p2+1:len(ch)])):
ch = input("saisie votre adresse email: ")
p1 = ch.find("@"); p2 = ch.find(".")
return ch
# --- fonction mot_passe : générer le mot de passe ---
def mot_passe(ch):
p1 = ch.find("@"); p2 = ch.find(".")
nu = ch[:p1]
d = ch[p1+1:p2]
s = ch[p2+1:len(ch)]
if len(nu) % 2 == 0:
mp = nu + d[randint(0, len(d)-1)] + ch[len(ch)-1] + str(len(d))
else:
mp = nu + d[0] + s[0] + str(len(d) * len(s))
return mp
# programme principal
ch = saisie()
print(mot_passe(ch))
Sujet d'épreuve pratique — Société Commerciale (Jeu de chance)
Dans le cadre d'une campagne publicitaire, une société commerciale a décidé d'organiser chaque semaine un jeu de chance pour ses clients.
Le principe du jeu consiste à calculer le nombre de chance à partir du numéro de téléphone du client donné et d'afficher le message "Félicitations, vous avez gagné." dans le cas où ce nombre est premier, ou "Désolé, vous n'avez pas gagné." dans le cas contraire.
Sachant que :
- Le numéro de téléphone devrait commencer par 2, 4, 5 ou 9.
- Le nombre de chance est la somme de chaque chiffre du numéro de téléphone multiplié par son indice (l'indice du premier chiffre est 0).
- Un nombre premier est un nombre divisible uniquement par 1 et par lui-même.
Exemple : pour le numéro 29234560, le programme affiche "Désolé, vous n'avez pas gagné." car le nombre de chance vaut 99, qui n'est pas premier :
99 = 2*0 + 9*1 + 2*2 + 3*3 + 4*4 + 5*5 + 6*6 + 0*7
Algorithme de la fonction Chance à exploiter :
Fonction Chance (Ch : Chaine) : Chaine
DEBUT
Si NON (Estnum(Ch) ET long(Ch) = 8 ET Ch[0] ∈ ["2","4","5","9"]) Alors
msg ← "Vérifier le numéro de téléphone !"
Sinon
msg ← "Désolé, vous n'avez pas gagné."
s ← 0
Pour i de 0 à long(Ch) - 1 Faire
s ← s + valeur(Ch[i]) * i
Fin Pour
Si premier(s) Alors
msg ← "Félicitation, vous avez gagné."
FinSi
FinSi
Retourner msg
FIN
Travail demandé :
- Concevoir une interface graphique (un label avec le nom de la société, un label demandant la saisie du numéro, une zone de saisie, un bouton Jouer, un label pour afficher un message) et l'enregistrer sous le nom
Interface_Jeu. - Implémenter en Python la fonction
Chancedans un programme nomméJeu0. - Développer une fonction
Premierpermettant de vérifier si un nombre passé en paramètre est premier ou non, puis l'enregistrer sous le nomJeu1. - Dans le programme
Jeu1, ajouter les instructions permettant :- d'appeler l'interface graphique
Interface_Jeuen exploitant l'annexe ci-dessous, - d'implémenter un module
Playqui s'exécute à la suite d'un clic sur le bouton Jouer, permettant de récupérer le numéro de téléphone saisi puis d'exploiter la fonctionChanceafin d'afficher le message retourné via un label de l'interface.
- d'appeler l'interface graphique
Annexe (intégration PyQt5) :
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
# ...
app = QApplication([])
windows = loadUi("Nom_Interface.ui")
windows.show()
windows.Nom_Bouton.clicked.connect(Nom_Module)
app.exec_()
Travaux pratiques N°3 — Olympiade d'informatique
Important :
- Une solution modulaire au problème est exigée.
- Enregistrer au fur et à mesure votre programme dans le dossier
bac2022se trouvant sur la racineC:\.
Le ministère de l'éducation organise une olympiade d'informatique à l'échelle nationale.
Pour générer un code pour chaque participant, on se propose d'écrire un programme intitulé Olympiade qui permet de :
- Remplir deux tableaux TN et TG respectivement par les noms et les gouvernorats d'origine des N participants avec 5 ≤ N ≤ 26. Un nom ne doit pas dépasser 15 lettres et celui du gouvernorat 10 lettres au maximum.
- Générer dans un troisième tableau TC un code pour chaque participant. Ce code est formé de 5 caractères :
- les trois premiers caractères représentent les trois premières lettres du gouvernorat du participant,
- les deux derniers caractères forment un nombre de 2 chiffres représentant le rang du participant par rapport aux autres participants du même gouvernorat.
- Afficher pour chaque participant son nom et son code.
Exemple : pour N = 9 et les tableaux suivants :
| TN | Rahma | Ayoub | Aya | Ali | Mohamed | Bilel | Meriem | Sana | Anis |
|---|---|---|---|---|---|---|---|---|---|
| indice | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| TG | Jendouba | Monastir | Béja | Jendouba | Tataouine | Jendouba | Monastir | Sfax | Sfax |
|---|---|---|---|---|---|---|---|---|---|
| indice | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Après génération, le tableau TC :
| TC | Jen01 | Mon01 | Béj01 | Jen02 | Tat01 | Jen03 | Mon02 | Sfa01 | Sfa02 |
|---|
Affichage attendu :
Rahma Jen01
Ayoub Mon01
Aya Béj01
Ali Jen02
Mohamed Tat01
Bilel Jen03
Meriem Mon02
Sana Sfa01
Anis Sfa02
Travaux pratiques N°4 — Génération de mots de passe (lettre A et O)
Important :
- Une solution modulaire au problème est exigée.
- Enregistrer au fur et à mesure votre programme dans le dossier
bac2022.
Pour générer automatiquement des mots de passe pour les utilisateurs d'une application informatique, on suit les étapes suivantes :
- On remplit un tableau T par les noms de N utilisateurs (avec 1 ≤ N ≤ 9), sachant qu'un nom d'utilisateur est formé de 20 lettres majuscules au maximum.
- On génère un tableau TM contenant les mots de passe des N utilisateurs. Un mot de passe est généré en apportant les modifications suivantes au nom de l'utilisateur :
- Remplacer toutes les occurrences de la lettre
"A"par le caractère"@". - Remplacer toutes les occurrences de la lettre
"O"par le caractère zéro"0". - Ajouter à la fin de la chaîne obtenue précédemment le nombre de voyelles contenues dans le nom de l'utilisateur. La chaîne résultante représente le mot de passe.
- Remplacer toutes les occurrences de la lettre
Exemple :
| T | RAOUF | ZERIEB | AZIZA | FATMA | RAYEN | NADIA |
|---|---|---|---|---|---|---|
| indice | 0 | 1 | 2 | 3 | 4 | 5 |
| TM | R@0UF3 | ZERIEB3 | @ZIZ@3 | F@TM@2 | R@YEN3 | N@DI@3 |
|---|
Écrire un programme Python permettant de remplir T et de générer automatiquement les mots de passe comme présenté ci-dessus, puis d'afficher les mots de passe pour chaque utilisateur.
Série — Les algorithmes de tri
Écrire un programme permettant de :
- Remplir un tableau T1 par les noms de N élèves (5 ≤ N ≤ 20). Le nom ne doit exister qu'une seule fois dans T1 et ne doit pas être une chaîne vide.
- Remplir un tableau T2 par les moyennes des élèves : à l'élève T1[i] correspond la moyenne T2[i]. Les moyennes doivent être comprises entre 0 et 20.
- Calculer le rang de chaque élève dans un tableau T3.
- Trier les trois tableaux par ordre croissant suivant le rang.
- Afficher le nom, la moyenne et le rang de chaque élève.
On se propose d'écrire un programme permettant de remplir deux tableaux V1 et V2 respectivement par N et M entiers (avec N et M deux entiers de l'intervalle [2..20], les éléments de V1 et V2 étant saisis dans un ordre strictement croissant), puis de fusionner les éléments de ces deux tableaux dans un tableau V3 en éliminant les redondances et en gardant l'ordre croissant des éléments. Enfin, le programme affichera les éléments du tableau V3.
Exemple : si N = 5, M = 7 et :
| V1 | 4 | 7 | 8 | 9 | 12 |
|---|
| V2 | 0 | 2 | 4 | 7 | 10 | 12 | 28 |
|---|
Alors V3 contiendra :
| V3 | 0 | 2 | 4 | 7 | 8 | 9 | 10 | 12 | 28 |
|---|
Soit un tableau T1 contenant n lettres majuscules (de A à Z), n étant un entier compris entre 5 et 20.
On désire trier en ordre croissant les éléments de T1 et les ranger dans un tableau T2 en utilisant le principe suivant :
- Chercher la lettre qui a le plus petit code ASCII dans T1.
- a) Ranger cette lettre dans T2.
b) Remplacer cette lettre par
"*"dans T1. - Répéter n fois les étapes 1 et 2.
Écrire un programme qui permet de :
- Saisir les éléments de T1.
- Trier les éléments de T1 et les ranger dans T2.
- Afficher les éléments de T2.
On se propose de ranger dans un tableau V les numéros des cartes d'identité nationale des N élèves d'un lycée. Deux élèves ne peuvent pas avoir un même numéro de carte d'identité nationale. Un numéro de carte d'identité est composé obligatoirement de huit chiffres.
Écrire un programme qui permet de saisir les numéros de cartes d'identité des N élèves du lycée, puis de les trier par ordre croissant et de les afficher.
On se propose de saisir N termes informatiques dans un tableau, avec 1 < N < 35, de trier ce tableau selon l'ordre alphabétique croissant, d'insérer un nouveau terme dans sa bonne place (sans fausser l'ordre du tableau) et d'afficher le tableau résultat.
Exemple : N = 5
T après lecture et avant le tri :
| CD-ROM | GRAVEUR | ADSL | DISQUETTE | FLASH-DISQUE |
|---|
T après le tri :
| ADSL | CD-ROM | DISQUETTE | FLASH-DISQUE | GRAVEUR |
|---|
MOT : 'BUS'
T après l'insertion du mot 'BUS' (résultat à afficher) :
| ADSL | BUS | CD-ROM | DISQUETTE | FLASH-DISQUE | GRAVEUR |
|---|
Sujet théorique — 4 Sc/M
Exercice n°1 — Analyse d'un programme
Soient les algorithmes ci-dessous, correspondant à un programme principal Exercice et à une fonction Inconnue appelée par celui-ci :
Algorithme Exercice
Début
Lire(A)
Si Inconnue(A) alors
Ecrire(A, "Vérifie la propriété.")
Sinon
Ecrire(A, "ne vérifie pas la propriété.")
Fin
Fonction Inconnue (C : ............) : ............
Répéter
L ← estnum(C[0])
C ← effacer(C, 0, 1)
Jusqu'à (C = "") ou (non L)
Retourner L = vrai
Fin
Questions :
- À partir des algorithmes donnés ci-dessus, remplir la 2ème colonne du tableau suivant par un exemple de chaque élément cité dans la 1ère colonne.
| Élément | Exemple |
|---|---|
| Expression booléenne | |
| Fonction prédéfinie | |
| Paramètre formel | |
| Paramètre effectif |
-
Compléter l'entête de la fonction Inconnue par les types appropriés.
-
Compléter le tableau de déclaration ci-dessous par les types des objets locaux de la fonction Inconnue.
| Objet | Type/Nature |
|---|---|
| L |
- Parmi les variables A, C, L, réécrire dans le tableau ci-dessous celles qui ne sont pas visibles par le programme principal.
| Variables non visibles par le programme principal |
|---|
-
Donner le résultat affiché par le programme Exercice pour chacune des valeurs de la variable A suivantes :
- A = "523"
- A = "-523"
- A = "5.23"
- A = "A5B8"
-
En déduire le rôle de la fonction Inconnue.
Voir le corrigé
- Exemples possibles :
| Élément | Exemple |
|---|---|
| Expression booléenne | (C = "") ou (non L) |
| Fonction prédéfinie | estnum, effacer |
| Paramètre formel | C |
| Paramètre effectif | A |
-
Entête :
Fonction Inconnue (C : chaîne de caractères) : Booléen -
Tableau de déclaration locale :
| Objet | Type/Nature |
|---|---|
| L | Booléen |
-
Variables non visibles par le programme principal : C et L (paramètre formel et variable locale).
-
Résultats :
- A = "523" → vérifie la propriété.
- A = "-523" → ne vérifie pas la propriété.
- A = "5.23" → ne vérifie pas la propriété.
- A = "A5B8" → ne vérifie pas la propriété.
-
Rôle : la fonction
Inconnueretourne vrai si la chaîne est composée uniquement de chiffres, et faux sinon.
Exercice n°2 — Translation d'une chaîne
Une translation d'ordre n appliquée à une chaîne de caractères ch consiste à déplacer les n derniers caractères de la chaîne vers son début.
Exemples :
- Pour ch =
"bonjour"et n = 1, on déplace le dernier caractère vers le début, ce qui donne après translationch = "rbonjou". - Pour ch =
"bonjour"et n = 4, on déplace les 4 derniers caractères vers le début, ce qui donne après translationch = "jourbon".
Questions :
-
Pour ch =
"bac_2022":- n = 6 → ?
- n = 8 → ?
-
On propose l'algorithme du programme principal suivant :
Algorithme Deplacer
Début
Saisie(n, ch)
Ecrire(translation(n, ch))
Fin
- Écrire l'algorithme du module saisie qui permet de lire une chaîne non vide de 10 caractères au maximum et de lire l'ordre de translation n (n est un entier compris entre 1 et la longueur de la chaîne ch).
- Écrire l'algorithme du module translation.
Voir le corrigé
-
Pour ch =
"bac_2022":- n = 6 →
c_2022ba - n = 8 →
bac_2022(la translation d'ordre égal à la longueur redonne la même chaîne)
- n = 6 →
-
Algorithmes proposés :
Procédure Saisie(@ n : entier, @ ch : chaine)
Début
Répéter
Ecrire("Donner la chaîne : ")
Lire(ch)
Jusqu'à (ch ≠ "") et (long(ch) ≤ 10)
Répéter
Ecrire("Donner l'ordre n : ")
Lire(n)
Jusqu'à (n ≥ 1) et (n ≤ long(ch))
Fin
Fonction translation (n : entier, ch : chaine) : chaine
Début
L ← long(ch)
ch2 ← sous_chaine(ch, L - n, n) + sous_chaine(ch, 0, L - n)
Retourner ch2
Fin
Problème — Société d'import/export (camions)
Une société d'import/export, qui importe et assure le transport des marchandises à partir des quais du port, souhaite connaître le nombre de camions qu'elle doit louer pour décharger un bateau plein de conteneurs.
Sachant que :
- Un camion ne peut porter que deux conteneurs au maximum.
- Un camion ne peut porter que 10 tonnes au maximum.
- Un conteneur a un poids maximum de 10 tonnes et 1 tonne au minimum.
On désire remplir un tableau T de N réels distincts compris entre 1 et 10 représentant les poids des conteneurs (3 < N ≤ 20), puis afficher le couple de poids (ou le poids) transporté(s) par chaque camion ainsi que le nombre de camions.
Exemple : soit N = 8 et T contenant les poids :
| 7.15 | 6.18 | 3.0 | 3.2 | 2.5 | 9.82 | 8.71 | 5.30 |
|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Après tri décroissant de T :
| 9.82 | 8.71 | 7.15 | 6.18 | 5.30 | 3.2 | 3.0 | 2.5 |
|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
On vérifie ensuite si un camion peut porter deux conteneurs selon le principe suivant :
- T[0] + T[7] = 9.82 + 2.5 = 12.32 > 10 ⇒ camion n°1 : un seul conteneur de 9.82 tonnes.
- T[1] + T[7] = 8.71 + 2.5 = 11.21 > 10 ⇒ camion n°2 : un seul conteneur de 8.71 tonnes.
- T[2] + T[7] = 7.15 + 2.5 = 9.65 ≤ 10 ⇒ camion n°3 : deux conteneurs de (7.15, 2.5) tonnes.
- T[3] + T[6] = 6.18 + 3.0 = 9.18 ≤ 10 ⇒ camion n°4 : deux conteneurs de (6.18, 3.0) tonnes.
- T[4] + T[5] = 5.30 + 3.2 = 8.5 ≤ 10 ⇒ camion n°5 : deux conteneurs de (5.30, 3.2) tonnes.
On vous demande d'élaborer :
- un algorithme du programme principal solution à ce problème, en le décomposant en modules,
- l'algorithme de chaque module.
Voir le corrigé
Décomposition modulaire proposée :
ALGORITHME Camions
DÉBUT
Saisir(n)
Remplir(T, n)
Trier_Decroissant(T, n)
Affecter(T, n)
FIN
Module Saisir :
Procédure Saisir(@ n : entier)
Début
Répéter
Ecrire("Donner N : ")
Lire(n)
Jusqu'à (n > 3) et (n ≤ 20)
Fin
Module Remplir (N réels distincts dans [1, 10]) :
Procédure Remplir(@ T : tab, n : entier)
Début
Pour i de 0 à n-1 faire
Répéter
Ecrire("T[", i, "] = ")
Lire(T[i])
existe ← faux
Pour j de 0 à i-1 faire
Si T[j] = T[i] alors existe ← vrai FinSi
FinPour
Jusqu'à (T[i] ≥ 1) et (T[i] ≤ 10) et (non existe)
FinPour
Fin
Module Trier_Decroissant (tri à bulles, ordre décroissant) :
Procédure Trier_Decroissant(@ T : tab, n : entier)
Début
Répéter
permut ← faux
Pour i de 0 à n-2 faire
Si T[i] < T[i+1] alors
aux ← T[i]
T[i] ← T[i+1]
T[i+1] ← aux
permut ← vrai
FinSi
FinPour
Jusqu'à (permut = faux)
Fin
Module Affecter (algorithme glouton : associe le plus lourd restant avec le plus léger restant) :
Procédure Affecter(T : tab, n : entier)
Début
g ← 0
d ← n - 1
nb ← 0
Tant que (g ≤ d) faire
nb ← nb + 1
Si (g < d) et (T[g] + T[d] ≤ 10) alors
Ecrire("Camion n°", nb, " : (", T[g], ",", T[d], ") tonnes")
g ← g + 1
d ← d - 1
Sinon
Ecrire("Camion n°", nb, " : ", T[g], " tonnes")
g ← g + 1
FinSi
Fin Tant que
Ecrire("Nombre de camions = ", nb)
Fin
Devoir de contrôle N°2 — Cryptage d'un solfège musical
Lycée Pilote 15 octobre 1963 — Bizerte — Date : 17/02/2022 — Durée : 1 heure
Énoncé
On souhaite écrire un programme qui crypte un solfège musical afin de préserver les droits de l'auteur.
On suppose que ce solfège est une chaîne saisie par le musicien et qui contient seulement des notes : "do", "re", "mi", "fa", "sol", "la" et "si" séparées par un seul espace.
On doit créer pour le cryptage de la chaîne deux tableaux :
1) Un tableau Cle saisi par le musicien et qui contient les notes musicales sans répétition, correctes mais pas nécessairement dans l'ordre (on ne demande pas le contrôle sur les notes).
| Indice | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| Cle | "do" | "re" | "mi" | "fa" | "sol" | "la" | "si" |
2) Un tableau Freq qui contient des chaînes de chiffres indiquant les numéros des notes dans le solfège.
Par exemple, si solfège = "do do sol sol sol fa mi re do" (positions 0, 1, 2, 3, 4, 5, 6, 7, 8), alors on remarque que la 1ʳᵉ note Cle[0] ("do") se trouve aux positions 0, 1 et 8 dans le solfège.
➜ Freq[0] = "018"
| Indice | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| Freq | "018" | "7" | "6" | "5" | "234" | "X" | "X" |
Enfin, en concaténant les chaînes du tableau Freq avec des tirets "-" on obtient le solfège crypté.
Le programme affichera la chaîne : "018-7-6-5-234-X-X"
Grille d'évaluation
| Question | Points |
|---|---|
| a. Structure de données adéquate | /5 |
b. Saisie du tableau Cle | /5 |
c. Remplissage du tableau Freq | /8 |
| d. Affichage du solfège crypté | /2 |
Jeu « My Lucky Number »
À partir de votre prénom, vous pouvez connaître votre numéro de chance.
On désire écrire un programme qui permet de :
- Saisir un prénom (une chaîne de lettres),
- Faire la somme des codes ASCII de chaque lettre,
- Réduire la somme obtenue en un chiffre en faisant la somme des chiffres de la somme. Et répéter jusqu'à ce qu'on obtienne un seul chiffre.
Attention : ce n'est qu'un jeu, ne le prenez pas au sérieux :)
Exemple
Somme des codes ASCII des lettres de « Oceane » :
| Lettre | "O" | "c" | "e" | "a" | "n" | "e" |
|---|---|---|---|---|---|---|
| Code ASCII | 79 | 99 | 101 | 97 | 110 | 101 |
La somme = 79 + 99 + 101 + 97 + 110 + 101 = 587
Réduire la somme en un seul chiffre :
- 5 + 8 + 7 = 20
- 2 + 0 = 2
Le numéro de chance de « Oceane » est 2.
Problème 1 — Programme « Fidélité »
Afin de fidéliser ses clients qui ont rechargé leurs téléphones pendant le mois d'avril, un opérateur téléphonique décide de faire gagner un bonus de 20 DT au client ayant la somme des chiffres maximale de son numéro de téléphone à condition que cette somme soit un nombre pair.
Pour cela, on se propose d'écrire l'algorithme du programme « fidélité » qui permet de :
- Remplir un tableau
Telpar N chaînes de 8 chiffres représentant les numéros de téléphone des clients (3 ≤ N ≤ 200).NB : on suppose que les numéros de téléphone sont distincts.
- Remplir un tableau
Sompar les N sommes des chiffres du numéro de téléphone de chaque client (Som[i]correspond au i-ème client qui a pour numéroTel[i]).- ✓ Si la somme est un nombre pair, la placer dans le tableau
Som. - ✓ Sinon
Som[i]reçoit 0.
- ✓ Si la somme est un nombre pair, la placer dans le tableau
- Afficher les numéros de téléphone gagnants ayant la somme des chiffres maximale.
- S'il n'y a pas de gagnant, le programme affiche :
"désolé pas de gagnant".
Exemple : pour N = 7
| Indice | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| Tel | 95874663 | 94556842 | 95878655 | 94743678 | 95112733 | 93120120 | 95560300 |
| Som | 48 | 0 | 0 | 48 | 0 | 18 | 28 |
Le programme affiche ➜ Les numéros gagnants sont : 95874663, 94743678
Problème 2 — Liste amiable
On se propose de saisir un tableau T de N entiers distincts strictement positifs (5 ≤ N ≤ 30), puis vérifier que les éléments de ce tableau forment une liste amiable ; sachant que dans cette liste chaque nombre est égal à la somme des diviseurs propres du suivant ; la somme des diviseurs du dernier étant égale au premier nombre.
Exemple
Pour le tableau T suivant, la liste de ses éléments forme une liste amiable :
| Indice | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| T | 12496 | 14288 | 15472 | 14536 | 14264 |
Par exemple, les diviseurs propres de 15472 sont : 1, 2, 4, 8, 16, 967, 1934, 3868, 7736 — la somme est égale à 14536.
Travail demandé
- Analyser le problème en le décomposant en modules.
- Écrire les algorithmes et les tableaux de déclaration relatifs aux modules envisagés.
Devoir de contrôle N°2 (variante) — Jeu Numbermind
Date : 17/02/2022 — Durée : 1 heure
Énoncé
Le jeu Numbermind est un jeu à deux qui consiste à deviner un numéro de téléphone.
Le principe du jeu est le suivant :
- Le premier joueur propose une combinaison de 8 chiffres représentant le numéro à deviner.
- Le deuxième joueur annonce une proposition de 8 chiffres. Si cette proposition correspond au numéro à deviner, ce joueur est gagnant. Sinon on lui affiche sa proposition à laquelle on garde tous les chiffres bien placés et on remplace le reste par des tirets, tout en mentionnant les chiffres corrects mais mal placés dans la proposition.
- On répète l'étape précédente jusqu'à trouver le numéro cherché ou atteindre un nombre d'essais égal à 8.
Travail demandé
Écrire le programme « Numbermind » qui permet de simuler ce jeu.
Exemple
Pour le numéro de téléphone à deviner 68456231, le programme affiche :
Vous avez 8 essais
Proposer un numéro de téléphone : 56426179
5 qui est à la position 1 dans la proposition n'est pas à sa bonne position
6 qui est à la position 2 dans la proposition n'est pas à sa bonne position
2 qui est à la position 4 dans la proposition n'est pas à sa bonne position
1 qui est à la position 6 dans la proposition n'est pas à sa bonne position
il vous reste 7 essais
--4-6---
Proposer un numéro de téléphone : 63456331
3 qui est à la position 2 dans la proposition n'est pas à sa bonne position
3 qui est à la position 6 dans la proposition n'est pas à sa bonne position
il vous reste 6 essais
6-456-31
Proposer un numéro de téléphone : 68456231
Bravo vous avez gagné
Grille d'évaluation
| Question | Points |
|---|---|
| a. Structure de données adéquate | /4 |
| b. Saisie du premier numéro + contraintes | /6 |
| c. Traitement | /8 |
| d. Affichage | /2 |
Baccalauréat — Épreuve pratique : Plagiat
Sections : Mathématiques, Sciences expérimentales et Sciences techniques
Énoncé
Le plagiat est une mauvaise pratique qui consiste à copier ou s'inspirer fortement d'une œuvre sans citer son auteur et en faisant passer cette œuvre pour la sienne.
On suppose qu'un texte est plagié lorsque le nombre de mots communs dépasse la moitié du nombre de mots du texte d'origine.
Exemple
Texte à tester :
"ENTRE DEUX VERSIONS DU MEME DOCUMENT CE LOGICIEL PERMET DE CHERCHER LE NOMBRE DE MOTS IDENTIQUES."
Texte d'origine :
"CE PROGRAMME PERMET DE TROUVER LE NOMBRE DE MOTS IDENTIQUES DANS DEUX VERSIONS DU MEME TEXTE."
Les mots communs aux deux textes sont :
DEUX – VERSIONS – DU – MEME – CE – PERMET – DE – LE – NOMBRE – DE – MOTS – IDENTIQUES
Le texte testé est plagié. En effet, le nombre de mots communs aux deux textes est égal à 12, dépassant ainsi la moitié du nombre de mots du texte d'origine qui est 16.
Algorithme du programme principal
On se propose d'écrire un programme Pascal qui permet de saisir deux textes T1 et T2 ayant un même nombre de mots, de vérifier si T2 est plagié de T1 selon le principe décrit précédemment et d'afficher un message correspondant.
Ci-après, un algorithme du programme principal dans lequel des modifications seront apportées, avec Nbc désignant le nombre de mots communs à T1 et T2 :
0) Début Plagiat
1) Répéter
Lire (T1)
Lire (T2)
Jusqu'à (FN Nbmots (T1) = FN Nbmots (T2))
2) Nbc ← FN Commun (T1, T2)
3) Fin Plagiat
Travail demandé
-
Traduire l'algorithme Plagiat en un programme Pascal et ajouter les déclarations nécessaires puis enregistrer le programme sous le nom
"Plagiat0". -
Dans votre dossier de travail, créer une deuxième copie de ce programme et l'enregistrer sous le nom
"Plagiat1". Dans ce fichier :-
a) Développer un module intitulé Saisir qui permet de saisir une chaîne commençant obligatoirement par une lettre, composée au maximum de 200 caractères, se terminant par un point et ne pouvant contenir que des lettres majuscules et des espaces. Puis apporter les modifications nécessaires dans le programme principal.
Ce module permet aussi d'enlever les espaces superflus (garder un seul espace entre deux mots consécutifs et ne garder aucun espace avant le point de fin de texte).
-
b) Développer le module Nbmots qui permet de déterminer le nombre de mots dans un texte.
-
c) Développer le module Commun, qui permet de déterminer le nombre de mots communs dans deux textes donnés.
-
d) Apporter les modifications nécessaires au programme afin de vérifier si le texte testé est plagié et d'afficher le message correspondant.
-
Grille d'évaluation
| Tâche | Points |
|---|---|
| 1) Traduction de l'algorithme Plagiat en Pascal et ajout des déclarations | 4.5 |
| 2a) Développement du module Saisir | 5.5 |
| 2b) Développement du module Nbmots | 3.5 |
| 2c) Développement du module Commun | 5 |
| 2d) Vérification et affichages nécessaires | 1.5 |
Devoir de contrôle N°3 — Super premier (Python + Interface)
Date : 28/04/2022 — Durée : 1 heure
Énoncé
Un nombre est dit super premier s'il est premier et si, en supprimant des chiffres à partir de sa droite, le nombre restant est aussi premier.
Exemple : Le nombre 59399 est super premier car les nombres 59399, 5939, 593, 59, 5 sont tous premiers.
Algorithme de la fonction aff_superpremier
Fonction aff_superpremier (ch : chaîne) : chaîne
DEBUT
Si NON(Estnum(ch)) Alors msg ← "Vérifier la saisie"
Sinon Si superpremier(ch) Alors msg ← "le nombre est super premier"
Sinon
Msg ← "le nombre n'est pas super premier"
Finsi
Retourner msg
FIN
Interface graphique
On veut créer l'interface graphique comportant les éléments suivants :
- Un label contenant le titre : « Vérification d'un nombre est superpremier ou non »
- Un label contenant le texte : « Saisir un nombre »
- Une zone de saisie permettant la saisie d'un nombre
- Un bouton nommé
"Vérifier" - Un label pour afficher un message.
Travail demandé
-
Concevoir une interface graphique comme illustré ci-dessus et l'enregistrer dans votre dossier de travail sous le nom
"Interface_superpremier". -
Implémenter en Python la fonction
aff_superpremierdans un programme et l'enregistrer sous le nom"superpremier_1". -
Développer la fonction
superpremierpermettant de vérifier si un nombre, passé en paramètre, est super premier ou non puis l'enregistrer dans votre dossier de travail sous le nom"superpremier_2". -
Dans le programme
"superpremier_2", ajouter les instructions permettant :- D'appeler l'interface intitulée
"Interface_superpremier"en exploitant l'annexe ci-dessous. - D'implémenter un module
"Verif", qui s'exécute à la suite d'un clic sur le bouton"Vérifier"permettant de récupérer le nombre saisi puis exploiter la fonctionaff_superpremierafin d'afficher le message retourné via un label de l'interface"Interface_superpremier".
- D'appeler l'interface intitulée
Annexe (PyQt5)
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
# ......
# ......
app = QApplication([])
fen = loadUi("Nom_Interface.ui")
fen.show()
fen.Nom_Bouton.clicked.connect(Nom_Module)
app.exec_()
Grille d'évaluation
| Tâche | Points |
|---|---|
| Création de l'interface | 2 |
Implémentation aff_superpremier | 2 |
Module superpremier | 4 |
Module premier | 4 |
Module verif | 4 |
| Connexion à l'interface | 4 |
Série graphique — Société 3X (PyQt5)
Énoncé
Une société de télécommunication téléphonique 3X veut faire gagner à ses clients un bonus de 100 points pour les clients dont la recharge téléphonique portable est gagnante, si le numéro de 13 chiffres vérifie les contraintes suivantes :
- Le nombre composé des trois premiers chiffres du code est un nombre premier.
- Le nombre composé des cinq chiffres suivants, converti en binaire (Base 2), doit contenir plus que cinq zéros (0).
- Le nombre composé des cinq chiffres restants, converti en hexadécimale (base 16), doit contenir le caractère
"D","E"ou"F".
Le principe consiste à vérifier le numéro de recharge du client et d'afficher le message « Félicitations, vous avez gagné un bonus de 100 points. » dans le cas où ce nombre vérifie les trois conditions ci-dessus, ou le message « Désolé, vous n'avez pas gagné. » dans le cas contraire.
Exemple
Numéro de recharge : 1971546215309
- Le nombre de 3 premiers chiffres 197 est premier ✓
- La conversion des 5 chiffres suivants 15462 en binaire 0011110001100110 contient plus que 5 zéros ✓
- La conversion des 5 chiffres suivants 15309 en hexadécimale 3BCD contient le caractère D ✓
Le message à afficher : « Félicitations, vous avez gagné un bonus de 100 points. »
Algorithme de la fonction convB
Ci-après, un algorithme de la fonction "convB" à exploiter pour résoudre le problème posé, qui permet de convertir un nombre décimal (entier) en une chaîne binaire ou en une chaîne hexadécimale en indiquant la base de conversion B (B=2 pour Binaire, B=16 pour hexadécimale) :
Fonction convB (n : entier, B : entier) : Chaîne
DEBUT
Ch ← ""
Répéter
r ← n mod B
Si r < 10 Alors
X ← convch(r)
Sinon
X ← chr(r + 55)
Finsi
Ch ← X + Ch
n ← n div B
Jusqu'à n = 0
Retourner Ch
FIN
Interface graphique
La société a décidé de créer l'interface graphique comportant les éléments suivants :
- Un label contenant le nom de la société.
- Un label demandant la saisie du numéro de recharge.
- Une zone de saisie permettant la saisie du numéro de recharge.
- Un bouton nommé
"verifier". - Un label pour afficher un message.
Travail demandé
-
Concevoir une interface graphique comme illustré ci-dessus et l'enregistrer sous le nom
"Interface_play". -
Implémenter en Python la fonction
"convB"dans un programme et l'enregistrer sous le nom"play", dans votre dossier de travail. -
Développer la fonction
"Premier"permettant de vérifier si un nombre, passé comme paramètre, est premier ou non. -
Dans le programme
"play", ajouter les instructions permettant :- D'appeler l'interface graphique intitulée
"Interface_play"en exploitant l'annexe ci-dessous. - D'implémenter un module
"affiche", qui s'exécute à la suite d'un clic sur le bouton"verifier", permettant de récupérer le numéro de recharge saisi puis d'exploiter la fonction"convB"et la fonction"premier"afin d'afficher le message retourné via un label de l'interface"Interface_play".
- D'appeler l'interface graphique intitulée
Annexe (PyQt5)
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
# ......
# ......
app = QApplication([])
windows = loadUi("Nom_Interface.ui")
windows.show()
windows.Nom_Bouton.clicked.connect(Nom_Module)
app.exec_()
Exercice — Produit puissance
Énoncé
Étant donné un entier N qui vérifie la propriété suivante :
« Le produit des diviseurs de N sauf lui-même est égal à une puissance de N avec un exposant strictement supérieur à 0 ».
Exemples
- N = 6 vérifie cette propriété car le produit de ses diviseurs sauf lui-même est égal à 6 (1 × 2 × 3 = 6) qui est une puissance de 6, avec un exposant égal à 1 (car 6 = 6¹).
- N = 12 vérifie cette propriété car le produit de ses diviseurs sauf lui-même est égal à 144 (1 × 2 × 3 × 4 × 6 = 144) qui est une puissance de 12, avec un exposant égal à 2 (car 144 = 12²).
- N = 30 vérifie cette propriété car le produit de ses diviseurs sauf lui-même est égal à 27000 (1 × 2 × 3 × 5 × 6 × 10 × 15 = 27000) qui est une puissance de 30, avec un exposant égal à 3 (car 27000 = 30³).
- N = 9 ne vérifie pas cette propriété car le produit de ses diviseurs sauf lui-même est égal à 3 (1 × 3 = 3) qui n'est pas une puissance de 9.
- N = 11 ne vérifie pas cette propriété car le produit de ses diviseurs sauf lui-même est égal à 1, qui est une puissance de 11 avec un exposant égal à 0.
On se propose d'écrire un programme permettant d'afficher tous les nombres de l'intervalle [a, b] avec 2 ≤ a < b ≤ 100.
Algorithme de la fonction Résultat
Fonction Résultat (a, b : entier) : Chaîne
DEBUT
Si a < 2 ou a > b ou b > 100 Alors
msg ← "Vérifier les nombres"
Sinon
msg ← chercher(a, b)
FinSi
Retourner msg
FIN
Interface graphique
On désire créer l'interface graphique comportant les éléments suivants :
- Un label contenant le titre
"Produit Puissance". - Deux labels demandant la saisie des deux nombres.
- Deux zones de saisie permettant la saisie de deux entiers.
- Un bouton nommé
"Afficher". - Un label pour afficher un message.
Travail demandé
-
Concevoir une interface graphique comme illustré ci-dessus et l'enregistrer sous le nom
"Interface_produit". -
Implémenter en Python la fonction
"Resultat"dans un programme et l'enregistrer sous le nom"test0", dans votre dossier de travail. -
Développer la fonction
"chercher"permettant de chercher tous les nombres ∈ [a, b] et vérifiant la propriété comme indiqué ci-dessus.- a. D'appeler l'interface graphique intitulée
"Interface_produit"en exploitant l'annexe ci-dessous. - b. D'implémenter un module
"affiche", qui s'exécute à la suite d'un clic sur le bouton"Afficher", permettant de récupérer les nombres saisis puis d'exploiter la fonction"Resultat"afin d'afficher le message retourné via un label de l'interface"Interface_produit".
- a. D'appeler l'interface graphique intitulée
TP 4 — Nombre Rigolo
Un nombre N est dit RIGOLO si la somme de ses chiffres est égale à la somme de tous les chiffres de ses facteurs premiers.
Exemples
Exemple 1 : Si N = 690, alors N est un nombre rigolo. En effet :
- La somme des chiffres de 690 est : 6 + 9 + 0 = 15
- Les facteurs premiers de 690 sont : 2, 3, 5 et 23
- La somme des chiffres des facteurs premiers de 690 est : 2 + 3 + 5 + 2 + 3 = 15
Exemple 2 : Si N = 120, alors N n'est pas un nombre rigolo. En effet :
- La somme des chiffres de 120 est : 1 + 2 + 0 = 3
- Les facteurs premiers de 120 sont : 2, 2, 2, 3 et 5
- La somme des chiffres des facteurs premiers de 120 est : 2 + 2 + 2 + 3 + 5 = 14
Algorithme de la fonction Message
Fonction Message (Ch : Chaîne) : Chaîne
Début
Si Non (Estnum(Ch) et 1 ≤ Long(Ch) ≤ 8) Alors
Msg ← "Saisie Non valide !"
Sinon
N ← Valeur(Ch)
S1 ← Somme_Chiffres (N)
S2 ← Som_Chif_Facteurs (N)
Si S1 = S2 Alors
Msg ← "Nombre Rigolo"
Sinon
Msg ← "Nombre n'est pas Rigolo"
Fin Si
Fin Si
Retourner Msg
Fin
Travail demandé
- Concevoir une interface graphique comme le modèle ci-dessous et l'enregistrer sous le nom Interface_Rigolo. L'interface comporte :
- Un label contenant le titre Nombre Rigolo.
- Un label demandant la saisie de N.
- Une zone de saisie permettant la saisie d'un nombre.
- Un bouton Vérifier permettant d'appeler la fonction Message.
- Un bouton Rétablir permettant de vider le champ de saisie et le label de messages.
- Un label pour afficher les différents messages.
- Implémenter l'algorithme de la fonction Message en Python puis enregistrer le programme sous le nom Rigolo0.
- Développer dans ce programme le module Somme_Chiffres permettant de calculer la somme des chiffres d'un nombre et le module Som_Chif_Facteurs permettant de calculer la somme des chiffres des facteurs premiers d'un nombre, et l'enregistrer sous le nom Rigolo1.
- Dans le fichier Python Rigolo1, apporter les modifications nécessaires pour intégrer cette interface graphique en exploitant l'annexe ci-dessous.
Annexe :
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
# ...
app = QApplication([])
fen = loadUi("Nom_Interface.ui")
fen.show()
fen.Nom_Bouton.clicked.connect(Nom_Module)
app.exec_()
Devoir de Contrôle — Recherche d'un mot dans un texte
Un enseignant d'informatique veut faire une application qui permet de chercher le nombre de répétitions d'un mot dans un texte.
Algorithme CHERCHER
ALGORITHME CHERCHER
DÉBUT
Écrire ("Entrer votre Texte :")
Lire (T)
Si non (verif_1(mot) et verif_2(T)) Alors
message ← "Vérifier Vos données !"
Sinon
Nb ← 0
T2 ← " " + T + " "
R2 ← long(" " + mot + " ")
TantQue pos(majus(" " + mot + " "), majus(T2)) ≠ -1 faire
R ← pos(majus(" " + mot + " "), majus(T2))
T2 ← souschaine(T2, 0, R) + " " + souschaine(T2, R + R2, long(T2))
Nb ← Nb + 1
Fin TantQue
message ← mot + " existe " + convch(Nb) + " fois dans " + T
FinSi
Écrire (message)
FIN
Travail demandé
-
Implémenter l'algorithme RECHERCHER en Python puis enregistrer le programme sous le nom cherche0.
-
Transformer ce programme en un module nommé CHERCHE, puis l'appeler et l'enregistrer sous le nom cherche1.
-
Développer dans ce programme :
- Le module verif_1 permettant de retourner True si le mot est non vide formé uniquement de caractères alphabétiques et contenant au maximum 15 caractères, False sinon.
- Le module verif_2 permettant de retourner True si le texte non vide formé uniquement de caractères alphabétiques et d'espaces et contenant au maximum 200 caractères, False sinon.
NB : le texte ne commence pas par un espace, ne se termine pas par un espace et les mots du texte sont séparés par un seul espace.
-
Concevoir une interface graphique comme le modèle ci-dessus et l'enregistrer sous le nom Interface_recherche.
-
Apporter les modifications nécessaires pour intégrer cette interface graphique en exploitant l'annexe ci-dessous. NB : Programmer le bouton Rétablir.
Annexe :
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
# ...
a = QApplication([])
f = loadUi("Nom_Interface.ui")
f.show()
f.Nom_Bouton1.clicked.connect(Nom_Module)
f.Nom_Bouton2.clicked.connect(Nom_Module)
app.exec_()
Grille d'évaluation
| Tâche | Points |
|---|---|
| Implémentation de l'algorithme RECHERCHER en Python | 4 |
| Enregistrement du programme sous le nom cherche0 | 1 |
| Transformation du programme en un module nommé CHERCHE | 2 |
| Développement du module verif_1 | 1.5 |
| Développement du module verif_2 | 2.5 |
| Conception et enregistrement de l'interface graphique | 3 |
| Intégration de l'interface graphique dans le programme | 5 |
| Enregistrement du programme cherche1 | 1 |
Projet 3 — Suite stationnaire
Objectifs :
- Concevoir et réaliser une application graphique.
- Traiter une suite stationnaire.
Description
Soit U0 un entier naturel de 4 chiffres. On forme avec les quatre chiffres de U0 le plus grand entier maximum et le plus petit entier minimum. Leur différence (maximum − minimum) donne un nombre entier U1. On refait le même travail pour U1 et on obtient ainsi une suite. Cette suite est stationnaire, c'est-à-dire qu'elle devient constante à partir d'un certain rang.
On se propose de créer une interface graphique « projet3.ui » et un script python « projet3.py » permettant de saisir un entier positif U0 sur quatre chiffres et d'afficher tous les termes de cette suite jusqu'à ce qu'elle devienne constante.
Exemple de réalisation
Pour U0 = 4976, la suite affichée est :
4976 | 5085 | 7992 | 7173 | 6354 | 3087 | 8352 | 6174
Annexe :
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
# ...
app = QApplication([])
windows = loadUi("Nom_Interface.ui")
windows.show()
windows.Nom_Bouton.clicked.connect(Nom_Module)
app.exec_()
Suite palindromique
Un nombre palindrome est un entier naturel qui reste le même qu'on le lise de droite à gauche ou de gauche à droite.
Exemples : 47374, 101, 6, 9449 sont des nombres palindromes.
Pour déterminer la suite palindromique associée à un entier naturel n, on procède comme suit :
- On inverse l'ordre des chiffres de n et on ajoute n à ce nombre inversé.
- On recommence l'opération avec le nouveau nombre jusqu'à obtenir un palindrome.
Exemples
- Pour n = 64, on inverse les chiffres on obtient 46 auquel on ajoute 64, on obtient 110. Comme 110 n'est pas palindrome, on continue avec 110. On inverse les chiffres de 110 on obtient 11, auquel on ajoute 110, on obtient 121. Comme 121 est palindrome, on arrête et la suite palindromique de 64 est : 64, 110, 121.
- Pour n = 1048, on inverse les chiffres on obtient 8401 auquel on ajoute 1048, on obtient 9449. Comme 9449 est palindrome, on arrête et la suite palindromique de 1048 est : 1048, 9449.
Algorithme de la fonction aff_palin
Fonction aff_palin (n : entier) : chaine
Début
Si (n < 10) Alors
msg ← "Vérifier la saisie"
Sinon
msg ← suite_palin (n)
Finsi
Retourner msg
Fin
Travail demandé
a. Concevoir une interface graphique et l'enregistrer sous le nom Suite.ui. b. Traduire en python l'algorithme de la fonction aff_palin qui permet de vérifier si l'entier n est supérieur ou égal à 10 et de retourner le résultat de la fonction suite_palin ou un message d'erreur. c. Développer la fonction palindrome qui permet de vérifier si n est un nombre palindrome ou non. d. Développer le module suite_palin qui permet de retourner la suite palindromique ou le message « pas de suite palindromique » après le calcul de 11 termes. e. Développer le module clr() qui permet, en cliquant sur Actualiser, d'effacer la saisie et l'affichage. f. Faire le traitement nécessaire et afficher le résultat sur l'interface.
Annexe :
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
# ...
app = QApplication([])
windows = loadUi("Nom_Interface.ui")
windows.show()
windows.Nom_Bouton.clicked.connect(Nom_Module)
app.exec_()
Prototype Bac 2022 — Cryptage
Dans le but de sécuriser les messages à envoyer, on peut faire appel à une méthode de cryptage. Une des méthodes utilisées consiste à remplacer chaque lettre du message à crypter par celle qui la suit de p positions dans l'alphabet français, où p désigne le nombre de mots du message.
Exemple
Pour le message "Examen Pratique En Informatique", comme le message est formé de 4 mots, pour la lettre "E" par exemple, elle sera remplacée par "I" car en ajoutant au code ASCII de "E" (qui est 69) la valeur 4, on obtient 73 qui est le code ASCII de "I".
En continuant à appliquer ce principe de codage, le message crypté sera : "Ibeqir Tvexmuyi Ir Mrjsvqexmuyi"
NB : Le message peut contenir des espaces superflus (inutiles).
Algorithme de la fonction cryptage
fonction cryptage(M : chaine, p : entier) : chaine
début
ch ← ""
l ← long(M)
pour i de 0 a l-1 faire
si M[i] = " " alors
ch ← ch + " "
sinon si NON( 65 <= ord(M[i])+p <=91 ou 97 <= ord(M[i])+p <=123) alors
ch ← ch + chr(ord(M[i]) + p - 26)
sinon
ch ← ch + chr(ord(M[i]) + p)
fin si
fin pour
retourner ch
fin
Travail demandé
- Concevoir une interface graphique comme illustré et l'enregistrer sous le nom Interface_cryptage.
- Implémenter en Python la fonction cryptage dans un programme et l'enregistrer sous le nom Prog_Cryptage.
- Développer la fonction valide qui permet de vérifier si le message M est non vide et formé uniquement par des lettres et des espaces.
- Développer la fonction nbMot qui permet de déterminer le nombre de mots dans le message M à crypter, en prenant en considération la possibilité d'existence des espaces superflus.
- Dans le programme Prog_Cryptage, ajouter les instructions permettant :
- D'appeler l'interface graphique intitulée Interface_cryptage en exploitant l'annexe ci-dessous.
- D'implémenter un module affiche, qui s'exécute à la suite d'un clic sur le bouton Crypter, permettant de récupérer le message saisi puis d'exploiter les 3 fonctions cryptage, valide et nbMot afin d'afficher le message retourné via un label de l'interface Interface_cryptage.
Si le message saisi est invalide, on va afficher dans le label "Vérifier votre message !".
Annexe :
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
# ...
app = QApplication([])
windows = loadUi("Nom_Interface.ui")
windows.show()
windows.Nom_Bouton.clicked.connect(Nom_Module)
app.exec_()
Devoir de Contrôle — Nombre Oblong
Un nombre oblong est le produit de deux entiers naturels consécutifs, c'est-à-dire n * (n + 1).
Exemples
- 20 est nombre oblong puisque 4 × (4+1) = 4 × 5 = 20
- 132 est nombre oblong puisque 11 × (11+1) = 11 × 12 = 132
Algorithme de la fonction affichage
Fonction affichage (ch : chaine) : chaine
DEBUT
Si NON (Estnum(ch)) Alors
msg ← "Vérifier la saisie"
Sinon Si oblong(ch) Alors
msg ← "le nombre est oblong"
Sinon
msg ← "le nombre n'est pas oblong"
Finsi
Retourner msg
FIN
Travail demandé
- Concevoir une interface graphique comme illustré et l'enregistrer sous le nom Interface_oblong.
- Implémenter en python la fonction affichage dans un programme et l'enregistrer sous le nom oblong_1.
- Développer la fonction oblong permettant de vérifier si un nombre, passé en paramètre, est propre ou non, puis l'enregistrer dans votre dossier de travail sous le nom oblong_2.
- Dans le programme oblong_2, ajouter les instructions permettant :
- D'appeler l'interface intitulée Interface_oblong en exploitant l'annexe ci-dessous.
- D'implémenter un module Verif, qui s'exécute à la suite d'un clic sur le bouton Vérifier, permettant de récupérer le nombre saisi puis exploiter la fonction affichage afin d'afficher le message retourné via un label de l'interface Interface_oblong.
Annexe :
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
# ...
app = QApplication([])
windows = loadUi("Nom_Interface.ui")
windows.show()
windows.Nom_Bouton.clicked.connect(Nom_Module)
app.exec_()
Sujet de révision — Le Nombre Fort
Un nombre est dit fort s'il est égal à la somme des factorielles de ses chiffres.
Exemple : Le nombre 40585 est fort, en effet :
4! + 0! + 5! + 8! + 5! = 24 + 1 + 120 + 40320 + 120 = 40585
Algorithme de la fonction traiter
Fonction traiter (ch : chaine)
DEBUT
Si NON (Estnum(ch)) Alors
msg ← "Vérifier votre saisie"
nb ← ""
Sinon Si somme(ch) Alors
msg ← "le nombre est fort"
Sinon
msg ← "le nombre n'est pas fort"
Fin si
Retourner msg
FIN
Travail à faire
- Concevoir une interface graphique comme illustrée, puis l'enregistrer dans votre dossier de travail sous le nom fort.ui.
- Développer en python une fonction intitulée somme, qui permet de vérifier si un nombre est fort ou non, et l'enregistrer sous le nom fort.py.
- Dans le programme fort.py, ajouter les instructions suivantes permettant de :
- D'appeler l'interface graphique fort.ui en exploitant l'annexe ci-dessous.
- D'implémenter un module afficher, qui s'exécute à la suite d'un clic sur le bouton verifier, permettant de récupérer le nombre saisi, puis d'exploiter la fonction traiter, afin d'afficher le message retourné via le label « msg » de la fonction traiter.
Annexe :
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
# ...
app = QApplication([])
fen = loadUi("nom_interface.ui")
fen.nom_bouton.clicked.connect(nom_module)
fen.show()
app.exec()
Bac 2022 — Le nombre super-pairplus
Un nombre N est dit super-pairplus s'il vérifie les trois conditions suivantes :
- Condition 1 : N est pair.
- Condition 2 : N est formé uniquement par des chiffres pairs.
- Condition 3 : Tous les diviseurs de N autres que 1 sont des entiers pairs.
Exemples
- N = 64 est un entier super-pairplus car 64 vérifie les trois conditions :
- Condition 1 : 64 est pair.
- Condition 2 : 64 est formé uniquement par des chiffres pairs (6 et 4).
- Condition 3 : les diviseurs de 64 autres que 1 (2, 4, 8, 16, 32 et 64) sont des entiers pairs.
- N = 28 n'est pas un entier super-pairplus car la condition 3 n'est pas vérifiée :
- Condition 1 : 28 est pair.
- Condition 2 : 28 est formé uniquement par des chiffres pairs (2 et 8).
- Condition 3 : les diviseurs de 28 autres que 1 (2, 4, 7, 14 et 28) ne sont pas tous des entiers pairs. En effet, 7 est impair.
Interface graphique
L'interface graphique doit contenir :
- Un label contenant le texte : "Nombre super-pairplus".
- Un label demandant la saisie d'un nombre : "Introduire un entier > 0 :".
- Une zone de saisie permettant la saisie du nombre.
- Un bouton intitulé "Vérifier".
- Un label pour afficher le message adéquat.
Exemples d'exécution
| Saisie | Message affiché |
|---|---|
| 0 | Veuillez introduire un nombre > 0 |
| 64 | 64 est super-pairplus |
| 28 | 28 n'est pas super-pairplus |
Travail demandé
- Concevoir une interface graphique comme illustrée et l'enregistrer sous le nom InterfaceSuperPairplus.
- Créer un programme Python et l'enregistrer sous le nom NbrSuperPairplus.
- Développer dans le programme NbrSuperPairplus une fonction SuperPairplus(N) qui permet de vérifier si un entier N est super-pairplus ou non.
- Dans le programme NbrSuperPairplus :
- Ajouter les instructions permettant d'appeler l'interface graphique intitulée InterfaceSuperPairplus en exploitant l'annexe ci-après.
- Développer un module Play, qui s'exécute suite à un clic sur le bouton Vérifier, permettant de récupérer l'entier N saisi, puis d'exploiter la fonction SuperPairplus afin d'afficher le message adéquat via le label dédié.
Annexe :
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
# ...
app = QApplication([])
windows = loadUi("Nom_Interface.ui")
windows.show()
windows.Nom_Bouton.clicked.connect(Nom_Module)
app.exec_()
Grille d'évaluation
| Tâches | Points |
|---|---|
| Conception de l'interface InterfaceSuperPairplus | 4 |
| Création et enregistrement du programme NbrSuperPairplus | 1 |
| Développement de la fonction SuperPairplus | 6 |
| Ajout des instructions d'appel de l'interface InterfaceSuperPairplus | 2 |
| Développement du module Play | 4 |
| Importation des bibliothèques nécessaires, modularité et cohérence | 3 |
Exercice 1 — Fonction inconnue (6,5 points)
Soit la fonction inconnu suivante :
fonction inconnu (a : entier , b : entier) : entier
Début
p ← 0
Tantque b ≠ 0 faire
p ← p + a * (b mod 2)
b ← b DIV 2
a ← a * 2
FinTantque
retourner p
Fin
Question 1 — Types des objets (0,75 pt)
| Objet | Type |
|---|---|
| a | entier |
| b | entier |
| Retour de la fonction | entier |
Question 2 — TDOL de la fonction inconnu (0,5 pt)
| Objet | Type / Nature |
|---|---|
| p | entier |
Question 3 — Trace d'exécution (4,5 pts)
Avec a = 15 et b = 33.
| N° | Instruction | a | b | p |
|---|---|---|---|---|
| 01 | ··· | ? | ? | ? |
| 02 | ··· | ? | ? | ? |
| 03 | ··· | ? | ? | ? |
| 04 | ··· | ? | ? | ? |
| 05 | ··· | ? | ? | ? |
| 06 | ··· | ? | ? | ? |
| 07 | ··· | ? | ? | ? |
| 08 | ··· | ? | ? | ? |
Question 4 — Rôle de la fonction (0,75 pt)
Exercice 2 — Nombres sublimes (5,5 points)
Exemple : 12 est un nombre sublime. En effet, ses diviseurs (1, 2, 3, 4, 6 et 12) sont au nombre de 6, qui est parfait ; leur somme, 28, est également un nombre parfait.
Algorithme du module principal
Procédure sublime (x : entier)
Début
Diviseurs (x, N, S)
Si parfait(N) et parfait(S) alors
Écrire (x, " est un nombre sublime")
Sinon
Écrire (x, " n'est pas un nombre sublime")
FinSi
Fin
TDOL de la procédure sublime :
| Objet | Type / Nature |
|---|---|
| Diviseurs | procédure |
| parfait | fonction |
| N | entier |
| S | entier |
Procédure Diviseurs
Procédure Diviseurs (x : entier, @N, S : entier)
Début
i ← 1
S ← 0
N ← 0
Tantque (i ≠ x) faire
Si (x mod i = 0) alors
N ← N + 1
S ← S + i
FinSi
i ← i + 1
FinTantque
Fin
TDOL :
| Objet | Type / Nature |
|---|---|
| i | entier |
Fonction parfait
Fonction parfait (n : entier) : booléen
Début
S ← 0
Pour i de 1 à (n-1) faire
Si (n mod i = 0) alors
S ← S + i
FinSi
FinPour
Retourner (n = S)
Fin
TDOL :
| Objet | Type / Nature |
|---|---|
| i | entier |
| S | entier |
Exercice 3 — Cryptage de données (8 points)
Énoncé
L'une des méthodes de cryptage de données est d'envoyer N entiers distincts deux à deux, qui représentent les rangs des lettres majuscules du message.
Pour assurer cette opération de réception et de décryptage du message, on se propose d'écrire une solution algorithmique qui permet de :
- Saisir dans un tableau
Rde tailleNcontenant les rangs du message crypté (avec5 ≤ N ≤ 30). Le rang d'une lettre est un entier compris entre 1 et 26. - Décrypter le message dans une chaîne
Msg, sachant que le code ASCII deAest 65. - Générer un message d'acquittement de la réception du message
ACQde la manière suivante :- Une voyelle est remplacée par le caractère
*. - Une consonne est remplacée par son code ASCII.
- Une voyelle est remplacée par le caractère
- Afficher le message généré ainsi que le message d'acquittement de réception.
Exemple
| R | 16 | 25 | 20 | 8 | 15 | 14 |
|---|---|---|---|---|---|---|
| indice | 0 | 1 | 2 | 3 | 4 | 5 |
- Le message décrypté est :
"PYTHON" - L'acquittement du mot
"PYTHON"est :"80*8272*78"
En effet, le code ASCII de P est 80, de T est 82, de H est 72 et de N est 78. Y et O sont deux voyelles, elles sont remplacées par *.
Question 1 — Décomposition modulaire (« cryptage »)
Algorithme cryptage
Début
Remplissage (N, R)
Msg ← cryptage_msg (N, R)
ACQ ← générer (Msg)
Écrire ("Le message décrypté est : ", Msg, " l'acquittement du mot ", Msg, " est : ", ACQ)
Fin
TDOG (Tableau de Déclaration des Objets Globaux) :
| Objet | Type / Nature |
|---|---|
| ACQ | chaîne |
| Msg | chaîne |
| R | tab |
| N | entier |
| Remplissage | procédure |
| cryptage_msg | fonction |
| générer | fonction |
TDNT (Tableau de Déclaration des Nouveaux Types) :
| Type | Description |
|---|---|
| tab | tableau de 30 entiers |
Question 2 — Algorithmes des modules
Procédure Remplissage
Procédure Remplissage (@N : entier, @R : tab)
Début
Répéter
Écrire ("Saisir le nombre de lettres à saisir"), lire (N)
Jusqu'à (5 ≤ N ≤ 30)
Répéter
Écrire ("Saisir le 1er chiffre"), lire (R[0])
Jusqu'à (1 ≤ R[0] ≤ 26)
Pour i de 1 à (N-1) faire
Répéter
Écrire ("Saisir le chiffre de la case n°", i+1), lire (R[i])
Jusqu'à distinct (R, i) et (1 ≤ R[i] ≤ 26)
FinPour
Fin
TDOL :
| Objet | Type / Nature |
|---|---|
| distinct | fonction |
| i | entier |
Fonction distinct
Fonction distinct (R : tab, x : entier) : booléen
Début
i ← 0
Tantque (R[i] ≠ R[x]) et (i ≠ x) faire
i ← i + 1
FinTantque
Retourner (i = x)
Fin
TDOL :
| Objet | Type / Nature |
|---|---|
| i | entier |
Fonction cryptage_msg
Fonction cryptage_msg (N : entier, R : tab) : chaîne de caractères
Début
Msg ← ""
Pour i de 0 à (N-1) faire
Msg ← Msg + chr (ord(R[i]) + 64)
FinPour
Retourner (Msg)
Fin
TDOL :
| Objet | Type / Nature |
|---|---|
| Msg | chaîne |
| i | entier |
Fonction générer
Fonction générer (Msg : chaîne) : chaîne de caractères
Début
ACQ ← ""
Pour i de 0 à (long(Msg) - 1) faire
Si Msg[i] ∈ ["A", "O", "U", "I", "Y", "E"] alors
ACQ ← ACQ + "*"
Sinon
ASS ← convch (ord(Msg[i]))
ACQ ← ACQ + ASS
FinSi
FinPour
Retourner (ACQ)
Fin
TDOL :
| Objet | Type / Nature |
|---|---|
| i | entier |
| ACQ | chaîne |
| ASS | chaîne |
À partir des trois exercices ci-dessus, entraînez-vous à :
- Tracer l'exécution de la fonction
inconnuavec d'autres couples(a, b)(essayez par exemple(7, 13)et vérifiez que vous obtenez bien7 × 13 = 91). - Écrire la version Pascal de la procédure
sublimeet tester avec les premiers nombres sublimes. - Implémenter en Python la fonction
généreret tester sur la chaîne"PYTHON"afin de retrouver"80*8272*78".
Voir le corrigé
Indications :
- Pour
inconnu(7, 13): 13 = 1101₂, donc on additionne 7 (b=13 impair) + 28 (b=3 impair) + 56 (b=1 impair) = 91. ✓ - En Pascal, on utilisera
function parfait(n: integer): boolean;etprocedure diviseurs(x: integer; var N, S: integer);. La conditionparfait(N) and parfait(S)reste identique. - En Python :
def generer(msg): acq = "" for c in msg: if c in "AEIOUY": acq += "*" else: acq += str(ord(c)) return acq print(generer("PYTHON")) # 80*8272*78