Algorithmique impérative/Rédaction
Lorsqu'on rédige un algorithme, il faut toujours garder à l'esprit qu'il doit pouvoir être lu et compris par quelqu'un d'autre. Au fur et à mesure de la pratique, les rédacteurs ont dégagé quelques principes dont les plus simples sont expliqués ici. Il convient de respecter ces principes d'une façon rigoureuse.
Remarque pour les étudiants : il est parfaitement admis que le respect de ces règles de rédaction soit pris en compte dans la note finale. Quand vous écrivez une dissertation, il convient de respecter la grammaire et l'orthographe même si ce n'est pas ce qui doit être évalué, il en est de même ici.
Indenter son code.
L'indentation d'une ligne est l'espace qui la sépare de la marge gauche.
Problème.
Considérons l'algorithme (incomplet) suivant :
 Début
 si condition1 alors
 instruction1
 sinon
 si condition2 alors
 instruction2
 sinon
 instruction3
 finsi
 finsi
 Fin
Voici le même algorithme mais sans l'indentation :
 Début
 si condition1 alors
 instruction1
 sinon
 si condition2 alors
 instruction2
 sinon
 instruction3
 finsi
 finsi
 Fin
Il est déjà moins évident de comprendre le fonctionnement de l'algorithme. Ce dernier est toutefois plus abordable que :
 Début
 si condition1 alors instruction1 sinon si condition2
 alors
 instruction2 sinon instruction3
 finsi finsi
 Fin
et pourquoi pas...
Comment faire.
Pour bien indenter, considérez les blocs et mettez au même niveau le début du bloc et la fin du bloc. Par exemple, un codice_1 devrait se trouver au même niveau que son codice_2 : on devrait l'apercevoir immédiatement étant donné que tout ce qu'il y a entre les deux devrait se trouver un niveau d'indentation plus loin.
 début
 début
 fin
 fin
Procédez ainsi avec 
De même : placez les codice_3 et les codice_4 au même niveau.
Vous pouvez transformer ces règles, l'important étant de les fixer et de s'y tenir. Il existe plusieurs façons d'indenter et chaque auteur a ses préférences.
Utiliser des identifiants pertinents.
Pour choisir un identifiant de variable ou de fonction, souvenez-vous qu'il doit remplir deux utilités principales
Évitez :
Pensez également aux conventions, notamment :
Commenter utile.
Il ne faut pas décrire ce que vous faites mais pourquoi vous le faites
 POUR i de 1 à 24 FAIRE
 instruction
 FINPOUR
Pour cet algorithme le commentaire :
Servez-vous également des commentaires pour indiquer ce que vous supposez : les conditions dans lesquelles votre algorithme fonctionne.

Algorithmique impérative/Inversion de deux variables

Problèmatique.
Nous disposons de deux entiers "a" et "b". Nous voulons intervertir ces deux nombres. À la fin du programme : la valeur de "a" sera égale à celle de "b" lors du lancement du programme et inversement : "b" sera égal au "a" initial.
Exemple : au début du programme nous posons "a"=2 et "b"=3. À la fin du programme nous aurons "a"=3 et "b"=2.
Solutions.
Voici deux solutions acceptables :
 Algorithme inversion_stockage
 Variables
 a : entier
 b : entier
 temp : entier (* variable dans laquelle on stockera le contenu
 d'une variable pour ne pas l'écraser au moment
 de la première assignation *)
 Début
 temp := a (* on sauvegarde a qui sera effacée à la ligne suivante
 pour pouvoir la placer dans b plus tard *)
 a := b
 b := temp
 Fin
 Algorithme inversion_calcul
 Variables
 a : entier
 b : entier
 Début
 a := a+b
 b := a-b
 a := a-b
 Fin
Remarque.
Ces deux solutions présentent en fait une notion clé de l'informatique : étudions nos deux solutions de plus près :
Simplifions le fonctionnement d'une machine au maximum : supposons
Temps de calcul requis par chaque algorithme :
Mémoire requise par chaque algorithme :
On a donc que 
Et c'est là un concept généralisable :
D'une façon générale, vous pouvez faire des algorithmes plus rapides en utilisant plus de mémoire et des algorithmes utilisant moins de ressources mémoire mais qui seront plus lents.
Attention cependant, cela ne veut surtout pas dire qu'aucun algorithme n'est améliorable sans perte de ressources en calcul ou en mémoire. Bien au contraire, vous devez toujours essayer d'être le plus efficace possible.
Ce constat ne permet pas de dire si un des algorithmes est plus efficace que l'autre : notre analyse a été trop simplifiée pour cela. En effet, nous n'avons pas considéré que :
Vous contesterez, avec raison, que sur cet exemple, aujourd'hui nos ordinateurs sont parfaitement capables d'exécuter ces deux programmes en un temps record et qu'on ne distinguera pas la différence suivant qu'on utilise l'un ou l'autre. C'est vrai, mais vous négligez que peut-être :
En réalité, n'importe quel compilateur décent, depuis les années 80, va optimiser bien au delà de ce que le programmeur moyen aura le courage de faire. Par exemple sur l'échange : utiliser deux registres au lieu d'une variable supplémentaire (R1 := A; R2 := B; A := R2; B:= R1) si les données tiennent dans un mot machine, ou utiliser les instructions spécialisées du processeur d'échange de deux zones en mémoire. En écrivant la forme la plus simple d'échange, le compilateur reconnaitra (parce qu'on lui a inculqué un certain nombre de recettes) de quoi il s'agit, et fabriquera le meilleur code possible. Le temps consacré à de la micro-optimisation est en général une perte sèche, il est de loin préférable de la consacrer à une bonne conception, et à l'utilisation d'algorithmes efficaces.

Algorithmique impérative/Somme des n premiers entiers

Problématique.
Écrire un algorithme sous forme d'une fonction qui calcule la somme des premiers entiers jusqu'à n inclus, n étant passé en paramètre.
Exemple : codice_1 calculera 1+2+3+4+5 et renverra donc 15
Solution.
Voici une première réponse acceptable :
Pourquoi partir de 0 et pas 1 ? Cela sert tout simplement à gérer le cas n=0. Cela ne change rien pour les autres cas puisque (en reprenant l'exemple de la problématique) codice_1 va calculer 0+1+2+3+4+5, c'est à dire 1+2+3+4+5 (=15).
Cependant, la boucle peut partir de 1 si elle ne s’exécute pas pour n=0. Dans ce cas, la somme sera 0 (valeur initiale de la variable codice_3).
Remarque.
Essayons une analyse un peu plus mathématique du problème :
En fait notre fonction calcule pour n : formula_1. L'étude des séries nous apprend que
formula_2.
On peut en déduire que la fonction peut s'écrire
 Function somme_directe(n : entier)
 Début
 retourner (n*(n+1))/2
 Fin
Ce qui d'une part est plus simple mais également, comme nous allons le voir, plus efficace.
Simplifions le fonctionnement d'une machine au maximum : supposons qu'il faut une unité de temps au processeur pour effectuer un calcul et qu'une opération entière et l'assignation consistent toutes en 1 calcul.
Supposons que nous voulions calculer somme(1000) :
Avec codice_4 : nous allons effectuer :
Soit au moins 3000 calculs.
Avec codice_6 : nous allons effectuer
Soit 3 calculs.
Conclusion : 3000 calculs pour le premier algorithme, 3 calculs pour le second. La différence entre les deux : le mathématicien qui doit se retrouver en chaque algorithmicien.
Et dire que de nombreux étudiants en informatique sont souvent étonnés de la présence importante de mathématiques durant leur cursus...