Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Informatique 1

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 93

Université Mentouri Constantine,

Algérie.

Informatique 1
(BI 201)

Licence professionnelle
Résaux et Telecommunication

Par : BENIERBAH SAID,

Version 1.0
Cours : informatique 1 pour le semestre 1 Licence (LMD) Réseaux & Telecom.
Par : BENIERBAH SAID, université Mentouri Constantine, Algérie.

Préface
Ceci est un cours d'initiation à l'informatique et la programmation donné au département
d'électronique à l'université de Constantine. Il est destiné aux étudiants de Licence Réseaux et
Télécommunications (R&T). Ce cours est une synthèse (non exhaustive) sur les minima à
connaître sur le sujet. Il permettra à l'étudiant de connaître le matériel informatique largement
utilisé dans tous les cours de la formation R&T et d'aborder l'algorithmique et la programmation
en langage C. On va connaître les algorithmes et comment on résout les problèmes avec la
programmation. On verra aussi les différents langages de programmation, la technologie actuelle
en matériel de calcul, les systèmes d’exploitation Linux et Windows et l'environnement de
programmation et de débogage des programmes.
Ce cours sera aussi utile à toute personne désireuse de se former par elle-même en informatique et
en programmation.
-Le premier chapitre rassemble l'aspect électronique de la machine et les concepts essentiels de
l'informatique comme les différentes machines de calcul existante actuellement, les systèmes
d'exploitation, les réseaux, la programmation, le jeu d'instruction au niveau de la machine.
Normalement pour un électronicien ceci n'est qu'un rappel.
-Dans le chapitre 2, on détaillera l’architecture et le fonctionnement du PC.
-Dans le chapitre 3, on va connaître les systèmes d'exploitation DOS, Windows et Linux.
-Dans le chapitre 4, on va voir les approches méthodiques pour développer du logiciel, par
exemple on va voir : algorithme, complexité, programmation descendante et modularité. Ce
chapitre utilisera un programme de tri sur des tableaux pour montrer comment utiliser ces
techniques.
-Le chapitre 5 introduit le concept de langage de programmation on va voir les différent langages
de programmation et le langage C sert d'exemple.
-Dans le chapitre 6, on verra les différents types de fichiers binaires et exécutables et comment les
générer.
-Le chapitre 7 contient les éléments fondamentaux de la programmation orientée objet, du C et
introduit la programmation procédurale. Le langage C sous Visual Studio (.net) sert de support à
l'implantation pratique de ces notions.
Comme la licence R&T est professionnelle des TP et des exercices accompagnéront le matériel
présenté tout au long du cours pour bien assimiler et maîtriser les notions introduites et
l'utilisation pratique des systèmes informatiques.

1
Table des matières
N° de page
Préface 1
Table des matières 2
Chapitre 1 : Introduction à l'informatique
Introduction
Architecture d'un Ordinateur ou Computer ou ‫حاسوب‬
Les données et la mémoire
Microprocesseur
Fonctionnement du microprocesseur (exemple X86)
Les ordinateurs Personnels
Chapitre 2 : Architecture détaillée du PC
Introduction
Vue externe du PC
L'unité centrale
Les microprocesseurs du PC
La carte mère
Le BIOS
L'alimentation
La mémoire du PC
Les cartes d'extension
Les Disques
Les connecteurs
Les principaux périphériques
Démarrage du PC
Chapitre 3 : Systèmes d’exploitations
Introduction
Les types de systèmes d'exploitation de PC
Le noyau de l'OS (Kernel)
Processus et thread
Gestion de la mémoire
Les systèmes d'exploitation pour PC
Présentation détaillée des systèmes d'exploitation pour PC
Windows
DOS
Les commandes DOS
Exemples la quelques commande DOS
La configuration de DOS
Windows XP
Definition
FS de XP
La base de registres
Environnement graphique de Windows
Les commandes et programme de XP
Explorateur Windows :
Console
Linux
FS de Linux
Le noyau Linux
Les commandes de Linux

2
GUI de Linux
Démarrage du système
Fichiers important de configuration
Chapitre 6 : Algorithmes
Introduction
Organigramme
Le langage de description d'algorithme (Pseudocode)
Complexité des algorithmes
Principes de conception d'algorithmes
Pratique du développement d'algorithmes
Chapitre 5 : Les langages de programmation
Introduction
Types de langages
Les langages procéduraux
Les langages fonctionnels
Les langages logiques
Les langages graphiques
Les langages hybrides
Les langages Script
Comment développer un logiciel
Chapitre 6 : Des sources à l'exécutable
Introduction
Types de fichier binaires exécutables
Les étapes de la génération des fichiers binaires
Chapitre 7 : Langage C
Introduction
Les atouts du C
Exemple de programme C (Hello world)
Notion de fonction en C
Définitions de base
Discussion de l'exemple 'Hello World'
Les structures de contrôle (Instructions conditionnelles)
Fonctions
Tableaux, pointeur et structures.
Conseils pour écrire les programmes
Bibliographie

3
Chapitre 1 : Introduction à l'informatique

Introduction
L’informatique résulte de la fusion des savoirs acquis dans plusieurs domaines, essentiellement
de l'électronique et des systèmes de calcul. Son développement a été stimulé par les applications
scientifiques où il y a un grand besoin de résoudre les problèmes de calcul répétitif. Actuellement
les applications de calcul itératif sont minoritaires et la majorité des ordinateurs sont utilisés pour
des taches comme le jeu, le divertissement, la bureautique et les réseaux.
Ce sont les grandes machines qui ont été fabriquées les premières (aux années 1940) et leur usage
était réservé aux militaires et au grandes universités ou centres de recherches. A partir des années
1970, l'ère de la micro informatique a commencé avec la fabrication des premiers ordinateurs
personnels et principalement le PC (Personal Computer) d'IBM. Dans ce qui suit, on va
essentiellement étudier les micro-ordinateurs (PC).

Architecture d'un Ordinateur ou Computer ou ‫حاسوب‬


Un ordinateur est une machine de calcul utilisé pour traiter l’information. L’information est
fournie sous forme de données à traiter par des instructions préalablement définies et exécutées
par l'ordinateur. J. Von Neumann a défini la structure générale des ordinateurs utilisés
actuellement à partir des travaux sur les principes de calcul d’une machine de Turing. La machine
de Von Newman considère que tout problème doit être décrit comme une séquence de
d'opérations (procéduralité).
Un ordinateur selon le model de Von Newman est constitué essentiellement d'un processeur et
d'une mémoire. La mémoire contient les données et les programmes (suites d'instructions) et le
rôle du processeur est d'extraire les instructions de la mémoire, de les interpréter et de les
exécuter, une à une. Une structure plus générale d'un ordinateur est présentée par la figure
suivante.

Cette structure peut être divisée en deux : un centre (coeur) et une périphérie.
Le cœur de l'ordinateur est composé d'une unité centrale (CPU) comportant :
-Unité de traitement, chargée d’effectuer les traitements des opérations de types arithmétiques ou
logiques. L’unité arithmétique et logique (UAL) est son principal constituant.
-Unité de contrôle, chargée de commander et de gérer tous les différents constituants de
l’ordinateur (les échanges, l’enchaînement des instructions, etc...).
La création des microprocesseurs a permit de réduire la taille des machines et la naissance de la
micro-informatique (le micro-ordinateur ou en particulier le PC). Le microprocesseur est un seul
circuit qui intègre la majorité des fonctions des unités de contrôle et UAL.

4
La partie périphérie est constituée de :
-Unités d’échanges et d'entrées/sorties. Elle peut être un simple bus, un circuit ou bien un
microprocesseur particulier. Elle est placée entre la mémoire et un certain nombre de
périphériques (carte son, la carte vidéo, imprimante etc...). Une unité d’échange soulage l'unité
centrale dans les tâches de gestion du transfert de l’information. En fait, les périphériques sont
très lents par rapport à la vitesse du processeur. S'il était chargé de gérer les échanges avec les
périphériques il serait tellement ralenti qu’il passerait la plupart du temps à attendre.
-Une Mémoire Centrale. C’est un organe capable de contenir, de conserver et de restituer sans les
modifier de grandes quantités d’information.
On distingue deux types de mémoires :
• Les mémoires RAM (Random Access Memory) : elles sont volatiles et perdent leur contenu en
cas de coupure d’alimentation. Elles sont utilisées pour stocker temporairement des données et
des programmes. Elles peuvent être lues et écrites. Le terme Random Access veut dire que l'on
peut accéder à n'importe quelle donnée de la mémoire à n'importe quel moment (très rapides) à la
différence des mémoires anciennes à accès séquentiel.
• Les mémoires ROM (Read Only Memory) : elles sont non volatiles. Elles conservent leur
contenu en cas de coupure d’alimentation. Elles ne peuvent être que lues sans écriture (durant
l'exécution du programme). On les utilise pour stocker des données et des programmes de
manière permanente (ROM) ou les données et programmes qui ne changent pas durant
l'utilisation de l'ordinateur (EEPROM).

Les données et la mémoire


Tous les ordinateurs fonctionnent en binaire. Les informations traitées par un ordinateur peuvent
être de différents types (texte, nombres, etc.) mais elles sont toujours représentées et manipulées
par l'ordinateur sous forme binaire. Toute information sera traitée comme une suite de 0 et de 1.
Ces chiffres sont représentés dans l'ordinateur par des niveaux de tensions (0 et 5 volts).
La longueur des données que peut manipuler le microprocesseur est exprimée en BIT (BInary
digiT). On dit d'un microprocesseur capable de traiter des nombres de 16 bits en un seul coup,
qu'il s'agit d'un microprocesseur 16 bits. On trouve aujourd'hui des microprocesseurs 64 bits. Les
premiers microprocesseur (Intel 4004) apparus en 1972 étaient des microprocesseur 4 bits...
Durant la manipulation des données, ces dernières sont toujours stockées dans la mémoire. La
mémoire est constituée d'un ensemble de positions ou cases (locations) où stocker l’information.
Les cases mémoire possèdent une dimension donnée, généralement 8 bits. C'est-à-dire qu'on peut
y ranger une information de 8 bits. Ces 8 bits peuvent aussi être un fragment d'une information
qui est répartie sur plusieurs cases successives. On appelle un groupe de 8 bits un octet (1 octet
=1 byte = 8 bits).
Les mémoires sont caractérisées par leur capacité : nombre total de cases mémoire que le
microprocesseur peut utiliser. La capacité de mémoire est généralement exprimée en Kilo-octet
ou en Méga-octet. Un Koctet égale 1024 octets (210). Un Moctet égale 1048576 octets
(1Mo=1024 x 1024 octet). Un Giga octet égale 1024 Mo (1Go= 1024 Mo).
Le CPU va chercher des informations dans les cases mémoire. Pour cela, chaque position de la
mémoire est identifiée à l'aide d'une adresse qui lui est propre et qui permet de l'identifier de
façon unique. Pour adresser la mémoire, le CPU utilise un bus d'adresse constitué d'un certain
nombre de lignes. Le nombre de lignes d’adresses dépend de la capacité de la mémoire : n lignes
d’adresses permettent d’adresser 2n cases mémoire : 8 bits d’adresses permettent d’adresser
28=256 octet, 16 bits d’adresses permettent d’adresser 65536 octets (= 64 Ko), et 32 bits
permettent d'adresser 4Go...

5
Microprocesseur
Un microprocesseur consiste en une unité centrale de traitement (UAL + registres + unité de
contrôle) entièrement contenue dans un seul circuit intégré. En plus des unités ALU et de
contrôle, un microprocesseur intègre aussi une petite mémoire indépendante de la mémoire
centrale (cache). Cette mémoire est formée de quelques registres et sert à stocker les résultats
temporaires et des commandes.
Un calculateur construit autour d’un microprocesseur est un micro-ordinateur. Un
microprocesseur se présente sous la forme d’un circuit intégré muni d’un nombre généralement
important de broches. La figure suivante représente le 8086 qui a été utilisé pour les premiers PC.

6
Les microprocesseurs sont des circuits très complexes aussi, dans leur fabrication. Comme
exemple, le microprocesseur 32 bits Pentium 4 d’Intel contient environ 55 millions de transistors,
le microprocesseur 64 bits Opteron d’AMD contient 105 millions de transistors.
Chaque microprocesseur reconnaît un ensemble d’instructions appelé jeu d’instructions
(Instruction Set) fixé par le constructeur. Une instruction est définie par son code d'opération qui
est une valeur binaire. Le microprocesseur peut directement exécuter ces instructions mais il est
difficile de les manipuler par l’être humain qui va écrire le programme. On utilise donc une
notation symbolique pour représenter les instructions appelées les mnémoniques. Le jeu
d'instructions est composé au minimum de quatre grandes classes d’instructions :
-instructions de traitement (arithmétique, logiques …)
-instructions de branchement ou de déroutement (saut conditionnel et inconditionnel…)
-instructions d’échanges (lire et écrire les données en mémoire)
-instructions de comparaisons
D’autres classes peuvent être ajoutées pour améliorer les performances du microprocesseur
(instructions de gestion mémoire, multimédias etc…)
Le programme exécuté par le microprocesseur est constitué d'une suite d’instructions stockées
dans la mémoire. Une instruction peut être codée sur un ou plusieurs octets et exécutée dans
l’ordre établi par le programme. En plus, le microprocesseur lui-même est une machine
séquentielle, ce qui signifie que le traitement d'une instruction se déroule séquentiellement. Une
instruction machine est traitée en 3 phases par 3 étages de traitement différents :
1 – recherche ou lecture : dans la mémoire ou dans le registre instruction
2 - décodage : extraction du code opération et des opérandes
3 - exécution : du traitement et stockage éventuel du résultat.

Le temps d'exécution des instructions est la caractéristique principale du microprocesseur. Ainsi,


pour évaluée la performance d’un microprocesseur, on utilise la quantité d’instructions qu’il
exécute à chaque seconde (i/s). Cette donnée peut se décomposer comme suit :
i/s = i/c x c/s (Instruction/seconde = instruction/cycle *cycle/seconde)
où c correspond au nombre de cycles du microprocesseur, i/c correspond au nombre moyen
d’instructions exécutées à chaque cycle (c’est l’IPC) et c/s est le nombre de cycles par seconde,
soit la fréquence d’horloge, notée F. Ainsi :
i/s = IPC x F
Cette formule montre que l’IPC et la fréquence F sont les deux principaux facteurs de
performance du microprocesseur. Or, IPC et fréquence sont intimement liés à l’architecture du
microprocesseur, et notamment à la profondeur du pipeline de traitement.
Le temps qu'occupe l'exécution d'une instruction est la somme du temps employé par les trois
étages d'exécution (T1+T2+T3). L'architecture pipe-line (qui utilise plusieurs étages en parallèle)
permet d'optimiser les temps d'attente de chaque étage, en commençant le traitement de

7
l'instruction suivante dès que l'étage a été libéré par l'instruction en cours, et de procéder
identiquement pour chaque étage de telle façon que durant chaque phase, tous les étages soient
occupés à fonctionner (chacun sur une instruction différente). Par exemple, lorsque l'étage de
décodage commence le traitement de l'instruction N° 1, l'étage de lecture commence déjà la
lecture de l'instruction N° 2. Cette technique accélère le traitement d'une instruction donnée,
puisqu'à la fin de chaque phase, une instruction est traitée en entier. Le nombre d'unités
différentes constituant le pipe-line s'appelle le nombre d'étages du pipe-line.
On dit qu'un microprocesseur est superscalaire lorsqu'il possède plusieurs pipe-lines indépendants
dans lesquels plusieurs instructions peuvent être traitées simultanément. Par exemple, le Pentium
4 intègre un pipe-line à 20 étages.
Le microprocesseur contient aussi une petite mémoire interne appelée mémoire cache qui lui
permet de stocker les instructions à exécuter pour réduire l'accès à la mémoire externe.
L'Hypertreading permet au microprocesseur, si le programme est compilé pour, de découper
l'exécution en plusieurs parties, exécutées en même temps.
Enfin, le microprocesseur peut aussi fonctionner en collaboration avec un autre microprocesseur
(multiprocessing) dans un seul ordinateur. Dans ce cas, l'exécution des programmes est accélérée
parce que le traitement des données est divisé entre les microprocesseurs (augmenter l'IPC).
Le temps d'accès mémoire peut aussi influer sur la vitesse de fonctionnement du microprocesseur.
Ainsi dans une hiérarchie mémoire les registres sont les zones mémoires les plus rapides (avec un
temps d’accès virtuellement nul vu que leur accès est masqué par le pipeline), on dit donc qu’ils
sont plus proches des unités d’exécution. On trouve ensuite le cache de niveau 1 (avec un temps
d’accès de l’ordre de quelques cycles, 3 sur les microprocesseurs récents), puis le cache de niveau
2 (avec un temps d’accès de l’ordre de la dizaine de cycles), éventuellement un cache de niveau 3
et enfin la mémoire centrale.

Remarque : un circuit intégré qui inclut un CPU, de la mémoire et des périphériques est un
microcontrôleur.

Fonctionnement du microprocesseur (exemple X86)


La figure suivante montre la structure interne du 8086 et essentiellement l'ALU et ces registres.

8
L'interfaçage du microprocesseur vers les autres circuits nécessite 3 bus : un bus de données, un
bus d'adresses et un bus de commandes. Un bus est un ensemble de lignes de communication
(matérialisés par des fils) qui relie 2 (ou plus) circuits digitaux entre eux. Les éléments essentiels
d'un microprocesseur (8086) vu de l'extérieur sont :
- un bus d'adresse (20 bits) utilisé pour envoyer l'adresse à la mémoire (1Mo).
- un bus de données utilisé pour envoyer ou recevoir les données de/vers la mémoire.
- Des signaux de contrôle qui permettent au microprocesseur de contrôler le
fonctionnement des bus ou de synchroniser les transferts de données entre le
microprocesseur et les périphériques (mémoire, entrées/sorties). Deux signaux importants
sont RD (read) et WR (write) utilisés pour informer la mémoire que le microprocesseur
va effectuer une opération de lecture ou d'écriture.
- Une ligne (entrée) d'horloge pour commander le travail séquentiel du microprocesseur
L'organisation interne du microprocesseur est constituée par :
- un ensemble de registres généraux, AX (accumulateur), BX, CX et DX. Ces registres
sont utilisé pour manipuler les données durant les opérations arithmétiques et logiques.
- Un ensemble de registre de segment CS, DS, ES et SS en plus des registres pointeur et
index SP, BP, SI, DI et IP. Ces registres sont combinés pour calculer les adresses
mémoire où se trouvent les instructions et les données.
- Un registre spécial d'état qui indique à chaque instant (après l'exécution de chaque
instruction) l'état du microprocesseur et les erreurs.
- Enfin il y a les deux unités importantes de contrôle et ALU.

Les microprocesseurs plus complexes sont constitués d'un nombre plus important de registres et
peuvent avoir plusieurs ALU mais le fonctionnement est basé sur les mêmes principes.
Le schéma fonctionnel d'un ordinateur à base du 8086 est donné dans la figure de la page
suivante.
Le microprocesseur exécute le programme qui se trouve dans la mémoire. Il commence
l'exécution d'une instruction par mettre une adresse valide sur le bus d'adresse (celle où se trouve
l'instruction à exécuter). Une fois le signal stable, il émet un signal RD et d'autres signaux de
contrôle pour signaler à la mémoire qu'une adresse valide est présente sur le bus et qu'il va
demander un accès mémoire en lecture. A la fin du cycle, la mémoire transfère sur le bus de
données les informations. Dans le cas d'une écriture vers la mémoire, le signal RD est remplacé
par un signal WR.
Une fois l'instruction lue, le microprocesseur la décode et lit les données supplémentaire (si
nécessaire) puis procède à l'exécution. A la fin, il entame une opération de vérification et de
stockage des données dans la mémoire (si nécessaire). Le microprocesseur répète la même
procédure pour les instructions suivantes jusqu' à la fin du programme.
L'essentiel du travail du microprocesseur est avec la mémoire. Dans ce travail, il est aidée par un
jeux de circuits qui se chargent de la gestion du bus et de faciliter la communication avec les
périphériques.
Les signaux du bus de commande permettent également de gérer les interruptions. Une
interruption permet à un périphérique de signaler au microprocesseur qu'il doit s'occuper de lui
(arrivée d'une donnée, ...). Cette opération permet à un circuit externe de signaler au
microprocesseur qu'il est prêt à recevoir des données de l'extérieur par exemple. Le
microprocesseur peut traiter plusieurs interruptions qui sont identifiés par leurs numéros. Un
circuit spécial, appelé programmable interrupt controller (PIC), se charge de la gestion des
interruptions pour le compte du microprocesseur. Une interruption cause la suspension de
l'exécution normale du programme pour exécuter un autre programme (ou séquence
d'instructions) appelé programme d'interruption. A la fin de ce programme le microprocesseur
continue l'exécution normale du programme.

9
Enfin, c'est le microprocesseur qui est, généralement, le maître du bus et tous les transferts de
données passent par lui. Quant il y a transfert d'une grande quantité de données entre un
périphérique d'entrée/sortie et la mémoire centrale, cette opération peut devenir très lente. Un
circuit spécial appelé DMA (Direct Memory Access) se charge de gérer cette opération sans
passer par le microprocesseur. Il faut aussi noter que chaque périphérique a un canal DMA
spécifique.

Les ordinateurs Personnels


PC
Les PC sont les ordinateurs personnels les plus utilisés. Les premiers ordinateurs personnels
utilisaient un seul microprocesseur 8-bit, comme 6502 ou Z80. Les premiers étaient : Apple II,
Atari 800, Commodore 64 et TRS-80. Le PC d'IBM introduit en 1981, avec une architecture basé
sur des microprocesseurs Intel x86, a dominé tous les autres et est devenu un standard de facto.
Apple est la seule société qui a survécut à la domination du PC. Elle a optée pour l’utilisation au
début du Motorola 68000 puis le PowerPC mais en 2006 elle a finalement adopté un système basé
x86. Ceci a permis finalement aux gens d'utiliser Windows sur Macintosh ou Mac OS sur un PC.

10
Station de travail
Une station de travail (Workstation) désigne généralement un ordinateur puissant représentant le
maximum de capacité de calcul destiné aux applications techniques. Elle peut être utilisée par un
utilisateur unique ou plusieurs reliés à un réseau. Les stations sont généralement utilisées par les
"power users" qui ont besoin de bêtes de calcul comme dans les calculs scientifiques, les
applications de CAO comme AutoCAD ou les applications graphiques comme 3D Studio Max…
Aux années 80, une station de travail désigne un ordinateur sensiblement plus puissants que les
PC disponibles à ce moment-là, avec un écran confortable de 17" ou 19" et système
d’exploitation UNIX. Les principales sociétés fabriquant ce type d’ordinateurs sont : HP, Sun
Microsystems, Silicon Graphics (SGI), DELL et IBM.
Aujourd’hui, avec la puissance de calcul des microprocesseurs comme P4 et avec les cartes
graphiques 3D, la distinction entre PC et station de travail s'est progressivement estompée. Un PC
d’aujourd’hui est plus puissant qu’une ancienne station top.
La seule distinction qui reste (et va progressivement disparaître) est que les stations de travail
sont généralement des machines UNIX avec une architecture autre que Intel-AMD.

Serveur
Ce sont des PC destinés à fonctionner comme serveurs d'applications (réseaux). Ils sont
généralement plus puissants et plus robustes. Éventuellement multiprocesseurs, sont munis de très
gros volumes disques et de mécanismes qui accroissent leur fiabilité et leur disponibilité.
Même si un serveur peut-être un PC normal (cas d'un petit réseau) et un serveur peut être utilisé
comme station de travail de haut de gamme, la majorité des serveurs sont des ordinateurs
spécifiques avec des caractéristiques reprenant divers critères liés à la sécurité des données et des
applications installées sur le serveur.
De même qu'un microprocesseur PC standard peut être utilisé dans un serveur réseau (et vis
versa), INTEL et AMD ont développés des microprocesseurs spécifiques pour les serveurs
réseaux. Ils sont identiques aux autres microprocesseurs mais intègrent des particularités qui les
destines à des applications serveur réseau. On peut citer comme exemple Xion d'Intel.

Machine virtuelle
Une machine virtuelle est un programme qui imite les performances d'une machine matérielle
comme un PC. Cette opération permet par exemple de faire tourner, sur une machine x86, un
programme écrit pour un autre microprocesseur. Les machines virtuelles offrent aussi la
possibilité de faire tourner le programme sur un nombre indéterminé de microprocesseurs, ou sur
un réseau de machines travaillant en parallèle pour émuler une machine virtuelle unique, sans
même changer une seule ligne du programme source original. On peut aussi utiliser plusieurs
machines virtuelles déférentes sur une seule machine réelle. Ce qui donne aussi la possibilité de
réaliser des réseaux de machines virtuelles.

11
Chapitre 2 : Architecture détaillée du PC
Introduction
Dans ce chapitre, on va voir l'architecture détaillée du PC. On va voir l'architecture des PCs
utilisée actuellement mais on va passer par un petit historique. On va voir comment un PC est
organisé, ces composants de base et leurs rôles. Un PC est constitué du microprocesseur, d'une
carte électronique principale appelée carte mère et des cartes d'extension. On va voir en détail
tous ces constituants, surtout la carte mère et les microprocesseurs. Apres, on va voir rapidement
les différentes cartes d'extension d'un PC. On va voir leur fonctionnement et leurs
caractéristiques. Enfin, il ne faut pas oublier que tout ceci est contenu dans un seul boîtier
constituant l'unité centrale et on va voir les différents périphériques qui étendent et facilitent le
travail du PC. Ceci comporte le clavier, l'écran, la souri, les diffèrents disques et les
imprimantes…

Vue externe du PC

Cette figure permet d'identifier les principaux constituants d'un PC de bureau :


- Une unité centrale qui contient la carte mère et le microprocesseur et même l'alimentation du
système.
-Un clavier pour introduire les commandes ou simplement pour taper un texte.
-Un écran pour afficher les informations et communiquer avec l'utilisateur.
-Une souri pour utiliser l'environnement graphique du système d'exploitation.
Ces périphériques sont le minimum nécessaire pour utiliser un PC dans des taches de
bureautiques et de programmation. Il faut noter qu'on peut utiliser l'unité centrale toute seule dans
certaines applications mais dans d'autres applications d'autres périphériques existent comme :
-L'imprimante
- Les haut-parleurs et systèmes sonores
- Mannettes de jeux
-Scanner, camera et Webcam…

L'unité centrale
L'unité centrale contient la carte mère sur laquelle on trouve monté le microprocesseur et les
cartes d'extension, les disques durs et lecteurs de CD/DVD, l'alimentation du système et différents
connecteurs externes.
Les boîtiers qui contiennent toute l'unité centrale sont en fait bien différents et se différencient par
certains critères comme :

12
-La forme qui peut être AT, ATX, ATX 2, BTX ou ITX.
-Le boîtier possède plusieurs emplacements 3,5 pouces pour stocker les disques durs et lecteurs
de disquettes et des emplacements 5,25 pouces les CD/DVD (Mini-Tour :1, Moyen-Tour : 3,
Grand-Tour : 5).
-L'alimentation du PC est aussi contenue dans le boîtier.
-Sur quelques boîtiers, il existe même des ventilateurs devant les disques durs.
Enfin le boîtier contient les boutons permettant de faire marche /arrêt et reset du PC et des LEDs
d'indication de l'alimentation et du disque dur et un petit haut parleur.

Les microprocesseurs du PC
Le PC et ces compatibles ont toujours utilisé une architecture basée sur des microprocesseurs
Intel x86 et compatibles. Il existe plusieurs autres fabricants de microprocesseur pour PC dont le
principal est AMD.
Le microprocesseur du PC est monté dans un emplacement spécial sur la carte mère (parfois
plusieurs dans le cas de cartes mères multi-processeurs) prévus pour accueillir le
microprocesseur. On distingue deux catégories de supports :
• Slot: c'est un connecteur rectangulaire dans lequel on enfiche le microprocesseur
verticalement
• Socket: c'est un connecteur carré possédant un grand nombre de petits connecteurs sur
lequel le microprocesseur vient directement s'enficher.
Le microprocesseur rayonne thermiquement et il est nécessaire d'en dissiper la chaleur pour éviter
que ses circuits ne fondent. Pour cela, il est toujours surmonté d'un radiateur et généralement un
ventilateur aussi.
Les microprocesseurs de la famille Intel et compatible ont évolués avec le temps. On peut aussi
les classer en plusieurs générations. Ça commence par les microprocesseurs 8086,80286, i386 et
i486. Le Pentium inaugurait la génération P5, les Pentium II, III et Pro, la génération P6, les
Pentium 4, Pentium D et Xeon, la 7eme génération dite NetBurst, des Pentium M, au coeur de
Centrino, la 8eme génération est celle des versions Banias (Core Solo) et Yonah (Core Duo) et
enfin la génération core2. Dans les paragraphes suivants on va voir les principaux
microprocesseurs Intel et leur évolution.

Du 8086 au 486
Le 8088 (PC) utilise un bus de donnée interne de 16 bits, mais externe de 8 bits. Le 8086 (PC
XT), possédait un bus de données complètement sur 16 bits. Ça vitesse était de 5 MHz.
Le 80186 est pratiquement un 8086 mais avec des circuits supplémentaires intégrés comme un
générateur d'horloge 2 DMA et 3 timers ce qui fait de lui un véritable microcontrôleur mais le bus
reste 16 bits. En plus, ce microprocesseur n'a été utilisé dans les PCs que rarement.
Le microprocesseur 286 (de 8 à 16 Mhz), le bus de données reste à 16 bits. Ce microprocesseur
introduit le mode protected, ce qui permet aux systèmes d'exploitation de faire la gestion des
taches.
Avec le 386, l'architecture x86 devient finalement 32 bits. Le 386 fonctionne à 25 et 40 Mhz. Son
bus de données est de 32 bits en interne et en externe. Par exemple, au lieu de AX, BX, CX et DX
on trouve les registres EAX, EBX, ECX et EDX.
Ce microprocesseur utilise 3 modes de fonctionnement :
-Real Mode : le microprocesseur travaille comme un simple 8088, méthode identique au 286.
-Protected Mode : le microprocesseur peut utiliser toutes les possibilités des 80286, plus les
instructions spécifiques du 386 avec un adressage mémoire jusqu'à 4 GB
- Virtual Mode : émule plusieurs sessions de 8086.
Jusqu'au 486 il y avait un composant spécial pour le calcul en virgule flottante appelé le
coprocesseur mathématique (8087, 80387). Apres, avec le 486 le coprocesseur mathématique a

13
été implanté dans le microprocesseur (DX2). La vitesse débute à 33 Mhz et atteint 50 Mhz. La
tension d'alimentation n'est plus de 5 V, mais passe à 3,3V. À partir du 486, les microprocesseurs
utilisent deux vitesses, une vitesse interne d'exécution (vitesse de référence) et une vitesse externe
pour communiquer à travers les bus, appelée FSB (Front Side Bus). Durant la configuration
(BIOS) du PC, il faut utiliser des facteurs de multiplication entre la vitesse interne et du FSB.
La bande passante qui représente le nombre de bits transitant par le bus par seconde
(théoriquement) peut être déterminée par le produit de la largeur du bus, la fréquence d'horloge et
le nombre de transfert par cycle d'horloge. Par exemple, un bus FSB de 32 bits travaillant à
100MHz et effectue 4 transferts par cycle d'horloge a une bande passante de 1600 Mo/s.

Les Pentiums
Le Pentium est apparut en 1993 et evolura jusqu'à 1996. Sa principale nouvelle caractéristique est
l'implantation d'une mémoire cache interne L1 (de 8 Ko pour les programmes et 8 Ko pour les
données) directement dans le circuit du microprocesseur. La vitesse d'horloge passe de 60Mhz
jusqu'à 200MHz et la largeur de bus passe à 64. En 1997, Intel a rajoutée des instructions
supplémentaires pour le multimédia (MMX).
Le Pentium II améliore l'architecture P6 (apparue avec les Pentium pro) avec MMX. La mémoire
cache L2 est implanté directement sur le microprocesseur (pas sur la carte mère) et travaille à la
moitié de la fréquence interne du microprocesseur. Pour des raisons de coût, Intel sort le Celeron.
Ce microprocesseur n'inclut au départ pas de mémoire cache. Dans les derniers sortis, il est de
128K, mais est cadencé à la même vitesse que le microprocesseur.
Le Pentium III (1999-2001) améliore le PII et inclut le SSE (Streaming Simd Extension)
instructions multimédia supplémentaires. La fréquence passe à 450 MHZ et evolura ensuite
jusqu'à 1130 MHz avec un pipeline d'exécution de 10 étages.
Le Pentium 4 (P4), fabriqué de 2000 à 2007, fut cadencé, au début, entre 1,3 et 2,0 GHz
(Willamette). La fréquence élevée est obtenue, entre autres, par l'allongement du pipeline
d'exécution, qui passe à 20 étages. La deuxième version de P4 est Northwood avec toujours une
augmentation en nombre de pipeline (21 étages) et de cache L2 (512 Ko). Avec ce
microprocesseur, on trouve 3 versions et une fréquence qui monte jusqu'à 3,4 GHz, une fréquence
de bus jusqu'à 200 MHz et l'apparition du hyperthreading.
En 2004, avec le Prescott, Intel ajoute encore des étages de pipeline (31etage) avec des caches L1
de 16 Ko et L2 de 1Mo. La fréquence quant à elle monte jusqu'à 3,8 GHz selon la version. À
partir de ce moment, Intel utilise un nouveau système de numérotation pour P4 :
• série 3xx : Celeron D et Celeron M
• série 5xx : Pentium 4 avec 1 Mo de cache L2, de 2,66 à 3,8 GHz
• série 5x1 pour les versions avec Intel 64
• série 6xx : Pentium 4 avec 2 Mo de cache L2, de 3,0 à 3,8 GHz
o 6x1 pour les versions Cedar Mill
o 6x2 pour les versions avec Virtualization
• série 8xx : Pentium D avec 2*1 Mo de cache L2, de 2,66 à 3,2 GHz
• série 9xx : Pentium D avec 2*2 Mo de cache L2, de 2,8 à 3,6 GHz
• 7xx : Pentium M.

Le dual core ou quad core (et plus généralement le multicore) :


Depuis les premiers microprocesseurs, l'augmentation de la vitesse du microprocesseur est à la
base des gains de performances. Une autre façon d'augmenter les performances est d'utiliser
plusieurs microprocesseurs en parallèle (augmenter l'IPC). Cette opération est exploitée par la
technologie récente du dual core et consiste à mettre deux microprocesseurs en un seul circuit.
Avec le dual core on peut (en théorie) doubler les performances sans changer la fréquence.
Il existe plusieurs architectures dual core :

14
-Les premiers microprocesseurs Intel dual core sont les microprocesseurs Pentium D. Avec les
Pentium D les deux cores ont chacun leur propre mémoire cache. Il y a 2 Mo de mémoire cache
L2 au total mais chaque core ne peut utiliser que 1 Mo de mémoire. Les deux cores n'ont pas un
bus les reliant en interne. Le problème est que si les deux cores veulent dialoguer entre eux, ils
doivent passer par le bus principal (FSB) pour dialoguer.
- Pour résoudre le problème des Pentium D, Intel a innové avec l'architecture "Core" : (core2Duo,
core2Quad). Dans ces microprocesseur, le dialogue est possible entre les deux (ou 4) cores sans
passer par le FSB et la mémoire cache L2 est partagé entre les deux cores (Smart Cache). Si un
core a besoin de 4 Mo de cache L2 et que l'autre core n'en a pas besoin, tout le cache sera
utilisable par un seul des deux cores.
Enfin, il ne faut pas mélanger le nom commercial et l'architecture. Ainsi, même que les Pentium
D est appelé dual core, il n'est pas basé sur l'architecture core.

Les microprocesseurs 64 bits.


Un microprocesseur capable de lire des données et des instructions 64 bits est normalement plus
rapide qu'un microprocesseur 32 bits. Intel et AMD ont donc développé chacun des
microprocesseurs 64 bits. La philosophie est néanmoins différente. Intel a conçu un vrai
microprocesseur 64 bits, l'Itanium. Par contre, AMD a développé en parallèle 2 types de
microprocesseurs 64 bits, l'Athlon 64 bits et l'Opteron (spécifique serveur).
Le problème avec les microprocesseurs 64 bits est qu'ils utilisent des instructions 64 bits,
incompatibles avec les systèmes d'exploitation 32 bits. Un microprocesseur 64 bits ne peut donc
lire des instructions 32 bits et vis versa.

Présentation détaillée des caractéristiques des microprocesseurs Core


Puisque les machines récentes sont toutes à base de microprocesseur Core, on va voir ici, en
détail, les caractéristiques de ces microprocesseurs.
Le mot Core désigne l'ensemble des structures constituant un seul microprocesseur : unités de
décodages, de prédiction, d'exécution, cache L1, etc. mais Core2 est le nom commercial de
microprocesseur x86 basés sur l'Intel Core Architecture et l'Enhanced Intel Core Architecture.
Donc, "Intel Core 2 duo " n'est pas un microprocesseur précis mais toute une famille. Les
principales innovations qu'Intel a incorporée dans les microprocesseurs basés sur l'architecture
Core sont :
• Wide Dynamic Execution : qui est une combinaison de techniques permettant l'exécution
de plus d'instructions par cycle d'horloge. Le Core 2 Duo est capable d’aller chercher 5
instructions x86 par cycle dans le cache L1 en plus de 4 décodeurs (un complexe et trois
simples). Intel a ajouté les mécanismes de micro fusion et macro fusion pour plus
d'économie d'énergie. Par exemple, la macrofusion combine deux instructions x86 en une
seule. Ainsi, l'instruction de comparaison et de branchement conditionnel peuvent être
fusionnées (ce n'est pas le cas avec toutes les autres instructions). Par conséquence, un
seul microprocesseur à 4 cores, pourra chercher, dispatcher, exécuter et retourner jusqu'à
16 instructions simultanément.
• Advanced Digital Media Boost : Intel a élargi l’ensemble des bus de données à 128 bits et
a également doté son architecture Core d’une troisième unité SSE.
• Smart Memory Access : Le microprocesseur est capable d’adapter la quantité de cache
L2 de chaque core en fonction de la charge. Si l'un des deux cores demande l'accès à une
donnée en RAM, qui sera donc chargée dans le cache L2, cette donnée, stockée une seule
fois, sera immédiatement disponible pour le second core. Ceci permet de partager les
données entre les deux cores de façon extrêmement rapide et évite de dupliquer des
données. En plus Intel a introduit une technologie appelée Memory Disambiguation qui
détecte s’il y a des dépendances entre les opérations de lectures et écriture. Découpler ces

15
opérations quand cela est possible permet d'accélérer les traitements.
• Intelligent Power Capability : cette technique vise à réduire la consommation électrique
du microprocesseur. Il est ainsi possible de désactiver, même durant des périodes de
haute activité, des unités inutilisées grâce à un contrôle particulièrement fin de la
consommation (l'Advanced Power Gating). Par exemple, il est possible de désactiver les
unités de traitement en virgule flottante si le programme manipule exclusivement des
nombres entiers. Les bus aussi peuvent être divisés pour s’accommoder à la charge
courante. Enfin Intel a inclus plusieurs capteurs thermiques afin de couvrir toutes les
sources de chaleur potentielles. Par conséquent la consommation est très réduite.

L'introduction de l'architecture Core2 s'accompagne aussi par son propre système de


nomenclature. Il est composé de 5 caractères identifiant la puissance, la classe, la performance et
d'autres caractéristiques du microprocesseur. Un nombre élevé de puissance et de classe de
performance indique des caractéristiques plus élevées en ce qui concerne la mémoire Cache, la
fréquence d'horloge, le FSB, de nouvelles instructions, et autres technologies d'Intel.
Le premier caractère est une lettre désigne le TDP (Thermal Design Power) et par conséquent la
gamme auquel appartient le microprocesseur.

Numérotation Core Gamme TDP


QX Kentsfield, Yorkfield Core 2 Extreme 130 W
Q Kentsfield, Yorkfield Core 2 Quad 95 W
E Conroe, Wolfdale Core 2 Duo 65 W
X Penryn Core 2 Extreme 44 W
T Merom, Penryn Core 2 Duo - Centrino 35 W
(S)P Penryn Core 2 Duo - Centrino 25 W
(S)L Merom (L), Penryn (SL) Core 2 Duo LV - Centrino 17 W
(S)U Merom (U), Penryn (U, SU) Core 2 Duo uLV - Centrino 5,5 - 10 W

Les puissances > =65 sont pour les PC de bureaux et les autres sont pour les portables.
Le premier chiffre varie selon la gamme. Il désigne le FSB pour la gamme Core 2 Duo, la
quantité de cache L2 pour Centrino et il est constant pour la gamme Core 2 Quad. Par exemple
pour la gamme Core2Duo on a :

8umérotation Core FSB


E8x00 Wolfdale 1333
E7x00 Wolfdale 1066
E6x50 Conroe 1333
E6x00 Conroe 1066
E4x00 Conroe 800

Le deuxième chiffre définit la fréquence mais sans logique particulière et n'est comparable
qu'entre microprocesseurs commençant par la même lettre et le même premier chiffre exemple :
E6600 = 2,40 GHz et E6700 = 2,67 GHz mais T5600 = 1,83 GHz et T7600 = 2,33 GHz. Le
troisième et quatrième chiffres sont généralement zéro sauf dans des cas particulier et n'ont pas de
règles spécifiques.

La carte mère
L’élément essentiel d’un PC est le microprocesseur mais il y a aussi les circuits qui l'aident dans
son travail. Tous ces circuits sont reliés par la carte mère qui est le circuit imprimé principal du
PC. Toutes les composantes internes s'y rattachent : microprocesseur, mémoire, bus d'extensions,
etc. Elle comporte aussi des logements dans lesquels diverses adaptateurs et cartes d'extension

16
peuvent être insérés : carte graphique, carte son, carte réseau, modem, etc. La carte mère peut
aussi contenir ces mêmes cartes sous forme intégrée. La qualité des ces carte influe aussi sur les
performance du PC. Enfin il y a les ports AGP, PCI Express et les ports de la mémoire qui
peuvent déterminer la puissance du PC surtout dans les applications multimédia et les jeux.
La qualité de la carte mère est très importante pour le fonctionnement du PC. Puisque la carte
mère contient le plus grand nombre de circuits, elle peut donc causer le plus grand nombre
d'ennuis. En plus de ça, les performances du PC et sont évolutivité dépendent des caractéristiques
de la carte mère. Aujourd'hui, les circuits de la carte mère doivent au moins gérer le SATA, la
mémoire DDR1 2 et même 3 (en route) et l'USB 2.0.
Un circuit important de la carte mère est le chipset. C’est l’ensemble des circuits (intégrés dans
un seul chip) qui assistent le microprocesseur. Le chipset sert d'interface entre le microprocesseur
et ses périphériques (mémoire, entrées/sorties). Le chipset n'est généralement pas constitué d'un
seul circuit, mais de 8 pour les PCs anciens (avant Pentium) et de 2 ou 1 seulement dans les PC
modernes. Chez Intel, au contraire d'AMD et de ses partenaires, le chipset est toujours composé
de deux éléments : un Northbridge et un Southbridge.
• Le Northbridge est connecté directement au FSB. Un contrôleur de mémoire dans le
Northbridge sert de lien entre le microprocesseur et la mémoire ce qui donne au
microprocesseur un accès rapide à la mémoire. Le Northbridge connecte aussi le bus de
l'AGP ou le PCIexpress à la mémoire.
• Le Southbridge est moins rapide que le Northbridge et les données du microprocesseur
passent en premier par le Northbridge avant d'aller au Southbridge. Ceci fait que le
Southbridge gère les entrées/sorties comme le bus PCI et les ports USB ou les
connections du disque dur IDE ou SATA.
Le type de chipset utilisé par une carte mère influe considérablement sur les performances de
cette carte. C'est lui qui limitera les caractéristiques de la carte tels que la taille et la rapidité de la
mémoire cache, le type et la capacité de la mémoire principale, le type et le nombre de
microprocesseurs supportés, les types de bus supportés, etc. Les chipsets évoluent
continuellement et de nouveaux modèles apparaissent en permanence sur le marché. Il existe
aujourd'hui plusieurs types de chipsets pour cartes mères, une famille de chipset contient
généralement :
• Un contrôleur de bus local (AGP, PCI ...),
• Un contrôleur de mémoire cache,
• Un contrôleur de mémoire principale
• Un contrôleur pour la passerelle entre le bus PCI et le bus ISA
• Un contrôleur du bus USB, des ports IDE, ainsi que plusieurs autres circuits.
Le choix du chipset se fait aussi selon le microprocesseur parce que les fabricants les optimisent
pour un microprocesseur spécifique. Comme Intel est le premier fabriquant de microprocesseur,
elle contrôle naturellement les autres circuits lui permettant de fonctionner dans un PC. Ceci a fait
que Intel propose son premier chipset (82350) en 1989. Il y a aussi d'autres rares fabricants de
chipsets comme VIA, SIS ou NVIDIA.
Le fait que Intel (et AMD) monopolise la fabrication des microprocesseurs et des chipsets fait que
les constructeurs de cartes mères ne font que suivre ses consignes et choix. Ce qui fait aussi la
très grande ressemblance entre les cartes mères. En fait, les fabriquants utilisent le même
principe : un Northbridge adapté à chaque modèle de microprocesseur lié à des Southbridges
interchangeables suivant les périphériques souhaités.
Cette solution permet de ne développer qu'un seul circuit lorsque l'on change de caractéristique
pour un microprocesseur. De même, cette solution permet de fabriquer des cartes mères de
différentes gammes en utilisant différents modèles de Southbridges. Enfin, le chipset est soudé
sur la carte mère et ne peut pas être enlevé. Ce qui fait qu'une carte mère est fabriquée pour
fonctionner avec un microprocesseur spécifique.

17
La figure suivante présente un exemple de chipset moderne le P45. Il est constitué de 2 circuits.
• Le Northbridge que Intel appelle MCH (Memory Controller Hub). Le MCH garantie trois
canaux à très haute bande passante : de 10.6 Go/S ente le MCH et le microprocesseur
(FSB), 16 Go/s entre le MCH et la carte graphique (PCI express 2) et de 6.4 (DDR2) ou
8.5 (DDR3) entre le MCH et la mémoire.
• Le Southbridge que Intel appel ICH (I/O Controller Hub). Le ICH a aussi plusieurs
canaux à une bande passant moins importante : il y a 6 ports SATA de 3Go/s, 6 ports PCI
express 1 de 500Mo/s chacun, 12 ports USB 2.0 avec 480 Mo/s. l'ICH permet aussi
d'autres fonctions comme l'audio intégré et l'interface avec le BIOS et le réseau.

Le BIOS
BIOS veut dire Basic Input/Output System, dans un PC, c'est l'ensemble des petits programmes
qui se charge de tester le PC à son démarrage, lance le système d'exploitation et assure le transfert
de quelques données comme la date et l'heure dans le système. Lorsque le PC démarre, le
microprocesseur va d'abord lire le BIOS. Ceci va lui permettre de démarrer les autres circuits
électroniques. Il lit ensuite le SETUP, la partie programmable par l'utilisateur du BIOS. Les
paramètres de configuration sont sauvegardés dans une mémoire, si cette mémoire est effacée
(pile déchargée), la configuration revient à son mode par défaut. Ceci entraîne dans les anciens
PCs, que le système ne détecte pas les périphériques (disque dur, ...). Dans les PC modernes, la
mémoire ROM utilisée par le setup est remplacée par une EEPROM. La pile n'est donc plus
nécessaire pour la sauvegarde des données mais elle reste nécessaire pour maintenir le temps.

18
L'alimentation
L'alimentation du PC est une alimentation à découpage qui est commandée par la carte mère
(ATX). Elle alimente (à travers des fiches) en plus de la carte mère toutes les cartes, tous les
disques CD ou DVD et aussi les périphériques externes connectés via le port USB. Notez enfin
que sur un portable l'alimentation est fournie soit par une batterie rechargeable (autonomie
réduite), soit par le secteur à travers un adaptateur.
La figure suivante montre une fiche d'alimentation de la carte mère. On peut voir qu'une
alimentation de PC délivre 3 tensions principales : +12V, +5V et +3,3V nécessaires au
fonctionnement des divers éléments du PC. Elle délivre aussi des tensions négatives : -12V, -5V,
et -3,3V qui ne consomment pas beaucoup de puissance.

La mémoire du PC
La mémoire centrale du PC est composée en particulier de RAM dynamiques nommées SDRAM.
Depuis 2004, les PC sont tous équipés de DDR SDRAM. La SDRAM (synchronous dynamic
random access memory) est apparue en 1997. Elle permet une lecture des données synchronisée
avec le bus de la carte mère, les précédentes étaient asynchrones. La SDRAM permet donc de
supprimer les temps d'attente dus à la synchronisation avec la carte mère et permet d'avoir des
temps d'accès de 10 nanosecondes. On peut trouver 3 versions : PC 66 (peut fonctionner à 66
MHz), PC 100 (100 MHz) et PC 133 (133 MHz). La DDR (Double Data Rate) par contre est une
variante de la SDRAM. Qui a permis de doubler le taux de transfert. On peut trouver la PC 1600
qui fonctionne à 100 MHz, ce qui permet d'atteindre les 200 MHz comparé à de la SDRAM. PC
2100 (133 MHz, ce qui permet d'atteindre 266 MHz), PC 2700 (166 MHz), PC 3200 (200 MHz),
PC 3500 (217 MHz) et PC 4000 (250 MHz). La DDR-2 double les taux de transferts par rapport à
la DDR. On peut trouver la DDR 2 400/PC2-3200 : (200 MHz en externe et 100 MHz en interne).
DDR 2 533/PC2-4200, DDR 2 667/PC2-5300, DDR 2 800/PC2-6400, DDR 2 1067/PC2
(533MHz). Récemment la DDR3 est apparue pour fonctionner à des fréquences plus élevées que
la DDR2 puisqu'il est question de fréquences de 1066 MHz, 1333 MHz et même 1600 MHz.
Alors que la tension d'alimentation de la DDR est de 2,5v, celle de la DDR2 s'établit à 1,8v alors
que l'on tombe à 1,5v pour la DDR3.

19
Organisation logique de la mémoire du PC
Le 8086 divise la mémoire en segments de 64Koctets puisque la taille maximale de ses registres
est de 16 bits. Ainsi l’adresse d’un octet est définie par l’addition d’un segment et d’un offset,
tous deux de 16 bits. L'adresse segment est décalée de 4 bits avant l’addition pour obtenir une
adresse physique de 20 bits
En plus de ce model appelé réel, qui a été maintenu pour des raisons de compatibilité, un mode
dit protégé (protected) a été introduit avec le 80286, avec ces 4 niveaux de privilèges d’accès, qui
permet de protéger les données. En mode protégé on peut accéder aux 24 bits du bus, pour avoir
un espace mémoire de 16 Méga-octets. Dans ce mode, l’adresse virtuelle se compose de l’adresse
d’un descripteur de segment dans une table et d’un offset. L’emplacement des tables de
descripteurs de segment est repéré par des registres spéciaux. Pour le 386, 486, Pentium et autres
on a 32 bits et comme l’espace mémoire est désormais de 4 gigaoctets, un nouveau mode
d’adressage a été introduit dit mode virtuel. Un descripteur de segment contient l’adresse de
début du segment sur 32 bits, sa longueur sur 32 bits (en blocs de 4 Ko) ainsi que ses droits
d’accès. L’adresse virtuelle est obtenue en additionnant l’adresse de début du segment et l'offset
(32 bits) tout en vérifiant que ce déplacement ne dépasse pas la taille du segment. L’adresse
résultante se retrouve sur 32 bits.
Maintenant, les systèmes d'exploitations Linux et Windows (à partir de Windows 95) utilisent un
mode protégé appelé mode plat (flat) dans lequel tous les segments sont superposés et de taille
maximale (4 Go).

Mémoire cache
Le concept de mémoire cache est utilisé pour accélérer l'accès aux informations représentant les
instructions et les données sur lesquelles le microprocesseur travail (réduire le temps d’accès). Il
consiste à intégrer dans le microprocesseur ou à son voisinage immédiat, c'est à dire dans le
même boîtier, une certaine quantité de mémoire dans laquelle seront stockées ces informations.
Le microprocesseur perdra ainsi moins de temps à aller les chercher. A partir des Pentium, on a 2
niveau de cache : d'une part, une mémoire cache appelée niveau 2 (L2) réalisée indépendamment
de la puce du microprocesseur mais intégrée dans le même boîtier et communiquant avec le
microprocesseur par un bus optimisé. Cette mémoire peut être de plusieurs Mo, et d'autre part,
une mémoire cache appelée niveau 1 (L1) plus petite mais intégrée directement dans la puce du
microprocesseur et donc d'accès infiniment plus rapide. Sa taille est seulement de quelques Ko.
On trouve ainsi dans L1 les informations les plus pertinentes et dans L2 celles qui servent
beaucoup mais quand même un peu moins. Le système de cache permet aussi d'améliorer le
parallélisme du microprocesseur en permettant le chargement d'une instruction pendant que le
microprocesseur traite la précédente. Enfin, dans les microprocesseur à double core2Duo, on
dispose de 3 caches : deux L1 et un L2.

Les cartes d'extension


En plus de la carte mère, le PC contient un nombre de cartes supplémentaires gérants les entrées
/sorties on va les voir ici en détail.

*La carte graphique (vidéo)


Cette carte d'adaptation permet de convertir des données numériques en données pouvant être
affichées sur un écran. La carte graphique possède deux modes distincts : texte et graphique. Les
caractères sont affichés en mode texte selon une matrice fixe de points, alors qu'en mode
graphique, une image est formée pixel par pixel. Pour afficher un caractère, le microprocesseur
envoi (sauvegarder le code du caractère mémoire vidéo) un code au circuit contrôleur d’écran
(CRTC) et c’est le générateur de caractères de ce dernier qui va convertir ce code en un ensemble
de pixels à afficher. En mode graphique, la mémoire vidéo est lue directement et c’est le

20
microprocesseur qui vient écrire directement dans cette mémoire les valeurs des pixels des
images à afficher.
Une carte graphique est composée de quatre éléments principaux :
• Le GPU (Graphical processing unit) : c'est le microprocesseur central de la carte
graphique. C'est lui qui soulage le microprocesseur central du PC. Les performances
d'une carte graphique dépendent en grande partie du GPU.
• Le RAMDAC (Random access memory digital analog converter) : ce circuit est destinée
à convertir les données numériques en données analogiques. La fréquence du RAMDAC
nous renseigne sur le nombre maximal d'images par seconde que la carte peut afficher au
maximum.
• La mémoire vidéo : elle est utilisée pour stocker les textures les images à afficher.

La plupart des cartes graphiques se placent sur les ports AGP (Accelerated Graphic Port) et PCI
Express. Le port AGP est apparu avec le Pentium II. On différencie trois normes d'AGP : AGP
2X (500 Mo/s), AGP 4X (1 Go/s), AGP 8X (2 Go/s). Le PCI Express est la norme qui a
désormais remplacé l'AGP. Le bus PCI express est un bus série, chaque "X" signifie que le bus
peut transporter 250 Mo/s de données. Il existe différentes vitesses et différents ports associés
pour le PCI express : Le PCI Express 1X : 250 Mo/s (presque le double de celle du bus PCI), Le
PCI Express 2X : 500 Mo/s, Le PCI Express 4X : 1 Go/s, Le PCI Express 8X : 2 Go/s, Le PCI
Express 16X : 4 Go/s (le double de celle de l'AGP 8X). Enfin, il faut noter que beaucoup de
cartes mères contiennent des cartes graphiques intégrées.

*La carte son


Cette carte d'adaptation permet de convertir des données numériques en sons audibles. Elle a
plusieurs connecteurs pour relier des écouteurs ou haut-parleurs. Une carte son permet aussi de
faire l'inverse, c'est-à-dire enregistrer des sons externes à travers une ligne d'entrée ou un
microphone. Une carte son va généralement occuper un port, une interruption et un canal DMA.
Maintenant, ils sont généralement intégrés dans la carte mère.

*Le modem
Le modem (Modulateur/Démodulateur) permet de communiquer par le réseau téléphonique par la
conversion des données numériques PC en données analogiques à transmettre par la ligne
téléphonique (moduler) et inversement (démoduler). On caractérise un modem par :
-Sa vitesse exprimée en Kilo bits par seconde (exemple 64 ko /s).
-modem interne (format PCI, AMR, CNR), ou modem externe. Dans ce dernier cas, son interface
peut être USB, série ou même Ethernet
- La norme : il y a plusieurs normes qui ont apparus durant l'amélioration successive des modems.
Par exemple, V90 (56600 bits par seconde en réception et 33600 en émission).
Précisons enfin, l'apparition de la technologie ADSL avec ces propres modems avec un débit qui
peut atteindre 8Mb/s.

*La carte réseau


La carte réseau permet de relier le PC à un réseau local. Son rôle est, d'une part, le codage en
émission et le décodage en réception et, d'autre part, l'identification de la liaison (adresse MAC).
La majorité des cartes réseau sur PC sont Ethernet qui est aujourd'hui le standard le plus répandu
pour la connexion à un réseau local. La carte Ethernet standard en 1995 était basée sur le
protocole 10baseT (connexion via paire torsadée) ou 10base2 (coaxial), c'est à dire qu'elle
impliquait une transmission à 10Mbps. Apres, le 100baseT est apparut qui exploite 2 paires de
câbles torsadés (d'un câble Category-5 qui en comporte 4 le plus souvent) l'une dans un sens et
l'autre dans l'autre pour atteindre 100Mbps. Le nouveau protocole 1000baseT, permet sans

21
changer le câblage d'atteindre 1 Gbps en exploitant simultanément les 4 paires torsadées de
manière bidirectionnelle (full duplex). Chaque transmetteur travaille à 250Mbps en mode full
duplex, ce qui oblige évidemment à concevoir une architecture de carte un peu plus complexe.

Les Disques
Un PC peut évidemment fonctionner sans disque, mais il ne peut pas faire grand-chose. Les
diffèrent types de disques constituent la mémoire de masse du PC. Ils contiennent le système
d'exploitation et les programmes et données de l'utilisateur du PC. On va voir ici les différents
types de disque que contient un PC et leurs propriétés.

*Disque Dur
Un disque dur (hard disk HD) est constitué de plusieurs disques rigides en métal, verre ou en
céramique appelés plateaux et empilés les uns sur les autres avec une très faible distance d'écart.
Les plateaux tournent autour d'un axe (entre 4000 et 15000 tours par minute) dans le sens inverse
des aiguilles d'une montre.

Les données sont stockées sur le disque dur sous forme analogique (modulation) sur une couche
magnétique très fine. Un DSP (digital signal processor) se charge de la conversion des données
analogiques en données numériques (démodulation).
La lecture et l'écriture se font grâce à des têtes de lecture/écriture situées de part et d'autre de
chacun des plateaux et fixées sur un axe. Ces têtes sont en fait des électroaimants qui se baissent
et se soulèvent (elles ne sont qu'à 15 microns de la surface, séparées par une couche d'air
provoquée par la rotation des plateaux) pour pouvoir lire l'information ou l'écrire. Cependant, les
têtes se déplacent ensembles et seulement une tête peut lire ou écrire à un moment donné. Un
cylindre correspond donc à l'ensemble des données situées sur une même colonne parmi tous les
plateaux. L'ensemble est contenu dans un boîtier totalement hermétique, car la moindre particule
peut détériorer l'état de surface du disque dur. Les données d'un disque dur sont inscrites sur des
pistes disposées en cercles concentriques autour de l'axe de rotation. Leur nombre varie en
fonction du type de matériaux utilisés pour les plateaux et la couche magnétique.
Logiquement, le disque dur est organisé en plateaux, cylindres et secteurs. On appelle cylindre
l'ensemble des pistes réparties sur les faces de chaque plateau et situées à la même distance de
l'axe de rotation. Chaque piste est numérotée. La numérotation débute par 0 et commence à

22
l'extérieur du plateau. Les pistes sont à leur tour divisées en portions appelées secteurs. La
numérotation des secteurs, elle, débute à 1. L'adresse sera du type : Plateau 1 face intérieure,
Cylindre (piste) 4, secteur 12. On appelle cluster, la zone minimale que peut occuper un fichier
sur le disque (un ou plusieurs secteurs).
Un disque dur se différencie par :
- la capacité : elle indique la quantité de données que le disque dur peut contenir. Aujourd'hui, on
l'exprime en Go ou en To (Téra Octets). Un disque de 160 Go est un minimum aujourd'hui.
-La vitesse de rotation : Quand on dit qu'un disque tourne à 5400 trs/min on parle de vitesse
angulaire, cette vitesse est par définition constante. Par contre la vitesse linéaire varie en
permanence en fonction de la position des têtes de lecture/écriture du disque par rapport à son
centre. Vitesse de rotation : mesurée en tours/minute. On peut trouver des vitesses qui varient de
5400 tours/minute à 7200 et même à 10000 tours pour disques durs SATA.

- Temps d'accès : C'est le temps moyen que mettent les têtes de lecture pour trouver les
informations. Il est défini comme suit : Temps d'accès = Temps de latence + Temps d'accès aux
données. Le temps de latence dépend uniquement de la vitesse de rotation du disque, puisqu'il
représente le temps nécessaire pour trouver des données suite à un changement de piste. Un
temps d'accès typique est inférieur à 12 ms.
-L'interface, IDE, SCSI ou SATA
Il existe trois interfaces pour disques durs : l'interface IDE, SATA et SCSI.

*L'interface IDE : c'est une interface parallèle (utilise 80 fils) qui permet de connecter jusqu'à 4
unités simultanément (disque dur, lecteur CD, etc...). Les dernières versions de l'IDE (UDMA
133) peuvent atteindre 133 Mo/s au maximum.
Spécificités de L'IDE :
• Vitesse de rotation maximale : 7200 tours.
• Taux de transfert Maximum : 133 Mo par seconde.
• Taux de transfert jusqu'à 60 Mo par seconde pour le disque le plus rapide
• Temps d'accès de 8 ms pour le disque le plus rapide.
L'avantage des disques durs IDE est qu'ils coûtent bien moins cher à capacité égale que leurs
homologues SCSI. Leur principal inconvénient est l'instabilité de leur taux de transfert et leur
temps d'accès bien trop important, ce qui limite leurs performances.

23
*L'interface SATA (Serial ATA) : c'est une évolution de l'IDE. La transmission des données se
fait par un bus série et non pas parallèle, ce qui fait que le SATA utilise des connecteurs plus fins
que l'IDE (4 fils, cependant le connecteur en comporte 7). Aujourd'hui presque tous les chipsets
modernes intègrent un contrôleur SATA. La bande passante est de 150 Mo/s, et même 300 Mo/s.
Le SATA dispose cependant de nombreux avantages :
• 7 Fils seulement permettent de communiquer avec un disque dur.
• Les disques durs peuvent être branchés et débranchés à chaud (hot plug).
• Chaque disque est connecté sur un port SATA et il n'y a pas de maître et esclave.
• Les disques IDE peuvent être connectés à l'interface SATA via un adaptateur.
*L'interface SCSI :
Le SCSI est une interface qui permet la prise en charge d'un nombre plus important d'unités
(disques durs, CD-ROM, scanner etc...). Un adaptateur SCSI est une carte à mettre sur un
emplacement PCI qui se charge de la gestion et du transfert des données. Le microprocesseur ne
fait que dialoguer avec la carte SCSI. D'autre part, le SCSI peut gérer jusqu'à 7 périphériques au
lieu de 4 pour l'IDE. Le SCSI ne communique pas par le schéma maître esclave mais par des
numéros différents attribués à chacun des périphériques. Il faut ensuite fermer la chaîne par une
"prise", pour indiquer à la carte qu'il n'y a plus de périphérique connecté. Le debit SCSI actuel est
de l'ordre de 320 Mo/s (Ultra320 SCSI).

Récemment, on vu l'introduction des disques durs USB externes et qui peuvent être portables ou
servir pour le stockage. Notons enfin l'existence des disquettes souples que l'on peut introduire
dans un lecteur spécial de disquettes. Ces lecteurs sont de moins en moins utilisés et tendent à
disparaître.

Introduction à la technologie RAID


RAID (Redundant Array of Independent Disks) est une méthode de stockage dans laquelle les
données sont distribuées sur un groupe de disques qui fonctionnent comme une seule unité de
stockage. La redondance permet la protection des données contre la perte en cas de panne. Cette
méthode est largement utilisée sur les serveurs où l'accès aux données et leurs récupération sont
très important même en cas de pannes. Sur un PC, quand on dispose de plus de 2 disques durs on
peut utiliser le RAID sur certaines cartes mères. Il existe plusieurs modes ou niveau RAID parmi
lesquels :
-Le mode RAID 0 : on peut lire et écrire sur les deux (ou plus) disques en même temps. On
disposera de toute la taille des deux disques avec ce mode. Par contre, si un disque tombe en
panne, toutes les données sont perdues.
-Le mode RAID 1 : toutes les données envoyé au disque sont dupliquées sur les autres. On n'a
que la capacité d'un disque sur les deux. Mais l'avantage est que si un des disques tombe en
panne, il n'y a pas de perte de données.

CD/DVD

Le CD (Compact Disc) est un moyen de stockage qui utilise l'enregistrement optique et non
magnétique. Physiquement c'est un disque en plastique (polycarbonate) 12 cm de diamètre et de
1.2 mm d'épaisseur qui permet de stocker jusqu à 800 Mo.
Le DVD (Digital Versatile Disc) est en fait un CD avec une plus grande capacité. Un DVD
simple face 1 couche peut stocker 4.7 Go et un DVD simple face 2 couches peut stocker 8.5Go.
Enfin, il faut noter l'existence de nouveaux DVD Blueray et HD DVD qui ont une capacité plus
importante.
Le PC contient un lecteur CD/DVD qui permet la lecture ou la gravure des CD et DVD. Le
lecteur dispose d'une tête de lecture optique laser et d'un mécanisme qui la déplace sur la surface

24
du CD/DVD pour lire. Le plastique laisse passer la lumière émise par le laser lors de la lecture.
On trouve ensuite une couche métallique réfléchissante très souvent en aluminium qui va
réfléchir la lumière émise par le laser. En traversant la couche plastique, le faisceau laser
rencontre ou non des creux et des bosses qui diffusent différemment la lumière. Le passage d'un
creux à une bosse ou d'une bosse à un creux représente un 1 en binaire. Le reste représente un 0.
A noter que contrairement aux disques durs, un CD n'a qu'une seule piste organisée en spirale. La
lecture se fait à vitesse de rotation angulaire constante, ce qui fait que l'on a une faible densité de
données sur la périphérie du disque et une forte densité au centre du disque. De cette manière, les
débits sont les mêmes au centre et à la périphérie du disque.
Il existe aussi des CD et DVD recordables que l'on grave avec le PC. Lorsqu'on grave un CD
recordable, on ne déforme pas physiquement le disque, mais il y a une couche spéciale placée
entre le polycarbonate et la couche métallique, elle est constituée d'un colorant organique qui
donne la teinte du disque, généralement verte ou bleue. Ce colorant est photosensible. Lorsque le
laser atteint cette couche, elle brûle localement à plus de 250°. On obtient au final des zones
brûlées et non brûlées. Enfin, il y a deux méthodes d'écriture :
Monosession : Cette méthode crée une seule session sur le disque et ne donne pas la possibilité de
rajouter des données sur le CD.
Multisession : Cette méthode permet de graver un CD en plusieurs fois, en créant une table de
contenu de 14Mo pour chacune des sessions.
Les caractéristiques d'un lecteur de CD sont :
-L'interface qui peut être IDE ou SCSI
-La vitesse de lecture, de réécriture et de gravure exprimée en X. La vitesse se mesure en X : 1 X
est égale à 1.38 Mo/s pour le DVD et 150 Ko/s pour le CD. Un lecteur 16x lira donc un DVD à
22 Mo/s. Un graveur 40 / 12 / 48 grave les CD-ROM à 40X, réécrit les CD à 12 X et lit les CD à
48X.
-Le temps d'accès exprimé en millisecondes. C'est le temps mis par le lecteur à passer d'une partie
à une autre du CD.

Les connecteurs
Sur un PC il y a un nombre de connecteurs vu de l'extérieur et qui permettent de relier des
périphériques au PC.
1. Souri et Clavier : les connecteurs utilisés actuellement pour ces deux périphériques sont de
type PS/2. Il y a aussi des claviers et des souries qui utilisent le port USB.

2. USB (Universal serial bus) : Le bus USB est un bus série synchrone. Il est plug and play et
supporte les connexions/déconnexions à chaud. Il supporte 3 vitesses de transmissions qui
peuvent cohabiter.
- Basse vitesse 1,5 Mb/s pour les appareils interactifs tels que clavier, souris, joystick,...
- Pleine vitesse 12 Mb/s pour des appareils à gros débits tels que modem, téléphone, ...

25
- Haute vitesse 480 Mb/s pour des appareils multimédia tels que caméscope.
Il y a 2 versions de la norme USB : 1.1 et 2.0. La version 2.0 ajoute essentiellement la haute
vitesse. La version 3.0 encore plus rapide est en route.
Le câble USB comporte une ligne d'alimentation Vbus (+5V) et une ligne masse : ainsi certains
périphériques pourront être directement alimentés par le PC. Les connecteurs sont
mécaniquement différents aux deux extrémités afin d'éviter une erreur de connexion. La longueur
du câble peut atteindre plusieurs mètres.
Les transmissions se font à l'aide d'un protocole à jeton. Les jetons et les paquets de données
prennent place dans des trames d'une durée de 1 milliseconde. En haute vitesse les micro trames
durent 125 microsecondes. Le bus est entièrement contrôlé par un hôte unique (le PC) et plusieurs
niveaux de hubs peuvent être utilisés sur lesquels se connectent les appareils au nombre
maximum de 127. A la connexion d'un appareil, l'hôte l'identifie et lui assigne une adresse unique
: c'est la phase d'énumération. L'hôte attribue également la bande passante en fonction des types
de transfert requis par les appareils.

3. FireWire c'est bus d'entrée et sortie sériel a grande vitesse. Il a été développé par Apple puis
standardisé par IEEE sous le nom de IEEE 1394a. Le port IEEE 1394a utilise 4 ou 6 broches et
permet de relier le PC vers des périphériques comme l'imprimante ou le scanner mais également
aux équipements électroniques audio et vidéo.

4. port série (Com) et parallèle (LPT)


Sur les PC anciens, on trouve un ou plusieurs connecteurs à 9 bloches (DB9) pour la
communication série ou à 25 broches (DB25) pour la communication parallèle entre le PC et les
périphériques. Le port parallèle est particulièrement utilisé par l'imprimante par contre le port
série est utilisé par les modems. Le port série est aussi largement utilisé pour la configuration des
routeurs de réseaux et mêmes quelques équipements électroniques.

Comme exemple réelle d'une carte mère qui utilise le chipset P45, on voit sur les figures
suivantes les connections des circuits et leurs positions sur la carte mère GA-EP45T-DS3R/DS3
de la société GIGABYTE.

26
27
Sur cette carte mère, le microprocesseur sera monté sur le socket LGA775 (Core2xxx). Un
connecteur est aussi prévu pour relier le ventilateur (Fan) du microprocesseur. Il y a des
connecteurs de l'alimentation ATX, les connecteurs SATA, IDE et FDD (disquette). La plus
grande partie de la carte mère est dominée par les slots d'extension PCI et PCI express dont un est
réservé pour la carte graphique. On voit aussi au centre les circuits de BIOS et la pile qui permet à
l'horloge temps réel de continuer son fonctionnement même lorsque le PC est éteint.
Au centre, on voit les connecteurs audio et le circuit de Codec est un peu loin. Un autre system
intégré sur la carte mère est le contrôleur de réseaux Ethernet. Il y a aussi les connecteurs et les

28
circuits nécessaires pour les bus USB et FireWire. La figure suivante montre les connecteurs
externes qui sont aussi montés sur la carte mère. Il y a les PS/2 pour la souri et le clavier (a), les
connecteur audio (g,h,i,j,k,l), les connecteurs USB(e), le Firewire(d) et le connecteur RJ 45 pour
le réseau. Il faut remarquer qu'il n'y a plus de ports parallèles sur cette carte mère très moderne.

29
Les principaux périphériques
*Ecran
Un écran (moniteur) est nécessaire pour la communication entre l'utilisateur et l'ordinateur. Mais
il n'est pas forcément indispensable (les serveurs n'en disposent généralement pas). L'écran peut
être de type CRT (Cathode Ray Tube) avec un tube cathodique encombrant. Récemment les
écrans sont devenus plats LCD (Liquid Crystal Display).Les caractéristiques importante d'un
écran de PC sont :
-La résolution : c'est le nombre de pixels que l'écran peut afficher, ce nombre de pixels est
généralement compris entre 640 points en longueur et 480 points en largeur (640x480) et
1600x1200. Le nombre de couleurs affichées dépend lui de la carte graphique. Il varie de 16
couleurs (codage 4 bits), 256 et 65.536 couleurs et enfin 16,7 millions de couleurs au maximum
(codage sur 24 bits), limite au-delà du quel l'oeil humain ne discerne plus de nuances.
-La taille : Elle se mesure par la diagonale de l'écran et est exprimée en pouces (2.54 cm).
-La fréquence de rafraîchissement : Elle représente le nombre d'images affichées par seconde.
Elle est exprimée en Hertz (60, 75 Hz ou plus).

*Clavier
La fonction principale du clavier est comme périphérique d'entrée relier au PS/2. Il permet la
saisie de texte, la communication avec le système d'exploitation et d'autres taches (jeux).
Les claviers ont des touches qui diffèrent selon le système d'exploitation et selon le constructeur
(AZERTY, QWERTY…). La plupart des claviers ont entre 80 et 110 touches qui comportent :
- Des touches alphabétiques pour écrire du texte.
- Un pavé numérique pour écrire des nombres et faire les calculs
- Des touches de fonctions (F1 à F12)
- Des touches de contrôle (sur PC : CTRL, SHIFT, ALT…)
En appuyant sur une touche du clavier, le microprocesseur du clavier analyse une matrice de
touche et détermine le code du caractère à envoyer vers le PC (code ASCII). Ces information sont
au début maintenus dans une petite mémoire de clavier (buffer) et ensuite envoyées au PC.

*Imprimantes
L'imprimante est un périphérique de sortie qui permet de produire sur papier des données. On
peut l'utiliser pour imprimer des textes en noir ou même des photos en couleurs.
Il en existe plusieurs types dont les plus courants :
- L'imprimante à jet d'encre
- L'imprimante laser
- L'imprimante matricielle (pratiquement disparues)
On caractérise une imprimante par :
- Son type : jet d'encre, matricielle ou laser.
- Sa vitesse d'impression en pages par minute
- Sa résolution exprimé en DPI (dot per Inch).

Démarrage du PC
On va voir maintenant que qui se passe lorsqu'on allume un PC. Le PC passe par une opération
qui le prépare pour l'utilisation; cette opération s'appelle le BOOT. Une session de travail avec un
PC commence par l'appui sur la touche "ON" (ou Reset si le PC fonctionne déjà). A ce moment
une opération de reset est effectuée qui fait que le microprocesseur charge dans ces registres une
adresse spécifique (0000:FFFF). Dans un PC cette adresse pointe sur le début des programmes de
BIOS. Le premier programme que le bios exécute s'appelle le POST (power-on self-test). Le

30
POST se charge de vérifier le bon fonctionnement des circuits et périphériques du PC. Il vérifie
ainsi la mémoire, la carte graphique, le clavier et même la présence des disques.
Il y a deux types de boot : à froid (ON) et à chaud (RESET ou CTRL+ALT+DEL). Si le boot est
à chaud (vérifie la présence de la valeur 1234h à l'adresse 0000:0472, si c'est une autre valeur
c'est un boot froid) le POST vérifie seulement la carte graphique et passe le reste. Si le boot est à
froid, il vérifie ensuite la RAM par une opération d'écriture puis lecture de toutes les adresses de
la RAM. Il vérifie ensuite le clavier et la souri. Il cherche après les bus PCI et si il en trouve il
vérifie les cartes installées. Si le POST trouve des erreurs (matérielles), il le signal par une série
des beeps ou un message sur l'écran. Si le problème est trouvé avant que la carte graphique soit
fonctionnelle, il est signalé par un message en bips. Si par contre, il est trouvé après, un message
sera affiché sur l'écran.
Apres le POST, le BIOS affiche une série d'informations sur le PC comme : le type de carte
graphique, la version du BIOS, le microprocesseur, la mémoire, le disque dur.
Le BIOS et le Setup vont signaler au microprocesseur quel disque dur, lecteur CD ou disquette il
doit d'abord lire pour vérifier si le système d'exploitation est présent. Si oui, il va démarrer sur ce
support. Si non, il va vérifier sur le suivant, et ainsi de suite. Le système d'exploitation et les
programmes sont généralement installés sur le disque dur. Mais avec l'avènement des systèmes
d'exploitation LIVE et les programmes portables, même un CD/DVD peut être utilisé pour le
démarrage et l'exécution des programmes. Une fois démarré, le système d'exploitation va charger
en mémoire les logiciels spécifiques, des fichiers d'initiation spécifiques au logiciels et
configurations et des pilotes. Ces pilotes sont des programmes utilitaires qui permettent au
système d'exploitation de gérer des périphériques spécifiques.
L'installation logicielle d'un ordinateur consiste donc dans l'ordre à :
1. Paramétrer le Setup. Ceci peut être évité dans les PC modernes, le Setup propose généralement
un paramétrage par défaut et des détections automatiques.
2. Préparer le disque dur pour recevoir les informations (Fdisk et Format, Mkfs…). Ces
commandes ou mêmes des programmes plus évolué se trouvent dans les CD/DVD d'installation
du système d'exploitation.
3. Installer Windows (ou linux) sur le disque dur via un CD/DVD d'installation.
4. Installer les pilotes spécifiques au PC (carte graphique, carte son, modem, ...)
5. Installer les logiciels utilisateurs (traitement de texte, tableur, environnement de développent de
programmes, ...).

31
Chapitre 3 : Systèmes d’exploitations
Introduction
Un ordinateur est constitué de hard et de soft. Pour que cet ensemble fonctionne, il faut que
quelque chose dans l’ordinateur permette la communication entre les utilisateurs et la machine.
Ce rôle est assuré par le système d’exploitation (Operating System OS), de l’ordinateur. C'est un
ensemble de programmes qui se charge de la gestion des ressources de l'ordinateur (soft et hard),
d’assurer ces fonctionnalités de communication et d’interface avec l’utilisateur et la liaison entre
les ressources matérielles d’un ordinateur et l’utilisateur et ces applications. Prendre en compte le
fonctionnement du réseau est une tache parmi les plus importantes des OS et on trouve
d'aujourd'hui des OS entièrement orientés réseaux.

Les types de systèmes d'exploitation de PC


Les OS ont subi une évolution parallèle à celle des architectures matérielles. On peut dire qu’il y
a quatre types d’OS différents.
-MONOPROGRAMMATION : un seul utilisateur est présent et a accès à toutes les ressources de
la machine tout le temps et l’OS ne permet l'exécution que d'un seul programme à la fois.
-MULTIPROGRAMMATION : Dans ce système, plusieurs utilisateurs peuvent être présents en
"même temps" dans la machine et se partagent les ressources. Les programmes se voient affecter
une priorité qui permettra à l’OS selon les niveaux de priorité, de traiter certains programmes plus
complètement ou plus souvent que d’autres.
-TEMPS-PARTAGE : c'est une amélioration de la multiprogrammation où le système organise
ses tables d’utilisateurs sous forme de files d’attente. L’objectif majeur est de connecter des
utilisateurs directement sur la machine et donc d’optimiser les temps d’attente de l’OS.
-VIRTUALISATION : Dans un système de virtualisation, le matériel assure que plusieurs OS
peuvent être présents en "même temps" dans la machine et se partagent les ressources pendant
tout leur temps d’exécution.
Un système d’exploitation est pricipalement composé de 4 couches :
• Un noyau ;
• Des bibliothèques ;
• Une interface avec l'utilisateur
• Un ensemble d’outils système ;

Le noyau de l'OS (Kernel)


C'est le cœur du système qui est lancée lors du boot. Sa tache est d’assurer le chargement et
l’exécution des processus, de gérer les entrées-sorties et proposer une interface entre le noyau et
les programmes de l'utilisateur. Le noyau (ou cœur) assure les fonctionnalités suivantes :
• gestion des périphériques au moyen de pilotes qui sont des petits logiciels légers dédiés à
un matériel donné qui permettent de communiquer avec ce matériel.
• gestion de l’exécution des processus.
• gestion de la mémoire attribuée à chaque processus ;
• ordonnancement des processus (répartition du temps d’exécution sur le ou les
microprocesseur).
• synchronisation et communication entre processus (services de synchronisation,
d’échange de messages, mise en commun de segments de mémoire, etc.)
• gestion des fichiers (au moyen de systèmes de fichiers) ;
• gestion des protocoles réseau (TCP/IP, IPX, etc.).

32
Processus et thread
Lorsqu'un programme s'exécute, le microprocesseur lui fournit toutes ses ressources (registres
internes, place en mémoire centrale, données, code,…), ce qui constitue son contexte d'exécution.
On peut exécuter plusieurs programmes en même temps sur plusieurs microprocesseurs. Lorsque
on exécute plusieurs programmes en même temps sur un seul microprocesseur, la simultanéité
n'est pas réelle. Le microprocesseur passe cycliquement une partie de son temps à exécuter
séquentiellement une tranche d'instructions de chacun des programmes selon une logique qui lui
est propre, donnant ainsi l'illusion que tous les programmes sont traités en même temps.
Un processus : c'est un programme qui s'exécute et qui possède son propre espace mémoire, ses
registres, ses piles, ses variables et son propre microprocesseur virtuel (simulé par la
commutation entre processus effectuée par le microprocesseur unique). Le processus est donc
l'image en mémoire centrale d'un programme s'exécutant avec son contexte d'exécution,
contrairement au programme qui lui est physiquement présent sur le disque. Enfin un processus
peut se trouver dans différents états et peut travailler avec d'autres processus présent en même
temps que lui. Il peut aussi créer d'autre processus et communiquer avec d'autres processus. C'est
le rôle du noyau de l'OS d'assurer la gestion complète de la création, de la destruction, des
transitions d'états et d'allouer l'espace mémoire d'un processus.
Le multithreading : Chaque processus peut lui-même fonctionner comme le système
d'exploitation en lançant des sous tâches internes au processus. Ces sous tâches sont appelés
Threads. Un thread constitue la partie exécution d'un processus alliée à un minimum de variables
qui sont propres au thread. Un processus peut comporter plusieurs threads qui partagent les
mêmes variables générales de données et les autres ressources allouées au processus englobant.
Mais, un thread possède en propre un contexte d'exécution (registres, code, données).
Cette répartition du travail entre thread et processus, permet de charger le processus de la gestion
des ressources (fichiers, périphériques, variables globales, mémoire,…) et de dédier le thread à
l'exécution du code proprement dit sur le microprocesseur central (à travers ses registres…).
La différence fondamentale entre la multiprogrammation et le multithreading se situe dans
l'indépendance qui existe entre les processus, alors que les threads partagent les mêmes données
globales (celles du processus qui les contient).

Dans un système d'exploitation, c'est le "scheduler" qui établit la liste des processus prêts à être
exécutés et qui effectue le choix du processus à exécuter immédiatement selon un algorithme
d'ordonnancement pour utiliser efficacement la machine. Un algorithme d'ordonnancement est dit
préemptif lorsqu'une tâche qui s'exécute peut être interrompue après un délai d'horloge fixé
appelé quantum de temps, même si la tâche est en cours d'exécution. L’algorithme
d'ordonnancement est dit coopératif lorsqu'une tâche s'exécute soit jusqu'au terme de son
exécution, soit parce qu'elle libère de son propre chef l'activité du microprocesseur.

Dans un OS interactif comme Windows, Linux, Mac OS, la préemption est fondamentale car il y
a beaucoup d'intervention de l'utilisateur pendant l'exécution des tâches. Windows 3.0 était
coopérative et lorsqu'une tâche a un problème, elle pouvait bloquer tout le système. Par exemple,
le lecteur de CD-ROM ouvert en cours d'exécution en attente d'une lecture impliquait un gel du
système ; ce n'est plus le cas depuis les versions suivantes de Windows (98, XP, …).

Gestion de la mémoire
Les programmes de l'utilisateur doivent demander au noyau de la mémoire. Le noyau fait appel à
son gestionnaire de mémoire pour allouer (ou non) la mémoire au processus qui la demande.
Puisque dans un OS, plusieurs tâches peuvent être présentes en mémoire, à un instant donné, il
faut donc que chacune dispose d'un espace mémoire qui lui est propre et qui soit protégé de toute
interaction avec une autre tâche. Il est donc nécessaire de partitionner la mémoire centrale en

33
plusieurs sous-ensembles indépendants. De ce fait, les tâches sont chargées (stockées) dans des
parties de la mémoire dont l'emplacement physique n'est déterminé qu'au moment d'exécution.
Plusieurs tâches, s'exécutant en mémoire centrale, utilisent généralement plus d'espace mémoire
que n'en contient physiquement la mémoire centrale, il est alors indispensable de mettre en place
un mécanisme qui allouera le maximum d'espace mémoire physique utile à une tâche et qui
libérera cet espace dès que la tâche sera suspendue. Le même mécanisme doit permettre de
stocker, gérer et réallouer à une autre tâche l'espace ainsi libéré. Les techniques de segmentation
et de pagination mémoire dans le cadre d'une gestion de mémoire virtuelle, sont utilisées pour
l'allocation et de désallocation de mémoire physique dans la mémoire centrale. Donc, on désigne
par mémoire virtuelle, une méthode de gestion de la mémoire physique permettant de faire
exécuter une tâche dans un espace mémoire plus grand que celui de la mémoire centrale.
Par exemple dans Windows et dans Linux, l'espace mémoire est de 4 GB. Si la mémoire centrale
physique possède une taille de 512 Mo, le mécanisme de mémoire virtuelle permet de ne mettre à
un instant donné dans les 512 Mo de la mémoire centrale, que les éléments strictement
nécessaires à l'exécution du processus. Les autres éléments restent stockés sur le disque dur (un
fichier ou partition SWAP), prêts à être ramenés en mémoire centrale à la demande.

Les bibliothèques
Les bibliothèques du système d'exploitation sont constituées de fonctions permettant de faciliter
l’utilisation des fonctionnalités système. Ils sont généralement des points d’entrée vers des
fonctions du noyau ou des fonctions supplémentaire qui ne se trouve pas dans le noyau.

Le système de fichiers
Un système de fichiers (file system FS) est une structure de données permettant de stocker les
informations et de les organiser dans des fichiers sur les disques. Une telle gestion des fichiers
permet de traiter et de conserver des quantités importantes de données ainsi que de les partager
entre plusieurs programmes et de trouver les données. Puisque les OS ont des FS différents il est
parfois impossible (seulement avec des outils spécifiques) d'échanger les données entre systèmes
différents.

Les outils système


Les outils système sont un ensemble de programmes supplémentaires avec l'OS qui permettent à
l'utilisateur de configurer le système, de faire des réparations, de faire la gestion des comptes, de
configurer les paramètres réseau etc…

L'interface utilisateur
L'interface utilisateur permet à un homme de se servir de l'ordinateur. Cette interface peut être de
type interfaces graphiques ou avec des lignes de commande (Shell).
-La ligne de commande (CLI) consiste à taper des commandes directement avec le clavier, en
mode texte, que le OS exécute et affiche le résultat. La ligne de commande est très puissante et
très rapide mais elle est très complexe et nécessite de connaître beaucoup de commandes. Puisque
elle nécessite peut de ressources, elle est généralement la seule disponible dans les phase
d'installation ou de en cas de problèmes.
- L'interface graphique (GUI) assure la communication avec l'utilisateur en proposant un
environnement graphique donne des choix à travers des fenêtres et des menus. L'utilisateur ne fait
que choisir en utilisant un pointeur de sourie ou saisir des textes dans des fenêtres spéciales. Le
GUI est plus facile à utiliser que la CLI mais nécessite plus de ressources.

34
Les systèmes d'exploitation pour PC
Outre le système Mac OS du Macintosh d'Apple qui n'a commencer à être installé sur PC que très
récemment, deux OS se partagent en proportion très inégale, mais qui change tout le temps, le
marché des OS. Pour les applications de bureautique, Windows de Microsoft est installé sur
environ 90% des machines et Linux OS open source sur moins de 10% des machines. Pour les
serveur, Linux représentant presque 50% des OS installés. Les deux systèmes Linux et Windows
fonctionnent sur les PC aussi bien sur l'architecture 32 bits que sur l'architecture 64 bits.

Le système d’exploitation Windows


Windows est l'OS introduit par Microsoft en 1983 pour remplacer DOS. C'est un environnement
multitâche avec interface graphique pour l'utilisateur. Il peut fonctionner au dessus de DOS
(Windows 3.x. et Windows for Workgroups) ou indépendamment (à partir de 1995) comme un
OS complet pour PC unique (Windows 9x et Windows Me), pour les stations de travail
(Windows NT Workstation, Windows 2000 Professional), et pour serveur réseau (Windows NT
Server, Windows NT Enterprise Edition, Windows 2000 Server et Windows 2000 Advanced
Server). Actuellement on trouve Windows XP (fusion de NT et 9x), Vista et Windows 2008
server avec plusieurs versions qui diffèrent selon qu'ils soient utilisé pour les applications
familiales (bureautique et jeux) ou professionnels (pour les grandes entreprises).
Windows est un système propriétaire de Microsoft donc payant et son code source n'est pas fourni
et il fonctionne seulement avec les microprocesseurs Intel/AMD. Windows a l'avantage (pour le
moment) d'être le premier sur le terrain PC, beaucoup de gens ne connaissent que Windows et
beaucoup de programmes aussi fonctionnent seulement sous se système.

Le système d’exploitation Linux


A. Tannenbaum a écrit en 1987 l'OS pédagogique MINIX fondé sur UNIX mais sans droit de
licence. Cet OS a été reprit par Linus Thorvalds en 1994, pour faire sa première version
opérationnelle et stable d'un nouveau système accessible gratuitement sous le nom de LINUX.
Une grande différence entre Linux et Windows se situe dans la manière de gérer l'interface
utilisateur. En effet, Linux est dérivé d'un OS inventé pour les gros ordinateurs des années 70,
système auquel il a été rajouté un programme utilisateur non privilégié appelé interface de
communication (KDE, Motif, Gnome, …) par contre dans Windows, l'interface de
communication est intégré dans le cœur même du système.
Linux n'étant pas soumis aux contraintes commerciales, reste unique puisque les enrichissements
qui lui sont apportés ne peuvent être propriétaires. En plus, Linux contient tout ce qu'une version
commerciale d'Unix propose, sauf la maintenance système. Finalement, on peut modifier Linux et
le revendre, mais il faut obligatoirement fournir toutes les sources à l'acheteur.
Plusieurs distributions de Linux coexistent. Une distribution comporte un noyau commun,
portable et standard de Linux accompagné de diverses interfaces, de programmes et d'outils
systèmes complémentaires et de logiciels d'installations, nous citons quelques distributions les
plus connues : Mandrake, Red Hat, Debian, Suse,…et comparé à Windows, le nombre de
logiciels fonctionnant sous cet OS, est encore faible, mais continue à augmenter.

Présentation détaillée des systèmes d'exploitation pour PC


On va voir ici en détail le fonctionnement des systèmes Windows et Linux. On va voir comment
fonctionne l'interface graphique et le fonctionnement avec lignes de commandes sous DOS et
Linux qui sont très important pour un administrateur réseau.

35
Windows
Comme exemple de Windows, on va voir DOS et Windows XP. Même que DOS n'est plus utilisé
en tant que system seul, l'étude de DOS nous permet de comprendre l'organisation du FS et les
commandes CLI Windows. Les commandes DOS peuvent être utilisées aussi sous Windows pour
la configuration, la réparation, l'installation et l'exécution des programmes consoles. Dans la
partie Windows on va voir essentiellement l'environnement graphiques et les fichiers de
configuration et quelques commandes CLI spécifiques à Windows.
DOS
MS-DOS (ou DOS) (Disk Operating System) a été créé au tout début des années 1980 par
Microsoft pour les premiers PC d'IBM. C'est un système entièrement CLI, monotache et repose
sur le BIOS, dont il appelle les fonctions pour interagir avec le matériel.

Quand un PC démarre, le BIOS commence par charger le secteur de boot du disque qui contient
un petit programme de taille 512 octets, c’est le boot loader. Ce programme est chargé à l’adresse
0000h:7C00h et BIOS lui donne la commande. Le boot loader lui-même ne fait que charger le
kernel dans la mémoire et lui donne la commande.
Si le premier support bootable trouvé est un support non partitionné (disquette), le premier
secteur (piste 0, face 0, Secteur 1) est le secteur de boot. Si par contre le support est partitionné
(disque dur), le premier secteur est appelé secteur de boot maître (MBR Master Boot Record). Le
MBR contient une table de partition et un programme Master Boot Loader qui va localiser une
partition active dans la table des partitions. Si une telle partition est trouvée, le secteur de boot
associé à cette partition est alors chargé en mémoire.
Dans DOS, on peut dire que le noyau du système DOS (pas exactement) est COMMAND.COM
en plus des deux fichiers IO.SYS et MSDOS.SYS. Ces 3 fichiers sont chargés dans la mémoire,
par un programme loader, à l’adresse 0000:0700H. Puis les commandes sont passées à
COMMAND.COM nommé interpréteur de commande DOS. Il affiche une invite (prompt) qui
veut dire que l'OS attend des commandes de l'utilisateur. Le Prompt de DOS est formé par
l'affichage de la position actuel de l'utilisateur dans le FS suivit de "\>". Par exemple C:\> ou
C:\DOS\>
Le loader commence par charger le fichier IO.SYS qui contient du code d'initialisation et qui ne
fait que copier MSDOS.SYS en mémoire et lui transférer les commandes. Ce dernier initialise les
pilotes des périphériques de base, détermine l'état des équipements, reset le système de disque et
utilise les paramètres par défaut du système et retourne la commande à IO.SYS. Ce dernier
continu par la lecture du fichier de configuration CONFIG.SYS plusieurs fois pour configurer le
système. Si CONFIG.SYS ne contient pas de commande SHELL, IO.SYS charge par défaut
COMMAND.COM comme interpréteur de commandes. Ce dernier écrase le code de IO.SYS en
mémoire qui n'est plus utile et exécute le fichier de configuration AUTOEXEC.BAT s'il est
présent.

Le FS de DOS
Le système de fichier DOS s'appelle FAT (FAT 32) (File Allocation Table). La FAT est une liste
maintenue par DOS pour organiser l'espace du disque utilisé pour le stockage des fichiers. Les
fichiers sont découpés en plusieurs unités de stockage qui peuvent être éparpillées sur plusieurs
zones du disque. La FAT permet la gestion du disque de telle façon que les parties qui

36
contiennent déjà des informations ne seront pas écrasées et les parties d'un fichier peuvent être
reliées pour constituer un seul fichier.
DOS donne des noms spécifiques aux disques qui sont des lettres alphabétiques. La disquette
porte le nom A: ou B: et les disques durs et CD/DVD commencent par C: … Z:. Une lettre
désigne un disque ou une partition du disque seulement. Le disque peut être utilisé pour la lecture
et l'écriture comme le disque dur ou pour la lecture seule, comme le CD.
Une partition est un lecteur logique qui est vu par l'utilisateur comme un lecteur physique. Le
système de partition a pour but de séparer un support physique en plusieurs lecteurs logiques.
L'opération de partitionnement ne dépend pas de l'OS et on peut même faire cohabité plusieurs
systèmes d'exploitation avec différents FS sur des partitions différentes. En général, seules les
unités fixes peuvent être partitionnées. La table des partitions est une liste qui se trouve dans le
MBR et indique où commence et se termine chaque partition.
Un fichier est un regroupement de données sur disque désigné par un nom (8 caractères
alphanumériques) suivit d'une extension (3 caractères) séparés par un point. Les données peuvent
représenter du texte (en ASCII), ou des données binaires comme des images ou du code
exécutable. Sous DOS, l'extension permet de savoir (pas généralement) quel est le type de fichier.
Par exemple, .TXT est un fichier texte, .EXE et .COM sont des fichiers exécutables et .C contient
le code source d'un programme écrit en langage C. Par exemple : FICHIER1.TXT est un fichier
texte, BBBBB.EXE est un fichier exécutable et AAAAAAAAAAAAAAA.BAT n'est pas valide
parce que il est trop long pour DOS. Enfin il faut noter que le système FAT 32 ne peut gérer les
fichiers de plus de 4 gigaoctets et se fragmente énormément.
Le répertoire (ou dossier) est un regroupement de fichiers et de sous-répertoires qui permet
d'organiser les fichiers. Le nom du répertoire ressemble à celui du fichier.
Le FS a une structure en arbre. Le premier répertoire de l'arbre est appelé répertoire racine. Dans
la racine, on peut trouver des fichiers et des répertoires. Ces répertoires peuvent eux aussi
regrouper des fichiers et encore des répertoires, et ainsi de suite.
Pour accéder à un fichier sur un disque, il faut connaître son nom et sa localisation dans
l'arborescence. Ainsi, C:\DOS\USR\FICHIER1.TXT désigne le fichier de nom FICHIER1.TXT
qui se trouve dans le répertoire USR du répertoire DOS du disque C:

Les commandes DOS


Les commandes DOS se divisent en deux groupes. Les commandes internes connus par
l'interpréteur de commandes et les commandes externes qui sont fournie par des fichiers de
programmes indépendants de l'interpréteur.
Les commandes connues par DOS s'écrivent sous la forme :
Commande options fichiers_ou_données
Le nom de la commande, au début de la ligne, peut être une commande de l'OS, un programme
exécutable de l'utilisateur, ou un shell. Pour les programmes, il suffit d'écrire le nom du
programme sans l'extension pour l'exécuter.
Certaines de ces commandes peuvent s'exécuter en tapant au clavier seulement leur nom suivi de
la touche Entrée. Mais la plupart des commandes acceptent des options et des données
supplémentaires appelées arguments. Les options permettent d'utiliser la commande autrement
que dans son mode de fonctionnement par défaut. Pour les commandes DOS, elle se présentent
sous forme d'un slash (/) suivi d'un caractère. Par exemple, / ? donne de l'aide sur la commande.
Enfin, une commande peut être suivie d'un ou plusieurs noms de fichier, répertoire ou autre, avec
lesquels elle va travailler.
Lorsque l'interpréteur de commande n'a pas reconnu la commande en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes, il affiche un message d'erreur.

37
Exemples la quelques commande DOS
1- La commande DIR est une commande interne utilisée pour visualiser une liste des fichiers et
sous-repertoires contenus dans un répertoire. Elle affiche les noms des fichiers et des répertoires
contenus. De plus, chaque fichier est suivit de sa taille en octet, puis de sa date de modification et
aussi la place vide disponible sur le disque.
Cette commande a plusieurs options et s'écrit sous la forme suivante.
DIR [lecteur:][chemin][nom_de_fichier] [/A[[:]attributs]] [/B] [/C] [/D] [/L]
[/N] [/O[[:]tri]] [/P] [/Q] [/S] [/T[[:]heure]] [/W] [/X] [/4]

Les options principales sont :


[lecteur:][chemin][nom_de_fichier] Spécifie le lecteur, le répertoire et/ou fichiers à lister.
/A Affiche les fichiers dotés des attributs spécifiés (D Répertoires, R Lecture seule, H Caché, A
Archive, S Système, - Préfixe de négation)
/D Sur cinq colonnes avec fichiers triés par colonne.
/L Affiche en minuscules.
/O Affiche les fichiers selon un tri spécifié (N Nom (alphabétique), S Taille (ordre croissant),
E Extension (alphabétique), D Date et heure (chronologique), G Répertoires en tête, - Préfixe
en ordre indirect).
/P Arrêt après l'affichage d'un écran d'informations.
/Q Affiche le nom du propriétaire du fichier.
/S Affiche les fichiers d'un répertoire et de ses sous-répertoires.
Exemples :
DIR : affiche le contenu du répertoire courant.
DIR c:\dos: affiche le contenu du répertoire du chemin c:\dos.
DIR c:\dos /p : affiche le contenu du répertoire c:\dos page par page.
DIR c:\dos /o:n : affiche le contenu du répertoire c:\dos par ordre alphabétique.
DIR *.JPG affiche tous les fichiers avec une extension JPG.
DIR FI??.* affiche tous les fichiers commençant par FI dont le nom contient exactement 4
caractères et qui portent une quelconque extension.

2- la commande CD
Cette commande change le répertoire en cours et permet ainsi de se déplacer dans l'arborescence
du FS. Lorsque vous changez un répertoire, l'invite change et affiche le chemin du répertoire dans
lequel vous êtes en train de travailler. Sa syntaxe est
CHDIR [/D] [lecteur:][chemin]
CD [/D] [lecteur:][chemin]
Exemples :
CD nous affiche le lecteur et le répertoire en cours.
CD\ nous amène en haut de l'arborescence du répertoire (généralement vers C:).
CD.. nous déplace vers un niveau supérieur de l'arborescence du répertoire (.. est le nom du
répertoire parent et . est le nom du répertoire courant)
CD c:\DOS nous amène au répertoire c:\DOS.

3- la commande copy
Cette commande permet de copier un ou plusieurs fichiers sur d'un emplacement vers un autre
emplacement ou de les concaténer. Sa syntaxe est la suivante. Pour concaténer des fichiers,
spécifiez un seul fichier cible et plusieurs fichiers source (avec caractères génériques ou
fichier1+fichier2+fichier3).

COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/A | /B ] source [/A | /B]

38
[+ source [/A | /B] [+ ...]] [cible [/A | /B]]
source Fichier(s) à copier.
cible Répertoire et/ou nom de fichier cible.
/V Vérifie l'écriture du ou des fichiers cible.
/Y Supprime la confirmation de remplacement d'un fichier cible existant.
/-Y Demande une confirmation pour remplacer un fichier cible existant.
Exemples
Copy *.* c:\dos copy tous les fichier du répertoire courant vers c:\dos
Copy fichier1.txt c:\ copier le fichier1.txt vers c:\
Les tableaux suivants donnent les principales commandes DOS internes et externes.
Les principales commandes internes
Commande Action
CD / CHDIR Affiche ou modifie le nom du répertoire en cours.
CLS Efface l'écran.
COPY Copie ou concatène un ou plusieurs fichiers.
DATE Affiche/modifie la date du système.
DEL Efface le (ou les) fichier(s) spécifié(s) du disque.
DIR Affiche les informations sur les fichiers et répertoires.
ECHO Active et désactive l'affichage du texte des programmes de commandes.
MD / MKDIR Crée un sous-répertoire.
PATH Liste des répertoires de recherche des fichiers exécutables.
RD / RMDIR Supprime un répertoire.
TIME Affiche l'heure système et permet de la modifier.
TYPE Affiche le contenu d'un fichier texte.
VER Affiche le numéro de la version du DOS utilisée.

Les principales commandes externes


Commande Action
APPEND Spécifie la localisation de fichiers de donnés.
ATTRIB Affiche ou modifie les attributs de fichier.
COMMAND C'est l'interpréteur lui-même.
DEBUG Programme de mise au point des fichiers exécutables.
DELTREE Destruction d'un répertoire avec l'ensemble de son contenu.
DISKCOMP Compare le contenu de deux disquettes.
DISKCOPY Copie le contenu de la disquette sur une disquette, formatée ou non.
EDIT Éditeur de fichier texte ASCII.
FDISK Programme de configuration des disques durs : à utiliser avec précaution.
FIND Recherche une chaîne de texte dans un ou plusieurs fichiers.
FORMAT Formate le disque du lecteur spécifié.
KEYB Définit le clavier pour une langue donnée.
PRINT Imprime un fichier texte pendant que l'ordinateur reste utilisable.
SCANDISK Crée et affiche un relevé d'état du disque et corrige les erreurs décelées.
SYS Transfère les fichiers système sur un disque.
TREE Affiche l'arborescence pour le répertoire ou le disque spécifié.
XCOPY Copie des fichiers et des répertoires ainsi que leurs sous-répertoires.
Dans ce cours on a vu certaines des commandes DOS de base qu'on trouve fréquemment lorsque
on travaille sous DOS. Sachez qu'il en existe beaucoup d'autres disponibles. Pour en savoir plus
sur ces commandes, reportez-vous à un livre sur DOS, ou sur Internet.

39
La configuration de DOS
Comme on a vu, DOS a deux fichiers de configuration importants qu'il utilise lors de son
démarrage qui sont config.sys et autoexec.bat
Le fichier CONFIG.SYS est un fichier texte qui contient la configuration du système. Il possède
ses propres commandes comme Country, Device, Lastdrive…
Par exemple, la commande country configure le système pour qu'il reconnaisse les conventions
régionales d'une langue comme : monnaies, dates, heures, alphabets, séparateurs décimaux…
Exemple country=213 indique l'Algérie.
Les commandes Device et Devicehigh permettent d'installer des gestionnaires de périphériques
(*.SYS) en mémoire conventionnelle et supérieure respectivement. Pour utiliser la commande
Devicehigh, il faut préalablement avoir installé le gestionnaire de mémoire supérieure
HYMEM.SYS.
Par exemple, le programme KeyB nous permet de déclarer le type de clavier utilisé. On peut
effectuer cette déclaration avec la ligne suivante :
DEVICEHIGH = c:\dos\keyb.com FR,,c:\dos\keyboard.sys
Autoexec.bat est un fichier de commande de traitement par lot. Si DOS trouve ce fichier, il
exécute toutes les commandes s'y trouvant pour préparer l'environnement de travail à l'utilisateur
ou exécuter des programmes spécifiques au démarrage du PC.

Windows XP
Définition
Windows XP (eXPérience) est sorti en 2001. Même s'il reprend quasiment la même structure que
Windows 2000, il constitue la fusion des Windows 9x et NT. Cinq versions sont proposées, les
versions Home et Professional sont les plus courantes (en plus de XP tablette PC, XP 64 bits et
XP Media Center). Les Service Pack SP1 (2002), SP2 (2004) et SP3 (2008) ont permis
d'améliorer XP et de corriger ses problèmes.
L'organisation en couches de Windows peut être représentée par la figure suivante :

Windows (comme Linux) utilise le BIOS seulement pour démarrer le microprocesseur et dés que
les informations nécessaires sont chargées, l'OS change vers le mode protected et contrôle
directement son matériel. Il a des modules de programme interchangeable appelés pilotes de
périphériques (device drivers). Ce sont des composants de l'OS écrits pour la gestion des
périphériques spécifiques. En plus d'être concernés par les détails particulier du matériel, les
pilotes protègent l'OS de la nécessité de connaître ces détails. Les programmes aussi sont interdits
d'accéder directement au matériel et les instructions du microprocesseur qui initialisent les
activités d'entrées/sorties sont bloquées. HAL fonctionne d'une manière similaire et permet aux
programmes d'être indépendants du matériel.

40
FS de XP
XP reconnaît FAT comme DOS ou Windows 9x, mais son système de fichiers est NTFS (New
Technology File System). C’est avec l’introduction de NTFS que Windows (depuis NT) s’est
doté d’un système de fichiers plus efficace et sécurisé. NTFS gère les fichiers jusqu’à plus de 16
To et est moins sensible à la fragmentation. NTFS utilise une table de fichier maître appelé MFT
(Master File Table) qui reprend des informations détaillées sur le fichier. Il supporte aussi les
applications orientés objets en traitant tous les fichiers comme des objets avec des attributs définis
par le système ou par l'utilisateur. Enfin, tous les OS Windows utilisent des conventions de noms
de fichier (plus long dans XP), de dossier et de lecteurs logiques ressemblant beaucoup à ce qui
est utilisé en DOS. Les noms de fichier dans NTFS peuvent aller jusqu'à 255 caractères avec la
possibilité d'utiliser des espaces, plusieurs points et tout autre caractère sauf : * ? / \ ; < > |.
Lors de l'installation de XP il va créer plusieurs dossiers spécifiques :
• le dossier c:\windows qui contient les fichiers et dossiers de l'OS
• le dossier c:\Program Files qui rassemble les programmes accessoires fournis avec
Windows (Notepad, calculette, ...) et les programmes installés ultérieurement par les
utilisateurs comme Office, Matlab…
• le dossier c:\documents and settings qui est utilisé pour stocker les profils utilisateurs
avec leurs documents.

La base de registres
DOS utilise CONFIG.SYS ET AUTOEXEC.BAT pour stocker ses données de configuration
d'environnement. Dans Windows, ces fichiers ne sont plus utilisés et la base des registres intègre
la configuration du matériel et des logiciels. C'est une base de données relationnelle hiérarchique
stockant les informations du système et XP inclue des outils pour sa vérification, édition et
sauvegarde. Par exemple, pour accéder à la base de registre, on utilise REGEDIT.
Les parties des données concernant l'utilisateur sont stockées dans le fichier Ntuser.dat. Quant à
la configuration du système, elle est stockée dans 5 fichiers du dossier \system32\config : Default,
SAM, Security, Software et System.
La base des registres est décomposée en 5 classes (hives) :

1. HKEY_CLASSES_ROOT regroupe des paramètres spécifiques aux programmes comme


les extensions de fichiers, icônes spécifiques, menus contextuels, fichiers communs (dll
par exemple), licence
2. HKEY_CURRENT_USER est spécifique à chaque utilisateur (profil). Il reprend les
paramètres de configuration matériels qui sont modifiables par l’utilisateur claviers,
curseurs souris, raccourcis vers des lecteurs réseaux, ...

41
3. HKEY_LOCAL_MACHINE regroupe les paramètres de configuration de la machine. Ils
sont définis pour la plupart à l'installation de Windows. On retrouve par exemple, les
fontes de caractères chargées, le bios, les nombres de port série les pilotes des
composants hardwares internes (microprocesseur, chipset, ...) et externes, paramètres de
désinstallation des logiciels, ...
4. HKEY_USERS reprend la liste et paramétrage des profils de tous les utilisateurs. Par
exemple, les paramètres d’apparence, couleur de fond d’écran, bordure, taille d’écran,
etc.
5. HKEY_CURRENT_CONFIG reprend le profil matériel de l'ordinateur au démarrage
comme la résolution écran, pilotes de périphériques.... C'est une copie de :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\HardwareProfiles\Current

Environnement graphique de Windows


Sous XP, on peut faire tout ce que DOS peut faire et plus. Mais au lieu d'écrire des commandes,
XP présente des menus, des listes et des fenêtres qui proposent le choix à l'utilisateur entre les
différentes opérations possibles. Lorsque XP termine son opération de démarrage, il présente à
l'utilisateur un bureau constitué de plusieurs éléments.

Au milieu du bureau on trouve des icônes. Un Icône est une petite image qui symbolise un objet
(dossier, fichier, logiciel, un raccourci). On peut actionner l’objet symbolisé par l’icône en le
sélectionnant par le pointeur de la souris en cliquant sur le bouton gauche. La barre des tâches est
la barre située au bas de l’écran qui permet d’actionner le menu démarrer, de voir quels sont les
objets ouverts et d’afficher l’heure… le menu démarrer permet d’accéder à l’ensemble des
logiciels installés sur l’ordinateur, ainsi que d’accéder à certains logiciels de configuration. Les
objets ouverts s’affichent dans la barre des tâches. On peut passer des uns aux autres par un
simple clic gauche sur le rectangle de l’objet ouvert dans la barre des tâches. (C:\ Documents and
Settings\username\Desktop)

42
Le menu contextuel est un menu qui dépend du contexte : il apparaît par un simple clic droit sur
un objet et varie en fonction de l’objet sur lequel on a cliqué.
L'environnement graphique de Windows est basé sur les fenêtres comme son nom l'indique. Tous
les programmes qui s'exécutent sous XP ont des fenêtres qui leur sont associés. Une fenêtre est un
objet qui s'ouvre en activant tous les programmes et qui contient des informations relatives à
l’objet ouvert. On peut voir sur la figure suivante de quoi est constituée une fenêtre.

En coin supérieur droit, on voit les boutons qui commandent l'état de la fenêtre. Le bouton (case)
de réduction permet de réduire la fenêtre pour la rendre invisible et la placer dans la barre des
tâches simple par un clic gauche alors que le bouton d'agrandissement permet d’agrandir la
fenêtre pour qu’elle prenne tout l’écran. Enfin le bouton de fermeture (x) permet de fermer la
fenêtre. Enfin les fenêtres ont un coin de redimensionnement qui permet de changer
manuellement la taille de la fenêtre active. Les ascenseurs permettent de se déplacer de haut en
bas de la fenêtre.
La barre de menu donne accès à certaines commandes comme ouvrir un fichier, l'enregistrer et les
options d'affichage … certaines de ces commandes peuvent être accédées par des boutons
spéciaux qui se trouvent sur une barre de boutons. Les colonnes de type d’information permettent
de présenter les informations classées par types, décrite dans le titre de la colonne.
Au milieu de la fenêtre, on trouve la zone client où sont affichées les informations principales du
programme.
Un programme d'application fonctionnant sous Windows gère une ou plusieurs fenêtres avec
l'aide de Windows qui signale à l'application si elle doit redessiner le contenu d'une de ses
fenêtres ou de fermer la fenêtre. Cette communication se fait au travers de messages que
Windows envoie à chaque fenêtre concernée. C'est au programme d'effectuer la réception de ces
messages et de les transmettre aux fonctions gérant les différentes fenêtres. Le programme
n'intervient en aucun cas dans le dessin de la fenêtre (barre de titre, menu...). Le programme n'est
responsable que de redessiner la zone client de la fenêtre. L'interaction entre l'utilisateur et l'OS se
fait à travers l'affichage de textes ou images dans la zone client de la fenêtre ou à travers des
boites message (message box) et des boites de dialogue. Une boite de dialogue est une fenêtre
spéciale affichée par le système ou une application pour solliciter une réponse de la part de
l'utilisateur. Elle peut contenir une ou plusieurs commandes prédéfinies qu'on trouve dans toutes
les applications windows.

43
On voit sur cette figure un groupe des contrôles les plus utilisés :
• Le contrôle 'Check Box' permet de choisir entre trois états, coché, non coché ou
indéterminé. Un groupe de check boxes nous permet de choisir un nombre de propriétés
d'un objet.
• Le contrôle 'Radio Button' est assez similaire au contrôle 'Check Box', si ce n'est qu'un
seul de ces contrôles peut être coché à la fois.
• Le contrôle 'List Box' ne permet pas seulement de contenir un état entré par l'utilisateur, il
permet d'afficher des informations sous forme de liste, de trier la liste par ordre
alphabétique…
• Le contrôle 'slider' permet de fournir une valeur par le choix d'une position. Par contre, le
control 'Progress Bar', permet d'afficher une position courante.
• Le contrôle 'Combo Box' permet à l'utilisateur de faire un choix dans un menu déroulant
ou permet à l'utilisateur d'entrer un choix personnalisé.
• Les boutons sont utilisés pour accepter (OK), de refuser (Annuler) ou de faire une action
particulière d'ont le nom figure sur le bouton. Appuyer sur le bouton provoque
généralement la fermeture de la fenêtre ou l'apparition d'une une autre fenêtre.

Les commandes et programme de XP


XP dispose de beaucoup de programmes utilitaires et de commandes DOS. Pour les exécuter on
peut utiliser un programme de console qui ressemble à l'environnement DOS où on peut localiser
les fichiers des programmes et cliquer dessus par le pointeur de la souris. Pour localiser les
programmes, on utilise le menu démarrer ou l'explorateur.

Explorateur Windows :
Principalement, l'explorateur Windows est un gestionnaire de fichier. Mais comme XP se
compose de beaucoup de sortes d'objets appartenant à des niveaux différents, l'explorateur permet
d'effectuer toutes les opérations de manipulation de fichiers (objets) de XP comme copier, effacer
et créer de dossier...le travail avec explorer est facile et plus interactif et décharge l'utilisateur de
connaître une très grande liste de commande DOS.
Par exemple, pour copier un fichier (ou plusieurs) où un dossier, il suffit de cliquer sur le fichier
ou le dossier à copier. Il faut maintenant choisir l'opération de copier et pour cela il y a plusieurs
possibilités.

44
• On peut choisir copier dans un dossier, dans le menu édition. Dans ce cas, XP propose (à
travers une autre fenêtre) de choisir le dossier cible et de confirmer l'opération (créer
nouveau dossier, copier, annuler).
• On peut choisir de faire copier/coller de l'objet à travers le presse-papiers (clipboard).
C'est une mémoire spéciale maintenue par XP. Elle stocke la dernière donnée copiée par
un programme dans un endroit et la copie dans un autre endroit ou programme.
• Dans ce cas, choisir copier, se déplacer vers le dossier cible puis choisir coller. On peut
faire cette opération à travers la barre de menu ou le menu contextuel.
• On peut faire du copier/coller par des raccourcis clavier. Les raccourcis clavier
permettent d'activer une fonction du menu avec des combinaisons de touches du clavier
au lieu de la souris. Dans ce cas l'opération sera plus rapide mais nécessite d'apprendre
les raccourcis.
• On peut sélectionner un objet le prendre avec la souris (en maintenant le bouton gauche
enfoncé) puis en le mettant dans le dossier cible (lâcher le bouton de la souris).

Panneau de configuration

C'est outil qui permet à l'utilisateur de contrôler les propriétés du système et du matériel comme
la date, l'heure les propriétés du clavier, du réseau. Les programmes (applets) du panneau de
configuration sont lancés par le programme du panneau de configuration control.exe. Ce qui
permet de les lancer à travers les commandes CLI. Par exemple :
Control appwiz.cpl (ajouter et supprimer les programmes)
control modem.cpl pour la configuration des propriétés du modem.
control netconnections pour les connections réseau
Généralement, la configuration sauvegarde les paramètres dans des fichiers que l'on peut éditer
manuellement. L'utilisation de la configuration par les outils proposés par XP est plus facile parce
qu'elle permet de modifier la configuration du système et repose sur l'utilisation de cases à cocher
ou le choix des valeurs d'une liste ce qui réduit le risque d'erreur de frappe.

45
Console
Ce programme permet d'utiliser des commandes comme DOS ou même de lancer des
programmes avec fenêtres à travers le CLI sous XP. Cette opération est très rapide et est
important pour les taches répétitives. En plus il y a des outils de gestion et de commandes qui ne
sont disponibles qu'en CLI, on peut mettre plusieurs commandes (script) dans un fichier batch.
Les commandes peuvent être exécutés par Démarrer->exécuter ou par la commande cmd.exe qui
affiche une fenêtre qui ressemble à un écran DOS. Les programmes qui s'exécutent avec cmd sont
en réalité des programmes Windows mais sans fenêtre, on les appelle pour cela programmes
console. Par exemple si on exécute le programme suivant : ping www.google.dz, cmd va chercher
un programme appelé ping.exe qui est programme de test de réseau et va le trouver dans
\windows\system32. cmd va demander à Windows d'exécuter ping.exe avec www.google.dz
comme argument. Pour la recherche des programmes, cmd va chercher dans une liste de locations
déterminées par une variable d'environnement appelé PATH. L'environnement est un ensemble
de valeurs texte que Windows met à la disposition des programmes. On peut voir les variables
d'environnement par la commande SET. Par exemple :
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\bti\Application Data
CLASSPATH=C:\Program Files\Java\jre1.5.0_05\lib\ext\QTJava.zip
CommonProgramFiles=C:\Program Files\Fichiers communs
HOMEDRIVE=C:
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
Path= C:\WINDOWS\system32;c:\program files\microsoft sql server\90\tools\binn\;
D:\MATLAB\R2007a\bin;D:\MATLAB\R2007a\bin\win32;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 15 Model 6 Stepping 5, GenuineIntel
PROCESSOR_LEVEL=15
PROCESSOR_REVISION=0605
ProgramFiles=C:\Program Files
PROMPT=$P$G
QTJAVA=C:\Program Files\Java\jre1.5.0_05\lib\ext\QTJava.zip
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\WINDOWS
VS80COMNTOOLS=D:\Microsoft Visual Studio 8\Common7\Tools\
windir=C:\WINDOWS

Lors du démarrage de XP, les fichiers suivants seront utilisés :


Ntldr, Boot.ini, Ntdetect.com, Ntoskrnl.exe, Hal.dll, les fichiers dans systemroot\ System32\
Config (Registry), les fichiers dans systemroot\System32\Drivers (drivers)
Le loader secondaire de la partition active localise et lit ntldr (NT Loader)dans le répertoire racine
de la partition et le charge; ce dernier commute le microprocesseur vers le mode protected
(démarre en mode real pour des raisons de compatibilité) et continue le processus de boot. Ntldr
cherche le fichier boot.ini qui contient des informations sur les options et menu de démarrage
comme le dualboot ou même plusieurs options de Windows avec leurs positions respectives. Si
plusieurs choix existent un menu sera affiché pour le choix de l'OS à démarrer. Pour XP, ntldr
exécute le programme ntdetect.com qui collectionne des informations sur la configuration
matérielle et les passes à Ntldr. Si plus d'un seul profil matériel existe XP utilisera la
configuration correcte. Apres, ntldr charge les deux fichiers ntoskrnl.exe et hal.dll qui se trouvent

46
dans le dossier system32 du dossier Windows. Ces deux fichiers constituent le noyau du système.
Le fichier HAL (Hardware Abstraction Layer), effectue la fonction de gestion de matériel pour le
compte des niveaux hauts du noyau de l'OS (ntoskrnl) pour les rendre indépendants des détails du
matériel. En plus ntldr charge les fichiers de configuration contenus dans la base des registres.
Les pilotes à charger lors du boot sont chargés et le noyau prend contrôle. Le noyau effectue des
initialisations et lance quelques services. A ce niveau, pour la première fois, le mode texte est
remplacé par le mode graphique et une barre de progression est affichée. Finalement le
programme winlogon.exe est lancé qui affiche le message "Welcome" ou un dialogue de login.
L'utilisateur peut entrer et le reste des services est chargé. Le profil de l'utilisateur dentifié durant
le login est chargé. Celui ci est contenu dans le dossier Documents and Settings, qui contient
aussi d'autres fichiers et dossiers important :
• Les fichiers ntuser.dat et ntuser.dat.log de la base de registres
• Desktop folder, qui contient les éléments personnels du bureau de l'utilisateur.
• Start Menu folder, qui contient les éléments personnels du menu démarrer de l'utilisateur.
• My Documents folder qui contient les fichiers personnels de l'utilisateur.
• Enfin il y a aussi les Cookies, Favorites, Local Settings, Application Data, My Recent
Documents, NetHood, PrintHood, et d'autres dossiers qui contiennent des données pour
des applications spécifiques comme history lists, bookmarks, email files…etc
Apres le profil (les parametres) de l'utilisateur, winlogon lance le programme shell par défaut qui
est dans ce cas l'explorer.exe qui va lui-même charger le bureau, la barre de tache et le menu
démarrer. Après, les icônes du bureau sont affichés et les scripts et programmes de démarrage
sont exécutés. A ce moment, le démarrage est complet et XP est prêt au travail.

Linux
Linux est un clone de Unix. En ce sens, on retrouve l’ensemble des concepts de l’architecture
Unix comme la notion de processus et d’arborescence des fichiers. Le concept de Shell est tout
aussi présent et l’ensemble des commandes en lignes sont les mêmes. C'est aussi un système
multitâche et multiutilisateur et puisque il n'est nativement pas compatible avec DOS Windows, il
en résulte que, les programmes de ces derniers ne fonctionnent pas sous Linux et l'inverse.
Un système Linux peut être vu selon trois couches: une couche physique comprenant les
périphériques et le BIOS, une couche système comprenant le noyau et une couche interface
comprenant le shell et l'interface graphique basée sur X.
L'élément essentiel du système Linux est le noyau qui se charge de toutes les opérations du
système d'exploitation et de la communication entre les couches. Pour l'interaction avec les
utilisateurs, Linux utilise un shell qui est un interpréteur de commandes CLI. On peut trouver
plusieurs types de shells disponibles sous linux (UNIX) : bash, csh, ksh, tcsh,...
Le système X-Window est l'interface graphique standard des systèmes Unix. Il repose sur un
serveur X et un gestionnaire de fenêtre comme KDE, Gnome, WindowMaker...

47
Lors de l'installation, Linux se présente sous forme d'une distribution complète. On appelle
distribution Linux un ensemble comprenant un noyau Linux, des programmes d'installation et
d'administration et de mise à jour des logiciels ainsi qu'une sélection de logiciels d'application. Le
noyau d'une distribution peut-être mis à jour afin de permettre la prise en compte de matériels
récents, toutefois cette manipulation consistant à recompiler le noyau. Les distributions les plus
connues sont : Red Hat, Fedora, Debian, Knoppix, Kubuntu, Mandriva, SuSE… Les
spécifications du LSB (Linux Standard Base) assurent qu'un programme écrit pour un système
Linux fonctionnera sur un autre système.
Les distributions Linux ont été développées dans le cadre du projet GNU. Elles sont donc
soumises aux conditions et termes de la licence GPL (General Public License) de la Free
Software Foundation. A titre indicatif la licence GPL permet la modification du programme
original, et sa diffusion (sous licence GPL). Elle autorise aussi la vente du logiciel libre sous sa
forme originelle ou modifiée, à condition que le vendeur autorise la diffusion (même gratuite) du
logiciel ainsi modifié. Les logiciels restent la propriété de leurs auteurs.
L'installation d'une distribution donne le choix entre trois configurations possibles du système
Linux :
• Ordinateur de bureau : dans ce cas, la distribution installe un ensemble de programmes
pour les applications bureautiques et jeux…
• Serveur : dans ce cas, la distribution installe l'ensemble de programmes nécessaire pour
faire fonctionner un serveur Web, de fichier, Mail, ou d'impression.
• Station de travail : dans ce cas, la distribution installe l'ensemble de langages de
programmation nécessaires pour développer des applications.

FS de Linux
Linux reconnaît beaucoup de FS (y comprit FAT et NTFS) mais le FS utilisé par défaut de linux
est ext2fs (second extended). Dans ext2fs les noms de fichiers peuvent être longs et comporter
des espaces. Une partition ext2fs comporte un secteur de boot et un ensemble de groupes de
secteurs de même taille. A la différence de Windows les répertoires sont séparés par / et les
caractères majuscules et minuscules sont considérés comme différents. Linux possède une
structure en arborescence dont la racine est notée /. Chacun des répertoires sous cette racine a un
nom standardisé (Filesystem Hierarchy Standard : FHS) et un contenu précis.
/ Racine du système, contient tous les autres répertoires principaux
/bin Contient les commandes essentielles communes à tous les utilisateurs
/sbin Contient les commandes utilisées par l'administrateur du système
/boot Contient les fichiers de démarrage du système dont le plus important est le noyau
/dev Contient les points d'entrée des périphériques et les drivers.
/etc Contient les fichiers de configuration
/home Contient les répertoires personnels des utilisateurs
/lib Contient des bibliothèques pour les programmes, le noyau et les outils CLI
/mnt contient les points de montage des lecteurs amovibles comme CD, ZIP …
/root Contient les répertoires personnels de l'administrateur
/usr Hiérarchie secondaire qui contient les programmes d'applications de l'utilisateur et les
bibliothèques partagées.
/var Contient les fichiers traces du système (logs), spooler de l'imprimante…
/proc Système de fichiers virtuel qui contirent des informations en temps réel sur les processus
reliés au noyau en cours d'exécution (IRQ, DMA, adresses I/O.. )
/tmp contient des fichiers temporaires…

48
En plus de la partition qui contient le système, Linux utilise une partition Swap (avec son FS)
pour les opérations de mémoire virtuelle.
Sous linux (UNIX) tout est fichier, on trouve ainsi :
• les fichiers normaux (textes, exécutables) ;
• les fichiers répertoires ;
• les fichiers spéciaux, contenus dans le répertoire /dev, qui sont des points d'accès aux
périphériques (nodes) à quoi on associe les disques et les partitions ;
• les fichiers liens symboliques qui font référence à d'autres fichiers.
Pour les fichiers normaux, il existe trois types de permissions pour un utilisateur sur un fichier : la
lecture (Read), l'écriture (Write) et l'exécution (eXecute). À la création d'un nouveau fichier, des
droits par défaut sont utilisés. Par ailleurs, trois catégories d'utilisateurs sont définies pour un
même fichier : le propriétaire (User), les membres du groupe (Group) et les autres utilisateurs
(Other). Chacun des fichiers est associé à un propriétaire et à un groupe.
La commande pour afficher les droits des fichiers est ls -l

Les commandes chown, chgrp et chmod permettent des changer respectivement le propriétaire, le
groupe et les droits d’accès.
Les périphériques sont associés à des points d'accès comme /dev/modem. Le matériel détecté est
documenté comme fichier dans /proc. Et les périphériques de stockage sont désignés par la
notation /dev/PPLN avec :
PP: type de bus
•hd pour les disques dur IDE
•sc pour les disques SCSI
•fd pour les lecteurs de disquettes
L: lettre du périphérique concerné
N: numéro de partition concernée
•1 à 4: partition principale ou étendue
•>4: partitions logiques

Exemples :
/dev/fda: première disquette.
/dev/hda: Disque dur (ou CD) maître du bus primaire IDE
/dev/hda1: partition primaire du disque dur maître du bus primaire IDE
/dev/hdd: disque dur esclave du bus secondaire IDE
/dev/hda6: 2ème partition logique du disque dur maître du bus primaire IDE
/dev/sda premier disque dur SCSI
Le Montage des FS est nécessaire parce qu'un FS n’est pas accessible tant qu’il n’est pas monté.
Monter un FS veut dire l’associer à un répertoire sur le système. Par exemple, le FS racine est
monté sur /. Cette opération est aussi nécessaire pour accéder à une partition DOS, NTFS ou
CD/DVD. Avec les commandes CLI il faut utiliser la commande mount et avec X cette opération
se fait par un simple click. Le fichier de configuration /etc/fstab contient les points de montages à
faire automatiquement lors du démarrage du système.

49
Le noyau Linux
Le noyau Linux est la partie principale de Linux. Formellement, Linux est le nom du seul noyau,
mais pratiquement on appelle Linux l'ensemble du système d'exploitation. Le noyau Linux, est vu
par l’utilisateur comme un seul et unique fichier. Mais depuis la version 2.0, le noyau est
modulaire, c'est-à-dire que certaines fonctionnalités peuvent être ajoutées ou enlevées du noyau
en cours d'utilisation. Pour cela des commandes spéciales existent. Les modules sont stockés dans
le répertoire /lib/modules/<nom du noyau>. Il est possible de spécifier quels modules doivent être
chargés au démarrage en les listant dans le fichier /etc/modules. Les commandes permettant de
décharger et de charger les modules sont respectivement rmmod et insmod.
Les numéros de version du noyau sont composés de trois chiffres. La dernière version
(juillet 2008) est 2.6.26. Le code source du noyau Linux est disponible (kernel.org) pour
compilation.

Les commandes de Linux


Il existe un très grand nombre de commandes sous linux. Il connaît toutes les commandes Unix
où d'ailleurs une commande ne doit exécuter qu'une seule fonction, mais de manière exhaustive.
Mais sous linux on peut utiliser beaucoup de commandes DOS par émulation. Ces commandes
sont exécutées depuis l'invite du shell ou un terminal dans le cas de X-Window. Les commandes
qui sont des exécutables sont situées dans /bin, /usr/bin, /usr/local/bin ou un autre répertoire
contenant des exécutables et listé dans PATH.
Lorsqu'on passe l'étape de login et le password de linux, on se retrouve devant le prompt shell qui
est le plus souvent celui de bash (sinon probablement csh). Il ressemble le plus souvent à ceci :
[root@hostname/root]$
Le mot root signifie que l'on est "logué" sur le compte de l'administrateur système. On est donc
en pleine possession de la machine et on peut faire absolument n'importe quoi. Le prompt par
défaut de root est # et le prompt par défaut d'un utilisateur régulier est un $. Dans la plupart des
systèmes Linux, le prompt est précédé du nom de l'utilisateur, le nom du système et le répertoire
courant. Par exemple le prompt d'un utilisateur appelé Said dans un système appelé suse avec
/tmp comme répertoire courant apparaîtra comme :
said@suse :/tmp>$
Les systèmes linux avec GUI démarrent aussi plusieurs terminaux virtuels. Ces terminaux
permettront d'avoir des sessions ouvertes en même temps en dehors du GUI. Ctrl+Alt+F1 (ou F2,
F3, F4, F5 à F6) permet de se déplacer entre les terminaux.
Le tableau suivant donne les commandes de base disponibles sous Linux.

Commande Action
ls Lister le contenu d'un répertoire
Rm Supprimer un fichier
Cp Copier un fichier
ln Créer un lien sur un fichier
man Afficher l'aide d'une commande
Mv Déplacer un fichier
Cd Changer de répertoire
Mkdir Créer un répertoire
Pwd Afficher le répertoire courant
Cat Concaténer ou Afficher le contenu d'un fichier texte
File Afficher le type d'un fichier
Find Rechercher un fichier dans l'arborescence
Mkfs Crée un système de fichiers. (MaKe FileSystem)
Echo Affiche une ligne de texte donnée en paramètre.

50
Des informations supplémentaires sur chacune de ces commandes peuvent être trouvées dans
leurs man pages.
man : Obtenir la man page d'une commande. Exemple : man ls
Utiliser une commande --help comme argument affiche de l'aide et liste les arguments qui
peuvent être passés à la commande interne du shell par exemple : Ls --help
Exemples de commandes :
cd /etc : aller immédiatement dans le répertoire /etc
ls c* lister uniquement les noms des fichiers commençant par la lettre "c".
ls -l lister les fichiers et leurs attributs (les droits de lecture, d'écriture et d'exécution, le
propriétaire, le groupe, la taille en octets, sa date de création ou de modification).
cp fichier1 fichier2 fait une copie de fichier1 en un nouveau fichier appelé fichier2.
# cp fichier1 /home copie fichier1 dans /home
Echo $SHELL affiche le Shell en cours
find / -name fich1 -print chercher le fichier appelé fich1 à partir de la racine -print demande à find
d'afficher le résultat.
mount–t vfat /dev/hda1 /windows monter la première partition du disque IDE1 dans le répertoire
/windows.

GUI de Linux
Sous linux, le GUI ne fait pas partie de l'OS mais il est simplement une autre application. Le GUI
est basé sur le serveur X Window ou X11 ou simplement X qui est un système de fenêtrage
graphique développée au MIT en 1984. C'est un système standard ouvert et qui fonctionne sur
plusieurs systèmes (même Windows à travers Cygwin). Il fonctionne suivant le modèle
client/serveur. Le serveur X tourne sur une machine qui est dotée d'un écran, d'un clavier et d'une
souris ; il dessine les images et il reçoit entrées de texte et les déplacement de souris. Le client X
est un logiciel graphique qui se connecte au serveur X et lui envoie ses requêtes d'affichages en
utilisant le protocole X.
Sous Linux, il existe une implémentation libre du système X-Window appelée XFree86 ou Xorg.
La commande Startx lancera manuellement l'interface graphique. Ce qui va apparaître est
seulement un canevas gris avec un pointeur de souris en forme de "X". On pourra exécuter des
applications comme xclock, xterm …
Pour configurer X (fichiers XF86Config, ou xorg.conf) il existe des programmes qui lancent le
serveur graphique et tente de le configurer automatiquement, des programmes graphiques et
même des programmes en CLI.
Parmi les clients X, on en distingue un particulier : le gestionnaire de fenêtres dont le rôle est de
contrôler comment vont apparaître les autres clients. Il gère l'affichage des barres de taches les
menus…, la sélection, le déplacement, le redimensionnement et les décorations des fenêtres. Du
fait de leur similitude avec l'interface de Windows dans sa configuration par défaut, son
utilisation et du nombre important de logiciels disponibles pour ces environnements, ils sont
installés par la plupart des distributions.
Il existe plusieurs gestionnaires de fenêtres, mais KDE et GNOME sont les principaux
gestionnaires dans le monde Linux.
KDE (K Desktop Environment) a été lancé en octobre 1996. L'installation de l'environnement
KDE donne aussi accès à un nombre impressionnant d'applications de bureautique, de jeux et
multimédia. KDE a notamment un gestionnaire de fichier graphique qui s'appel Konqueror qui est
aussi un browser web.
GNOME (GNU Network Object Model Environment) a été lancé en août 1997. Le gestionnaire
de fichiers intégré à GNOME est Nautilus.
Toutes les applications provenant de KDE fonctionnent sous GNOME et inversement.
La figure suivante montre un exemple de bureaux KDE (SUSE)

51
Démarrage du système
Sur PC c'est toujours le bios qui démarre le premier et va chercher le MBR pour identifier la
partition active. De cette dernière il lance le secteur de boot spécifique à linux. Il existe plusieurs
boot loader pour Linux les plus connus sont LILO (LInux LOader) et GRUB (GRand Unified
Bootloader). Ces systèmes sont chargés de démarrer le noyau et d'initialiser le système en suivant
les étapes suivantes :
• Chargement du noyau Linux (exemple vmlinuz-2.6.26)
• Le noyau Linux initialise les périphériques (disque dur, carte réseau,...) et charge et
configure les pilotes ;
• Le noyau monte le système de fichiers racine qui est monté en lecture seule de manière à
pouvoir vérifier les erreurs qu'il pourrait contenir ;
• Le noyau lance le programme init qui permet de lancer tout le reste. Init va lire le fichier
/etc/inittab, lancer le script /etc/rc.d/rc.sysinit qui effectue un nombre d'opérations comme
configurer le réseau, le clavier, monte les partitions et les hostnames. Et termine par
déterminer le runlevel qui représente le niveau de démarrage. Il définit quels sont les
services qui tournent et sont identifiés par des chiffres. Il n'existe pas de standard de
numérotation, mais en général, le niveau 0 permet d'arrêter la machine, le 1 permet de
démarrer en mode mono-utilisateur, et les niveaux de 2 à 6 sont laissés à la disposition de
l'utilisateur.
• init passe alors en mode multiutilisateurs et lance un getty pour chaque console virtuelle,
getty étant un programme permettant le login au système ;
• Finalement, le système de fichiers racine est remonté en lecture-écriture et les processus
des services sont lancés
Login
Init lance tout d'abord des processus getty qui écoutent les terminaux de connexion et attendent
l'interaction d'un utilisateur. Quand un utilisateur est détecté, getty lance le programme login qui
permet de vérifier le mot de passe. Si ce mot de passe est correct, login lance alors le shell par
défaut configuré par l'utilisateur. Dès que l'utilisateur se déconnecte, init relance un nouveau
getty. Il est aussi possible d'avoir un login graphique à travers xdm, kdm (Kde), gdm (Gnome)…
Le programme login permet l'identification de l'utilisateur et tient à jour un listing des personnes
connectées dans le fichier /var/run/utmp. La base de donnée des utilisateurs est contenue dans le
fichier /etc/passwd qui spécifie par exemple le shell de login de chacun des utilisateurs.

52
Arrêt du système
Il est très important de suivre une procédure d'arrêt correcte pour les systèmes Linux. Sinon le
système de fichiers sera probablement inutilisable au prochain reboot. Ce risque provient
essentiellement du fait que Linux possède un cache disque qui n'écrit pas les données toutes à la
fois, mais seulement par intervalles.
La commande pour arrêter le système est shutdown. Exemple :
shutdown -h now arrête le système immédiatement ;
Une fois que cette commande a été lancée, tous les systèmes de fichiers sauf la racine sont
démontés, les processus utilisateurs sont tués, les services sont arrêtés et le système stoppé. Enfin,
on peut aussi arrêter le système à partir du GUI à la windows.

Fichiers importants de configuration


Dans un système Linux, il y a toujours, deux façons de configurer. La première est à travers
l'utilisation des outils de configuration sous X ou même en CLI. La deuxième est par l'édition
directe des fichiers de configuration. Cette deuxième façon est la seule possible lorsqu'un
problème empêche le système de fonctionner normalement. Pour cela il faut connaître les fichiers
et répertoires de configuration essentiels qui se trouvent la plupart du temps dans le répertoire
/etc. il y a un grand nombre de fichiers qu'on peut déterminer à partir de l'aide du système ou de la
documentation des programme. Mais il y a des fichiers qui sont connus comme par exemple :
• /etc/cups c'est répertoire qui contient les fichiers de configuration de l'imprimante.
• Les fichiers /etc/passwd, /etc/group et /etc/shadow contiennent les informations sur les
utilisateurs et leurs mots de passe.
• La configuration de base des utilisateurs se trouve dans /etc/skel
• Les démons (Daemons) qui sont des processus qui s'exécutent en arrière plan qui sont
configurés pour être lancés automatiquement au démarrage sont documentés dans
/etc/rc.d
• /etc/hosts contient les host names et leurs adresses IP correspondantes.
• /etc/resolv.conf, contient les adresses IP pour chercher les serveurs DNS
• /etc/hosts.allow et /etc/hosts.deny permettent de configurer les fichiers qui peuvent se
connectés au réseaux.
• /etc/X11/ contient les gestionnaires de fenêtres comme xdm, gdm (Gnome) …
• /etc/fstab est utilise pour stocker des informations sur les FS locaux et distants.

53
Chapitre 4 : Les langages de programmation
Introduction
Les ordres que l’on donne à l’ordinateur pour agir sont fondés sur la notion d’instruction. Ces
instructions sont préalablement définies. L'humain lui pense à un niveau d'abstraction élevé. Pour
utiliser un ordinateur, il est obligé de transformer ces concepts sous forme d'instructions
(programmation). L'ensemble des instructions constitue un langage de programmation. Les seules
instruction que peut comprendre directement un ordinateur sont les instructions machine de son
processeur. Une application complexe (comme Word par exemple) est constituée de milliers
voire de millions d'instructions. L'application peut être vue comme constituée de plusieurs
couches. La figure suivante montre qu'il y a une couche particulièrement importante entre
l'application et la couche matérielle c'est la couche "programme système".

Cette couche est constituée du système d'exploitation et du compilateur. L'OS se charge (comme
on l'a vu) de la gestion de la mémoire, des entrées /sortie et de la communication avec les autres
applications. Le compilateur se charge de traduire le programme de l'application vers le langage
machine. Puisque les instructions machines sont difficiles à utiliser par l'humain, des langages de
niveau plus "évolué" ont été crées pour écrire les applications complexes. Une instruction évoluée
peut être remplacée par un ensemble d'instructions machine rendant ainsi le travail plus facile. Le
passage du langage évolué vers le langage machine se fait de manière automatique. Cette
opération est appelée traduction ou interprétation. Dans ce chapitre on va voir les différents types
de langage de programmation évolués. Dans les chapitres suivants on va voir comment écrire un
programme et un exemple de ces langage qui le C++.

Types de langages
Les premiers langages de programmation utilisés sont les langages d'assemblage. Même que ces
langages utilisent des mnémoniques plus faciles que le code machine ils restent très proches de
lui et permettent seulement de réaliser des opérations simples et dépendantes de la machine. Ceci
a conduit au développement de plusieurs langages dits "évolués" qui sont encore plus proches du
langage humain. Depuis leur création, les langages de programmation ont évolué et se sont
diversifiés. Les langages les plus utilisés actuellement sont ceux qui font partie de la catégorie des
langages dits système, procéduraux ou Hybrides. Les ordinateurs étant des machines de Turing, la
notion de mémoire machine est représentée par la donnée abstraite qu’est une variable, dans un
langage procédural. D’autre part, les machines de Turing sont séquentielles et les langages
procéduraux traitent les instructions séquentiellement. Ceci indique que les langages procéduraux
sont parfaitement adaptés à l’architecture de l’ordinateur ; ils sont donc plus "facilement"
adaptables à la machine.

54
Les langages procéduraux
Les langages de programmation procéduraux ont été introduits comme alternative aux langages
d'assemblage. Ils sont moins efficaces que les langages d'assemblage mais ils permettent de
développer beaucoup plus rapidement des applications. En conséquence, ils ont remplacé presque
totalement les langages d'assemblage pour le développement de grandes applications.
Les langages de programmation procéduraux diffèrent des langages d'assemblage de deux
manières. Ils ont un niveau plus élevé et ils sont fortement dépendants du type (typed). Le terme
"niveau élevé" signifie que beaucoup de détails sont manipulés automatiquement de sorte que les
programmeurs puissent écrire moins de code pour obtenir le même travail. Par exemple :
• L'attribution de registre est effectuée par le compilateur de sorte que les programmeurs
n'aient pas besoin d'écrire de code pour déplacer l'information entre les registres et la
mémoire.
• Les séquences d’appel des procédures sont générées automatiquement; les programmeurs
ne s’inquiètent pas du déplacement des arguments de/vers la pile.
• Les programmeurs peuvent utiliser des mots clé seulement pour les structures de control
comme while et if; le compilateur génère tous les détails pour implémenter les structures
de contrôle.
La seconde différence entre l’assembleur et les langages de programmation procéduraux est le
typing. Le terme "typing" se réfère au degré de spécification du sens de l’information avant son
utilisation. Dans un langage fortement typé “strongly typed”, le programmeur déclare comment
chaque partie de l’information va être utilisée et le langage empêche l’utilisation de l’information
d’une autre façon non autorisée. Les langages de programmation système sont fortement typés.
Par exemple :
• Chaque variable dans un langage de programmation procédural doit être déclarée avec un
type particulier tel que le nombre entier ou le pointeur à un tableau, et doit être employée
d’une manière appropriée à ce type.
• Les données et le code sont totalement séparés : il est difficile ou même impossible de
créer un nouveau code "on the fly".
• Les variables peuvent être regroupées dans des structures ou des objets avec des
substructures bien définies et des procédures ou des méthodes pour les manipuler; un
objet d’un type particulier ne peut pas être utilisé à la place d’un autre.
Tous les langages procéduraux ont un ancêtre commun : le langage FORTRAN. Puis :
Fortran(58), Cobol(60), Algol(60), ...Basic(65) C(73 bell labs), Pascal(75) Ada(82) c++(82),
visual basic (92), Delphi (95), java(96) C#(2001).
Dans cette courte liste, seuls Algol, Basic et Pascal sont des langages qui ont été conçus par des
équipes dans des buts de recherche ou d’enseignement. Les autres langages sont élaborés par des
firmes et des compagnies dans des buts de commercialisation, de rationalisation des coûts de
gestion (Departement of Defence) etc...

Les langages fonctionnels


Dans un langage fonctionnel, les actions reposent sur des fonctions mathématiques ou non qui
renvoient des résultats. Un langage fonctionnel est essentiellement composé d’un dictionnaire de
fonctions prédéfinies et d’un mécanisme de construction de nouvelles fonctions par l’utilisateur.
Les langages fonctionnels les plus connus sont : LISP :(LISt Processing - 1962) en fait c’est
essentiellement un langage de traitement de listes. SCHEME, ML...

Les langages logiques


Le principal représentant de la catégorie des langages de programmation logique est PROLOG
(PROgrammation en LOGique-1982). Dérivé de l’intelligence artificielle, il oblige le
programmeur à penser ses actions en termes de buts et à en faire une description relationnelle

55
(vision déclarative). Le langage Prolog est fondé sur un moteur d’inférence d’ordre 1 (logique des
prédicats), et permet l’exploration exhaustive automatique de différents chemins amenant à des
solutions.
Les langages orientés objets (L.O.O)
Les langages à objets : ils sont fondés sur une seule catégorie d’éléments : " les objets " qui
communiquent entre eux grâce à l’envoi de messages (grâce à des opérateurs appelés méthodes).
Par rapport à un langage impératif typé, un objet est l’équivalent d’une variable (simple ou
structurée) et la classe dont il est l’instance correspond au type de la variable. Comme exemple on
peut citer SIMULA-67 (1967) qui est le premier langage objet, SMALLTALK-80(1980), Eiffel
(1990),…

Les langages graphiques


LabVIEW (Laboratory Virtual Instrument Engineering Workbench) est un logiciel de
développement d'applications d'instrumentation. Mis au point par la société National Instrument,
ce logiciel, utilisable dans un grand nombre de domaines, est plus particulièrement destiné à
l'acquisition de données et au traitement du signal. Labview permet de réaliser des VI (Virtual
Instrument), pour mettre au point le graphe d'une fonction (ensemble d'opérations) et définir les
relations entre les terminaux et les points d'entrée/sortie du graphe. Toute application réalisée
avec LabVIEW sera appelée VI.
Le langage de programmation qu'utilise Labview (Le langage G) est un langage représenté sous
forme de graphe. C'est un langage de très haut niveau s'appuyant sur une machine virtuelle. Le
langage G se base sur le principe du flot de données, auquel ont été rajoutées des structures de
programmation afin d'obtenir un langage de programmation complet. Un diagramme flot de
données permet d'exprimer une fonction de manière graphique.

Les langages hybrides


Les langages hybrides sont de bons compromis entre des catégories différentes. Ils essaient
d’importer les qualités inhérentes à au moins deux catégories. La catégorie la plus utilisée est
celle des langages procéduraux. Par exemple, la plupart de ces langages bénéficient d’une
"extension" objet, comme C++ qui est une extension orientée objet du langage C. Le langage
Delphi de Borland qui allie l’approche pédagogique et typée du Pascal, l’approche objet du C++
et les approches visuelles et événementielles de Visual Basic.
Enfin, mentionnons l'important langage Java de Sun Microsystems qui permet le développement
multi-plateforme en particulier pour l’Internet et qui est grandement utilisé malgré son léger
manque de rapidité dû à sa machine virtuelle. En Java, le code généré est indépendant de la
machine qui l'exécute, ce qui permet de l'exécuter sur toutes les architectures à travers le réseau.
Il s'agit donc d'un code interprété (byte-code) par un interpréteur dépendant lui de l'architecture
sous-jacente, la machine virtuelle Java (JVM Java Virtual Machine). Les fichiers de byte-code
ont le suffixe .class, les fichiers sources ayant eux d'habitude le suffixe .java. Enfin, in faut
mentionner le tout récent langage C# support de développement de la plateforme Microsoft .Net,
(qui a été inventé par le père du langage Delphi) qui s'approprie des avantages de Java et de
Delphi. Il suit de très près la syntaxe de Java et celle de C++.

Les langages Script


Les langages Script telles que Perl, Python et TCL représentent un modèle très différent de
programmation que les langages de programmation procéduraux telles que C, Pascal ou Java.
Les langages de programmation procéduraux ont été conçus pour construire des structures de
données et des algorithmes à partir de zéro, à partir des éléments primitifs tels que des mots de
mémoire. Les langages Script sont conçus pour "coller" des applications; ils assument l'existence
d'un ensemble de composants puissants. Ils emploient des approches ‘typeless’ pour simplifier les

56
raccordements entre les composants et réaliser un niveau plus élevé de programmation et un
développement plus rapide d'applications que les langages de programmation procéduraux.
Plusieurs tendances récentes, telles que des machines plus rapides, meilleurs langages script,
l'importance croissante des interfaces utilisateur graphiques et des architectures composantes et la
croissance de l'Internet, ont considérablement augmenté l'importance des langages script.
Les deux langages sont typiquement employés ensemble dans un cadre de composants, où des
composants sont créés avec des langages de programmation procéduraux et collés à l'aide des
langages script.
Les langages scripts sont des langages de programmation créés pour raccourcir le processus
traditionnel de développement édition/compilation/édition de liens/exécution. Dans sa version la
plus simple, un script n'est qu'une suite de programmes à exécuter dans l'ordre.
Par "langage script" on désigne généralement les langages de programmation interprétés par
rapport aux langages compilés comme le C. On y trouve alors les langages de script les plus
connus qui sont :
Bash ; sh ; csh ; ksh ;
JavaScript ; Lisp ; Scheme
Matlab, Scilab, Octave
PHP ; Perl ;
Python (peut être compilé) ;
Ruby ; Tool Command Language (Tcl/Tk);
Visual Basic etc.

Comment développer un logiciel


Le développement méthodique d’un logiciel passe par une démarche de "descente concrète" de la
connaissance que l’humain a sur la problématique du sujet, vers l’action élémentaire exécutée par
un ordinateur. Le travail du programmeur étant alors ramené à une traduction permanente des
actions humaines en actions machines (décrites avec des outils différents).
L’activité de programmation consiste donc à transformer un problème selon une descente
graduelle de l’humain vers la machine. Ici nous avons résumé cette décomposition en 4 niveaux.
La notion de programmation structurée est une réponse à ce type de décomposition graduelle d’un
problème. L’algorithmique est la façon de décrire cette méthode de travail.
A une certaine époque, à ses débuts, l’activité d’écriture du logiciel ne reposait que sur
l’efficacité personnelle du programmeur laissé pratiquement seul devant la programmation d’un
problème. De nos jours, le programmeur dispose d’outils et de méthodes lui permettant de
concevoir et d’écrire des logiciels.
Le génie logiciel (software engeneering) concerne l'ensemble des méthodes et règles relatives à la
production rationnelle des logiciels. D'autre part le génie logiciel intervient lorsque le logiciel est
trop grand pour que son développement puisse être confié à un seul individu.

57
Chapitre 5 : Algorithmes et structures de données
Introduction
En informatique, la solution unique à un problème n'existe pas. Il est très rare qu'il y ait une
solution unique à un problème donné. Tout le monde a sa version d'un programme, contrairement
aux mathématiques où une solution s'impose relativement facilement. En plus, un problème est
traitable par informatique seulement si :
L'on peut parfaitement définir les données et les résultats,
L'on peut décomposer le passage de ces données vers ces résultats en une suite d'opérations
élémentaires dont chacune peut être exécutée par une machine.
En cours de programmation on ne travaille que sur des problèmes ayant déjà des algorithmes.
C’est pourquoi la plupart des exercices sont déjà spécifiés dans l’énoncé, ou bien leur
spécification est triviale. Dans le travail de recherche, il est généralement demandé au chercheur
de trouver ou d’inventer des algorithmes.
Un algorithme est un ensemble de règles qui décrivent comment résoudre un problème donné.
Le définition précise d'un algorithme est "une suite finie de règles à appliquer dans un ordre
déterminé à un nombre fini de données pour arriver, en un nombre fini d'étapes, à un certain
résultat, et cela indépendamment des données".
Pour un ordinateur, un algorithme est une séquence bien définie d'opérations et de règles (calcul,
manipulation de données, etc.) qui à partir d'un état initial, se termine à un état défini.
L'algorithme doit être défini rigoureusement : spécifier la façon d'appliquer les opérations dans
toutes les circonstances qui peuvent se produire. Donc, les cas particulier doivent être traité cas
par cas et les critères de chaque cas doivent être spécifiés clairement. L'ordre de calcul est aussi
important pour un algorithme. Les instructions sont habituellement considérées comme listées
explicitement et traitées comme commençant du début à la fin de l'algorithme.
Les algorithmes sont représentés par plusieurs notations : langage naturel, pseudocode,
organigramme (flowcharts), et langages de programmation. Pseudocode et organigrammes sont
des façons structurés pour exprimer les algorithmes qui permettent d'éviter beaucoup d'ambiguïtés
des langages naturels, tout en étant indépendant des langages de programmation utilisés pour
implémenter l'algorithme.

Organigramme
C'est une représentation graphique de l'algorithme. Il utilise un ensemble de symboles normalisés
(ISO 7805). Les étapes de l'algorithme sont représentés sous forme de boites reliés par des
flèches. Le paragraphe suivant montre les principaux symboles :

Procédé (symbole général de traitement)

On l'utilise pour représenter une opération (un groupe d'opérations) sur des données ou pour les
instructions pour les quels il n y a pas de symbole normalisé.

Sous programme (procédé défini)

58
Ce symbole est utilisé pour représenter une portion de programme considérée comme une simple
opération (sous programme, procédure, fonction).

Donnée (Entrée/sortie)

Ce symbole est utilisé pour représenter la mise à la disposition du programme d'une donnée à
traiter ou une opération d'enregistrement d'une donnée à effectuer.

Branchement (décision)

False

True

Ce symbole est utilisé pour représenter le test et l'exploitation d'une condition pour faire la
selection entre deux choix. Les etiquettes vraix, faut false, True Yes, No doivent obligatoirement
etre presentes. Sinon un petit cercle indique le choix pour le résultat faux. Une autre convention
aussi consiste à ce que la flèche sur le coté est le résultat du test lorsqu'il est faux et celui vers le
bas est le résultat du test lorsqu'il est vrai.

Renvoi (connecter)

1
1

Ce symbole est utilisé pour assuré la continuité d'une ligne de liaison pour représenter un
organigramme qui a une grande taille sur plusieurs pages par exemple. Ce symbole est utilisé
deux fois avec le même numéro par exemple.

Début et fin d'un organigramme


Start
End

Ce symbole est utilisé pour représenter le debut ou lafin de l'algorithme. Il contient generalement
le mot debut (Start) ou fin (End), ou toute autre phrase indiquant la même chose.

Structures complexes et boucles


Pour construire un organigramme, les symboles sont reliés par des lignes (flèches). La flèche
indique que le contrôle passe du traitement du quel la flèche commence au traitement ou se
termine la flèche.
Les opérations élémentaires peuvent, en fonction de leur enchaînement, être organisées suivant
quatre familles de structures algorithmiques fondamentales. La structure de l'organigramme peut
être une simple séquence linéaire. Elle consiste en un bloc d'opérations de traitement consécutives
inconditionnelles.

59
Quand il y a des séquences alternatives, la structure devient un peut complexe. Dans ce cas une
condition est testée. Si elle est vraie le traitement 1 est effectué sinon le traitement 2 est effectué.
Ce type de structure est pratiquement toujours utilisé au moins pour voir est ce que le programme
a terminer sont traitement ou non.

La structure alternative réduite se distingue de la précédente par le fait que seule la situation
correspondant à la validation de la condition entraîne l’exécution du traitement, l’autre situation
conduisant systématiquement à la sortie de la structure.
La séquence d'instruction la plus complexe est la séquence répétitive ou boucle qui consiste à
répéter un traitement plusieurs fois. On peut répéter un traitement donné tant qu'une certaine
condition n'est pas satisfaite (boucle while à gauche). Il faut remarquer que puisque le test de la
condition se fait avant le bloc d'instructions, celui-ci n'est pas forcément exécuté. Le traitement
peut se faire aussi avant le test comme pour la boucle (do while au milieu). Dans ce cas, le test se
fait après le bloc d'instructions, celui-ci est exécuté au moins une fois. La deuxième boucle
consiste à répéter le traitement jusqu'à ce qu'une certaine condition est satisfaite (boucle For à
droite).

Exemples
Le premier exemple est le calcul du factoriel d'un nombre naturel. N! = 1x2x3 x...x N. IL
fonctionne comme suit : on commence par lire N, on utilise deux valeurs M et F. la valeur du
factoriel F est initialisé à 1. La valeur M est utilisée comme compteur de boucle qui est
incrémenté de 1 jusqu'à N et chaque fois elle est multipliée par F. le résultat de la multiplication
est toujours stockée dans F. à la fin, le résultat F est affiché ou imprimé.

60
Le deuxième organigramme est pour la recherche d’une valeur donnée dans une suite représentée
par un tableau non vide à une dimension de longueur connue

Ces problèmes, fort simples, conduisent à des organigrammes simples. Mais la complexité des
problèmes et surtout des solutions trouvées induit souvent des organigrammes où les lignes
s’entrecroisent. Ce développement un peu anarchique ne facilite pas la lecture.

61
Le langage de description d'algorithme (Pseudocode)
Le pseudocode utilise un ensemble de mots clés et de structures permettant de décrire de manière
complète, claire, l’ensemble des opérations à exécuter sur des données pour obtenir des résultats.
C'est une composition séquentielle finie d’opérations de base que sont l’itération non bornée,
l’alternative, la composition et l’affectation agrémentées d’un ensemble dénombrable de variables
booléennes. Tout algorithme représenté par un organigramme peut être représenté à l’aide du
pseudocode. L’avantage d’un tel langage est de pouvoir être facilement transcrit dans un langage
de programmation structuré (Pascal, C…)

Structure de l'algorithme
Un algorithme est constitué de quatre parties
1. L’en-tête : Il permet tout simplement d’identifier un algorithme.
2. Les déclarations : C’est une liste exhaustive des objets, grandeurs utilisés et manipulés dans le
corps de l’algorithme ; cette liste est placée en début d’algorithme. Elle contient les variables, les
constantes et les fonctions.
3. Le corps : Dans cette partie de l’algorithme, on place les traitement à effectués.
4. Les commentaires : c'est du texte qui ne fait as partie du programme final exécuté par
l'ordinateur mais utilisé seulement pour permettre une lecture aisée de l’algorithme.

algorithme nom de l’algorithme ;


const
liste des constantes ;
var
liste des variables ;
struct
liste des structures ;
fonc
liste des fonctions ;
proc
liste des procédures ;
début
traitement 1 ;
traitement 2 ;
.
.
.
Traitement n ;
fin algorithme

Les constantes : représentent des chiffres, des nombres, des caractères, des chaînes de
caractères, … dont la valeur ne peut pas être modifiée au cours de l’exécution de l’algorithme.
Les variables : Elles peuvent stocker des chiffres des nombres, des caractères, des chaînes de
caractères,… dont la valeur peut être modifiée au cours de l’exécution de l’algorithme.
Une variable ou une constante est un "endroit" pour contenir une valeur ou plusieurs valeurs. Ils
sont définis dans la partie déclarative de l'algorithme par deux caractéristiques essentielles, à
savoir :
• L’identificateur : c’est le nom de la variable ou de la constante. Il est composé de lettres et de
chiffres
• Le type : il détermine la nature de la variable ou de la constante. Nous considérerons quatre
types de base :

62
1. L’entier : pour représenter les nombres entiers. Exemple :
45, 36, –564, 0 … en décimal
45h, 0FBh, 64h … en hexadécimal
% 10101111, %1011 … en binaire
2. Le réel : pour représenter les nombre fractionnaires comme 3.1415 ou 3 e-9…
3. Le booléen : Il ne peut prendre que deux états : VRAI ou FAUX
4. Le caractère et chaîne de caractères : ‘a’, ‘A’,’*’,’7’,’z’,’ !’…., 'PC', 'prog'

Tous les langages, quels qu’ils soient offrent un certain nombre de types de données, dont le
détail est susceptible de varier légèrement d’un langage à l’autre. Grosso modo, on retrouve
cependant les types suivants :

Type de donnée Plage


Byte (octet) 0 à 255
Entier simple précision -32 768 à 32 767
Entier long -2 147 483 648 à 2 147 483 647
Réel simple précision -3,40E38 à -1,40E-45 pour les valeurs négatives
1,40E-45 à 3,40E38 pour les valeurs positives
Réel double précision 1,79E308 à -4,94E-324 pour les valeurs négatives
4,94E-324 à 1,79E308 pour les valeurs positives

Il n'est cependant pas toujours nécessaire de déclarer les variables, c'est à dire de leur donner un
type de données. Déclarer une variable par un type c'est présupposer que le langage est typé, or
tous les langages ne sont pas.
Typer une variable peut avoir des problèmes avec les langages et compilateurs car les types sont
bornés. Par contre, il n'y a aucune raison de supposer dans l'algorithme que les mathématiques
"normales" ne s'appliquent pas, et donc en algorithmique, 32767+1 doit toujours faire 32768.

L’affectation (ou assignation ←) qui s’écrit de la façon suivante :


Nom de variable ← valeur (ou expression calculable);
Permet de donner la valeur de l'expression de droite à la variable de gauche. Elle se fait toujours
en deux temps :
1. évaluation de l’expression située à droite du symbole
2. affectation du résultat à l’identificateur de variable

Exemple
Calcule les solutions de l'équation du second degré ax2+bx+c = 0 avec a et c de signe contraire :
delta ← b*b - 4*a*c
rd ← racinecarée( delta )
s1 ← ( - b - rd ) / ( 2*a )
s2 ← (c/a) / s1 (ou on peut écrire s2 ← ( -b + rd ) / ( 2*a ))

Comment permuter deux variables ? Par exemple, si la variable A vaut 5 et la variable B vaut 3,
quelles instructions écrire pour que A contienne la valeur de B c'est à dire 3 et que B contienne la
valeur de A c'est à dire 5?

Temp A
AB
B  Temp

63
Les structures (types complexes) : permettent de rassembler plusieurs variables ou
constantes sous un même identificateur; produisant un type de variable ou constante complexe.
Ceci comporte particulièrement les tableaux. Un tableau est un ensemble de valeurs portant ainsi
le même nom de variable et repérées par un nombre. Et le nombre qui sert à repérer chaque valeur
s’appelle un indice.
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, de booléens, de tout ce qui existe dans un langage donné
comme type de variables.
La valeur d’un indice doit toujours :
• être égale au moins à 0 ou à 1 (dans certains langages, le premier élément d’un tableau
porte l’indice zéro, dans d’autres l’indice 1)
• être un nombre entier.
• être inférieure ou égale au nombre d’éléments du tableau.

Les opérateurs : ce sont les symboles utilisés pour représenter les opérations arithmétique,
logiques ou de comparaison entres les variables et les constantes. Une suite de variables (ou
constantes) et d’opérations constitue une expression. Exemples :
(+) addition (-) soustraction, (*) multiplication (/) division …
(>) Supérieur < inférieur (=) égal (≤) inférieur ou égal …
Enfin, on a le droit d’utiliser les parenthèses, avec les mêmes règles qu’en mathématiques. La
multiplication et la division ont " naturellement " priorité sur l’addition. Les parenthèses ne sont
ainsi utiles que pour modifier cette priorité naturelle.

La procédure : C’est un ensemble d’instructions référencé par un nom, et dont l’exécution est
provoquée par le simple énoncé de ce nom.
La fonction : Comme pour la procédure, l’exécution d’une fonction est provoquée par la simple
évocation de son nom, à la différence qu’elle se voit assigner une valeur dont le type doit être
défini.
L’intérêt des procédures et fonctions est de permettre :
• Une lecture plus facile de l’algorithme principal.
• De développer de manière indépendante des parties d’algorithmes dont l’emploi multiple au
sein de l’algorithme principal est ainsi rendu plus aisé.
Pour fournir à une procédure les informations qui doivent être traitées, et pour que la procédure
puisse fournir en contrepartie des résultats, on utilise des paramètres. On distinguera trois types
de paramètres :
• Les paramètres entrants peuvent être consultés (et éventuellement modifiés) à l'intérieur
de la procédure.
• Les paramètres sortants dont la valeur sont déterminés à l'intérieur de la procédure et
utilisable après l'appel à la procédure.
• Les paramètres mixtes ont une valeur à l'entrée dans la procédure, valeur qui peut être
modifiée à l'intérieur de celle-ci, la modification étant répercutée à l'extérieur de la
procédure.
Une fonction est dite récursive si elle s'appelle elle-même. Par exemple pour calculer le factoriel,
au lieu d'utiliser fact(N)= N x (N-1)x (N-2) x ….2x1 on peut utiliser fact (N)=N x fact(N-1).

Les entrées /sorties


Dans le but de traduire l'algorithme en un programme d'ordinateur, les entrées et les sorties ont le
rôle de gérer l'interaction avec l'utilisateur, à savoir la sortie à l'écran et l'entrée au clavier (il y a
aussi entrées et sorties sur imprimante, sur fichier), avec les actions correspondantes de lecture et
écriture.

64
Pour écrire sur l'écran, on utilise le mot ÉCRIRE. Par exemple, l'instruction suivante : ÉCRIRE
Val ;
Affiche le contenu de la variable VAL à l'écran.
Pour lire sur le clavier, on utilise le mot LIRE. Par exemple, l'instruction suivante :
Lire A ;
Donne au contenu de la variable A la valeur entée au clavier.

Les expressions conditionnelles complexes


Nous utilisons SI pour indiquer le début de la conditionnelle simple et FINSI pour en indiquer la
fin. Le mot ALORS qui pourrait être facultatif, a pour but d'aider à la lecture. S'il y a quelque
chose à faire si la condition n'est pas vérifiée, on utilise le mot SINON. Exemple :
SI condition1
ALORS action1
FINSI

SI condition1
ALORS action1
SINON action2
FINSI

SI condition1 ALORS
action1
SI condition2
ALORS action2
SINON action3
FINSI
FINSI

Branchements multiples
S'il y a beaucoup de tests à effectuer sur une même variable ou sur plusieurs, on peut alors
recourir à une structure de cas (choix). Cette structure permet, aussi en fonction de plusieurs
conditions de type booléen, d’effectuer des actions différentes suivant les valeurs que peut
prendre une même variable.
AUX CAS OU
CAS [condition 1] Action1
CAS [condition 2] Action2
...
AUTRES CAS Action
FIN DES CAS

On peut aussi trouver la notation suivante :


SUIVANT valeur FAIRE
valeur1 : action1 ;
valeur2 : action2 ;
:
:
valeurN : actionN ;
sinon action N+1 ;
FINSUIVANT;

65
Les Boucles
Une boucle POUR (itérative déterminée) suit la syntaxe
POUR [variable] DE 1 A [constante ou variable]
Suite d'instructions
FINPOUR [rappel de la variable]
Dans cette structure, la sortie de la boucle d’itération s’effectue lorsque le nombre souhaité de
répétition est atteint.
Si la valeur finale de l’indice est inférieure à sa valeur initiale le pas de variation est négatif, la
structure est dite « pour décroissante »; dans le cas contraire, le pas est positif et la structure est
dite « pour croissante »

Exemple
Somme 0
POUR x DE 1 A 1000
Somme somme +x
FINPOUR x

Afin que les algorithmes donnent des résultats "intuitifs", il faut imposer trois règles à respecter
dans le corps de la boucle
1 - on n'a pas le droit de modifier l'indice de boucle,
2 - on n'a pas le droit de modifier la borne de boucle,
3 - on ne peut pas réutiliser la dernière valeur d'indice de boucle.

La boucle TANT QUE (itérative indéterminée) a pour syntaxe

[Initialisation des variables du test]


...
TANT QUE [test ou variable logique]
[Suite d'instructions]
[Modification des variables du test]
FINTANT QUE [rappel du test]

Dans cette structure, on commence par tester la condition ; si elle est vérifiée, le traitement est
exécuté.
Exemple :
k 1
TANT QUE k <= n
[Suite d'instructions]
kk+1
FINTANTQUE
Dans la structure RÉPÉTER JUSQU’À, le traitement est exécuté une première fois puis sa
répétition se poursuit jusqu’à ce que la condition soit vérifiée.
REPETER
action;
JUSQU'A [condition vraie]

L’organigramme de la recherche d'une valeur dans un tableau peut être écrit :


I  1;
TANTQUE ( I ≤ N et A(I) ≠ K)
I  I+1

66
FINTANTQUE;
SI (I = N+1)
ALORS ECRIRE ‘ABSENT’
SINON ECRIRE I
FINSI

Exemple (tri par sélection d'un tableau)


Cette méthode est très simple. Supposons que l'on veuille trier les n éléments du tableau t en
ordre croissant. On commence par parcourir le tableau pour trouver la plus petite valeur. On la
place à l'indice 0. Ensuite, on recommence à parcourir le tableau à partir de l'indice 1 pour trouver
la plus petite valeur que l'on stocke à l'indice 1. Et ainsi de suite pour l'indice 2, 3 jusqu'à n - 2.

Fonction trierSelection(ELEMENT * t, ENTIER n):


i 0;
tant que (i < n - 1) faire
j i + 1;
tant que (j < n) faire
si (t[j]<t[i]) alors
tmp t[j];
t[j] t[i];
t[i] tmp;
fin si;
j j + 1;
fin tant que;
i i + 1;
fin tant que;
fin fonction;
La fonction se déroule de la manière suivante. Le tableau est parcouru du premier élément (indice
0) à l'avant dernier (indice n - 2). On note i l'indice de l'élément visité à une itération donnée. On
compare l'élément i avec chaque élément j qui suit dans le tableau, c'est-à-dire de l'indice i + 1
jusqu'à l'indice n - 1. Si l'élément d'indice j est plus petit que l'élément d'indice i alors on permute
i et j dans le tableau.

Complexité des algorithmes


Il y a des algorithmes qui complètent le traitement en un temps linéaire proportionnel à la taille
des données, d'autres en un temps exponentiel et d'autres ne terminent jamais. Il y a des
problèmes qui ont plusieurs algorithmes, d'autres peuvent ne pas avoir d'algorithmes et d'autres
n'ont pas d'algorithme efficace connu. Il est donc important de connaître combien de ressources
(temps et stockage) sont nécessaire pour un algorithme donné.
La complexité d'un algorithme exprime ce dont il a besoin en ressources pour aboutir au résultat.
C'est le nombre d'opérations élémentaires (affectations, comparaisons, opérations arithmétiques)
effectuées par l'algorithme. Elle s'exprime en fonction de la taille n des données. On dit que la
complexité de l'algorithme est O(f(n)) où f est d'habitude une combinaison de polynômes,
logarithmes ou exponentielles. Elle signifie que le nombre d'opérations effectuées est borné par
cf(n), où c est une constante, lorsque n tend vers l'infini. Ceci est justifié par le fait que les
données des algorithmes sont de grande taille et qu'on se préoccupe surtout de la croissance de
cette complexité en fonction de la taille des données.
Dans la pratique :
- les opérations qui consomment peu de temps, telles que les tests, les affectations et les
incrémentations ne sont pas comptabilisées.

67
- les opérations ne faisant pas partie de l'algorithme, comme les E/S (scanf et printf) ne sont pas
comptabilisées.
Les algorithmes usuels peuvent être classés en un certain nombre de grandes classes de
complexité :
- Les algorithmes sub-linéaires, dont la complexité est en général en O(log n). C'est le cas de la
recherche d'un élément dans un ensemble ordonné fini de cardinal n.
-Les algorithmes linéaires en complexité O(n) ou en O(nlog n) sont considérés comme rapides,
comme l'évaluation de la valeur d'une expression composée de n symboles ou les algorithmes
optimaux de tri.
-Plus lents sont les algorithmes de complexité située entre O(n2) et O(n3), c'est le cas de la
multiplication des matrices et du parcours dans les graphes.
-Au delà, les algorithmes polynomiaux en O(nk) pour k > 3 sont considérés comme lents, sans
parler des algorithmes exponentiels (dont la complexité est supérieure à tout polynôme en n) qui
sont impraticables dès que la taille des données est supérieure à quelques dizaines d'unités.

Principes de conception d'algorithmes


La conception (et la vérification) d'un algorithme passe par les étapes suivantes :
Analyse : définition du problème en termes de séquences d'opérations de calcul de stockage de
données, etc.;
Conception : définition précise (proche du langage de programmation) des données, des
traitements et de leur séquencement ;
Implémentation : traduction et réalisation de l'algorithme dans le langage cible ;
Test : vérification du bon fonctionnement de l'algorithme.

Exemple Calcul de la somme des N premiers entiers positifs


-Analyse
1 Déterminer ou préciser N
2 Calculer la somme des N premiers entiers positifs
3 Renvoyer du résultat

- Premier raffinement :
1 lire N
2 boucles sur les N premiers entiers positifs ; calcul de la somme
3 afficher somme

-Deuxième raffinement de la phase 2


somme  0
pour i = 1 à N
somme  somme + i

Conception
Entiers N, i, somme
ECRIRE "Donner N"
LIRE N
SI N ≤ 0 alors ERREUR
POUR i = 1 à N
somme somme + i
FINPOUR x
ECRIRE "La somme est : " somme

68
Implémentation : (en langage C dans un fichier appelé "sommeNentiers.c")
#include<stdio.h>
int main(void)
{
int n, i, somme = 0;
printf("Donner n : \n");
scanf("%d", &n);
if(n ≤ 0)
{
printf(" n doit etre > 0 !\n");
return(-1); /* code erreur*/
}
for (i = 1; i ≤ n; i++)
somme += i;
printf("Somme: %d\n", somme);
return(0); // bon fonctionnement
}

Test
>sommeNentiers
Donner n :
-1
n doit etre > 0 !
>sommeNentiers
Donner n :
7845
Somme : 30775935

Pratique du développement d'algorithmes


Procéder par raffinements successifs, en particulier pour la phase d'analyse, en précisant les
éléments manquants ou ambigus de l'énoncé. Dans le cas de l'exemple :
s'agit-il d'une interaction avec l'utilisateur ou d'une fonction ?
peut-on utiliser le théorème permettant d'obtenir directement le résultat ?
à cause de l'éventuelle complexité du processus, il est souvent nécessaire de faire des retours en
arrière pour corriger ou compléter la phase en cours ou une phase précédente. Dans tous les cas
de figure il faut veiller à bien maintenir la cohérence ; prévoir les erreurs de calcul et d'utilisation.
Il faut vérifier le bon fonctionnement de l'algorithme dans tous les cas. Il existe plusieurs façons
de procéder :
preuve mathématique : moyen le plus sûr mais assez difficile à mettre en œuvre ;
test de tous les cas : preuve " pratique" du bon fonctionnement, mais trop long voire même
impossible à mettre en œuvre ;
test de tous les chemins logiques, des conditions limites et des cas d'erreur. Dans le cas de
l'exemple :
-N≤0;
- plusieurs valeurs valables de N;
- N =1 ;
- N = INT_MAX.

69
Chapitre 6 : Compilateurs, Liens et Bibliothèques
Introduction
La génération d'un exécutable à partir des fichiers sources se fait en plusieurs étapes, qui sont
souvent automatisées à l'aide d'outils comme Make ou SCons (Python) ou bien encore des outils
spécifiques à l'environnement de développement intégré (IDE) utilisé.

Les étapes de la génération des fichiers binaires


Les étapes menant des sources au fichier exécutable sont au nombre de quatre :

Préprocesseur : Durant cette étape, le préprocesseur effectue plusieurs opérations sur les fichiers
sources, dont les instructions (les directives du préprocesseur) sont au sein même de ces fichiers.
Le préprocesseur produit alors des fichiers intermédiaires pour chaque fichier source, qui seront
utilisés dans l'étape suivante.
Le préprocesseur effectue des remplacements de textes, des inclusions de fichiers avec la
possibilité d'effectuer certaines opérations uniquement si certaines conditions sont remplies. C'est
également durant cette étape que les commentaires sont supprimés.

Compilation : Un compilateur transforme un programme écrit en langage évolué en une suite


d'instructions machine (génération du code assembleur). La compilation d'un programme est
réalisée en trois phases :
1. l'analyse lexicale, qui est la reconnaissance des mots clés du langage. Elle consiste à
découper le programme en petites entités : opérateurs, mots réservés, variables,
constantes numériques, alphabétiques, etc.
2. l'analyse syntaxique, qui analyse la structure du programme et sa conformité avec la
norme l'écriture d'un code isomorphe à celui de l'assembleur. Elle consiste à expliciter la
structure du programme sous forme d'un arbre, appelé arbre de syntaxe, chaque noeud de
cet arbre correspond à un opérateur et ses fils aux opérandes sur lesquels il agit.
3. La génération de code est une opération qui consiste à construire la suite d'instructions du
microprocesseur à partir de l'arbre de syntaxe.
Pour des programmes de plusieurs milliers de lignes, il est bon de les découper en des fichiers
compilés séparément. Pour chaque fichier source, on obtient un fichier en langage d'assemblage.
Certains compilateurs (comme C) fonctionnent en deux phases, la première générant un fichier
compilé dans un langage intermédiaire destiné à une machine virtuelle idéale (P-Code) portable
d'une plateforme à l'autre, la seconde convertissant le langage intermédiaire en langage
d'assemblage dépendant du microprocesseur utilisé sur la plateforme cible.
D'autres compilateurs permettent de ne pas générer de langage d'assemblage, mais seulement le
fichier compilé en langage intermédiaire, qui sera interprété ou compilé automatiquement en code
natif à l'exécution sur la machine cible (par une machine virtuelle).

Assemblage : Cette étape consiste en la génération, à partir du code assembleur, d'un fichier objet
pour chaque fichier assembleur. Ce fichier objet est généralement d’extension ".o" sous Linux, ou
".obj". Cette phase est parfois regroupée avec la précédente, dans ce cas le compilateur génère
directement un fichier objet binaire.
Pour les compilateurs qui génèrent du code intermédiaire, cette phase d'assemblage peut aussi
être totalement supprimée : c'est la machine virtuelle qui interprétera ou compilera ce langage en
code machine natif directement sur la machine hôte. Dans ce cas, la machine virtuelle qui
interprète le langage intermédiaire ou le compile en code natif optimisé pour la machine hôte,
peut être un composant du système d'exploitation ou une bibliothèque partagée installée sur celui-

70
ci, et cette machine virtuelle ne sera même pas incluse dans le programme final.

Édition de liens (LI8K) : L'édition de liens est la dernière étape et a pour but de réunir tous les
éléments d'un programme. Les différents fichiers objets sont alors réunis, ainsi que les
bibliothèques statiques, pour ne produire qu'un seul fichier exécutable. Le but de l'édition de lien
est de sélectionner les éléments de code utiles présents dans un ensemble de codes compilés et de
bibliothèques, et de résoudre les références mutuelles entre ces différents éléments afin de
permettre à ceux-ci de se référencer directement à l'exécution du programme.
L'édition de lien peut avoir lieu aussi avec les compilateurs générant du langage intermédiaire,
afin de générer un seul en langage intermédiaire où toutes les références sont résolues et un
fichier facilement installable.
Mais même cette dernière phase d'édition de liens en langage intermédiaire est parfois aussi
supprimée, celle-ci étant alors réalisée uniquement lors du chargement du programme directement
par la machine virtuelle hôte. Dans ce cas, elle est le plus souvent remplacée par la création d'un
paquetage
On note un très vif regain d'intérêt pour les machines virtuelles, en raison de la grande variété des
systèmes hôtes et des très rapides évolutions technologiques de celles-ci, car cela facilite très
nettement le déploiement des programmes, le programmeur n'ayant plus alors besoin de générer
autant de programmes exécutables que de types de systèmes cibles.

Types de fichier binaires exécutables


Exécutable
Sous DOS et Windows, l'extension (.EXE, .COM) indique que le fichier est un programme
exécutable. Sous linux, il n'y a pas d'extension particulière. Le terme "exécutable" s'applique
généralement aux programmes compilés et traduits en code machine, dans un format qui peut être
cherché en mémoire et exécuté par le microprocesseur. Tout code supplémentaire utilisé dans le
programme (par exemple, les fonctions de bibliothèque standard de C) sera inséré dans le fichier
exécutable lui-même. Ce code est généralement fourni sous forme de fichier objet (OBJ) par
l'environnement de développement. Le programme exécutable sera ainsi autosuffisant et on
pourra l'installer facilement sur n'importe quelle machine en le copiant dans un répertoire. Par
contre, le problème est que cette façon rend le partage des fichiers binaires difficile. Pour utiliser
aussi le code de ce programme, dans une autre application, il est nécessaire d'avoir accès au code
source.

Fichier LIB (édition de lien Statique)


Si le développement d'un gros programme devient très complexe, il y a un besoin d'employer du
code développé par d'autres personnes pour des taches particulières. Par exemple, on veut
développer un programme qui fonctionne sur le réseau, on peut employer une bibliothèque qui se
charge des sockets. De telles bibliothèques sont disponibles sous forme de fichier bibliothèque
(LIB). Un fichier LIB contient le code objet de la bibliothèque. L'édition de lien a la tâche de
s'assurer que le code objet sera fusionné avec l'EXE. Cette opération s'appelle "édition de lien
Statique". L'avantage des fichiers LIB est la possibilité de réutiliser le binaire directement sans la
nécessité d'avoir le code source. Tout dont on a besoin est un fichier LIB et d'un peu de
documentation (ou un fichier d'en-tête .h) pour vérifier la syntaxe de la fonction. Les problèmes
sont que l'EXE sera d'une très grande taille parce que le code de la bibliothèque est reproduit dans
chaque EXE. En plus, dans un environnement multitâche, deux copies de la même fonction de
bibliothèque seraient en mémoire inutilement. Finalement, n'importe quel changement dans une
fonction de la bibliothèque exige la recompilation de l'EXE, pour être inclut.

71
Dynamic link library DLL
Une DLL (fichier avec extension .DLL) est une bibliothèque liée dynamiquement utilisée par
Windows. C'est un ensemble de modules qui contient un ensemble de fonctions ou d'autres DLLs
appelées. Le code de la bibliothèque est isolé de celui des fichiers exécutables pour permettre de
les stockées séparément et d'être chargé seulement une fois nécessaire, par un programme. En
plus, une DLL a plusieurs avantages. D'abord, elle est facile de créer comparée aux applications
et elle ne consomme aucune mémoire jusqu'à ce qu'elle soit employée. Deuxièmement,
puisqu'une DLL est un fichier séparé, un programmeur peut apporter des corrections ou des
améliorations seulement à ce module sans affecter l'opération du programme d'appel ou de
n'importe quelle autre DLL. Enfin, un programmeur peut employer la même DLL avec d'autres
programmes et partager seulement une copie d'elle, dans la mémoire.
Le problème avec les DLLs est que quand un programme a été testé avec une version particulière
de la DLL et qu'une autre installation du programme met à jour la DLL avec une nouvelle
version, le programme peut ne pas fonctionner bien ou du tout (DLL hell).
Dans l'environnement Linux/UNIX, le même concept est mis en application dans les fichiers
d'objets partagés (.so).

COM (Component Object Model)


Les COM sont des spécifications développées par Microsoft pour construire des composants de
logiciel qui peuvent être assemblés aux programmes ou ajouter des fonctionnalités aux
programmes existants fonctionnant sur des plateformes Windows. A la différence des DLLs, au
moment de compilation, il y a une dépendance très faible aux objets de bibliothèque, quand le
programme utilise un objet COM. Ils sont aussi indépendants du langage. Ainsi ils doivent suivre
la même disposition en mémoire exigé par les spécifications. Les composants COM peuvent être
enlevés (débranchés) d'un programme au moment de l'exécution sans recompiler le programme.
COM est la base de OLE (object linking and embedding), ActiveX, et DirectX.
Le problème des COM est leur complexité parce qu'ils sont difficiles à apprendre, comprendre et
ont besoin d'être stockés dans la base des registres. Une référence à un objet COM sera résolue
avec une relation GUID (globally unique identifier)-location, stocké dans la base des registres.

Les fichiers compilés .8ET


Le code compilé pour .NET est stocké en tant qu'assembleur. L'assembleur stocke :
IL code.
Metadata d'Assembleur (manifests).
Identité : nom, de version et Information de culture.
Noms des fichiers dans l'assembleur.
Données de type d'accès : privé ou autrement.
Permissions de sécurité.
Type metadata.
Détails des types, des méthodes et des propriétés dans l'assembleur.
Ressources : un code assembleur est auto-descriptif. Il ne dépend pas d'objets externes comme
liens de da base de registres ou des fichiers de bibliothèque pour la réutilisation.

Les avantages de .NET sont que le fichier est complètement auto-descriptif et indépendant des
langages. Deux versions du même code assembleur peuvent être chargées : c'est possible parce
que le manifeste stocke également l'information de version (finit DLL hell.). Enfin, l'installation
des programmes est facile parce qu'un un programme utilisateur peut juste avoir le code
assembleur dans le même répertoire ou GAC (Global Assembly Cache) pour pouvoir utiliser les
objets définis. Par contre, .NET framework doit être installé (comme Java exige JVM) et les
programmes deviendront plus volumineux pour le téléchargement ou l'installation. Enfin, puisque
l'assembleur stocke le metadata très détaillé, la décompilation du code assembleur est possible.

72
Chapitre 7 : Langage C
Introduction
Le langage C est apparu au cours de l'année 1972 dans les Laboratoires Bell. Il était développé en
même temps qu'UNIX par Dennis Ritchie et Ken Thompson. Sa définition rigoureuse fut en
1978. Il est appelé C parce qu'il a un prédécesseur appelé le langage B.
Le langage C est suffisamment général pour permettre de développer des applications variées
type scientifique ou encore pour l'accès aux réseaux et aux bases de données. De nombreux
logiciels du domaine des PC tels que Microsoft Word ou Excel, sont eux aussi écrits en langage C
ou de son successeur orienté objet C++.

Les atouts du C
•L’un des langages les plus utilisés; il est devenu un standard. Normalisation ANSI (American
National Standard Institut) en 1988, puis ISO (International Standardisation Organization).
•Instructions et structures de haut niveau (presque un langage parlé) :
Le langage C n'a pas l'ambition d'obliger les programmeurs à respecter un quelconque style de
programmation, il est en effet peu contraignant au niveau de la compilation et il offre peu de
restrictions sémantiques. En particulier, la mise en page est libre, ce qui permet d'écrire des
programmes dont la mise en page reflète la structure.
•un code rapide grâce à :
-un compilateur performant. Les concepteurs du C l'ont créé pour leur propre utilisation, ils ont
donc préféré favoriser l'expressivité du langage (d'où la richesse des expressions) que d'éviter les
erreurs de programmation en multipliant les tests à la compilation.
-Des instructions proches du langage machine. Le langage C a été conçu et réalisé pour écrire un
système d'exploitation et les logiciels de base de ce système (interpréteur de commande,
compilateur, ...). Pour ce faire, il doit être capable de faire les mêmes choses que l'assembleur.
•Le langage C est populaire chez les électroniciens (on peut même dire que c'est leurs langage).
- Il est utilisé pour développer avec les programmes pour les autres micro microprocesseurs et
micro contrôleurs comme : mplab du pic de microchip. Avr ......
- Il est utilisé pour les DSP. Voir par exemple code composer studio de Texas instrument.
- Il est le langage naturel de Unix et Linux (voir le code source de Linux).
- Il y a même des tentatives comme (SystemC) qui proposent de traduire directement le langage
en portes logiques ou de généré du HDL pour programmer une FPGA.
-Il a une interface avec les langages script comme python et Tcl.
- Il a une interface avec Matlab.
Conception et description  langage C  Programme C  Compilation  Programme
exécutable d'un algorithme
Exécution d'un programme

Programme C (Ecrire le code source)



Compilateur (Créer un code exécutable)

Programme objet

Editeur de liens

Données → Programme exécutable → Résultat

73
Exemple de programme C (Hello world)
Selon la tradition, on va commencer la découverte de C par l'inévitable programme 'hello world'.
Ce programme ne fait rien d'autre qu'imprimer le message "Hello world" sur l'écran :
# include <stdio.h>
main ( )
// 8otre premier programme en C
{
Printf ("Hello, world\n");
return 0;
}
Dans la suite, nous allons discuter les détails de cette implémentation :
Le Préprocesseur
Un Préprocesseur traite le code avant la compilation et effectue des substitutions de macros, une
compilation conditionnelle, et l’inclusion de fichiers par leurs noms. En plus, le Préprocesseur
permet :
•Simple substitution de texte.
•Augmente la lisibilité du code source.
•Augmente la vitesse d’exécution du programme.
•Facilite le débogage.

Les principales commandes du préprocesseur sont :


- # define identificateur chaîne :
Le Préprocesseur remplace identificateur par chaîne dans le code source.
- # include <nom-de-fichier> :
On inclut le fichier texte "nom-de-fichier". Le texte du fichier est alors recopié à l'endroit de la
commande. Le Préprocesseur recherche "nom-de-ficher" dans les répertoires standards et l’insère
dans le code source.
- # include "nom-de-fichier"
La même chose que précédemment sauf que le Préprocesseur recherche "nom-de-ficher" dans le
répertoire courant, et l’insère dans le code source.
-La compilation conditionnelle :
Il y a plusieurs instructions de compilation conditionnelle propres au Préprocesseur dont la
syntaxe est la suivante :
- # if expression-constante ou # ifdef indentificateur ou # ifndef identificateur
# ifdef identificateur équivaut à # if defined (identificateur); de même # ifndef(=if !defined).

# ifdef (identificateur).
- texte
- # elif expression-constante
- texte
- # else
- texte
- # endif
La compilation conditionnelle permet d’éviter une redondance du code lors des multiples appels
#include "module.h". Par ailleurs, l’inclusion de fichier.h dans fichier.c (qui n’est à priori pas
nécessaire) permet au Préprocesseur de vérifier la cohérence entre les déclarations et les
définitions.
Les fichiers h standards les plus utilisés sont :
La bibliothèque standard stdio.h
La bibliothèque standard stdlib.h
La bibliothèque standard math.h

74
8otion de fonction en C
Les programmes en C sont composés essentiellement de fonctions et de variables. Il est donc
indispensable de se familiariser avec les caractéristiques fondamentales de ces éléments.
En C, le programme principal et les sous-programmes sont définis comme fonctions. Il n'existe
pas de structures spéciales pour le programme principal ni les procédures (comme en Pascal).Le
programme principal étant aussi une 'fonction'.
La fonction principale des programmes C est appelée main. Elle se trouve obligatoirement dans
tous les programmes. L'exécution d'un programme entraîne automatiquement l'appel de main.
Par définition, toute fonctions en C (y compris main) doit avoir des arguments d'entrée et fournit
un résultat (de sortie) dont le type doit être défini. Si aucun type n'est défini explicitement, C
suppose par défaut que le type du résultat est int (integer). Le retour du résultat se fait en général
à la fin de la fonction par l'instruction return. Le type d'une fonction qui ne fournit pas de résultat
est déclaré comme void (vide).
Enfin, si nous utilisons des fonctions prédéfinies (par exemple : printf), il faut faire précéder la
définition de main par les instructions #include correspondantes.

Définitions de base:
-Déclarations : Le rôle d’une déclaration est de préciser le nom (identifiant) et le type d’une
variable (ou une fonction, etc).

-Instructions : la liste des opérations à effectuer et qui définit l'action qui doit être exécutée. On
appelle instruction, une instruction simple se terminant par un point-virgule. Par exemple :
printf("Hello, world\n");

-Un bloc d'instructions : délimité par des accolades {…} regroupe plusieurs instructions. En C,
toute instruction simple est terminée par un point-virgule; même si elle se trouve en dernière
position dans un bloc d'instructions.

-Les variables : Une variable en C est désignée par un nom qui est une chaîne de caractères
(commençant par une lettre) appelée identificateur. Une variable a une adresse, un type et une
valeur.

-Les types : À toutes données doit correspondre un type, qui autorise la réservation d’une zone
mémoire de taille prédéfinie. Chaque variable a un type. Elle est déclarée avec son type par :
int n ;
Les types de base en C sont :
char caractères
int entiers
float réel en virgule flottante
double float double précision
Les précisions des types du C sont les suivantes :
short int 2 octets -32 768 … 32 767
unsigned short int 2 octets 0 … 65 535
long int 4 octets -2 147 483 647 … 2 147 483 648
unsigned long int 4 octets 0 … 4 294 967 295
float 4 octets simple précision, 1.18 E +/- 38
double 8 octets double précision, 9.46 E -308 … 1.8 E 308
long double 10 octets
char 1 octet -128 … 127
unsigned char 1 octet 0 … 255

75
Pour le cas des variables booliennes, en C, une expression conditionnelle est fausse, quand elle
prend la valeur (entière) 0, et vraie dans tous les autres cas.
Il existe aussi des types plus compliqués comme les tableaux et les structures.

-L’initialisation des variables :


L’initialisation consiste à spécifier la valeur d’une variable au moment de la création de sa zone
mémoire. En l’absence d’initialisation explicite :
- les variables externes et statiques sont toujours initialisées à zéro.
- les variables automatiques et les variables-regitres ont des valeurs initiales indéfinies.
On peut initialiser les variables scalaires simplement en écrivant :
int x = 1 ; char c = ’a’ ; long j = 1000L * 100L ;
Pour les variables externes et statiques, l’initialisateur doit être une expression constante;
-Les expressions : Une expression exprime un calcul, et possède une valeur typée. Les éléments
de base de construction d’une expression sont d’une part les données (les constantes littérales, les
variables) et d’autre part les traitements (les fonctions, les opérateurs). On construit une
expression en utilisant des variables et des constantes puis des opérateurs choisis parmi :
• Les opérateurs arithmétiques : + , - , * , / , …
• Les comparateurs : > , >= , == , ! = , …
• Les opérateurs logiques : && (AND), | | (OR) ! (NOT)
Elle peut être (le résultat de l’expression) de type char, int ou float.

-Les opérateurs : Les opérateurs sont des traitements prédéfinis, propres au langage, à la
différence des fonctions qui sont des traitements définis par le programmeur.
On distingue, selon la place de l’opérateur par rapport aux opérandes, les opérateurs :
Préfixes : op d1 d2 infixes : d1 op d2 postfixes : d1 d2 op.
Pour évaluer ces expressions sans ambiguïtés, on définit un ordre de priorité entre les opérateurs.
Les parenthèses possèdent l’ordre de priorité maximum. L’associativité définit le sens du
traitement gauche-doite, ou droite-gauche, des expressions constituées d’opérateurs de même
priorité. Le tableau suivant résume les ordres de priorités des différents opérateurs arithmétiques
et logiques du langage C.

En plus des opérateurs arithmétiques usuels le C définit aussi :


- l’opérateur sizeof (type ou variable) qui retourne la taille en octet du type ou de la variable
passée en argument. Cet opérateur est très utilisé pour l’allocation dynamique de mémoire.
-Les opérateurs d’incrémentation et de décrémentation servent à incrémenter et décrémenter les
variables (et non toutes expressions). L’opérateur d’incrémentation ++ ajoute 1 à son opérande,
alors que l’opérateur de décrémentation -- lui retranche 1. L’aspect inhabituel de ces opérateurs

76
est qu’on peut les mettre sous forme préfixée (++n) ou postfixée (n++). Dans les deux cas, n est
incrémenté. Mais l’expression ++n incrémente n avant de prendre sa valeur, alors que n++
l’incrémente après avoir pris sa valeur.
-L’expression conditionnelle, qui utilise l’opérateur conditionnel ? s'écrit :
expression1 ? expression2 : expression3
Cet opérateur est ternaire. On commence par évaluer l’expression expression1. Si elle est vrai
(c’est-à-dire ≠0), alors on évalue expression2 et c’est elle qui donne sa valeur à l’expression
conditionnelle; sinon on évalue expression3 et c’est elle qui donne sa valeur. Ainsi pour affecter
le maximum de a et b à max, il suffit d’écrire :
max = ( a > b ) ? a : b ;
Il n’est pas obligatoire de mettre des parenthèses autour de la première expression, car la priorité
de ? : est très faible, immédiatement supérieur à celle de l’affectation.
-Les opérateurs d’affectation : On remplace souvent en raccourci, et pour plus de clarté, i = i + 2 ;
par l’expression équivalente utilisant l’opérateur d’affectation += c a d i += 2;
Le C associe à la plupart des opérateurs binaires op un opérateur d’affectation op=, où op fait
partie de + - * / % << >> & ^ |
- Les opérateurs de traitement des bits
Le C fournit six opérateurs qui réalisent des manipulations au niveau des bits des entiers, (char,
short, int et long).
~ complément à un (opérateur unaire)
>> décalage à droite
<< décalage à gauche
& ET bit à bit
^ OU exclusif bit à bit
| OU inclusif bit à bit
Par exemple, on se sert souvent du ET bit à bit & pour masquer certains bits ;
Les opérateurs << et >> décale leur opérande de gauche du nombres de bits indiqué par leur
opérande de droite, qui doit être positif. Ainsi x << 2 décale la valeur de x de deux bits vers la
gauche, en remplissant à droite par des 0, ce qui revient à faire une multiplication par 4.

-Les conversions de type


Lorsqu’un opérateur a des opérandes de types différents, ils sont convertis en un type commun
d’après quelques règles. En général, les seules conversions automatiques sont celles qui
convertissent un opérande "étroit" en un opérande plus "large", sans qu’il y ait perte
d’information.
Enfin, dans toute expression, on peut forcer explicitement des conversions grâce à un opérateur
unaire appelé cast. Dans la construction : (int) expression, l’expression est convertie dans le type
précisé.

Discussion de l'exemple 'Hello World'


- La fonction main ne reçoit pas de données, donc la liste des paramètres est vide.
- La fonction main fournit un code d'erreur numérique à l'environnement, donc le type du résultat
est int et n'a pas besoin d'être déclaré explicitement.
- Le programme ne contient pas de variables, donc le bloc de déclarations est vide.
- La fonction main contient deux instructions :
1 l'appel de la fonction printf avec l'argument "hello, world\n"; son effet est d’afficher la
chaîne de caractères "hello world\n" sur l’écran.
2 la commande return avec l'argument 0; son effet est de retourner la valeur 0 comme code
d'erreur à l'environnement.
- L'argument de la fonction printf est une chaîne de caractères indiquée entre les guillemets. Une
telle suite de caractères est appelée chaîne de caractères constante (constant string).

77
- La suite de symboles '\n' à la fin de la chaîne de caractères "hello, world\n" est la notation C
pour 'passage à la ligne' (new line). En C, il existe plusieurs couples de symboles qui contrôlent
l'affichage ou l'impression de texte. Ces séquences d'échappement sont toujours précédées par le
caractère d'échappement '\'.

printf et la bibliothèque <stdio> : La fonction printf fait partie de la bibliothèque de fonctions


standard <stdio> qui gère les entrées et les sorties de données. La première ligne du programme :
# include <stdio.h>
instruit le compilateur d'inclure le fichier en-tête 'stdoi.h' dans le texte du programme. Le fichier
'stdio.h' contient les informations nécessaires pour pouvoir utiliser les fonctions de la bibliothèque
standard <stdio>.

Exercice
Calculer n! pour une valeur de n fournie par l'utilisateur et comprise entre 1 et 7. Si la valeur
entière fournie par l'utilisateur n'est pas dans cet intervalle, il lui sera demandé une nouvelle
valeur.

Solution
#include <stdio.h>

void main ()
{
char n;
int i , fact = 1;

printf("entrez une valeur entière positive inférieure ou égale à 7 : ");


scanf("%d",&n);
while((n<=0)||(n>7))
{
if (n<=0) printf("j'ai demandé une valeur positive, redonnez la valeur : ");
else printf("j'ai demandé une valeur inférieure à 8, redonnez la valeur : ");
scanf("%d",&n);
}
for(i = 2; i <= n; i++) fact*=i;
printf("la valeur de %d! est %d\n",n,fact);
}

Les structures de contrôle (Instructions conditionnelles)


Les instructions de contrôle servent à contrôler le déroulement de l'enchaînement des instructions
à l'intérieur d'un programme, ces instructions peuvent être des instructions conditionnelles ou
itératives.

Instructions conditionnelles
Comme on a vu en algorithmique, les instructions conditionnelles permettent de réaliser des tests
et d'exécuter, suivant le résultat de ces tests, des parties de code différentes.
Les tests if
forme incomplète
- if (test) instruction; Si test est vrai, alors instruction est exécuté, sinon instruction est ignoré.

78
ou aussi forme complète:
- if (test) instruction
else instruction ; Si test est vrai, alors instruction1 est exécuté, sinon instruction2 est exécuté.

Le test est une expression de type entier comme a<b construite en général avec les comparateurs
<, = =, ! =, … et les opérateurs logiques &&, | |, ...

on peut aussi effectuer plusieurs tests comme :


if (test) instruction1
else if (test2) instruction2
else if (test3) instruction3

else if (testN) instructionN
else instructionN+1

Une et une seule des N instructions sera exécutée. L’instruction qui est exécutée correspond à la
première expression vraie. Dans le cas, où il n’y a aucune expression vraie, et si l’instruction else
est présente (car elle est facultative) c’est instructionN+1 qui est exécutée.
Exemple : Calcul du minimum de deux valeurs a et b :
if (a < b)
{
min = a ;
}
else
{
min = b ;
}

Instructions itératives (Les boucles)


Les instructions itératives sont commandées par trois types de boucles : le while, le for et le do
while

- Boucle For
for (initialisation ; test ; incrémentation)
{
liste d'instructions
}
Exemple :
for (i = 0 ; i<n ; i++)
{
x = x+1 ;
}
Au début de la boucle, on exécute les instructions d'initialisation de la boucle une seule fois. Si
test est vrai, alors on exécute la liste d'instructions, puis les expressions d'incrémentation ou
décrémentation. Ces deux dernières opérations continuent jusqu’à ce que test deviennent faux.
Exemple de boucle For. Calcul de la somme des n premiers entiers :
s=0;
for (i =1 ; i<= n ; i++) s = s+i ;
Après l'exécution de cette instruction, s vaut :
1+2+ … + n = n (n+1)/2

79
Exemple de boucle For. Calcul de la somme des n premiers carrés :
s=0;
for (i = 1 ; i<= n ; i++) s = s+i*i ;
Après l'exécution de cette instruction, s vaut :
1+4+9+ … + n2 (= ?)

- La boucle while. La syntaxe est :


while (test)
instruction

instruction est exécuté tant que test est vraie


exemple : Calcul de la première puissance de 2 excédant un nombre N :
p=1;
while (p < 8) do
{
p = 2*p ;
}
Résultats :
Pour N = 100 on a p = ?
Pour N = 200 on a p = ?

-Boucle do. La syntaxe est :


do
{
liste d'instructions
}
while (test) ;
On exécute pour commencer la liste d’instructions, puis si test est vrai on exécute la liste
d'instructions à nouveau, sinon on quitte la structure, et on passe à l’instruction suivante.
Exemple de boucle do. Calcul de la somme des n premiers entiers :
i=0;
do
{
i=i+1;
}
while (i <= n) ;

L’instruction switch. La syntaxe est :


switch (test)
{
case expression-constante1 :
instructions
break;
case expression-constante2 :
instructions
break;

case expression-constanteN :
instructions
break;
default :

80
instructions
break ;
}
test est évalué et permet de faire le branchement sur l’une des constantes (entiers ou caractères,
énumérations) de case correspondant à la valeur de test. Il faut noter que expression-constante ne
peut en aucun cas être une variable. Les constantes à l’intérieur d’un switch doivent être toutes de
valeurs distinctes.
L’étiquette default est facultative et l’instruction correspondante à celle-ci est exécutée lorsque
aucun branchement n’a été effectué.
Les breaks sont à priori facultatifs, mais il est préférable de toujours les garder, pour forcer la
sortie du switch, et prévenir un fonctionnement hasardeux.

Ruptures de séquence
Dans le cas où une boucle commande l'exécution d'un bloc d'instructions, il peut être intéressant
de vouloir sortir de cette boucle alors que la condition de passage est encore valide. Ce type
d'opération est appelé une rupture de séquence. Les ruptures de séquence sont utilisées lors des
conditions multiples peuvent conditionner l'exécution d'un ensemble d'instructions. Dans le cas de
switch, break est utilisée pour faire une rupture de séquence. Elle exécute une sortie d’un bloc
d’instructions dépendant de l’une des instructions suivantes do, for, while, ou switch. Il y a
aussi :
- continue; Instruction forçant le passage à l’itération suivante de la boucle la plus proche.
- goto label;
label : instruction
L’instruction goto permet de se brancher inconditionnellement à instruction. A éviter
absolument.
- return [expression];
Exécute une sortie d’une fonction en rendant le contrôle à la fonction appelante, tout en
retournant une valeur si la fonction appelée l’autorise.
- exit [expression];
Permet de quitter le programme avec une valeur, avec "flush" et fermeture des fichiers, libération
de la mémoire….

Fonctions
Les fonctions (procédures) sont des parties de code source qui permettent de réaliser le même
type de traitement plusieurs fois et/ou sur des variables différentes.
Une fonction en langage C peut : modifier des données globales. Ces données sont dans une zone
de mémoire qui peut être modifiée par le reste du programme. Une fonction peut dans ces
conditions réaliser plusieurs fois le même traitement sur un ensemble de variables définies à la
compilation; communiquer avec le reste du programme par une interface. Cette interface est
spécifiée à la compilation. L'appel de la fonction correspond à un échange de données à travers
cette interface, au traitement de ces données (dans le corps de fonction), et à un retour de résultat
via cette interface.
Rappel : Un programme C est constitué de fonctions. Elles ont toutes la même structure. La
fonction principale s'appelle main.
- Toutes les fonctions sont au "même niveau". On ne peut pas déclarer une fonction à l'intérieur
d'une autre.

La syntaxe d'une fonction est comme suit :


Type retourné 8om (Type des paramètres)
{

81
déclarations
instructions
l'instruction return (expression);
}

Chaque fonction comprend :


1. Une déclaration qui précise :
(a) Le type de ses paramètres.
(b) Le type de la valeur de retour.
(c) comment on la calcule.
2. Un ou plusieurs appels : c'est l'utilisation de la fonction.
3. Un ou plusieurs paramètres : ce sont les arguments de la fonction.
4. Un type et une valeur.

Généralement, la définition de la fonction (appelé aussi prototype) joue aussi le rôle de la


déclaration; mais on peut très bien séparer la déclaration. Par exemple, si l’on souhaite réaliser un
module exportable, ou encore si l’on souhaite utiliser une fonction défini plus bas.
La syntaxe du prototype est seulement :
Type retourné 8om (Type des paramètres);

Si l’on ne précise pas le type de retour, c’est le type int qui est pris par défaut. Les fonctions
communiquent par le mécanisme des arguments et des valeurs de retour, et encore via le
mécanisme des variables externes.
L’instruction return est le mécanisme par lequel une fonction appelée retourne une valeur à la
fonction appelante.
return expression ;

Exemples :

Fonction sans valeur de retour


Void fonct ( … . )
{
} ; fonct ne retourne aucune valeur

Fonction sans paramètre


float Pi ( void )
{
return 3.1416 ; }

Exemple : la fonction factorielle


int fact ( int n )
{
int i, f ;
f=1;
for ( i = 2 ; i<= n ; i++ )
f=f*i;
return f ;
}
Exemple : Suite de Fibonacci (f 0 = 0, f 1 = 1, f n = f n-1 + f n-2, f i = nombre de Fibonacci)
int fibonacci (int n)
{

82
int f , f 0, f 1, i ;
f0=0;
f1=1;
i=2;
while ( i <= n)
{
f = f 0+ f 1 ;
f0=f1;
f1=f;
i = i+ 1
}
return ( f )
}
Que se passe t'il si le paramètre d'appel n = 1 ou 0 ? Comment y remédier ?

Passage des arguments


Dans le cas général (et simple), une fonction est déclarée avec des paramètres formels ; elle est
appelée avec des paramètres réels de même nombre. Tous les paramètres sont transmis par valeur.
La fonction ne travaille pas directement sur le paramètre réel mais sur une variable locale à la
fonction, déclarée implicitement et initialisée à la valeur du paramètre réel. La fonction ne peut
pas modifier la valeur de ses paramètres réels. Pour modifier la valeur de ses paramètres réels, il
faut passer comme paramètres les adresses (pointeurs sur) de ces derniers.
Exemple : la fonction echanger (a ,b), ci-dessous, ne réalise pas l’échange des entiers a et b.
void echanger ( int x, int y)
{
int temp ;
temp = x ;
x=y;
y = temp ;
}
Le moyen d’obtenir le résultat voulu est de faire en sorte que le programme appelant passe en
arguments des pointeurs sur les valeurs à modifier (passage par adresse) : echanger (&a , &b). On
propose la solution :
void echanger ( int * px, int * py)
{
int temp ;
temp = * px ;
* px = * py ;
* py = temp ;
}
Les arguments de type pointeur permettent à une fonction d’accéder aux objets de la fonction
appelante, et de les modifier. Le passage par valeur d’un tableau n’existe pas en langage C : seule
l’adresse de début de zone mémoire où sont stockées les valeurs est passé à la fonction appelée.

Exercices :
Puissances entières et type long : Ecrire un programme permettant d'imprimer les 12 premières
puissances des entiers -2 et 3. Attention : le résultat pouvant excéder 35000 il faut utiliser un
entier long pour le stocker.

solution :

83
#include<stdio.h>

long puis(int,int);

void main(void)
{
int i;
for(i=0;i<12;++i)
printf("%d %ld %ld\n",i,puis(-2,i),puis(3,i));
}
long puis(int base,int exp)
{
int i;
long p=1;
for(i=1;i<=exp;++i) p=p*base;
return p;
}

Tableaux, pointeur et structures.


Tableaux
Type de données complexe le plus simple à construire : Suite ordonnée d’éléments. Il faut que
tous les éléments soient du même type. Ce qui permet d’accéder facilement à chaque élément.
Le tableau est caractérisé par :
-Un nom
-Un type
-Une dimension
-Une classe d’allocation
Déclaration :
float a [5] ;
Tous les indices commencent à 0. Le nom de l'élément d'indice i est :
a [i]
Le nom du tableau est a [ ].

On utilise souvent une constante pour désigner la dimension d'un tableau. Cette dimension doit
être connue à la compilation : allocation statique de mémoire.
La déclaration d'un tableau à une dimension réserve un espace de mémoire contiguë dans lequel
éléments du tableau peuvent être rangés.
Le nom du tableau seul est une constante dont la valeur est l'adresse du début du tableau.
Les éléments sont accessibles par : le nom du tableau, un crochet ouvrant, l'indice de l'élément et
un crochet fermant.
•ATTE8TIO8 : les indices non valides ne sont pas détectés.
Exemple :
#define 8 50 // dimension des tableaux
..
float R [8] ; déclare un tableau de 50 nombres réels de R[0] à R [49].

On peut initialiser un tableau en le déclarant.


Exemple :

84
int a [5] = {1, 1, 1, 1, 1} ;// initialise tous les éléments à 1.

Exemple : Recherche du minimum du tableau a [0] , a [1] , ..., a [N-1] de nombres entiers. (On
garde dans la variable m la valeur provisoire du minimum et on balaye le tableau de 0 à N – 1)
int Min (int a [ ] )
{
int i, m ;
m = a [ 0] ;
for (i = 2 ; i < 8 ; i ++)
if ( a [ i ] < m ) m = a [ i ] ;
return m ;
}

Les tableaux à deux dimensions sont des tableaux de tableaux. Les indices de droite sont les plus
internes. Les tableaux à n dimensions sont des tableaux de tableaux à n-1 dimensions.
Exemple : int tab[8][5];

Les structures
Une structure est un type complexe (‘tableau’) rassemblant plusieurs variables, mais chaque case
peut contenir un type différent. La syntaxe est la suivante :
struct [ nom ] {
< liste de déclarations >
};

Exemple:
struct point {
int x;
int y;
}; déclare une structure contenant les données d’un point de l’espace.
struct point p1,p2; déclare deux points.

Les structures sont un exemple de définition de nouveaux types. Sa taille est au moins égale à la
somme des tailles de ses membres du fait d'éventuels alignements mémoires. L'opérateur sizeof
permet d'en connaître la taille.
Exemple :
struct {
char c;
unsigned int i;
float tab[10];
char *p;
} a, b;

Les énumérations de constantes


Les énumérations sont des types définissant un ensemble de constantes qui portent un nom que
l'on appelle énumérateur. Elles servent à rajouter du sens à de simples numéros, à définir des
variables qui ne peuvent prendre leur valeur que dans un ensemble fini de valeurs possibles
identifiées par un nom symbolique. La syntaxe est la suivante :

enum [nom] {
énumérateur1,

85
énumérateur2,
énumérateur3,
...
énumérateurn
};

Les constantes figurant dans les énumérations ont une valeur entière affectée de façon
automatique par le compilateur en partant de 0 par défaut et avec une progression de 1. Les
valeurs initiales peuvent être forcées lors de la définition.

exemple :
enum couleurs {noir, bleu, vert, rouge, blanc, jaune};
enum couleurs {
noir = -1,
bleu,
vert,
rouge = 5,
blanc,
jaune
};

Il exite deux autres types complexes qui sont les :


-champ de bits : un ensemble de bits contigus à l'intérieur d'un même mot.
-Union : permet de définir des données de type différent ayant la même adresse mémoire.

Les pointeurs
Un pointeur est une variable ou une constante dont la valeur est une adresse. Il est reconnu
syntaxiquement par le * lors de sa déclaration. L'adresse d'une variable (ou d'une fonction) est
indissociable de son type. On pourra donc définir, par exemple, des pointeurs de caractères, des
pointeurs d'entiers voire des pointeurs d'objets plus complexes.
L'opération fondamentale effectuée sur les pointeurs est l'indirection, c'est-à-dire l'évaluation de
l'objet pointé. Le résultat de cette indirection dépend du type de l'objet pointé.
Par exemple, si p_car et p_reel sont respectivement un pointeur de caractères et un pointeur de
réel simple précision référençant la même adresse add, une indirection effectuée sur p_car
désignera le caractère situé à l'adresse add, tandis qu'une indirection effectuée sur p_reel
désignera le réel simple précision située à la même adresse. Donc, bien qu'ayant le même contenu
(l'adresse add), ces deux pointeurs ne sont pas identiques !
Le symbole associé à la construction des pointeurs est celui d'indirection (*). La syntaxe est :
type * nom_pointeur

Remarque importante :
La déclaration d'un pointeur n'implique pas la déclaration implicite d'une variable associée et
l'affectation de l'adresse de la variable au pointeur. Il faut donc déclarer une variable du type
correspondant et initialiser le pointeur avec l'adresse de cette variable.

Les opérations possibles sur un pointeur sont les suivantes :


- affectation d'une adresse au pointeur;
- utilisation du pointeur pour accéder à l'objet dont il contient l'adresse;
- addition d'un entier (n) à un pointeur; la nouvelle adresse est celle du neme objet à partir de
l'adresse initiale;

86
- soustraction de deux pointeurs du même type. Ce qui permet de calculer le nombre de variables
entre les adresses contenues dans les pointeurs.
Enfin le pointeur peut être combiner avec les tableaux [] et les fonctions ( ) pour définir des objets
encore plus complexes.
Exemples :

int *ptint; //pointeur sur un entier


char *ptchar; //pointeur sur un caractère.
char *chaines[100]; //un tableau de 100 pointeurs de caractère,
char **argv; //un pointeur de pointeur de caractère.
L'utilisation de parenthèses permet de modifier la priorité et donc l'ordre d'évaluation.
Exemple :
int (*tab)[10];
char (*f)();
char *(*g)();
float *(*tabf[20])();

Cet exemple permet de définir respectivement :


Un pointeur de tableau de 10 entiers,
Un pointeur de fonction retournant un caractère,
Un pointeur de fonction retournant un pointeur de caractère,
Un tableau de 20 pointeurs de fonction retournant un pointeur de réel simple précision.

Pointeurs et tableaux
Les tableaux peuvent être manipulés à travers l'utilisation de pointeurs. Cette utilisation des
pointeurs pour accéder aux contenus des tableaux est l'une des techniques les plus utilisées par les
programmeurs expérimentés.
Le nom d'un tableau, correspond à l'adresse du premier élément tableau, de plus les éléments d'un
tableau sont du même type. Ces éléments ont donc tous la même taille, et ils ont tous une adresse
qui correspond au même type d'objet.
Considérant l’exemple suivant : int tab[10];
Les adresses de tous les éléments du tableaux sont comprises entre &tab[0] et &tab[9]. Il est ainsi
possible d'additionner ou de soustraire un entier (n) à une adresse. Cette opération calcule une
nouvelle adresse. L'adresse de départ est &tab[0] ou tab qui peut être considérée comme un
pointeur. tab + n est l'adresse du nième entier à partir du début du tableau.

Remarque importante
Le programmeur doit être conscient des risques de dépassement des bornes du tableau.

Exercice sur les tableaux (Trier)


Ecrire un programme permettant de saisir des entiers (au plus 8), et de les voir affichés triés par
ordre croissant. L'algorithme de tri utilisé est le tri par insertion.
Les entiers seront stockés dans un tableau prévu pour 8 entiers. Ils seront ensuite triés dans ce
même tableau, qui servira à l'affichage. Ce tableau sera déclaré comme variable globale du
programme. Ce tableau est rempli grâce à une fonction nommée lire().
On rappel le principe du tri insertion. On considère que la gauche du tableau est déjà triée. On
considère alors l'élément suivant la partie triée et on le fait "descendre" à sa place en le comparant
à l'élément qui le précède. On commence par "sauver" l'élément à mettre en place dans une
variable "clé". On pousse ensuite d'une position vers la droite les éléments qui le précèdent et qui
sont plus grands que lui. On le range dans le tableau lorsqu'on a trouvé sa place.

87
Solution
#include <stdio.h>

enum {MAXDO88EES = 8};


int tab[MAXDO88EES]; //le tableau tab est global

int lire(void); //prototype de la fonction lire


void trier(int);
void afficher(int);

void main(void)
{
int 8brDonnees;
8brDonnees = lire();
trier(8brDonnees);
afficher(8brDonnees);
}

int lire(void)
{
int donnee, nbr = 0;

printf("Entrez les données entières positives à trier.\n"


"Terminez la saisie en tapant -1.\n"
"Vous avez droit à au plus %d valeurs\n",MAXDO88EES);
scanf("%d",&donnee);
while((nbr <= MAXDO88EES) && (donnee != -1))
{
if (nbr == MAXDO88EES)
{
printf("\nvous avez donné plus de %d entiers, seuls les %d "
"premiers seront triés\n", MAXDO88EES, MAXDO88EES);
break;
}
else
{
tab[nbr] = donnee;
nbr++;
scanf("%d", &donnee);
}
}
return nbr;
}

void trier(int nombre)


{
int i, j, cle;

for (i = 1; i < nombre; i++)


{
cle = tab[i];

88
for (j = i-1; (j >= 0) && (cle<tab[j]); j--) tab[j+1] = tab[j];
tab[j+1] = cle;
}
}

void afficher(int nombre)


{
int i;

printf("\nvoici le tableau trié\n");


for(i = 0; i < nombre; i++) printf("%5d",tab[i]);
printf("\n");
}

Exercice sur les pointeurs :


Séparer les nombres pairs et les impairs en les mettant dans deux tableaux, puis trier chacun des
deux tableaux. Les tableaux ont une taille arbitraire de 100. La lecture des entiers se termine lors
de la saisie de 0. La séparation entre nombres pairs et impairs est faite dans une fonction qui
reçoit en arguments les adresses des trois tableaux (adresse de l'élément de rang 0 du tableau),
cette fonction termine les tableaux pairs et impairs par des zéros.
Le tri de chaque tableau est réalisé par une fonction tri(int *) qui utilise un algorithme de tri
simple.

Solution :
#include <stdio.h>

int tab[100], imp[100], pair[100];


int count;

// fonction de saisie du tableau a manipuler


int saisie (int ti[])
{
int *ptab = ti;
printf (" Entrer des entiers \n");
printf (" Terminer la liste avec 0\n\n");
do
scanf ("%d", ptab);
while (*ptab++ != 0);
return ptab - ti;
}

// separation des pairs et des impairs en deux tableaux


int separ (int t[], int tp[], int ti[])
{
register int *pttab = t, *ptimp = ti, *ptpair = tp;
while (*pttab)
if (*pttab & 0x01) *ptimp++ = *pttab++;
else *ptpair++ = *pttab++;
*ptimp = *ptpair = 0; /* chien de garde de fin de tableau */
return pttab - t; /* nombre d entiers traites */
}

89
// fonction d'impression du tableau
void imptab (int tri[], int type)
{
register int *ptri = tri, i;
if (type == 0)
printf ("\n\tImpression du tableau initial \n");
else if (type == 1)
printf ("\n\tImpression du tableau impair \n");
else
printf ("\n\tImpression du tableau pair \n");
i = 0;
while (*ptri)
{
printf (" %6d ", *ptri++);
if (!*ptri) break;
if (i++ && !(i % 8)) printf ("\n");
}
}

// programme principal realisant les operations suivantes


int main (int argc, char *argv[], char **envp)
{
register int count; // definition de 3 pointeurs
// saisie du tableau a manipuler
count = saisie (tab);
printf (" Vous avez saisi %d nombres dans le tableau\n", count);
// separation des pairs et des impairs en deux tableaux
count = separ (tab, pair, imp);
printf (" 8ous avons séparé %d nombres dans le tableau\n", count);
// tri et impression
tri (tab);
imptab (tab, 0);
tri (imp);
imptab (imp, 1);
tri (pair);
imptab (pair, 2);
return 0;
}

90
Conseils pour écrire les programmes
•Modularité
-Séparer le programme en plusieurs sous-modules chacun s’occupant d’un sous-domaine du
programme initial
•Plus facile de résoudre plusieurs problèmes simples qu’un seul gros problème
•Un sous-module peut être réutilisé pour autre chose
-Usage des fonctions
-Usage du Préprocesseur

•Pratique
- Chaque sous-module est constitué de fichiers *.h, *.c, plus un fichier *.c pour le programme
principal
- Indentez les programmes (facile à faire dans un environnement de développement)
•Introduire une tabulation pour chaque niveau d’imbrication des instructions
•Commentez vos programmes /* blabla….*/ ou // blabla….
•En-tête de fichier
/* fonction truc
Paramètres entrée: paramètres sortie :
fonctionnalité:
fonctions appelées:
Auteurs : Date:
autres : */

91
Bibliographie
1. wikipedia.org
2. intel.com
3. tomshardware.com
4. howstuffworks.com
5. vulgarisation-informatique.com
6. GNU.org
7. linux.org
8. Microsoft.com
9. Microsoft Computer Dictionary.--5th ed.
10. R. C. Detmer, Introduction to 80x86 Assembly Language and Computer
Architecture, Jones and Bartlett Publishers, 2001
11. Winn L. Rosch, Hardware Bible, Sixth Edition, Que Publishing, 2003
12. Andy Rathbone, PCs: The Missing Manual, O'Reilly, 2005
13. Scott Mueller, Upgrading and Repairing Pcs, 17th Edition, Que,2006
14. Michael Jang, RHCE Red Hat Certified Engineer Linux Study Guide, Fourth
Edition, McGraw-Hill/Osborne , 2004
15. James Pyles, PC Technician Street Smarts A Real World Guide to CompTIA A+
Skills, Wiley Publishing, Inc., 2007.
16. Donald R. Evans and Scott Johnson, A+ Complete Lab Manual, Third Edition,
Sybex 2003
17. Roderick W. Smith, Linux+ Study Guide, Third Edition, SYBEX Inc., 2001
18. Quentin Docter, Emmett Dulaney, Toby Skandier, CompTIA A+ Complete Study
Guide, Wiley Publishing, Inc., 2007.
19. Bjarne Stroustrup. The C++ programming Language, 3rd Edition. Addison-
Wesley, 1997.
20. schaums "c"
21. thinking in c

92

Vous aimerez peut-être aussi