1. Procédure vs Fonction

  • Fonction : Renvoie exactement un résultat (via RETOURNER). S’utilise dans une expression (y ← f(x) + 2).
  • Procédure : Ne renvoie rien ou modifie plusieurs variables. C’est une action (AfficherMenu()).

Portée et Passage de paramètres

  • Variable Locale : Existe uniquement dans la fonction.
  • Variable Globale : Existe partout (à éviter si possible).
  • Passage par Valeur : La fonction travaille sur une copie (l’original n’est pas modifié).
  • Passage par Référence : La fonction modifie l’original (couteux mais puissant).

2. TD : Détection d’Anagrammes

Objectif : Vérifier si deux tableaux de caractères (tab1, tab2) sont des anagrammes (contiennent les mêmes lettres, ordre différent).

Stratégie optimisée :

  1. Vérifier si les tailles sont identiques.
  2. Pour chaque lettre de tab1, la chercher dans tab2.
  3. Si trouvée : Supprimer la lettre de tab2 (ou l’échanger avec la fin et réduire la taille) pour éviter de la compter deux fois.

Solution Algorithmique

FONCTION EstAnagramme(tab1: TAB CAR, n1: ENTIER, tab2: TAB CAR, n2: ENTIER) : BOOLEEN
VARIABLES
    i, j : ENTIER
    tailleRestante : ENTIER
    trouvé, resultat : BOOLEEN
    temp : CARACTERE
    copieT2 : TAB CAR // On travaille sur une copie pour ne pas détruire l'original
 
DEBUT
    // 1. Vérification rapide taille
    SI n1 ≠ n2 ALORS
        RETOURNER FAUX
    FINSI
 
    // 2. Copie du tableau 2 (pour le modifier)
    tailleRestante ← n2
    POUR i DE 1 A n2 FAIRE
        copieT2[i] ← tab2[i]
    FINPOUR
 
    resultat ← VRAI
    i ← 1
 
    // 3. Parcours du premier tableau
    TANT QUE (i <= n1) ET (resultat = VRAI) FAIRE
        trouvé ← FAUX
        j ← 1
        
        // Recherche de tab1[i] dans copieT2
        TANT QUE (j <= tailleRestante) ET (trouvé = FAUX) FAIRE
            SI tab1[i] = copieT2[j] ALORS
                trouvé ← VRAI
                
                // ASTUCE : On échange la lettre trouvée avec la dernière 
                // du tableau virtuel, et on réduit la taille.
                // Cela "supprime" la lettre des recherches futures.
                temp ← copieT2[j]
                copieT2[j] ← copieT2[tailleRestante]
                copieT2[tailleRestante] ← temp
                
                tailleRestante ← tailleRestante - 1
            SINON
                j ← j + 1
            FINSI
        FINTANTQUE
        
        // Si on a parcouru tout T2 sans trouver la lettre de T1
        SI trouvé = FAUX ALORS
            resultat ← FAUX
        SINON
            i ← i + 1
        FINSI
    FINTANTQUE
 
    RETOURNER resultat
FIN