Académique Documents
Professionnel Documents
Culture Documents
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
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
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 :
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
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.
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
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.
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.
À 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
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
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
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
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.
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
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
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
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.
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
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.
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
• 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.
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.
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.
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.
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 :
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
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.
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.
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.
change pas le type de fichier!).La longueur du nom et de l'extension peut varier suivant le
système d'exploitation:
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" ...
• 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
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).
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 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
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.
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.
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.
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.
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
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
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
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
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.
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.5. Symboles
5.5.1. Symboles de données
Symboles de base
Données
70
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é.
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.
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.
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.
Opération manuelle
Ce symbole représente tout traitement exécuté par un opérateur humain.
Préparation
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
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
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
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
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
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.
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
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 :
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
à 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.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
Variable g en Numérique
ou encore
Variables PrixHT, TauxTVA, PrixTTC en Numérique
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.
Tutu Toto
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
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
A1
BA+3
A3
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
A5
B3
CA+B
A2
CB–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
A5
BA+4
AA+1
BA–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
A3
B 10
CA+B
BA+B
AC
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
A5
B2
AB
BA
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).
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.7. Exercices
Exercice 1.8
93
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.
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.
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…) :
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.
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
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
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
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
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.
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 :
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.
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
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.
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 :
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
BX>2
CX<6
D (A ET B) OU C
E A ET (B OU C)
Ecrire D, E
Fin
Cette petite règle pourrait tout aussi bien être formulée comme suit :
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 à :
6.14.2. Exercices
Exercice 4.1
Finsi
Exercice 4.2
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 :
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)".
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
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 :
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
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.
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 :
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 :
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 :
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 :
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
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 :
Equivaut à :
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 :
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é.
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.
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 :
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.
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…
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
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.
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 :
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
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
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
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 :
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
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
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.
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.
...
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
...
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...
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 ?")
...
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
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 :
Quant à l'appel à cette sous-procédure, il pourra prendre par exemple cette forme :
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
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.
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
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.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.
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.16. Bibliothèque
En informatique, ensemble de fonctions stockées dans un fichier séparé.
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.23. Durée
Période d'exécution ou d'exécution d'un programme informatique.
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.28. Syntaxe
Règles régissant la rédaction d'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.
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.
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.
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.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.
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.
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.
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
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 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.
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.
Python est donc un langage assez polyvalent. Il permet notamment d'adresser les types de
développements suivants :
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.
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
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.
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
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 ».
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
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.
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.
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.