Avant propos ============ Introduction ~~~~~~~~~~~~ - L'accent est mis sur l'approche **algorithmique scientifique**, dite algorithmique algébrique. L'algorithmique est un sous-domaine de l'algèbre et des approches modulaires (arithmétique modulaire...) - Le point de vue mathématique étant assez exigeant, **aucun formalisme fort** de l'algorithmique mathématique ne sera présenté. Aucun symbole mathématique donc, et seulement du pseudo-code. L'approche mathématique forte utilisant le formalisme mathématique de l'algorithmique algébrique est en général enseignée en France uniquement aux cours des grandes écoles. - L'algorithmique présentée ici est donc délibérément pseudo-scientifique mais en revanche ouverte au **multi-paradigme**. En général l'évocation d'un algorithme en pseudo code est toujours réducteur car limité au style de programmation le plus à la mode actuellement, c'est-à-dire le **style impératif**. Nous présenterons un éventail des plus grands paradigmes de programmation existants. Nous nous limiterons à la **programmation impérative, fonctionnelle, modulaire, générique et objet**. Nous envisagerons les structures de données et les structures de contrôle spécifiques à chacun des styles évoqués. - Et parce qu'un honnête programmeur doit avoir une vue d'ensemble de **l'état de son art**, nous évoquerons un panorama des différents langages existants -- historiques et contemporains -- en les comparants les uns aux autres. - Durant tout le cours, nous souhaitons proposer une pédagogie par l'exemple, et nous nous limiterons l'exposé à deux langages d'implémentation des algorithmes : le **Python** pour la programmation impérative, modulaire et objet, et nous évoquerons aussi certains exemples en langage **OCaml** à propos de la programmation fonctionnelle, modulaire et générique. Objectifs de ce cours ~~~~~~~~~~~~~~~~~~~~~ Il s'agit de : - maîtriser et concevoir un algorithmes de base, - choisir une représentations appropriée des données, - décomposer en sous-problèmes et affinements successifs, - organiser les modules ou fonctions. Le développement raisonné d’algorithmes et leur implantation permet d'acquérir les qualités suivantes : + Analyser et modéliser un problème, + Spécifier, + Exprimer, une problématique, une solution ou un algorithme, + Traduire un algorithme dans un langage de programmation, + Concevoir un algorithme répondant à un problème précisément posé.