Академический Документы
Профессиональный Документы
Культура Документы
D’INFORMATIQUE
Dominique Hermesse
Juin 2015
2
L’ordinateur
L’ordinateur est composé de quatre parties distinctes :
• Le processeur qui est composé
• d’une unité arithmétique et logique (UAL ou ALU en anglais) ou unité
de traitement qui effectue les opérations de base
• d’une unité de contrôle chargée du séquençage des opérations
• La mémoire qui contient à la fois les données et le programme
exécuté par l’unité de contrôle. Elle se divise entre :
• mémoire volatile ou RAM (Random Access Memory) qui contient
programmes et données en cours de traitement
• mémoire permanente ou ROM (Read Only Memory) qui stocke
programmes et données de base de la machine
• Les dispositifs d’entrée-sortie qui permettent de communiquer
avec le monde extérieur.
Les différents composants sont reliés par des bus
3
Les programmes
• Un programme est une suite d’instructions élémentaires, qui vont être
exécutées dans l’ordre par le processeur. Ces instructions
correspondent à des actions très simples, telles qu’additionner deux
nombres, lire ou écrire une case mémoire, etc.
• Chaque instruction est codée (physiquement cablée) en mémoire sur
quelques octets. Le processeur est capable d’exécuter des
programmes en langage machine, c’est-à-dire composés
d’instructions très élémentaires suivant un codage précis.
• Chaque type de processeurs est capable d’exécuter un certain
ensemble d’instructions, son jeu d’instructions.
• Pour écrire un programme en langage machine, il faut donc connaître
les détails du fonctionnement du processeur qui va être utilisé.
• Les langages de programmation utilisés de nos jours sont très
largement plus évolués que le langage machine. Néanmoins ils
reposent sur ce dernier : après compilation ils sont transformés
(traduits) en langage machine exécutable par le processeur.
4
Le processeur
• Le processeur, (ou CPU, Central Processing Unit, “ Unité
centrale de traitement ” en français) est le composant essentiel
d’un ordinateur qui interprète les instructions et traite les
données d’un programme.
• Le processeur est un circuit électronique complexe (circuit
intégré) qui exécute chaque instruction très rapidement, en
quelques cycles d’horloges.
• Toute l’activité de l’ordinateur est cadencée par une horloge
unique, de façon à ce que tous les circuits électroniques
travaillent tous ensemble de façon synchronisée.
• La fréquence de cette horloge s’exprime en MHz (millions de
cycles par seconde) ou GHz (milliards de cycles par
secondes).
• Par exemple, un processeur “Intel Core 2 Duo P8400 ”
possède une horloge cadencée à 2,26 GHz.
5
Principe de fonctionnement du
processeur
Pour chaque instruction, le processeur effectue
schématiquement les opérations suivantes :
• lire dans la mémoire principale l’instruction à exécuter
• effectuer le traitement correspondant à cette instruction
• passer à l’instruction suivante.
6
Adresse mémoire
Dans une mémoire de taille N, on a N emplacements
mémoires, numérotés (ou adressés) de 0 à N-1. Chaque
emplacement est repéré par un numéro unique, appelé
adresse. L’adresse est le plus souvent écrite en
hexadécimal.
10
Caractéristiques de la mémoire
• La capacité : nombre total de bits que contient la mémoire. Elle
s’exprime aussi souvent en octets.
• Le format des données : nombre de bits que l’on peut mémoriser par
case mémoire. On parle de la largeur du mot mémorisable.
• Le temps d’accès : temps qui s’écoule entre l’instant où a été lancée
une opération de lecture/écriture en mémoire et l’instant où la
première information est disponible sur le bus de données.
• Le temps de cycle : il représente l’intervalle minimum qui doit séparer
deux demandes successives de lecture ou d’écriture.
• Le débit : nombre maximum d’informations lues ou écrites par
seconde.
• La volatilité : elle caractérise la permanence des informations dans la
mémoire. L’information stockée est volatile si elle risque d’être
altérée par un défaut d’alimentation électrique et non volatile dans le
cas contraire.
12
RAM
Nous savons qu’il existe deux types distincts de mémoire :
• Les mémoires mortes.
• Les mémoires vives.
• Une mémoire vive sert au stockage temporaire de données. Elle
doit avoir un temps de cycle très court pour ne pas ralentir le
microprocesseur.
• Les mémoires vives sont en général volatiles : elles perdent leurs
informations en cas de coupure d’alimentation. (Certaines d’entre
elles, ayant une faible consommation, peuvent être rendues non
volatiles par l’adjonction d’une batterie.)
• Il existe deux grandes familles de mémoires RAM (Random Acces
Memory : mémoire à accès aléatoire) :
• Les RAM statiques.
• Les RAM dynamiques.
13
RAM statique
Le bit mémoire d’une RAM statique (SRAM) est composé
d’une bascule (composant électronique élémentaire).
Chaque bascule contient entre quatre et six transistors.
14
RAM dynamique
Dans les RAM dynamiques (DRAM), l’information est mémorisée
sous la forme d’une charge électrique stockée dans un
condensateur.
Avantages :
• Cette technique permet une plus grande densité d’intégration,
car un point mémoire nécessite environ quatre fois moins de
transistors que dans une mémoire statique.
• Sa consommation s’en retrouve donc aussi très réduite
Inconvénient :
• La présence de courants de fuite dans le condensateur
contribue à sa décharge. Ainsi, l’information est perdue si on
ne la régénère pas périodiquement (charge du condensateur).
• Les RAM dynamiques doivent donc être rafraîchies
régulièrement pour entretenir la mémorisation : il s’agit de lire
l’information et de la recharger.
15
ROM
Pour certaines applications, il est nécessaire de pouvoir
conserver des informations de façon permanente même lorsque
l’alimentation électrique est interrompue. On utilise alors des
mémoires mortes ou mémoires à lecture seule (ROM : Read
Only Memory).
Ces mémoires sont non volatiles. Ces mémoires, contrairement
aux RAM, ne peuvent être que lues. L’inscription en mémoire
des données reste possible mais est appelée programmation.
Suivant le type de ROM, la méthode de programmation
changera. Il existe donc plusieurs types de ROM :
•ROM ;
•PROM ;
•EPROM ;
•EEPROM ;
•FLASH EPROM.
16
Types de registres
• Compteur de programme :
• ce registre contient l’adresse mémoire de l’instruction en cours
d’exécution.
• Accumulateur :
• ce registre est utilisé pour stocker les données en cours de traitement
par l’UAL.
• Registre d’adresses :
• il contient toujours l’adresse de la prochaine information à lire par
l’UAL : soit la suite de l’instruction en cours, soit la prochaine
instruction.
• Registre d’instructions :
• il contient l’instruction en cours de traitement.
• Registre d’état :
• il sert à stocker le contexte du processeur, ce qui veut dire que les
différents bits de ce registre sont des “ drapeaux ” (flags) servant à
stocker des informations concernant le résultat de la dernière
instruction exécutée.
18
Types de registres
• Pointeurs de pile :
• ce type de registre, dont le nombre varie en fonction du type de
processeur, contient l’adresse du sommet de la pile (ou des piles).
• Registres généraux :
• ces registres sont disponibles pour les calculs.
• L’horloge :
• elle synchronise toutes les actions de l’unité centrale.
• L’unité d’entrée-sortie :
• elle prend en charge la communication avec la mémoire de
l’ordinateur, permettant au processeur d’accéder aux périphériques
de l’ordinateur.
19
Opérations du processeur
Le rôle fondamental de la plupart des unités centrales de
traitement, indépendamment de la forme physique qu’elles
prennent, est d’exécuter une série d’instructions stockées
appelées “ programme ”. Les instructions et les données
transmises au processeur sont exprimées en mots binaires
(code machine). Elles sont stockées dans la mémoire.
Le séquenceur ordonne la lecture du contenu de la mémoire et
la constitution des mots présentées à l’UAL qui les interprète.
L’ensemble des instructions et des données constitue un
programme. Le langage le plus proche du code machine tout en
restant lisible par des humains est le langage d’assemblage,
aussi appelé langage assembleur (forme francisée du mot
anglais “assembler ”).
Toutefois, l’informatique a développé toute une série de
langages, dits de haut niveau (comme le BASIC, Pascal, C,
C++), destinés à simplifier l’écriture des programmes.
20
Opérations du processeur
Le programme est représenté par une série d’instructions
qui réalisent des opérations en liaison avec la mémoire
vive de l’ordinateur. Il y a quatre étapes lors du traitement
des instructions :
•FETCH : Recherche de l’instruction
•DECODE : Décodage de l’instruction
•EXECUTE : Exécution des opérations
•WRITEBACK : Écriture du résultat
21
FETCH
La première étape, FETCH (recherche), consiste à
rechercher une instruction dans la mémoire vive de
l’ordinateur. L’emplacement dans la mémoire est
déterminé par le compteur de programme, qui stocke
l’adresse de la prochaine instruction dans la mémoire de
programme.
Après qu’une instruction a été recherchée, le compteur de
programme est incrémenté par la longueur du mot
d’instruction.
L’instruction que le processeur recherche en mémoire est
utilisée pour déterminer ce que le CPU doit faire.
22
DECODE
Dans l’étape DECODE (décodage), l’instruction est
découpée en plusieurs parties telles qu’elles puissent être
utilisées par d’autres parties du processeur.
La façon dont la valeur de l’instruction est interprétée est
définie par le jeu d’instructions du processeur.
Souvent, une partie d’une instruction, appelée opcode
(code d’opération), indique quelle opération est à faire, par
exemple une addition.
Les parties restantes de l’instruction comportent
habituellement les autres informations nécessaires à
l’exécution de l’instruction comme par exemple des valeurs
pour l’addition.
23
EXECUTE
Après les étapes de recherche et de décodage arrive l’étape
EXECUTE (exécution) de l’instruction.
Au cours de cette étape, différentes parties du processeur sont
mises en relation pour réaliser l’opération souhaitée.
Par exemple, pour une addition, l’unité arithmétique et logique
(UAL) sera connectée à des entrées et des sorties. Les entrées
présentent les nombres à additionner et les sorties contiennent
la somme finale.
L’UAL contient le circuit électronique pour réaliser des opérations
d’arithmétique et de logique simples sur les entrées (addition,
opération sur les bits). Si le résultat d’une addition est trop
grand pour être codé par le processeur, un signal de
débordement est positionné dans un registre d’état.
24
WRITEBACK
La dernière étape WRITEBACK (écriture du résultat), écrit
tout simplement les résultats de l’étape d’exécution en
mémoire.
Très souvent, les résultats sont écrits dans un registre
interne au processeur pour bénéficier de temps d’accès
très courts pour les instructions suivantes.
Dans d’autres cas, les résultats sont écrits plus lentement
dans des mémoires RAM, donc à moindre coût et
acceptant des codages de nombres plus grands.
25
La numération – l’hexadécimal
• L’écriture d’une valeur en binaire prend de la place
• 0101 1110 en binaire = 94 en décimal
• La conversion du binaire en décimal n’est pas facile
• L’hexadécimal est la solution car l’hexadécimal est une base
16 et 16 est une puissance de 2 => 24
Analogie avec le décimal :
• 10 chiffres base 10 => 16 chiffres base 16 (ou hexadécimal)
• 16 chiffres : 0 1 2 3 4 5 6 7 8 9 A B C D E F
• Avec : A=10, B=11, C=12, D=13, E=14 et F=15
• Base 10 combinaison des puissances de 10 => base 16
combinaison des puissances de 16
1A04
(1 x 16³) + (A x 16²) + (0 x 161) + (4 x 160)
(1 x 4096) + (10 x 256) + (0 x 16) + (4 x 1)
=6660 en décimal
29
La numération – l’hexadécimal
Conversion binaire en hexadécimal
•On groupe les bits par 4
•On convertit chaque groupe en hexadécimal
1001111100110101
1001 - 1111 - 0011 - 0101
8+1 - 8+4+2+1 - 2+1 - 4+1
9 - 15 - 3 - 5
9F35
30
La numération – l’hexadécimal
Conversion hexadécimal en binaire
•On convertit chaque chiffre en 4 chiffres binaires
43A1
4 - 3 - 10 - 1
4 - 2+1 - 8+2 - +1
0100 - 0011 - 1010 - 0001
0100001110100001
31
ASCII
Pour écrire des caractères, différents codes ont associés
des valeurs numériques à chaque caractère.
Le plus connu et utilisé est le code ASCII (American
Standard Code for Information Interchange), chaque
caractère est associé à une valeur comprise entre :
0 et 255
Ces valeurs peuvent toutes être codées sur 8 bits => 1
octet ou 1 byte => unité de calcul des tailles des mémoires
en informatique
32
ASCII
33
Algorithme et programmation
• Algorithme: méthode pour résoudre un problème
• Pour un problème donné, il peut y avoir plusieurs
algorithmes. . . ou aucun !
Le langage C++
• Début en 1983.
• Amélioration du langage C:
• Abstraction de données
• Programmation orientée objet
• Programmation générique
• Très utilisé !
35
Programmer
• Une fois trouvé l’algorithme, programmer en C++ comporte 4
phases :
1. Editer le programme – avec un éditeur de texte. Le fichier
programme appelé également fichier source portera l’extension
.cpp
2. Compiler et lier le programme. Le fichier .cpp va être compilé
et puis lié avec les éventuels fichiers d’entête que nous aurons
spécifiés et qui portent l’extension .h . Le fichier résultant est un
fichier exécutable avec l’extension .exe
3. Exécuter le programme
...
4. TESTER et DEBUGGER : retour au point 1 !
Ça peut durer assez longtemps...
36
Exemple
int main ( ) {
cout << ”hello world !” << endl; //Ecrit à l’écran “hello world”
}
37
Programmation
Les briques de base du langage:
Les variables
• Les variables permettent donc de stocker durant
l’exécution du programme des données.
• Les variables ont un type et une valeur
• Les variables peuvent être globales ou locales
42
Les constantes
Syntaxe : const type nom = val ;
Chaînes de caractères
Il existe une classe string, ce n’est un pas un type
élémentaire.
Pour l’utiliser, il faut placer en tête du fichier :
# include <string>;
Expressions - affectation
En C/C++, l’affectation est une expression:
Exemple :
Longueur = 12;
53
Opérateurs classiques
• Opérateurs arithmétiques:
*, +, -, / (division entière et réelle), % (modulo)
• Opérateurs de comparaison
< (inférieur), <= (inférieur ou égal), == (égal), > (supérieur),
>= (supérieur ou égal) et != (différent)
• Operateurs booléens
&& représente l’opérateur “ET”, || représente le “OU”, et !
représente le “NON”.
Par exemple, ((x<12) && ((y>0) || !(z>4)))
54
Entrées/sorties standards
• Le clavier et l’écran sont les entrées standards du système.
C’est grâce à elles que l’utilisateur va communiquer avec la
machine
• En programmation, on parlera de flux d’entrée ou de sortie
standard
• CIN pour le flux d’entrée clavier
• COUT pour le flux de sortie écran
• Ces deux flux sont définis dans le fichier d’entête
<IOSTREAM>
• Vu qu’ils font partie de la bibliothèque standard on les
programmera en les précédent de STD::
• STD::CIN ou STD::COUT
• On peut également déclarer l’espace de nom standard en
début de programme
• USING NAMESPACE STD;
• On utilisera alors CIN OU COUT sans ajouter ::STD
55
Entrées/sorties standards
• Les flux CIN et COUT seront suivis des opérateurs
d’insertion << pour COUT et >> pour CIN
• L’opérateur d’insertion << permet donc d’écrire sur le flux
COUT (écran)
• L’opérateur d’insertion >> permet de lire sur le flux CIN
(clavier)
56
int main ()
{
float valeur=0;
while ( ! ( cin >> valeur ) ) // tant que la valeur n’est pas un nombre CIN bloqué => on boucle
{
cin.clear();
cin.ignore( numeric_limits<streamsize>::max(), '\n' );
}
60
Instructions usuelles
• Instructions de test :
• if … then
• if … then … else
• Instructions de boucle :
• while …
• do … while
• for …
• Instruction d’évaluation de cas :
• switch … case … case
61
Instructions de test
if (condition) instr
if (v == 3) i =i+4 ;
ATTENTION == est différent de =
if (condition) instr1 else instr2
if ((v==3) && (i<5))
{
i=i+4 ;
v=v*2 ;
}
else
{
v=i ;
r = r*3 ;
}
62
int Condition = 0;
int I = 0;
while (Condition<5)
{
I=I+2;
Condition++ //Incrémente Condition d’une unité
}
63
Fonctions et procédures
• Les fonctions et procédures sont des morceaux de
programme qui :
• Servent à structurer le programme
• Peuvent être réutilisées plusieurs fois
• Peuvent être mises dans des bibliothèques pour être utilisées dans
d’autres programmes
• Fonctions et procédures peuvent être paramétrées
• Les fonctions renvoient un et un seul résultat
• Les procédures ne renvoient pas de résultat
66
Fonctions et procédures
• Les fonctions et procédures doivent être définies :
• La définition est la programmation de la fonction ou de la procédure
• La définition peut être faite à différents endroits :
• Dans la fonction main () , mais c’est très rare
• Avant la fonction main ()
• Dans un autre fichier
Exemple de fonction
#include <iostream>
retour = a+b;
return retour;
}
int main ()
{
int x=2;
int y=3;
cout<<somme(x,y);
}
69
Exemple de procédure
#include <iostream>
AuRevoir();
}
70
Les références
• Lors de la définition d’une variable, on peut créer une ou
plusieurs variables qui y font référence
• Ce sont des « Alias » de la variable
• Les variables références portent un nom
• Le type de la référence est le même que celui de la variable suivi
de &
• Elles sont intimement liées à la variable
• Lorsqu’on affecte une référence, la variable est modifiée
• On initialise toujours la référence en y affectant la variable
71
Les références
• Syntaxe :
type variable;
type& nom_référence = variable;
• Exemple :
float Temperature = 0;
float& ReferenceTemperature = Temperature;
ReferenceTemperature = 145,023
//La variable Temperature vaut maintenant 145,023
72
Les pointeurs
• On peut également accéder à une variable en utilisant
son adresse dans la mémoire
• La variable qui va contenir cette adresse s’appelle un
pointeur
73
Les pointeurs
• Syntaxe :
• type* nom;
• nom est un pointeur pouvant recevoir l’adresse d’une variable de type
type.
• &Vitesse représente l’adresse mémoire de la variable Vitesse
• *PointeurVitesse désigne la variable dont l’adresse est mémorisée
dans le pointeur PointeurVitesse
• Exemple :
float Vitesse = 45.56;
float* PointeurVitesse;
PointeurVitesse = &Vitesse;
//Le pointeur reçoit l’adresse de vitesse
*PointeurVitesse = 89.56;
//La variable pointée par le pointeur (ici Vitesse) reçoit 89,56
74
Les pointeurs
0154
0158 45.56 Vitesse
015C
015F
021C
021F
0220
0224 Hex 0158 PointeurVitesse
75
int main ()
{
int add(int* ,int );
int tab[3]={1,2,3};
int somme=0;
somme=add(tab,3);
}
77
Chaînes de caractères
• Une chaîne de caractères est une suite de variables de type
« CHAR »
• Pour mémoriser une chaîne de caractères on créera donc un
tableau de CHAR
char MaChaine [10];
• On peut affecter directement un flux d’entrée au tableau
cin>>MaChaine;
• Lors de la fin saisie avec la touche « enter » le code ASCII 0 est
introduit dans le tableau
• 0 ne correspond à aucun caractère et sera interprété comme la fin de
la chaîne de caractères
• On peut directement envoyer le tableau vers le flux de sortie
cout<<MaChaine
• Tous les caractères mémorisés dans la chaîne seront affichés jusqu’au
caractère de fin de chaîne 0
78
Chaînes de caractères
• Pour initialiser le tableau de caractères on peut :
• Faire une boucle et initialiser caractère par caractère
• Ecrire char Chaine[10]={'B','o','j','o','u','r'};
• Ecrire char Chaine[10]="Bonjour";
• Pour le traitement du tableau de caractères, il faut
l’analyser élément par élément
• On ne peut pas comparer directement deux chaînes de caractères,
il faut le faire caractère par caractère
• On ne connaît pas la longueur de la chaîne de caractère, il faut
initialiser la chaîne avec, par exemple, la valeur numérique 0 qui ne
correspond à aucun caractère ASCII et puis, analyser caractère par
caractère et rechercher le caractère ‘\0’
79
struct voiture
{
char Marque [10];
char Modele [10];
int Puissance;
};
Int main ()
{
voiture MonAuto;
cin>>MonAuto.Marque;
cin>>MonAuto.Modele;
cin>>MonAuto.Puissance;
}
81
int main()
{
ofstream monFlux("monfichier.txt");
/*Déclaration d'un flux permettant d'écrire dans le fichier
monfichier.txt */
}
84
ofstream monFlux(NomFichier);
87
Fermeture du fichier
• Le flux de lecture ou d’écriture du fichier est fermé
lorsqu’on sort de la partie de programme dans laquelle le
flux à été créé => lorsqu’on arrive à }
• Si on veut fermer prématurément le flux, on utilisera la
fonction close du flux
monFlux.close();
• Si on lit dans un fichier et puis qu’on écrit dans le même
fichier, il faudra s’assurer que la lecture et l’écriture sont
programmées dans 2 parties de programme différentes
ou bien il faudra fermer le premier flux avant d’ouvrir le
suivant. C’est valable également dans le cas inverse où
on écrit dans un fichier et puis qu’on lit dans le même
fichier
88
char nom[10];
int age=0;
cout<<"Quel est ton nom : ";
cin>>nom;
cout<<"Quel est ton age : ";
cin>>age;
monFlux << "Bonjour, je m’appelle " << nom << endl;
monFlux << "J'ai " << age << " ans." << endl;
91
}
98
Déplacer le curseur
• Nous utiliserons également une fonction sur les flux pour
déplacer le curseur
• Il y a également 2 fonctions
• Pour le flux entrant IFSTREAM ce sera SEEKG()
• Pour le flux sortant OFSTREAM ce sera SEEKP()
• Le déplacement se fait toujours par rapport à une position
que l’on entrera dans la fonction comme paramètre
• Il y a 3 positions :
• le début du fichier : ios::beg
• la fin du fichier : ios::end
• la position actuelle : ios::cur
• Attention : le retour de ligne ‘\n’ occupe 2 emplacements
101
Déplacer le curseur
• On écrira pour se déplacer de 15 caractères à partir du
début du fichier :
ifstream monFlux("C:\\monfichier.txt");
int Position=15;
monFlux.seekg(Position,ios::beg);
• On écrira pour se déplacer de 5 caractères à partir de la
position du curseur :
ifstream monFlux("C:\\monfichier.txt");
monFlux.seekg(5,ios::cur);
• La position est un entier qui peut être positif ou négatif
102
Taille du fichier
• Pour connaître la taille d’un fichier
• On se place à la fin du fichier
• On demande la position du curseur