# Algorigrammes : Représentation Graphique des Algorithmes
Les [[Algorigrammes]], ou *flowcharts*, sont des outils fondamentaux en ingénierie logicielle pour la modélisation graphique d'algorithmes, de processus ou de systèmes. Ils offrent une visualisation standardisée des étapes logiques et de l'ordre d'exécution des opérations, facilitant la conception, l'analyse, la compréhension et la communication d'un processus algorithmique avant son implémentation.
> [!video] Vidéo explicative
> <iframe width="560" height="315" src="https://www.youtube.com/embed/HRzWVpiCUL8?si=reia9Sjp_FXzgZmS" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
## 1. Rappels sur la Pensée Algorithmique et les Algorigrammes
> [!definition] Définition
> Un **algorithme** est une séquence finie et ordonnée d'instructions précises et non ambiguës, conçue pour résoudre un problème ou accomplir une tâche spécifique. La **pensée algorithmique** est la capacité à décomposer un problème en étapes logiques, à identifier les données, à définir les opérations et à les organiser séquentiellement, conditionnellement ou répétitivement.
L'algorigramme est la traduction visuelle de cette pensée. Il utilise des symboles graphiques standardisés pour illustrer chaque type d'opération ou de flux de contrôle, rendant la logique d'un programme accessible.
### Importance des Algorigrammes :
- **Clarté et Compréhension** : Visualisent des logiques complexes, les rendant intuitives même pour des non-experts.
- **Conception Structurée** : Permettent une décomposition rigoureuse des problèmes en sous-problèmes et étapes gérables, favorisant une architecture logicielle robuste.
- **Validation Précoce** : Facilitent la détection d'erreurs logiques, de blocages ou d'inefficacités dès la phase de conception, réduisant les coûts de correction ultérieurs.
- **Communication Standardisée** : Offrent un langage universel pour échanger des idées algorithmiques entre développeurs, chefs de projet et clients, indépendamment du langage de programmation.
- **Documentation Fiable** : Constituent une documentation claire et pérenne du fonctionnement logique d'un programme, essentielle pour sa maintenance et son évolution.
> [!note] Remarque
> La maîtrise des algorigrammes est une compétence fondamentale. Elle développe la pensée logique et structurée, essentielle avant d'aborder la programmation dans des langages comme Python, Java ou C. Elle est un prérequis pour une conception logicielle efficace.
## 2. Symboles Fondamentaux des Algorigrammes
Les algorigrammes s'appuient sur un ensemble de symboles graphiques standardisés pour représenter les différentes étapes et le flux d'un algorithme, conformément à la norme ISO 5807.
| Symbole | Forme | Description |
| :------------- | :------------- | :------------------------------------------------------------------------------------------------------ |
| **Début/Fin** | Ovale | Marque le point d'entrée et de sortie unique de l'algorithme. |
| **Processus** | Rectangle | Représente une opération, un calcul, une affectation ou un traitement (ex: $a \leftarrow b+c$). |
| **Décision** | Losange | Indique un point où une condition booléenne est évaluée, menant à des chemins d'exécution différents. |
| **Entrée/Sortie** | Parallélogramme | Représente une opération d'acquisition de données (lecture) ou d'affichage de résultats (écriture). |
| **Flux** | Flèche | Connecte les symboles et indique la direction logique de l'exécution du processus. |
| **Connecteur** | Cercle | Relie des parties de l'algorigramme sur la *même* page, pour éviter les croisements de flèches. |
| **Hors-Page** | Pentagone | Relie des parties de l'algorigramme sur des *pages différentes*, pour des algorithmes complexes. |
> [!tip] Astuce
> Pour la modélisation de la logique de programmation courante, les symboles les plus fréquemment utilisés sont l'**ovale** (Début/Fin), le **parallélogramme** (Entrée/Sortie), le **rectangle** (Processus) et le **losange** (Décision).
## 3. Structures Algorithmiques Fondamentales
Tout algorithme, aussi complexe soit-il, peut être construit à partir de trois structures de contrôle principales : la séquence, la sélection (ou décision) et la répétition (ou boucle). Ces structures sont les briques élémentaires de la programmation structurée.
### 3.1. Structure Séquentielle
La structure séquentielle est la plus simple. Les instructions sont exécutées de manière linéaire, l'une après l'autre, dans l'ordre défini.
> [!example] Exemple 1 : Calcul de la somme de deux nombres
> ```mermaid
> graph TD
> A(Début) --> B[/Lire nombre1/];
> B --> C[/Lire nombre2/];
> C --> D[somme = nombre1 + nombre2];
> D --> E[/Afficher somme/];
> E --> F(Fin);
> ```
>
> **Pseudo-code correspondant :**
> ```
> DEBUT
> LIRE nombre1
> LIRE nombre2
> somme = nombre1 + nombre2
> AFFICHER somme
> FIN
> ```
### 3.2. Structure Conditionnelle (Sélection)
La structure conditionnelle permet d'exécuter des blocs d'instructions différents selon l'évaluation (VRAI ou FAUX) d'une condition logique. Elle est représentée par un losange.
#### 3.2.1. Structure "Si... Alors..." (If...)
Une seule branche d'instructions est exécutée si la condition est vraie. Si la condition est fausse, le flux de contrôle passe directement à l'instruction suivant la structure.
> [!example] Exemple 2 : Vérifier si un nombre est positif
> ```mermaid
> graph TD
> A(Début) --> B[/Lire nombre/];
> B --> C{nombre > 0 ?};
> C -- Oui --> D[/Afficher "Nombre positif"/];
> C -- Non --> E(Fin);
> D --> E;
> ```
>
> **Pseudo-code correspondant :**
> ```
> DEBUT
> LIRE nombre
> SI nombre > 0 ALORS
> {
> AFFICHER "Nombre positif"
> }
> FIN
> ```
#### 3.2.2. Structure "Si... Alors... Sinon..." (If... Else...)
Deux branches sont possibles : l'une si la condition est vraie, l'autre si elle est fausse. Après l'exécution de l'une des branches, les deux flux convergent.
> [!example] Exemple 3 : Vérifier la parité d'un nombre
> ```mermaid
> graph TD
> A(Début) --> B[/Lire nombre/];
> B --> C{nombre MOD 2 == 0 ?};
> C -- Oui --> D[/Afficher "Nombre pair"/];
> C -- Non --> E[/Afficher "Nombre impair"/];
> D --> F(Fin);
> E --> F;
> ```
>
> **Pseudo-code correspondant :**
> ```
> DEBUT
> LIRE nombre
> SI nombre MOD 2 == 0 ALORS {
> AFFICHER "Nombre pair"
> } SINON {
> AFFICHER "Nombre impair"
> }
> FIN
> ```
>
> > [!note] Remarque
> > L'opérateur **modulo** ($MOD$ ou `%`) renvoie le reste de la division entière. Si $nombre \pmod 2 = 0$, le nombre est pair. En général, pour une condition $C$, le losange représente l'évaluation de $C$. Si $C$ est VRAIE, une branche est suivie ; si $C$ est FAUSSE, l'autre l'est.
### 3.3. Structure Répétitive (Boucle)
Les structures répétitives exécutent un bloc d'instructions plusieurs fois. Elles sont cruciales pour automatiser des tâches répétitives.
#### 3.3.1. Boucle "Tant que..." (While...)
La boucle "Tant que..." exécute un bloc d'instructions *tant qu'une condition reste vraie*. La condition est testée *avant* chaque itération (boucle à pré-condition). Si la condition est fausse initialement, le bloc d'instructions n'est jamais exécuté.
> [!example] Exemple 4 : Compter de 1 à 5
> ```mermaid
> graph TD
> A(Début) --> B[compteur = 1];
> B --> C{compteur <= 5 ?};
> C -- Oui --> D[/Afficher compteur/];
> D --> E[compteur = compteur + 1];
> E --> C;
> C -- Non --> F(Fin);
> ```
>
> **Pseudo-code correspondant :**
> ```
> DEBUT
> compteur = 1
> TANT_QUE compteur <= 5 FAIRE {
> AFFICHER compteur
> compteur = compteur + 1
> }
> FIN
> ```
#### 3.3.2. Boucle "Pour..." (For...)
La boucle "Pour..." est une forme de sucre syntaxique (`syntactic sugar`) de la boucle "Tant que..." spécifiquement adaptée lorsque le nombre d'itérations est connu à l'avance ou facilement déterminable. Elle combine généralement l'initialisation d'un compteur, la condition de continuation et l'incrémentation/décrémentation dans une seule instruction logique. En algorigramme, elle est explicitement décomposée en ses éléments constitutifs pour visualiser le flux.
> [!example] Exemple 5 : Calculer la somme des N premiers entiers
> $ \sum_{i=1}^{N} i = 1 + 2 + \dots + N $
> ```mermaid
> graph TD
> A(Début) --> B[/Lire N/];
> B --> C[somme = 0];
> C --> D[i = 1];
> D --> E{i <= N ?};
> E -- Oui --> F[somme = somme + i];
> F --> G[i = i + 1];
> G --> E;
> E -- Non --> H[/Afficher somme/];
> H --> I(Fin);
> ```
>
> **Pseudo-code correspondant :**
> ```
> DEBUT
> LIRE N
> somme = 0
> POUR i ALLANT_DE 1 A N FAIRE {
> somme = somme + i
> }
> AFFICHER somme
> FIN
> ```
>
> > [!warning] Attention
> > La boucle "Pour" est une abstraction. En algorigramme, elle se décompose toujours en :
> > 1. **Initialisation** du compteur (rectangle).
> > 2. **Condition** de continuation (losange).
> > 3. **Traitement** du corps de la boucle (rectangle).
> > 4. **Mise à jour** du compteur (rectangle).
> > Cette décomposition explicite est essentielle pour la clarté graphique.
## 4. Règles de Construction et Bonnes Pratiques
Pour des algorigrammes efficaces, lisibles et sans ambiguïté :
1. **Unique Point d'Entrée/Sortie** : Chaque algorigramme doit avoir un seul symbole "Début" et un seul symbole "Fin" pour délimiter clairement le processus.
2. **Flux Logique Clair** : Utilisez des flèches pour indiquer le sens d'exécution, de préférence de haut en bas et de gauche à droite. Évitez les croisements de flèches pour maintenir la lisibilité.
3. **Concision et Précision** : Le texte à l'intérieur des symboles doit être bref, clair et précis, décrivant l'opération ou la décision sans ambiguïté.
4. **Cohérence des Symboles** : Utilisez les symboles appropriés pour chaque type d'opération (processus, décision, entrée/sortie, etc.) conformément à la norme.
5. **Lisibilité Optimale** : Organisez les symboles de manière espacée et alignée. Utilisez des connecteurs si les flèches deviennent trop nombreuses ou s'il faut relier des parties éloignées.
6. **Granularité Adéquate** : L'algorigramme ne doit être ni trop détaillé (chaque instruction ligne par ligne) ni trop abstrait. Il doit se concentrer sur les étapes logiques clés et les points de décision.
7. **Nommage Explicite** : Utilisez des noms de variables et des descriptions significatifs pour améliorer la compréhension.
> [!example] Exemple 6 : Algorigramme complet - Jeu de devinettes
> L'utilisateur doit deviner un nombre secret entre 1 et 10.
>
> ```mermaid
> graph TD
> Start(Début) --> Initialisation[nombre_secret = 7];
> Initialisation --> LoopCondition{TANT_QUE VRAI};
> LoopCondition -- VRAI --> Input[/Demander à l'utilisateur de deviner un nombre/];
> Input --> Read[/Lire proposition_utilisateur/];
> Read --> Compare{proposition_utilisateur == nombre_secret ?};
> Compare -- VRAI --> Win[/Afficher "Bravo ! Vous avez trouvé le nombre secret."/];
> Win --> BreakLoop(Fin de la boucle);
> Compare -- FAUX --> Greater{proposition_utilisateur > nombre_secret ?};
> Greater -- VRAI --> TooHigh[/Afficher "Trop grand, essayez encore."/];
> TooHigh --> ConnectInput;
> Greater -- FAUX --> TooLow[/Afficher "Trop petit, essayez encore."/];
> TooLow --> ConnectInput;
> ConnectInput(( )) --> Input;
> BreakLoop --> End(Fin);
> ```
>
> **Pseudo-code correspondant :**
> ```
> DEBUT
> nombre_secret = 7
> TANT_QUE VRAI FAIRE {
> AFFICHER "Devinez le nombre secret (entre 1 et 10) :"
> LIRE proposition_utilisateur
> SI proposition_utilisateur == nombre_secret ALORS {
> AFFICHER "Bravo ! Vous avez trouvé le nombre secret."
> SORTIR_DE_LA_BOUCLE // Instruction pour quitter la boucle
> } SINON_SI proposition_utilisateur > nombre_secret ALORS {
> AFFICHER "Trop grand, essayez encore."
> } SINON {
> AFFICHER "Trop petit, essayez encore."
> }
> }
> FIN
> ```
## 5. Avantages et Limites des Algorigrammes
### Avantages :
- **Visualisation Intuitive** : Rendent les algorithmes complexes immédiatement compréhensibles par leur nature graphique, dépassant les barrières linguistiques et techniques.
- **Aide à la Conception** : Forcent une structuration logique et une décomposition claire du problème, prévenant les erreurs de conception et améliorant la robustesse logicielle.
- **Facilitation du Débogage** : Permettent un suivi pas à pas du flux d'exécution, simplifiant l'identification et la correction des erreurs logiques.
- **Documentation Efficace** : Servent de référence visuelle concise et universelle pour la compréhension, la maintenance et l'évolution des programmes.
- **Indépendance Linguistique** : Constituent un outil de conception universel, non lié à un langage de programmation spécifique, permettant une transition fluide vers le codage.
### Limites :
- **Complexité Évolutive** : Deviennent rapidement encombrants et difficiles à gérer pour des algorithmes très longs ou des systèmes de grande envergure, perdant leur avantage de clarté.
- **Manque de Détail Spécifique** : Ne remplacent pas le pseudo-code ou le code pour les spécificités syntaxiques, la gestion des structures de données complexes ou les détails d'implémentation.
- **Maintenance Coûteuse** : Toute modification majeure de l'algorithme peut nécessiter une refonte significative de l'algorigramme, ce qui peut être chronophage.
- **Subjectivité pour les Cas Complexes** : Bien que standardisés, certains cas algorithmiques complexes peuvent encore prêter à des interprétations légèrement différentes, nécessitant des conventions supplémentaires.
> [!note] Remarque
> Pour les projets de grande envergure ou des aspects spécifiques de la conception logicielle (comme la conception orientée objet ou les interactions système), des outils de modélisation plus avancés comme UML (Unified Modeling Language) peuvent être préférables. Cependant, les algorigrammes restent un outil inégalé pour la modélisation de la logique de contrôle fondamentale et la pédagogie.
## Résumé
Les algorigrammes sont un pilier de l'ingénierie logicielle, offrant une représentation graphique standardisée et synthétique des algorithmes. En utilisant des symboles clairs pour les structures séquentielles, conditionnelles et répétitives, ils facilitent la conception, la compréhension et la communication de logiques complexes. Essentiels pour développer la pensée logique et structurée, ils permettent une détection précoce des erreurs et constituent une documentation visuelle précieuse. Leur maîtrise est une compétence fondamentale pour tout futur ingénieur en programmation.
## 🗓️ Historique
> **Dernière mise à jour :** `26 octobre 2025`
> **Rédigé par :** [[Julien DUQUENNOY]]