Aller au contenu principal
BacInfo

Ch. 00 · Leçon 1

Recueil d'exercices : tableaux, chaînes et sous-programmes

180 minanalyse · python

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

Exercice 1
Somme des nombres extraits

É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*s31lhj53?0eAk!rEY21

Alors la somme S = 23 + 15 + 30 + 0 + 21 = 89. Le programme affichera la valeur de S.

Exercice 2 — Cryptage d'une phrase

Exercice 2
Algorithme Codage

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

Exercice 3
Abondant ou déficient

É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

Exercice 4
Vérifier un 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

Exercice 5
Nombres PF

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

Exercice 1
Appels valides ou non

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)

AppelV/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

AppelV/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 expression
  • P(N, T)
  • P(N : Entier ; @T : Tab) ❌ c'est l'entête, pas un appel
  • X ← 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 entier
  • F(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 entier
  • Si F(10, 20, "F") alors Ecrire("OK") ✓ (l'entier 20 sera converti en réel)

Exercice 2 — Rôle de fonctions

Exercice 2
Identifier le rôle de chaque fonction

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.
QuestionF1F2F3F4F5
a. Produit de a par bVFFFF
b. aᵇFVFFF
c. PGCD de a et bFFFVV
d. Somme des entiers de [a, b]FFVFF

Problème — Gestion des discussions d'un groupe

Exercice 3
Adhérents et commentaires

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 :

Indice01234
AOlfaHichem_2018MohamedAmir@Salah20
Indice0123456
M2#Help me3#Help0#Mes salutations2#cours info2#Algo0#OK3#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)

Exercice 1
QCM et corrections d'algorithmes

A. Valider chacune des propositions ci-dessous en mettant V si vrai ou F dans le cas contraire :

  1. 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)
  2. 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
  3. 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âcheProposition
Saisir un entier positif nEcrire(" n = ") Lire(n) Tant que (n<0) faire   Ecrire(" n = ")   Lire(n) Fintantque
Chercher la taille maximale dans un tableau T de taille nI←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înesTrouve←faux Pour i de 0 à n-1 faire   Si T[i]=ch alors     Trouve ← vrai   Finsi Finpour
Voir le corrigé

A.

  1. X ← 2 + aléa(0, 8) ✓ ; X ← 2 + aléa(0, 9) ❌ ; X ← aléa(2, 10)
  2. Tableau : éléments de types différents ❌ ; taille maximale variable ❌ ; indices scalaires ✓
  3. 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âcheCorrection
Saisir un entier positif nRépéter   Ecrire("Saisir n :")   Lire(n) Jusqu'à n ≥ 0
Max d'un tableauI ← 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îneTrouve ← 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)

Exercice 2
Matricules gagnantes au concours

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 :

MAT001254112547993258770055
SCO381129925

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é :

  1. Compléter les déclarations nécessaires pour le programme principal.
  2. Développer le module Remplirmat qui permet de remplir un tableau MAT par N matricules en respectant les contraintes décrites ci-dessus.
  3. Développer le module Remplirscore qui permet de remplir un tableau SCO par N scores en respectant les contraintes décrites ci-dessus.
  4. Développer le module calcul_moysc qui permet de calculer la moysc de ce concours.
  5. 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

Exercice 3
Vérifier un numéro IMEI

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 :

  1. 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.
  2. 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

Exercice TP1
Planning d'activités 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.
  • Saisir une date sous la forme J/M et afficher tous les évènements de cette date.

Exemple : Si N = 5 :

Aid revolution -14/1Discovering-7/3Campagne Nettoyage-12/4Visite Sahara-17/5Campagne 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

Exercice 1
Trouver le rôle d'une fonction

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
  1. Exécuter la fonction pour les valeurs suivantes de x et y :
    • a. x = 10 et y = 2
    • b. x = 6 et y = 6
  2. Quel est le rôle de cette fonction ?
Voir le corrigé

a. x = 10, y = 2 :

Trace d'exécution
0 / 4
InstructionXYS
01···???
02···???
03···???
04···???

b. x = 6, y = 6 :

Trace d'exécution
0 / 5
InstructionXYS
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

Exercice 2
Procédure Somcar à corriger

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
  1. Trouver le résultat fourni par l'algorithme ci-dessus.
  2. Que faut-il ajouter à la procédure Somcar pour avoir un résultat correct ?
  3. Remplacer dans ce programme la procédure par une fonction.
Voir le corrigé
  1. Les paramètres x1, x2, s sont passés par valeur : aucune modification n'est répercutée sur x, y, z. Le programme affiche donc 6 5 0.

  2. 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, seul s doit être passé par variable. De plus, l'algorithme calcule mal la somme des carrés (il devrait être S ← x1*x1 + x2*x2).

Procédure Somcar(x1, x2 : entier ; @s : entier)
Début
    s ← x1*x1 + x2*x2
Fin
  1. 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

Exercice 3
Sous-programmes utilitaires
  1. Écrire l'algorithme d'un sous-programme qui permet de saisir un entier premier.
  2. Écrire l'algorithme d'un sous-programme qui permet de saisir une chaîne de caractères majuscules.
  3. Écrire l'algorithme d'un sous-programme qui permet de saisir une chaîne de caractères numérique.
  4. Écrire l'algorithme d'un sous-programme qui permet de remplir un tableau par 10 entiers distincts deux à deux.
  5. Écrire l'algorithme d'un sous-programme qui permet de remplir un tableau par 10 entiers distincts.
  6. É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

Exercice 4
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

Exercice 5
Affichage sans répétition

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

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

Exercice 7
Fusion sans redondances

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 :

V1478912
V20247101228

Alors le tableau V3 contiendra :

V3024789101228

Exercice 8 — Nombres premiers jumeaux

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

ObjetType/Nature
nentier
ttab
SaisirProcédure
RemplirProcédure
AfficherProcédure

T.D.N.T

Type
Tab = tableau de 10 entier

Application 1 — Divisibilité par 13

Exercice 1
Nombres divisibles par 13 par la méthode du quadruple

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 N entiers 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 :

523124591664416541503

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

Exercice TP2
Mot de passe à partir d'une adresse e-mail

Important :

  1. Une solution modulaire au problème est exigée.
  2. Enregistrer au fur et à mesure votre programme dans le dossier bac2022 se trouvant sur la racine C:\ 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 :

  1. 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 -.
  2. Le caractère @ doit figurer une seule fois juste après le nom d'utilisateur.
  3. domaine et suffixe sont 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

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)

Exercice EP1
Numéro de téléphone et nombre premier

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é :

  1. 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.
  2. Implémenter en Python la fonction Chance dans un programme nommé Jeu0.
  3. Développer une fonction Premier permettant de vérifier si un nombre passé en paramètre est premier ou non, puis l'enregistrer sous le nom Jeu1.
  4. Dans le programme Jeu1, ajouter les instructions permettant :
    • d'appeler l'interface graphique Interface_Jeu en exploitant l'annexe ci-dessous,
    • d'implémenter un module Play qui 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 fonction Chance afin d'afficher le message retourné via un label de l'interface.

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

Exercice TP3
Génération de codes de participants

Important :

  1. Une solution modulaire au problème est exigée.
  2. Enregistrer au fur et à mesure votre programme dans le dossier bac2022 se trouvant sur la racine C:\.

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 :

TNRahmaAyoubAyaAliMohamedBilelMeriemSanaAnis
indice012345678
TGJendoubaMonastirBéjaJendoubaTataouineJendoubaMonastirSfaxSfax
indice012345678

Après génération, le tableau TC :

TCJen01Mon01Béj01Jen02Tat01Jen03Mon02Sfa01Sfa02

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)

Exercice TP4
Mots de passe par substitution

Important :

  1. Une solution modulaire au problème est exigée.
  2. 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 :

  1. 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.
  2. 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.

Exemple :

TRAOUFZERIEBAZIZAFATMARAYENNADIA
indice012345
TMR@0UF3ZERIEB3@ZIZ@3F@TM@2R@YEN3N@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

Exercice S1
Tri des élèves par rang

É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.
Exercice S2
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], 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 :

V1478912
V20247101228

Alors V3 contiendra :

V3024789101228
Exercice S3
Tri par sélection (méthode du minimum ASCII)

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 :

  1. Chercher la lettre qui a le plus petit code ASCII dans T1.
  2. a) Ranger cette lettre dans T2. b) Remplacer cette lettre par "*" dans T1.
  3. 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.
Exercice S4
Tri des numéros de cartes d'identité

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.

Exercice S5
Tri puis insertion d'un mot

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-ROMGRAVEURADSLDISQUETTEFLASH-DISQUE

T après le tri :

ADSLCD-ROMDISQUETTEFLASH-DISQUEGRAVEUR

MOT : 'BUS'

T après l'insertion du mot 'BUS' (résultat à afficher) :

ADSLBUSCD-ROMDISQUETTEFLASH-DISQUEGRAVEUR

Sujet théorique — 4 Sc/M

Exercice n°1 — Analyse d'un programme

Exercice T1
Analyse d'une fonction Inconnue

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 :

  1. À 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émentExemple
Expression booléenne
Fonction prédéfinie
Paramètre formel
Paramètre effectif
  1. Compléter l'entête de la fonction Inconnue par les types appropriés.

  2. Compléter le tableau de déclaration ci-dessous par les types des objets locaux de la fonction Inconnue.

ObjetType/Nature
L
  1. 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
  1. 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"
  2. En déduire le rôle de la fonction Inconnue.

Voir le corrigé
  1. Exemples possibles :
ÉlémentExemple
Expression booléenne(C = "") ou (non L)
Fonction prédéfinieestnum, effacer
Paramètre formelC
Paramètre effectifA
  1. Entête : Fonction Inconnue (C : chaîne de caractères) : Booléen

  2. Tableau de déclaration locale :

ObjetType/Nature
LBooléen
  1. Variables non visibles par le programme principal : C et L (paramètre formel et variable locale).

  2. 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é.
  3. Rôle : la fonction Inconnue retourne vrai si la chaîne est composée uniquement de chiffres, et faux sinon.

Exercice n°2 — Translation d'une chaîne

Exercice T2
Translation d'ordre n

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 translation ch = "rbonjou".
  • Pour ch = "bonjour" et n = 4, on déplace les 4 derniers caractères vers le début, ce qui donne après translation ch = "jourbon".

Questions :

  1. Pour ch = "bac_2022" :

    • n = 6 → ?
    • n = 8 → ?
  2. 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é
  1. 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)
  2. 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)

Exercice T3
Affectation de conteneurs à des 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.156.183.03.22.59.828.715.30
01234567

Après tri décroissant de T :

9.828.717.156.185.303.23.02.5
01234567

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 :

  1. un algorithme du programme principal solution à ce problème, en le décomposant en modules,
  2. 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).

Indice0123456
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"

Indice0123456
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

QuestionPoints
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 :

  1. Saisir un prénom (une chaîne de lettres),
  2. Faire la somme des codes ASCII de chaque lettre,
  3. 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 ASCII799910197110101

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 Tel par 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 Som par 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éro Tel[i]).
    • ✓ Si la somme est un nombre pair, la placer dans le tableau Som.
    • ✓ Sinon Som[i] reçoit 0.
  • 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

Indice0123456
Tel95874663945568429587865594743678951127339312012095560300
Som48004801828

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 :

Indice01234
T1249614288154721453614264

Par exemple, les diviseurs propres de 15472 sont : 1, 2, 4, 8, 16, 967, 1934, 3868, 7736 — la somme est égale à 14536.

Travail demandé

  1. Analyser le problème en le décomposant en modules.
  2. É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

QuestionPoints
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é

  1. Traduire l'algorithme Plagiat en un programme Pascal et ajouter les déclarations nécessaires puis enregistrer le programme sous le nom "Plagiat0".

  2. 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âchePoints
1) Traduction de l'algorithme Plagiat en Pascal et ajout des déclarations4.5
2a) Développement du module Saisir5.5
2b) Développement du module Nbmots3.5
2c) Développement du module Commun5
2d) Vérification et affichages nécessaires1.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é

  1. Concevoir une interface graphique comme illustré ci-dessus et l'enregistrer dans votre dossier de travail sous le nom "Interface_superpremier".

  2. Implémenter en Python la fonction aff_superpremier dans un programme et l'enregistrer sous le nom "superpremier_1".

  3. Développer la fonction superpremier permettant 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".

  4. 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 fonction aff_superpremier afin d'afficher le message retourné via un label de l'interface "Interface_superpremier".

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âchePoints
Création de l'interface2
Implémentation aff_superpremier2
Module superpremier4
Module premier4
Module verif4
Connexion à l'interface4

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é

  1. Concevoir une interface graphique comme illustré ci-dessus et l'enregistrer sous le nom "Interface_play".

  2. Implémenter en Python la fonction "convB" dans un programme et l'enregistrer sous le nom "play", dans votre dossier de travail.

  3. Développer la fonction "Premier" permettant de vérifier si un nombre, passé comme paramètre, est premier ou non.

  4. 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".

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é

  1. Concevoir une interface graphique comme illustré ci-dessus et l'enregistrer sous le nom "Interface_produit".

  2. Implémenter en Python la fonction "Resultat" dans un programme et l'enregistrer sous le nom "test0", dans votre dossier de travail.

  3. 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".

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é

Exercice TP4
Nombre Rigolo — Interface graphique
  1. 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.
  2. Implémenter l'algorithme de la fonction Message en Python puis enregistrer le programme sous le nom Rigolo0.
  3. 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.
  4. 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é

Exercice DC3-1
Recherche d'un mot dans un texte
  1. Implémenter l'algorithme RECHERCHER en Python puis enregistrer le programme sous le nom cherche0.

  2. Transformer ce programme en un module nommé CHERCHE, puis l'appeler et l'enregistrer sous le nom cherche1.

  3. 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.

  4. Concevoir une interface graphique comme le modèle ci-dessus et l'enregistrer sous le nom Interface_recherche.

  5. 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âchePoints
Implémentation de l'algorithme RECHERCHER en Python4
Enregistrement du programme sous le nom cherche01
Transformation du programme en un module nommé CHERCHE2
Développement du module verif_11.5
Développement du module verif_22.5
Conception et enregistrement de l'interface graphique3
Intégration de l'interface graphique dans le programme5
Enregistrement du programme cherche11

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é

Exercice Palin
Suite palindromique

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é

Exercice Bac-Cryptage
Application de cryptage
  1. Concevoir une interface graphique comme illustré et l'enregistrer sous le nom Interface_cryptage.
  2. Implémenter en Python la fonction cryptage dans un programme et l'enregistrer sous le nom Prog_Cryptage.
  3. 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.
  4. 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.
  5. 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é

Exercice DC-Oblong
Vérification d'un nombre oblong
  1. Concevoir une interface graphique comme illustré et l'enregistrer sous le nom Interface_oblong.
  2. Implémenter en python la fonction affichage dans un programme et l'enregistrer sous le nom oblong_1.
  3. 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.
  4. 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

Exercice Rev1
Le nombre Fort
  1. Concevoir une interface graphique comme illustrée, puis l'enregistrer dans votre dossier de travail sous le nom fort.ui.
  2. 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.
  3. 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

SaisieMessage affiché
0Veuillez introduire un nombre > 0
6464 est super-pairplus
2828 n'est pas super-pairplus

Travail demandé

Exercice Bac-SuperPairplus
Le nombre super-pairplus
  1. Concevoir une interface graphique comme illustrée et l'enregistrer sous le nom InterfaceSuperPairplus.
  2. Créer un programme Python et l'enregistrer sous le nom NbrSuperPairplus.
  3. Développer dans le programme NbrSuperPairplus une fonction SuperPairplus(N) qui permet de vérifier si un entier N est super-pairplus ou non.
  4. 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âchesPoints
Conception de l'interface InterfaceSuperPairplus4
Création et enregistrement du programme NbrSuperPairplus1
Développement de la fonction SuperPairplus6
Ajout des instructions d'appel de l'interface InterfaceSuperPairplus2
Développement du module Play4
Importation des bibliothèques nécessaires, modularité et cohérence3

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)

ObjetType
aentier
bentier
Retour de la fonctionentier

Question 2 — TDOL de la fonction inconnu (0,5 pt)

ObjetType / Nature
pentier

Question 3 — Trace d'exécution (4,5 pts)

Avec a = 15 et b = 33.

Trace d'exécution
0 / 8
Instructionabp
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 :

ObjetType / Nature
Diviseursprocédure
parfaitfonction
Nentier
Sentier

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 :

ObjetType / Nature
ientier

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 :

ObjetType / Nature
ientier
Sentier

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 R de taille N contenant les rangs du message crypté (avec 5 ≤ 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 de A est 65.
  • Générer un message d'acquittement de la réception du message ACQ de la manière suivante :
    • Une voyelle est remplacée par le caractère *.
    • Une consonne est remplacée par son code ASCII.
  • Afficher le message généré ainsi que le message d'acquittement de réception.

Exemple

R16252081514
indice012345
  • 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) :

ObjetType / Nature
ACQchaîne
Msgchaîne
Rtab
Nentier
Remplissageprocédure
cryptage_msgfonction
générerfonction

TDNT (Tableau de Déclaration des Nouveaux Types) :

TypeDescription
tabtableau 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 :

ObjetType / Nature
distinctfonction
ientier

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 :

ObjetType / Nature
ientier

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 :

ObjetType / Nature
Msgchaîne
ientier

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 :

ObjetType / Nature
ientier
ACQchaîne
ASSchaîne

Exercice Bilan
Tester vos acquis

À partir des trois exercices ci-dessus, entraînez-vous à :

  1. Tracer l'exécution de la fonction inconnu avec d'autres couples (a, b) (essayez par exemple (7, 13) et vérifiez que vous obtenez bien 7 × 13 = 91).
  2. Écrire la version Pascal de la procédure sublime et tester avec les premiers nombres sublimes.
  3. Implémenter en Python la fonction générer et tester sur la chaîne "PYTHON" afin de retrouver "80*8272*78".
Voir le corrigé

Indications :

  1. Pour inconnu(7, 13) : 13 = 1101₂, donc on additionne 7 (b=13 impair) + 28 (b=3 impair) + 56 (b=1 impair) = 91. ✓
  2. En Pascal, on utilisera function parfait(n: integer): boolean; et procedure diviseurs(x: integer; var N, S: integer);. La condition parfait(N) and parfait(S) reste identique.
  3. 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
    

Bravo d'être arrivé jusqu'ici. Marquez la leçon terminée pour ancrer le progrès.