Vous êtes sur la page 1sur 160

1

PREMIERE PARTIE : ARCHITECTURE


CHAP 1. Naissance de l’informatique
Une définition de l'informatique : science et techniques du traitement de l’information par
les outils informatiques.
1.1. Qualifications de l’informatique
Discipline scientifique :
- Fortement liée aux mathématiques historiquement et conceptuellement ;
- Théorie des graphes, modélisation, maths discrètes, algorithmique, calculabilité,
complexité ;
Discipline technologique :
- Matériel : fortement liée à l’électronique, architecture des ordinateurs, évolution des
composants (SSI → VLSI), multiprocesseurs ;
- logiciel : “art de la programmation”, ateliers de génie logiciel, programmation orientée
objet, parallèle, systèmes d’exploitation.
Objectif du cours :
acquérir une vision cohérente de l’architecture
matérielle et logicielle des « machines
informatiques » traitant et stockant l’information.
1.2. Bref aperçu historique
L'Informatique (des mots « information » et « automatique ») est la science du traitement
automatique et rationnel de l'information. On entend par traitement : la manipulation des
informations (tri, recherche, modification, …) ou le calcul plus ou moins compliqué
permettant d'obtenir un résultat (résolution d'une équation ou d'un problème
numérique).
L'informatique est considérée comme le support des connaissances et des
communications dans les domaines scientifiques, économiques et sociaux.
Les besoins de l'informatique sont nombreux. Elle est utilisée pour la gestion des petits ou
grands volumes d'information et leurs échanges de données (gestion des entreprises,
banques, bases de données, minitel…), la création artistique (texte, musique, dessin…), le
traitement des images (reconstruction, correction des déformations, amélioration des
contrastes, reconnaissance de formes…), la médecine (tomographie, scanner, gestion
hospitalière, recherche…), la conception d'objets ou de produits (industrie automobile ou
2

aéronautique, calculs des formes et des structures, résistances aux déformations et aux
chocs, aérodynamique…), le suivi de la production, la simulation d'expériences, etc.
Un Ordinateur (dont le mot suggère l'ordre logique) est une machine programmable. Il
permet le traitement des informations numériques ou discrètes par opposition aux
informations analogiques ou continues telles que les grandeurs physiques classiques :
positions, intensités de courant, etc.
La manipulation de l'information discrète remonte à la plus haute antiquité. Pour effectuer
des calculs ou mémoriser des résultats, on utilisait des cailloux, des bouliers ou encore
d'autres objets.
C'est l'écossais JOHN NAPIER (1550-1617) qui a effectué la transition entre le boulier et les
premières machines à calculer qui sont alors mécaniques. Sa machine (ABAQUE) donnait
le résultat d'une multiplication grâce à une série de cubes emboîtés les uns dans les autres
et formant plusieurs colonnes.
Au XVe-XVIe siècles, l'invention de l'échappement des horloges introduisit un découpage
du temps en intervalles égaux permettant de le mesurer. L'invention des automates à
séquences fut une étape fondamentale dans l'informatique. A cette époque, les
programmes qui effectuaient l'animation des automates étaient totalement intégrés aux
machines. Ils étaient figés mécaniquement et donc pour changer de scénario il était
nécessaire à chaque fois de recréer une machine. De tels automates existent encore de nos
jours : les jacquemarts de l'horloges de la Cathédrale de Strasbourg (1554) en sont un
exemple.
Au XVIIe siècle, apparaît la première machine à calculer : l'Horloge Calculante qui effectuait
des additions et des soustractions pour des calculs en astronomie. Inventée en 1623 par
WILHEM SCHICKARD (1592-1635), elle fonctionnait à l'aide de roues dentées et de repères
mémorisant les résultats intermédiaires. Une clochette retentissait lorsqu'un dépassement
de capacité de la machine survenait. La machine fut détruite après la mort de Schickard,
seul un plan fut conservé.
BLAISE PASCAL (1623-1662) réalisa une machine arithmétique (1642) pour aider son père,
collecteur d'impôts, à effectuer des additions, des soustractions et des conversions (de
monnaies). Il s'agissait d'une machine à programme figé qui utilisait des roues dentées à
dix positions. Les données ne faisaient pas partie de la machine, elles étaient entrées à
3

chaque utilisation. Cette approche donna un caractère déjà plus universel à cette
calculatrice. Une dizaine d'exemplaires de ces machines existent encore.
Au XVIIIe siècle, le philosophe et mathématicien allemand GOTTFRIED WILHEM VON
LEIBNIZ (1646-1716) construisit une machine effectuant quatre opérations : l'addition, la
soustraction, la multiplication et la division (roue de Leibniz). De son côté, le grenoblois
JACQUES DE VAUCANSON (1709-1782) mit au point de nombreuses machines : pompe à
élever les eaux, perceuse, premier métier à tisser, le joueur de flûte traversière (1737), le
canard (1738), le joueur de tambourin (1738), etc. Vers la fin du siècle, JOSEPH-MARIE
JACQUARD (1752-1834) inventa un métier à tisser, qui au lieu d'avoir un programme figé
comme dans les Jacquemarts, possédait un programme à l'extérieur sur des cartes
perforées (plus besoin de créer une nouvelle machine pour produire un motif de tissage
différent). On retrouve ce principe de machines à programmes extérieurs dans les
limonaires, les boîtes à musique et les pianos mécaniques du siècle dernier.
Les premiers développements importants pour le traitement de l'information ont lieu à la
fin du XIXe siècle. Les dispositifs qui étaient alors mécaniques deviennent
électromécaniques (à cames et électroaimants), puis électriques (à relais) et enfin
électroniques.
Sur le modèle de la machine de Leibniz, le Français CHARLES X. THOMAS (1785-1870)
construisit l'arithmomètre (1820), machine portable et pratique qui fut vendue à plus de
quinze mille exemplaires en trente ans. C'est en 1822 que Charles Babbage (...-1871)
construisit la machine différentielle. Non complètement satisfait de sa première
réalisation, il chercha à l'améliorer jusqu'en 1833.
Pendant cette période un certain nombre de techniques d'ingénierie furent développées.
Après l'abandon de la machine différentielle, CHARLES BABBAGE mit au point sur le papier
la machine analytique (qui ne vit jamais le jour). Il ajouta l'utilisation de mémoire pour les
résultats intermédiaires et la possibilité de choix dynamique et automatique des
instructions à exécuter.
Bien que l’utilisation de cartes perforées soit antérieure à 1725 soit avant même la
révolution industrielle, ce n’est qu’en 1890, que H. Hollerith eut l’idée d’utiliser une machine
de tri avec des cartes perforées pour effectuer le recensement des Américains.
Une idée très importante, s'appuyant sur les travaux de GEORGES BOOLE (1815-1864) en
1848 (l'algèbre de Boole) et sur la thèse de CLAUDE ELWOOD SHANNON (1916-) en 1938
4

(qui par la suite fonda la théorie de l'information) fut l'utilisation de la représentation des
informations sous forme binaire, c'est à dire sous 2 états : vrai ou faux, présent ou absent,
0 ou 1.
Durant la seconde guerre mondiale, des calculateurs puissants furent créés pour effectuer
des calculs de balistique ou permettre le décodage des messages cryptés.
En 1939, le prototype du premier calculateur vraiment numérique fut réalisé à l'Iowa State
College. Baptisé "ABC", il était la première machine à utiliser des tubes à vide comme
circuits logiques. Les deux concepteurs John Atanasoff et Clifford Berry donnèrent leurs
noms à cette machine : "ATANASOFF BERRY COMPUTER".
En 1943, COLOSSUS le premier calculateur électronique fut construit à des fins de
décryptage des messages générés par Enigma la machine de chiffrement allemande.
ALAN TURING faisait partie des concepteurs. Colossus comportait 5 processeurs pouvant
traiter chacun 5000 caractères par seconde. Grâce à des registres spéciaux et à une horloge
interne, les processeurs pouvaient travailler en parallèle, ce qui donnait à Colossus une
vitesse de 25000 caractères par seconde. Cette vitesse élevée fut capitale dans les efforts
de décryptage mis en oeuvre pendant la dernière guerre mondiale.
Le premier calculateur électromécanique commandé par programme, l'Automatic
Sequence Controlled Calculator (ASCC) Mark I, a été créé en 1944 par HOWARD HATAWAY
AIKEN qui s'est inspiré des plans de la machine analytique de Charles BABBAGE datant
d'une centaine d'années plus tôt. Cette machine pouvait additionner, soustraire, multiplier,
diviser, calculer des puissances et des logarithmes de 10, effectuer des calculs
trigonométriques de type sinus et cosinus. Il fallait 3 secondes au calculateur pour effectuer
une multiplication. Une bande de carton perforée portait les instructions et des relais
téléphoniques contrôlaient des registres à roues numérotées. Le mark I avait une longueur
de 15 mètres et une hauteur de 2,40 mètres pour pratiquement 800 km de câblage. Ce
calculateur fut par la suite utilisé à l'Université de Harvard pendant près de 15 ans. Le
premier supercalculateur CRAY 1S (1981) avait 10 km de câbles et son concurrent le Cyber
205 de Control Data Corporation en avait 700.
En 1946, le premier calculateur numérique de grande puissance entra en fonctionnement.
L'ENIAC (Electronic Numerical Integrator and Calculator) était programmé au moyen d'un
système d'interrupteurs et de fiches montées extérieurement. Il fut construit par J.
PRESPER ECKERT, JOHN MAUCKLY et GOLDSTINE. Constitué de milliers de tubes, cette
5

machine, qui resta opérationnelle jusqu'en 1956, disposait de branchements conditionnels


et était programmable manuellement. Elle possédait une faible capacité de mémorisation.
Une addition s'effectuait en 200 ms.
Il est admis que la naissance de l'informatique se situe en 1946, date à laquelle JOHANNES
VON NEUMANN (1903-1957) énonça le principe du premier ordinateur.
1.2.1. Les principes de l’ordinateurs
1) Possibilité de mémorisation des résultats partiels étendue à l'enregistrement des
programmes et des données,
2) Exécution séquentielle des instructions enregistrées avec possibilité de
branchement conditionnel.
Ce sont ces caractères d'adaptabilité aux problèmes posés (changement de programmes
ou appel de sous-programmes spécifiques) qui rendirent la machine de Von Neumann
universelle. C'est aussi ce qui la différenciait des calculateurs précédents.
1.2.2. Les fonctions de base d’un ordinateur :
Plus précisément, un ordinateur doit disposer en fait des fonctions de base suivantes :
1) Moyen d'entrée (échange et recensement des informations),
2) Moyen de mémorisation des informations,
3) Moyen de calcul (traitement de l'information),
4) Moyen de sortie (résultats),
5) Moyen de décision (choix entre des éventualités, l'une d'entre elles en fonction de
résultats antérieurs),
6) Gestion des données et des instructions (stockées dans le moyen de mémorisation
sous la même forme et accessibles de la même façon).
Les idées 1, 2 et 4 ont été introduites dès 1822 par le mathématicien Charles BABBAGE.
Celui-ci a rajouté les idées 3 et 5 vers 1830. L'idée 6 a été introduite par VON NEUMANN en
1947 (machines à programmes enregistrés dites machines de Von Neumann).
Dans la machine de Von Neumann, on peut distinguer deux composantes fondamentales :
1) L'UNITE CENTRALE QUI PERMET LA MEMORISATION ET LE TRAITEMENT DES
PROGRAMMES ET DES DONNEES,
2) L'UNITE D'ECHANGE POUR LES COMMUNICATIONS AVEC L'EXTERIEUR.
6

1.2. Quelques dates historiques en informatique

1642 Machine arithmétique de B. Pascal


1725 Métier à tisser de Jacquard (automate à programmes extérieurs)
1822 Machine différentielle de C. Babbage
1833 Machine analytique qui ne voit jamais le jour
1848 Algèbre de G. Boole
1890 Recensement des Américains (carte perforée de H. Hollerith)
1924 Création d'IBM et de la compagnie des machines Bull
1936 Church et Türing formalisent la notion d'algorithme.
1938 Shannon soutient une thèse sur l'algèbre Booléenne et l'électronique. Il
développera par la suite toute la théorie de l'information
1941 Origine de la Cybernétique avec Waren Mc Culloch, Walter Pitts et Norbert
Wiener avec la théorie de la commande des asservissements
1943 1ère calculatrice électronique ENIAC (Electronic Numerical Integrator And
Computer) : 18000 tubes et logique câblée.
194x Machines de Türing : calculatrices intégrées
1944 Goldstine et Von Neumann développent la théorie des jeux
1944 Howard Hathaway Aiken met au point le premier calculateur commandé par
programme l'ASCC Mark I (Automatic Sequence Controlled Calculator). Il s'inspire
des plans de la machine analytique de Charles Babbage.
1946 Von Neumann introduit le concept de programme enregistré dans une
mémoire : les instructions sont exécutées en séquence et certaines instructions
permettent le débranchement C'est à cette date que l'on situe la naissance de
l'informatique.
1946 Calculateur électronique ENIAC (Electronic Numerical Integrator and
Calculator) de J.Presper Eckert, John Mauckly et Goldstine.
1947 Le transistor
1948 F.C.Williams et T.Kiburn réalisent le premier ordinateur à programme
enregistré : le Manchester Mark I.
1948 Calculatrice électronique IBM 604 d'IBM
7

1950 Premiers ordinateurs UNIVAC 1, IBM et Bull, alliance de l'ordinateur et de la


mécanique avec mise au point des machines-outils à commande numériques
1956 Langage de programmation scientifique FORTRAN (IBM)
1957 Fondation de Control Data Corporation (CDC) par Seymour Cray
1959 Informatique à base de transistors (2éme génération)
1960 les circuits intégrés (début 1960)
1960 Mini informatique avec DEC (Digital Equipment Corporation) avec le PDP8
196x COBOL : COmmon Business Oriented Language (gestion)
1964 Création du langage BASIC par Kemeny et Kurz
1964 IBM360 architecture des ordinateurs (Amdahl), Famille de machines avec le
même jeu d'instructions, CDC6600
1970 Microprocesseur 4004 de INTEL (ancêtre du Pentium)
1972 Début des microprocesseurs
1972 Fondation de Cray Research Inc. par Seymour Cray.
1973 Système d'exploitation UNIX (version langage C)
1974 Système d'exploitation CP/M par Gary Kildall opérant sur microprocesseur
8088
1975 Microprocesseur Z80 (clône du 8080), Création de Microsoft par Bill Gates et
du BASIC sur Altaïr
1976 Installation du premier CRAY-1S aux USA.
1977 Apple II (8 bits Motorola 6502) mémoire de 64 Ko
1978 Microprocesseur 8086 (16 bits), Architecture orientée logiciel (VAX): simplifier
la compilation des langages de haut niveau
1979 Le premier tableur : Visicalc sur Apple II
1981 PC d'IBM (16 bits Intel 8088) mémoire inférieure à 1Mo avec le système
d'exploitation MS-DOS écrit par Microsoft.
1984 MacIntosh d'Apple avec son interface graphique et sa souris
1984 PC AT (Advanced Technology) processeur 80286 et DOS 3.0
1985 Novembre : Windows 1.01 (PC AT avec HD et écran EGA)
1986 Février : Windows 1.02 version française
1987 PS/2 avec la nouvelle architecture MCA et OS/2 (IBM)
1990 Windows 3.0
8

1992 Windows 3.1 et OS/2 2.0


1993 Le Pentium d'INTEL
1993 DOS 6.0 avec compresseur de données et antivirus intégré
1995 Windows 95
9

CHAP 2. Introduction au système informatique


2.1 Concepts fondamentaux
2.1.1. Accumulateur
Registre utilisé par l'unité arithmétique et logique (ALU) pour stocker les résultats des
calculs.
2.1.2. Unité logique arithmétique (ALU)
Composant du processeur qui effectue des calculs arithmétiques et logiques.
2.1.3. Bidirectionnel
Se déplacer ou fonctionner dans deux directions.
2.1.4. Binaire
Un système de numération qui contient deux symboles, 0 et 1. Également connu sous
le nom de base 2.
2.1.5. Bus
Les fils par lesquels les données voyagent d'une partie d'un ordinateur à une autre sur
la carte mère.
2.1.6. Mémoire cache
Un morceau de mémoire temporaire. Il peut faire référence à une partie de la ram, du
disque de stockage, du processeur ou à une zone de stockage de pages web.
2.1.7. SCRC
Calcul de jeu d'instructions complexes - un type de processeur que l'on trouve dans les
ordinateurs de bureau et les ordinateurs portables.
2.1.8. L'horloge
Un composant du cpu qui envoie des impulsions régulières. Son travail consiste à
synchroniser les composants matériels de l'ordinateur.
2.1.9. Vitesse de l'horloge
La vitesse du processeur d'un ordinateur, mesurée en hertz. Cela indique le nombre de
cycles de récupération-décodage-exécution qui peuvent s'exécuter par seconde.
2.1.10. Unité de commande (CU)
Le composant du CPU qui gère les instructions.
2.1.11. Cœur
Une unité de traitement dans un cpu. Les processeurs peuvent avoir plusieurs cœurs.
2.1.12. CPU/processeur
10

Unité centrale de traitement - le cerveau de l'ordinateur qui traite les instructions du


programme.
2.1.13. Les données
Unités d'information. En informatique, il peut y avoir différents types de données, y
compris des nombres entiers, des caractères et des booléens. Les données sont
souvent traitées par des instructions.
2.1.14. Décoder
Interpréter une consigne.
2.1.15. Système embarqué
Un ordinateur à usage spécial intégré à un autre appareil.
2.1.16. Exécuter
Exécuter une consigne.
2.1.17. Aller chercher
Récupérer les données de la mémoire.
2.1.18. Ordinateur à usage général
Un ordinateur conçu pour pouvoir exécuter un large éventail d'instructions.
2.1.19. Gigahertz
Une mesure de fréquence : 1 gigahertz (1 ghz) équivaut à 1 milliard de hertz.
2.1.20. Matériel
Composants physiques d'un système informatique, par exemple une carte graphique,
un disque dur ou un lecteur de cd.
2.1.21. Hertz
L'unité de fréquence, symbole 'Hz'. 1 Hz correspond à 1 onde ou cycle par seconde.
2.1.22. Saisir
Données insérées dans un système pour traitement et/ou stockage.
2.1.23. Dispositif d'entrée
Dispositif utilisé pour saisir des données ou des informations dans un ordinateur, par
exemple un clavier, une souris, un scanner ou un microphone.
2.1.24. Instruction
Une action unique qui peut être effectuée par un processeur informatique.
2.1.25. Mégahertz
1 000 000 hertz - une mesure de fréquence ou de cycles par seconde.
11

2.1.26. Carte mère


La carte de circuit imprimé à l'intérieur d'un ordinateur qui abrite le processeur, la
mémoire et les connexions à d'autres appareils.
2.1.27. Production
Données envoyées par un système.
2.1.28. Dispositif de sortie
Périphérique utilisé pour produire des données ou des informations à partir d'un
ordinateur, par exemple un moniteur, une imprimante ou des haut-parleurs.
2.1.29. Stockage primaire
La partie d'un ordinateur qui stocke des données.
2.1.30. Cartes perforées
Un morceau de carte avec des trous faits à des endroits spécifiques afin qu'un
ordinateur puisse le lire. C'était la façon originale de mettre des données et des logiciels
dans un ordinateur, mais elle n'est plus utilisée.
2.1.31. RAM
Mémoire vive. Il s'agit d'une mémoire volatile qui est constamment en cours d'écriture
et de lecture. Il ne conserve pas son contenu sans une alimentation électrique
constante. Lorsqu'un ordinateur est éteint, tout ce qui est stocké dans sa ram est
perdu.
2.1.32. S'inscrire
Section de mémoire haute vitesse du processeur qui stocke les données à traiter.
2.1.33. Risque
Calcul du jeu d'instructions réduit - un type de processeur que l'on trouve dans les
smartphones et les tablettes.
2.1.34. ROM
Mémoire en lecture seule. Il s'agit d'une mémoire non volatile ou d'un stockage
contenant des données qui ne peuvent pas être modifiées.
2.1.35. Stockage secondaire
Mémoire non volatile externe au CPU et utilisée pour le stockage à long terme des
programmes et des données.
2.1.36. Unidirectionnel
Se déplacer ou fonctionner dans une seule direction.
12

2.1.37. L'architecture de von Neumann


Une description de l'architecture de traitement utilisée par tous les processeurs. John Von
Neumann a inventé l'architecture du processeur qui stocke un programme en mémoire
sous forme d'instructions et les exécute de manière séquentielle à l'aide de l'alu, de l'unité
de contrôle et des registres. C'est ce qu'on appelle le concept de programme enregistré.

2.2. Présentation
L’ordinateur est considéré comme un système complexe et difficile à comprendre.
Pour les programmeurs, il serait bien difficile de créer des programmes tout en prenant en
compte de la gestion du matériel. Afin de gérer tous les composants de l’ordinateur, il fallait
une interface ou une couche intermédiaire (OS).
D’une part, le système d'exploitation (noté SE ou OS, abréviation du terme anglais
Operating System) est chargé d'assurer la liaison entre les ressources matérielles,
l'utilisateur et les applications (traitement de texte, jeu vidéo, ...). Ainsi lorsqu'un
programme désire accéder à une ressource matérielle, il ne lui est pas nécessaire d'envoyer
des informations spécifiques au périphérique il lui suffit d'envoyer les informations au
système d'exploitation, qui se charge de les transmettre au périphérique concerné via son
pilote. En l'absence de pilotes il faudrait que chaque programme reconnaisse et prenne en
compte la communication avec chaque type de périphérique.
Quand l’ordinateur est allumé, c’est grâce à cela que les fenêtres sont visibles, la gestion
des fichiers est possible, mais aussi l’installation des programmes ou des périphériques
externes.
13

Le système d'exploitation permet ainsi de "dissocier" les programmes et le matériel, ce qui


simplifie grandement la création de logiciels, afin notamment de simplifier la gestion des
ressources et offrir à l'utilisateur une interface homme-machine (notée «IHM») simplifiée
afin de lui permettre de s'affranchir de la complexité de la machine physique.

D'autre part, le système d'exploitation fournit un certain nombre d'outils pour gérer la
machine. Il assure l'initialisation du système après une mise sous tension (appelée RESET).
Grâce à des routines (drivers ou gestionnaires de périphériques) il peut gérer les
périphériques, en assurant des opérations aussi simples que l'affichage des caractères à
l'écran ou bien la lecture du clavier, mais aussi le pilotage d'une imprimante ou d'un
scanner...
Le système d'exploitation d'un ordinateur ou d'une installation informatique est un
ensemble de programmes qui remplissent deux grandes fonctions :
Gérer les ressources de l'installation matérielle en assurant leurs partages entre un
ensemble plus ou moins grand d'utilisateurs
Assurer un ensemble de services en présentant aux utilisateurs une interface mieux
adaptée à leurs besoins que celle de la machine physique
Un système informatique est un ensemble de matériels et de logiciels destiné à réaliser des
tâches mettant en jeu le traitement automatique de l'information.
La communication d'un tel système avec le monde extérieur est assurée par des organes
d’accès ; ceux-ci permettent également une interaction avec des dispositifs physiques que
le système informatique est chargé de surveiller ou piloter.
La fonction d'un système informatique est la fourniture de prestations (services) capables
d'aider à la réalisation de problèmes usuels :

Gestion de l’information : stockage, désignation, recherche, communication,


protection contre les intrusions ou les incidents ;
Préparation et mise au point de programmes ;
Gestion de l'ensemble des ressources pour permettre l'exploitation des
programmes (c'est-à-dire création d'un environnement nécessaire à l'exécution du
programme) ;
Gestion et partage de l'ensemble des ressources (matériels, informations, ...) Entre
l'ensemble des usagers ;
14

On peut considérer que cet ensemble de prestations, fournies par le système


d'exploitation, constitue pour l'usager de ce système, une machine nouvelle qualifiée
d'abstraite ou de virtuelle, par opposition à la machine physique réalisée par l'assemblage
de composants matériels.

 Logiciel d’application
 Logiciel de base
 Machine physique
Le logiciel de base peut lui-même être décomposé en deux niveaux :
 Les outils et services (compilateurs, chargeurs, éditeurs, utilitaires, ...)
 Le système d'exploitation
15

2.3. Les ordinateurs


A ce jour, les ordinateurs sont rangés en générations suivant l’évolution technologique et
électronique.
 Génération des tubes à vide
 Génération de traitement par lots`
 Génération des circuits intégrés et Multiprogrammation
 Génération des ordinateurs personnels, …
2.3.1. Quelques caractéristiques des générations :
 Les tubes à vide : ENIAC
Le programmeur opère avec la machine
par interaction directe (beaucoup de
manipulation et beaucoup de lourdeur);
• Concepteur = constructeur =
programmeur = opérateur ;
• Un programme dispose toujours de
toute la mémoire disponible ;
• Programmer l'E.N.I.A.C. consistait à
câbler des branchements et à ajuster des
boutons électriques.
 Traitement par lots
Le traitement par lots a constitué les
bases des systèmes d’exploitation
•Apparition des cartes perforées
•Séparation des rôles : le programmeur
n’est pas l’opérateur ;
•Enchaînement automatique des
commandes (« jobs ») dans une queue
d’exécution de programmes, c’est le
traitement par lots (« batch processing »);
• Sous-programmes d'E/S (chargement et
déchargement des cartes);
• Apparition des assembleurs ;
16

• Le système d'exploitation gère la mémoire, les processus et les E/S;


• Gestion par limitation de temps ;

 Circuits intégrés et Multiprogrammation


• Apparition des circuits intégrés ;
• Selon la loi de Moore, le nombre de
transistors d’un circuit intégré double tous les
18 mois,
• Apparition des disques magnétiques ;
• Notion de familles d’ordinateurs compatibles
(IBM System/360);

 Ordinateurs personnels
• C’est la génération des PCs (Personal Computer)
• Où l’électronique est miniaturisé et l’Apparition des micro-ordinateurs grand public (IBM
PC, p.ex.), de MS-DOS, des consoles de jeu;
• IBM conçoit le PC autour du processeur Intel 8080 sans OS
• Bill Gates à combiné l’utilisation du langage
BASIC avec le système d’exploitation DOS conçu par Seattle Computer Products.
• Bill Gates et Tim Patterson fondent Microsoft et
Tim finalise MS-DOS
• Les micro-processeurs
• Motorola 68000;
• L’utilisation d’Internet;
• Création d’applications
multimédia;
• Maturation des systèmes
d’exploitation vers ceux que l’on
connaît aujourd’hui;
17

• PC vs Mac
• Steve Jobs, co-inventeur d’Apple, visite un jour la société Xérox et voit une interface
graphique (prototype).
• Il développe un système d’exploitation et le matériel qui va avec : Lisa (un flop) puis le
Macintosh (un succès)
•Evolutions de MS-DOS influencées par le Macintosh avec l’ajout d’une interface
graphique.

2.4. Le système informatique

Par système informatique, on entend un système automatisé de stockage, de traitement


et de récupération de données qui tire parti des outils informatiques et électroniques pour
effectuer une série complexe de processus et d’opérations.
Les systèmes informatiques sont des types de systèmes d’information, c’est-à-dire, des
systèmes organisés autour du traitement de données de différentes sortes. Cependant,
tous les systèmes d’information ne sont pas des systèmes informatiques. Autrement dit,
tous ne sont pas numériques, automatisés ou électroniques.
Les systèmes informatiques occupent une place clé dans le monde contemporain pour
l’organisation et la mise en œuvre des processus productifs et d’autres natures dans les
entreprises. Par exemple, les applications informatiques pour l’échange d’informations
permettent de surmonter les difficultés rencontrées à cause de la distance.

2.4.1. Les composants des systèmes informatiques

Chaque système informatique est constitué de 3 composantes, à savoir le matériel, les


logiciels et l’humain.
 Matériel.
Il s’agit de l’ensemble de l’environnement lié aux éléments matériels qui participent au
système (ordinateur, écran, clavier, modem, clés USB, etc.).
 Logiciel.
Il englobe chacun des éléments qui peuvent être classés dans les environnements liés aux
programmes informatiques et applications. C’est la partie « software » du système qui fait
référence aux informations et systèmes virtuels programmés, numériques et intangibles.
 Humain.
18

La composante humaine (ressources humaines) est essentielle à tout système


informatique. Elle regroupe tous les utilisateurs qui interviennent dans un réseau
informatique, utilisent un ordinateur ou le programment.

2.5. Types de systèmes informatiques

Il n'y a pas que les PC. Les systèmes informatiques se présentent sous des formes très
variées allant des plus gros, les supercalculateurs aux plus petits tels que les cartes à puce.
Les PC deviennent de plus en plus puissants et remplacent progressivement de plus en plus
souvent les superordinateurs dans les grands centres de calculs.

C'est donc sous la forme de PC (Personnal Computer) que se présentent le plus souvent les
systèmes informatiques mais ils se présentent aussi sous d'autres formes plus discrètes à
savoir :
Stockage : Dans ce type de système, seules les données sont stockées. Les
exemples sont les disques durs externes.
Poursuite : Dans ce cas, il s'agit de simples sous-traitants. Les exemples sont les
routeurs WiFi ou les appareils Google « Chromecast ».
Mixte : Fait référence aux appareils qui, comme SI, stockent et traitent des données.
Les consoles de jeux vidéo en sont des exemples.
19

Production : La production de données provient des SI qui ont pour mission de


créer, stocker et traiter, dans cet ordre. Les exemples sont des appareils destinés
uniquement à « exploiter » des crypto-monnaies.
Plein : Un système informatique complet est un système qui stocke, traite et produit
avec peu ou presque pas de conditions. Les exemples sont des appareils surdoués
appelés « intelligents », qui sont toujours une IA dans son état le plus élémentaire.
Certains de ces appareils sont des montres intelligentes, des smartphones ou des
haut-parleurs intelligents.

2.6. Modularité des systèmes informatiques.

Pour le simple utilisateur, le système informatique n'est autre que le support de ses
applications. Il a appris à utiliser l'interface du système d'exploitation mais son
fonctionnement interne ainsi que celui du matériel le concernent assez peu. Pour les
utilisateurs avancés, c'est précisément le fonctionnement du système ou plus
modestement la structure de ce système qui intéresse et plus particulièrement celle du
logiciel : « l’essentiel de la masse d’un système informatique. » Ce qui fait que l'utilisateur a
l'impression de manipuler non pas des composants électroniques, des disques ou des
codes binaires mais bien des documents, le traitement de ses données ou la
communication.
Entre le matériel dont la complexité nous échappe souvent et l'utilisation, quelque chose a
été fait pour que les composants matériels et logiciels soient parfaitement
interchangeables et, pour ce faire, d'une modularité exceptionnelle.

2.6.1. Modularité du hardware

Le hardware est fait d'une multitude de composants d'origines diverses :


Conçus indépendamment les uns des autres
D'âges différents
De technologies différentes
Tous collaborent pourtant comme s'ils ne faisaient qu'un.

2.6.2. Modularité du software


20

Une série de modules dont les plus fondamentaux sont invisibles à l'utilisateur.
Ces modules doivent pouvoir être modifiés ou échangés facilement.
Ils doivent donc autant que possible être indépendants les uns des autres.
Ces modules sont idéalement superposés pour former une structure en couche.
Chaque couche n'a de liaisons qu'avec les deux couches attenantes.

2.7. Couche d'abstraction


La notion de couche d'abstraction (abstraction layer) permet de décrire les systèmes
informatiques comme s'il s'agissait d'empilement de couches qui se superposent en
apportant à chaque niveau supplémentaire de nouvelles fonctions de plus en plus
élaborées et reposant sur les fonctions plus élémentaires assurées par les couches sous-
jacentes.
Ces notions de couches d'abstraction ou de structure en couches seront réutilisées
plusieurs fois tantôt pour décrire les langages de programmation, tantôt pour décrire
l'architecture des machines, pour la structure des logiciels, les communications des
réseaux, etc.

Matériel : Circuits électroniques / circuits logiques. On dira que c'est au niveau du


matériel que se trouve la couche d'abstraction la plus basse.
Système d'exploitation : Elément le plus déterminant d'un système
informatique.
Applications : Traitement de texte, gestionnaire de bases de données, tableurs etc.
Compilateurs, debugger
21

Utilitaires : Services de base aux utilisateurs. Ex. interface graphique, interpréteur


de commandes, gestionnaires divers qui tournent en tâches de fond, impriment,
cherchent le courrier etc.
Utilisateurs : C'est à eux que le système informatique est destiné. Les utilisateurs
interagissent avec la couche de plus haut niveau.

2.8. L’architecture des systèmes informatique

En informatique, architecture désigne la structure générale inhérente à un système


informatique, l'organisation des différents éléments du système (logiciels et/ou matériels
et/ou humains et/ou informations) et des relations entre les éléments. Cette structure fait
suite à un ensemble de décisions stratégiques prises durant la conception de tout ou partie
du système informatique, par l'exercice d'une discipline technique et industrielle du
secteur de l'informatique dénommée elle aussi architecture, et dont le responsable est
l'architecte informatique.

2.9. Architecture Von Neumann


L’architecture de von Neumann est un modèle structurel d’ordinateur dans lequel une
unité de stockage (mémoire) unique sert à conserver à la fois les instructions et les données
demandées ou produites par le calcul. Les ordinateurs actuels sont tous basés sur des
versions améliorées de cette architecture.
L’architecture de von Neumann décompose l’ordinateur en 4 parties distinctes :
 L’unité arithmétique et logique (UAL ou ALU en anglais) ou unité de traitement :
son rôle est d’effectuer les opérations de base ;
 L’unité de contrôle ou de commande (control unit), chargée du « séquençage » des
opérations ;
 La mémoire qui contient à la fois les données et le programme qui indiquera à l’unité
de contrôle quels sont les calculs à faire sur ces données ;
 les dispositifs d’entrée-sortie (périphériques), qui permettent de communiquer
avec le monde extérieur.
22

2.9.1. Les principaux composants


2.9.1.1. Le microprocesseur
Le microprocesseur (ou unité centrale de traitement, UCT, en anglais Central Processing
Unit, CPU) est un composant essentiel qui exécute les instructions machine des
programmes informatiques.
Remarque : il est le plus souvent amovible, placé sur un support appelé socket, et équipé
d’un radiateur et d’un ventilateur (c’est le composant de la carte mère le plus gourmand
en énergie).
Il est schématiquement constitué de 3 parties :
 L’unité arithmétique et logique (ALU) est chargée de l’exécution de tous les calculs
que peut réaliser le microprocesseur :
o Opération arithmétiques (sur les nombres entiers ou flottants)
o Opérations logiques (sur les bits) ;
 Les registres permettent de mémoriser de l’information (donnée ou instruction) au
sein même du CPU, en très petite quantité ;
 L’unité de contrôle permet d’exécuter les instructions (les programmes), elle joue
le rôle de « chef d’orchestre » : récupération des instructions et des données pour
les envoyer à l’ALU.

À l'heure actuelle, il existe deux grandes compagnies qui se font la lutte dans la fabrication
des microprocesseurs. Ce sont les compagnies INTEL et AMD.
23

2.9.1.2. Évolution récente des microprocesseurs de la


compagnie INTEL

La compagnie INTEL est sur le point de sortir un microprocesseur à six cœurs pour les
serveurs.
 Elle développe la série de microprocesseurs Intel Core i7, Intel Core i5 et Intel Core
i3 pour les ordinateurs de bureau et les portables.

Meilleur Quadri-
cœurs Moyen Double cœurs à
Faible Double cœurs
Quadri-cœurs

 Elle développe le microprocesseur ATOM pour les petits ordinateurs de type


«Netbooks».

 Développement du microprocesseur INTEL Core 2 Qued, un microprocesseur à


quatre cœurs conçu pour les ordinateurs de bureau et portables.
24

 Développement du microprocesseur INTEL Core 2 Duo, un microprocesseur à


double cœurs conçu pour les ordinateurs de bureau.
 Développement du microprocesseur INTEL Centrino Duo, un microprocesseur à
double cœurs conçu pour les portables.

 Développement du microprocesseur INTEL Centrino, un microprocesseur à simple


cœur conçu pour les portables car il nécessite moins d'énergie pour fonctionner.

 Développement du microprocesseur INTEL Itanium, un microprocesseur très


performant conçu pour les serveurs. Les premiers INTEL Itanium étaient des
microprocesseurs à simple cœur mais ceux fabriqués aujourd'hui sont des doubles
cœurs et des quadri-cœurs qui fonctionnent à 64 bits.
 Développement du microprocesseur INTEL Xeon, un microprocesseur très
performant conçu pour les serveurs. Les premiers INTEL Xeon étaient des
microprocesseurs à simple cœur mais ceux fabriqués aujourd'hui sont des doubles
cœurs et des quadri-cœurs qui fonctionnent à 64 bits.
25

 Développement du microprocesseur Intel Pentium 4, un microprocesseur à


simple cœur conçu pour les ordinateurs de bureau et les portables.

2.9.1.3. Vitesses relatives de différents microprocesseurs de la compagnie Intel


 Intel Core i7 Extreme Edition (3.2 GHz)
 Intel Core i7 (2.66 GHz à 2.93 GHz)
 Intel Core 2 Extreme (3.2 GHz)
 Intel Core 2 Quad (2.33 GHz à 3.0 GHz)
 Intel Core 2 Duo (1.8 GHz à 3.33 GHz)
 Intel Xeon (1.6 GHz à 2.0 GHz) (pour serveurs)
 Intel Pentium double coeur (1.60 GHz à 2.70 GHz)
 Intel Pentium 4 (1.7 GHz à 3.06 GHz)
 Intel Itanium (733 MHz à 800 MHz)
 Intel Celeron (300 MHz à 2.0 GHz)
 Intel Pentium III (400 MHz à 1.26 GHz)
 Intel Pentium II (266 MHz à 333 MHz)
 Intel Pentium MMX (166 MHz à 266 MHz)
 Intel Pentium I (100 MHz à 166 MHz)
 Intel 486 (33 MHz à 100 MHz)
 Intel 386 (20 MHz à 40 MHz)
 Intel 186 (13 MHz à 25 MHz)

La compagnie Intel a été fondée en 1968 et était jusqu'à la fin des années 1990, la seule
grande compagnie de fabrication de microprocesseurs. C'est alors que l'arrivée des
microprocesseurs AMD, à coûts moins élevés pour une puissance similaire développa de la
compétition au géant Intel.
26

2.9.1.4. La compagnie AMD produit les types de microprocesseurs suivants :

 AMD Opteron à six cœurs (2.0 GHz à 2.6 GHz) (pour serveurs)
 AMD Phenom II X4 (2.5 GHz à 3.5 GHz)
 AMD Phenom II X3 (2.6 GHz à 2.8 GHz)
 AMD Athlon X2 (2.3 GHz à 2.7 GHz)
 AMD Opteron (1.8 GHz à 2.2 GHz)
 AMD Turion 64 X2
 AMD Turion Neo X2
 AMD Sempron (2.7 GHz)
 AMD Athlon (2.4 GHz à 2.7 GHz)
 AMD Athlon MP (2000+ à 2600+)
 AMD Athlon XP-M (1400+ à 2600+)
 AMD Duron (800 MHz à 1.3 GHz)
 AMD K6 (100 MHz à 550 MHz)

2.10. La mémoire
La mémoire permet de stocker des données et des programmes.
La mémoire se divise entre :
 Mémoire volatile contenant les programmes et données en cours de
fonctionnement) : cette mémoire perd son contenu lorsqu’elle n’est plus alimentée.
 Mémoire permanente contenant les programmes et données de base de la machine
: les données de cette mémoire ne disparaissent pas à la mise hors tension.
Dans la plupart des mémoires, les informations sont classées par adresses : chaque octet
est accessible par une adresse unique.
Pour des raisons économiques, les mémoires sont en général divisées en familles :
1) La famille de mémoire de masse
2) La famille de mémoire vive
3) La famille de mémoire cache
4) La famille de mémoire registre
27

2.10.1. Une mémoire de masse ou mémoire de stockage


La mémoire de masse sert à stocker à long
terme des grandes quantités
d’informations. Les technologies les plus
courantes de mémoires de masse sont
électromécaniques (disques durs – HDD) ou

à semi-conducteurs (SSD, clefs USB, …), elles


visent à obtenir une capacité de stockage
élevée à faible coût et ont généralement une
vitesse inférieure aux autres mémoires.
Ordres de grandeur :
 Capacité : jusqu’à 10 To (HDD)
 Vitesse : jusqu’à 500 Mo/s (SSD)

2.10.2. La mémoire vive ou RAM


La mémoire vive (RAM - Random Access Memory) est la mémoire principale de l'ordinateur
qui permet d'entreposer temporairement les données
utilisées par le microprocesseur lors de l'exécution d'un
programme d'un logiciel ou du système d'exploitation. La
mémoire vive d'un ordinateur n'est pas permanente ; elle
28

s'efface lorsque les programmes n'ont plus besoin des données entreposées ou encore,
dès que l'ordinateur est mis hors tension.
Les deux principales pièces qui donnent la vitesse à l’ordinateur sont le microprocesseur et
la mémoire vive. C’est pourquoi, il est recommandé
d’acheter la mémoire vive avec la plus grande
capacité que l’on peut se permettre. Par exemple,
un ordinateur avec 4 Go de mémoire vive sera plus
rapide qu’avec 2 Go de mémoire vive.
Ordres de grandeur :
 capacité : jusqu’à 32 Go
 vitesse : jusqu’à 2 Go/s

Détails:
Tout ordinateur contient au moins deux types de RAM; le DRAM (Dynamic RAM) et le
SRAM (Static RAM). De plus, plusieurs cartes d'extension et périphériques contiennent leur
propre mémoire vive. Par exemple, les imprimantes ont une mémoire vive de type PRAM
(Peripheral RAM) et les cartes vidéo ont une mémoire vive de type VRAM (Video RAM) qui
leur permet d'entreposer temporairement les données avant de les imprimer ou de les
afficher à l'écran.
La mémoire vive de type DRAM (Dynamic RAM) est celle que l'on entend parler le plus
souvent car les acheteurs ou propriétaires d'un ordinateur peuvent prendre une décision
face au type qu'ils vont se procurer lors de l'achat ou de la mise à jour d'un ordinateur. Les
données entreposées temporairement dans la mémoire vive DRAM sont localisés dans des
milliers d'emplacements de mémoire nommées matrices (arrays) qui doivent être
continuellement rafraîchies électroniquement des centaines de fois par seconde.

Exemples : SDRAM (Synchronous Dynamic RAM). On distingue la SDRAM 66, 100 et 133
(fréquence d'accès en MHz), pour les machines de la génération Pentium II, Pentium III,
elle comporte normalement 168 broches.
29

RDRAM (Rambus Dynamic RAM).utilisée pour les machines de génération Pentium III et
Pentium 4.

DDR SDRAM (Double Data Rate Synchronous Dynamic RAM).On distingue les DDR PC1600,
PC2100, PC2700, PC3200 Le numéro représente la quantité théorique maximale de
transfert d'information en Mégaoctets par seconde (il faut multiplier par 8 pour obtenir
cette vitesse en Mégabits par seconde, un octet étant composé de 8 bits). Pour les
machines de génération Pentium III et Pentium 4. Elle comporte normalement 184 broches.

DDR2 SDRAM (Double Data Rate two SDRAM). On distingue les DDR2-400, DDR2-533,
DDR2-667, DDR2-800 et DDR2-1066. Le numéro (400, 533, ...) représente la fréquence de
fonctionnement.ou en quantité de données théoriquement transportables (PC2-4200, PC2-
5300, etcPour les machines de génération Pentium 4 et plus. Elle comporte normalement
240 broches.

DDR3 SDRAM (Double Data Rate three SDRAM). Il s'agit de la 3e génération de la


technologie DDR.commercialisés à partir de l'année 2007 offrant des améliorations de
performances tout en diminuant la consommation électrique.
30

Historique :

Les premiers modules de mémoire vive étaient soudés à la carte mère et malgré son grand
espace, ne pouvaient contenir qu'une faible quantité de données de l'ordre de 8 ko à 16 ko.
Par la suite, les cartes mères ont été construites avec des socles de type SIMM (single in-
line memory modules) permettant d'y insérer des carte d'extension de mémoire de 30
broches ou des barrettes de mémoire de 72 broches.
(Les barrettes de mémoire vive des anciens Pentium I 133 MHz sont de type SIMM à 72
broches.)
Quelques années plus tard, les cartes mères furent construites avec des socles de type
DIMM (dual in-line memory modules) permettant d'y insérer des barrettes de mémoire de
72, 168 et maintenant 240 broches.
(Les barrettes de mémoire vive des Celeron 800 MHz utilisés pour l'étude de l'assemblage
et la réparation d'ordinateurs sont de type DIMM à 168 broches.)
Récemment, la compagnie Intel, avec la collaboration de la compagnie Rambus Inc.,
développa les barrettes de mémoire de type RDRAM (Rambus DRAM) et DRDRAM (Direct
Rambus DRAM), qui demanda la construction de cartes mères avec le nouveau socle de
type RIMM (Rambus in-line memory modules) permettant d'y insérer des barrettes de
mémoire de 184 et 240 broches. Puisque les barrettes de de mémoire RDRAM et DRDRAM
fonctionnent à une très haute vitesse, un écran protecteur de chaleur est intégré aux socles
de type RIMM.

Il existe divers types de mémoire vive de type DRAM (Dynamic RAM) et en voici les
principaux dans le tableau ci-dessous:
Technologie Vitesse
DDR 3 SDRAM (double-data-rate X3 SDRAM ) 400 MHz
La technologie de la mémoire DDR3 (ou DDR-III) permet d'atteindre des à
débits de 10 Go/s et est conçu à l'échelle de 90 nanomètre ce qui permet 800 MHz
une grande réduction de la consommation d'énergie. La DDR3 possède
240 broches.
DDR 2 SDRAM (double-data-rate X2 SDRAM ) 800 MHz
La technologie de la mémoire DDR2 (ou DDR-II) permet d'atteindre des
débits deux fois plus élevés que la DDR à fréquence externe égale. La
DDR2 possède également un plus grand nombre de connecteurs que la
DDR classique (240 pour la DDR2 contre 184 pour la DDR).
31

Technologie Vitesse
DRDRAM (Direct Rambus DRAM) 800 MHz
La technologie de ce type de mémoire vive se base sur une bande plus
large pour le transfert encore plus rapide des données.
RDRAM (Rambus DRAM) 600 MHz
La technologie de ce type de mémoire vive se base sur une bande large
pour le transfert rapide des données.
DDR SDRAM (double-data-rate SDRAM) 266 MHz
La technologie de ce type de mémoire vive est la plus rapide des SDRAM
et est souvent appelée SDRAM II car elle laisse transmettre deux bits de
données par cycle.
SDRAM (synchronous DRAM) 133 MHz
La technologie de ce type de mémoire vive se synchronise avec l'horloge
du microprocesseur pour fonctionner à bonne vitesse tout en ayant une
bonne stabilité.
BEDO DRAM (burst EDO DRAM) 66 MHz
La technologie de ce type de mémoire vive transfert les données à une
vitesse constante sauf qu'à certains moments, le transfert s'effectue plus
rapidement.
EDO DRAM (extended data output DRAM) 40 MHz
La technologie de ce type de mémoire vive est 10% plus rapide que le FPM
DRAM car elle permet le retrait d'un second bit de données aussitôt que
le bit précédent est envoyé.
FPM DRAM (fast page mode DRAM) 28.5 MHz
La technologie de ce type de mémoire vive supporte un transfert de
données typique à une vitesse variante de 80 à 100 nanosecondes. Avec
ce type de mémoire vive, il est possible de retirer des bits de données
relatives dans une même colonne d'une matrice (array) sans faire une
demande pour chaque bit.

Puisque la mémoire vive d'un ordinateur fonctionne au niveau bit qui peuvent chacun
accommoder les valeurs 0 (fermé) et 1 (ouvert) et que le transfert des données est effectué
au niveau du bit, les barrettes de mémoire vive sont disponibles en capacité toujours paires
(multiples de 2 correspondant à 0 et 1 du système binaire). Un système devrait donc
contenir que les capacités de mémoire vive suivante:
21 = 2 Mo
22 = 4 Mo
23 = 8 Mo
24 = 16 Mo
25 = 32 Mo
26 = 64 Mo
32

27 = 128 Mo
28 = 256 Mo
29 = 512 Mo
210 = 1024 Mo
211 = 2048 Mo
212 = 4096 Mo
213 = 8192 Mo

Mémoire vive SRAM (Static RAM):


Contrairement à la mémoire vive de type DRAM (Dynamic RAM), la mémoire vive de type
SRAM (Static RAM) n'a pas besoin d'être continuellement rafraîchie pour retenir ses
données. Ce type de mémoire est ainsi plus rapide et plus stable que la mémoire vive de
type DRAM. C'est la principale raison pour laquelle la mémoire vive de type SRAM est plus
dispendieuse que la mémoire vive de type DRAM et est réservée pour les mémoires caches
L1 (niveau 1) et L2 (niveau 2) qui servent à retenir temporairement les données entre la
mémoire principale et le microprocesseur de l'ordinateur. Dans les nouveaux systèmes, la
mémoire cache L1 est nommée mémoire interne puisqu'elle est intégrée dans le
microprocesseur, permettant ainsi d'augmenter encore plus la vitesse de la manipulation
des données. La mémoire cache L2 est nommée mémoire externe et est généralement
située entre le microprocesseur et la mémoire vive de type DRAM. De nos jours, un
ordinateur contient entre 256 Ko et 1 Mo de mémoire vive de type SRAM.

Mémoire morte (ROM - read-only memory):


Contrairement à la mémoire vive (RAM), la
mémoire morte (ROM - read-only memory)
conserve son contenu hors tension. L'information
dans ce type de mémoire est disponible qu'en
lecture seulement. La mémoire morte (ROM) dans
un ordinateur est soit soudée ou insérée dans un
socle particulier sur la carte mère. La mémoire
morte (ROM) est généralement de petite capacité
et sert surtout à contenir l'information du BIOS
(Basic Input/Output System), une série
d'instructions qui contrôlent le démarrage de l'ordinateur en activant les composants de
l'ordinateur et le système d'exploitation.

Avec le temps, les fabricants d'ordinateurs, ont remplacé la mémoire morte (ROM - read-
only memory) par une mémoire de type PROM (programmable ROM) permettant ainsi à
l'utilisateur d'effectuer des modifications du BIOS lui permettant alors de faire des mises à
jour sur son ordinateur. Il existe aujourd'hui divers types de PROM dont EPROM (erasable
ROM) et EEPROM (electronically erasable ROM).
33

2.10.3. Mémoire cache


Une mémoire cache ou antémémoire est, en informatique, une mémoire qui enregistre
temporairement des copies de données provenant d'une source, afin de diminuer le temps
d'un accès ultérieur (en lecture) d'un matériel informatique (en général, un processeur) à
ces données.

Différents niveaux de mémoire

Ces mémoires cache servent à conserver un court instant des informations fréquemment
consultées. Elles ont une très grande vitesse, et un coût élevé pour une faible capacité de
stockage.
Ordres de grandeur :
Capacité : quelques ko (L1) à quelques Mo (L2)
Vitesse : jusqu’à 5 Go/s

2.10.4. Registre de processeur

Un registre est un emplacement de mémoire interne à un processeur. Les registres se


situent au sommet de la hiérarchie mémoire : il s'agit de la mémoire la plus rapide d'un
ordinateur, mais dont le coût de fabrication est le plus élevé, car la place dans un
microprocesseur est limitée.
Une architecture externe de processeur définit un ensemble de registres, dits
architecturaux, qui sont accessibles par son jeu d'instructions. Ils constituent l'état externe
(architectural) du processeur. Cependant, une réalisation donnée d'une architecture
interne (microarchitecture) peut contenir un ensemble différent de registres, qui sont en
général plus nombreux que les registres architecturaux. Ils stockent non seulement l'état
externe du processeur, mais aussi celui de sa microarchitecture : valeurs opérandes,
indicateurs, etc. Ce dernier état est utilisé exclusivement par la microarchitecture, et n'est
pas visible par le jeu d'instructions (architecture). Un processeur peut contenir plusieurs
34

centaines de registres, mais, à titre d’exemple, un processeur Intel 32 bits en contient seize.
Chaque registre a une capacité de 8, 16, 32 ou 64 bits3 (couramment la taille d’un bus).
2.11. Les bus des données
Pour que les données circulent entre les différentes parties d’un ordinateur (mémoire, CPU
et les entrées/sorties), il existe des systèmes de communication appelés bus. Il en existe de
3 grands types :
 Le bus d’adresse permet de faire circuler des adresses, par exemple l’adresse d’une
donnée à aller chercher en mémoire ;
 Le bus de données permet de faire circuler des données ;
 Le bus de contrôle permet de spécifier le type d’action, exemples : écriture d’une
donnée en mémoire, lecture d’une donnée en mémoire.

Les bus sont chargés de transporter les informations entre le microprocesseur et la


mémoire ou les périphériques :
 Bus processeur : on l’appelle aussi bus système ou FSB (Front Side Bus). Il relie le
microprocesseur au pont nord puis à la mémoire. C’est un bus 64 bits.
 Bus IDE : il permet de relier au maximum 2 périphériques de stockage interne par
canal (disque dur ou lecteur DVDROM/CDROM). Son débit est de 133 Mo/s. Lorsque
2 périphériques sont reliés sur le même canal, un doit être le maître (prioritaire sur
la prise du bus) et l’autre l’esclave.
 Bus PCI (Peripheral Component Interconnect) : Il a été créé en 1991 par Intel. Il
permet de connecter des périphériques internes. C’est le premier bus à avoir unifié
l’interconnexion des systèmes d’entrée/sortie sur un PC et à introduire le système
35

plug-and-play. Il autorise aussi le DMA. C’est un bus de 32 bits. On retrouve une


révision du bus PCI sur les cartes mères de serveur ayant une largeur de bus de 64
bits et une fréquence de 133 MHz.
 Bus AGP (Accelered Graphic Port):. Il a été créé en 1997 lors de l’explosion de
l’utilisation des cartes 3D qui nécessitent toujours plus de bandes passantes pour
obtenir des rendus très réalistes. C’est une amélioration du bus PCI. Il autorise en
plus le DIME (DIrect Memory Execution) qui permet au processeur graphique de
travailler directement avec les données contenues dans la RAM sans passer par le
microprocesseur à l’instar d’un DMA. C’est un bus 32 bits et son débit maximum est
de 2 Go/s (en x8).
 Bus ISA (Industry Standard Architecture) : C’est l’ancêtre du bus PCI. On ne le
retrouve plus sur les nouvelles générations de cartes mères.
 Bus SCSI (Small Computer System Interface) : c’est un bus d’entrée/sortie parallèle
permettant de relier un maximum de 7 ou 15 périphériques par contrôleur suivant
la révision du protocole utilisée. C’est une interface concurrente à l’IDE qui présente
l’avantage de pouvoir connecter plus de périphériques pour des débits supérieurs.
En outre, ces périphériques peuvent partager le bus lors d’un dialogue
contrairement à l’IDE. Mais son coût reste très élevé… elle est utilisée pour les
serveurs.
 Bus USB (Universal Serial Bus ) : c’est un bus d’entrée/sortie plug-and-play série.
Dans sa deuxième révision (USB 2.0), il atteint un débit de 60 Mo/s. Un de ces
avantages est de pouvoir connecter théoriquement 127 périphériques. Il supporte
de plus le hot plug-and-play (connexion ou déconnexion de périphériques alors que
le PC fonctionne).
 Bus firewire : c’est un bus SCSI série. Il permet de connecter jusqu’à 63
 périphériques à des débits très élevés (100 à 400 Mo/s). Ces applications sont
tournées vers la transmission de vidéos numériques.
 Liaison pont nord/pont sud : ses caractéristiques dépendent du chipset utilisé.
Chaque fabricant a en effet développé une solution propriétaire pour connecter les
deux composants de leur chipset. Pour Intel, c’est Intel Hub Architecture (IHA) dont
les débits atteignent 533 Mo/s. Pour Nvidia (en collaboration avec AMD), c’est
l’HyperTransport qui atteint des débits de 800 Mo/s.
Remarques :
1. Tous les bus « internes » (PCI, IDE, AGP) vont être amenés à disparaître très
rapidement et seront remplacés par des bus série :
 Le Serial Ata, remplaçant du bus IDE, présente des débits de 150 Mo/s qui passeront
bientôt à 300 Mo/s dans la prochaine révision du bus. Il permet de connecter des
disques durs ou des lecteurs optiques.
 Le PCI Express, remplaçant des bus PCI et AGP, permet d’atteindre des débits de
250 Mo/s dans sa version de base qui peuvent monter jusqu’à 8Go/s dans sa version
36

x16 destinée à des périphériques nécessitant des bandes passantes très élevées
(application graphique).
2. Les bus de connexions filaires tendent à être remplacés par des systèmes de
communications sans fils. A l’heure actuelle, il existe :
 Le Bluetooth qui offre actuellement un débit de 1 Mb/s pour une portée d’une
dizaine de mètre et qui va servir à connecter des périphériques nécessitant des
bandes passantes faibles (clavier, souris, etc…).
 Le WIFI (WIreless FIdelity Network) qui permet de connecter des ordinateurs en
réseau. La dernière révision permet des débits de 54 Mb/s.
37

CHAP 3 : Les systèmes d’exploitation et les programmes applicatifs


Le Système d'Exploitation (Operating System) est l'ensemble des logiciels effectuant la
gestion optimale des ressources d'un système informatique. Installé, on dit encore « chargé
» en mémoire centrale lors du démarrage, le Système Opératoire prend en charge la
gestion complexe des constituants d'un ordinateur (processeur, mémoire,
périphériques…) et en optimise l'utilisation. Il permet tout simplement de rendre
opérationnel un ordinateur.

Les fonctions principales sont :


 Gestion des applications ou travaux (partage de l'UC),
 Gestion des utilisateurs,
 Gestion des interruptions,
 Gestion de la Mémoire Centrale,
 Gestion de la Mémoire Secondaire (gestion des fichiers).
Un système d'exploitation possède :
 Un système de dialogue avec l’utilisateur soit à travers une interface graphique soit à
l’aide d’une interface de type « console » où les commandes sont entrées en mode
ligne ;
 Un interpréteur de commande,
38

 Un certain nombre de services : éditeur de texte, tableur, navigateur, compilateur, etc.

3.1. OS pour ordinateur


Le système Windows® de la société Microsoft, très majoritaire, se distingue par sa piètre
qualité et sa vulnérabilité aux virus. C'est un système privateur et qui espionne ses
utilisateurs. Néanmoins il est possible d'y installer de nombreux logiciels libres.
Le système MacOs® (anciennement OS X®) de la société Apple, minoritaire, est de bonne
qualité mais vendu exclusivement avec du matériel (Mac) dont le rapport qualité-prix est
médiocre (l'acheteur paye l'image de marque). C'est un système privateur qui cherche à
enfermer ses utilisateurs par un système d'incompatibilités soigneusement étudiées.
Néanmoins il est possible d'y installer de multiples logiciels libres.

Le système GNU/Linux (par exemple distribué par Ubuntu ou Linux Mint), marginal sur les
ordinateurs personnels - mais très répandu sur les serveurs -, combine qualité, sécurité et
liberté. Il est gratuit et inclut une grande quantité de logiciels libres.

3.1.1. OS pour ordiphones et tablettes


Le système Windows Phone® de la société Microsoft, marginal, dispose de peu
d'applications. C'est un système privateur qui ne permet quasiment pas l'installation de
logiciels libres.
Le système iOS® de la société Apple, minoritaire, dispose de nombreuses applications. Il
est vendu exclusivement avec du matériel (iPhone, iPad) dont le rapport qualité-prix est
39

médiocre (l'acheteur paye l'image de marque). C'est un système privateur qui cherche à
enfermer ses utilisateurs par un système d'incompatibilités soigneusement étudiées. Il ne
permet quasiment pas l'installation de logiciels libres.
Le système Android® de la société Google, majoritaire, dispose de nombreuses
applications. Bien que basé sur Linux, c'est un système privateur. Néanmoins il est possible
d'y installer de nombreux logiciels libres.
Une bonne partie des applications Google et certains composants systèmes de Google
peuvent de plus être désactivés. Le magasin d'application F-Droid permet de remplacer les
applications privatrices par des équivalents libres.
Le système Sailfish OS de la société Jolla, marginal, est basé sur Linux et il est compatible
avec les applications pour Android®, sauf exceptions. C'est un système libre (à l'exception
de l'interface utilisateur).
Le système Fairphone Open de la société Fairphone, marginal, est basé sur Android Open
Source Project et il est compatible avec les applications pour Android®, sauf exceptions. Il
est disponible exclusivement pour le Fairphone, un ordiphone fabriqué selon des normes
éthiques. C'est un système libre.
3.2. Emplacement du système d’exploitation dans un ordinateur

3.2.1. Mode Noyau :


Le noyau du système d’exploitation appelé en anglais le Kernel, il représente les fonctions
fondamentales du système d'exploitation (manière de fonctionnement du système
d’exploitation) telles que :
40

• La gestion des processus,


• La gestion de la mémoire,
• La gestion des entrées-sorties,
• La gestion des fichiers
– Inclus la gestion du matériel, et l’exécution de toutes les instructions comprises par le
processeur
3.2.2. Mode Utilisateur :
– Correspond au mode de fonctionnement de tous les programmes
– Par contre, aucun accès direct au matériel n’est autorisé
3.2.3. Interface Utilisateur :
– Le niveau bas des programmes utilisateurs
– Utilisé pour démarrer d’autres programmes navigateur
– Interface graphique ou textuelle.
3.2.4. Système d’exploitation :
– Linux ou Windows et / ou MacOS: Plusieurs millions de codes
– Temps de vie supérieur au à celui des programmes.
3.3. Illustration d’un système d’exploitation

3.4. Finalités du système d’exploitation

 Gestion des informations : stockage, recherche protection,


41

 Gestion des ressources matérielles et logicielles : optimisation, sécurité, exécution


des applications, partage entre usager,
 Assurer une sécurité vis-à-vis du matériel et personnel -Rendre compte de l'activité
de la machine.
3.5. Fonctions du système d'exploitation
Les principales fonctions du système d'exploitation peuvent être classées
hiérarchiquement (couches) :

3.6. Classifications des systèmes


Différents types de classifications sont utilisés :
 Par la méthode d'accès au système par l'usager,
 Par sessions : ce sont les systèmes transactionnels ou conversationnels (ex:
réservation d'un billet ONCF),
 Par requête : temps réel,
 Par travaux (batch) : traitement par lots (ex: mise à jour des comptes bancaires la
nuit),
 Par le genre d'applications des usagers-développement de programmes-
manipulation des données,
 Par la configuration matérielle,
 Un seul processeur : système monoprocesseur,
 Plusieurs processeurs : système multiprocesseur -basée sur un réseau. Système
réseau,
 Par la politique de partage des ressources physiques et logiques
42

 Partage de la mémoire entre plusieurs programmes : système multiprogrammé,


 Partage du temps processeur entre les programmes en exécution : temps partagé
(partage par quantum de temps) ou temps réel (partage par priorité des taches),
 Par le nombre d'usagers simultanés -système monoposte -système multiposte.
3.7. Les qualités d'un système
 La fiabilité : limiter les conséquences des défaillances matérielles ou des erreurs
des utilisateurs. En cas de panne, éviter les pertes d'information ou leur
incohérence.
 Efficacité : Utiliser au mieux les ressources et possibilités matérielles (sans en
consommer trop pour lui-même)
 Facilité d’emploi : Offrir un langage de commande (dialogue usager/système) et
des diagnostics d'erreurs (système/usager) clairs et précis
 Adaptabilité : Permettre des modifications matérielles et logicielles les plus
simples possibles, à l'aide d'outils spécialisés
 Mesurabilité : Enregistrer la comptabilité des ressources utilisées par les usagers,
mesurer les paramètres de fonctionnement et de charge.
3.8. Rôles du système d'exploitation

Les rôles du système d'exploitation sont divers :


• Gestion du processeur : le système d'exploitation est chargé de gérer l'allocation du
processeur entre les différents programmes grâce à un algorithme d'ordonnancement. Le
type d'ordonnanceur est totalement dépendant du système d'exploitation, en fonction de
l'objectif visé.

• Gestion de la mémoire vive : le système d'exploitation est chargé de gérer l'espace


mémoire alloué à chaque application et, le cas échéant, à chaque usager. En cas
d'insuffisance de mémoire physique, le système d'exploitation peut créer une zone
mémoire sur le disque dur, appelée « mémoire virtuelle ». La mémoire virtuelle permet de
faire fonctionner des applications nécessitant plus de mémoire qu'il n'y a de mémoire vive
disponible sur le système. En contrepartie cette mémoire est beaucoup plus lente.
43

• Gestion des entrées/sorties : le système d'exploitation permet d'unifier et de contrôler


l'accès des programmes aux ressources matérielles par l'intermédiaire des pilotes (appelés
également gestionnaires de périphériques ou gestionnaires d'entrée/sortie).

• Gestion de l'exécution des applications : le système d'exploitation est chargé de la bonne


exécution des applications en leur affectant les ressources nécessaires à leur bon
fonctionnement. Il permet à ce titre de «tuer» une application ne répondant plus
correctement.

• Gestion des droits : le système d'exploitation est chargé de la sécurité liée à l'exécution
des programmes en garantissant que les ressources ne sont utilisées que par les
programmes et utilisateurs possédant les droits adéquats.

• Gestion des fichiers : le système d'exploitation gère la lecture et l'écriture dans le système
de fichiers et les droits d'accès aux fichiers par les utilisateurs et les applications.

• Gestion des informations : le système d'exploitation fournit un certain nombre


d'indicateurs permettant de diagnostiquer le bon fonctionnement de la machine.
44

3.9. Quelques systèmes d'exploitation


3.9.1. Systèmes multitâches
Un système d'exploitation est dit «multitâche» (en anglais multithreaded) lorsque plusieurs
«tâches» (également appelées processus) peuvent être exécutées simultanément.
Les applications sont composées en séquence d'instructions que l'on appelle «processus
légers» (en anglais «threads»). Ces threads seront tour à tour actifs, en attente, suspendus
ou détruits, suivant la priorité qui leur est associée ou bien exécutés séquentiellement.

Un système est dit préemptif lorsqu'il possède un ordonnanceur (aussi appelé


planificateur), qui répartit, selon des critères de priorité, le temps machine entre les
différents processus qui en font la demande.

Le système est dit à temps partagé lorsqu'un quota de temps est alloué à chaque processus
par l'ordonnanceur.
C'est notamment le cas des systèmes multi-utilisateurs qui permettent à plusieurs
utilisateurs d'utiliser simultanément sur une même machine des applications différentes
ou bien similaires : le système est alors dit "système transactionnel".
Pour ce faire, le système alloue à chaque utilisateur une tranche de temps.
Les systèmes d'exploitation multitâches permettent de partager le temps du processeur
pour plusieurs programmes, ainsi ceux-ci sembleront s'exécuter simultanément. Pour
réaliser ce processus, les applications sont découpées en séquence d'instructions que l'on
appelle tâches ou processus. Ces tâches seront tour à tour actives, en attente, suspendues
ou détruites, suivant la priorité qui leur est associée ou bien séquentiellement.

3.9.2. Systèmes préemptifs


Un système est dit préemptif lorsqu'il possède un Ordonnanceur (aussi appelé
planificateur), qui répartit, selon des critères de priorité le temps machine entre les
différentes tâches qui en font la demande.

3.9.3. Systèmes à temps partagés


Le système est dit à temps partagé lorsqu'un quota de temps est alloué à chaque processus
par l'ordonnancer. Cela est notamment le cas des systèmes Multi-Utilisateurs qui
permettent à plusieurs utilisateurs d'utiliser simultanément sur une même machine des
45

applications similaires (le système est alors dit "système transactionnel") ou différentes.
Dans ce cas, le système alloue à chaque utilisateur une tranche de temps.

3.9.4. Systèmes multiprocesseurs


Le multiprocessing est une technique consistant à faire fonctionner plusieurs processeurs
en parallèle afin d'obtenir une puissance de calcul plus importante que celle obtenue avec
un processeur haut de gamme ou bien afin d'augmenter la disponibilité du système (en cas
de panne d'un processeur).

On appelle SMP (Symmetric Multiprocessing ou Symmetric Multiprocessor) une


architecture dans laquelle tous les processeurs accèdent à un espace mémoire partagé.

Un système multiprocesseur doit donc être capable de gérer le partage de la mémoire


entre plusieurs processeurs mais également de distribuer la charge de travail.

Ces systèmes peuvent être soit architecturés autour d'un processeur central qui
coordonne les autres processeurs, soit avec des processeurs indépendants qui possèdent
chacun leur système d'exploitation, ce qui leur vaut de communiquer entre eux par
l'intermédiaire de protocoles.

3.10. Composantes du système d'exploitation

Le système d'exploitation est composé d'un ensemble de logiciels permettant de gérer les
interactions avec le matériel. Parmi cet ensemble de logiciels on distingue généralement
les éléments suivants :

3.10.1. Différence entre noyau et système d’exploitation

Le système d’exploitation est le logiciel système qui gère l’ordinateur. Ses tâches incluent
la gestion des ressources informatiques et la prise en compte de leurs besoins en
communication. Le noyau est la partie principale d’un système d’exploitation qui assure
principalement la communication directe avec les ressources matérielles. Sans le noyau, un
système d’exploitation ne peut pas fonctionner. Mais comme le noyau d’un système
d’exploitation est enterré avec de nombreux autres composants, la plupart des utilisateurs
ne sont pas conscients de l’existence d’un noyau.
46

3.10.1.1. Table de comparaison

Noyau Système d’exploitation


Le noyau est une partie importante du Système d’exploitation est un programme
système d’exploitation. système.
Le noyau est une interface entre le logiciel Le système d’exploitation est une interface
et le matériel de l’ordinateur. entre l’utilisateur et le matériel de
l’ordinateur.
Type de noyau : Noyaux monolithiques et Type de système d’exploitation : Système
micro-noyaux. batch unique et multiprogrammation,
système d’exploitation distribué, système
d’exploitation temps réel.
Gestion de la mémoire du noyau, gestion Le système d’exploitation est responsable
des processus, gestion des tâches, gestion de la protection et de la sécurité de
des disques. l’ordinateur.
Le noyau est le cœur (ou le niveau le plus bas) du système d’exploitation. Tous les autres
composants du système d’exploitation (applications, interface graphique, gestion de
fichiers, shell, etc.) dépendent du noyau. Le noyau est responsable de la communication
avec le matériel, et c’est en fait la partie du système d’exploitation qui communique
directement avec le matériel. De nombreuses routines appelables pouvant être utilisées
pour accéder à des fichiers, afficher des graphiques, obtenir des entrées/sorties comme le
clavier, souris sont fournies par le noyau pour être utilisées par d’autres logiciels.

3.11. Fonctions d’un système d’exploitation

 Architecture – en couches
47

3.11.1. Le noyau
Un noyau de système d’exploitation, ou simplement noyau, ou kernel (de l'anglais), est une
des parties fondamentales de certains systèmes d’exploitation. Il gère les ressources de
l’ordinateur et permet aux différents composants — matériels et logiciels — de
communiquer entre eux.
En tant que partie du système d’exploitation, le noyau fournit des mécanismes
d’abstraction du matériel, notamment de la mémoire, du (ou des) processeur(s), et des
échanges d’informations entre logiciels et périphériques matériels. Le noyau autorise aussi
diverses abstractions logicielles et facilite la communication entre les processus.
Le noyau d’un système d’exploitation est lui-même un logiciel, mais ne peut cependant
utiliser tous les mécanismes d’abstraction qu’il fournit aux autres logiciels. Son rôle central
impose par ailleurs des performances élevées. Cela fait du noyau la partie la plus critique
d’un système d’exploitation et rend sa conception et sa programmation particulièrement
délicates. Plusieurs techniques sont mises en œuvre pour simplifier la programmation des
noyaux tout en garantissant de bonnes performances.

3.11.2. Gestionnaire des tâches


Prise en compte et traitement d’interruptions (l’horloge temps réel, le pressage sur les
touches du clavier, le mouvement de la souris), ordonnancement des tâches selon les
règles établies, manipulation des tâches par un ensemble de procédures. Ces procédures
permettent le lancement, la synchronisation et la destruction des tâches, et aussi de faire
transiter l’information de l’une tache à l’autre.

3.11.3. Gestionnaire de la mémoire


 Allocation aux différentes tâches des zones de mémoire considérées comme des
ressources partageables.
 Protection de la mémoire allouée pour une tâche de l’accès inadmissible.
 Gestion de la mémoire virtuelle.

3.11.4. La gestion d’entrées – sorties.


 Les unités périphériques physiques – elles ont des propriétés physiques très
différentes.
48

 Unités logiques – descripteurs unifiées.


 Pilotes (drivers)

3.11.5. La gestion des fichiers


 Les fichiers sont des blocks d’information organisée permettant le stockage :
 du système d’exploitation lui-même,
 des programmes et des données des utilisateurs,
 des programmes utilitaires (bibliothèques),
 des éditeurs, compilateurs et d’autres outils.
 Noms des fichiers
Nom
Extension (le type du fichier)
hlp – aide
exe – exécutable
html – web
c – C source
txt – texte
doc – Word
xls – Excel

 Structure du système des répertoires


49

 Attributs des fichiers


 Propriétaire
 Date de création
 Date de modification
 Nom de passe
 Taille
 Lire seulement
 Etc.
3.12. Gestion de systèmes d'exploitation

On distingue plusieurs types de systèmes d'exploitation, selon qu'ils sont capables de gérer
simultanément des informations d'une longueur de 16 bits, 32 bits, 64 bits ou plus.

3.12.1. Fichiers et répertoires

Qu'est-ce qu'un fichier ?

Un fichier est une suite d'informations binaires, c'est-à-dire une suite de 0 et de 1. Ce fichier
peut être stocké pour garder une trace de ces informations. Un fichier texte est un fichier
composé de caractères stockés sous la forme d'octets.

Ce fichier est enregistré sous la forme "nom_du_fichier.ext".".ext" représente l'extension


c'est un moyen de reconnaître le type de programme avec lequel ce fichier peut être ouvert
(attention cela ne garantit pas le type de fichier: lorsque l'on change l'extension on ne
50

change pas le type de fichier!).La longueur du nom et de l'extension peut varier suivant le
système d'exploitation:

• 8 caractères pour le nom et 3 pour l'extension sous DOS et Windows 3.1

• 256 caractères pour le nom et l'extension sous Windows 95, 98 et NT

Ainsi lorsque vous visualisez sous DOS ou Windows 3.1 un fichier provenant de Windows
9x, celui-ci aura un nom tronqué comportant les 6 premiers caractères du nom suivi de ~x
où x représente un chiffre qui est incrémenté à chaque fois qu'un fichier porte le même
nom. C'est-à-dire que si un fichier nommé "fichie~1" existe déjà il nommera le suivant
"fichie~2" ...

De plus, un fichier contient un en-tête qui permet de stocker des informations


supplémentaires, comme le type de fichier et surtout la taille du fichier. Il contient aussi un
caractère de fin de fichier signalant que les informations situées au-delà de ce caractère ne
font plus partie du même fichier.

En plus du nom, il faut en l’en-tête du fichier sa taille, en voici les causes :

Voici deux exemples qui vous démontreront son utilité :

• Les fichiers corrompus : Il vous est forcément déjà arrivé de télécharger un fichier sur
Internet, et que le navigateur plante ou bien que le serveur qui héberge ce fichier coupe la
communication. Si ce fichier est un fichier texte, il ne vous manquera que la fin du texte,
par contre si celui-ci est un fichier binaire (un programme exécutable par exemple) son
exécution pourrait très bien être dangereuse car il manque des informations. Le système
d'exploitation compare donc sa taille réelle à la taille indiquée dans l'en-tête pour vérifier
la validité du fichier. On parle généralement d'intégrité.

• Infection par un virus : Si jamais votre fichier est infecté par un virus, celui-ci va ajouter
des lignes de code dans le fichier, ainsi l'information concernant la taille du fichier située
dans l'en-tête ne correspondra plus (à moins que ce petit malin de virus ne pense à modifier
l'en-tête, ce qui peut arriver de nos jours), ainsi il pourra être repéré.
51

Qu'est-ce qu'un répertoire ?

Un répertoire (appelé parfois dossier) est un objet informatique qui contient des fichiers.
Imaginez une grande commode qui contient des tiroirs dans lesquels pourraient se trouver
des fichiers et d'autres tiroirs ... un répertoire peut donc contenir :
• des fichiers
• d'autres répertoires

Relations relatives

Si l'on reprend notre exemple de la commode, la plus grande entité contenant d'autres
entités est la commode : elle ne peut pas se trouver dans un tiroir. Dans le cas de
l'informatique on appelle cette entité la racine : c'est l'entité de plus bas niveau, car elle
peut contenir des fichiers ou des répertoires mais ne peut pas se trouver dans un répertoire
elle-même. On la note "\" dans la plupart des systèmes d'exploitation (pour y aller sous
DOS on tapera "cd \". Il en existe une seule par disque (ou du moins par partition ...).

Un répertoire qui en contient un autre est dit "répertoire parent". Lorsque d'un répertoire
on veut aller au répertoire parent, celui-ci est désigné par ".." sur la plupart des systèmes
(on tapera donc "cd.." sous DOS ou sous UNIX pour accéder à un répertoire parent).

3.13. Organisation des entrées-sorties

La difficulté provient de causes matérielles et de facteurs objectifs mais aussi de la gestion


optimale des ressources et de la simplification de la tâche de l'utilisateur. Par exemple :
Diversité des périphériques,
Différence de vitesse entre les unités,
Différence de méthode d'accès aux unités,
Différence de condition de partage des périphériques
Diversité des conditions d'erreur,
Complexité des systèmes de liaison entre périphériques et l'Unité Centrale
Parallélisme des opérations.
Tous ces objectifs sont réalisés par le système d'exploitation en confinant tous les
traitements particuliers dans des modules spécialisés appelés gestionnaires de
périphériques. Pour ceci, on distingue quatre sous-niveaux logiciels :
52

Des procédures standards (programmes de bibliothèque) utilisés par les applications et


contenant des requêtes au superviseur provoquant le passage au mode privilégié. Un
logiciel d'entrées-sorties indépendant des périphériques. Des drivers commandant chaque
unité périphérique.
Des programmes de service des interruptions agissant en collaboration avec les fonctions
du noyau.

3.14. Le système de gestion de fichiers

Le SGF joue le rôle central dans un système d'exploitation car il doit gérer la plupart des
informations des usagers et du système lui-même. Il a des liens étroits avec le système d'E/S
(Unix a trouvé conceptuellement intéressant commode de ne pas faire la différence entre
un fichier et un périphérique).

La conservation des fichiers et la réalisation des fonctions d'accès impliquent la prise en


charge par le SGF de :

• la gestion du support physique en masquant à l'utilisateur les détails de l'organisation


physique de ses fichiers

• la sécurité et la protection des fichiers, c'est à dire la garantie de leur intégrité en cas
d'incident ou de malveillance et le respect des règles d'utilisation fixées (droits d'accès,
conditions de partage...)

3.15. Le multiprocessing

Le multiprocessing englobe plusieurs techniques qui consistent à utiliser plusieurs


processeurs en parallèle pour effectuer des taches qui demandent une grande puissance
de calcul, ou pour parer à d'éventuelles défaillances du processeur, ce qui est assez rare.

3.15.1. SMPNSP

On utilise 2 processeurs qui se partagent la mémoire, le bus, les disques etc.. Il faut pour
cela que le système d'exploitation puisse gérer plusieurs processeurs (WINDOWS NT TM
ou Novell avec SMP) et que bien sur les programmes soient développés afin d'utiliser
pleinement cette technique. Malgré cela, il y a un risque de saturation du bus ou de la
mémoire.
53

Il existe alors une variante de cette technique. Chaque processeur a sa propre mémoire. De
ce fait, les processeurs ne vont pas polluer la mémoire des autres. Le système est donc plus
stable. Cette technique est utilisée dans les serveurs de très haut de gamme car c'est une
solution onéreuse.

3.15.2. Clusters

On relie des machines qui peuvent être de milieux de gamme par des connexions à très
haut débit. On gère ces machines de manière à ce que l'utilisateur final ne les aperçoive
que comme une seule et unique machine. C'est une solution moins onéreuse mais dont la
tolérance aux pannes est moins bonne.

3.16. Les programmes applicatifs

Une application, un applicatif ou encore une


appli, une app est, dans le domaine
informatique, un programme (ou un
ensemble logiciel) directement utilisé pour
réaliser une tâche, ou un ensemble de tâches
élémentaires d'un même domaine ou formant
un tout.

Typiquement, un éditeur de texte, un


navigateur web, un lecteur multimédia, un jeu
vidéo, sont des applications. Les applications
s'exécutent en utilisant les services du
système d'exploitation pour utiliser les
ressources matérielles.

Un programme d'application est un


programme complet et autonome qui
exécute une fonction particulière
directement pour l'utilisateur. Entre autres,
les programmes d'application comprennent :

 Email
 Navigateurs Web
 Jeux
 Traitement de texte
 Logiciels d'entreprise
 Logiciel de comptabilité
54

 Logiciels graphiques
 Lecteurs multimédias
 Gestion de base de données

Parce que chaque programme a une application particulière pour l'utilisateur final, le
terme « application » est utilisé. Par exemple, un traitement de texte peut aider
l'utilisateur à créer un article, tandis qu'une application de jeu peut être utilisée pour le
divertissement.
Un programme d'application est également appelé application ou logiciel d'application.

3.16.1. Les logiciels

Les logiciels d'application et les logiciels système sont les deux principaux types de logiciels
disponibles. Le logiciel système gère le fonctionnement interne d'un ordinateur,
principalement via un système d'exploitation (OS). Il gère également les périphériques tels
que les périphériques de stockage, les imprimantes et les moniteurs. Au contraire, un
logiciel d'application ou un programme d'application guide l'ordinateur pour exécuter les
instructions fournies par l'utilisateur.

Le logiciel système comprend des programmes exécutés en arrière-plan, qui permettent


aux programmes d'application de fonctionner. Les logiciels système comprennent des
compilateurs, des assembleurs, des outils de gestion de fichiers ainsi que le système
d'exploitation lui-même. Les programmes d'application fonctionnent au-dessus du logiciel
système car le logiciel système est construit à partir de programmes "de bas niveau". Le
logiciel système est automatiquement installé lors de l'installation du système
d'exploitation. Cependant, les utilisateurs ont la possibilité de sélectionner les programmes
d'application installés sur leurs systèmes.

3.16.2. Exemples de programmes d’application

 Logiciel de traitement de texte


Ce logiciel permet aux utilisateurs de créer et de modifier des documents. Les
exemples les plus populaires de ce type de logiciel sont MS-Word, Wordpad et le bloc-
notes.
 Logiciel de base de données
Collection d’informations organisées afin que les utilisateurs puissent consulter,
gérer et mettre à jour les données. Un logiciel de base de données permet aux
utilisateurs de stocker et de récupérer des données à partir de bases de données. Les
exemples d’un logiciel de bases de données sont Oracle, MS Access, etc…
55

 Tableurs
Il y a plusieurs logiciels de tableurs sur le marché comme Excel, Lotus 1-2-3 et Apple
Numbers. Le tableur permet aux utilisateurs d’effectuer des calculs en utilisant des
feuilles de calcul.
 Multimédia
Ce sont des multimédias qui permettent aux utilisateurs de créer et de lire des fichiers
audio et vidéo, autrement dit, des fichiers multimédias. Des convertisseurs audios,
des lecteurs audios, les brûleurs, les encodeurs et des décodeurs vidéo sont certaines
formes de logiciels multimédias. Des exemples de ce type de logiciel comprennent
Real Player et Media Player.
 Logiciel de présentation
Il s’agit d’un logiciel servant à afficher des informations sous la forme d’un diaporama.
Par exemple : Microsoft Power Point. Ce type de logiciel comprend trois fonctions :
la fonction d’éditer qui permet l’insertion et le formatage du texte, la fonction
d’inclure des graphiques dans le texte et la fonction d’exécuter des diaporamas.
 Enterprise Software
Il s’agit d’un logiciel qui répond aux besoins des processus d’organisation et de flux
de données. Ce type de logiciel aide la gestion de la relation client ou les processus
financiers d’une organisation
 Software Information Worker
Les projets individuels au sein d’un département et les besoins individuels de création
et de gestion de l’information sont traités par le logiciel professionnel de
l’information. Les outils de documentation, des outils de gestion des ressources et
des systèmes de gestion de personnel entrent dans la catégorie de ce type de logiciel
d’application.
 Logiciels éducatifs
Ce sont des logiciels ayant des capacités d’exécution des tests et des progrès de suivi.
Ayant des capacités d’un logiciel collaboratif, ces logiciels éducatifs sont souvent
utilisés dans l’enseignement et l’auto-apprentissage. Des dictionnaires ainsi que
Britannica et Encarta sont quelques exemples connus de cette catégorie.
 Logiciel de simulation
Ce type de logiciel est utilisé pour simuler des systèmes physiques ou abstraits. Les
logiciels de simulation trouvent des applications à la fois, de la recherche et du
divertissement. Les simulateurs de vol et les simulateurs scientifiques sont des
exemples des logiciels de simulation.
 Logiciel d’accès à contenu
Ce type de logiciel est utilisé pour accéder au contenu sans devoir l’éditer. Des
exemples courants de logiciels d’accès au contenu sont les navigateurs Web et les
lecteurs multimédias.
 Suite d’applications
56

Une suite d’applications est un type de logiciel d’application destiné à remplir des
fonctions connexes. OpenOffice.org et Microsoft Office sont les meilleurs exemples.
Ces suites d’applications sont sous forme de paquets d’applications comme les
traitements de texte, tableurs, logiciels de présentation, etc. Les suites d’applications
peuvent travailler ensemble ou d’opérer sur les fichiers des autres.
 Un logiciel qui aide à l’ingénierie et au développement des produits
Ce sont des logiciels utilisés dans la conception et le développement de produits
matériels et logiciels. Les environnements de développement intégrés (IDE) et les
outils d’édition d’ordinateur de langue relèvent de ce type de logiciel d’application.

3.16.3. Les formes de logiciel d’application

 Licence
La majorité des applications logicielles sont octroyées sous forme de licence. Dans
ce cas-là, un utilisateur n’achète pas un logiciel lui-même mais une licence de logiciel.
Une licence interdit souvent la revente de logiciels. L’installation des logiciels peut
être effectuée sur un certain nombre de machines. Dans certains cas, les licences de
logiciels vous permettent d’installer l’application sur une seule machine.
 Vendu
Si vous voulez pouvoir revendre le logiciel, vous pouvez acheter ce type de logiciel
du fournisseur, vous possédez une copie légitime du logiciel.
 Freeware
Un logiciel d’application peut être téléchargé, copié ou utilisé sans restriction
comme freeware.
 Shareware
Ce type de logiciel peut être téléchargé mais les utilisateurs doivent payer une
certaine somme pour l’utiliser.
 Open source
Il s’agit d’un logiciel dont le code source est ouvert pour modification et utilisation.
Un logiciel Open Source est mis à disposition avec son code source. Le code est
ouvert pour la modification et l’utilisation. Les gens confondent logiciel open source
et gratuit mais ce n’est pas le cas, “libre” signifie que le code source est accessible
librement.
 Doit être installé
De nombreux logiciels d’application demandent aux utilisateurs de les installer sur
un disque dur pour pouvoir utiliser. On peut citer quelques exemples : un tableur,
un traitement de texte ou un logiciel de gestion de données.
 Fonctionne en ligne
Les jeux et des logiciels en ligne sont accessibles et utilisables sans besoin d’être
téléchargé font partie de cette catégorie.
57

DEUXIEME PARTIE : L’ALGORITHMIQUE


CHAP 4 : Concepts fondamentaux

4.1. Programmation
La programmation dans le domaine informatique est l'ensemble des activités qui
permettent l'écriture des programmes informatiques. C'est une étape importante de la
conception de logiciel.
Pour écrire le résultat de cette activité, on utilise un langage de programmation.
La programmation représente usuellement le codage, c’est-à-dire la rédaction du code
source d'un logiciel. On utilise plutôt le terme développement pour dénoter l'ensemble des
activités liées à la création d'un logiciel.
4.2. Programme
En informatique un programme est une séquence d'instructions qui spécifie étape par
étape les opérations à effectuer pour obtenir un résultat. Il est exprimé sous une forme qui
permet d'utiliser un ordinateur pour exécuter les instructions. Un programme est la forme
électronique d'un algorithme exprimé dans un langage de programmation - un vocabulaire
et des règles de ponctuation destinées à exprimer des programmes.
4.2.1. Programme source
Un programme source est un ensemble d’opérations telles qu'elles ont été exprimées par
un programmeur, souvent dans un langage de programmation de haut niveau, c'est-à-dire
dont la notation s'inspire des langues naturelles - le vocabulaire et la ponctuation utilisée
sont typiquement inspirés de l'anglais.
4.2.2. Programme objet ou binaire
Un programme objet ou binaire est la forme sous laquelle il pourra être exécuté par un
ordinateur: une suite de valeurs binaires difficiles à manipuler pour le programmeur, et
obtenus par traduction automatique du programme source.
Des programmes sont présents dans tous les appareils informatiques: ordinateur, console
de jeu, guichet automatique bancaire. Des programmes sont également présent dans des
pièces de matériel informatique ainsi que de nombreux dispositifs électroniques:
imprimante, modem, GPS, téléphone mobile, machine à laver, appareil photo numérique,
décodeur TV numérique, injection électronique ou pilote automatique.
Le programme décrit de manière exacte les différentes étapes d'un algorithme: ce qu'il y a
à faire, quand et avec quelles informations.
Selon l'architecture de von Neumann crée en 1945, un programme est enregistré dans la
mémoire de l'ordinateur, ce qui permet de l'exécuter de manière répétée sans intervention
humaine.
4.3. Langage de programmation
Un langage de programmation est une notation utilisée pour exprimer des algorithmes et
les faire exécuter par un ordinateur. Un algorithme est un procédé pour obtenir un résultat
par une succession de calculs, décrit sous forme de pictogrammes et de termes simples
dans une langue naturelle. Jusqu'en 1950 les programmeurs exprimaient les programmes
58

dans le langage de l'ordinateur, un langage fait de termes bizarres qui rendait le travail
pénible et le résultat sujet à de nombreuses erreurs. Dès 1950 les programmes ont été
décrit dans un langage différent - un langage de programmation, ce qui rendait les
opérations plus simples à exprimer. Le programme était ensuite traduit automatiquement
sous une forme qui permet d'être exécuté par l'ordinateur.
Sur demande, l'ordinateur exécutera les instructions du programme. Bien qu'il exécute
toujours exactement ce qui est instruit et ne se trompe jamais, il peut arriver que les
instructions qu'il exécute soient erronées suite à une erreur humaine lors de l'écriture du
programme. Les langages de programmations visent à diminuer le nombre de ces bugs, ils
sont cependant inévitables dans des programmes de plusieurs milliers de lignes.
Un programme de traitement de texte peut être fait de plus de 750 000 lignes de code, et
un système d'exploitation peut être fait de plus de 50 millions de lignes. En moyenne un
programmeur prépare, écrit, teste et documente environ 20 lignes de programme par jour,
et la création de grands programmes est le fait d'équipes et peut nécessiter plusieurs mois
voire plusieurs années.
4.4. Création des programmes
La création de programmes - est un sujet central en informatique. Les instructions qu'un
ordinateur devra exécuter doivent pouvoir être exprimées de manière précise et non
ambiguë. Pour ce faire, les langages de programmation combinent la lisibilité de l'anglais
avec l'exactitude des mathématiques. Les programmes sont créés par des programmeurs,
ou des ingénieurs logiciels. La création d'un programme comprend une série d'activités
telles que la conception, l'écriture, le test et la documentation. En vue d'obtenir un
programme de meilleure qualité, le travail de programmation se fait selon une démarche
systématique et planifiée.
Un programme fait généralement partie d'un logiciel: un ensemble qui comporte
typiquement plusieurs programmes, ainsi que tout le nécessaire pour permettre leur
utilisation: fichiers de données, fichiers de configuration et documentation.
En droit un programme est une œuvre écrite, protégée par le droit d'auteur. Le texte peut
paraitre à première vue dénuer de sens, mais apparaitre très clair et informatif pour un
lecteur averti. Le droit d'auteur s'applique au programme du moment qu'il est enregistré
de manière permanente, même s'il n'existe pas d'édition sur papier. Le droit d'auteur
protège autant le programme source - écrit par le programmeur sous une forme formalisée
de l'anglais, que le programme binaire - celui traduit sous forme de bits par le compilateur.
4.5. Vocabulaire de programmation
Le vocabulaire de programmation est un ensemble de règles d'écriture utilisées pour
instruire un ordinateur d'effectuer certaines tâches. La plupart des langages de
programmation sont dits de haut niveau, c'est-à-dire que leur notation s'inspire des langues
naturelles - le vocabulaire et la ponctuation utilisée sont typiquement inspirés de l'anglais.
Le processeur est le composant électronique qui exécute les instructions. Chaque
processeur est conçu pour exécuter certaines instructions, dites instructions machine. La
59

palette d'instructions disponibles sur un processeur forme le langage machine. Par


exemple le processeur Intel 80486 a une palette de 342 instructions.
Le langage d'assemblage est une représentation textuelle des instructions machine, un
langage de bas niveau, qui permet d'exprimer les instructions machines sous une forme
symbolique plus facile à manipuler, où il y a une correspondance 1-1 entre les instructions
machines et les instructions en langage d'assemblage.
Les langages de programmation de haut niveau permettent d'exprimer des instructions de
manière synthétique, en faisant abstraction du langage machine. Par rapport au langage
d'assemblage, ils permettent d'exprimer des structures, permettent d'écrire des
programmes plus rapidement, avec moins d'instructions, les programmes écrits dans des
langages de haut niveau sont plus simples à modifier et portables - ils peuvent fonctionner
avec différents processeurs. Cependant un programme exprimé en langage de haut
niveau, puis compilé est moins efficace et comporte plus d'instruction que s'il avait été
exprimé en langage d'assemblage.
Entre 1950 et 2000, plus de 50 langages de programmation sont apparus.
Chacun apportait un lot de nouveaux concepts, de raffinements et d'innovations. Jusque
dans les années 1950, l'utilisation des langages de programmation était semblable à
l'écriture d'instructions machines. L'innovation des années 1960 a été de permettre une
notation proche des mathématiques pour écrire des instructions de calcul. Les innovations
des années 1970 ont permis l'organisation et l'agrégation des informations manipulées par
les programmes - voir structure de données et structure de contrôle. Puis l'arrivée de la
notion d'objet a influencé l'évolution des langages de programmation postérieurs à 1980.
La programmation consiste à parcourir le chemin qui va d'une idée - souvent vague - jusqu'à
une suite d'instructions précises exécutées par une machine. Les langages de
programmation ont été créés dans l'optique de faciliter le travail du programmeur en
raccourcissant le chemin qui va de l'idée au code source.
Les programmes sont créés par des programmeurs, ou des ingénieurs logiciels. Les
programmeurs travaillent principalement sur l'écriture de programmes tandis que les
ingénieurs logiciels travaillent à toutes les étapes de la création du programme. Ils
appliquent une démarche formelle et rigoureuse basée sur le génie industriel et les
techniques de management.
4.6. Ecriture d’un programme
Avant de commencer à écrire un programme destiné à résoudre un problème, le
programmeur doit déterminer les caractéristiques du problème à résoudre. Ceci se fait en
plusieurs étapes indépendantes du langage de programmation utilisé. La technique
courante est celle d'un cycle de développement, qui comporte des étapes de définition, de
conception, d'écriture, de test, d'installation et de maintenance:
Le problème est tout d'abord examiné en détail en vue de connaitre l'étendue du
programme à créer. l'étape suivante consiste à choisir des solutions et des algorithmes,
puis décrire leur logique sous forme de diagrammes, en vue de clarifier le fonctionnement
du programme et faciliter son écriture.
60

Une fois le programme écrit, celui-ci subit une suite de tests. Les résultats produits
par le programme sont comparé avec des résultats obtenus manuellement. De nombreux
tests sont nécessaires et les mêmes tests sont exécutés plusieurs fois. Ensuite de quoi le
programme est installé dans la machine de l'utilisateur final, qui fera ses premières
observations. Le programme sera ensuite modifié en fonction des commentaires fait par
l'utilisateur, et des inconvénients qu'il a signalé.
Les besoins des utilisateurs et des systèmes informatiques varient continuellement,
et le programme est régulièrement reconstruit et modifié en vue d'être adapté aux
besoins. De nouvelles fonctions y sont ajoutées, et des erreurs qui n'avaient pas été
décelées auparavant sont corrigées.
Le but du cycle de développement est de réduire les coûts de fabrication tout en
augmentant la qualité du programme. Les qualités recherchées sont l'efficacité, la
flexibilité, la fiabilité, la portabilité, et robustesse, il doit également être convivial et facile
à modifier:
Il est attendu d'un programme qu'il demande peu d'effort de programmation, que
les instructions demandent peu de temps et nécessitent peu de mémoire, qu'il peut être
utilisé pour de nombreux usages et donne les résultats attendus quels que soient les
changements - permanents ou temporaires - du système informatique.
Il est également attendu qu'il peut être facilement transféré sur un modèle
d'ordinateur différent de celui pour lequel il est construit, qu'il produit des résultats
probants y compris lorsque les informations entrées sont incorrectes, qu'il peut être
facilement compris par un usager novice et que le code source peut être facilement modifié
par la suite.
4.7. Exécution
Des programmes peuvent être exécutés non seulement par les ordinateurs, mais par les
nombreux appareils qui sont basés sur des composants informatiques, par exemple
certains robots ménagers, téléphones, fax, instruments de mesure, récepteur de
télévision, ainsi que les pièces de matériel informatique telles que disque durs, routeurs,
imprimantes, les consoles de jeu vidéo, les assistants personnels et les automates
bancaires. Contrairement aux ordinateurs, ces appareils ne contiennent souvent pas de
système d'exploitation, les programmes sont enregistrés dans l'appareil lors de la
fabrication, et la vitesse d'exécution des programmes est souvent d'importance mineure.
Sans contre-indication, les instructions d'un programme sont exécutées une après l'autre,
de manière linéaire. Les langages de programmations permettent d'exprimer des
alternatives : une suite d'instructions est exécutée uniquement si une condition donnée est
remplie, dans le cas contraire une autre suite est exécutée. Les langages de programmation
permettent également de faire répéter l'exécution d'une suite d'instruction jusqu'à ce
qu'une condition donnée soit remplie.
L'exécution se déroule de manière différente suivant si le langage de programmation
s'utilise avec un compilateur ou un interpréteur :
4.7.1. Compilateur
61

Un compilateur lit le programme source en entier, et le transforme en instructions


machines. La transformation peut se faire en plusieurs étapes et nécessiter plusieurs
lectures du programme. Une fois traduit, le programme est enregistré, puis copié en
mémoire et exécuté par le processeur tel quel.
4.7.2. Interpréteur
Un interpréteur par contre, opère ligne par ligne: lit une ligne de programme source, puis
exécute les instructions machines correspondantes. L'avantage d'un interpréteur c'est que
les erreurs peuvent être immédiatement corrigées. Le désavantage est que l'exécution du
programme est 5 à 25 fois moins rapide que si le programme avait été préalablement
traduit et exécuté tel quel.
L'exécution des programmes est basé sur le principe de la machine à programme
enregistré, de John von Neumann: Les instructions de programme sont exécutées par un
processeur; ce composant électronique exécute chaque instruction de programme par une
succession d'opérations charger-décoder-exécuter: l'instruction est tout d'abord copiée
depuis la mémoire vers le processeur, elle est ensuite décomposée bit par bit pour
déterminer l'opération à effectuer, puis cette opération est exécutée. La plupart des
opérations sont d'ordre arithmétique (addition, soustraction), ou logiques. L'exécution de
programmes par le processeur central (anglais CPU) contrôle la totalité des opérations
effectuées par l'ordinateur.
L'exécution du cycle charger-décoder-exécuter est rythmé par une horloge branchée au
processeur. En 2011 la fréquence d'horloge supportée par les processeurs contemporains
se compte en mégahertz ou en gigahertz, ce qui corresponds à des millions voire des
milliards de cycles par seconde.
Les processeurs contemporains peuvent traiter plusieurs instructions simultanément:
lorsqu'une instruction est chargée, le processeur charge immédiatement l'instruction
suivante, sans attendre que cette instruction soit décodée puis exécutée, et les
processeurs peuvent également charger / décoder / exécuter plusieurs instructions en un
seul cycle d'horloge.
Le système d'exploitation est un ensemble de programme qui surveille l'exécution des
autres programmes. Il est activé automatiquement lorsque l'ordinateur est mis en marche.
Les systèmes d'exploitation contemporains permettent d'exécuter simultanément
plusieurs programmes, au service de plusieurs utilisateurs, et en utilisant plusieurs
processeurs. Un seul processeur exécute typiquement plusieurs programmes. Dans les
faits, le processeur n'exécute qu'un seul programme à la fois à un instant donné, et un
programme planificateur (anglais scheduler) du système d'exploitation effectue une
rotation, ou régulièrement il interrompt le programme en cours d'exécution, pour exécuter
le programme suivant. Le rythme de rotation est cependant tellement rapide qu'il donne
l'illusion que les programmes sont exécutés en même temps.
62

4.8. Algorithme
Un algorithme est une suite finie et non-ambiguë d’opérations ou d'instructions
permettant de résoudre un problème.
Le mot algorithme vient du nom latinisé du mathématicien persan Al-Khawarizmi,
surnommé « le père de l'algèbre ». Le domaine qui étudie les algorithmes est appelé
l'algorithmique.
On retrouve aujourd'hui des algorithmes dans de nombreuses applications telles que la
cryptographie, le routage d'informations, la planification et l'optimisation de ressources, la
bio-informatique, ...
Un algorithme est correct lorsque pour chaque instance, il se termine en produisant la
bonne sortie, c'est-à-dire qu'il résout le problème posé. On mesure l'efficacité d'un
algorithme notamment par sa durée pour produire le résultat attendu et par sa
consommation de mémoire RAM (en partant du principe que chaque instruction a un
temps d'exécution constant). Les ordinateurs sur lesquels tournent ces algorithmes ne
sont pas infiniment rapides : le temps de machine reste une ressource limitée malgré une
augmentation des performances considérable des machines.
Un algorithme sera donc dit performant s'il utilise avec parcimonie les ressources dont il
dispose, c'est-à-dire le temps CPU et la mémoire RAM. L’analyse de la complexité
algorithmique permet de mesurer ces consommations.
Une recette de cuisine est un algorithme. Elle en contient les éléments constitutifs :
Des entrées (les ingrédients, le matériel utilisé)
Des instructions élémentaires simples, dont l'exécution amène au résultat
voulu
Un résultat : le plat préparé.
Cependant, les recettes de cuisine ne sont en général pas présentées rigoureusement sous
forme non-ambigüe : il est d'usage d'y employer des termes vagues laissés à l'appréciation
du cuisinier alors qu'un algorithme stricto-sensu doit être précis et sans ambigüité à
l'exécution.
4.9. Algorithmique
L'algorithmique est l’ensemble des règles et des techniques qui sont impliquées dans la
définition et la conception d'algorithmes, c'est-à-dire de processus systématiques de
résolution d'un problème permettant de décrire les étapes vers le résultat. En d'autres
termes, un algorithme est une suite finie et non-ambiguë d’instructions permettant de
donner la réponse à un problème.
Si les instructions d'un algorithme s’exécutent les unes après les autres, l'algorithme est dit
séquentiel, si elles s’exécutent en même temps, il est parallèle. Si l'algorithme exploite des
tâches s’exécutant sur un réseau de processeurs on parle d’algorithme réparti, ou
distribué.
Les premiers algorithmes dont on a retrouvé des descriptions datent des Babyloniens, au
IIIe millénaire av. J. C.. Ils décrivent des méthodes de calcul et des résolutions d'équations
à l'aide d'exemples.
63

Un algorithme célèbre est celui qui se trouve dans le livre 7 des Éléments d'Euclide, et
appelé algorithme d'Euclide. Il permet de trouver le plus grand diviseur commun, ou PGCD,
de deux nombres. Un point particulièrement remarquable est qu’il contient explicitement
une itération et que les propositions 1 et 2 démontrent sa convergence.
Un algorithme énonce une résolution sous la forme d’une série d’opérations à effectuer.
La mise en œuvre de l’algorithme consiste en l’écriture de ces opérations dans un langage
de programmation et constitue alors la brique de base d’un programme informatique.
Les informaticiens utilisent fréquemment l’anglicisme implémentation pour désigner cette
mise en œuvre. L’écriture en langage informatique est aussi fréquemment désignée par le
terme « codage », qui n’a ici aucun rapport avec la cryptographie, mais qui se réfère au
terme « code source » pour désigner le texte, en langage de programmation, constituant
le programme. L’algorithme devra être plus ou moins détaillé selon le niveau d’abstraction
du langage utilisé, de même qu'une recette de cuisine doit être plus ou moins détaillée
selon l’expérience du cuisinier.
4.9.1. Étude formelle
De nombreux outils formels ou théories ont été développés pour décrire les algorithmes,
les étudier, exprimer leurs qualités, pouvoir les comparer :
Ainsi, pour décrire les algorithmes, des structures algorithmiques ont été
mises en évidence : structures de contrôle et structures de données.
Pour justifier de la qualité des algorithmes, les notions de correction, de
complétude et de terminaison ont été mises en place.
Enfin, pour comparer les algorithmes, une théorie de la complexité des
algorithmes a été définie.
4.9.2. Structures algorithmiques
Les concepts en œuvre en algorithmique, par exemple selon l'approche de N. Wirth
pour les langages les plus répandus (Pascal, C, etc.), sont en petit nombre. Ils
appartiennent à deux classes :
4.9.2.1. Structures de contrôle et structure des données
Structures de contrôle
Séquences
Conditionnelles
Boucles
Structures de données
Constantes
Variables
Tableaux
Structures récursives (listes, arbres, graphes)
Ce découpage est parfois difficile à percevoir pour certains langages (Lisp, Prolog, …) plus
basés sur la notion de récursivité où certaines structures de contrôle sont implicites et,
donc, semblent disparaître.
64

4.9.2.2. Correction, complétude, terminaison


Ces trois notions « correction », « complétude », « terminaison » sont liées, et supposent
qu'un algorithme est écrit pour résoudre un problème.
La terminaison est l'assurance que l'algorithme terminera en un temps fini. Les preuves de
terminaison font habituellement intervenir une fonction entière positive strictement
décroissante à chaque « pas » de l'algorithme.
Étant donnée la garantie qu'un algorithme terminera, la preuve de correction doit apporter
l'assurance que si l'algorithme termine en donnant une proposition de solution, alors cette
solution est correcte --c'est-à-dire qu'elle est effectivement une solution au problème posé.
La preuve de complétude garantit que, pour un espace de problèmes donné, l'algorithme,
s'il termine, donnera des propositions de solutions.
4.9.2.3. Approches pratiques
L'algorithmique a développé quelques stratégies pour résoudre les problèmes :
Algorithme glouton : un premier algorithme peut souvent être proposé en ne
regardant que les cas simples, ou ceux apparaissant le plus souvent. On parle alors
d'algorithme glouton. L'algorithme glouton n'est souvent qu'une première étape
dans la rédaction d'un algorithme plus performant.
Diviser pour régner : pour améliorer les performances des algorithmes, une
technique usuelle consiste à diviser les données d'un problème en sous-ensembles
de tailles plus petites, jusqu'à obtenir des données que l'algorithme pourra traiter
au cas par cas. Une seconde étape dans ces algorithmes consiste à « fusionner » les
résultats partiels pour obtenir une solution globale. Ces algorithmes sont souvent
associés à la récursivité.
Recherche exhaustive (ou combinatoire) : une méthode utilisant l'énorme
puissance de calcul des ordinateurs consiste à regarder tous les cas possibles. Cela
n'est pour autant possible que dans certains cas particuliers (la combinatoire est
souvent plus forte que l'énorme puissance des ordinateurs, aussi énorme soit-elle)
Aléatoire, ou par approximations successives : certains algorithmes utilisent des
recherches aléatoires, ou par approches successives, donnant de meilleurs résultats
(en moyenne) que des recherches directes ou explicites.
Décomposition top-down / bottom-up : les décompositions top-bottom consistent
à essayer de décomposer le problème en sous-problèmes à résoudre
successivement, la décomposition allant jusqu'à des problèmes triviaux faciles à
résoudre. L'algorithme global est alors donné par la composée des algorithmes
définis au cours de la décomposition. La démarche bottom-up est la démarche
inverse, elle consiste à partir d'algorithmes simples, ne résolvant qu'une étape du
problème, pour essayer de les composer pour obtenir un algorithme global.
Pré-traitement / post-traitement : parfois, certains algorithmes comportent une ou
deux phases identifiées comme des prétraitements (à faire avant l'algorithme
principal), ou post-traitement (à faire après l'algorithme principal), pour simplifier
l'écriture de l'algorithme général.
65

4.9.3. Exemples d’algorithmes, de problèmes, d'applications ou domaines d'application


Il existe un certain nombre d’algorithmes classiques, utilisés pour résoudre des
problèmes ou plus simplement pour illustrer des méthodes de programmation. On
se référera aux articles suivants pour de plus amples détails :
Algorithmes ou problèmes classiques (du plus simple ou plus complexe)
Echange, ou comment échanger les valeurs de deux variables : problème classique
illustrant la notion de variable informatique.
Algorithmes de recherche, ou comment retrouver une information dans un
ensemble structuré ou non (par exemple recherche dichotomique)
Algorithme de tri, ou comment trier un ensemble de nombres le plus rapidement
possible ou en utilisant le moins de ressources possible
Problème du voyageur de commerce, problème du sac à dos, problème sat et autres
algorithmes ou approximations de solutions pour les problèmes combinatoires
difficiles (dit np-complets)
Algorithmes ou problèmes illustrant la programmation.
Tours de hanoï
Huit dames, placer huit dames sur un échiquier sans qu’elles puissent se prendre
entre elles,
Suite de conway,
Algorithme de dessins récursifs pour le tapis de sierpiński (programme
informatique), la courbe du dragon, le flocon, …
Algorithmes dans le domaine des mathématiques
Calcul de la factorielle d'un nombre, de la fonction d'ackermann ou de la suite de
fibonacci,
Algorithme du simplexe, qui minimise une fonction linéaire de variables réelles
soumises à des contraintes linéaires,
Fraction continue d'un nombre quadratique, permettant d'extraire une racine
carrée, cas particulier de la méthode de newton
Dans le domaine de l'algèbre : l'algorithme d'unification et le calcul d'une base de
gröbner d'un idéal de polynôme,
En théorie des graphes qui donne lieu à de nombreux algorithmes.
Algorithmes pour et dans le domaine de l'informatique
Cryptologie et compression de données
Informatique musicale
Algorithme génétique en informatique décisionnelle
Analyse et compilation des langages formels (voir compilateur et interprète
(informatique))
Allocation de mémoire (ramasse-miettes).
N.B. : L’algorithme est traduit par un ordinogramme
Exemple d’un ordinogramme
66

4.10. Organigramme de programmation


Un organigramme de programmation (parfois appelé algorigramme, logigramme
ou plus rarement ordinogramme) est une représentation graphique normalisée de
l'enchaînement des opérations et des décisions effectuées par un programme
d'ordinateur.
67

CHAP 5 : Traitement de l’information-Symboles de documentation et conventions


applicables aux données, aux organigrammes de programmation et d’analyse, aux
schémas des réseaux de programmes et des ressources de système.
5.1. Norme ISO
Une norme ISO a été développée, elle porte le numéro ISO 5807-1985. Elle décrit en détail
les différents symboles à utiliser pour représenter un programme informatique de manière
normalisée.
L’ISO (Organisation internationale de normalisation) est une fédération mondiale
d’organismes nationaux de normalisation (comités membres de MO). L’élaboration des
Normes internationales est confiée aux comités techniques de I’ISO.
Chaque comité membre intéressé par une étude a le droit de faire partie du comité
technique créé à cet effet. Les organisations internationales, gouvernementales et non
gouvernementales, en liaison avec I’ISO, participent également aux travaux.

5.2. Organigramme

Les organigrammes sont largement utilisés pour décrire tous les types de problèmes de
traitement de l’information et les moyens de les résoudre. La présente Norme
internationale ne limite pas leur emploi aux applications particulières citées à titre
d’exemples.
Des règles internes doivent dans certains cas être élaborées en tenant compte des types
de données ou de traitements en cours d’étude. Toutefois, il existe des principes directeurs
qui, s’ils sont respectés, améliorent la lisibilité et facilitent les références croisées avec le
texte.

Les organigrammes sont composés de symboles ayant une signification donnée, d’un texte
explicatif bref et de lignes de raccordement. La présente Norme internationale ne traite
pas de la partie textuelle des organigrammes. Toutefois, chaque symbole correspond à un
nom (non abrégé si possible) significatif et non ambigu qui est toujours utilisé dans
l’ensemble de la documentation.

Un organigramme peut être utilisé à différents niveaux de détail ; le nombre de niveaux


dépend de l’importance et de la complexité du problème. Ce niveau de détail doit être
choisi pour que les différentes parties ainsi que les relations existantes entre ces parties
soient compréhensibles dans leur ensemble.
On définit généralement un organigramme reprenant l’ensemble du système et montrant
les principaux éléments constitutifs ; cet organigramme représente le premier niveau de la
hiérarchie ; chaque niveau d’en dessous donne une description plus détaillée d’une ou
plusieurs des parties du schéma de niveau immédiatement supérieur.
68

5.2.1. Objet et domaine d’application

La présente Norme internationale précise les symboles à utiliser dans la documentation du


traitement de l’information et énumère des règles générales sur les conventions de leur
emploi dans :
a) les organigrammes des données;
b) les organigrammes de programmation;
c) les organigrammes d’analyse;
d) les schémas des réseaux des programmes;
e) les schémas des ressources de systèmes.

5.2.2. Définitions
 Symbole de base :
Symbole utilisé lorsque la forme ou la nature précise du traitement ou du support des
données (par exemple) est inconnue, ou lorsqu’elle est inutile pour décrire le support réel.
 Symbole spécifique :
Symbole utilisé lorsque la nature précise ou la forme (par exemple) du traitement ou du
support des données est connue et qu’elle est nécessaire pour décrire le support réel.
 Organigramme :
Représentation graphique de la définition, de l’analyse ou de la méthode de résolution d’un
problème dans laquelle des symboles sont utilisés pour représenter des opérations, des
données, des flux, des équipements, etc.

5.2.3. Organigramme des données


L’organigramme des données représente le cheminement des données dans la résolution
d’un problème et définit les étapes du traitement ainsi que les différents supports utilisés
pour les données.

Un organigramme de données se compose des éléments suivants :


a) symboles de données pour indiquer l’existence des données; ces symboles peuvent
également préciser le support utilisé pour ces données;
b) symboles de traitement pour indiquer les opérations à exécuter sur les données; ces
symboles peuvent également préciser les éléments machine utilisés pour ces traitements;
c) lignes de liaison pour indiquer la circulation des données entre traitements et/ou
supports des données;
d) symboles spéciaux de l’organigramme pour faciliter la lecture et l’écriture

5.2.4. Organigramme d’analyse


L’organigramme d’analyse représente le contrôle des opérations et la circulation des
données à l’intérieur d’un système.

L’organigramme d’analyse se compose des éléments suivants :


69

a) symboles de données pour indiquer l’existence de données; ces symboles peuvent


également spécifier le support utilisé pour ces données;
b) symboles de traitement pour indiquer les opérations à exécuter sur les données et pour
définir le chemin logique à suivre;
c) lignes de liaison pour indiquer la circulation des données entre traitements et/ou
supports de données, ainsi que le flux des contrôles entre traitements;
d) symboles spéciaux de l’organigramme pour faciliter la lecture et l’écriture

5.3. Schéma de réseau de programme

Le schéma de réseaux de programmes représente le cheminement des activations de


chaque programme et les interactions vis-à-vis des données concernées. Chaque
programme d’un schéma de ce type n’apparaît qu’une fois alors que dans un
organigramme d’analyse, il peut être présent dans plusieurs flux de contrôle.

Un schéma de réseau de programme se compose des éléments suivants :

a) symboles de données pour indiquer l’existence des données ;


b) symboles de traitement pour indiquer les opérations à exécuter sur les données;
c) lignes de liaison pour indiquer la circulation entre processus et données ainsi que les
activations des traitements;
d) des schémas de réseaux symboles spéciaux pour faciliter la lecture et l’écriture

5.4. Schéma des ressources de système

Le schéma des ressources de système représente la configuration des unités de données


et des unités de traitements convenant pour la résolution d’un problème ou d’une série de
problèmes.

Un schéma de ressources de système se compose des éléments suivants :


a) Symboles de données pour montrer les périphériques d’entrée, de sortie ou de
support de stockage.
b) symboles de traitement pour représenter les processeurs, par exemple unités
centrales, canaux, etc.;
c) lignes de liaison pour représenter le transfert des données entre périphériques et
processeurs et les transferts de contrôle entre processeurs;
d) symboles spéciaux pour faciliter la lecture et l’écriture du schéma.

5.5. Symboles
5.5.1. Symboles de données
 Symboles de base
 Données
70

Ce symbole représente des données dont le support n’est pas spécifié.

 Données mémorisées
Ce symbole représente des données mémorisées sous une forme convenant pour leur
traitement, le support n’étant pas spécifié.

5.5.2. Symboles spécifiques


 Mémoire interne
Ce symbole représente des données, le support utilisé étant la mémoire interne.

 Mémoire à accès séquentiel

Ce symbole représente des données qui peuvent seulement être consultées en accès
séquentiel, le support étant par exemple une bande magnétique, une cartouche de bande
ou une cassette magnétique.

 Mémoire à accès direct


Ce symbole représente des données accessibles directement, le support étant par exemple
un disque magnétique, un tambour ou une disquette.
71

 Document

Ce symbole représente des données lisibles par l’homme, le support étant par exemple un
état réalisé par imprimante, un document en OCR ou MICR, un microfilm, une bande de
comptage, des imprimés de saisie de données.

 Entrée manuelle

Ce symbole représente des données, le support étant l’un de ceux pour lesquels
l’information est entrée manuellement au moment du traitement, par exemple clavier en
ligne, positionnement d’interrupteurs, poussoirs, crayons lumineux, sonde de lecture de
code à barres.

 Carte

Ce symbole représente des données, le support étant constitué de cartes, par exemple
cartes perforées, cartes magnétiques, cartes à lecture graphique, cartes à talons, cartes à
marques optiques.

 Bande perforée
Ce symbole représente des données, le support étant une bande de papier
72

 Affichage

Ce symbole représente des données, le support étant l’un quelconque de ceux sur lesquels
les informations sont affichées à l’intention de l’homme, par exemple écrans vidéo,
voyants en ligne.

5.5.3. Symboles de traitement


 Symbole de base
 Traitement

Ce symbole représente une partie quelconque de traitement, par exemple exécution d’une
opération définie ou d’un groupe d’opérations produisant une modification de la valeur, de
la forme ou de la position d’informations, ou la détermination de la direction suivie parmi
toutes les directions possibles.

 Symboles de traitements particuliers


 Traitement prédéterminé

Ce symbole représente un traitement nommé composé d’une ou plusieurs opérations ou


pas de programme spécifiés par ailleurs, par exemple: un sous-programme, un module.
73

 Opération manuelle
Ce symbole représente tout traitement exécuté par un opérateur humain.

 Préparation

Ce symbole représente la modification d’une instruction ou d’un groupe d’instructions


pour effectuer une activité ultérieure, par exemple le positionnement d’une bascule ou
d’un interrupteur, la modification d’un registre d’index ou l’initialisation d’une routine.

 Décision

Ce symbole représente une fonction de type sélection ou décision comportant une seule
entrée mais pour laquelle existent plusieurs sorties possibles, dont une seule peut être
activée après l’évaluation des conditions définies dans le symbole. Les résultats de
l’évaluation peuvent être écrits à côté des lignes représentant les chemins possibles

 Travail en parallèle

Exemple
74

NB : Les traitements C, D et E ne peuvent pas commencer avant l’achèvement du traitement


A; de même, F peut seulement avoir lieu après l’achèvement de B, C et D. Par contre, le
traitement C peut commencer et/ou se terminer avant le début et/ou la fin de D.

 Limite de boucle

Ce symbole en deux parties représente le début et la fin d’une boucle. Les deux parties du
symbole ont le même identificateur. Les conditions d’initialisation, d’incrémentation,
d’achèvement, etc., sont dans le symbole de début ou de fin, suivant la position de
l’opération des tests.
75

Exemple

5.5.4. Symboles de représentation des lignes (symboles linéaires)


 Symbole de base
 Ligne de liaison
Ce symbole représente la circulation des données ou du contrôle.

Des têtes de flèches complètes ou ouvertes doivent être ajoutées pour indiquer la
circulation des flux si nécessaire ou pour améliorer la lisibilité.

 Symboles spécifiques
 Transfert de contrôle

Ce symbole représente un transfert immédiat du contrôle d’un traitement à un autre,


parfois avec un risque de retour direct au traitement d’activation après l’achèvement des
opérations du traitement activé. Le type de transfert de contrôle doit être inscrit dans le
symbole; exemple : appel, recherche, événement.
76

 Ligne de télécommunications
Ce symbole représente le transfert de données par une ligne de télécommunications.

 Tirets

Ce symbole représente une autre relation possible entre deux symboles ou davantage. Il
est également utilisé pour entourer une annotation

5.6. Utilisation simple des symboles


L'organigramme utilise des symboles normalisés représentés ci-dessous :

Symboles normalisés Commentaires:

Les tests ou branchements conditionnels :

 la pointe vers le haut est l'entrée du test,


 la pointe sur le côté est le résultat du test
lorsqu'il est faux,
 la pointe vers le bas est le résultat du test
lorsqu'il est vrai.

Mise à disposition d'une information à traiter ou


enregistrement d'une information traitée.

Appel de sous-programme.
77

Sens conventionnel des liaisons : Le sens général des lignes doit être de haut en bas ou/et
de gauche à droite. Lorsque le sens ainsi défini n'est pas respecté, il est nécessaire de
flécher.
5.6.1. Différentes structures

Séquence alternative Séquence répétitive Séquence répétitive


Séquence linéaire
"si…alors…sinon" "tant que…faire…" "répéter…jusqu'à…"

Début Si "condition"
Tant que "condition"
Répéter "traitement"
 "Traitement 1"  alors "Traitement 1"
 faire "traitement" jusqu'à "condition"
 "Traitement 2"  sinon "Traitement 2"
Fin tant que
Fin Fin si
Une fois l'algorithme défini, l'étape suivante est de coder le programme. Le codage dépend
de l'architecture sur laquelle va s'exécuter le programme, de compromis temps-mémoire,
et d'autres contraintes. Ces contraintes vont déterminer quel langage de
programmation utiliser pour "convertir" l'algorithme en code source.

5.7. Mise en place des problèmes informatiques en ordinogramme


Les ordinogrammes (ordinogrammes), sont très efficaces pour des programmes moins
longs. S’il s’agit des programmes plus robustes, ces derniers exposent leurs limites. C’est
pourquoi il est préférable d’utiliser les pseudos codes à la place. Mais cela ne donne pas les
raisons de ne pas les maitriser.
5.7.1. Exemple d’un ordinogramme classique
78
79

5.8. Transformation du code source


Le code source n'est (presque) jamais utilisable tel quel. Il est généralement écrit dans un
langage "de haut niveau", compréhensible pour l'homme, mais pas pour la machine.
5.8.1. Compilation
Certains langages sont ce qu'on appelle des langages compilés. En toute généralité, la
compilation est l'opération qui consiste à transformer un langage source en un langage
cible.
Dans le cas d'un programme, le compilateur va transformer tout le texte représentant le
code source du programme, en code compréhensible pour la machine, appelé CODE
machine.
Dans le cas de langages dits compilés, ce qui est exécuté est le résultat de la compilation.
Une fois effectuée, l'exécutable obtenu peut être utilisé sans le code source.
Il faut également noter que le résultat de la compilation n'est pas forcément du code
machine correspondant à la machine réelle, mais peut-être du code compris par
une machine virtuelle (c'est-à-dire un programme simulant une machine), auquel cas on
parlera de bytecode. C'est par exemple le cas en Java. L'avantage est que, de cette façon,
un programme peut fonctionner sur n'importe quelle machine réelle, du moment que la
machine virtuelle existe pour celle-ci.
Dans le cas d'une requête SQL, la requête est compilée en une expression utilisant les
opérateurs de l'algèbre relationnelle. C'est cette expression qui est évaluée par le système
de gestion de bases de données.
5.8.2. Interprétation
D'autres langages ne nécessitent pas de phase spéciale de compilation. La méthode
employée pour exécuter le programme est alors différente. La phase de compilation est la
plupart du temps incluse dans celle d’exécution. On dit de ce programme qu'il interprète
le code source. Par exemple, python ou perl sont des langages interprétés.
Cependant, ce serait faux de dire que la compilation n'intervient pas. L'interprète produit
le code machine, au fur et à mesure de l'exécution du programme, en compilant chaque
ligne du code source.
5.8.3. Avantages, inconvénients

Les avantages généralement retenus pour l'utilisation de langages "compilés", est qu'ils
sont plus rapides à l'exécution que des langages interprétés, car l'interprète doit être lancé
à chaque exécution du programme, ce qui mobilise systématiquement les ressources.
Traditionnellement, les langages interprétés offrent en revanche une certaine portabilité
(la capacité à utiliser le code source sur différentes plates-formes), ainsi qu'une facilité pour
80

l'écriture du code. En effet, il n'est pas nécessaire de passer par la phase de compilation
pour tester le code source.
5.8.4. Appellation impropre
Il faut noter qu'on parle abusivement de langages compilés ou interprétés. En effet, le
caractère compilé ou interprété ne dépend pas du langage, qui n'est finalement qu'une
grammaire et une certaine sémantique. D'ailleurs, certains langages peuvent être utilisés
interprétés ou compilés. Par exemple, il est très courant d'utiliser Ruby avec un interprète,
mais il existe également des compilateurs pour ce langage.
Néanmoins, l'usage qu'on fait des langages est généralement fixé.
5.8.5. Test du programme
C'est l'une des étapes les plus importantes de la création d'un programme. En principe,
tout programmeur se doit de vérifier chaque partie d'un programme, de le tester. Il existe
différents types de test. On peut citer en particulier :
Test unitaire
Test d'intégration
Test de performance
Il convient de noter qu'il est parfois possible de vérifier un programme informatique, c'est-
à-dire prouver, de manière plus ou moins automatique, qu'il assure certaines propriétés.
5.8.6. Techniques de programmation
Programmation concurrente
Programmation déclarative
Programmation fonctionnelle
Programmation impérative
Programmation logique
Programmation orientée aspect
Programmation orientée composant
Programmation orientée objet
Programmation orientée prototype
Programmation par contraintes
Programmation par contrat
Programmation par intention
Programmation procédurale
Programmation structurée
81

CHAP 6 : Introduction à l’algorithmique

L’algorithmique est un terme d’origine arabe, comme algèbre, amiral ou zénith. Ce n’est
pas une excuse pour massacrer son orthographe, ou sa prononciation.
Un algorithme, c’est une suite d’instructions, qui une fois exécutée correctement, conduit
à un résultat donné. Si l’algorithme est faux, le résultat est faux.
Pour fonctionner, un algorithme doit donc contenir uniquement des instructions
compréhensibles par celui qui devra l’exécuter. C’est d’ailleurs l’un des points délicats pour
les rédacteurs de modes d’emploi : les références culturelles, ou lexicales, des utilisateurs,
étant variables, un même mode d’emploi peut être très clair pour certains et parfaitement
abstraits pour d’autres.
En informatique, il n’y a pas ce problème : les choses auxquelles on doit donner des
instructions sont les ordinateurs dépourvus d’intelligence.

Un exemple de problème qui nous concerne tous (oui, même vous) est celui de la cuisine :
vous êtes dans une cuisine, vous trouvez du riz, comment le cuire ? Voici une marche à
suivre simple :

remplir une casserole d'eau ;


y ajouter une pincée de sel ;
la mettre sur le feu ;
attendre l'ébullition de l'eau ;
mettre le riz dans la casserole ;
le laisser cuire 10 à 15 minutes ;
égoutter le riz.

6.1. Bases de l’algorithme

La maîtrise de l’algorithmique requiert deux qualités, très complémentaires d’ailleurs :


• il faut avoir une certaine intuition, car aucune recette ne permet de savoir a priori
quelles instructions permettront d’obtenir le résultat voulu. C’est là, si l’on y tient,
qu’intervient la forme « d’intelligence » requise pour l’algorithmique. Alors, c’est certain, il
y a des gens qui possèdent au départ davantage cette intuition que les autres. Cependant,
cela s’acquiert. Et ce qu’on appelle l’intuition n’est finalement que de l’expérience
tellement répétée que le raisonnement, au départ laborieux, finit par devenir « spontané
».
• il faut être méthodique et rigoureux. En effet, chaque fois qu’on écrit une série
d’instructions qu’on croit justes, il faut systématiquement se mettre mentalement à la
place de la machine qui va les exécuter, armé d'un papier et d'un crayon, afin de vérifier si
le résultat obtenu est bien celui que l’on voulait. Cette opération ne requiert pas la moindre
once d’intelligence. Mais elle reste néanmoins indispensable, si l’on ne veut pas écrire à
l’aveuglette.
82

Et petit à petit, à force de pratique, vous verrez que vous pourrez faire de plus en plus
souvent l’économie de cette dernière étape : l’expérience fera que vous « verrez » le
résultat produit par vos instructions, au fur et à mesure que vous les écrirez. Naturellement,
cet apprentissage est long, et demande des heures de travail patient. Aussi, dans un
premier temps, évitez de sauter les étapes : la vérification méthodique, pas à pas, de
chacun de vos algorithmes représente plus de la moitié du travail à accomplir… et le gage
de vos progrès.
Enfin, les ordinateurs, quels qu’ils soient, ne sont fondamentalement capables de
comprendre que quatre catégories d'ordres (en programmation, on n'emploiera pas le
terme d'ordre, mais plutôt celui d'instructions). Ces quatre familles d'instructions sont :
• l’affectation de variables
• la lecture / écriture
• les tests
• les boucles

Un algorithme informatique se ramène donc toujours au bout du compte à la combinaison


de ces quatre petites briques de base. Il peut y en avoir quelques-unes, quelques dizaines,
et jusqu’à plusieurs centaines de milliers dans certains programmes de gestion.
(Cependant, la taille d’un algorithme ne conditionne pas en soi sa complexité : de longs
algorithmes peuvent être finalement assez simples, et de petits très compliqués).

6.2. Algorithme et programmation

Pourquoi apprendre l’algorithmique pour apprendre à programmer ? En quoi a-t-on besoin


d’un langage spécial, distinct des langages de programmation compréhensibles par les
ordinateurs ?
Parce que l’algorithmique exprime les instructions résolvant un problème donné
indépendamment des particularités de tel ou tel langage. Pour prendre une image, si un
programme était une dissertation, l’algorithmique serait le plan, une fois mis de côté la
rédaction et l’orthographe. Or, vous savez qu’il vaut mieux faire d’abord le plan et rédiger
ensuite que l’inverse…
Apprendre l’algorithmique, c’est apprendre à manier la structure logique d’un programme
informatique. Cette dimension est présente quelle que soit le langage de programmation ;
mais lorsqu’on programme dans un langage (en C, en Visual Basic, etc.) on doit en plus se
colleter les problèmes de syntaxe, ou de types d’instructions, propres à ce langage.
Apprendre l’algorithmique de manière séparée, c’est donc sérier les difficultés pour mieux les
vaincre.
A cela, il faut ajouter que des générations de programmeurs, souvent autodidactes, ayant
directement appris à programmer dans tel ou tel langage, ne font pas mentalement
clairement la différence entre ce qui relève de la structure logique générale de toute
programmation (les règles fondamentales de l’algorithmique) et ce qui relève du langage
particulier qu’ils ont appris. Ces programmeurs, non seulement ont beaucoup plus de mal
83

à passer ensuite à un langage différent, mais encore écrivent bien souvent des programmes
qui même s’ils sont justes, restent laborieux. Car on n’ignore pas impunément les règles
fondamentales de l’algorithmique.

6.3. Conventions d’écriture d’un algorithme

Historiquement, plusieurs types de notations ont représenté des algorithmes.


Il y a eu notamment une représentation graphique, avec des carrés, des losanges, etc.
qu’on appelait des organigrammes. Aujourd’hui, cette représentation est quasiment
abandonnée, pour deux raisons. D’abord, parce que dès que l’algorithme commence à
grossir un peu, ce n’est plus pratique du tout du tout. Ensuite parce que cette
représentation favorise le glissement vers un certain type de programmation, dite non
structurée, que l’on tente au contraire d’éviter.
C’est pourquoi on utilise généralement une série de conventions appelée « pseudo-code »,
qui ressemble à un langage de programmation authentique dont on aurait évacué la
plupart des problèmes de syntaxe. Ce pseudo-code est susceptible de varier légèrement
d’un livre (ou d’un enseignant) à un autre. C’est bien normal : le pseudo-code, encore une
fois, est purement conventionnel ; aucune machine n’est censée le reconnaître. Donc,
chaque cuisinier peut faire sa sauce à sa guise, avec ses petites épices bien à lui, sans que
cela prête à conséquence.

6.4. Variables
6.4.1. Utilité d’une variable
Dans un programme informatique, on va avoir en permanence besoin de stocker
provisoirement des valeurs. Il peut s’agir de données issues du disque dur, fournies par
l’utilisateur (frappées au clavier),... Il peut aussi s’agir de résultats obtenus par le
programme, intermédiaires ou définitifs. Ces données peuvent être de plusieurs types:
elles peuvent être des nombres, du texte, etc. Toujours est-il que dès que l’on a besoin de
stocker une information au cours d’un programme, on utilise une variable.
Pour employer une image, une variable est une boîte, que le programme (l’ordinateur) va
repérer par une étiquette. Pour avoir accès au contenu de la boîte, il suffit de la désigner
par son étiquette.
En réalité, dans l’ordinateur, physiquement, il y a un emplacement de mémoire, repéré par
une adresse binaire. Si on programmait dans un langage directement compréhensible par
la machine, on devrait se fader de désigner nos données par de superbes 10011001 et autres
01001001. Ces langages portent le nom d’assembleur.
84

6.4.2. Déclaration des variables


La première chose à faire avant de pouvoir utiliser une variable est de créer la boîte et de
lui coller une étiquette. Ceci se fait tout au début de l’algorithme, avant même les
instructions proprement dites. C’est ce qu’on appelle la déclaration des variables.
Le nom de la variable (l’étiquette de la boîte) obéit à des impératifs changeant selon les
langages. Toutefois, une règle absolue est qu’un nom de variable peut comporter des
lettres et des chiffres, mais qu’il exclut la plupart des signes de ponctuation, en particulier
les espaces. Un nom de variable correct commence également impérativement par une
lettre. Quant au nombre maximal de signes pour un nom de variable, il dépend du langage
utilisé.
En pseudo-code algorithmique, on est bien sûr libre du nombre de signes pour un nom de
variable, même si pour des raisons purement pratiques, on évite généralement les noms à
rallonge.
Lorsqu’on déclare une variable, il ne suffit pas de créer une boîte (réserver un emplacement
mémoire) ; encore doit-on préciser ce que l’on voudra mettre dedans, car de cela
dépendent la taille de la boîte (de l’emplacement mémoire) et le type de codage utilisé.
6.4.2.1. Types numériques classiques
Commençons par le cas très fréquent, celui d’une variable destinée à recevoir des nombres.
Si l’on réserve un octet pour coder un nombre, on ne pourra coder que 28 = 256 valeurs
différentes. Cela peut signifier par exemple les nombres entiers de 1 à 256, ou de 0 à 255,
ou de –127 à +128… Si l’on réserve deux octets, on a droit à 65 536 valeurs ; avec trois octets,
16 777 216, etc. Et là se pose un autre problème : ce codage doit-il représenter des nombres
décimaux ? Des nombres négatifs ?
Bref, le type de codage (autrement dit, le type de variable) choisi pour un nombre va
déterminer :
• les valeurs maximales et minimales des nombres pouvant être stockés dans la
variable
• la précision de ces nombres (dans le cas de nombres décimaux).
Tous les langages, quels qu’ils soient offrent un « bouquet » de types numériques, dont le
détail est susceptible de varier légèrement d’un langage à l’autre
Type Numérique Plage
Byte (octet) 0 à 255
Entier simple -32 768 à 32 767
Entier long -2 147 483 648 à 2 147 483 647
-3,40x1038 à -1,40x1045 pour les valeurs négatives
Réel simple -45 38
1,40x10 à 3,40x10 pour les valeurs positives
1,79x10308 à -4,94x10-324 pour les valeurs négatives
Réel double
4,94x10-324 à 1,79x10308 pour les valeurs positives
85

Un bon algorithme ne se contente pas de « marcher » ; il marche en évitant de gaspiller les


ressources de la machine. Sur certains programmes de grande taille, l’abus de variables
surdimensionnées peut entraîner des ralentissements notables à l’exécution, voire un
plantage pur et simple de l’ordinateur. Alors, autant prendre dès le début de bonnes
habitudes d’hygiène.
En algorithmique, on ne se tracassera pas trop avec les sous-types de variables numériques.
On se contentera donc de préciser qu'il s'agit d'un nombre, en gardant en tête que dans
un vrai langage, il faudra être plus précis.
En pseudo-code, une déclaration de variables aura ainsi cette tête :

Variable g en Numérique
ou encore
Variables PrixHT, TauxTVA, PrixTTC en Numérique

6.4.2.2. Autres types numériques


Certains langages autorisent d’autres types numériques, notamment :
• le type monétaire (avec strictement deux chiffres après la virgule)
• le type date (jour/mois/année).
Nous n’emploierons pas ces types dans ce cours ; mais nous le signalons, car vous ne
manquerez pas de les rencontrer en programmation proprement dite.

6.4.2.3. Type alphanumérique


Fort heureusement, les boîtes que sont les variables peuvent contenir bien d’autres
informations que des nombres. Sans cela, on serait un peu embêté dès que l’on devrait
stocker un nom de famille, par exemple.
On dispose donc également du type alphanumérique (également appelé type caractère,
type chaîne ou en anglais, le type string.
Dans une variable de ce type, on stocke des caractères, qu’il s’agisse de lettres, de signes
de ponctuation, d’espaces, ou même de chiffres. Le nombre maximal de caractères
pouvant être stockés dans une seule variable string dépend du langage utilisé.
Un groupe de caractères (y compris un groupe de un, ou de zéro caractères), qu’il soit ou
non stocké dans une variable, d’ailleurs, est donc souvent appelé chaîne de caractères.
En pseudo-code, une chaîne de caractères est toujours notée entre guillemets pour éviter
deux sources principales de possibles confusions :
• la confusion entre des nombres et des suites de chiffres. Par exemple, 423 peut
représenter le nombre 423 (quatre cent vingt-trois), ou la suite de caractères 4, 2, et 3. Et
ce n’est pas du tout la même chose ! Avec le premier, on peut faire des calculs, avec le
second, point du tout. Dès lors, les guillemets permettent d’éviter toute ambiguïté : s’il n’y
en a pas, 423 est quatre cent vingt-trois. S’il y en a, "423" représente la suite des chiffres 4,
2, 3.
• Mais ce n'est pas le pire. L'autre confusion, bien plus grave - et bien plus fréquente –
consiste à se mélanger les pinceaux entre le nom d'une variable et son contenu. Pour parler
simplement, cela consiste à confondre l'étiquette d'une boîte et ce qu'il y a à l'intérieur…
86

6.4.2.4. Type booléen


Le dernier type de variables est le type booléen : on y stocke uniquement les valeurs
logiques VRAI et FAUX.
On peut représenter ces notions abstraites de VRAI et de FAUX par tout ce qu'on veut : de
l'anglais (TRUE et FALSE) ou des nombres (0 et 1). Peu importe. Ce qui compte, c'est de
comprendre que le type booléen est très économique en termes de place mémoire
occupée, puisque pour stocker une telle information binaire, un seul bit suffit.
Le type booléen est très souvent négligé par les programmeurs, à tort.

Il est vrai qu'il n'est pas à proprement parler indispensable, et qu'on pourrait écrire à peu
près n’importe quel programme en l'ignorant complètement. Pourtant, si le type booléen
est mis à disposition des programmeurs dans tous les langages, ce n'est pas pour rien. Le
recours aux variables booléennes s'avère très souvent un puissant instrument de lisibilité
des algorithmes : il peut faciliter la vie de celui qui écrit l'algorithme, comme de celui qui le
relit pour le corriger.
Alors, maintenant, c'est certain, en algorithmique, il y a une question de style : c'est
exactement comme dans le langage courant, il y a plusieurs manières de s'exprimer pour
dire sur le fond la même chose.

6.5. Instructions d’affectation


6.5.1. Syntaxe et signification
En fait, la variable (la boîte) n'est pas un outil bien sorcier à manipuler. On ne peut pas faire
trente-six mille choses avec une variable, mais seulement une et une seule.
Cette seule chose qu’on puisse faire avec une variable, c’est l’affecter, c’est-à-dire lui
attribuer une valeur.
En pseudo-code, l'instruction d'affectation se note avec le signe 
Ainsi :
Toto  24

Attribue la valeur 24 à la variable Toto.


Ceci, soit dit en passant, sous-entend impérativement que Toto soit une variable de type
numérique. Si Toto a été défini dans un autre type, il faut bien comprendre que cette
instruction provoquera une erreur. C’est un peu comme si, en donnant un ordre à
quelqu’un, on accolait un verbe et un complément incompatibles, du genre « Epluchez la
casserole ». Même dotée de la meilleure volonté du monde, la ménagère lisant cette phrase
ne pourrait qu’interrompre dubitativement sa tâche. Alors, un ordinateur, vous pensez
bien…
On peut en revanche sans aucun problème attribuer à une variable la valeur d’une autre
variable, telle quelle ou modifiée. Par exemple :

Tutu  Toto

Signifie que la valeur de Tutu est maintenant celle de Toto.


87

Notez bien que cette instruction n’a en rien modifié la valeur de Toto : une instruction
d’affectation ne modifie que ce qui est situé à gauche de la flèche.

Tutu  Toto + 4

Si Toto contenait 12, Tutu vaut maintenant 16. De même que précédemment, Toto vaut
toujours 12.

Tutu  Tutu + 1

Si Tutu valait 6, il vaut maintenant 7. La valeur de Tutu est modifiée, puisque Tutu est la
variable située à gauche de la flèche.
Pour revenir à présent sur le rôle des guillemets dans les chaînes de caractères et sur la
confusion numéro 2 signalée plus haut, comparons maintenant deux algorithmes suivants
:

Exemple n°1
Début
Riri  "Loulou"
Fifi  "Riri"
Fin

Exemple n°2
Début
Riri  "Loulou"
Fifi  Riri
Fin

La seule différence entre les deux algorithmes consiste dans la présence ou dans l’absence
des guillemets lors de la seconde affectation.
Dans l'exemple n°1, ce que l'on affecte à la variable Fifi, c'est la suite de caractères R – i – r -
i. Et à la fin de l’algorithme, le contenu de la variable Fifi est donc « Riri ».
Dans l'exemple n°2, en revanche, Riri étant dépourvu de guillemets, n'est pas considéré
comme une suite de caractères, mais comme un nom de variable. Le sens de la ligne devient
donc : « affecte à la variable Fifi le contenu de la variable Riri ». A la fin de l’algorithme n°2,
la valeur de la variable Fifi est donc « Loulou ». Ici, l’oubli des guillemets conduit certes à un
résultat, mais à un résultat différent.
A noter, car c’est un cas très fréquent, que généralement, lorsqu’on oublie les guillemets
lors d’une affectation de chaîne, ce qui se trouve à droite du signe d’affectation ne
correspond à aucune variable précédemment déclarée et affectée. Dans ce cas, l’oubli des
guillemets se solde immédiatement par une erreur d’exécution.
Ceci est une simple illustration. Mais elle résume l’ensemble des problèmes qui surviennent
lorsqu’on oublie la règle des guillemets aux chaînes de caractères.
88

6.5.2. Ordre des instructions


Il va de soi que l’ordre dans lequel les instructions sont écrites va jouer un rôle essentiel
dans le résultat final. Considérons les deux algorithmes suivants :

Exemple 1
Variable A en Numérique
Début
A  34
A  12
Fin

Exemple 2
Variable A en Numérique
Début
A  12
A  34
Fin

Il est clair que dans le premier cas la valeur finale de A est 12, dans l’autre elle est 34.
Il est tout aussi clair que ceci ne doit pas nous étonner. Lorsqu’on indique le chemin à
quelqu’un, dire « prenez tout droit sur 1km, puis à droite » n’envoie pas les gens au même
endroit que si l’on dit « prenez à droite puis tout droit pendant 1 km ».
Enfin, il est également clair que si l’on met de côté leur vertu pédagogique, les deux
algorithmes ci-dessus sont parfaitement idiots ; à tout le moins ils contiennent une
incohérence. Il n’y a aucun intérêt à affecter une variable pour l’affecter différemment juste
après. En l’occurrence, on aurait tout aussi bien atteint le même résultat en écrivant
simplement :
Exemple 1
Variable A en Numérique
Début
A  12
Fin

Exemple 2
Variable A en Numérique
Début
A  34
Fin

Il va de soi que l’ordre dans lequel les instructions sont écrites va jouer un rôle essentiel
dans le résultat final. Considérons les deux algorithmes suivants :
89

Exemple 1
Variable A en Numérique
Début
A  34
A  12
Fin

Exemple 2
Variable A en Numérique
Début
A  12
A  34
Fin
Il est clair que dans le premier cas la valeur finale de A est 12, dans l’autre elle est 34.
Il est tout aussi clair que ceci ne doit pas nous étonner. Lorsqu’on indique le chemin à
quelqu’un, dire « prenez tout droit sur 1km, puis à droite » n’envoie pas les gens au même
endroit que si l’on dit « prenez à droite puis tout droit pendant 1 km ».
Enfin, il est également clair que si l’on met de côté leur vertu pédagogique, les deux
algorithmes ci-dessus sont parfaitement insensés ; à tout le moins ils contiennent une
incohérence. Il n’y a aucun intérêt à affecter une variable pour l’affecter différemment juste
après. En l’occurrence, on aurait tout aussi bien atteint le même résultat en écrivant
simplement :
Exemple 1
Variable A en Numérique
Début
A  12
Fin

Exemple 2
Variable A en Numérique
Début
A  34
Fin

6.5.3. Exercices
Exercice 1.1
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
90

Variables A, B en Entier
Début
A1
BA+3
A3
Fin

Exercice 1.2
Quelles seront les valeurs des variables A, B et C après exécution des instructions suivantes
?
Variables A, B, C en Entier
Début
A5
B3
CA+B
A2
CB–A
Fin

Exercice 1.3
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
Variables A, B en Entier
Début
A5
BA+4
AA+1
BA–4
Fin

Exercice 1.4
Quelles seront les valeurs des variables A, B et C après exécution des instructions
suivantes ?
Variables A, B, C en Entier
Début
A3
B  10
CA+B
BA+B
AC
Fin

Exercice 1.5
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
91

Variables A, B en Entier
Début
A5
B2
AB
BA
Fin

Moralité : les deux dernières instructions permettent-elles d’échanger les deux valeurs de
B et A ? Si l’on inverse les deux dernières instructions, cela change-t-il quelque chose ?
Exercice 1.6
Plus difficile, mais c’est un classique absolu, qu’il faut absolument maîtriser : écrire un
algorithme permettant d’échanger les valeurs de deux variables A et B, et ce quel que soit
leur contenu préalable.
Exercice 1.7
Une variante du précédent : on dispose de trois variables A, B et C. Ecrivez un algorithme
transférant à B la valeur de A, à C la valeur de B et à A la valeur de C (toujours quels que
soient les contenus préalables de ces variables).

6.6. Expressions et opérateurs


Si on fait le point, on s’aperçoit que dans une instruction d’affectation, on trouve :
• à gauche de la flèche, un nom de variable, et uniquement cela. En ce monde empli
de doutes qu’est celui de l’algorithmique, c’est une des rares règles d’or qui marche à tous
les coups : si on voit à gauche d’une flèche d’affectation autre chose qu’un nom de variable,
on peut être certain à 100% qu’il s’agit d’une erreur.
• à droite de la flèche, ce qu’on appelle une expression. Voilà encore un mot qui est
trompeur ; en effet, ce mot existe dans le langage courant, où il revêt bien des
significations. Mais en informatique, le terme d’expression ne désigne qu’une seule chose,
et qui plus est une chose très précise :
Une expression est un ensemble de valeurs, reliées par des opérateurs, et équivalent à
une seule valeur.
Par exemple, voyons quelques expressions de type numérique. Ainsi :
7
5+4
123-45+844
Toto-12+5-Riri

Sont toutes des expressions valides, pour peu que Toto et Riri soient bien des nombres.
Car dans le cas contraire, la quatrième expression n’a pas de sens. En l’occurrence, les
opérateurs employés sont l’addition (+) et la soustraction (-).
Revenons pour le moment sur l’affectation. Une condition supplémentaire (en plus des
deux précédentes) de validité d’une instruction d’affectation est que :
92

• l’expression située à droite de la flèche soit du même type que la variable située à
gauche. C’est très logique : on ne peut pas ranger convenablement des outils dans un sac
à provision, ni des légumes dans une trousse à outils… sauf à provoquer un résultat
catastrophique.
Si l’un des trois points énumérés ci-dessus n’est pas respecté, la machine sera incapable
d’exécuter l’affectation, et déclenchera une erreur.
On va maintenant détailler ce que l’on entend par le terme d’opérateur.
Un opérateur est un signe qui relie deux valeurs, pour produire un résultat.
Les opérateurs possibles dépendent du type des valeurs qui sont en jeu.

6.6.1. Opérateurs numériques :

Ce sont les quatre opérations arithmétiques tout ce qu’il y a de classique.


+ : Addition
- : Soustraction
* : Multiplication
/ : Division

Mentionnons également le ^ qui signifie « puissance ». 45 au carré s’écrira donc 45^2.


Enfin, on a le droit d’utiliser les parenthèses, avec les mêmes règles qu’en mathématiques.
La multiplication et la division ont « naturellement » priorité sur l’addition et la
soustraction. Les parenthèses ne sont ainsi utiles que pour modifier cette priorité
naturelle.
Cela signifie qu’en informatique, 12 * 3 + 5 et (12 * 3) + 5 valent strictement la même chose,
à savoir 41. Les parenthèses modifient la règle de base.
En revanche, 12 * (3 + 5) vaut 12 * 8 soit 96.

6.6.2. Opérateur alphanumérique : &

Cet opérateur permet de concaténer, autrement dit d’agglomérer, deux chaînes de


caractères. Par exemple :
Variables A, B, C en Caractère
Début
A  "Verone"
B  "Vigie"
CA&B
Fin
La valeur de C à la fin de l’algorithme est "VeroneVigie

6.6.3. Opérateurs logiques (ou booléens) :

Il s’agit du ET, du OU, du NON et du mystérieux (mais rarissime XOR).

6.7. Exercices

Exercice 1.8
93

Que produit l’algorithme suivant ?


Variables A, B, C en Caractères
Début
A ← "423"
B ← "12"
C←A+B
Fin

Exercice 1.9
Que produit l’algorithme suivant ?
Variables A, B, C en Caractères
Début
A ← "423"
B ← "12"
C←A&B
Fin

6.6.4. Remarques

Maintenant que nous sommes familiers des variables et que nous les manipulons sans
problème (mais les neurones en éveil, toutefois), nous attirons l’attention sur la trompeuse
similitude de vocabulaire entre les mathématiques et l’informatique. En mathématiques,
une « variable » est généralement une inconnue, qui recouvre un nombre non précisé de
valeurs. Lorsque nous écrivons :
y = 3 x + 2 les « variables » x et y satisfaisant à l’équation existent en nombre infini
(graphiquement, l’ensemble des solutions à cette équation dessine une droite). Lorsque
nous écrivons :
ax² + bx + c = 0 la « variable » x désigne les solutions à cette équation, c’est-à-dire zéro, une
ou deux valeurs à la fois…
En informatique, une variable possède à un moment donné une valeur et une seule. A la
rigueur, elle peut ne pas avoir de valeur du tout (une fois qu’elle a été déclarée, et tant
qu’on ne l’a pas affectée. Signalons que dans certains langages, les variables non encore
affectées sont considérées comme valant automatiquement zéro). Mais ce qui est
important, c’est que cette valeur justement, ne « varie » pas à proprement parler. Du moins
ne varie-t-elle que lorsqu’elle est l’objet d’une instruction d’affectation.
La deuxième remarque concerne le signe de l’affectation.
En algorithmique, comme on l’a vu, c’est le signe. Mais en pratique, la quasi-totalité des
langages emploient le signe égal. Et là, pour les débutants, la confusion avec les maths est
également facile. En maths, A = B et B = A sont deux propositions strictement équivalentes.
En informatique, absolument pas, puisque cela revient à écrire A  B et B  A, deux choses
bien différentes. De même, A = A + 1, qui en mathématiques, constitue une équation sans
94

solution, représente en programmation une action tout à fait licite (et de surcroît
extrêmement courante).
La meilleure des vaccinations contre cette confusion consiste à bien employer le signe 
en pseudo-code, signe qui a le mérite de ne pas laisser place à l’ambiguïté. Une fois acquis
les bons réflexes avec ce signe, vous n’aurez plus aucune difficulté à passer au = des
langages de programmation.

6.7. Ecriture et lecture

Imaginons que nous ayons fait un programme pour calculer le carré d’un nombre, mettons
12. Si on a fait au plus simple, on a écrit un truc du genre :
Variable A en Numérique
Début
A  12^2
Fin

D’une part, ce programme nous donne le carré de 12. Mais si l’on veut le carré d’un autre
nombre que 12, il faut réécrire le programme.
D’autre part, le résultat est indubitablement calculé par la machine. Mais elle le garde
soigneusement pour elle, et le pauvre utilisateur qui fait exécuter ce programme, lui, ne
saura jamais quel est le carré de 12.

Dans un sens, ces instructions permettent à l’utilisateur de rentrer des valeurs au clavier
pour qu’elles soient utilisées par le programme. Cette opération est la lecture.
Dans l’autre sens, d’autres instructions permettent au programme de communiquer des
valeurs à l’utilisateur en les affichant à l’écran. Cette opération est l’écriture.

Remarque essentielle : A première vue, on peut avoir l’impression que les informaticiens
étaient beurrés comme des petits lus lorsqu’ils ont baptisé ces opérations ; puisque quand
l’utilisateur doit écrire au clavier, on appelle ça la lecture, et quand il doit lire sur l’écran on
appelle çà l’écriture.
Un algorithme, c’est une suite d’instructions qui programme la machine, pas l’utilisateur.
Donc quand on dit à la machine de lire une valeur, cela implique que l’utilisateur va devoir
écrire cette valeur. Et quand on demande à la machine d’écrire une valeur, c’est pour que
l’utilisateur puisse la lire. Lecture et écriture sont donc des termes qui comme toujours en
programmation, doivent être compris du point de vue de la machine qui sera chargée de
les exécuter. Et là, tout devient parfaitement logique.

6.7.1. Instructions de lecture et d’écriture

Tout bêtement, pour que l’utilisateur entre la (nouvelle) valeur de Titi, on mettra :

Lire Titi
95

Dès que le programme rencontre une instruction Lire, l’exécution s’interrompt, attendant
la frappe d’une valeur au clavier
Dès lors, aussitôt que la touche Entrée (Enter) a été frappée, l’exécution reprend. Dans le
sens inverse, pour écrire quelque chose à l’écran, c’est aussi simple que :

Ecrire Toto

Avant de Lire une variable, il est très fortement conseillé d’écrire des libellés à l’écran, afin
de prévenir l’utilisateur de ce qu’il doit frapper (sinon, l’utilisateur passera son temps à se
demander ce que l’ordinateur attend de lui…) :

Ecrire "Entrez votre nom : "


Lire NomFamille

Lecture et Ecriture sont des instructions algorithmiques qui ne présentent pas de difficultés
particulières, une fois qu’on a bien assimilé ce problème du sens du dialogue (homme 
machine, ou machine  homme).

6.7.2. Exercices
Exercice 2.1
Quel résultat produit le programme suivant ?
Variables val, double numériques
Début
Val  231
Double  Val * 2
Ecrire Val
Ecrire Double
Fin

Exercice 2.2
Ecrire un programme qui demande un nombre à l’utilisateur, puis qui calcule et affiche le
carré de ce nombre.

Exercice 2.3
Ecrire un programme qui lit le prix HT d’un article, le nombre d’articles et le taux de TVA, et
qui fournit le prix total TTC correspondant. Faire en sorte que des libellés apparaissent
clairement.

Exercice 2.4
Ecrire un algorithme utilisant des variables de type chaîne de caractères, et affichant quatre
variantes possibles de la célèbre « belle marquise, vos beaux yeux me font mourir d’amour
». On ne se soucie pas de la ponctuation, ni des majuscules.

6.8. Tests
96

En informatique, un test désigne une procédure de vérification partielle d'un système. Son
objectif principal est d'identifier un nombre maximum de comportements problématiques
du logiciel. Il permet ainsi, dès lors que les problèmes identifiés seront corrigés, d'en
augmenter la qualité.
D'une manière plus générale, le test désigne toutes les activités qui consistent à rechercher
des informations quant à la qualité du système afin de permettre la prise de décisions.

6.8.1. Structure d’un test


Il n’y a que deux formes possibles pour un test ; la première est la plus simple, la seconde
la plus complexe.

Si booléen Alors
Instructions
Finsi
Si booléen Alors
Instructions 1
Sinon
Instructions 2
Finsi

Un booléen est une expression dont la valeur est VRAI ou FAUX. Cela peut donc être (il n’y
a que deux possibilités) :
• une variable (ou une expression) de type booléen
• une condition
Toujours est-il que la structure d’un test est relativement claire. Dans la forme la plus
simple, arrivé à la première ligne (Si… Alors) la machine examine la valeur du booléen. Si
ce booléen a pour valeur VRAI, elle exécute la série d’instructions. Cette série d’instructions
peut être très brève comme très longue, cela n’a aucune importance. En revanche, dans le
cas où le booléen est faux, l'ordinateur saute directement aux instructions situées après le
FinSi.
Dans le cas de la structure complète, c'est à peine plus compliqué. Dans le cas où le booléen
est VRAI, et après avoir exécuté la série d'instructions 1, au moment où elle arrive au mot «
Sinon », la machine saute directement à la première instruction située après le « FinSi ». De
même, au cas où le booléen a comme valeur « Faux », la machine saute directement à la
première ligne située après le « Sinon » et exécute l’ensemble des « instructions 2 ». Dans
tous les cas, les instructions situées juste après le FinSi seront exécutées normalement.
En fait, la forme simplifiée correspond au cas où l’une des deux « branches » du Si est vide.
Dès lors, plutôt qu’écrire « sinon ne rien faire du tout », il est plus simple de ne rien écrire.
Et laisser un Si... complet, avec une des deux branches vides, est considéré comme une très
grosse maladresse pour un programmeur, même si cela ne constitue pas à proprement
parler une faute.
Exprimé sous forme de pseudo-code, donnerait donc quelque chose du genre :
97

Si booléen Alors
Instructions
Finsi
Si booléen Alors
Instructions 1
Sinon
Instructions 2
Finsi
Allez tout droit jusqu’au prochain carrefour
Si la rue à droite est autorisée à la circulation Alors
Tournez à droite
Avancez
Prenez la deuxième à gauche
Sinon
Continuez jusqu’à la prochaine rue à droite
Prenez cette rue
Prenez la première à droite
Finsi

6.9. Conditions

Une condition est une comparaison


Elle signifie qu’une condition est composée de trois éléments :
• une valeur
• un opérateur de comparaison
• une autre valeur
Les valeurs peuvent être a priori de n’importe quel type (numériques, caractères…). Mais
si l’on veut que la comparaison ait un sens, il faut que les deux valeurs de la comparaison
soient du même type.

Les opérateurs de comparaison sont :


• égal à…
• différent de…
• strictement plus petit que…
• strictement plus grand que…
• plus petit ou égal à…
• plus grand ou égal à…

L’ensemble des trois éléments constituant la condition constitue donc, si l’on veut, une
affirmation, qui a un moment donné est VRAIE ou FAUSSE.
A noter que ces opérateurs de comparaison peuvent tout à fait s’employer avec des
caractères. Ceux-ci sont codés par la machine dans l’ordre alphabétique (rappelez-vous le
code ASCII), les majuscules étant systématiquement placées avant les minuscules. Ainsi on
a:
98

“t” < “w” VRAI


“Maman” > “Papa“ FAUX
“maman” > “Papa” VRAI

Remarque très importante :

En formulant une condition dans un algorithme, il faut se méfier comme de la peste de


certains raccourcis du langage courant, ou de certaines notations valides en
mathématiques, mais qui mènent à des non-sens informatiques. Prenons par exemple la
phrase « Toto est compris entre 5 et 8 ». On peut être tenté de la traduire par : 5 < Toto < 8
Or, une telle expression, qui a du sens en français, comme en mathématiques, ne veut rien
dire en programmation. En effet, elle comprend deux opérateurs de comparaison, soit un
de trop, et trois valeurs, soit là aussi une de trop. On va voir dans un instant comment
traduire convenablement une telle condition.

6.9.1. Exercices

Exercice 3.1
Ecrire un algorithme qui demande un nombre à l’utilisateur, et l’informe ensuite si ce
nombre est positif ou négatif (on laisse de côté le cas où le nombre vaut zéro)

Exercice 3.1

Variable n en Entier
Début
Ecrire "Entrez un nombre : "
Lire n
Si n > 0 Alors
Ecrire "Ce nombre est positif”
Sinon
Ecrire "Ce nombre est négatif"
Finsi
Fin

6.10. Conditions composées

Certains problèmes exigent parfois de formuler des conditions qui ne peuvent pas être
exprimées sous la forme simple exposée ci-dessus. Reprenons le cas « Toto est inclus entre
5 et 8 ». En fait cette phrase cache non une, mais deux conditions. Car elle revient à dire
que « Toto est supérieur à 5 et Toto est inférieur à 8 ». Il y a donc bien là deux conditions,
reliées par ce qu’on appelle un opérateur logique, le mot ET.
Comme on l’a évoqué plus haut, l’informatique met à notre disposition quatre opérateurs
logiques : ET, OU, NON, et XOR.
99

• Le ET a le même sens en informatique que dans le langage courant. Pour que


"Condition1 ET Condition2" soit VRAI, il faut impérativement que Condition1 soit VRAI et
que Condition2 soit VRAI. Dans tous les autres cas, "Condition 1 et Condition2" sera faux.
• Il faut se méfier un peu plus du OU. Pour que "Condition1 OU Condition2" soit VRAI,
il suffit que Condition1 soit VRAIE ou que Condition2 soit VRAIE. Le point important est que
si Condition1 est VRAIE et que Condition2 est VRAIE aussi, Condition1 OU Condition2 reste
VRAIE. Le OU informatique ne veut donc pas dire « ou bien »
• Le XOR (ou OU exclusif) fonctionne de la manière suivante. Pour que "Condition1
XOR Condition2" soit VRAI, il faut que soit Condition1 soit VRAI, soit que Condition2 soit
VRAI. Si toutes les deux sont fausses, ou que toutes les deux sont VRAI, alors le résultat
global est considéré comme FAUX. Le XOR est donc l'équivalent du "ou bien" du langage
courant.
Toutefois, le XOR est une rareté, dont il n’est pas strictement indispensable de s’encombrer
en programmation.
• Enfin, le NON inverse une condition : NON(Condition1) est VRAI si Condition1 est
FAUX, et il sera FAUX si Condition1 est VRAI. C'est l'équivalent pour les booléens du signe
"moins" que l'on place devant les nombres.
Alors, vous vous demandez peut-être à quoi sert ce NON. Après tout, plutôt qu’écrire NON
(Prix > 20), il serait plus simple d’écrire tout bonnement Prix=<20. Dans ce cas précis, c’est
évident qu’on se complique inutilement la vie avec le NON. Mais si le NON n'est jamais
indispensable, il y a tout de même des situations dans lesquelles il s'avère bien utile.
On représente fréquemment tout ceci dans des tables de vérité (C1 et C2 représentent deux
conditions, et on envisage à chaque fois les quatre cas possibles)
Tableau 1
C1 et C2 C2 Vrai C2 Faux
C1 Vrai Vrai Faux
C1 Faux Faux Faux
Tableau 2
C1 ou C2 C2 Vrai C2 Faux
C1 Vrai Vrai Vrai
C1 Faux Vrai Faux
Tableau 3

C1 xor C2 C2 Vrai C2 Faux


C1 Vrai Faux Vrai
C1 Faux Vrai Faux
Tableau 4
Non C1
C1 Vrai Faux
C1 Faux Vrai
100

6.10.1. Exercices

Exercice 3.2
Ecrire un algorithme qui demande deux nombres à l’utilisateur et l’informe ensuite si leur
produit est négatif ou positif (on laisse de côté le cas où le produit est nul). Attention
toutefois : on ne doit pas calculer le produit des deux nombres.

Exercice 3.3
Ecrire un algorithme qui demande trois noms à l’utilisateur et l’informe ensuite s’ils sont
rangés ou non dans l’ordre alphabétique.

6.11. Tests imbriqués

Graphiquement, on peut très facilement représenter un SI comme un aiguillage de chemin


de fer (ou un aiguillage de train électrique, c’est moins lourd à porter). Un SI ouvre donc
deux voies, correspondant à deux traitements différents. Mais il y a des tas de situations
où deux voies ne suffisent pas. Par exemple, un programme devant donner l’état de l’eau
selon sa température doit pouvoir choisir entre trois réponses possibles (solide, liquide ou
gazeuse).
Une première solution serait la suivante :

Variable Temp en Entier


Début
Ecrire "Entrez la température de l’eau :"
Lire Temp
Si Temp =< 0 Alors
Ecrire "C’est de la glace"
FinSi
Si Temp > 0 Et Temp < 100 Alors
Ecrire "C’est du liquide"
Finsi
Si Temp > 100 Alors
Ecrire "C’est de la vapeur"
Finsi
Fin

Nous constatons que c’est un peu laborieux. Les conditions se ressemblent plus ou moins,
et surtout on oblige la machine à examiner trois tests successifs alors que tous portent sur
une même chose, la température de l'eau (la valeur de la variable Temp). Il serait ainsi bien
plus rationnel d’imbriquer les tests de cette manière :

Variable Temp en Entier


Début
Ecrire "Entrez la température de l’eau :"
Lire Temp
Si Temp =< 0 Alors
101

Ecrire "C’est de la glace"


Sinon
Si Temp < 100 Alors
Ecrire "C’est du liquide"
Sinon
Ecrire "C’est de la vapeur"
Finsi
Finsi
Fin

Nous avons fait des économies : au lieu de devoir taper trois conditions, dont une
composée, nous n’avons plus que deux conditions simples. Mais aussi, et surtout, nous
avons fait des économies sur le temps d’exécution de l’ordinateur. Si la température est
inférieure à zéro, celui-ci écrit dorénavant « C’est de la glace » et passe directement à la fin,
sans être ralenti par l’examen d’autres possibilités (qui sont forcément fausses).
Cette deuxième version n’est donc pas seulement plus simple à écrire et plus lisible, elle est
également plus performante à l’exécution.
Les structures de tests imbriqués sont donc un outil indispensable à la simplification et à
l’optimisation des algorithmes.

6.11.1. Exercices

Exercice 3.4
Ecrire un algorithme qui demande un nombre à l’utilisateur, et l’informe ensuite si ce
nombre est positif ou négatif (on inclut cette fois le traitement du cas où le nombre vaut
zéro).

Exercice 3.5
Ecrire un algorithme qui demande deux nombres à l’utilisateur et l’informe ensuite si le
produit est négatif ou positif (on inclut cette fois le traitement du cas où le produit peut
être nul). Attention toutefois, on ne doit pas calculer le produit.

Exercice 3.6
Ecrire un algorithme qui demande l’âge d’un enfant à l’utilisateur. Ensuite, il l’informe de sa
catégorie :
• "Poussin" de 6 à 7 ans
• "Pupille" de 8 à 9 ans
• "Minime" de 10 à 11 ans
• "Cadet" après 12 ans
Peut-on concevoir plusieurs algorithmes équivalents menant à ce résultat.

6.12. Aiguillage et la gare de tri

Dans un programme, une structure SI peut être facilement comparée à un aiguillage de


train. La voie principale se sépare en deux, le train devant rouler ou sur l’une, ou sur l’autre,
102

et les deux voies se rejoignant tôt ou tard pour ne plus en former qu’une seule, lors du
FinSi. On peut schématiser cela ainsi :

Mais dans certains cas, ce ne sont pas deux voies qu’il nous faut, mais trois, ou même plus.
Dans le cas de l’état de l’eau, il nous faut trois voies pour notre « train », puisque l’eau peut
être solide, liquide ou gazeuse. Alors, nous n’avons pas eu le choix : pour deux voies, il nous
fallait un aiguillage, pour trois voies il nous en faut deux, imbriqués l’un dans l’autre.
Cette structure (telle que nous l’avons programmée à la page précédente) devrait être
schématisée comme suit :

Soyons bien clairs : cette structure est la seule possible du point de vue logique (même si
on peut toujours mettre le bas en haut et le haut en bas). Mais du point de vue de l’écriture,
le pseudo-code algorithmique admet une simplification supplémentaire. Ainsi, il est
possible (mais non obligatoire, que l’algorithme initial :
Variable Temp en Entier
Début
Ecrire "Entrez la température de l’eau :"
Lire Temp
Si Temp =< 0 Alors
Ecrire "C'est de la glace"
Sinon
Si Temp < 100 Alors
Ecrire "C’est du liquide"
Sinon
Ecrire "C’est de la vapeur"
Finsi
Finsi
Fin

devienne :
Variable Temp en Entier
Début
Ecrire "Entrez la température de l’eau :"
Lire Temp
103

Si Temp =< 0 Alors


Ecrire "C’est de la glace"
SinonSi Temp < 100 Alors
Ecrire "C’est du liquide"
Sinon
Ecrire "C’est de la vapeur"
Finsi
Fin

Dans le cas de tests imbriqués, le Sinon et le Si peuvent être fusionnés en un SinonSi. On


considère alors qu’il s’agit d’un seul bloc de test, conclu par un seul FinSi

Le SinonSi permet en quelque sorte de créer (en réalité, de simuler) des aiguillages à plus
de deux branches. On peut ainsi enchaîner les SinonSi les uns derrière les autres pour
simuler un aiguillage à autant de branches que l’on souhaite.

6.13. Variables booléennes

Il existe un type de variables (les booléennes) susceptibles de stocker les valeurs VRAI ou
FAUX. En fait, on peut donc entrer des conditions dans ces variables, et tester ensuite la
valeur de ces variables.
Reprenons l’exemple de l’eau. On pourrait le réécrire ainsi :

Variable Temp en Entier


Variables A, B en Booléen
Début
Ecrire "Entrez la température de l’eau :"
Lire Temp
A  Temp =< 0
B  Temp < 100
Si A Alors
Ecrire "C’est de la glace"
SinonSi B Alors
Ecrire "C’est du liquide"
Sinon
Ecrire "C’est de la vapeur"
Finsi
Fin

A priori, cette technique ne présente guère d’intérêt : on a alourdi plutôt qu’allégé


l’algorithme de départ, en ayant recours à deux variables supplémentaires.
• Mais souvenons-nous : une variable booléenne n’a besoin que d’un seul bit pour être
stockée. De ce point de vue, l’alourdissement n’est donc pas considérable.
• dans certains cas, notamment celui de conditions composées très lourdes (avec
plein de ET et de OU tout partout) cette technique peut faciliter le travail du programmeur,
104

en améliorant nettement la lisibilité de l’algorithme. Les variables booléennes peuvent


également s’avérer très utiles pour servir de flag, technique dont on reparlera plus loin.

6.14. Logique
6.14.1. Entre ‘ET’ et ‘OU’
Remarque
Dans le cas de conditions composées, les parenthèses jouent un rôle fondamental.

Variables A, B, C, D, E en Booléen
Variable X en Entier
Début
Lire X
A  X > 12
BX>2
CX<6
D  (A ET B) OU C
E  A ET (B OU C)
Ecrire D, E
Fin

Si X = 3, alors on remarque que D sera VRAI alors que E sera FAUX.


S’il n’y a dans une condition que des ET, ou que des OU, en revanche, les parenthèses ne
changent strictement rien.
Dans une condition composée employant à la fois des opérateurs ET et des opérateurs OU, la
présence de parenthèses possède une influence sur le résultat, tout comme dans le cas d’une
expression numérique comportant des multiplications et des additions.
On en arrive à une autre propriété des ET et des OU, bien plus intéressante.
Spontanément, on pense souvent que ET et OU s’excluent mutuellement, au sens où un
problème donné s’exprime soit avec un ET, soit avec un OU. Pourtant, ce n’est pas si
évident.
Quand faut-il ouvrir la fenêtre de la salle ? Uniquement si les conditions l’imposent, à savoir
:

Si il fait trop chaud ET il ne pleut pas Alors


Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi

Cette petite règle pourrait tout aussi bien être formulée comme suit :

Si il ne fait pas trop chaud OU il pleut Alors


Fermer la fenêtre
Sinon
105

Ouvrir la fenêtre
Finsi

Ces deux formulations sont strictement équivalentes. Ce qui nous amène à la conclusion
suivante :
Toute structure de test requérant une condition composée faisant intervenir l’opérateur ET
peut être exprimée de manière équivalente avec un opérateur OU, et réciproquement.

Ceci est moins surprenant qu’il n’y paraît au premier abord. Jetez pour vous en convaincre
un œil sur les tables de vérité, et vous noterez la symétrie entre celle du ET et celle du OU.
Dans les deux tables, il y a trois cas sur quatre qui mènent à un résultat, et un sur quatre
qui mène au résultat inverse. Alors, rien d’étonnant à ce qu’une situation qui s’exprime
avec une des tables (un des opérateurs logiques) puisse tout aussi bien être exprimée avec
l’autre table (l’autre opérateur logique). Toute l’astuce consiste à savoir effectuer
correctement ce passage.
Bien sûr, on ne peut pas se contenter de remplacer purement et simplement les ET par des
OU ; ce serait un peu facile. La règle d’équivalence est la suivante (on peut la vérifier sur
l’exemple de la fenêtre) :

Si A ET B Alors
Instructions 1
Sinon
Instructions 2
Finsi

équivaut à :

Si NON A OU NON B Alors


Instructions 2
Sinon
Instructions 1
Finsi

Cette règle porte le nom de transformation de Morgan, du nom du mathématicien anglais


qui l'a formulée.

6.14.2. Exercices

Exercice 4.1

Formulez un algorithme équivalent à l’algorithme suivant :

Si Tutu > Toto + 4 OU Tata = "OK" Alors


Tutu  Tutu + 1
Sinon
Tutu  Tutu – 1
106

Finsi
Exercice 4.2

Cet algorithme est destiné à prédire l'avenir, et il doit être infaillible !

Il lira au clavier l’heure et les minutes, et il affichera l’heure qu’il sera une minute plus tard.
Par exemple, si l'utilisateur tape 21 puis 32, l'algorithme doit répondre :

"Dans une minute, il sera 21 heure(s) 33".

NB : on suppose que l'utilisateur entre une heure valide. Pas besoin donc de la vérifier.

Exercice 4.3

De même que le précédent, cet algorithme doit demander une heure et en afficher une
autre. Mais cette fois, il doit gérer également les secondes, et afficher l'heure qu'il sera une
seconde plus tard.

Par exemple, si l'utilisateur tape 21, puis 32, puis 8, l'algorithme doit répondre : "Dans une
seconde, il sera 21 heure(s), 32 minute(s) et 9 seconde(s)".

NB : là encore, on suppose que l'utilisateur entre une date valide.

Exercice 4.4

Un magasin de reprographie facture 0,10 E les dix premières photocopies, 0,09 E les vingt
suivantes et 0,08 E au-delà. Ecrivez un algorithme qui demande à l’utilisateur le nombre de
photocopies effectuées et qui affiche la facture correspondante.

Exercice 4.5

Les habitants de Kadutu paient l’impôt selon les règles suivantes :


• les hommes de plus de 20 ans paient l’impôt
• les femmes paient l’impôt si elles ont entre 18 et 35 ans
• les autres ne paient pas d’impôt
Le programme demandera donc l’âge et le sexe du Kadutois, et se prononcera donc ensuite
sur le fait que l’habitant est imposable.

6.15. Style

Ce titre un peu provocateur (mais néanmoins justifié) a pour but d’attirer maintenant votre
attention sur un fait fondamental en algorithmique, fait que plusieurs remarques
précédentes ont déjà dû vous faire soupçonner : il n’y a jamais une seule manière juste de
traiter les structures alternatives. Et plus généralement, il n’y a jamais une seule manière
juste de traiter un problème. Entre les différentes possibilités, qui ne sont parfois pas
meilleures les unes que les autres, le choix est une affaire de style.
107

C’est pour cela qu’avec l’habitude, on reconnaît le style d’un programmeur aussi sûrement
que s’il s’agissait de style littéraire.
Reprenons nos opérateurs de comparaison maintenant familiers, le ET et le OU. En fait, on
s’aperçoit que l’on pourrait tout à fait s’en passer. Par exemple, pour reprendre l’exemple
de la fenêtre de la salle :

Si il fait trop chaud ET il ne pleut pas Alors


Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi

Possède un parfait équivalent algorithmique sous la forme de :

Si il fait trop chaud Alors


Si il ne pleut pas Alors
Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi
Sinon
Fermer la fenêtre
Finsi

Dans cette dernière formulation, nous n’avons plus recours à une condition composée.
Et comme tout ce qui s’exprime par un ET peut aussi être exprimé par un OU, nous en
concluons que le OU peut également être remplacé par un test imbriqué supplémentaire.
On peut ainsi poser cette règle stylistique générale :

Dans une structure alternative complexe, les conditions composées, l’imbrication des
structures de tests et l’emploi des variables booléennes ouvrent la possibilité de choix
stylistiques différents. L’alourdissement des conditions allège les structures de tests et le
nombre des booléens nécessaires ; l’emploi de booléens supplémentaires permet d’alléger les
conditions et les structures de tests, et ainsi de suite.

6.15.1. Exercices

Exercice 4.6
Les élections législatives, au Nord-Kivu, obéissent à la règle suivante : lorsque l'un des
candidats obtient plus de 50% des suffrages, il est élu dès le premier tour. En cas de
deuxième tour, peuvent participer uniquement les candidats ayant obtenu au moins 12,5%
des voix au premier tour.
Vous devez écrire un algorithme qui permette la saisie des scores de quatre candidats au
premier tour. Cet algorithme traitera ensuite le candidat numéro 1 (et uniquement lui) : il
dira s'il est élu, battu, s'il se trouve en ballottage favorable (il participe au second tour en
108

étant arrivé en tête à l'issue du premier tour) ou défavorable (il participe au second tour
sans avoir été en tête au premier tour).

Exercice 4.7
Une compagnie d'assurance automobile propose à ses clients quatre familles de tarifs
identifiables par une couleur, du moins au plus onéreux : tarifs bleu, vert, orange et rouge.
Le tarif dépend de la situation du conducteur :
• un conducteur de moins de 25 ans et titulaire du permis depuis moins de deux ans,
se voit attribuer le tarif rouge, si toutefois il n'a jamais été responsable d'accident. Sinon,
la compagnie refuse de l'assurer.
• un conducteur de moins de 25 ans et titulaire du permis depuis plus de deux ans, ou
de plus de 25 ans mais titulaire du permis depuis moins de deux ans a le droit au tarif orange
s'il n'a jamais provoqué d'accident, au tarif rouge pour un accident, sinon il est refusé.
• un conducteur de plus de 25 ans titulaire du permis depuis plus de deux ans
bénéficie du tarif vert s'il n'est à l'origine d'aucun accident et du tarif orange pour un
accident, du tarif rouge pour deux accidents, et refusé au-delà
• De plus, pour encourager la fidélité des clients acceptés, la compagnie propose un
contrat de la couleur immédiatement la plus avantageuse s'il est entré dans la maison
depuis plus de cinq ans. Ainsi, s'il satisfait à cette exigence, un client normalement "vert"
devient "bleu", un client normalement "orange" devient "vert", et le "rouge" devient
orange.
Ecrire l'algorithme permettant de saisir les données nécessaires (sans contrôle de saisie) et de
traiter ce problème.

Exercice 4.8
Ecrivez un algorithme qui après avoir demandé un numéro de jour, de mois et d'année à
l'utilisateur, renvoie s'il s'agit ou non d'une date valide.
Cet exercice est certes d’un manque d’originalité affligeant, mais après tout, en
algorithmique comme ailleurs, il faut connaître ses classiques. Et quand on a fait cela une
fois dans sa vie, on apprécie pleinement l’existence d’un type numérique « date » dans
certains langages…).
Il n'est sans doute pas inutile de rappeler rapidement que le mois de février compte 28
jours, sauf si l’année est bissextile, auquel cas il en compte 29. L’année est bissextile si elle
est divisible par quatre. Toutefois, les années divisibles par 100 ne sont pas bissextiles, mais
les années divisibles par 400 le sont.
Un dernier petit détail : vous ne savez pas, pour l’instant, exprimer correctement en
pseudo-code l’idée qu’un nombre A est divisible par un nombre B. Aussi, vous vous
contenterez d’écrire en bons télégraphistes que A divisible par B se dit « A dp B »
Si vous avez compris ce qui précède, et que l'exercice de la date ne vous pose plus aucun
problème, alors vous savez tout ce qu'il y a à savoir sur les tests pour affronter n'importe
quelle situation.
109

6.16. Boucles

Les boucles constituent la seule vraie structure logique caractéristique de la


programmation. Si vous avez utilisé un tableur comme Excel, par exemple, vous avez sans
doute pu manier des choses équivalentes aux variables (les cellules, les formules) et aux
tests (la fonction SI…). Mais les boucles, ça, ça n'a aucun équivalent. Cela n'existe que dans
les langages de programmation proprement dits.
Le maniement des boucles, est tout de même ce qui sépare en informatique le
programmeur de l'utilisateur, même averti.
Pour la notion des boucles on parle également de structures répétitives, voire carrément
de structures itératives.

6.16.1. Importance de la boucle

Prenons le cas d’une saisie au clavier (une lecture), où par exemple, le programme pose
une question à laquelle l’utilisateur doit répondre par O (Oui) ou N (Non). Mais tôt ou tard,
l’utilisateur, facétieux ou maladroit, risque de taper autre chose que la réponse attendue.
Dès lors, le programme peut planter soit par une erreur d’exécution (parce que le type de
réponse ne correspond pas au type de la variable attendu) soit par une erreur fonctionnelle
(il se déroule normalement jusqu’au bout, mais en produisant des résultats fantaisistes).
Alors, dans tout programme un tant soit peu sérieux, on met en place ce qu’on appelle un
contrôle de saisie, afin de vérifier que les données entrées au clavier correspondent bien à
celles attendues par l’algorithme.

Variable Rep en Caractère


Début
Ecrire "Voulez vous un café ? (O/N)"
Lire Rep
Si Rep <> "O" et Rep <> "N" Alors
Ecrire "Saisie erronnée. Recommencez"
Lire Rep
FinSi
Fin

C’est impeccable. Du moins tant que l’utilisateur a le bon goût de ne se tromper qu’une
seule fois, et d’entrer une valeur correcte à la deuxième demande. Si l’on veut également
bétonner en cas de deuxième erreur, il faudrait rajouter un SI. Et ainsi de suite, on peut
rajouter des centaines de SI, et écrire un algorithme aussi lourd, on n’en sortira pas.
La solution consistant à aligner des SI… en pagaille est donc une impasse. La seule issue
est donc de flanquer une structure de boucle, qui se présente ainsi :

TantQue booléen

Instructions
110


FinTantQue

Le principe est simple : le programme arrive sur la ligne du TantQue. Il examine alors la
valeur du booléen (qui, peut être une variable booléenne ou, plus fréquemment, une
condition). Si cette valeur est VRAI, le programme exécute les instructions qui suivent,
jusqu’à ce qu’il rencontre la ligne FinTantQue. Il retourne ensuite sur la ligne du TantQue,
procède au même examen, et ainsi de suite. Le manège enchanté ne s’arrête que lorsque
le booléen prend la valeur FAUX.
Illustration avec notre problème de contrôle de saisie. Une première approximation de la
solution consiste à écrire :

Variable Rep en Caractère


Début
Ecrire "Voulez vous un café ? (O/N)"
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
FinTantQue
Fin

Là, on a le squelette de l’algorithme correct. Mais de même qu’un squelette ne suffit pas
pour avoir un être vivant viable, il va nous falloir ajouter quelques muscles et organes sur
cet algorithme pour qu’il fonctionne correctement.
Son principal défaut est de provoquer une erreur à chaque exécution. En effet, l’expression
booléenne qui figure après le TantQue interroge la valeur de la variable Rep.
Malheureusement, cette variable, si elle a été déclarée, n’a pas été affectée avant l’entrée
dans la boucle. On teste donc une variable qui n’a pas de valeur, ce qui provoque une erreur
et l’arrêt immédiat de l’exécution. Pour éviter ceci, on n’a pas le choix : il faut que la variable
Rep ait déjà été affectée avant qu’on en arrive au premier tour de boucle. Pour cela, on
peut faire une première lecture de Rep avant la boucle. Dans ce cas, celle-ci ne servira qu’en
cas de mauvaise saisie lors de cette première lecture. L’algorithme devient alors :

Variable Rep en Caractère


Début
Ecrire "Voulez vous un café ? (O/N)"
Lire Rep
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
FinTantQue
Fin

Une autre possibilité, fréquemment employée, consiste à ne pas lire, mais à affecter
arbitrairement la variable avant la boucle. Arbitrairement, pas tout à fait, puisque cette
affectation doit avoir pour résultat de provoquer l’entrée obligatoire dans la boucle.
L’affectation doit donc faire en sorte que le booléen soit mis à VRAI pour déclencher le
111

premier tour de la boucle. Dans notre exemple, on peut donc affecter Rep avec n’importe
quelle valeur, hormis « O » et « N » : car dans ce cas, l’exécution sauterait la boucle, et Rep
ne serait pas du tout lue au clavier. Cela donnera par exemple :

Variable Rep en Caractère


Début
Rep ← "X"
Ecrire "Voulez vous un café ? (O/N)"
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
FinTantQue
Fin

Cette manière de procéder est à connaître, car elle est employée très fréquemment.
Il faut remarquer que les deux solutions (lecture initiale de Rep en dehors de la boucle ou
affectation de Rep) rendent toutes deux l’algorithme satisfaisant, mais présentent une
différence assez importante dans leur structure logique.
En effet, si l’on choisit d’effectuer une lecture préalable de Rep, la boucle ultérieure sera
exécutée uniquement dans l’hypothèse d’une mauvaise saisie initiale. Si l’utilisateur saisit
une valeur correcte à la première demande de Rep, l’algorithme passera sur la boucle sans
entrer dedans.
En revanche, avec la deuxième solution (celle d’une affectation préalable de Rep), l’entrée
de la boucle est forcée, et l’exécution de celle-ci, au moins une fois, est rendue obligatoire
à chaque exécution du programme. Du point de vue de l’utilisateur, cette différence est
tout à fait mineure ; et à la limite, il ne la remarquera même pas. Mais du point de vue du
programmeur, il importe de bien comprendre que les cheminements des instructions ne
seront pas les mêmes dans un cas et dans l’autre.
Pour terminer, remarquons que nous pourrions peaufiner nos solutions en ajoutant des
affichages de libellés qui font encore un peu défaut. Ainsi, si l’on est un programmeur zélé,
la première solution (celle qui inclut deux lectures de Rep, une en dehors de la boucle,
l’autre à l’intérieur) pourrait devenir :

Variable Rep en Caractère


Début
Ecrire "Voulez vous un café ? (O/N)"
Lire Rep
TantQue Rep <> "O" et Rep <> "N"
Ecrire "Vous devez répondre par O ou N. Recommencez"
Lire Rep
FinTantQue
Ecrire "Saisie acceptée"
Fin

Quant à la deuxième solution, elle pourra devenir :


112

Variable Rep en Caractère


Début
Rep  "X"
Ecrire "Voulez vous un café ? (O/N)"
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
Si Rep <> "O" et Rep <> "N" Alors
Ecrire "Saisie Erronée, Recommencez"
FinSi
FinTantQue
Fin

6.16.2. Exercices

Exercice 5.1
Ecrire un algorithme qui demande à l’utilisateur un nombre compris entre 1 et 3 jusqu’à ce
que la réponse convienne.

Exercice 5.2
Ecrire un algorithme qui demande un nombre compris entre 10 et 20, jusqu’à ce que la
réponse convienne. En cas de réponse supérieure à 20, on fera apparaître un message : «
Plus petit ! », et inversement, « Plus grand ! » si le nombre est inférieur à 10.

Exercice 5.3
Ecrire un algorithme qui demande un nombre de départ, et qui ensuite affiche les dix
nombres suivants. Par exemple, si l'utilisateur entre le nombre 17, le programme affichera
les nombres de 18 à 27.

Exercice 5.4
Ecrire un algorithme qui demande un nombre de départ, et qui ensuite écrit la table de
multiplication de ce nombre, présentée comme suit (cas où l'utilisateur entre le nombre 7)
:
Table de 7 :
7x1=7
7 x 2 = 14
7 x 3 = 21

7 x 10 = 70

6.17. Boucler en comptant / Compter en bouclant

Dans le dernier exercice, vous avez remarqué qu’une boucle pouvait être utilisée pour
augmenter la valeur d’une variable. Cette utilisation des boucles est très fréquente, et dans
ce cas, il arrive très souvent qu’on ait besoin d’effectuer un nombre déterminé de
113

passages. Or, a priori, notre structure TantQue ne sait pas à l’avance combien de tours de
boucle elle va effectuer (puisque le nombre de tours dépend de la valeur d’un booléen).
C’est pourquoi une autre structure de boucle est à notre disposition :

Variable Truc en Entier


Début
Truc ← 0
TantQue Truc < 15
Truc ← Truc + 1
Ecrire "Passage numéro : ", Truc
FinTantQue
Fin

Equivaut à :

Variable Truc en Entier


Début
Pour Truc ← 1 à 15
Ecrire "Passage numéro : ", Truc
Truc Suivant
Fin

Insistons : la structure « Pour … Suivant » n’est pas du tout indispensable ; on pourrait fort
bien programmer toutes les situations de boucle uniquement avec un « Tant Que ». Le seul
intérêt du « Pour » est d’épargner un peu de fatigue au programmeur, en lui évitant de
gérer lui-même la progression de la variable qui lui sert de compteur (on parle
d’incrémentation).
Dit d’une autre manière, la structure « Pour … Suivant » est un cas particulier de TantQue :
celui où le programmeur peut dénombrer à l’avance le nombre de tours de boucles
nécessaires.
Il faut noter que dans une structure « Pour … Suivant », la progression du compteur est
laissée à votre libre disposition. Dans la plupart des cas, on a besoin d’une variable qui
augmente de 1 à chaque tour de boucle. On ne précise alors rien à l’instruction « Pour » ;
celle-ci, par défaut, comprend qu’il va falloir procéder à cette incrémentation de 1 à chaque
passage, en commençant par la première valeur et en terminant par la deuxième.
Mais si vous souhaitez une progression plus spéciale, de 2 en 2, ou de 3 en 3, ou en arrière,
de –1 en –1, ou de –10 en –10, ce n’est pas un problème : il suffira de le préciser à votre
instruction « Pour » en lui rajoutant le mot « Pas » et la valeur de ce pas (Le « pas » dont
nous parlons, c’est le « pas » du marcheur, « step » en anglais).
Naturellement, quand on stipule un pas négatif dans une boucle, la valeur initiale du
compteur doit être supérieure à sa valeur finale si l’on veut que la boucle tourne. Dans le
cas contraire, on aura simplement écrit une boucle dans laquelle le programme ne rentrera
jamais.
114

Nous pouvons donc maintenant donner la formulation générale d’une structure « Pour ».
Sa syntaxe générale est :

Pour Compteur ← Initial à Final Pas ValeurDuPas



Instructions

Compteur suivant

Les structures TantQue sont employées dans les situations où l’on doit procéder à un
traitement systématique sur les éléments d’un ensemble dont on ne connaît pas d’avance
la quantité, comme par exemple :
• le contrôle d’une saisie
• la gestion des tours d’un jeu (tant que la partie n’est pas finie, on recommence)
• la lecture des enregistrements d’un fichier de taille inconnue.
Les structures Pour sont employées dans les situations où l’on doit procéder à un
traitement systématique sur les éléments d’un ensemble dont le programmeur connaît
d’avance la quantité.

6.18. Boucles dans des boucles

De même que les poupées russes contiennent d’autres poupées russes, de même qu’une
structure SI … ALORS peut contenir d’autres structures SI … ALORS, une boucle peut tout
à fait contenir d’autres boucles.

Variables Truc, Trac en Entier


Début
Pour Truc  1 à 15
Ecrire "Il est passé par ici"
Pour Trac  1 à 6
Ecrire "Il repassera par-là"
Trac Suivant
Truc Suivant
Fin

Dans cet exemple, le programme écrira une fois "il est passé par ici" puis six fois de suite
"il repassera par là", et ceci quinze fois en tout. A la fin, il y aura donc eu 15 x 6 = 90 passages
dans la deuxième boucle (celle du milieu), donc 90 écritures à l’écran du message « il
repassera par là ». Notez la différence marquante avec cette structure :

Variables Truc, Trac en Entier


Début
Pour Truc  1 à 15
Ecrire "Il est passé par ici"
Truc Suivant
Pour Trac  1 à 6
115

Ecrire "Il repassera par là"


Trac Suivant
Fin

Ici, il y aura quinze écritures consécutives de "il est passé par ici", puis six écritures
consécutives de "il repassera par là", et ce sera tout.
Des boucles peuvent donc être imbriquées (cas n°1) ou successives (cas n°2). Cependant,
elles ne peuvent jamais, au grand jamais, être croisées. Cela n’aurait aucun sens logique, et
de plus, bien peu de langages vous autoriseraient ne serait-ce qu’à écrire cette structure
aberrante.

Variables Truc, Trac en Entier


Pour Truc  …
instructions
Pour Trac  …
instructions
Truc Suivant
instructions
Trac Suivant

Pourquoi imbriquer des boucles ?


Pour la même raison qu’on imbrique des tests. La traduction en bon français d’un test, c’est
un « cas ». Un « cas » (par exemple, « est-ce un homme ou une femme ? ») peut très bien se
subdiviser en d’autres cas (« a-t-il plus ou moins de 18 ans ? »).
De même, une boucle, c’est un traitement systématique, un examen d’une série
d’éléments un par un (par exemple, « prenons tous les employés de l’entreprise un par un
»).
On peut imaginer que pour chaque élément ainsi considéré (pour chaque employé), on doit
procéder à un examen systématique d’autre chose (« prenons chacune des commandes
que cet employé a traitées »). Voilà un exemple typique de boucles imbriquées : on devra
programmer une boucle principale (celle qui prend les employés un par un) et à l’intérieur,
une boucle secondaire (celle qui prend les commandes de cet employé une par une).
Dans la pratique de la programmation, la maîtrise des boucles imbriquées est nécessaire,
même si elle n’est pas suffisante.

6.19. Choses à éviter

Examinons l’algorithme suivant :

Variable Truc en Entier


Début
Pour Truc  1 à 15
Truc  Truc * 2
Ecrire "Passage numéro : ", Truc
116

Truc Suivant
Fin

Vous remarquerez que nous faisons ici gérer « en double » la variable Truc, ces deux
gestions étant contradictoires. D’une part, la ligne
Pour…

Augmente la valeur de Truc de 1 à chaque passage. D’autre part la ligne

Truc ← Truc * 2

Double la valeur de Truc à chaque passage. Il va sans dire que de telles manipulations
perturbent complètement le déroulement normal de la boucle, et sont causes, sinon de
plantages, tout au moins d’exécutions erronées.

6.19.1. Exercices

Exercice 5.5
Ecrire un algorithme qui demande un nombre de départ, et qui calcule la somme des entiers
jusqu’à ce nombre. Par exemple, si l’on entre 5, le programme doit calculer :
1 + 2 + 3 + 4 + 5 = 15
NB : on souhaite afficher uniquement le résultat, pas la décomposition du calcul.

Exercice 5.6
Ecrire un algorithme qui demande un nombre de départ, et qui calcule sa factorielle.
NB : la factorielle de 8, notée 8 !, vaut
1x2x3x4x5x6x7x8

Exercice 5.7
Ecrire un algorithme qui demande successivement 20 nombres à l’utilisateur, et qui lui dise
ensuite quel était le plus grand parmi ces 20 nombres :
Entrez le nombre numéro 1 : 12
Entrez le nombre numéro 2 : 14
etc.
Entrez le nombre numéro 20 : 6
Le plus grand de ces nombres est : 14
Modifiez ensuite l’algorithme pour que le programme affiche de surcroît en quelle position
avait été saisie ce nombre :
C’était le nombre numéro 2

Exercice 5.8
Réécrire l’algorithme précédent, mais cette fois-ci on ne connaît pas d’avance combien
l’utilisateur souhaite saisir de nombres. La saisie des nombres s’arrête lorsque l’utilisateur
entre un zéro.

Exercice 5.9
117

Lire la suite des prix (en euros entiers et terminée par zéro) des achats d’un client. Calculer
la somme qu’il doit, lire la somme qu’il paye, et simuler la remise de la monnaie en affichant
les textes "10 Euros", "5 Euros" et "1 Euro" autant de fois qu’il y a de coupures de chaque
sorte à rendre.

Exercice 5.10
Écrire un algorithme qui permette de connaître ses chances de gagner au tiercé, quarté,
quinté et autres impôts volontaires.
On demande à l’utilisateur le nombre de chevaux partants, et le nombre de chevaux joués.
Les deux messages affichés devront être :
Dans l’ordre : une chance sur X de gagner
Dans le désordre : une chance sur Y de gagner
X et Y nous sont donnés par la formule suivante, si n est le nombre de chevaux partants et
p le nombre de chevaux joués (on rappelle que le signe ! signifie "factorielle", comme dans
l'exercice 5.6 ci-dessus) :
X = n ! / (n - p) !
Y = n ! / (p ! * (n – p) !)
NB : cet algorithme peut être écrit d’une manière simple, mais relativement peu
performante. Ses performances peuvent être singulièrement augmentées par une petite
astuce. Vous commencerez par écrire la manière la plus simple, puis vous identifierez le
problème, et écrirez une deuxième version permettant de le résoudre.

6.20. Tableaux

Les tableaux sont d’une grande utilité, Imaginons que dans un programme, nous ayons
besoin simultanément de 12 valeurs (par exemple, des notes pour calculer une moyenne).
Evidemment, la seule solution dont nous disposons à l’heure actuelle consiste à déclarer
douze variables, appelées par exemple Notea, Noteb, Notec, etc. Bien sûr, on peut opter
pour une notation un peu simplifiée, par exemple N1, N2, N3, etc. Mais cela ne change pas
fondamentalement notre problème, car arrivé au calcul, et après une succession de douze
instructions « Lire » distinctes, cela donnera obligatoirement une atrocité du genre :
Moy  (N1+N2+N3+N4+N5+N6+N7+N8+N9+N10+N11+N12)/12

C’est tout de même grandement laborieux. Et pour un peu que nous soyons dans un
programme de gestion avec quelques centaines ou quelques milliers de valeurs à traiter,
alors là c’est le suicide direct.
Cerise sur le gâteau, si en plus on est dans une situation on l’on ne peut pas savoir d’avance
combien il y aura de valeurs à traiter, là on est carrément cuits.
C’est pourquoi la programmation nous permet de rassembler toutes ces variables en une
seule, au sein de laquelle chaque valeur sera désignée par un numéro. En bon français, cela
donnerait donc quelque chose du genre « la note numéro 1 », « la note numéro 2 », « la note
numéro 8 ». C’est largement plus pratique, vous vous en doutez.
118

Un ensemble de valeurs portant le même nom de variable et repérées par un nombre,


s’appelle un tableau, ou encore une variable indicée.
Le nombre qui, au sein d’un tableau, sert à repérer chaque valeur s’appelle l’indice.
Chaque fois que l’on doit désigner un élément du tableau, on fait figurer le nom du tableau,
suivi de l’indice de l’élément, entre parenthèses.

6.20.1. Annotation et utilisation algorithmique

Dans notre exemple, nous créerons donc un tableau appelé Note. Chaque note individuelle
(chaque élément du tableau Note) sera donc désignée Note(0), Note(1), etc. Eh oui,
attention, les indices des tableaux commencent généralement à 0, et non à 1.
Un tableau doit être déclaré comme tel, en précisant le nombre et le type de valeurs qu’il
contiendra (la déclaration des tableaux est susceptible de varier d'un langage à l'autre.
Certains langages réclament le nombre d'éléments, d'autre le plus grand indice... C'est
donc une affaire de conventions).
En nous calquant sur les choix les plus fréquents dans les langages de programmations,
nous déciderons ici arbitrairement et une bonne fois pour toutes que :
• les "cases" sont numérotées à partir de zéro, autrement dit que le plus petit indice
est zéro.
• lors de la déclaration d'un tableau, on précise la plus grande valeur de l'indice
(différente, donc, du nombre de cases du tableau, puisque si on veut 12 emplacements, le
plus grand indice sera 11). Au début, ça déroute, mais vous verrez, avec le temps, on se fait
à tout, même au pire.

Tableau Note(11) en Entier

On peut créer des tableaux contenant des variables de tous types : tableaux de
numériques, bien sûr, mais aussi tableaux de caractères, tableaux de booléens, tableaux
de tout ce qui existe dans un langage donné comme type de variables.
Par contre, hormis dans quelques rares langages, on ne peut pas faire un mixage de types
différents de valeurs au sein d’un même tableau.
L’énorme avantage des tableaux, c’est qu’on va pouvoir les traiter en faisant des boucles.
Par exemple, pour effectuer notre calcul de moyenne, cela donnera par exemple :

Tableau Note(11) en Numérique


Variables Moy, Som en Numérique
Début
Pour i  0 à 11
Ecrire "Entrez la note n°", i
Lire Note(i)
i Suivant
Som  0
Pour i ← 0 à 11
Som  Som + Note(i)
119

i Suivant
Moy  Som / 12
Fin

NB : On a fait deux boucles successives pour plus de lisibilité, mais on aurait tout aussi bien
pu n’en écrire qu’une seule dans laquelle on aurait tout fait d’un seul coup.

Remarque générale : l’indice qui sert à désigner les éléments d’un tableau peut être exprimé
directement comme un nombre en clair, mais il peut être aussi une variable, ou une
expression calculée.
Dans un tableau, la valeur d’un indice doit toujours :
• être égale au moins à 0 (dans quelques rares langages, le premier élément d’un
tableau porte l’indice 1). Mais comme je l'ai déjà écrit plus haut, nous avons choisi ici de
commencer la numérotation des indices à zéro, comme c’est le cas en langage C et en Visual
Basic. Donc attention, Truc(6) est le septième élément du tableau Truc !
• être un nombre entier Quel que soit le langage, l’élément Truc(3,1416) n’existe
jamais.
• être inférieure ou égale au nombre d’éléments du tableau (moins 1, si l’on
commence la numérotation à zéro). Si le tableau Bidule a été déclaré comme ayant 25
éléments, la présence dans une ligne, sous une forme ou sous une autre, de Bidule(32)
déclenchera automatiquement une erreur.
Si l’on est dans un langage où les indices commencent à zéro, il faut en tenir compte à la
déclaration :
Tableau Note(13) en Numérique

...créera un tableau de 14 éléments, le plus petit indice étant 0 et le plus grand 13.

6.20.2. Exercices

Exercice 6.1
Ecrire un algorithme qui déclare et remplisse un tableau de 7 valeurs numériques en les
mettant toutes à zéro.

Exercice 6.2
Ecrire un algorithme qui déclare et remplisse un tableau contenant les six voyelles de
l’alphabet latin.

Exercice 6.3
Ecrire un algorithme qui déclare un tableau de 9 notes, dont on fait ensuite saisir les valeurs
par l’utilisateur.

Exercice 6.4
Que produit l’algorithme suivant ?
Tableau Nb(5) en Entier
Variable i en Entier
120

Début
Pour i  0 à 5
Nb(i)  i * i
i suivant
Pour i  0 à 5
Ecrire Nb(i)
i suivant
Fin

Peut-on simplifier cet algorithme avec le même résultat ?

Exercice 6.5
Que produit l’algorithme suivant ?
Tableau N(6) en Entier
Variables i, k en Entier
Début
N(0)  1
Pour k  1 à 6
N(k)  N(k-1) + 2
k Suivant
Pour i  0 à 6
Ecrire N(i)
i suivant
Fin

Peut-on simplifier cet algorithme avec le même résultat ?

Exercice 6.6
Que produit l’algorithme suivant ?
Tableau Suite(7) en Entier
Variable i en Entier
Début
Suite(0)  1
Suite(1)  1
Pour i  2 à 7
Suite(i)  Suite(i-1) + Suite(i-2)
i suivant
Pour i  0 à 7
Ecrire Suite(i)
i suivant
Fin

Exercice 6.7
Ecrivez la fin de l’algorithme 6.3 afin que le calcul de la moyenne des notes soit effectué et
affiché à l’écran.
121

6.20.3. Tableaux dynamiques

Il arrive fréquemment que l’on ne connaisse pas à l’avance le nombre d’éléments que devra
comporter un tableau. Bien sûr, une solution consisterait à déclarer un tableau gigantesque
(10 000 éléments, pourquoi pas, au diable les varices) pour être sûr que « ça rentre ». Mais
d’une part, on n’en sera jamais parfaitement sûr, d’autre part, en raison de l’immensité de
la place mémoire réservée – et la plupart du temps non utilisée, c’est un gâchis
préjudiciable à la rapidité, voire à la viabilité, de notre algorithme.
Aussi, pour parer à ce genre de situation, a-t-on la possibilité de déclarer le tableau sans
préciser au départ son nombre d’éléments. Ce n’est que dans un second temps, au cours
du programme, que l’on va fixer ce nombre via une instruction de redimensionnement :
Redim.
Notez que tant qu’on n’a pas précisé le nombre d’éléments d’un tableau, d’une manière
ou d’une autre, ce tableau est inutilisable.
Exemple : on veut faire saisir des notes pour un calcul de moyenne, mais on ne sait pas
combien il y aura de notes à saisir. Le début de l’algorithme sera quelque chose du genre :

Tableau Notes() en Numérique


Variable nb en Numérique
Début
Ecrire "Combien y a-t-il de notes à saisir ?"
Lire nb
Redim Notes(nb-1)

Cette technique n’a rien de sorcier, mais elle fait partie de l’arsenal de base de la
programmation en gestion.

6.20.3.1. Exercices

Exercice 6.8

Ecrivez un algorithme permettant à l’utilisateur de saisir un nombre quelconque de valeurs,


qui devront être stockées dans un tableau. L’utilisateur doit donc commencer par entrer le
nombre de valeurs qu’il compte saisir. Il effectuera ensuite cette saisie. Enfin, une fois la
saisie terminée, le programme affichera le nombre de valeurs négatives et le nombre de
valeurs positives.

Exercice 6.9
Ecrivez un algorithme calculant la somme des valeurs d’un tableau (on suppose que le
tableau a été préalablement saisi).

Exercice 6.10
122

Ecrivez un algorithme constituant un tableau, à partir de deux tableaux de même longueur


préalablement saisis. Le nouveau tableau sera la somme des éléments des deux tableaux
de départ.
Tableau 1 :
4 8 7 9 1 5 4 6
Tableau 2 :
7 6 5 2 1 3 7 4
Tableau à constituer :
11 14 12 11 2 8 11 10

Exercice 6.11
Toujours à partir de deux tableaux précédemment saisis, écrivez un algorithme qui calcule
le schtroumpf des deux tableaux. Pour calculer le schtroumpf, il faut multiplier chaque
élément du tableau 1 par chaque élément du tableau 2, et additionner le tout. Par exemple
si l'on a :
Tableau 1 :
4 8 7 12
Tableau 2 :
3 6

Le résultat sera :
3 * 4 + 3 * 8 + 3 * 7 + 3 * 12 + 6 * 4 + 6 * 8 + 6 * 7 + 6 * 12 = 279

Exercice 6.12
Ecrivez un algorithme qui permette la saisie d’un nombre quelconque de valeurs, sur le
principe de l’ex 6.8. Toutes les valeurs doivent être ensuite augmentées de 1, et le nouveau
tableau sera affiché à l’écran.

Exercice 6.13
Ecrivez un algorithme permettant, toujours sur le même principe, à l’utilisateur de saisir un
nombre déterminé de valeurs. Le programme, une fois la saisie terminée, renvoie la plus
grande valeur en précisant quelle position elle occupe dans le tableau. On prendra soin
d’effectuer la saisie dans un premier temps, et la recherche de la plus grande valeur du
tableau dans un second temps.

Exercice 6.14
Toujours et encore sur le même principe, écrivez un algorithme permettant, à l’utilisateur
de saisir les notes d'une classe. Le programme, une fois la saisie terminée, renvoie le
nombre de ces notes supérieures à la moyenne de la classe.
123

6.21. Fichiers

Jusqu’à présent, les informations utilisées dans nos programmes ne pouvaient provenir
que de deux sources : soit elles étaient inclues dans l’algorithme lui-même, par le
programmeur, soit elles étaient entrées en cours de route par l’utilisateur. Mais
évidemment, cela ne suffit pas à combler les besoins réels des informaticiens.
Imaginons que l’on veuille écrire un programme gérant un carnet d’adresses. D’une
exécution du programme à l’autre, l’utilisateur doit pouvoir retrouver son carnet à jour,
avec les modifications qu’il y a apportées la dernière fois qu’il a exécuté le programme. Les
données du carnet d’adresse ne peuvent donc être inclues dans l’algorithme, et encore
moins être entrées au clavier à chaque nouvelle exécution.
Les fichiers sont là pour combler ce manque. Ils servent à stocker des informations de
manière permanente, entre deux exécutions d’un programme. Car si les variables, qui sont
des adresses de mémoire vive, disparaissent à chaque fin d’exécution, les fichiers, eux sont
stockés sur des périphériques à mémoire de masse (disquette, disque dur, CD Rom…).

Les fichiers sont enregistrés sous des lignes successives qui s’appelent enregistrement s
Un fichier ainsi codé sous forme d'enregistrements est appelé un fichier texte.
En fait, entre chaque enregistrement, sont stockés les octets correspondants aux
caractères CR (code Ascii 13) et LF (code Ascii 10), signifiant un retour au début de la ligne
suivante. Le plus souvent, le langage de programmation, dès lors qu'il s'agit d'un fichier
texte, gèrera lui-même la lecture et l'écriture de ces deux caractères à chaque fin de ligne :
c'est autant de moins dont le programmeur aura à s'occuper. Le programmeur, lui, n'aura
qu'à dire à la machine de lire une ligne, ou d'en écrire une.

Ce type de fichier est couramment utilisé dès lors que l'on doit stocker des informations
pouvant être assimilées à une base de données.

Le second type de fichier, se définit a contrario : il rassemble les fichiers qui ne possèdent
pas de structure de lignes (d'enregistrement). Les octets, quels qu'ils soient, sont écrits à
la queue leu leu. Ces fichiers sont appelés des fichiers binaires. Naturellement, leur
structure différente implique un traitement différent par le programmeur. Tous les fichiers
qui ne codent pas une base de données sont obligatoirement des fichiers binaires : cela
concerne par exemple un fichier son, une image, un programme exécutable, etc. . Il est
toujours possible d'opter pour une structure binaire même dans le cas où le fichier
représente une base de données.
Autre différence majeure entre fichiers texte et fichiers binaires : dans un fichier texte,
toutes les données sont écrites sous forme de... texte. Cela veut dire que les nombres y
sont représentés sous forme de suite de chiffres (des chaînes de caractères). Ces nombres
doivent donc être convertis en chaînes lors de l'écriture dans le fichier. Inversement, lors
de la lecture du fichier, on devra convertir ces chaînes en nombre si l'on veut pouvoir les
utiliser dans des calculs. En revanche, dans les fichiers binaires, les données sont écrites à
124

l'image exacte de leur codage en mémoire vive, ce qui épargne toutes ces opérations de
conversion.

Ceci a comme autre implication qu'un fichier texte est directement lisible, alors qu'un
fichier binaire ne l'est pas (sauf bien sûr en écrivant soi-même un programme approprié).
Si l'on ouvre un fichier texte via un éditeur de textes, comme le bloc-notes de Windows, on
y reconnaîtra toutes les informations (ce sont des caractères, stockés comme tels). La
même chose avec un fichier binaire ne nous produit à l'écran qu'une suite des symboles
incompréhensibles.

NB : La notion des fichiers sera approfondie dans la suite de ce cours, soit en initiation à
l’algorithmique 2.

6.22. Procédures et fonctions


6.22.1. Fonctions personnalisées

Une application, surtout si elle est longue, a toutes les chances de devoir procéder aux
mêmes traitements, ou à des traitements similaires, à plusieurs endroits de son
déroulement.
Par exemple, la saisie d’une réponse par oui ou par non (et le contrôle qu’elle implique),
peuvent être répétés dix fois à des moments différents de la même application, pour dix
questions différentes.
La manière la plus évidente, mais aussi la moins habile, de programmer ce genre de choses,
c'est bien entendu de répéter le code correspondant autant de fois que nécessaire.
Apparemment, on ne se casse pas la tête : quand il faut que la machine interroge
l'utilisateur, on recopie les lignes de codes voulues en ne changeant que le nécessaire, et
roule Raoul. Mais en procédant de cette manière, la pire qui soit, on se prépare des
lendemains qui déchantent...
D'abord, parce que si la structure d'un programme écrit de cette manière peut paraître
simple, elle est en réalité inutilement lourdingue. Elle contient des répétitions, et pour peu
que le programme soit énorme, il peut devenir parfaitement illisible. Or, le fait d'être
facilement modifiable donc lisible, y compris - et surtout - par ceux qui ne l'ont pas écrit est
un critère essentiel pour un programme informatique. Dès que l'on programme non pour
soi-même, mais dans le cadre d'une organisation (entreprise ou autre), cette nécessité se
fait sentir de manière aiguë. L'ignorer, c'est donc forcément grave.
En plus, à un autre niveau, une telle structure pose des problèmes considérables de
maintenance : car en cas de modification du code, il va falloir traquer toutes les apparitions
plus ou moins identiques de ce code pour faire convenablement la modification. Et si l'on
en oublie une, on a laissé un bug.
Il faut donc opter pour une autre stratégie, qui consiste à séparer ce traitement du corps
du programme et à regrouper les instructions qui le composent en un module séparé. Il ne
restera alors plus qu'à appeler ce groupe d'instructions (qui n'existe donc désormais qu’en
un exemplaire unique) à chaque fois qu’on en a besoin. Ainsi, la lisibilité est assurée ; le
125

programme devient modulaire, et il suffit de faire une seule modification au bon endroit,
pour que cette modification prenne effet dans la totalité de l’application.

Le corps du programme s’appelle alors la procédure principale, et ces groupes


d’instructions auxquels on a recours s’appellent des fonctions et des sous-procédures
(nous verrons un peu plus loin la différence entre ces deux termes).
Reprenons un exemple de question à laquelle l’utilisateur doit répondre par oui ou par non.
Mauvaise Structure :

...
Ecrire "Etes-vous marié ?"
Rep1  ""
TantQue Rep1 <> "Oui" et Rep1 <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep1
FinTantQue
...
Ecrire "Avez-vous des enfants ?"
Rep2  ""
TantQue Rep2 <> "Oui" et Rep2 <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep2
FinTantQue
...

On le voit bien, il y a là une répétition quasi identique du traitement à accomplir. A chaque


fois, on demande une réponse par Oui ou Non, avec contrôle de saisie. La seule chose qui
change, c'est l'intitulé de la question, et le nom de la variable dans laquelle on range la
réponse. Alors, il doit bien y avoir un truc.
La solution, on vient de le voir, consiste à isoler les instructions demandant une réponse
par Oui ou Non, et à appeler ces instructions à chaque fois que nécessaire. Ainsi, on évite
les répétitions inutiles, et on a découpé notre problème en petits morceaux autonomes.
Nous allons donc créer une fonction dont le rôle sera de renvoyer la réponse (oui ou non)
de l'utilisateur. Ce mot de "fonction", en l'occurrence, ne doit pas nous surprendre : nous
savons qu’il y a des fonctions fournies avec le langage, le but d'une fonction était de
renvoyer une valeur. Nous allons créer notre propre fonction, que nous appellerons
RepOuiNon :

Fonction RepOuiNon() en caractère


Truc  ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
126

Renvoyer Truc
Fin

On remarque au passage l’apparition d’un nouveau mot-clé : Renvoyer, qui indique quelle
valeur doit prendre la fonction lorsqu'elle est utilisée par le programme. Cette valeur
renvoyée par la fonction (ici, la valeur de la variable Truc) est en quelque sorte contenue
dans le nom de la fonction lui-même, exactement comme c’était le cas dans les fonctions
prédéfinies.
Une fonction s'écrit toujours en-dehors de la procédure principale. Selon les langages, cela
peut prendre différentes formes. Mais ce qu'il faut comprendre, c'est que ces quelques
lignes de codes sont en quelque sorte des satellites, qui existent en dehors du traitement
lui-même. Simplement, elles sont à sa disposition, et il pourra y faire appel chaque fois que
nécessaire. Si l'on reprend notre exemple, une fois notre fonction RepOuiNon écrite, le
programme principal comprendra les lignes :

Bonne structure :

...
Ecrire "Etes-vous marié ?"
Rep1  RepOuiNon()
...
Ecrire "Avez-vous des enfants ?"
Rep2  RepOuiNon()
...

On a ainsi évité les répétitions inutiles, et si d'aventure, il y avait un bug dans notre contrôle
de saisie, il suffirait de faire une seule correction dans la fonction RepOuiNon pour que ce
bug soit éliminé de toute l'application.
Toutefois, les plus sagaces d'entre vous auront remarqué, tant dans le titre de la fonction
que dans chacun des appels, la présence de parenthèses. Celles-ci, dès qu'on déclare ou
qu'on appelle une fonction, sont obligatoires. Et si vous avez bien compris tout ce qui
précède, vous devez avoir une petite idée de ce qu'on va pouvoir mettre dedans...

6.22.2. Passage d’arguments

Reprenons l’exemple qui précède et analysons-le. On écrit un message à l'écran, puis on


appelle la fonction RepOuiNon pour poser une question ; puis, un peu plus loin, on écrit un
autre message à l'écran, et on appelle de nouveau la fonction pour poser la même question,
etc. C’est une démarche acceptable, mais qui peut encore être améliorée : puisque avant
chaque question, on doit écrire un message, autant que cette écriture du message figure
directement dans la fonction appelée. Cela implique deux choses :
• lorsqu’on appelle la fonction, on doit lui préciser quel message elle doit afficher
avant de lire la réponse
127

• la fonction doit être « prévenue » qu’elle recevra un message, et être capable de le


récupérer pour l’afficher.
En langage algorithmique, on dira que le message devient un argument (ou un paramètre)
de la fonction. Cela n'est certes pas une découverte pour vous : nous avons longuement
utilisé les arguments à propos des fonctions prédéfinies.
La fonction sera dorénavant déclarée comme suit :

Fonction RepOuiNon(Msg en Caractère) en Caractère


Ecrire Msg
Truc  ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Renvoyer Truc
Fin Fonction

Il y a donc maintenant entre les parenthèses une variable, Msg, dont on précise le type, et
qui signale à la fonction qu’un argument doit lui être envoyé à chaque appel. Quant à ces
appels, justement, ils se simplifieront encore dans la procédure principale, pour devenir :
...
Rep1 ← RepOuiNon("Etes-vous marié ?")
...
Rep2 ← RepOuiNon("Avez-vous des enfants ?")
...

6.22.3. Sous procédures

Problème, une fonction ne peut renvoyer qu'une seule valeur à la fois.


Alors, pour renvoyer plusieurs valeurs, faute de pouvoir traiter l'affaire par une fonction,
devra-t-on en rester au code répétitif dont nous avons de dénoncé si vigoureusement les
faiblesses. Heureusement, tout est prévu, il y a une solution. Et celle-ci consiste à utiliser
des sous-procédures.

En fait, les fonctions - que nous avons vues - ne sont finalement qu'un cas particulier des
sous-procédures - que nous allons voir : celui où doit être renvoyé vers la procédure
appelant une valeur et une seule. Dans tous les autres cas (celui où on ne renvoie aucune
valeur, comme celui ou en en renvoie plusieurs), il faut donc avoir recours non à la forme
particulière et simplifiée (la fonction), mais à la forme générale (la sous-procédure). Le
rapport entre fonctions et sous-procédures est donc semblable à celui qui existe entre les
boucles Pour et les boucles TantQue : les premières sont un cas particulier des secondes,
pour lequel les langages proposent une écriture plus directe.

Parlons donc de ce qui est commun aux sous-procédures et aux fonctions, mais aussi de ce
qui les différencie. Voici comment se présente une sous-procédure :
128

Procédure Bidule( ... )


...
Fin Procédure

Dans la procédure principale, l’appel à la sous-procédure Bidule devient quant à lui :


Appeler Bidule(...)

Établissons un premier état des lieux.


• Alors qu'une fonction se caractérisait par les mots-clés Fonction ... Fin Fonction, une
sous-procédure est identifiée par les mots-clés Procédure ... Fin Procédure
• Lorsqu'une fonction était appelée, sa valeur (retournée) était toujours affectée à
une variable (ou intégrée dans le calcul d'une expression). L'appel à une procédure, lui, est
au contraire toujours une instruction autonome. « Exécute la procédure Bidule » est un
ordre qui se suffit à lui-même.
• Toute fonction devait, pour cette raison, comporter l'instruction « Renvoyer ». Pour
la même raison, l'instruction « Renvoyer » n'est jamais utilisée dans une sous-procédure.
La fonction est une valeur calculée, qui renvoie son résultat vers la procédure principale.
La sous-procédure, elle, est un traitement ; elle ne « vaut » rien.
• Même une fois qu'on a bien compris les trois premiers points, on n'est pas
complètement au bout de nos peines.

Reprenons l'exemple que nous avons déjà utilisé plus haut, celui de notre fonction
RepOuiNon. Comme nous l'avons vu, rien ne nous empêche de réécrire cette fonction sous
la forme d'une procédure (puisqu'une fonction n'est qu'un cas particulier de sous-
procédure). Nous laisserons pour l’instant de côté la question de savoir comment renvoyer
la réponse (contenue dans la variable Truc) vers le programme principal. En revanche, nous
allons déclarer que Msg est un paramètre dont la transmission doit se faire par valeur. Cela
donnera la chose suivante :

Procédure RepOuiNon(Msg en Caractère par valeur)


Ecrire Msg
Truc ← ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
??? Comment transmettre Truc à la procédure appelante ???
Fin Procédure

Quant à l'appel à cette sous-procédure, il pourra prendre par exemple cette forme :

M  "Etes-vous marié ?"


Appeler RepOuiNon(M)

Une conséquence essentielle de tout cela est que si d'aventure la sous-procédure


RepOuiNon contenait une instruction qui modifiait le contenu de la variable Msg, cela
129

n'aurait aucune espèce de répercussion sur la procédure principale en général, et sur la


variable M en particulier. La sous-procédure ne travaillant que sur une copie de la variable
qui a été fournie par le programme principal, elle est incapable, même si on le souhaitait,
de modifier la valeur de celle-ci. Dit d'une autre manière, dans une procédure, un paramètre
passé par valeur ne peut être qu'un paramètre en entrée.
C'est certes une limite, mais c'est d'abord et avant tout une sécurité : quand on transmet
un paramètre par valeur, on est sûr et certain que même en cas de bug dans la sous-
procédure, la valeur de la variable transmise ne sera jamais modifiée par erreur (c'est-à-dire
écrasée) dans le programme principal.
Admettons à présent que nous déclarions un second paramètre, Truc, en précisant cette
fois qu'il sera transmis par référence. Et adoptons pour la procédure l'écriture suivante :

Procédure RepOuiNon(Msg en Caractère par valeur, Truc en Caractère par référence)


Ecrire Msg
Truc  ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Fin Fonction
L'appel à la sous-procédure deviendrait par exemple :

M  "Etes-vous marié ?"


Appeler RepOuiNon(M, T)
Ecrire "Votre réponse est ", T

6.23. Notions complémentaires


6.23.1. Programmation structurée

Dans certains langages (historiquement, ce sont souvent des langages anciens), les lignes
de programmation portent des numéros. Et les lignes sont exécutées par la machine dans
l’ordre de ces numéros. Jusqu’ici, en soi, pas de problème. Mais l’astuce est que tous ces
langages, il existe une instruction de branchement, notée aller à en pseudo-code,
instruction qui envoie directement le programme à la ligne spécifiée. Inversement, ce type
de langage ne comporte pas d’instructions comme FinTantQue, ou FinSi, qui « ferment »
un bloc.
Prenons l’exemple d’une structure « Si … Alors … Sinon »
Programmation Structurée
Si condition Alors
instructions 1
Sinon
instructions 2
FinSi

Programmation non structurée


130

1000 Si condition Alors Aller En 1200


1100 instruction 1
1110 etc.
1120 etc.
1190 Aller en 1400
1200 instruction 2
1210 etc.
1220 etc.
1400 suite de l’algorithme

Un programme écrit dans ce type de langages se présente comme une suite de


branchements emmêlés les uns dans les autres. D’une part, on ne peut pas dire que cela
favorise la lisibilité du programme. D’autre part, c’est une source importante d’erreurs, car
tôt ou tard on oublie un « aller à », ou on met un de trop, etc. A fortiori lorsqu’on complique
un algorithme existant, cela peut devenir une jungle inextricable.
A l’inverse, la programmation structurée, surtout si l’on prend soin de rationaliser la
présentation en mettant des lignes de commentaires et en pratiquant l’indentation, évite
des erreurs, et révèle sa structure logique de manière très claire.
Le danger est que si la plupart des langages de programmation utilisés sont structurés, ils
offrent tout de même la plupart du temps la possibilité de pratiquer la programmation non
structurée. Dans ce cas, les lignes ne sont pas désignées par des numéros, mais certaines
peuvent être repérées par des noms (dits « étiquettes ») et on dispose d’une instruction de
branchement.
Une règle d’hygiène absolue est de programmer systématiquement de manière structurée,
sauf impératif contraire fixé par le langage (ce qui est aujourd'hui de plus en plus rare).
Autrement dit, même quand un langage vous offre une possibilité de faire des entorses à
la programmation structurée, il ne faut s’en saisir sous aucun prétexte.

6.23.2. Interprétation et compilation

Avec ce paragraphe, on sort un peu de l’algorithmique proprement dite pour entrer dans
le domaine plus technique de la réalisation pratique. Ou, si l’on préfère, ces dernières lignes
sont l’apothéose, le bouquet final, l’extase ultime, la consécration grandiose, de ce cours.
Jusqu’ici, nous avons travaillé sur la première étape de la réalisation d’un programme : la
rédaction de l'algorithme.

En fait, si l’algorithme est bien écrit, sans faute logique, l’étape suivante ne doit
normalement poser aucun problème conceptuel. Il n'y a plus qu'à effectuer une simple
traduction.
131

A partir de là, le travail du programmeur est virtuellement terminé (en réalité, il reste tout
de même une inévitable phase de tests, de corrections, etc., qui s'avère souvent très
longue). Mais en tout cas, pour l’ordinateur, c’est là que les ennuis commencent. En effet,
aucun ordinateur n’est en soi apte à exécuter les instructions telles qu’elles sont rédigées
dans tel ou tel langage ; l’ordinateur, lui, ne comprend qu’un seul langage, qui est un
langage codé en binaire (à la rigueur en hexadécimal) et qui s’appelle le langage machine
(ou assembleur).

C’est à cela que sert un langage : à vous épargner la programmation en binaire et vous
permettre de vous faire comprendre de l’ordinateur d’une manière (relativement) lisible.
C’est pourquoi tout langage, à partir d’un programme écrit, doit obligatoirement procéder
à une traduction en langage machine pour que ce programme soit exécutable.
Il existe deux stratégies de traduction, ces deux stratégies étant parfois disponibles au sein
du même langage.
• le langage traduit les instructions au fur et à mesure qu’elles se présentent. Cela
s’appelle la compilation à la volée, ou l’interprétation.
• le langage commence par traduire l’ensemble du programme en langage machine,
constituant ainsi un deuxième programme (un deuxième fichier) distinct physiquement et
logiquement du premier. Ensuite, et ensuite seulement, il exécute ce second programme.
Cela s’appelle la compilation
Il va de soi qu’un langage interprété est plus maniable : on peut exécuter directement son
code - et donc le tester - au fur et à mesure qu’on le tape, sans passer à chaque fois par
l’étape supplémentaire de la compilation. Mais il va aussi de soi qu’un programme compilé
s’exécute beaucoup plus rapidement qu’un programme interprété : le gain est
couramment d’un facteur 10, voire 20 ou plus.
Toute application destinée à un usage professionnel (ou même, tout simplement sérieux)
est forcément une application compilée.

6.23.3. Programmation récursive

La programmation des fonctions personnalisées a donné lieu à l'essor d’une logique un peu
particulière, adaptée en particulier au traitement de certains problèmes mathématiques
(ou de jeux) : la programmation récursive. Pour vous expliquer de quoi il retourne, nous
allons reprendre un exemple cher à vos cœurs : le calcul d’une factorielle.
Rappelez-vous : la formule de calcul de la factorielle d’un nombre n s’écrit :
N!=1x2x3x…xn
132

Nous avions programmé cela aussi sec avec une boucle Pour.. Mais une autre manière de
voir les choses, ni plus juste, ni moins juste, serait de dire que quel que soit le nombre n :
n ! = n x (n-1) !
En bon français : la factorielle d’un nombre, c’est ce nombre multiplié par la factorielle du
nombre précédent. Encore une fois, c’est une manière ni plus juste ni moins juste de
présenter les choses ; c’est simplement une manière différente.
Si l’on doit programmer cela, on peut alors imaginer une fonction Fact, chargée de calculer
la factorielle. Cette fonction effectue la multiplication du nombre passé en argument par la
factorielle du nombre précédent. Et cette factorielle du nombre précédent va bien entendu
être elle-même calculée par la fonction Fact.
Autrement dit, on va créer une fonction qui pour fournir son résultat, va s’appeler elle-
même un certain nombre de fois. C’est cela, la récursivité.

Toutefois, il nous manque une chose pour finir : quand ces auto-appels de la fonction Fact
vont-ils s’arrêter ? Cela n’aura-t-il donc jamais de fin ? On s’arrête quand on arrive au nombre
1, pour lequel la factorielle est par définition 1.
Cela produit l’écriture suivante, un peu déconcertante certes, mais parfois très pratique :
Fonction Fact (N en Numérique)
Si N = 0 alors
Renvoyer 1
Sinon
Renvoyer Fact(N-1) * N
Finsi
Fin Fonction

Vous remarquerez que le processus récursif remplace en quelque sorte la boucle, c’est-à-
dire un processus itératif. Vous remarquerez aussi qu’on traite le problème à l’envers : on
part du nombre, et on remonte à rebours jusqu’à 1 pour pouvoir calculer la factorielle.
Cet effet de rebours est caractéristique de la programmation récursive.
Pour conclure sur la récursivité, trois remarques fondamentales.
• la programmation récursive, pour traiter certains problèmes, est très économique
pour le programmeur ; elle permet de faire les choses correctement, en très peu
d'instructions.
• en revanche, elle est très dispendieuse de ressources machine. Car à l’exécution, la
machine va être obligée de créer autant de variables temporaires que de « tours » de
fonction en attente.
• Last but not least, et c’est le gag final, tout problème formulé en termes récursifs
peut également être formulé en termes itératifs. Donc, si la programmation récursive peut
faciliter la vie du programmeur, elle n’est jamais indispensable.
133

TROISIEME PARTIE : BREVE HISTOIRE DE LA PROGRAMMATION

CHAP 7 : Programmation en ligne de temps

7.1. Concepts fondamentaux


7.1.1. Déployer
Ensemble de valeurs de données du même type, stockées dans une séquence dans un
programme informatique. Aussi connu sous le nom de liste.

7.1.2. Langage d'assemblage


Un langage de programmation de bas niveau étroitement lié au langage machine. Aussi
appelé code assembleur.

7.1.3. Compilation
Le processus de traduction du code source en code objet en une seule fois. Le
programme peut alors être exécuté dans son ensemble.

7.1.4. Condition
En informatique, il s'agit d'une affirmation qui est vraie ou fausse. Un calcul dépend du
fait qu'une condition est vraie ou fausse.

7.1.5. Constant
Une valeur dans la programmation informatique qui ne change pas lorsque le programme
est en cours d'exécution.

7.1.6. CPU/processeur
Unité centrale de traitement - le cerveau de l'ordinateur qui traite les instructions du
programme.

7.1.7. Type de données


En programmation informatique, les données sont divisées et organisées selon le type,
par exemple les nombres, les caractères et les booléens.

7.1.8. Déboguer
Le processus de recherche et de correction des erreurs de programmation.

7.1.9. Déclaration
Processus d'attribution d'un nom et d'un type de données à une variable.

7.1.10. Éditeur
Un programme qui permet l'écriture et la modification de code.

7.1.11. Exécutable
Un fichier qui, lorsqu'il est exécuté, démarre un programme.

7.1.12. Langage de haut niveau


134

Aussi connu sous le nom de langage de haut niveau. Il s'agit d'un langage de
programmation informatique utilisé pour écrire des programmes. Les langages de haut
niveau doivent être traduits en code machine via un compilateur, un interpréteur ou un
assembleur.

7.1.13. Identifiant
Nom donné à une partie d'un programme, telle qu'une variable, une constante, une
fonction, une procédure ou un module.

7.1.14. Instruction
Une action unique qui peut être effectuée par un processeur informatique.

7.1.15. Environnement de développement intégré (IDE)


Une suite d'outils qui aide un programmeur à écrire un code maintenable et sans erreur.

7.1.16. Bibliothèque
En informatique, ensemble de fonctions stockées dans un fichier séparé.

7.1.17. Erreur de logique


Erreur dans un programme qui ne provoque pas le plantage d'un programme mais
provoque des résultats inattendus.

7.1.18. Langage machine


Également appelé code objet, il s'agit d'un code de bas niveau qui représente la manière
dont le matériel informatique et les processeurs comprennent les instructions. Il est
représenté par des nombres binaires ou hexadécimaux.

7.1.19. Code maintenable


Code de programmation facile à comprendre et à modifier.

7.1.20. Code objet


Code compréhensible par un processeur.

7.1.21. Optimiser
Rendre un programme plus efficace. Un programme peut être optimisé pour s'exécuter
plus rapidement ou pour occuper moins de mémoire.

7.1.22. Langage de programmation


Langage utilisé par un programmeur pour écrire un logiciel.

7.1.23. Durée
Période d'exécution ou d'exécution d'un programme informatique.

7.1.24. Erreur d'exécution


Erreur qui se produit lors de l'exécution d'un programme.
135

7.1.25. Logiciel
Programmes, applications et données d'un système informatique. Toutes les parties d'un
système informatique qui ne sont pas physiques.

7.1.26. Code source


Le code derrière un programme informatique, écrit dans un langage de programmation.

7.1.27. Chaîne de caractères


Séquence de caractères souvent stockée sous forme de variable dans un programme
informatique. Ces caractères peuvent inclure des chiffres, des lettres et des symboles.

7.1.28. Syntaxe
Règles régissant la rédaction d'instructions dans un langage de programmation.

7.1.29. Erreur de syntaxe


Erreur dans un programme résultant d'un code ne respectant pas les règles de syntaxe
régissant la manière d'écrire des instructions dans un langage de programmation.

7.1.30. Traducteur
Les traducteurs de programme convertissent le code de programme en code machine à
exécuter par le CPU. Il existe trois types de traducteur : interpréteur, compilateur et
assembleur.

7.1.31. Variable
Un emplacement de mémoire dans un programme informatique où les valeurs sont
stockées.

7.1.32. Mémoire virtuelle


Une section d'un lecteur de stockage informatique qui est temporairement utilisée
comme RAM.

7.2. Jalons de la programmation informatique


La première machine programmable (c’est-à-dire
machine dont les possibilités changent quand on
modifie son "programme") est probablement le métier
à tisser de Jacquard, qui a été réalisé en 1801. La
machine utilisait une suite de cartons perforés. Les
trous indiquaient le motif que le métier suivait pour
réaliser un tissage ; avec des cartes différentes le
métier produisait des tissages différents. Cette
innovation a été ensuite améliorée par Herman Hollerith d'IBM pour le développement de
la fameuse carte perforée d'IBM.

En 1936, la publication de l'article fondateur de la science informatique On Computable


Numbers with an Application to the Entscheidungs problem par Alan Mathison turing allait
136

donner le coup d'envoi à la création de l'ordinateur programmable. Il y présente sa machine


de Turing, le premier calculateur universel programmable, et invente les concepts et les
termes de programmation et de programme.

Les premiers programmes d'ordinateurs étaient réalisés avec un fer à souder et un grand
nombre de tubes à vide (plus tard, des transistors). Les programmes devenant plus
complexes, cela est devenu presque impossible, parce qu'une seule erreur rendait le
programme entier inutilisable. Avec les progrès des supports de données, il devient
possible de charger le programme à partir de cartes perforées, contenant la liste des
instructions en code binaire spécifique à un type d'ordinateur particulier.
La puissance des ordinateurs augmentant, on les utilisa pour faire les programmes, les
programmeurs préférant naturellement rédiger du texte plutôt que des suites de 0 et de 1,
à charge pour l'ordinateur d'en faire la traduction lui-même. Avec le temps, de nouveaux
langages de programmation sont apparus, faisant de plus en plus abstraction du matériel
sur lequel devaient tourner les programmes. Ceci apporte plusieurs facteurs de gains : ces
langages sont plus faciles à apprendre, un programmeur peut produire du code plus
rapidement, et les programmes produits peuvent tourner sur différents types de machines.

Un processeur est un composant électronique qui effectue des opérations en suivant des
instructions. En 2009 les processeurs peuvent exécuter plusieurs centaines de millions
d'instructions par seconde.

Un programme est typiquement composé d'un ensemble de procédures et de fonctions.


Une procédure est une suite d'instructions destinées à réaliser une opération - par exemple
trier une liste. Une fonction est une suite d'instructions destinées à produire un résultat -
par exemple un calcul.

En mathématiques et en informatique, un algorithme est une suite d'opérations de calcul


qui, réalisées de façon systématique, permettent d'obtenir un résultat. La suite d'opération
peut être exécutée par un humain ou par un appareil informatique. Les programmes
informatiques contiennent de nombreux algorithmes.

7.2.1. Histoire des langages de programmation


Tout a commencé dans les années 1950 avec Fortran, Cobol et Lisp, même s’il y a eu de
nombreux précurseurs. Ainsi les grecs, les chinois savaient calculer, automatiser (à la main)
des calculs. Nous ne retiendrons donc que deux dates importantes à nos yeux. En 820, le
mathématicien EL KHAWARIZMI a publié à Bagdad un traité intitulé "La science de
l'élimination et de la réduction" qui, importé en Europe Occidentale lors des invasions
arabes a eu une grande influence sur le développement des mathématiques. En 1840, Ada
Lovelace (1814-1852), a défini le principe des itérations successives dans l'exécution d'une
opération. En l'honneur d'El Khawarizmi elle a (probablement) nommé "algorithme" le
processus logique d'exécution d'un programme.
137

De son "vrai" nom Augusta Ada Byron, elle était la fille du poète romantique Lord George
Byron et d'une mathématicienne.
Féministe, elle a épousé de William King (futur comte de Lovelace) ce qui lui vaudra d'être
connue dans l'histoire comme Lady Lovelace plutôt que comme Ada King. Elle avait été
l'élève de Charles Babbage avant de devenir sa collaboratrice. Elle est aussi à l'origine du
"Principe des machines à calculer". Pour elle, une machine à calculer devait comporter :
Un dispositif permettant d'introduire les données numériques (cartes perforées,
roues dentées...),
Une mémoire pour conserver les valeurs numériques entrées,
Une unité de commande grâce à laquelle l'utilisateur va indiquer à la machine les
tâches à effectuer,
Un "moulin" chargé d'effectuer les calculs,
Un dispositif permettant de prendre connaissance des résultats (imprimante...).
Ces principes seront, un siècle plus tard, à la base des premiers ordinateurs.

Les langages au fil du temps


1943 : Le Plankalkül
1943 : Le langage de programmation de l'ENIAC
1948 : Le langage machine du premier programme enregistré, i.e. le jeu
d'instructions de la SSEM : première machine à programme enregistré.
1949 : Le langage C-10
1951 - Regional Assembly Language
1952 - AUTOCODE
1954 - FORTRAN
1955 - FLOW-MATIC, ou encore B-0 (Business Language version 0) [ancêtre de
COBOL]
1957 - COMTRAN (COMmercial TRANslator) [ancêtre de COBOL]
1958 - LISP
1958 - ALGOL 58
1959 - FACT (Fully Automated Compiling Technique) [ancêtre de COBOL]
1959 - COBOL
1962 - APL (A Programming Language)
1962 - Simula I (Simple universal language)
1964 - BASIC (Beginner's All-purpose Symbolic Instruction Code)
1964 - PL/I (Programming Language number 1)
1967 : Simula
1969 : C
1970 : Smalltalk
1970 - Pascal, héritier d'Algol plus convivial
1970 - Forth
1971 -LSE (Langage Symbolique d'Enseignement),
138

1972 : Prolog (PROgrammation LOGique)


1973 : ML (Meta Language)
1978 - SQL (Structured Query Language),
1983 - Ada
1983 - C++
1985 - Eiffel
1987 - Perl
1989 - FP (Backus)
1990 - Haskell
1991 - Python
1993 - Ruby
1993 - Lua
1994 - ANSI Common Lisp
1995 - JavaScript
1995 - Java
1995 - PHP
2000 - C#
2007 Clojure (à partir de Lisp)
2004,2006 mais vraiment développé à partir de 2011 Scala (à partir de Java)
2010 F# proposé par Microsoft (à partir de C#)
2010 - Rust
2011 - Ceylon
2012 - Elm

Chaque langage de programmation est efficace à sa manière.

S’il y en avait un
incontestablement plus efficace
que tous les autres, tout le
monde l’utiliserait et la question
aurait vite été répondue.

C : il est relativement
proche de la machine et
permet de manipuler
directement la mémoire
d’un ordinateur, ce qui
donne un contrôle
quasiment total au développeur.
C++ : une surcouche orientée objet au langage C, plus abstrait, mais une meilleure
structure des programmes.
139

Java : utilise pleinement la POO pour une grande structuration des programmes. Le
code compilé tourne sur une machine virtuelle ce qui le rend moins rapide que du
C++, mais le fait fonctionner sur toutes les plateformes.
JavaScript : créé à la base pour ajouter de l’interaction dans des pages web. Il est
interprété, possède un typage très faible et des règles un peu ambigus, ce qui le
rend extrêmement simple d’utilisation, mais bien moins rigoureux que du C++ ou du
Java.
PHP : créé pour pouvoir créer des pages web dynamiquement le plus simplement
possible. Il est ridiculement simple d’utilisation et permet d’obtenir des résultats
très rapidement, mais il est aussi très controversé. J’ai fait une vidéo expliquant
pourquoi il a cette réputation.
Python : simple et permet d’obtenir des résultats très rapidement. Il est multi-
fonction et tu peux quasiment tout faire avec (scripts, pages web, applications
mobiles, jeux vidéo…).
Assembleur (pour le fun) : incontestablement le langage le plus proche de la
machine, qui donne pratiquement autant de contrôle que si l’on programmait
directement en binaire. Très peu de personnes les maîtrisent (car il y en a plusieurs,
un langage par type de processeur) tant ils sont techniques. En pratique, ils sont
surtout utilisés pour faire de la décompilation.

7.2.2. Elaboration du programme


Des traducteurs tels que des compilateurs, des interpréteurs et des assembleurs sont
nécessaires pour traduire des programmes écrits dans des langages de haut niveau en code
machine qu'un ordinateur comprend. Il y a différentes étapes dans le processus de
compilation.
Des outils existent pour aider les programmeurs à développer un code sans erreur.

7.2.3. Le traducteur
Un traducteur est un programme qui convertit le code source en code objet.
Généralement, il existe trois types de traducteur :
Compilateurs
Interprètes
Assembleurs

Tout programme écrit dans un langage de haut niveau est connu comme code source.
Cependant, les ordinateurs ne peuvent pas comprendre le code source. Avant de pouvoir
être exécuté, le code source doit d'abord être traduit sous une forme compréhensible par
un ordinateur - cette forme s'appelle code objet.

7.2.3.1. Le Compilateur
140

Un compilateur prend le code source dans son ensemble et le traduit en code objet en une
seule fois. Une fois converti, le code objet peut être exécuté à tout moment. Ce processus
est appelé compilation.

Tous les fichiers objets utilisés dans un programme doivent être combinés avant que le
programme puisse être exécuté. Cela se fait à l'aide d'un outil de liaison, qui prend un ou
plusieurs objets et les regroupe en un seul exécutable ou une bibliothèque.

a) Les avantages des compilateurs :


Les programmes compilés s'exécutent rapidement car ils ont déjà été traduits.
Un programme compilé peut être fourni sous forme de fichier exécutable. Un fichier
exécutable est un fichier prêt à être exécuté. Comme un fichier exécutable n'est pas
facilement modifiable, les programmeurs préfèrent fournir des exécutables plutôt
que du code source.
Compilateurs optimiser code. Le code optimisé peut s'exécuter plus rapidement et
prendre moins de place Mémoire espace.

b) Les inconvénients des compilateurs :


Étant donné que le code source est traduit dans son ensemble, il doit y avoir
suffisamment d'espace mémoire pour contenir le code source, le compilateur et le
code objet généré. Il doit également y avoir un espace de travail temporaire pour
que le compilateur effectue la traduction. Les systèmes modernes ont
suffisamment de mémoire ou utilisent mémoire virtuelle pour contenir toutes les
données.
Les compilateurs ne détectent généralement pas les erreurs - le programme doit
être compilé et exécuté avant que des erreurs ne soient rencontrées. Cela rend plus
difficile de voir où se situent les erreurs.
Le code source doit être recompilé chaque fois que le programmeur modifie le
programme.
Le code source compilé sur une plate-forme ne fonctionnera pas sur une autre - le
code objet est spécifique au processeur et à l’architecture.

7.2.3.2. L’interprète
Un interpréteur traduit le code source en code objet une instruction à la fois. C'est comme
un traducteur humain traduisant ce qu'une personne dit dans une autre langue, phrase par
phrase. Le code objet résultant est alors exécuté immédiatement. Le processus s'appelle
interprétation.

a) Les avantages des interprètes :


Les instructions sont exécutées dès qu'elles sont traduites.
141

Comme les instructions sont exécutées une fois traduites, elles ne sont pas stockées
pour une utilisation ultérieure. Par conséquent, les interprètes ont besoin de moins
de mémoire disponible.
Les erreurs peuvent être repérées rapidement. Une fois qu'une erreur est trouvée,
le programme s'arrête et l'utilisateur est informé de la partie du programme où
l'interprétation a échoué. Cela rend les interprètes extrêmement utiles lors du
développement de programmes.

b) Les inconvénients des interprètes


Les programmes interprétés s'exécutent plus lentement. Le processeur doit
attendre que chaque instruction soit traduite avant de pouvoir être exécutée.
De plus, le programme doit être traduit à chaque fois qu'il est exécuté.
Les interpréteurs ne produisent pas de fichier exécutable pouvant être distribué. En
conséquence, le programme de code source doit être fourni et celui-ci peut être
modifié sans autorisation.
Les interpréteurs n'optimisent pas le code - le code traduit est exécuté tel quel.

7.2.3.3. L’assembleur

Les assembleurs sont un troisième type de traducteur. Le but d'un assembleur est de
traduire langage d'assemblage en code objet. Alors que les compilateurs et les
interpréteurs génèrent de nombreux langage machine instructions pour chaque
instruction de haut niveau, les assembleurs créent une instruction de code machine pour
chaque instruction d'assemblage.

7.2.3.4. Le chargeur

Un chargeur est un morceau de Logiciel qui est responsable du chargement des fichiers
exécutables en mémoire pour permettre à l'unité centrale de traitement (CPU) de les
142

exécuter. Il calcule la taille d'un programme et lui consacre suffisamment d'espace


mémoire pour qu'il s'exécute efficacement.

7.2.4. Langage de programmation


Un langage de programmation est un ensemble de règles d'écriture de programmes
source - vocabulaire et règles de ponctuation - qui permettent d'exprimer des programmes
qui pourront être transformés en instruction machines à l'aide des algorithmes contenus
dans un compilateur ou un interprète. Les instructions qu'un processeur exécute sont des
suites de bits difficiles à comprendre et à manipuler par un humain, mais faciles à
automatiser par des circuits électroniques.
L'écriture du programme dans un langage de programmation donné est destinée à faciliter
le travail du programmeur.

Un bug est un défaut de construction dans un programme. Les instructions que l'appareil
informatique exécutent ne correspondent pas à ce qui est attendu, ce qui provoque des
dysfonctionnements et des pannes.

7.2.5. Logiciels
Un logiciel est un bien composé d'un ou de plusieurs programmes, associés à un contrat
de licence par lequel l'auteur octroie au détenteur le droit d'utiliser le programme.

Dans la majorité des cas, on achète des programmes (logiciels) tout faits qui correspondent
plus ou moins au besoin :
 Traitement de texte - P.A.O : avec mise en page, justification, numérotation
chapitres-pages, table des matières, dictionnaire...
 Tableur : tableau de nombres à 2 dimensions et calculs
 Base de données : ensemble de fiches (nom, adresse...) et recherche par rubrique,
publipostage...
 C.A.O, Dessin par ordinateur : propre, modification aisée, archivage...
 Gestion : paye, facturation, stock...
 Communication : transfert de programmes par modem et ligne téléphonique,
serveur minitel...

Un Intégré regroupe plusieurs de ces possibilités.


Soit on achète un logiciel général : très bon niveau, parfaitement testé, documentation,
formation... mais trop général (fonctions inutiles, fonctions utiles avec trop de paramètres
ou difficilement accessibles). Soit on fait (ou fait faire) un logiciel particulier : plus pratique,
mais plus hasardeux (erreurs, SAV, doc...). Le cahier des charges doit être très précis.

7.3. Organisation de l’ordinateur


 Multiposte : plusieurs consoles sur un même ordinateur (CPU puissant, tout est
partageable)
143

 Réseau : plusieurs CPU et MC non partageable (sauf réseau de multipostes), MdM


et périphériques partageables ou locaux.

7.4. Travail d’un langage programmation

Un ordinateur est une machine bête, ne sachant qu'obéir, et à très peu de choses :
Addition, soustraction, multiplication en binaire, uniquement sur des entiers,
Sortir un résultat ou lire une valeur binaire (dans une mémoire par exemple),
Comparer des nombres.
Sa puissance vient du fait qu'il peut être PROGRAMME, c'est à dire que l'on peut lui donner,
à l'avance, la séquence (la suite ordonnée) des ordres à effectuer l'un après l'autre. Le
grand avantage de l'ordinateur est sa rapidité. Par contre, c'est le programmeur qui doit
TOUT faire. L'ordinateur ne comprenant que des ordres codés en binaire (le langage
machine), des langages dits "évolués" ont été mis au point pour faciliter la programmation.

7.5. Le langage Python


7.5.1. Python en quelques dates
1989 - GUIDO VAN ROSSUM, un développeur Néerlandais commence à travailler sur
un nouveau langage de programmation en profitant d'une semaine de vacances. Il
profite ensuite de son temps libre pour poursuivre le développement de son
langage qu'il nomme Python en hommage à la série « Monty Python's Flying Circus
».
1991 - Le langage est suffisamment abouti pour proposer une première version
publique dès le mois de février : elle est versionnée 0.9.0. Le langage commence à
être adopté par certains projets. Tirant son inspiration de nombreux langages de
programmation (et notamment ABC, Modula-3 et le langage C) ainsi que de
quelques outils Unix, il permet principalement, à l'époque, d'automatiser des
tâches diverses en « administration système ».
1995 - La première version de la librairie NumPy est proposée. Cette librairie propose
des opérations de calculs vectoriels et matriciels. Elle a su s'imposer comme étant
une librairie majeure dans l'écosystème Python.
2000 - Le langage continu à évoluer pour atteindre la version 2.0.0. Il intègre de plus
en plus de modules de codes (de librairies) permet de traiter divers sujets : réseaux,
accès aux bases de données, parsing de fichiers... Cette version 2.x va rester
longtemps incontournable.
2001 - La PSF (Python Software Foundation) est créée. Il s'agit d'une association à
but non lucratif qui devient propriétaire des codes sources de Python. Elle a
désormais la responsabilité de faire évoluer le langage. Pour ce faire, elle définit des
PEP (Python Enhancement Proposal) qui définissent le périmètre de chaque
évolution.
144

Cette année voit aussi apparaître la première version de la librairie SciPy. Il s'agit
d'une surcouche à NumPy proposant de très nombreux algorithmes scientifiques.
2004 - La version 2.4 du langage est proposée. La librairie continue à s'étoffer.
2005 - La première version du framework Web Django apparaît. Python est
désormais lourdement armé pour prendre en charge les développements Web.
2006 - La version 2.5 du langage est à son tour proposée avec, encore une fois, de
nombreuses nouveautés. La PEP 3000 commence à être examinée (nous allons y
revenir).
2008 - Cette fin d'année (décembre) est charnière dans l'histoire de Python.
Effectivement, il est temps de commencer à tourner la page de Python 2.x (mais
cela va être long ... très long). De nombreux reproches ont été faits à Python. Afin
de proposer un langage plus moderne et plus « propre » (même si certains ne
seraient pas d'accord sur ce point), une rupture de compatibilité est nécessaire. Un
programme écrit pour Python 2.x ne s'exécutera plus forcément en Python 3. Le
périmètre de Python 3 est définie par la PEP 3000, initiée en 2006. Afin de laisser du
temps aux développeurs de migrer leurs applications Python 2.x en Python 3.0, une
période de grâce est annoncée : initialement le support Python 2.x devait se
terminer aux alentours de 2015.
Simultanément, la version 2.6 de Python 2 est livrée : elle intègre des éléments
censés permettre un passage plus en douceur vers Python 3.
2009 - Suite aux travaux du projet PyQt, une nouvelle version « open source » d'un
binding Python-Qt apparaît : son nom, PySide (aujourd'hui devenu PySide2). Il est
maintenant possible de réaliser des interfaces graphiques très sophistiquées et
performantes en Python. Pour rappel, Qt est une librairie C++ de mise en oeuvre
d'interfaces graphiques : il s'agit sans aucun doute de la plus aboutie, tous langages
de programmation confondus. PySide permet donc d'interfacer du code natif Qt
avec un programme Python.
2010 - Python 2.7 est officiellement livré. De mon point de vue, cela a contribué à
faire que personne ne s'est trop affolé pour migrer les applications Python 2.x. Il
faut comprendre que si vous avez développé un très gros programme Python, le
réécrire pour une nouvelle version de Python, qui fonctionne différemment, ne sera
gratuit : il faut investir beaucoup de temps et d'énergie pour recoder l'application
et vérifier que ce nouveau programme fonctionne correctement et sans régression
dans un environnement Python 3. Du coup, si la branche 2.x est maintenue et
continue à évoluer fonctionnellement, pourquoi se compliquer la vie ? En parallèle
de ce problème, il faut aussi comprendre qu'on ne peut faire évoluer notre code
Python 2.x que à la condition que toutes les autres librairies utilisées par votre
programme aient, elles aussi, été migrées en Python 3.x. Or, là aussi ça a été
compliqué.
145

2015 - La quantité de projets Python ayant basculés en Python 3.x est marginale. Un
report pour la mort de Python 2.x est nécessaire :-( Pendant ce temps, la branche
3.x se développe fortement avec de nouvelles constructions syntaxiques et des
nouveaux modules de code. En termes de possibilités offertes, l'écart entre la
branche 2.x et 3.x se creuse progressivement.
2017 - 63,7 % des projets Python sont écrits en version 2.x.
2018 - Guido Van Rossum annonce en mars que la fin du support Python 2.x par la
PSF est définitivement fixée au 01/01/2020 (voir son message).
2019 - La version 3.8 de Python est annoncée. Guido Van Rossum se retire de ses
mandats au sein de la PSF et finit par prendre sa retraite.
1er janvier 2020 - RIP Python 2.x ! La branche de code Python 2.x est gelée et tout
support est officiellement terminé. Un dernier installeur Python 2.7 doit être mis en
ligne dans les semaines suivantes.

7.5.2. Les possibilités offertes par Python

Python est donc un langage assez polyvalent. Il permet notamment d'adresser les types de
développements suivants :

L'apprentissage de la programmation : Python est certainement un des langages


de programmation les plus simples à prendre en main (comparé à du C++, par
exemple). C'est ce qui fait qu'il est aujourd'hui souvent proposé comme premier
langage de programmation par les lycées ou autre.
Le scripting : il est très simple, en Python, de définir des scripts d'automatisation de
tâches diverses et variées. C'est pour cette raison que de nombreux administrateurs
système se mettent à Python.
Le développement Web : grâce au framework Django, le développement
d'application Web est devenu très simple et efficace en Python.
Le calcul scientifique : de par sa simplicité et de par la qualité des libriairies NumPy,
SciPy, MatPlotLib et Pandas, python s'est imposé comme étant l'un des meilleurs
langages dans ce domaine.
Le Big Data et le Machine Learning : grâce à de nombreux logiciels orientés sur ces
domaines, Python tend à être « Le Langage » prédestiné sur ces sujets.
Programmation en Systèmes Embarqués : la plate-forme « Raspberry Pi »
préconisant Python comme langage de programmation principal, a propulsé
Python comme étant le langage à la mode sur ces sujets aussi.

Mais Python peut aussi permettre le développement de nombreux autres types


d'applications : d'application graphiques, application de gestions...

7.6. Programmer en PYTHON


Le langage de programmation Python a été créé en 1989 par Guido van Rossum, aux Pays-
Bas. Le nom Python vient d’un hommage à la série télévisée Monty Python’s Flying Circus
146

dont G. van Rossum est fan. La première version publique de ce langage a été publiée en
1991.
La dernière version de Python est la version 3. Plus précisément, la version 3.7 a été publiée
en juin 2018. La version 2de Python est désormais obsolète et cessera d’être maintenue
après le 1er janvier 2020. Dans la mesure du possible évitez de l’utiliser.
La Python Software Foundation est l’association qui organise le développement de Python
et anime la communauté de développeurs et d’utilisateurs.
Ce langage de programmation présente de nombreuses caractéristiques intéressantes :
Il est multiplateforme. C’est-à-dire qu’il fonctionne sur de nombreux systèmes
d’exploitation : Windows, Mac OS X, Linux, Android, iOS, depuis les mini-ordinateurs
Raspberry Pi jusqu’aux supercalculateurs.
Il est gratuit. Vous pouvez l’installer sur autant d’ordinateurs que vous voulez
(même sur le téléphone).
C’est un langage de haut niveau. Il demande relativement peu de connaissance sur
le fonctionnement d’un ordinateur pour être utilisé.
C’est un langage interprété. Un script Python n’a pas besoin d’être compilé pour
être exécuté, contrairement à des langages comme le C ou le C++.
Il est orienté objet. C’est-à-dire qu’il est possible de concevoir en Python des entités
qui miment celles du monde réel (une cellule, une protéine, un atome, etc.) avec un
certain nombre de règles de fonctionnement et d’interactions.
Il est relativement simple à prendre en main.
Enfin, il est très utilisé en bioinformatique et plus généralement en analyse de
données.
Toutes ces caractéristiques font que Python est désormais enseigné dans de nombreuses
formations, depuis l’enseignement secondaire jusqu’à l’enseignement supérieur.

7.6.1. Installer et configurer Python sous Windows


La procédure d'installation de Python sous environnement Windows est relativement
simple. Tout ce qu’il faut faire est d’avoir l’exécutable de Python, la version proposée ici
est la version 3.xxx.

7.6.1.1. Téléchargement de python

Dans la barre d’adresse du navigateur utilisé, saisissez l’adresse u site officiel de Python :
https://python.org. Pour ne pas de perdre avec les informations autres que le
téléchargement, il faudra alors saisir l’emplacement des téléchargements « Downloads »
sur le site officiel de Python : https://python.org/downloads
147

7.6.1.2. Installation de Python

Une fois l'installeur téléchargé, procédez à son exécution. Un premier écran doit vous être
proposé : en voici une capture d'écran. Il est important d'y cocher la case « Add Python 3.x
to PATH » si vous voulez avoir accès à l'environnement d'exécution à partir d'une console
shell.

Cliquez ensuite sur « Customize installation ». Un second écran doit apparaître : laissez les
choix proposés inchangés et cliquez sur « Next ».
148

L'écran suivant permet notamment de choisir où et pour qui vous souhaitez installer
l'environnement d'exécution Python. Par défaut, on vous propose d'installer Python que
pour votre utilisateur : cela s'avérera pratique si vous ne disposez pas des droits
d'administration sur la machine. Le chemin dans lequel sera localisé l'environnement
Python est affiché dans l'assistant :
C:\Users\<userName>AppData\Local\Programs\Python\Python311.
149

Si vous souhaitez que tous les utilisateurs de la machine puissent utiliser l'environnement
d'exécution Python, cochez la case « Install for all users ». Dans ce cas, l'environnement
d'exécution sera placé dans le dossier C:\Program Files\Python311. Mais attention : dans ce
cas, il vous faudra avoir des droits d'administration du poste.

Autorisez Windows à procéder à l’exécution du fichier d’installation en cliquant sur « OUI »


sur la fenêtre qui va s’ouvrir

Et attendez la progression de l’installation.


150

A la fin de l’installation l’écran suivant doit s’afficher :


151

7.6.1.3. Vérification de l’installation

Vérification de l'installation à partir du menu démarrer de Windows


Ouvrez le menu démarrer, sélectionnez-y le dossier Python 3.x puis cliquez sur « Python 3.x
(64bit) ».

Normalement la fenêtre suivante devrait s'ouvrir : vous pouvez y tapez les instructions
proposées :
1. print("Wail")
2. help(print)
Et observer
152

Vérification de l'installation en mode ligne de commandes


Sous condition que vous ayez bien
rendu Python accessible à partir du
PATH (soit lors du premier écran de
l'installeur, soit par la configuration de
Windows), vous devriez avoir accès à
l'environnement d'exécution Python
dans une console (Cmd ou PowerShell).
153

Dans la fenêtre MS-DOS, tapez la commande : python


Ensuite verifiez si ça marche en exécutant ces duex commandes : print("Amani kwa
wote"), puis exit()

7.6.2. L'interpréteur interactif Python


Comme son nom l'indique, l'interpréteur interactif permet d'interagir avec
l'environnement d'exécution en saisissant une instruction Python et en ayant
immédiatement le résultat de cette instruction. Il permet notamment de tester des lignes
de codes avant de les inscrire dans un « vrai » script Python.
154

7.6.2.1. Démarrage de l'interpréteur interactif sur environnement Python


Après l’installation de Python, son interpréteur interactif est aussi installé, et est disponible
à partir du menu démarrer de Windows. Voici pour rappel une capture d'écran montrant
l'élément de menu à y activer.

7.6.2.2. Démarrage de l'interpréteur interactif en mode ligne de commande (toutes


plates-formes)
Ouvrez un terminal, puis taper la commande python3 (sur les anciens systèmes Linux ou
Python2 était déployé simultanément) ou python. Il faut prendre soin de bien vérifier la
version de Python qu’on av démarrer (ici une version 3.11.0).
C:\>python
Python 3.11.0 (main, Oct 24 2022, 18:26:48) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
155

7.6.2.3. Les premiers commandes Python


Le prompt correspond au marqueur >>> affiché dans la console de l'interpréteur
interactif. Il indique que l'interpréteur attend que vous saisissiez une instruction à
exécuter.
Afficher des messages sur la console
Pour afficher un message sur la console, vous pouvez utiliser la fonction print. Bien qu'il y
ait plusieurs possibilités pour utiliser cette fonction, nous allons dans un premier temps
l'utiliser de manière basique. Pour appeler une fonction il faut saisir son nom puis, entre
parenthèses, vous devez passer des paramètres à cette fonction. Dans notre cas, nous
avons besoin que d'un seul paramètre : le message à afficher. Ce message étant une chaîne
de caractères, elle doit être saisie entre doubles guillemets (ou des simples guillemets : en
Python, c'est la même chose). Voici un exemple d'utilisation : une fois que vous aurez
enclenché la touche Entrée, le message devrait être affiché dans la console.

C:\>python
Python 3.11.0 (main, Oct 24 2022, 18:26:48) [MSC v.1933 64 bit (AMD64)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Mon premier message")
Mon premier message
>>>
Il est possible d’afficher les informations en faisant une autre manière d’afficher. Il faut
utiliser les guillemets simples.
>>> print('la programmation est bon')
la programmation est bon
>>>

Remarque : Il est possible de revoir toutes les commandes précédemment passées dans la
session active. Il suffit d’utiliser les touches des directions « Flèche haut » et « Flèche bas.
L'historique des instructions saisies est mémorisé par l'interpréteur interactif. Une fois une
instruction précédente affichée, il est possible de l’éditer en revenant en arrière avec la
touche « Flèche gauche ».

7.6.2.4. Utilisation des variables

Quand un programme s'exécute, il manipule normalement des données (des


informations). Ces données sont stockées en mémoire. Le problème c'est que des cases
mémoires, il y en a beaucoup, parfois plusieurs milliards. Chaque case mémoire est
numérotée, en fonction de sa position : c'est ce qu'on appelle une adresse mémoire. Il
s'agit d'un nombre entier pouvant être très grand. Si vous deviez vous souvenir des toutes
les adresses mémoire de vos données, vous auriez du mal à écrire un programme.

C'est pour répondre à cette problématique qu'on a inventé la notion de variable : une
variable est associée à une donnée de votre programme et cette variable aura un nom
156

(alphanumérique) certainement plus facile à mémoriser pour un humain. On parle de


variable, car la valeur de la donnée peut évoluer au cours du temps.

Pour déclarer une variable, il faut choisir un nom et lui associer une valeur initiale. Il est
important de bien nommer ses variables : un nom, simple à retenir, évoquant clairement la
nature de la donnée stockée aidera à la compréhension et à l'écriture de votre programme.
Je vous propose de créer une variable age devant contenir une valeur numérique entière
(un age). Initialement, nous allons stocker la valeur 18 dans cette variable. Nous allons
combiner cette déclaration de variable avec un affichage sur la console.
>>> age=18
>>> print("La variable contient la valeur ", age)
La variable contient la valeur 18
>>>

Il est possible de passer plusieurs paramètres à la fonction print. Chacun des paramètres
sera séparé par un caractère espace.
>>> age=18
>>> print("La variable contient la valeur ", age)
La variable contient la valeur 18
>>> age=age+1
>>> print("La variable contient la valeur ", age)
La variable contient la valeur 19
>>>
Nous venons d’ajouter 1 à la variable.

7.6.2.5. Obtenir de l’aide


La fonction help comme sont nom l’indique, permet d’obtenir de l’aide sur l’élément passé
en paramètre (les fonctions).
>>> help(print)
Help on built-in function print in module builtins:
print(*args, sep=' ', end='\n', file=None, flush=False)
Prints the values to a stream, or to sys.stdout by default.
sep
string inserted between values, default a space.
end
string appended after the last value, default a newline.
file
a file-like object (stream); defaults to the current sys.stdout.
flush
whether to forcibly flush the stream.
>>>
L’aide dans python est en anglais, si l’anglais complique, l’internet reste une solution en
cherchant une page web qui parle de la même question en français.
>>> help(input)
Help on built-in function input in module builtins:
input(prompt=None, /)
Read a string from standard input. The trailing newline is stripped.
The prompt string, if given, is printed to standard output without a
trailing newline before reading input.
If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise
EOFError.
157

On *nix systems, readline is used if available.


>>>

7.6.2.6. Demander une saisie à l’utilisateur


Sur la console, il est possible de demander à l’utilisateur da saisir une donnée au clavier et
d’en mémoriser dans une variable.
>>> nom = input("Veuillez saisir votre nom : ")
Veuillez saisir votre nom : WAil
>>> print("Bonjour ", nom)
Bonjour WAil
>>>

7.6.2.7. Sortir de l’interpréteur inter actif python


Pour quitter l'interpréteur interactif, il suffit d'invoquer la fonction exit. Celle-ci n'accepte
aucun paramètre.
>>> exit()

7.6.3. L’Editeur de texte Idle


IDLE est l'environnement de développement et d'apprentissage intégré de Python
(Integrated Development and Learning Environment). Il est proposé directement avec
l'environnement d'exécution Python. Sur Windows, rien de plus à faire : il est déjà installé.

De prime abord, il se comporte comme l'interpréteur interactif Python. Mais si on y regarde


de plus près, il permet plus de choses (et notamment l'édition de scripts Python) et il est
plus joli, la colorisation syntaxique aidant.
158

Remarque : les touches « Flèche haut » et « Flèche bas » ne fonctionnent plus comme avant
dans cet environnement. Mais il y a des raccourcis équivalents : ALT+P pour revenir en
arrière dans l'historique des instructions saisies et ALT+N pour y avancer.

En réalité, l'outil Idle est plus poussé que l'interpréteur interactif Python en mode console
: les assistants viennent simplifier grandement la vie du programmeur. Dès que l’on tape
les premières lettres d'une fonction la séquence enclenche les touches CTRL+ESPACE, une
liste de suggestions peut apparaître pour montrer les fonctions connues et commençant
par ce préfixe : on parle de « complétion de code ».

De même, quand l’on tape la parenthèse ouvrante d'un appel de fonction, la liste des
paramètres supportés sont proposées par l’assistant.
159

Remarque : certains des assistants ne fonctionnent pas sur tous les environnements.

Le programme suivant permet de saisir deux valeurs. Par défaut la fonction input renvoie
une chaîne de caractères. Pour obtenir des données numériques, il faut convertir ces
chaînes de caractères en valeurs numériques à virgules flottantes via la construction float.
Ensuite le programme affichera le résultat des quatre opérations arithmétiques de bases.

1. premiereChaine = input("Veuillez saisir un nombre : ")


2. deuxiemeChaine = input("Veuillez saisir un autre nombre : ")
3.
4. a = float(premiereChaine)
5. b = float(deuxiemeChaine)
6.
7. print("a + b = ", a + b)
8. print("a - b = ", a - b)
9. print("a * b = ", a * b)
10. print("a / b = ", a / b)

Pour bien utiliser le programme, il doit être sauvegardé : un fichier Python a,


traditionnellement, l'extension .py. Pour sauvegarder le fichier, il faut utiliser le menu
adapté dans la barre de menu ou enclenchez la séquence de touches CTRL+S.
160

Une fois le fichier sauvé (enregistré), il faut le démarrer. Pour ce faire, lancez le menu Run
ou appuyer sur la touche F5. Normalement, le résultat du programme doit s'afficher dans
la fenêtre de l'interpréteur.

Vous aimerez peut-être aussi