correction EVALUATION EN ALGORITHMIQUE TEST 11 / XX
Exercice 01 : 5 pts
1) Calcul de E = (1+2) x (1+2+3) x ... x (1+2+...+N), N ≥ 2
Idee : on calcule progressivement la somme partielle S = 1+2+...+i, puis on multiplie E par cette somme.
Algorithme CalculE;
Var N, i : entier;
Var S : entier;
Var E : entier; // Attention : E peut devenir tres grand
Debut
Lire(N);
// Controle minimal
Tantque (N < 2) faire
Ecrire("Erreur : N doit etre >= 2. Recommencez.");
Lire(N);
FinTantque
E <- 1;
S <- 0;
Pour i de 2 a N faire
S <- S + i; // S = 2 + 3 + ... + i (au premier tour S=2)
E <- E * S; // E multiplie par la somme courante
FinPour
Ecrire("E = ", E);
Fin.
Remarque : On peut aussi partir de S=1, puis aller de 2 a N, cela revient au meme si on gere bien les indices.
2) Intervalle [a,b] avec message d'erreur si a > b
Algorithme TestIntervalle;
Var a, b, c : entier;
Debut
Lire(a, b);
Si (a > b) Alors
Ecrire("Erreur : a ne doit pas etre superieur a b.");
Sinon
Ecrire("Entrer un entier c :");
Lire(c);
Si (c >= a) ET (c <= b) Alors
Ecrire("c est dans l'intervalle [a,b].");
Sinon
Ecrire("c n'est pas dans l'intervalle [a,b].");
FinSi
FinSi
Fin.
Exercice 02 : Structure Repetitive — 4 pts
Contexte : Lea (chimie) et Tom (physique) mesurent la durete de 6 eprouvettes. Pour chaque eprouvette, 3 mesures sont faites.
- TB : tableau des mesures brutes (6 lignes x 3 colonnes)
- TF : tableau final (1 ligne) contenant la moyenne des 3 mesures de chaque eprouvette
Algorithme Durete_Pandas;
Const L = 6;
Const C = 3;
Var TB : tableau[1..L,1..C] de reel;
Var TF : tableau[1..L] de reel;
Var i, j : entier;
Var S : reel;
Debut
// Saisie + Calcul des moyennes
Pour i de 1 a L faire
S <- 0;
Pour j de 1 a C faire
Ecrire("Introduisez la ", j, "eme mesure de la ", i, "eme eprouvette :");
Lire(TB[i,j]);
S <- S + TB[i,j];
FinPour
TF[i] <- S / C;
FinPour
// Affichage TB
Ecrire("Le tableau des resultats bruts (TB) est :");
Pour i de 1 a L faire
Pour j de 1 a C faire
Ecrire(TB[i,j]);
FinPour
FinPour
// Affichage TF
Ecrire("Le tableau final des resultats (TF) est :");
Pour i de 1 a L faire
Ecrire("Moyenne eprouvette ", i, " = ", TF[i]);
FinPour
Fin.
Probleme : Le Queen Mary 2 — 11 pts
Objectif : Gerer en memoire centrale un repertoire fixe de MAX = 5 paquebots. Chaque case du tableau represente un paquebot. Une case est considerée vide si son id = 0 (ou nom = "" selon le choix).
1) Structure de donnee pour un Paquebot
Type Paquebot = Enregistrement
id : entier; // identifiant unique (0 = case vide)
nom : chaine;
typeNavire : chaine; // "transatlantique" ou "croisiere"
longueur : reel;
poids : reel; // tonnage (GT)
localisation : chaine;
Fin
2) Structure de donnee pour representer une liste fixe de 5 paquebots
Const MAX = 5;
Type ListePaquebots = tableau[1..MAX] de Paquebot;
Convention importante :
- Une case i est vide si L[i].id = 0.
- Un paquebot est present si L[i].id ≠ 0.
- L’identifiant id doit etre unique parmi les cases non vides.
3) Fonction searchPaquebot : rechercher par identifiant (retourne la position ou -1)
Fonction searchPaquebot(L : ListePaquebots; idCherche : entier) : entier;
Var i : entier;
Debut
Pour i de 1 a MAX faire
Si (L[i].id = idCherche) Alors
Retourner i;
FinSi
FinPour
Retourner -1;
Fin
4) Procedure insertPaquebot : inserer un paquebot dans une case vide
Principe en 3 phases :
- Phase 1 : verifier que l’identifiant de P n’existe pas deja (unicite).
- Phase 2 : chercher une case vide (id = 0).
- Phase 3 : si une case vide existe, inserer P ; sinon afficher "Tableau plein".
Procedure insertPaquebot(Var L : ListePaquebots; P : Paquebot);
Var pos, i, vide : entier;
Debut
// Phase 1 : unicite
pos <- searchPaquebot(L, P.id);
Si (pos <> -1) Alors
Ecrire("Insertion impossible : identifiant deja existant.");
Sinon
// Phase 2 : chercher une case vide
vide <- -1;
Pour i de 1 a MAX faire
Si (L[i].id = 0) Alors
vide <- i;
// on peut sortir en retournant ou en utilisant un drapeau
FinSi
FinPour
// Phase 3 : inserer si possible
Si (vide = -1) Alors
Ecrire("Insertion impossible : tableau plein (aucune case vide).");
Sinon
L[vide] <- P;
Ecrire("Insertion reussie a la position ", vide);
FinSi
FinSi
Fin
5) Fonction countPaquebot : compter les paquebots nommes "Queen Marry 2"
Fonction countPaquebot(L : ListePaquebots) : entier;
Var i, c : entier;
Debut
c <- 0;
Pour i de 1 a MAX faire
Si ((L[i].nom = "Queen Marry 2") Alors
c <- c + 1;
FinSi
FinPour
Retourner c;
Fin
6) Fonction searchTypeLocPaquebot : chercher un paquebot de croisiere en Mediterranee
Fonction searchTypeLocPaquebot(L : ListePaquebots) : booleen;
Var i : entier;
Debut
Pour i de 1 a MAX faire
Si ((L[i].typeNavire = "croisiere") ET (L[i].localisation = "Mediterranee") Alors
Retourner VRAI;
FinSi
FinPour
Retourner FAUX;
Fin
7) Procedure favoritePaquebot : afficher ceux de nom "Queen Marry 2" et longueur 345.03
Procedure favoritePaquebot(L : ListePaquebots);
Var i : entier;
Debut
Pour i de 1 a MAX faire
Si (L[i].id <> 0) ET (L[i].nom = "Queen Marry 2") ET (L[i].longueur = 345.03) Alors
Ecrire(L[i].id, " | ", L[i].nom, " | ", L[i].longueur, "m | ", L[i].poids, "GT | ", L[i].localisation);
FinSi
FinPour
Fin
8) Procedure bestOnly : supprimer tous les paquebots qui ne respectent pas le profil "Wonder of the Seas"
Regle : on ne garde que les paquebots tels que :
- nom = "Wonder of the Seas"
- longueur = 362.15
- poids > 236857
Suppression + decalage : si on supprime a l’indice i, on decale a gauche pour combler le trou, puis on met la derniere case en "vide" (id=0).
Procedure bestOnly(Var L : ListePaquebots);
Var i, j : entier;
Debut
i <- 1;
Tantque (i <= MAX) faire
Si (
(L[i].nom <> "Wonder of the Seas") OU
(L[i].longueur <> 362.15) OU
(L[i].poids <= 236857)
) Alors
// decaler a gauche
Pour j de i a MAX - 1 faire
L[j] <- L[j + 1];
FinPour
// liberer la derniere case
L[MAX].id <- 0;
L[MAX].nom <- "";
L[MAX].typeNavire <- "";
L[MAX].longueur <- 0;
L[MAX].poids <- 0;
L[MAX].localisation <- "";
// ne pas incrementer i : il faut re-tester la nouvelle valeur arrivee a i
Sinon
i <- i + 1;
FinSi
FinTantque
Fin
9) Procedure sortPaquebot : trier par poids (en ignorant les cases vides)
Regle : on ne compare/permute que les cases non vides (id ≠ 0).
Procedure sortPaquebot(Var L : ListePaquebots);
Var i, j : entier;
Var tmp : Paquebot;
Debut
Pour i de 1 a MAX - 1 faire
Pour j de i + 1 a MAX faire
Si (L[i].id <> 0) ET (L[j].id <> 0) ET (L[i].poids > L[j].poids) Alors
tmp <- L[i];
L[i] <- L[j];
L[j] <- tmp;
FinSi
FinPour
FinPour
Fin
10) Fonction updatePaquebot : modifier la localisation via id
Fonction updatePaquebot(Var L : ListePaquebots; idCible : entier; newLoc : chaine) : booleen;
Var pos : entier;
Debut
pos <- searchPaquebot(L, idCible);
Si (pos = -1) Alors
Retourner FAUX;
Sinon
L[pos].localisation <- newLoc;
Retourner VRAI;
FinSi
Fin
11) Procedure localSave : remplir un tableau de noms a partir de la liste de paquebots
Idee : on copie uniquement les noms des paquebots non vides dans un tableau NOMS. On peut aussi renvoyer nb (le nombre de noms copies).
Procedure localSave(L : ListePaquebots; Var NOMS : tableau[1..MAX] de chaine; Var nb : entier);
Var i : entier;
Debut
nb <- 0;
Pour i de 1 a MAX faire
Si (L[i].id <> 0) Alors
nb <- nb + 1;
NOMS[nb] <- L[i].nom;
FinSi
FinPour
Fin
12) Procedure renamePaquebot : renommer tous les "Queen Marry 2" en "Queen Elizabet"
Procedure renamePaquebot(Var L : ListePaquebots);
Var i : entier;
Debut
Pour i de 1 a MAX faire
Si ((L[i].nom = "Queen Marry 2") Alors
L[i].nom <- "Queen Elizabet";
FinSi
FinPour
Fin
Fin du probleme.
Par Joel_Yk | Contact : +237652027193