La définition rigoureuse de ce qu'est un algorithme est du ressort de l'informatique théorique, laquelle fait appel à des notions de logique mathématique ; ce n'est pas l'objet de ce cours. N'importe quel dictionnaire en donne une définition intuitive, et nous en verrons suffisamment d'exemples pour affiner cette intuition. Disons simplement que l'algorithme est la forme que revêtent les solutions que l'informatique sait donner aux problèmes qui lui sont posés.
Certains algorithmes sont implémentés directement par des circuits électroniques numériques : c'est le cas de ceux qui réalisent les opérations arithmétiques, et d'algorithmes beaucoup plus élaborés comme la transformée de Fourier rapide. C'est aussi le rôle de certains circuits que l'on trouve sur des objets courants (carte à puce, appareil photo, téléphone portable) dont l'usage est bien délimité et non modifiable.
Un ordinateur ne diffère guère de ces objets courants, puisqu'il contient des circuits implémentant un (unique) algorithme dont l'usage est tout aussi délimité et non modifiable : << exécuter des programmes >>. La description de cet algorithme étant le sujet d'un cours d'architecture des machines, et non de ce cours, nous ne pouvons ici qu'énoncer son caractère universel : l'algorithme implémenté par les circuits d'un ordinateur est capable de simuler n'importe quel autre algorithme. Les instructions nécessaires à cette simulation forment un programme, qu'il suffit d'exécuter.
Du modèle d'architecture conçu, dans les années 44-46, par von Neumann, Wilkes, Goldstine et Burks, retenons qu'instructions et données sont représentées d'une même façon, par une suite d'éléments binaires. Les premiers ordinateurs construits suivant ce modèle furent programmés directement en binaire. On utilisa peu après des langages d'assemblage, qui forment une notation textuelle des instructions. Depuis la fin des années 50, on utilise des langages de programmation.
Au moyen de ces langages, un programme est écrit sous la forme d'un texte, c'est-à-dire d'une suite de caractères, humainement lisible, appelé programme-source, qui n'est pas directement exécutable. Une des techniques employées pour faire exécuter ce programme est de le traduire en instructions de la machine, au moyen d'un compilateur ; on obtient ainsi le programme-objet. Celui-ci peut alors être soumis à la machine pour exécution.
Le langage C a été conçu et implémenté par Dennis M. Ritchie. Le Turing Award 1983 lui était décerné, conjointement avec Ken L. Thomson pour le développement et l'implémentation du système d'exploitation Unix. Sa définition, désormais qualifiée << Kernighan-Ritchie >>, a été clarifiée et modernisée au cours de sa normalisation ANSI, publiée en 1988, et qui a adopté certaines évolutions consacrées par l'usage. Certaines de ces évolutions sont apparues à l'occasion du développement du langage C++, dû à Bjarne Stroustrup, et conçu comme une extension de C, par l'addition des classes. Il s'agissait, dans les années 1983-85, de donner au programmeur la possibilité d'écrire en C des programmes dans le style orienté objets. C++ s'est depuis considérablement enrichi et stabilisé sous la forme d'une norme ISO, adoptée en 1997 et ratifiée en août 1998, pour devenir l'un des langages majeurs de l'informatique contemporaine. La maîtrise de ce langage ne peut pas être acquise en quelques mois. Il ne s'agit donc pas dans ce cours d'apprendre à concevoir des programmes dans le style orienté objets, mais seulement de profiter de certaines simplifications apportées par le langage C++, notamment par ses bibliothèques. Pratiquement, les programmes que nous écrirons seront des programmes C++, mais qui n'utiliseront qu'une fraction des extensions apportées par C++ à C : pas du C++, mais du << better C >> en C++. C mieux.