Aller au contenu principal
BacInfo

Ch. 05 · Leçon 1

Mini-projets : PGCD, nombres premiers et vaccination

90 minanalyse · pascal · python

Ce que vous saurez faire

  • Concevoir des algorithmes itératifs combinant boucles et conditions
  • Décomposer un problème en sous-programmes (fonctions et procédures)
  • Manipuler des tableaux pour stocker et rechercher des données
  • Distinguer paramètre formel / effectif et passage par valeur / par variable
  • Implémenter en Python des algorithmes classiques (PGCD, primalité, décomposition)

id: 33-868-mini-projets-pgcd-premier-vaccination slug: 33-868-mini-projets-pgcd-premier-vaccination titre: 'Mini-projets : PGCD, nombres premiers et vaccination' chapitre: 5 chapitre_titre: Mini-projets et exercices de synthèse lecon: 1 niveau: 4eme-sci ordre: 1 prerequis:

  • structures-iteratives
  • tableaux
  • sous-programmes
  • chaines-de-caracteres duree_estimee_min: 90 mots_cles:
  • pgcd
  • nombres premiers
  • decomposition
  • facteurs premiers
  • tableaux
  • modules
  • sous-programmes
  • vaccination langages:
  • analyse
  • pascal
  • python objectifs:
  • Concevoir des algorithmes itératifs combinant boucles et conditions
  • Décomposer un problème en sous-programmes (fonctions et procédures)
  • Manipuler des tableaux pour stocker et rechercher des données
  • Distinguer paramètre formel / effectif et passage par valeur / par variable
  • Implémenter en Python des algorithmes classiques (PGCD, primalité, décomposition) status: published source_pdf: 33_868.pdf source_pages:
  • 1
  • 2
  • 3
  • 4
  • 5 kind: recueil

Cette série de mini-projets met en pratique les structures itératives, les tableaux et les sous-programmes à travers des problèmes concrets : jeu de devinette, analyse de chaînes, calcul de PGCD, détection de nombres premiers et gestion d'une liste d'inscrits à une campagne de vaccination.

Exercice 1 — Deviner un nombre aléatoire

Exercice 1
Jeu : deviner un nombre entre 1 et 100

Écrire un algorithme puis une implémentation en Python permettant de deviner un nombre x choisi aléatoirement entre 1 et 100. L'utilisateur dispose de 10 essais maximum. À chaque essai, on indique si le nombre proposé est plus petit, plus grand ou égal au nombre cherché. Au bout de 10 essais sans trouver, afficher « Perdu ! » et le nombre à trouver.

Algorithme nombre
Début
    X ← Aléa(1,100)
    Nb ← 0
    Répéter
        Nb ← nb+1
        Ecrire("Donner un entier entre 1 et 100:"), Lire(y)
        Si x=y alors Ecrire("Bravo")
        Sinon si y>x alors Ecrire("Plus petit")
        Sinon Ecrire("Plus grand")
        Finsi
    Jusqu'à (x=y) ou (nb=10)
    Si x≠y alors Ecrire("Perdu !, le nombre à trouver=", x)
    Finsi
Fin

Déclaration des objets

ObjetType/Nature
x, y, nbentier

Exercice 2 — Compter voyelles et consonnes

Exercice 2
Compter les voyelles puis les consonnes d'une chaîne

Soit l'algorithme permettant de compter le nombre de voyelles dans une chaîne ch. Donner ensuite une implémentation en Python, puis ajouter le cas du comptage des consonnes.

Comptage des voyelles seules

Algorithme Lettres
Début
    Ecrire("Donner ch="), lire(ch)
    Nb ← 0
    Pour i de 0 à long(ch)-1 faire
        Si Majus(ch[i]) dans ["A","E","I","O","U","Y"] alors
            nb ← nb+1
        Finsi
    FinPour
    Ecrire('Le nombre de voyelles=', nb)
Fin
ObjetType/Nature
chchaîne
i, nbentier

Comptage des voyelles ET des consonnes

Algorithme Lettres2
Début
    Ecrire("Donner ch="), lire(ch)
    Nb ← 0
    nbc ← 0
    Pour i de 0 à long(ch)-1 faire
        Si Majus(ch[i]) dans ["A","E","I","O","U","Y"] alors
            nb ← nb+1
        Sinon si Majus(ch[i]) dans ["A".."Z"] alors
            nbc ← nbc+1
        Finsi
    FinPour
    Ecrire('Le nombre de voyelles=', nb)
    Ecrire('Le nombre de consonnes=', nbc)
Fin
ObjetType/Nature
chchaîne
i, nb, nbcentier

Exercice 3 — Chaîne composée uniquement de chiffres

Exercice 3
Vérifier si une chaîne contient uniquement des chiffres

Écrire un script Python et un algorithme qui permet de saisir une chaîne, puis d'afficher si elle est composée uniquement de chiffres — sans utiliser la méthode isdigit().

Algorithme Chiffres
Début
    Ecrire("Donner une chaine= ")
    Lire(ch)
    nb ← 0
    pour i de 0 à long(ch)-1 faire
        si (ch[i]) ∈ ["0".."9"] alors
            nb ← nb+1
        Finsi
    Finpour
    si nb = long(ch) alors
        Ecrire(ch, "est composée uniquement de chiffres")
    Sinon
        Ecrire(ch, "n'est pas composée uniquement de chiffres")
    Finsi
Fin
ObjetType/Nature
chchaîne
i, nbentier

Variantes avec isdigit()

# Solution 1 : caractère par caractère
ch = input('Donner une chaine=')
nb = 0
for i in range(len(ch)):
    if ch[i].isdigit():        # équivalent à "0" <= ch[i] <= "9"
        nb = nb+1
if len(ch) == nb:
    print(ch, ' est composée uniquement de chiffres')
else:
    print(ch, " n'est pas composée uniquement de chiffres")
# Solution 2 : sur la chaîne entière
ch = input('Donner une chaine=')
if ch.isdigit():
    print(ch, ' est composée uniquement de chiffres')
else:
    print(ch, " n'est pas composée uniquement de chiffres")

Exercice 4 — Moyenne et maximum d'une classe

Exercice 4
Moyenne d'une classe

Écrire un script Python puis un algorithme permettant de calculer la moyenne d'une classe de n élèves.

Exemple :

Nbre élèves = 3
Moyenne = 10.5
Moyenne = 13.2
Moyenne = 18
La moyenne de la classe = 13.91
Algorithme Moyenne
Début
    Ecrire("Nbre élèves=")
    Lire(n)
    Pour i de 0 à n-1 faire
        Ecrire("Moyenne=")
        Lire(T[i])
    Finpour
    S ← 0
    Pour i de 0 à n-1 faire
        S ← S+T[i]
    FinPour
    Moy ← S/n
    Ecrire("moy classe=", Moy)
Fin

TDO

ObjetType/Nature
i, nentier
Ttableau de n réels
S, moyréel

Variante : calcul du maximum (meilleure moyenne)

Exercice 4 bis
Meilleure moyenne de la classe

Écrire un script Python puis un algorithme permettant de calculer la meilleure moyenne dans une classe.

Algorithme Maximum
Début
    Ecrire("Nbre élèves=")
    Lire(n)
    Pour i de 0 à n-1 faire
        Ecrire("Moyenne=")
        Lire(T[i])
    Finpour
    Max ← T[0]
    Pour i de 1 à n-1 faire
        Si T[i] > max alors
            Max ← T[i]
        Finsi
    FinPour
    Ecrire("Le max=", Max)
Fin
ObjetType/Nature
i, nentier
Ttableau de n réels
Maxréel

Exercice 5 — PGCD pour un barreaudage de fenêtre

Exercice 5
Calcul du PGCD par la méthode des différences

On veut poser un barreaudage pour une fenêtre de longueur L et de hauteur H, de manière que la distance maximale D entre les barreaux soit identique sur toute la longueur et sur toute la hauteur.

Solution : calculer le PGCD (Plus Grand Commun Diviseur) de L et H.

Travail à faire : écrire un algorithme puis un script Python permettant de saisir 2 entiers (L et H en cm), de calculer leur PGCD à l'aide d'un module dédié, puis d'afficher la distance maximale D entre les barreaux équidistants.

Exemple : PGCD(15, 27)

Trace d'exécution
0 / 6
Instructionab
01···??
02···??
03···??
04···??
05···??
06···??
Algorithme barreaudage
DEBUT
    Ecrire("L="), Lire(L)
    Ecrire("H="), Lire(H)
    Ecrire("Distance D=", pgcd(L,H))
FIN

Fonction pgcd(a, b : entier) : entier
DEBUT
    Tant que a ≠ b faire
        Si a > b alors a ← a-b Finsi
        Si b > a alors b ← b-a Finsi
    FinTantQue
    Retourner a
FIN

TDO

ObjetType/Nature
L, Hentier
pgcdfonction

Exercice 6 — Nombres premiers entre 1 et 99

Exercice 6
Détecter et lister les nombres premiers
  1. Écrire un module Python premier(n) qui retourne True si n est premier, False sinon.
  2. Afficher tous les entiers premiers entre 1 et 99.
Algorithme nbrpremiers
DEBUT
    Pour i de 1 à 99 faire
        si premier(i) = vrai alors
            Ecrire(i)
        Finsi
    FinPour
FIN

Fonction premier(n : entier) : booléen
DEBUT
    nb ← 0
    Pour i de 1 à n faire
        Si n mod i = 0 Alors nb ← nb+1 Finsi
    FinPour
    Retourner nb = 2
FIN

TDO globaux

ObjetType/Nature
ientier
premierfonction

TDO locaux (premier)

ObjetType/Nature
i, nbentier

Exercice 7 — Décomposition en facteurs premiers

Exercice 7
Décomposition en produit de facteurs premiers

Écrire l'algorithme d'un programme qui cherche puis affiche la décomposition en produit de facteurs premiers d'un entier n donné.

Exemple : 132 = 2 × 2 × 3 × 11

Trace d'exécution
0 / 7
Instructionniaffichage
01···???
02···???
03···???
04···???
05···???
06···???
07···???
Algorithme facteurs
DEBUT
    Ecrire("n à décomp=")
    Lire(n)
    afficher_fact(n)
FIN

Procédure afficher_fact(n : entier)
DEBUT
    i ← 2
    Répéter
        Tant que n mod i = 0 faire
            Ecrire(i)
            n ← n div i
        FinTantque
        i ← i+1
    Jusqu'à n = 1
FIN

TDO

ObjetType/Nature
nentier
afficher_factprocédure

TDO locaux

ObjetType/Nature
ientier

Exercice 8 — Décomposition stockée dans un tableau

Exercice 8
Décomposition avec stockage dans un tableau

Modifier le programme de l'exercice 7 pour :

  1. Saisir un entier n entre 10 et 1000 (avec contrôle de saisie),
  2. Remplir un tableau T avec les facteurs premiers de n,
  3. Afficher la décomposition à partir de T.

Le problème sera décomposé en trois modules : Saisir, Remplir_fact, Afficher_fact.

Algorithme principal et procédures

Algorithme Décomposition
DEBUT
    Saisir(n)
    Remplir_fact(T, i, n)
    Afficher_fact(T, i)
FIN

Nouveaux Types
    TAB = tableau de 10 entiers

T.D.O. globaux

ObjetType/Nature
i, nEntier
TTAB
Saisir, remplir_fact, afficher_factProcédures
Procédure saisir(@n : entier)
DEBUT
    Répéter
        Ecrire("Donner un entier (entre 10 et 1000)=")
        lire(n)
    Jusqu'à n >= 10 et n <= 1000
FIN
Procédure Remplir_fact(@T : tab, @j : entier, x : entier)
DEBUT
    i ← 2
    j ← -1
    tantque x ≠ 1 faire
        si x mod i = 0 alors
            j ← j+1
            T[j] ← i
            x ← x div i
        sinon
            i ← i+1
        Finsi
    FinTantque
FIN

T.D.O. locaux : i : Entier

Procédure afficher_fact(T : tab, j : entier)
DEBUT
    Pour i de 0 à j-1 faire
        Ecrire(T[i], "x")
    Finpour
    Ecrire(T[j])
FIN

T.D.O. locaux : i : Entier

Implémentation Python

from numpy import *

def saisir():
    while True:
        n = int(input('Donner n à décomposer='))
        if 10 <= n <= 1000:
            break
    return n

def remplir_fact(x):
    i = 2
    j = -1
    while x != 1:
        if x % i == 0:
            j = j+1
            T[j] = i
            x = x//i
        else:
            i = i+1
    return T, j

def afficher_fact(T, j):
    for i in range(j):
        print(T[i], 'x', end=' ')
    print(T[j])

T = array([int()]*10)
n = saisir()
T, i = remplir_fact(n)
afficher_fact(T, i)

Exercice 9 — Inscription à la campagne de vaccination

Exercice 9
Liste d'inscrits sans doublon (covid-19)

On souhaite réaliser un programme d'inscription à la campagne de vaccination contre le covid-19. Le script saisit un numéro d'identification et le stocke dans un tableau ID :

  • Si le numéro n'existe pas dans le tableau, il est ajouté ;
  • Si le numéro existe déjà, il n'est pas ajouté et on demande un autre numéro.

Exemple d'exécution :

Donner le nombre de personnes = 3
Donner ID n°0 : 09990999
Donner ID n°1 : 08888888
Donner ID n°2 : 08888888    ← déjà saisi, refusé
Donner ID n°2 : 07777777

Travail à faire : écrire un algorithme puis un script Python permettant de saisir n puis les numéros ID (chaînes de caractères) à inscrire dans un tableau ID.

Fonction de recherche

Fonction chercher(x : entier, T : TAB, n : Entier) : booléen
DEBUT
    Trouve ← faux
    i ← 0
    Répéter
        Si T[i] = x alors trouve ← vrai Finsi
        i ← i+1
    Jusqu'à trouve ou i = n
    Retourner trouve
FIN
ObjetType/Nature
TrouveBooléen
ientier

Remplissage du tableau ID avec contrôle des doublons

DEBUT
    Ecrire("Donner le nombre de personnes"), lire(n)
    Ecrire("Donner ID n°0:"), lire(ID[0])
    Pour i de 1 à n-1 faire
        Répéter
            Ecrire("Donner ID n°", i, ":"), lire(ID[i])
        Jusqu'à chercher(ID[i], ID, i) = faux
    FinPour
FIN

Nouveau type : TAB = tableau de n chaînes

T.D.O.

ObjetType/Nature
n, iEntier
chercherFonction
IDTAB

Extension : contrôle de saisie (8 chiffres exactement)

Exercice 9 bis
Identificateurs à 8 chiffres exactement

Ajouter un contrôle de saisie sur les identificateurs : chaque ID doit être composé de 8 chiffres exactement.

Répéter
    Ecrire("Donner ID n°0:"), lire(ID[0])
Jusqu'à long(ID[0]) = 8 et EstNum(ID[0])

Pour i de 1 à n-1 faire
    Répéter
        Ecrire("Donner ID n°", i, ":"), lire(ID[i])
    Jusqu'à chercher(ID[i], ID, i) = faux
            et long(ID[i]) = 8
            et EstNum(ID[i])
FinPour

Récapitulatif

ExerciceNotion clé travaillée
1Boucle Répéter ... Jusqu'à, génération aléatoire
2Parcours de chaîne, conditions multiples
3Test caractère par caractère, méthodes de chaînes
4Tableaux, somme, recherche du maximum
5Fonction, algorithme du PGCD par différences
6Fonction booléenne, test de primalité
7Procédure, boucles imbriquées, division entière
8Décomposition modulaire, passage par variable / valeur
9Tableau de chaînes, recherche, contrôle de saisie
Vérification des acquis

Quiz : PGCD, nombres premiers, applications

Vérifiez vos connaissances sur les algorithmes arithmétiques classiques au programme.

Quiz (5 questions)

1

Le **PGCD** de deux entiers `a` et `b` peut se calculer par :

2

Un entier `n` est **premier** si :

3

Pour optimiser la **vérification de primalité** d'un nombre `n`, il suffit de tester les diviseurs jusqu'à :

4

Quelle est la **valeur** de `PGCD(15, 27)` ?

5

Quel **type** de structure de données est le plus adapté pour stocker la liste des diviseurs de `n` au fur et à mesure qu'on les trouve ?

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