Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Licence 3 Automatique
R. Bouchebbat
Année universitaire 2018-2019
OBJECTIFS
Homme Machine
Lenteur Rapidité extrême
Oubli Mémorisation très
efficace
ADD A, 4
traducteur langage machine
LOAD B
MOV A, OUT
… que le langage machine
• +: déjà plus accessible
• -: dépend du type de la machine (n’est pas portable)
• -: pas assez efficace pour développer des applications complexes
• Exemples de langages:
• Fortran, Pascal, C, …
• C++, Java, …
Enoncé du problème
Spécification
Cahier des charges
Analyse
Algorithme
Traduction en langage
Programme source
Compilation
Programme exécutable
Tests et modifications
Version finale et résultats
Y.ZENNIR
Propriétés d’un algorithme
Un algorithme doit:
– avoir un nombre fini d’étapes,
– avoir un nombre fini d’opérations par étape,
– se terminer après un nombre fini d’opérations,
– fournir un résultat.
Y.ZENNIR
Structure d’un algorithme
Y.ZENNIR
Langage de programmation ?
Programme Programme
Programme en langage
Algorithme en langage en Code
machine binaire
de assembleur
programmation
ajouter 32 à s ADD s,32 10001110000 Processeur
s=s+32;
Y.ZENNIR
Interprétation vs. Compilation
Y.ZENNIR
Interprétation vs. Compilation
Y.ZENNIR
Arbre
Programmatique
20
Y.ZENNIR
Définition : Arbre Programmatique (AP)
Y.ZENNIR
Définition : Arbre Programmatique (AP)
Titre
Action i
Action1
Action2
Y.ZENNIR
Définition : Arbre Programmatique (AP)
si
Action i
Action i P
Action1 Action1
Action2
La séquence L’alternative
Principe :Arbre Programmatique (AP)
Titre
TQ
P : Proposition
La répétition P Action i TQ : Tant que
Action1
Titre
Titre
Pour i
JSQ
i(initiale)i(finale)
Action i P
Action1 Action i
Pour
Titre Jusqu’à
Le C a été inventé au
cours de l’année 1972
dans les laboratoires Bell
par Dennis Ritchie et Ken
Thompson.
En 1978, Brian Kernighan,
qui aida à populariser le
Ken Thompson (à gauche) et Dennis Ritchie C, publia le livre « The C
(à droite). (source Wikipédia) programming Language »,
le K&R, qui décrit le C «
traditionnel » ou C ANSI.
Petite Histoire Du C/C++
• standard international
• puissant et efficace
• inclut le C en tant que sous-ensemble; donc peut
apprendre deux langues (C ++ et C) pour le prix d'un
• facile à déplacer de C ++ à d'autres langages mais
souvent pas dans une autre direction
• beaucoup d'autres langages populaires inspirés par C
++
Caractéristiques du C ++
#include <iostream>
En C++ comme en C, les lignes commençant par #
sont des « directives préprocesseurs ». Elles
s’adressent à un programme appelé préprocesseur,
cpp (pour « c preprocessor ») qui prépare le code
source en traitant ces directives.
Ici, en appelant #include, on dit au préprocesseur
d’inclure le fichier iostream, de la bibliothèque
standard C++ et qui contient les définitions pour
afficher quelque chose à l’écran.
Le HELLOWORLD Ligne À Ligne
int main()
Il s’agit de l’entête de la fonction main. En C++,
une fonction se divise en deux parties principales.
L’entête et le corps de la fonction.
On peut voir ici trois éléments fondamentaux dans
l’écriture d’une fonction.
main est le nom de la fonction. En C++, c’est aussi le
point d’entrée du programme. Nous verrons plus tard
ce que cela signifie. Il faut juste retenir que main est
la seule fonction qui doit absolument apparaitre dans
un programme. C’est une convention.
Le HELLOWORLD Ligne À Ligne
int main()
int est le type de retour de la fonction main. int pour
integer, c’est-à-dire que la fonction main, une fois
terminée, doit retourner une valeur entière. Pour
information, cette valeur peut servir dans
l’environnement appelant notre programme une
valeur de bonne exécution ou un code erreur.
() ici vide, il s’agit de la liste des arguments fournis lors
de l’appel de notre fonction.
Le HELLOWORLD Ligne À Ligne
Affectation:
En C/C++, l’affectation est une expression:
Soient v une variable et expr une expression.
v = expr affecte la valeur de expr à la variable v et
retourne la valeur affectée à v comme résultat.
Opérateurs arithmétiques:
C++ dispose d’opérateurs classiques binaires (deux
opérandes)
• Addition +, Soustraction -, multiplication * et
division /
Il y a aussi un opérateur unaire : - pour les nombres
négatifs. ( -x + y)
Les opérateurs
Opérateurs arithmétiques:
Ces opérateurs binaires ne sont à priori définis que
pour des opérandes de même type parmi
Int, long int, float, double, et long double
Alors comment faire pour ajouter 1 (entier int ) et 2.5
(flottant simple précision) ? ce qui semble assez
naturel ? par le jeu des conversions implicites de
type. Le compilateur se chargera de convertir un
opérande ou les deux dans un type rendant
l’opération possible.
Les opérateurs
#include
<iostream>
int main()
{ int a = 1;
double b = 3.14;
double c = a +b;
std::cout << sizeof(a) << ": " << a << std::endl;
std::cout << sizeof(b) << ": " << b << std::endl;
std::cout << sizeof(c) << ": " << c << std::endl;
Opérateurs arithmétiques:
• Il n’y a pas d’opérateur pour la puissance : il faudra
alors faire appel aux fonctions de la bibliothèques
standard du C++.
• En termes de priorité, elles sont les mêmes que
dans l’algèbre traditionnel. Et en cas de priorité
égale, les calculs s’effectuent de gauche à droite.
• On peut également se servir de parenthèses pour
lever les ambiguïtés, et rendre son code plus
lisible !!
Les opérateurs
Opérateurs logiques:
En C++ il y a trois opérateurs logiques : et (noté && )
ou noté (||) et non (noté !)
Ces opérateurs travaillent sur des valeurs numériques
de tout type avec la simple convention
Nulle faux
Autre que nulle vrai
Les opérateurs
Opérateur conditionnel:
Il s’agit d’un opérateur ternaire.
Il permet des affectations du type :
Si condition est vraie alors variable vaut valeur,
sinon variable vaut autre valeur.
On l’écrit de la manière suivante :
x = (cond) ? a : b;
Par exemple :
int x = (y > 0) ? 2 :3;
Les opérateurs
Autres opérateurs:
sizeof : Son usage ressemble à celui d’une fonction, il
permet de connaitre la taille en mémoire de l’objet
passé en paramétre.
Opérateurs de manipulation
de bit : & ET bit à bit
| OU bit à bit
^ OU Exclusif bit à bit
<< Décalage à gauche
>> Décalage à droite
~ Complément à un (bit à bit)
Les structures de contrôle
Définition:
On appelle structure conditionnelle les instructions qui
permettent de tester si une condition est vraie ou non,
avant d’exécuter le code spécifique à la condition.
1. L’instruction if / else:
La structure de contrôle if permet d'exécuter une
instruction ou une suite d'instructions seulement si une
condition est vraie.
Les structures conditionnelles
if (condition)
{ bloc d’instructions 1 }
Exemple :
#include <iostream>
using namespace std;
int main()
{ int a;
cout << "Tapez la valeur de a : "; cin >> a;
if (a >= 0)
{ cout << "a est positif" << endl;] }
else
{ cout << "a est négatif" << endl; }
}
Les structures conditionnelles
2. L’instruction switch/case
L’imbrication de if = else peut avantageusement être
remplacée par une structure switch case. L'instruction
switch permet de tester plusieurs valeurs pour une
expression.
Les structures conditionnelles
Syntaxe de switch/case
switch(expression)
{
case constante1:
instruction1_1// instructions exécutées si variable == constante1
instruction1_2...
break ;
case constante2:
instruction2_1 // instructions exécutées si variable == constante1
instruction2_2...
...
default:
instruction_1// instruction executés si variable
instruction_2...
}
Les structures conditionnelles
Exemple:
#include <iostream> case 2 :
using namespace std; cout << "a vaut 2" << endl;
int main() break;
{ case 3 :
int a; cout << "a vaut 3" << endl;
cout << "Tapez la valeur de a : "; break;
cin >> a; default :
switch(a) cout << "a ne vaut ni 1, ni 2, ni
{ 3" << endl;
case 1 : break ;
cout << "a vaut 1" << endl; }
break; }
Les Boucles
Définition:
Les boucles sont des structures qui permettent
d'exécuter plusieurs fois la même série d'instructions
jusqu'à ce qu'une condition ne soit plus réalisée...
1. La boucle For:
Le for est une structure de contrôle qui permet de
répéter un certain nombre de fois une partie d'un
programme.
Les Boucles
2. La boucle While:
Le while permet d'exécuter des instructions en boucle tant
qu'une condition est vraie. Sa syntaxe est la suivante :
while (condition réalisée)
{
liste d'instructions
}
Cette instruction exécute la liste d'instructions tantque la
condition est réalisée.
Les Boucles
Les Boucles
2. La boucle do…while:
Contrairement aux boucles for et while, la boucle do while
effectue les instructions de boucle avant d’évaluer l’expression
d’arrêt (le bloc [condition]). La syntaxe d’une boucle do while est la
suivante:
do
{
// Instructions de boucle répétées tant que la condition est vrai
}
while ( [condition] )
Les Boucles
Les Boucles
Définition :
Un tableau est une structure de donnée, permettant de
stocker en mémoire un ensemble de valeurs du même
type à des adresses contiguës.
Les éléments du tableau peuvent être :
• des données de type simple : int, char, float, long,
double...
(la taille d'une case du tableau est alors le nombre
d'octets sur lequel la donnée est codée)
Les Tableaux
Déclaration:
Un tableau unidimensionnel est un tableau qui contient
des éléments simples de même taille contenant des
éléments d'un type donné.
La déclaration d’un tableau à une dimension se fait de la
manière suivante :
Exemple :
Déclaration d'un tableau :
int a[10];
• a est un tableau de 10 cases. Chaque case contient un
entier (type int).
• Les éléments sont a[0], a[1], a[2], a[3],…a[9]
Les tableaux unidimensionnels
Les tableaux unidimensionnels
Stockage:
• Chaque élément est conservé à l'emplacement suivant
le long de la mémoire
• Essentiellement, le PC prend la première adresse
(désignée par la variable p) et compte ensuite.
Les tableaux unidimensionnels
Nom_du_tableau[indice]
Les tableaux unidimensionnels
Nom_du_tableau [indice]
int Tab[10];
int Indice;
for (Indice = 0; Indice < 10; Indice++) {
cin>>Tab[Indice];
}
Les tableaux multidimensionnels
Définiton:
Les tableaux multidimensionnels sont des tableaux qui
contiennent des tableaux.
Par exemple le tableau bidimensionnel (3 lignes, 4 colonnes)
suivant, est en fait un tableau comportant 3 éléments, chacun
d'entre eux étant un tableau de 4 éléments :
Les tableaux multidimensionnels
Déclaration :
syntaxe : type *nom ;
Où : type est le type des variables pointées et nom est
l'identificateur du pointeur.
Manipulation :
Exemple :
int a ; // a est une variable ordinaire de type entier
int *x ; // x est un pointeur sur un entier
x=&a ; // opérateur de référencement (x reçoit l'adresse
de a)
Les Pointeurs
POINTEURS – LES OPERATEURS * ET &
adresses valeurs variables Voici une représentation schématisée
0x0 de cet exemple:
…
#include <iostream>
0xn using namespace std;
0xffffcbf4 ptr
0xn+1
m main()
{
…
é
m int a;
0xffffcbf4
int *ptr;
o 0xffffcbf5 42 a
i ptr = &a;
r 0xffffcbf6 }
e
0xffffcbf7
…
…
Les Pointeurs
Exemple :
int a=25 ; // a contient la valeur 25
int *x ; // x est un pointeur vers un entier
x=&a ; // x contient l'adresse de a
cout<<*x ; // affiche 25 (*x est le contenu de la
variable dont l'adresse est contenu dans x)
Les Pointeurs
Incrémentation/décrémentation : l'incrémentation –
décrémentation d'un pointeur permet l'incrémentation –
décrémentation de l'adresse contenue dans celui-ci du
nombre d'octets réservé au type de donnée pointée.
Exemple:
int a=2,*x;
x=&a;
x++;
Les Pointeurs
Remarques:
• Il est préférable d’initialiser le pointeur avant de
l’utiliser pour éviter les bugs!
• L'incrémentation/décrémentation d'un pointeur est utile
uniquement pour la manipulation de tableaux.
• L’incrémentation (décrémentation) exprime le fait
qu’on veuille atteindre l’élément suivant (précédent).
• Le résultat n’est correct que si l’élément pointé est
situé dans le même tableau.
Les Pointeurs
Remarques:
• L’addition de deux pointeurs n’a pas de sens !
• La soustraction de deux pointeurs (ayant le même
type) situés dans le même tableau retourne le nombre
d’éléments qui les séparent.
• Un pointeur ne peut être comparé qu’à un pointeur du
même type ou un pointeur NULL.
• On ne doit affecter à un pointeur qu’une valeur de
pointeur ayant le même type sinon on doit s'attendre à
un bug.
Les Pointeurs
i n t main() {
i n t x,y ;
x=5 ;
y=10 ;
i n t z = max(y,x) ;
cout<<" z = "<<z ; }
Les fonctions
i n t max(int a , i n t b )
{ i n t res=b ; ―x‖
i f (a>b) r e s = a ;
return res ; } ―y‖
...
i n t main() {
i n t x,y ;
x=5 ;
y=10 ;
i n t z = max(y,x) ;
cout<<" z = "<<z ; }
Les fonctions
i n t max(int a , i n t b )
{ i n t res=b ; ―x‖ 5
i f (a>b) r e s = a ;
return res ; } ―y‖
...
i n t main() {
i n t x,y ;
x=5 ;
y=10 ;
i n t z = max(y,x) ;
cout<<" z = "<<z ; }
Les fonctions
i n t max(int a , i n t b )
{ i n t res=b ; ―x‖ 5
i f (a>b) r e s = a ;
return res ; } ―y‖ 10
...
i n t main() {
i n t x,y ;
x=5 ;
y=10 ;
i n t z = max(y,x) ;
cout<<" z = "<<z ; }
Les fonctions
i n t max(int a , i n t b )
{ i n t res=b ; ―x‖ 5
i f (a>b) r e s = a ;
return res ; } ―y‖ 10
...
―z‖
i n t main() {
i n t x,y ;
x=5 ;
y=10 ;
i n t z = max(y,x) ;
cout<<" z = "<<z ; }
Les fonctions
i n t max(int a , i n t b )
{ i n t res=b ; ―x‖ 5
i f (a>b) r e s = a ;
return res ; } ―y‖ 10 ―a‖ 10
...
―z‖ ―b‖ 5
i n t main() {
i n t x,y ;
x=5 ;
y=10 ;
i n t z = max(y,x) ;
cout<<" z = "<<z ; }
Les fonctions
i n t max(int a , i n t b )
{ i n t res=b ; ―x‖ 5
i f (a>b) r e s = a ;
return res ; } ―y‖ 10 ―a‖ 10
...
―z‖ ―b‖ 5
i n t main() {
i n t x,y ; ―res‖ 5
x=5 ;
y=10 ;
i n t z = max(y,x) ;
cout<<" z = "<<z ; }
Les fonctions
i n t max(int a , i n t b )
{ i n t res=b ; ―x‖ 5
i f (a>b) r e s = a ;
return res ; } ―y‖ 10 ―a‖ 10
...
―z‖ ―b‖ 5
i n t main() {
i n t x,y ; ―res‖ 10
x=5 ;
y=10 ;
i n t z = max(y,x) ;
cout<<" z = "<<z ; }
Les fonctions
i n t max(int a , i n t b )
{ i n t res=b ; ―x‖ 5
i f (a>b) r e s = a ;
return res ; } ―y‖ 10 ―a‖ 10
...
―z‖ ―b‖ 5
i n t main() {
―res‖ 10
i n t x,y ;
x=5 ;
y=10 ;
i n t z = max(y,x) ;
cout<<" z = "<<z ; }
Les fonctions
i n t max(int a , i n t b )
{ i n t res=b ; ―x‖ 5
i f (a>b) r e s = a ;
return res ; } ―y‖ 10
...
―z‖ 10
i n t main() {
i n t x,y ;
x=5 ;
y=10 ;
i n t z = max(y,x) ;
cout<<" z = "<<z ; }
Les fonctions
i n t max(int a , i n t b )
{ i n t res=b ; ―x‖ 5
i f (a>b) r e s = a ;
return res ; } ―y‖ 10
...
―z‖ 10
i n t main() { ———————————–
i n t x,y ; z = 10
x=5 ;
y=10 ;
i n t z = max(y,x) ;
cout<<" z = "<<z ; }
Les fonctions
Types de Fichiers :
1. Les fichiers textes : contiennent des informations sous
la forme de caractères (en général en utilisant le code
ASCII). La source d’un programme C++ est un exemple
de fichier texte.
2. Les fichiers binaires : contiennent directement la
représentation mémoire des informations (binaire). Un
fichier binaire peut aussi être vu comme une séquence
d’octets. Un exemple de fichier binaire est le résultat de
la compilation d'un programme C++.
Les fichiers
Déclaration de fichiers :
La variable prédéfinie dans <fstream> est un constructeur
de fichiers logiques; et peut être :
• ofstream pour l'ouverture du fichier en écriture, ou
• ifstream pour l'ouverture du fichier en lecture.
Les fichiers
Déclaration de fichiers :
Exemples :
• ofstream fichier1 ("C:/exemple.txt");// ouverture du fichier
texte.txt en écriture
• ifstream fichier2 ("C:/exemple.txt");// ouverture du fichier
texte.txt en lecture
Les fichiers
Remarques :
• Pour utiliser un fichier, il fault tout d’abord l’ouvrir en utilisant
la méthode open(‘’ nom_de_fichier’’).
• Pour sauvegarder un fichier, il faut le fermer en utilisant la
méthode close().
• Pour écrire dans le fichier on utilise l'opérateur << .
• Pour lire dans le fichier on utilise l'opérateur >>.
Les fichiers
Exemples :
• fichier1.open (‘’exemple.txt’’) // ouvre le fichier text nommé
«exemple».
• fichier1<<" Bonjour";// écrit Bonjour dans le fichier
exemple.txt.
• Fichier1>>x;// lit la valeur de la variable x en provenance du
fichier exemple.txt.
• Fichier1.close(); // sauvegarde le fichier exemple.txt.
Les fichiers
Règle générale :
La règle générale pour créer un fichier est la suivante :
• il faut l'ouvrir en écriture.
• on écrit des données dans le fichier.
• on ferme le fichier.
Les fichiers
Règle générale :
Pour lire des données écrites dans un fichier :
• on l'ouvre en lecture.
• on lit les données en provenance du fichier.
• on ferme le fichier.
Paradigmes de programmation
DONNÉES
Sous-programmes
et
programmes
Programmation procédurale
(rappel de C)
Date Indépendance
• Jour • 05
• Mois • Juillet
• Année • 1962
•7 • 11
• Mars • Novembre
• 2005 • 1918
Classes
Jupiter Mars
• Gazeuse • Rocheuse
• 779 millions • 227936640
• 142984 • 6794
Définir une classe en C++
{
CDate independance;
}
Initialiser un Objet
{
Independance.Jour = 05;
Independance.Mois = 07;
Independance.Annee = 1962;
}
Initialiser un Objet
{
CDate armistice;
armistice.Jour=11;
armistice.Mois=11;
armistice.Annee=1918;
}
Intérêt de la POO
Par exemple :
• s'initialiser
• s'afficher
• vérifier si c'est contemporain
Initialiser
void Affiche()
{…}
Exemple
{
CDate independance;
indépendance.InitDate(05,07,1962);
CDate armistice; armistice.InitDate(11,11,1918);
independance.InitDate(05,07,1962);
La date 05/07/1962 est elle contemporaine ? no
cout <<"La date ";
independance.Affiche();
cout <<" est elle contemporaine ? "
<< independance.Contemporain()<<endl;
armistice.InitDate(11,11,1918);
cout <<"La date ";
armistice.Affiche(); La date 11/11/1918 est elle contemporaine ? no
cout <<" est elle contemporaine ? "
<< armistice.Contemporain()<<endl;
}