Correction de l'examen du 14 Novembre 2002

Plus grande suite de nombres pairs

Principe : A partir d'une suite d'entiers calculer la plus grande suite de nombres pairs contenue dans cette liste

Exemples :

  1. liste = 3, 4, 6, 8, 7, 18, 20, 21, 30 le résultat est 3 car la plus longue suite de pairs est : 4, 6, 8
  2. liste = 12, 3, 67, 21, 44, 66, 8, 12 le résultat est 4 car la plus longue suite de pairs est : 44, 66, 8, 12
  3. liste = 5, 7, 6, 3, 9, 10 le résultat est 1 car la plus longue suite de pairs est : 6 ou 10
  4. liste = 5, 7, 11, 3, 9 le résultat est 0 car il n'y a aucun nombre pair

/* La liste tab de taille longueur */
maxi <== 0
i <== 0
Répéter
       compte <== 0
       /* Comptage des nombres pairs successifs */
       tant que (tab[i] est pair) ET (i < longueur)
             compte <== compte + 1
             i<== i + 1
       fin_tant_que
       /* Si cette suite de pairs est plus longue que la précédente */

      si compte > maxi

      alors maxi <== compte
      i <== i + 1
tant_que (i < longueur)

Insertion d'une chaîne dans une autre à une position donnée

Principe : Faire une place dans la chaîne et insérer une lettre de la chaîne à insérer, recommencer ce traitement jusqu'à la fin de la chaîne à insérer.

/* On insere la chaîne insert de taille long_insert dans la chaîne chaine de taille long_chaine en position pos*/
/* le j sert à travailler dans insert */
j <== 0
Répéter
       /* on "fait une place" en position pos + j */
       Répéter pour i allant de long_chaine à pos + j par pas de -1
             chaine[i] <== chaine[i-1]
       fin_répéter
       /* on place l'élément à insérerj */
       chaine[pos + j] <== insert[j]
       j <== j + 1
       long_chaine <== long_chaine + 1
tant_que (j < long_insert)

Algorithme mystere = tri par insertion simple (tri en copie)

Principe : Construire une nouvelle liste par insertion successive des éléments de la liste d'origine dans la liste résultat. La liste résultat commence donc avec un unique élement et reste en permanence triée.

La recherche de la place d'insertion se fait par un algorithme de recherche simple.

mystere[0] <== tab[0]
lmystere <== 1
Répéter pour i allant de 1 à longueur -1
      /* ?????????? */
      j <== 0
      tant que (tab[i] > mystere[j]) ET (j <lmystere)
            j <== j + 1
      fin_tant_que
        /* ?????????? */
      Répéter pour k allant de lmystere -1 à j par pas de -1
            mystere[k+1] <== mystere[k]
      fin_de_répéter
      mystere[j] <== tab[i]
      lmystere <== lmystere + 1
fin_de_répéter

Codage de l'algorithme précédent en C

#include <stdio.h>
#define MAX 15
typedef struct liste {
int taille;
int elts[MAX];
}liste;

/* Tri par insertion simple */
void tri_ins(liste l1,liste *l2)
{
int i, j, k;
l2->taille=1;
l2->elts[0]=l1.elts[0];

for( i = 1; i < l1.taille; i ++)
{
/* Recherche de la place d'insertion */
j = 0;
while ((l1.elts[i]>l2->elts[j]) && (j<l2->taille))
j++;

/* Décalage des éléments de la liste */
for( k=l2->taille-1; k >= j; k--)
l2->elts[k+1]=l2->elts[k];

/* Insertion de l'element */
l2->elts[j]=l1.elts[i];
l2->taille++;
}}