EVALUATION EN ALGORITHMIQUE TEST 04/ xx
CORRECTION
Exercice 1 : Super Marché Genius 01
1) Schéma (Produit) pour les valeurs données
- code = "OXCFA"
- nomProd = "Tapioca"
- descriptProd = "Le sauveur"
- prixProd = 50
- qteProd = 10
- notationProd = 5
2) Structure de données en mémoire
Const MAXP = 1000 ;
Type Produit = Enregistrement
c : chaine ; // code
n : chaine ; // nom
d : chaine ; // description
p : reel ; // prix
q : reel ; // quantité
r : reel ; // notation
Fin ;
Type Stock = tableau[1..MAXP] de Produit ;
3) Recherche d’un produit (par code)
Fonction RechProd(S : Stock, nb : entier, cle : chaine) : entier
Var i : entier ;
Debut
i <- 1 ;
Tantque (i <= nb) et (S[i].c <> cle) Faire
i <- i + 1 ;
FinTantque
Si i <= nb Alors
RechProd <- i
Sinon
RechProd <- -1
FinSi
Fin ;
4) Insertion d’un produit (ajout en fin si place)
Procedure InsertProd(Var S : Stock, Var nb : entier, x : Produit)
Debut
Si nb = MAXP Alors
Ecrire("Stock plein") ;
Sinon
nb <- nb + 1 ;
S[nb] <- x ;
FinSi
Fin ;
5) Compter les produits dont le nom = "Tapioca"
Fonction CompteNom(S : Stock, nb : entier, nomCible : chaine) : entier
Var i, cpt : entier ;
Debut
cpt <- 0 ;
Pour i de 1 a nb Faire
Si S[i].n = nomCible Alors
cpt <- cpt + 1 ;
FinSi
FinPour
CompteNom <- cpt ;
Fin ;
6) Trier par ordre croissant (Tri bulle sur le prix)
Procedure TriBulle_Prix(Var S : Stock, nb : entier)
Var i, j : entier ; tmp : Produit ;
Debut
Pour i de 1 a nb-1 Faire
Pour j de 1 a nb-i Faire
Si S[j].p > S[j+1].p Alors
tmp <- S[j] ;
S[j] <- S[j+1] ;
S[j+1] <- tmp ;
FinSi
FinPour
FinPour
Fin ;
7) Supprimer tous les produits dont le nom = "Tapioca"
Procedure SupprimeNom(Var S : Stock, Var nb : entier, nomCible : chaine)
Var i, k : entier ;
Debut
i <- 1 ;
Tantque i <= nb Faire
Si S[i].n = nomCible Alors
Pour k de i a nb-1 Faire
S[k] <- S[k+1] ;
FinPour
nb <- nb - 1 ;
Sinon
i <- i + 1 ;
FinSi
FinTantque
Fin ;
8) Modifier un produit (par code)
Procedure ModifProd(Var S : Stock, nb : entier, cle : chaine, nouv : Produit)
Var pos : entier ;
Debut
pos <- RechProd(S, nb, cle) ;
Si pos = -1 Alors
Ecrire("Introuvable") ;
Sinon
S[pos] <- nouv ;
FinSi
Fin ;
9) Afficher les produits les plus vendus (notation entre 2.5 et 5)
Procedure AfficheSucces(S : Stock, nb : entier)
Var i : entier ;
Debut
Pour i de 1 a nb Faire
Si (S[i].r >= 2.5) et (S[i].r <= 5) Alors
Ecrire(S[i].c, " | ", S[i].n, " | note=", S[i].r) ;
FinSi
FinPour
Fin ;
10) Sauvegarde permanente (fichier)
Type FProd = fichier de Produit ;
Procedure SauvStock(f : FProd, S : Stock, nb : entier)
Var i : entier ;
Debut
OuvrirEcriture(f) ;
Pour i de 1 a nb Faire
Ecrire(f, S[i]) ;
FinPour
Fermer(f) ;
Ecrire("Sauvegarde terminee") ;
Fin ;
Exercice 2 : Top Secret
1) Enregistrement BinaireSecret
Const n = 4 ;
Type MatB = tableau[1..n, 1..n] de entier ; // 0/1
Type BinaireSecret = Enregistrement
secret : MatB ;
Flag : booleen ;
Fin ;
Type VDec = tableau[1..n] de entier ;
2) Déchiffrer (ligne binaire -> décimal dans top)
Procedure Dechiffrer(B : BinaireSecret, Var top : VDec)
Var i, j, val : entier ;
Debut
Pour i de 1 a n Faire
val <- 0 ;
Pour j de 1 a n Faire
val <- val * 2 + B.secret[i,j] ; // bit fort en j=1
FinPour
top[i] <- val ;
FinPour
Fin ;
3) Vérifier (recalculer et comparer)
Procedure Verifier(Var B : BinaireSecret, top : VDec)
Var i, j, val : entier ; ok : booleen ;
Debut
ok <- Vrai ;
i <- 1 ;
Tantque (i <= n) et ok Faire
val <- 0 ;
Pour j de 1 a n Faire
val <- val * 2 + B.secret[i,j] ;
FinPour
Si val <> top[i] Alors ok <- Faux FinSi
i <- i + 1 ;
FinTantque
B.Flag <- ok ;
Fin ;
4) Tri décroissant (sélection)
Procedure TriDecimal_Decroissant(Var top : VDec)
Var i, j, imax, tmp : entier ;
Debut
Pour i de 1 a n-1 Faire
imax <- i ;
Pour j de i+1 a n Faire
Si top[j] > top[imax] Alors imax <- j FinSi
FinPour
tmp <- top[i] ; top[i] <- top[imax] ; top[imax] <- tmp ;
FinPour
Fin ;
5) Affichage format [a,b,c,d]
Procedure AfficheDecimal(top : VDec)
Var i : entier ;
Debut
Ecrire("[", top[1]) ;
Pour i de 2 a n Faire
Ecrire(",", top[i]) ;
FinPour
Ecrire("]") ;
Fin ;
6) Algorithme global demandé
Algorithme TopSecret_Main ;
Const n = 4 ;
Var B : BinaireSecret ; top : VDec ;
i, j, x : entier ;
Debut
Pour i de 1 a n Faire
Pour j de 1 a n Faire
Repeter
Ecrire("Entrer Secret[",i,",",j,"] (0/1) : ") ;
Lire(x) ;
Jusqu'a (x=0) ou (x=1) ;
B.secret[i,j] <- x ;
FinPour
FinPour
Dechiffrer(B, top) ;
Verifier(B, top) ;
Si B.Flag Alors
Ecrire("Correspondance OK") ;
Sinon
Ecrire("Correspondance NON") ;
FinSi
TriDecimal_Decroissant(top) ;
AfficheDecimal(top) ;
Fin.
7) Stockage sur CD-ROM (structure)
Type FSecret = fichier de BinaireSecret ;
Type FTop = fichier de VDec ;
Exercice 3 : Arbre de Noël 2020
1) Structure Sapin
Const MAXS = 500 ;
Type Sapin = Enregistrement
id : chaine ;
age : entier ; // 0 vieux, 1 neuf
coul : chaine ;
tail : reel ;
espece : chaine ;
deco : chaine ;
nat : booleen ; // Vrai=naturel, Faux=artificiel
poids : reel ;
prix : reel ;
prov : chaine ;
Fin ;
Type EnsSapin = tableau[1..MAXS] de Sapin ;
2) Tous naturels ? (selon nat)
Fonction TousNaturels(T : EnsSapin, nb : entier) : booleen
Var i : entier ; ok : booleen ;
Debut
ok <- Vrai ;
i <- 1 ;
Tantque (i <= nb) et ok Faire
Si T[i].nat = Faux Alors ok <- Faux FinSi
i <- i + 1 ;
FinTantque
TousNaturels <- ok ;
Fin ;
3) Tri insertion sur age (0 puis 1)
Procedure TriInsertion_Age(Var T : EnsSapin, nb : entier)
Var i, j : entier ; key : Sapin ;
Debut
Pour i de 2 a nb Faire
key <- T[i] ;
j <- i - 1 ;
Tantque (j >= 1) et (T[j].age > key.age) Faire
T[j+1] <- T[j] ;
j <- j - 1 ;
FinTantque
T[j+1] <- key ;
FinPour
Fin ;
4) Ensemble des sapins
Solution : un tableau EnsSapin + une variable nb (nombre courant).
5) Question 2 avec l’ensemble
Utiliser TousNaturels(T, nb).
6) Tri bulle sur age (0 -> 1)
Procedure TriBulle_Age(Var T : EnsSapin, nb : entier)
Var i, j : entier ; tmp : Sapin ;
Debut
Pour i de 1 a nb-1 Faire
Pour j de 1 a nb-i Faire
Si T[j].age > T[j+1].age Alors
tmp <- T[j] ; T[j] <- T[j+1] ; T[j+1] <- tmp ;
FinSi
FinPour
FinPour
Fin ;
7) Lister tous les champs d’un sapin
Procedure AfficheSapin(x : Sapin)
Debut
Ecrire("id=",x.id," age=",x.age," coul=",x.coul," tail=",x.tail) ;
Ecrire("espece=",x.espece," deco=",x.deco," nat=",x.nat) ;
Ecrire("poids=",x.poids," prix=",x.prix," prov=",x.prov) ;
Fin ;
8) Rechercher par identificateur
Fonction RechSapin(T : EnsSapin, nb : entier, cle : chaine) : entier
Var i : entier ;
Debut
i <- 1 ;
Tantque (i <= nb) et (T[i].id <> cle) Faire i <- i+1 FinTantque
Si i <= nb Alors RechSapin <- i Sinon RechSapin <- -1 FinSi
Fin ;
9) Ajouter un sapin
Procedure AjoutSapin(Var T : EnsSapin, Var nb : entier, x : Sapin)
Debut
Si nb = MAXS Alors
Ecrire("Ensemble plein") ;
Sinon
nb <- nb + 1 ;
T[nb] <- x ;
FinSi
Fin ;
10) Rechercher Picea abies (taille = 60 m)
Procedure RechPiceaAbies(T : EnsSapin, nb : entier)
Var i : entier ;
Debut
Pour i de 1 a nb Faire
Si (T[i].espece = "Picea abies") ou (T[i].tail = 60) Alors
AfficheSapin(T[i]) ;
FinSi
FinPour
Fin ;
11) Supprimer tous les Picea abies
Procedure SupprimePicea(Var T : EnsSapin, Var nb : entier)
Var i, k : entier ;
Debut
i <- 1 ;
Tantque i <= nb Faire
Si (T[i].espece = "Picea abies") ou (T[i].tail = 60) Alors
Pour k de i a nb-1 Faire T[k] <- T[k+1] FinPour
nb <- nb - 1 ;
Sinon
i <- i + 1 ;
FinSi
FinTantque
Fin ;
12) Modifier Picea abies -> Omorika
Procedure ModifPiceaEnOmorika(Var T : EnsSapin, nb : entier)
Var i : entier ;
Debut
Pour i de 1 a nb Faire
Si (T[i].espece = "Picea abies") ou (T[i].tail = 60) Alors
T[i].espece <- "Omorika" ;
FinSi
FinPour
Fin ;
13) Compter Omorika
Fonction CompteOmorika(T : EnsSapin, nb : entier) : entier
Var i, cpt : entier ;
Debut
cpt <- 0 ;
Pour i de 1 a nb Faire
Si T[i].espece = "Omorika" Alors cpt <- cpt + 1 FinSi
FinPour
CompteOmorika <- cpt ;
Fin ;
15) Supprimer sapins rouge et noire
Procedure SupprimeCouleurs(Var T : EnsSapin, Var nb : entier)
Var i, k : entier ;
Debut
i <- 1 ;
Tantque i <= nb Faire
Si (T[i].coul = "rouge") ou (T[i].coul = "noire") Alors
Pour k de i a nb-1 Faire T[k] <- T[k+1] FinPour
nb <- nb - 1 ;
Sinon
i <- i + 1 ;
FinSi
FinTantque
Fin ;
16) Support programmable par fusibles
Réponse : PROM (Programmable ROM, mémoire à fusibles).
17) Rechercher tous les Nobilis
Procedure RechNobilis(T : EnsSapin, nb : entier)
Var i : entier ;
Debut
Pour i de 1 a nb Faire
Si T[i].espece = "Nobilis" Alors AfficheSapin(T[i]) FinSi
FinPour
Fin ;
18) Conserver uniquement les Nobilis (simple)
Procedure GardeNobilis(Var T : EnsSapin, Var nb : entier)
Var i, k : entier ;
Debut
i <- 1 ;
Tantque i <= nb Faire
Si T[i].espece <> "Nobilis" Alors
Pour k de i a nb-1 Faire T[k] <- T[k+1] FinPour
nb <- nb - 1 ;
Sinon
i <- i + 1 ;
FinSi
FinTantque
Fin ;
19) Supprimer sapins sans décoration
Procedure SupprimeSansDeco(Var T : EnsSapin, Var nb : entier)
Var i, k : entier ;
Debut
i <- 1 ;
Tantque i <= nb Faire
Si (T[i].deco = "") Alors
Pour k de i a nb-1 Faire T[k] <- T[k+1] FinPour
nb <- nb - 1 ;
Sinon
i <- i + 1 ;
FinSi
FinTantque
Fin ;
20) Compter sapins artificiels de type Nobilis
Fonction CompteArtifNobilis(T : EnsSapin, nb : entier) : entier
Var i, cpt : entier ;
Debut
cpt <- 0 ;
Pour i de 1 a nb Faire
Si (T[i].espece="Nobilis") et (T[i].nat=Faux) Alors
cpt <- cpt + 1 ;
FinSi
FinPour
CompteArtifNobilis <- cpt ;
Fin ;
21) Rechercher provenance="Dschang" OU poids=50
Procedure RechProvOuPoids(T : EnsSapin, nb : entier)
Var i : entier ;
Debut
Pour i de 1 a nb Faire
Si (T[i].prov="Dschang") ou (T[i].poids=50) Alors AfficheSapin(T[i]) FinSi
FinPour
Fin ;
22) Rechercher type="Pungens" provenance="Dschang" OU poids=50
Procedure RechPungens(T : EnsSapin, nb : entier)
Var i : entier ;
Debut
Pour i de 1 a nb Faire
Si (T[i].espece="Pungens") et ((T[i].prov="Dschang") ou (T[i].poids=50)) Alors
AfficheSapin(T[i]) ;
FinSi
FinPour
Fin ;
Exercice 4 : Les Complexes

Type Complexe = Enregistrement
pr : reel ; // partie reelle
pi : reel ; // partie imaginaire
Fin ;
Fonction LireC() : Complexe
Var z : Complexe ;
Debut
Ecrire("Partie reelle : ") ; Lire(z.pr) ;
Ecrire("Partie imaginaire : ") ; Lire(z.pi) ;
LireC <- z ;
Fin ;
Procedure AfficheC(z : Complexe)
Debut
Ecrire(z.pr, " + i(", z.pi, ")") ;
Fin ;
Fonction SommeC(a,b : Complexe) : Complexe
Var r : Complexe ;
Debut
r.pr <- a.pr + b.pr ;
r.pi <- a.pi + b.pi ;
SommeC <- r ;
Fin ;
Fonction DiffC(a,b : Complexe) : Complexe
Var r : Complexe ;
Debut
r.pr <- a.pr - b.pr ;
r.pi <- a.pi - b.pi ;
DiffC <- r ;
Fin ;
Fonction ProdC(a,b : Complexe) : Complexe
Var r : Complexe ;
Debut
r.pr <- a.pr*b.pr - a.pi*b.pi ;
r.pi <- a.pr*b.pi + a.pi*b.pr ;
ProdC <- r ;
Fin ;
Fonction ConjC(z : Complexe) : Complexe
Var r : Complexe ;
Debut
r.pr <- z.pr ;
r.pi <- -z.pi ;
ConjC <- r ;
Fin ;
Fonction EgalC(a,b : Complexe) : booleen
Debut
EgalC <- (a.pr=b.pr) et (a.pi=b.pi) ;
Fin ;
Fonction DivC(a,b : Complexe) : Complexe
Var r : Complexe ; den : reel ;
Debut
den <- b.pr*b.pr + b.pi*b.pi ;
r.pr <- (a.pr*b.pr + a.pi*b.pi) / den ;
r.pi <- (a.pi*b.pr - a.pr*b.pi) / den ;
DivC <- r ;
Fin ;
Exercice 9 : Récursivité

A) Coefficients du binôme C(n,k)
Fonction C(n,k : entier) : entier
Debut
Si (k=0) ou (k=n) Alors
C <- 1
Sinon
C <- C(n-1,k) + C(n-1,k-1)
FinSi
Fin ;
B) Recherche dichotomique récursive
Fonction DichoRec(T : tableau[1..N] de entier, g,d,x : entier) : entier
Var m : entier ;
Debut
Si g > d Alors
DichoRec <- -1
Sinon
m <- (g+d) div 2 ;
Si T[m] = x Alors
DichoRec <- m
Sinon Si x < T[m] Alors
DichoRec <- DichoRec(T, g, m-1, x)
Sinon
DichoRec <- DichoRec(T, m+1, d, x)
FinSi
FinSi
Fin ;
C) Ackermann (récursive)
Fonction Ack(i,j : entier) : entier
Debut
Si i=0 Alors
Ack <- j+1
Sinon Si j=0 Alors
Ack <- Ack(i-1,1)
Sinon
Ack <- Ack(i-1, Ack(i, j-1))
FinSi
Fin ;
Exercice 12 : Nombre Heureux (optimal)

Idée optimale : calculer f(n)=somme des carrés des chiffres, et détecter un cycle avec la méthode de Floyd (lent/rapide).
Fonction Suivant(n : entier) : entier
Var s, r : entier ;
Debut
s <- 0 ;
Tantque n > 0 Faire
r <- n mod 10 ;
s <- s + r*r ;
n <- n div 10 ;
FinTantque
Suivant <- s ;
Fin ;
Fonction EstHeureux(n : entier) : booleen
Var lent, rapide : entier ;
Debut
lent <- n ;
rapide <- Suivant(n) ;
Tantque (rapide <> 1) et (lent <> rapide) Faire
lent <- Suivant(lent) ;
rapide <- Suivant(Suivant(rapide)) ;
FinTantque
EstHeureux <- (rapide = 1) ;
Fin ;
Algorithme NombreHeureux ;
Var n : entier ;
Debut
Ecrire("Entrer n : ") ; Lire(n) ;
Si EstHeureux(n) Alors
Ecrire(n, " est Heureux") ;
Sinon
Ecrire(n, " n'est pas Heureux") ;
FinSi
Fin.
Par Joel_Yk | Contact :+23652027193