SOLUTION
Exercice No 1: (6 Pts)
Solution 1: en utilisant un Tant Que
Algorithme SommeChiffres;
Var
S, Nbr, chiffre: Entier; // 0.5 pt
chiffre0: Booleen;
Debut
S <--- 0; // 0.5 Pt
chiffre0 <--- Faux;
Tant Que (NON(chiffre0)) Faire // 1 Pt
Repeter
Ecrire("Donner un entier > 0");
Lire(Nbr);
Jusqu'a (Nbr > 0); // 0.5 Pt
// 3 Pt
Tant Que (Nbr > 0) Faire
chiffre <--- Nbr Mod 10;
Si (chiffre = 0) alors
chiffre0 <--- Vrai;
Sinon
S <--- S + chiffre;
Fsi
Nbr <--- Nbr Div 10;
Fait
Fait
Ecrire("Somme S = ", S); // 0.5 Pt
Fin.
Solution 2: en utilisant un Repeter
Algorithme SommeChiffres;
Var
S, Nbr, chiffre: Entier; // 0.5 pt
chiffre0: Booleen;
Debut
S <--- 0; // 0.5 Pt
chiffre0 <--- Faux;
Repeter
Repeter
Ecrire("Donner un entier > 0");
Lire(Nbr);
Jusqu'a (Nbr > 0); // 0.5 Pt
// 3 Pt
Repeter
chiffre <--- Nbr Mod 10;
Si (chiffre = 0) alors
chiffre0 <--- Vrai;
Sinon
S <--- S + chiffre;
Fsi
Nbr <--- Nbr Div 10;
Jusqu'a (Nbr = 0);
Jusqu'a (chiffre0 = Vrai); // 1 Pt
Ecrire("Somme S = ", S); // 0.5 Pt
Fin.
Exercice No 2: (7 Pts)
Algorithme VecteursSMax;
Var
V1: Tableau[100] de Entier; // 0.5 pt
// Attention; Taille de V2 peut presque doubler (V2:Tableau[198] est correct aussi)
V2: Tableau[200] de Entier;
i, J, iDeb, iFin, nb, N, M, SMax: Entier;
Debut
Repeter
Ecrire("Donner N entier avec 2<= N <= 100");
Lire(N);
Jusqu'a ((N >= 2) et (N <= 100)); // 0.25 pt
//1- Remplir Vecteur V1 : 0.5 pt
Pour i <--- 1 a N Faire
Repeter
Lire(V1[i]);
Jusqu'a ((V1[i]>=0) et (V1[i]<=9));
Fait
// 2. Déterminer et afficher la plus grande somme Smax de 2 éléments consécutifs
// de V1 : 1 Pt
// Autre solution: initialiser SMax à (V1[1] + V1[2]) et boucler à partir de 2 dans la boucle Pour
SMax <--- 0;
Pour i <--- 1 a (N - 1) Faire
Si (V1[i] + V1[i+1] > SMax) alors
SMax <--- V1[i] + V1[i+1];
Fsi
Fait
Ecrire("La plus grande Somme de 2 elements consecutifs de V1 est:", SMax);
// 3. Construire un vecteur V2 contenant tous les éléments de V1 qui se suivent et
// dont la somme est égale à Smax: 2 Pts
/* Solution: Parcourir les elements de V1 avec une boucle Pour et si V1[i] + V1[i+1]
est egale à SMax, recopier V1[i] et V1[i+1] dans V2.
*/
J <--- 1;
Pour i <--- 1 a (N - 1) Faire
Si (V1[i] + V1[i+1] = SMax) alors
V2[J] <--- V1[i];
J <--- J + 1;
V2[J] <--- V1[i+1];
J <--- J + 1;
Fsi
Fait
M <--- J - 1;
// ecriture de V2: optionnel
Ecrire("Tableau V2:\n");
Pour i <--- 1 a M Faire
Ecrire(V2[i]);
Fait
// 4. Supprimer de V2 toutes les séquences répétitives consécutives sans utiliser
// un vecteur autre intermédiaire: 3 Pts
// Solution 1: Non Optimisee: Parcourir vecteur V2 avec un Tant Que et si
// V2[i]=V2[i+1] alors supprimer V2[i+1] en decalant les elements se trouvant
// apres la position (i+1) d'une position vers la gauche
i <-- 1;
Tant Que (i < M) Faire
Si (V2[i] = V2[i+1]) alors
// supprimer V2[i+1] en decalant d'une position vers la gauche tous les elements
// de V2 se trouvant apres la position (i+1)
M <--- M - 1;
Pour J <--- i+1 a M Faire
V2[J] <--- V2[J+1];
Fait
// ATTENTION ICI: NE PAS INCREMENTER LE i
Sinon
i <--- i + 1;
Fsi
Fsi
// Solution 2: Solution Optimisee
// Detecter debut et fin des sequences repetitives et ensuite faire la suppression
i <--- 1;
Tant Que (i < M) Faire
// chercher debut d'une sequence de valeurs successives repetitives
Tant Que ((i < M) et (V2[i] <> V2[i+1])) Faire
i <--- i + 1;
Fait
Si (i < M) alors // on a trouve une sequence de valeurs successives repetitives
J <--- i;
iDeb <--- i;
// chercher fin de la sequence de valeurs successives repetitives
Tant Que ((J < M) et (V2[J] = V2[J+1])) Faire
J <--- J + 1;
Fait
iFin <--- J;
// supprimer tous les elements se trouvant entre iDen et iFin sauf le
// premier (celui se trouvant a la position iDeb)
// supprimer valeurs de (iDeb+1) à iFin en decalant les elements
// de V2 se trouvant de la position (iFin + 1) à la position M de nb elements à la fois
nb <--- iFin - iDeb;
iDeb <--- iDeb + 1;
Pour J <--- iFin+1 a M Faire
V2[iDeb] <--- V2[J];
iDeb <--- iDeb + 1;
fait
M <--- M - nb;
Fsi
Fait
// Solution 3: Solution la plus optimisee
// Une autre solution optimisee encore meilleur est de rechercher les
// sequences de valeurs consecutives repetitives a partir de la fin du tableau et de
// supprimer les sequences au fur et a mesure qu'on les trouve.
i <--- M;
Tant Que (i > 1) Faire
// sauter sequence de valeurs non repetitives
Tant Que ((i > 1) et (V2[i] <> V2[i-1]))
i <--- i - 1;
Fait
Si (i > 1) alors
J <--- i;
iFin <--- i;
Tant Que ((J > 1) et (V2[J] = V2[J - 1])) Faire
J <--- J - 1;
Fait
iDeb <--- j;
// supprimer valeurs de (iDeb + 1) à iFin
nb <--- iFin - iDeb;
iDeb <--- iDeb + 1;
Pour k <--- iFin+1 a M Faire
V2[iDeb] <--- V2[k];
iDeb <--- iDeb + 1;
Fait
M <--- M - nb;
i <--- J - 1; // continuer rechercher prochaine sequence a partir de (j - 1)
Fsi
Fait
// Optionnel: Affichage vecteur V2
Ecrire("Vecteur V2 apres suppression:\n");
Pour i <--- 1 a M Faire
Ecrire(V2[i]);
Fait
Fin.
Exercice No 3: (7 Pts)
Algorithme ChiffresRestantMatrice;
Var
A, AC: Tableau[100,100] de Entier; // 0.25 Pt
V, VC: Tableau[50] de Entier;
N, M, i, J, k, k1, svJ, nb, nbC: Entier;
Debut
// Lecture de N compris entre 2 et 100: 0.25 Pt
Repeter
Ecrire("Donner N entier 2<=N<=100");
Lire(N);
Jusqu'a ((N>=2) et (N <= 100));
// Lecture de M compris entre 2 et 50: 0.25 Pt
Repeter
Ecrire("Donner M entier 2<=M<=50");
Lire(M);
Jusqu'a ((M>=2) et (M <= 50));
// Remplir matrice d'entiers compris entre 1 et 9: 1 Pt
Pour i <--- 1 a N Faire
Pour J <--- 1 a N Faire
Repeter
Ecrire("Donner element A[", i, ",", J, "] compris entre 1 et 9");
Lire(A[i,J]);
Jusqu'a ((A[i,J] >= 1) et (A[i,J] <= 9));
Fait
Fait
// initialiser matrice AC a 0: 0.25 Pt
Pour i <--- 1 a N Faire
Pour J <--- 1 a N Faire
AC[i, J] <--- 0;
Fait
Fait
// Remplir vecteur V avec nombre de N chiffres Max: 1 Pt
Pour i <--- 1 a M Faire
Repeter
Ecrire("Donner V[", i, "] > 0 et contenant au max ", N, "chiffres");
Lire(V[i]);
Si (V[i] > 0) alors
nbC <--- 0;
nb <--- V[i];
Tant Que(nb > 0) Faire
nbC <--- nbC + 1;
nb <--- nb Div 10;
Fait
Fsi
Jusqu'a ((V[i] > 0) et (nbC <= N));
VC[i] <--- nbC; // sauvegarder nbr de chiffres de V[i] dans VC[i]
Fait
Pour i <--- 1 a M // Parcourir vecteur V : 1 Pt
Faire
nbC <--- VC[i]; // nbr de chiffres de V[i]
// rechercher V[i] dans toutes les lignes de la matrice A: 1 Pt
Pour k <--- 1 a N // Parcourir les lignes de la matrice A
Faire
// ligne k de la matrice A
J <--- N; // j: indice derniere colonne
Tant Que (J >= nbC)
Faire
// chercher le dernier chiffre de V[i] en commencant
// par la derniere colonne J de la ligne k
nb <--- V[i];
c1 <--- nb Mod 10; // c1 dernier chiffre
Tant Que ((J >= 1) et (A[k, J] <> c1)) Faire
J <--- J - 1;
Fait
Si ((J >= 1) et (J >= nbC) ) // on a trouve le dernier chiffre
alors
svJ <--- j; // sauvegarder position ou on a trouve le dernier chiffre
// comparer les autres chiffres
Tant Que ((J >= 1) et (nb <> 0) et (A[k,J] = c1))
Faire
J <--- J - 1;
nb <--- nb Div 10;
c1 <--- nb Mode 10;
Fait
Si (nb = 0) // nbr V[i] se trouve dans la ligne k
alors
// marquer les positions dans matrice AC
Pour k1 <--- svJ-nbC+1 a svJ Faire
AC[k, k1] <--- -1;
Fait
Sinon
J <--- svJ - 1; // recommencer recherche a partir de svJ - 1
Fsi
Fsi
Fait
Fait
// rechercher nb dans toutes les colonnes de la matrice A: 1 Pt
Pour k <--- 1 a N
Faire
// colonne k de la matrice A
J <--- N; // j indice de la derniere ligne de la colonne k
Tant Que(J >= nbC)
Faire
// chercher le derniere chiffre de V[i] a partir de la fin de la colonne k
nb <--- V[i];
c1 <--- nb Mod 10; // dernier chiffre
Tant Que ((J >= 1) et (A[J, k] <> c1)) Faire
J <--- J - 1;
Fait
Si ((J >= 1) et (J >= nbC))
alors
svJ <--- J;
// comparer les autres chiffres
Tant Que((j >= 1) et (nb <> 0) et (A[j, k] = c1))
Faire
J <--- J - 1;
nb <--- nb Div 10;
c1 <--- nb Mod 10;
Fait
Si (nb = 0) // On a trouve V[i] dans la colonne k
alors
// Marquer les chiffres correspondant dams matrice AC
Pour k1 <--- svJ-nbC+1 a svJ Faire
AC[k1, k] <--- -1;
Fait
Sinon
J <--- svJ - 1; // reprendre recherche a partir de svJ - 1
Fsi
Fsi
Fait
Fait
Fait
// calculer Nb nombre des chiffres restant: 1 Pt
nb <--- 0;
Pour i <--- 1 a N
Faire
Pour J <--- 1 a N
Faire
Si (AC[i, J] = 0) alors
nb <--- (nb * 10) + A[i, J];
Fsi
Fait
Fait
Si (nb = 0) alors
Ecrire("Tous les chiffres de la matrice sont marques");
Sinon
Ecrire("Nombre des chiffres restant = ", nb);
Fsi
Fin.