1 ++-1 M. BENJELLOUN : 2019-2020 U MONS Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons [email protected]2019-2020 ++-2 M. BENJELLOUN : 2019-2020 U MONS Objectifs Être capable de construire des bons programmes Des programmes : corrects, efficaces, robustes, relativement faciles à comprendre, à modifier et à maintenir. Qualités attendues d'un programme Clarté, Simplicité, Efficacité, Modularité, Extensibilité. →→ Programmer de manière modulaire Lors des séances d'exercices, où la présence est obligatoire comme aux TPs, un complément de matière sera abordé. On ne peut donc considérer, le syllabus et ce document comme complets. Pré-requis : Aucun
66
Embed
Présentation PowerPoint C++ : Transp 1er Bac...double Flottant double -1.7*10-308 à 1.7*10 308 long double Flottant double long -3.4*10-4932 à 3.4*10 4932 bool Booléen Prend deux
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Lors des séances d'exercices, où la présence est obligatoire commeaux TPs, un complément de matière sera abordé. On ne peut doncconsidérer, le syllabus et ce document comme complets.
Pré-requis : Aucun
2
++- 3M. BENJELLOUN : 2019-2020 UMONS
Architecture claire (conception répondant aux spécifications )
Algorithmes suite d'instructions permettant de résoudre un problème en
un nombre fini d'instructions et un temps fini d'exécution.
Structures de données
Réutilisabilité
Tests de robustesse (identifier les comportements problématiques )
Documentation
“Comment organiser au mieux l’informationdans un programme ?”
Tableaux !! Listes !!! Structures !! Classes !?
Qualité d’un programme
++- 4M. BENJELLOUN : 2019-2020 UMONS
C'est en forgeant que l'on devient forgeron, et c'est en programmant que euh... Peut-être …
Codes sources C++ Programmes
Transp.
Énoncés des TPs
Préparez les TPs
Syllabus.pdf
Document ‘’Environnement logiciel’’
Vidéos
120 tests formatifs sur C++
Note relative à l’organisation de l’examen pratique
….Utilisation du débuggeur
https://moodle.umons.ac.be/
3
++- 5M. BENJELLOUN : 2019-2020 UMONS
Qu'est-ce que c’est ?D'où vient-il ?Pourquoi utiliser C++ ?Que peut-on faire avec et à quoi ça sert ?De quoi ai-je besoin pour programmer en C++ ?
Caractéristiques :
• Langage structuré: tâches d'un programme en blocs.• Programmes efficaces : génère un code compact et rapide…• Modulaire : découpe en modules• Objets : meilleure qualité de programmation.
Claude DelannoyEyrollesoctobre 2017
Acquérir une parfaite maîtrise du C++ et de la programmation objet
Une référence :
Le langage C++
++- 6M. BENJELLOUN : 2019-2020 UMONS
(pseudo-code/organigramme)
(langage)
Ce programme doit gérer en boucle le menu suivant :
1- Saisie et Affiche2- Tri et Affiche3- Seuil de lipolyse et Affichage4- Efface et Affiche5- Ajoute et Affiche
Tout programme doit avoir un point d’entrée nommé main()
// Ceci est un commentaire sur 1 seule ligne
/* Ceci est un commentaire sur plusieurs lignes pour signaler
qu’il s’agit de notre premier programme qui est vide
on placera ici une liste d’instructions en C++ */
int main()
{Type_de_donnée Donnée;
Instruction 1;
Instruction 2;
.. .
return 1;
}
/* Le programme principal commençant par main()
peut contenir des instructions se terminant par ‘ ; ’ */
// Déclaration des identificateurs/variables
// La fonction ‘main()’ peut être précédée par int au lieu de void
// Si on utilise int main(), il faut retourner un entier (p.e: return 1)
++- 10M. BENJELLOUN : 2019-2020 UMONS
Un identificateur ne peut pas être un mot réservé du langage :
Les mots réservés du langage C++ doivent être écrits en minuscules.
Pour commencer
6
++- 11M. BENJELLOUN : 2019-2020 UMONS
Les identificateurs nomment les objets C++ (fonctions, variables ...).Le C++ est sensible à la case (case sensitive; distingue les minuscules des majuscules)
Exemple: AB, Ab, absont des identificateurs valides et tous différents.
Identificateurs valides : xx y1 somme_5 _position Noms Prog_1_V0
Identificateurs invalides :
3eme commence par un chiffre x#y caractère non autorisé (#) no-commande caractère non autorisé (-) taux change caractère non autorisé (espace)
Pour commencer
++- 12M. BENJELLOUN : 2019-2020 UMONS
Type de donnée Signification Plage de valeurs acceptée
char Caractère -128 à 127
unsigned char Caractère non signé 0 à 255
short int Entier court -32 768 à 32 767
unsigned short int Entier court non signé 0 à 65 535
int Entier -32 768 à 32 767 -2 147 483 648 à 2 147 483 647
unsigned int Entier non signé 0 à 65 535 0 à 4 294 967 295
long int Entier long -2 147 483 648 à 2 147 483 647
unsigned long int Entier long non signé 0 à 4 294 967 295
float Flottant (réel) -3.4*10-38 à 3.4*1038
double Flottant double -1.7*10-308 à 1.7*10308
long double Flottant double long -3.4*10-4932 à 3.4*104932
bool Booléen Prend deux valeurs : 'true' et 'false' mais une conversion implicite (valant 0 ou 1) est faite par le compilateur lorsque l'on affecte un entier (en réalité toute autre valeur que 0 est considérée comme égale à True).
Résultat :Qu'il est agreable d'utiliser cout en C++,
lorsqu'on l'utilise
proprement
\t
\t \t
Caractères Signification CODE ASCII(hexadécimal)
\n ou endl Génère une nouvelle ligne (newline) 0x0A\t Tabulation horizontale 0x09\v Tabulation verticale 0x0B\b Retour d’un caractère en arrière (backspace) 0x08\r Retour chariot (return) 0x0D\f Saut de page (form feed) 0x0C..
Formatage de la présentation → écran
Pour commencer
Les entrées /sorties : cin et cout
9
++- 17M. BENJELLOUN : 2019-2020 UMONS
Une directive préprocesseur est une directive de compilation (précédées par un #)
Gestion des Entrées-Sorties standard <iostream>
Traitement de chaînes de caractères <string>
Contrôler les paramètres d'affichage <iomanip>
Fonctions mathématiques <cmath>
Nom et doc de la fonction
Prototype de la fonction
Polynômes de Laguerre généralisés
double assoc_laguerre( unsigned n, unsigned m, double x ) ;
Polynômes de Legendre généralisés
double assoc_legendre( unsigned l, unsigned m, double x ) ;
Fonction bêta double beta( double x, double y ) ;
Pour commencer
++- 18M. BENJELLOUN : 2019-2020 UMONS
setw(int) : impose la largeur d'affichage à int caractères. Texte et nombres sont alignés à droite.
setprecision(int): impose le nombre de caractères du nombre affiché.
setfill(char): remplace les espaces précédant le nombre par le caractère char.
#include <iostream>
#include <iomanip>using namespace std;
void main() { const double Pi = 3.14159265359 ;
cout << Pi << endl ;cout << setprecision(9) << Pi << endl ;cout << setprecision(2) << Pi << endl ;cout << setw(10) << setprecision(2) << Pi << endl ;cout << setw(15) << setfill('.') << setprecision(9) << Pi << endl ;
}
Résultat :
Les entrées /sorties : cin et coutFormatage de la présentation → écran
// Déclaration d’une constante
// Pour utiliser set…..
//L’initialisation des constantes est obligatoire lors de leur déclaration.
Le résultat d'une expression logique est un booléen. Il vaut true si elle est vraie et false sinon.
Réciproquement, toute valeur non nulle est considérée comme vraie et la valeur nulle comme fausse.
!
Les opérateurs de comparaison
13
++- 25M. BENJELLOUN : 2019-2020 UMONS
Contractions d'opérateurs
+= -= *= /= %= &= |= ^= <<= >>=
a += 15;
a = a + 15;
i *= j + 5;
i = i * (j + 5);
Incrément et décrément
Pour
++ incrément : i++ ou ++iest équivalent à i += 1 ou i = i + 1
- - décrément
int i = 5, j = 4;char lettre = 'B';
i++; // i vaudra 6--j; // j vaudra 3++i; // i vaudra 7lettre++; // lettre vaudra Clettre --; // lettre vaudra B
++- 26M. BENJELLOUN : 2019-2020 UMONS
Les structures de contrôle
Alternative: if-else
Itérations: for, while, do-while
Rupture de Contrôle: break, continue, return …
Choix Multiple: switch-case
14
++- 27M. BENJELLOUN : 2019-2020 UMONS
Les structures de contrôle
Bloc 1
d’instructions
Bloc 2
d’instructions
oui non
Suite du programme
oui non
Suite du programme
Bloc
d’instructions
Condition
vraie
oui
non
Bloc
d’instructions
programme
Conditionvraie
Suite du programme
programme
Condition
vraie
if-else while do-while
++- 28M. BENJELLOUN : 2019-2020 UMONS
if (Condition vraie){
BLOC 1 D'INSTRUCTIONS
}else{
BLOC 2 D'INSTRUCTIONS
}
Bloc 1 d’instructions
Bloc 2 d’instructions
oui non
Suite du programme
programme
Conditionvraie
if (Condition vraie) {
instruction 1;instruction 2;
}else {
instruction 3;instruction 4;
}
if (Condition vraie) instruction A;
else instruction B;
if (a<b)min=a;
elsemin=b;
Selon qu’une certaine condition est vérifiée ou non, on exécutera une ou plusieurs instructions.
Les décisions - if … else
15
++- 29M. BENJELLOUN : 2019-2020 UMONS
Bloc 1 d’instructions
oui non
Suite du programme
Conditionvraie
if (Condition vraie){
instruction 1;instruction 2;instruction 3;…
instruction N;}
if (Condition vraie)
instruction 1;
if ( temperature > 70.0)
cout << " Alarme "<<endl;
if (i) if (i != 0)Toute valeur non nulle est considérée comme vraieet la valeur nulle comme fausse.
Les décisions - if sans else
++- 30M. BENJELLOUN : 2019-2020 UMONS
if ( <expr1> ) <bloc1>else if (<expr2>)<bloc2>else if (<expr3>)<bloc3>else if (<exprN>)<blocN>else <blocN+1>
if ( <expr1> ) <bloc1>
else if (<expr2>)<bloc2>
else if (<expr3>)<bloc3>
else if (<exprN>)<blocN>
else <blocN+1>
◼ else est associé avec le if le plus proche
if(i >= 0)
if(i > 1000) cout<<" i > 1000 ";
else cout<<" i < 0 \n";
if(i >= 0) {
if(i > 1000) cout<<" i > 1000 ";
} else cout<<" i < 0 \n";
Les décisions – if emboîtés
16
++- 31M. BENJELLOUN : 2019-2020 UMONS
#include<iostream>using namespace std;
int main(){char a, b;setlocale(LC_ALL, "fra"); // pour les accentscout << "Tapez un caractère : "; cin >> a;
if (a >= 'A' && a <= 'Z') {cout << "Vous avez tapé une majuscule." << endl;b = a + ('a' - 'A');cout << "La minuscule correspondante est " << b << endl;
}else if (a >= 'a' && a <= 'z') {
cout << "Vous avez tapé une minuscule." << endl;b = a + ('A' - 'a');cout << "La majuscule correspondante est " << b << endl;}else
cout << "Vous n'avez pas tapé une lettre." << endl;
system("pause");
return 1; // il faut retourner un entier car ‘main()’ est de type ‘int’}
Transformation de majuscule en minuscule
Si l'utilisateur a tapé une majuscule, on affiche la minuscule correspondante.
Si l'utilisateur a tapé une minuscule, on affiche la majuscule correspondante.
if emboîtés exemple
++- 32M. BENJELLOUN : 2019-2020 UMONS
Les itérations – for
#include <iostream> using namespace std;
void main() {int nb_f=0;
action;nb_f++;
action;nb_f++;
action;nb_f++;…
}
#include <iostream> using namespace std;
void main() {int nb_f=200;
action;nb_f--;
action;nb_f--;
action;nb_f--;…
}
for (nb_f = 0; nb_f <30; nb_f++) {
action;
}
for (nb_f = 200; nb_f >0; nb_f--) {
action;
}
La boucle for est une structure de contrôle de programmation qui permet de répéter l'exécution d’une ou plusieurs actions.
Les structures répétitives permettent d’exécuter plusieurs fois de suite la même suite d’instructions.
Les itérations – for
i = 0i = 1i = 2
j = 5j = 4j = 3j = 2j = 1
++- 34M. BENJELLOUN : 2019-2020 UMONS
Nous considérons un circuit électrique. Quand l’interrupteur ‘Int’ est dans la position de la Fig (X=1), le générateur de tension ‘G’ allume l’ampoule ‘X’ (X=true ou X = 1). Quand l’interrupteur s’ouvre, ‘X’ s’éteint (X=false ou X = 0).
#include <iostream>using namespace std;
void main() {bool x = 1;cout << " Test : X = " << x << endl;cout << "--------------------------"<< endl;for (int i=0; i < 6 ; i++ ) {
x= 1-x ; // x = ! x ou x=x%2
cout << " X = " << x << endl;}
}
Afin de simuler le clignotement d’une ampoule (X), complétez le code de sorte que l’exécution du programme fournisse les résultats ci-dessous (en rouge):
for (x = 0; x < 4; x++) {cout << "x = " << x << endl;
}
while(x<4 ) {…
}
do {…
} while(x < 4 );
#include <iostream>using namespace std;int main ()
{
return 1;
}
int n=2, x ; // commentaire
x=3;
instructions2
instructions1
If OK?O
If OK?
instructions
O
N
N
Structure d'un programme C++ : exemple
++- 42M. BENJELLOUN : 2019-2020 UMONS
Dans une laverie automatique, on met à la disposition des clients trois types de machines de capacités de linge maximum :
M1 : 3 Kg au prix forfaitaire de 4 euros,
M2 : 5 Kg au prix forfaitaire de 5 euros,
M3 : 10 Kg au prix forfaitaire de 6 euros.
Donnez un programme qui permet de minimiser le nombre de machines à utiliser et donc minimiser les frais en fonction de la quantité de linge à laver.
Les structures de contrôleAlternative & Itérations → Application
22
++- 43M. BENJELLOUN : 2019-2020 UMONS
Pour rompre le déroulement séquentiel d'une suite d'instructions
Instructions d'échappement
return (expression); permet de sortir de la fonction qui la contient
exit (expression);La fonction est interrompue. ‘expression’ : un entier indiquant le code de terminaison du processus
for (i = -10; i <= 10; i++) {if (i == 0)
continue;// pour éviter la division par zéro
cout << 1 / i;}
while (Condition vraie) {............ ;
............ ;
continue;............ ;
............ ;
break;............ ;
............ ;
}............ ;
#
8
int i;
for (i = -3; i <= 3; i++) {cout << i << endl ;if(i = = 0) {
break;cout << " break ";
}}cout << "Fin " ;
-3-2-10Fin
++- 44M. BENJELLOUN : 2019-2020 UMONS
switch = AU CAS OU ... FAIRE ...
…
switch(variable de type char ou int) // au cas où la variable vaut:
{case valeur1: ......; // variable=valeur1 : exécutez ce bloc d'instructions.
.......;break;
case valeur2:........; // variable=valeur2: exécutez ce bloc d'instructions.........;
break;.. // etc ....
default: .......; /* Si aucune des valeurs précédentes: exécutez ce........; bloc d'instructions, pas de "break" ici.*/
}
Le bloc "default" n'est pas obligatoire. valeur1, valeur2, …. doivent être des expressions constantes. L’instruction switch correspond à une cascade d’instructions if ...else
Pour terminer la chaîne, on place en fin de chaîne le caractère nul '\0', de code ASCII 0.Ce caractère est soit ajouté automatiquement par le compilateur, soit introduit par le programmeur, selon les fonctions utilisées.
On ne peut pas lire en une fois une ligne entière contenant des blancs (espaces) avec cin
☞ il faut utiliser getline pour lire une ligne entière (contenant des espaces)
Exemple :
string nom_compose, nom;cout << " Introduisez le nom avec espace : "; // Van Coolgetline(cin, nom_compose);cout << nom_compose << endl; // ==> Van Coolcout << " Introduisez un nom avec espace : "; // De Vlamcin >> nom_compose;cout << nom_compose << endl; // ==> De
++- 56M. BENJELLOUN : 2019-2020 UMONS
☞ après un ’\n’ il faut utiliser un cin.ignore() avant getline
string nom_compose, nom;int N;cout << " Introduisez la valeur de N : "; // 5 (puis validation avec ┐ ~ ‘\n’ ) cin >> N ;cin.ignore(); // pour absorber ‘\n’ pour valider 5cout << " Introduisez le nom avec espace : "; // Van Coolgetline(cin, nom_compose);cout << " Le nom est : " << nom_compose << endl; // ==> Van Coolcout << " Introduisez un nom avec espace : "; // De Vlamgetline(cin, nom_compose);cout << " Le nom est : " <<nom_compose << endl; // ==> De Vlam
Introduisez la valeur de N : 5Introduisez le nom avec espace : Van CoolLe nom est : Van Cool
Introduisez le nom avec espace : De VlamLe nom est : De Vlam
Exécution avec ignore:
Introduisez la valeur de N : 5Introduisez le nom avec espace : Le nom est :
Introduisez le nom avec espace : Van CoolLe nom est : Van Cool
Exécution sans ignore:
Lecture d’un string contenant des espaces
29
++- 57M. BENJELLOUN : 2019-2020 UMONS
Algorithmes de tri
Un algorithme de tri est un algorithme qui permet d'organiser les éléments d'un ensemble, un tableau, selon une relation d'ordre déterminée. Il est par exemple fréquent de trier des strings, entiers, … selon une relation d'ordre croissant ou décroissant. Le tri permet au programme d'être plus performant. Il est utile, par exemple, pour accélérer la recherche d’éléments.
Nom de l’algorithme Complexité
Tri à bullesTri par sélectionTri par insertion
Tri de Shell (shell sort) : Amélioration du tri par insertion
Tri fusion (merge sort) : Tri rapide (quick sort) : Tri par tas (heap sort) :
O(N2)O(N2)O(N2)
O(N log2 N)
O(N log N)O(N log N)O(N log N)
++- 58M. BENJELLOUN : 2019-2020 UMONS
Tri à bullesbubble sort
répéterpermutation = FALSE;commencer au début du drapeau;
Pour i variant de 0 à N – 2 faire si cellule [i] ">" cellule [i+1]alors
débutpermuter cellules;permutation = TRUE;fin
jusqu'à ce que (not permutation)
Complexité : O(N²) Proportionnel à N² permutations
void TriaBulles (int x[], int N) {int i, perm=1, tmp; while (perm==1) {
consiste en la recherche du plus grand élément (le plus petit) que l'on va replacer en dernière position (en première), puis on recherche le second plus grand élément (le second plus petit) que l'on va replacer également à sa position finale et ainsi de suite.
Algorithmes de tri
++- 60M. BENJELLOUN : 2019-2020 UMONS
Recherche d'un élément dans un tableau
Recherche linéaire0
9
1
3
2
6
3
2
4
1
5
12
6
0
int i = 0 , x , N=7;
. . .
while ( (i < N) && ( A [i] != x ) {
i = i + 1 ;
};
. . .
i
A [i]
31
++- 61M. BENJELLOUN : 2019-2020 UMONS
Recherche d'un élément dans un tableau
Recherche dichotomique (binary search)
Est une méthode efficace pour retrouver un élément dans un tableau trié.
A chaque étape de la recherche dichotomique, l’intervalle de recherche est divisé par deux.
On utilise dès lors deux index de recherche : la borne inférieure et la borne supérieure.
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf supmid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup à la première et dernière valeur des index du tableau tab respectivement
◼ Le milieu est donné parmid = (inf+sup) / 2; (0+6)/2 =3
◼ Supposons que l’on recherche la valeur i=6. On compare cette valeur avec tab[mid]=8. Comme tab[mid]>i, on change mid en sup.
4.4. Écrire un programme qui supprime le premier et le dernier élément d’un vecteur. vecteur initial : Tab → 0 1 2 3 4 5 6
sup. bords ➔ 1 2 3 4 5 sup. bords ➔ 2 3 4
4.5. Écrire un programme qui supprime le milieu du tableau et ajoute son double au début. vecteur initial : Tab → 1 2 3 4 5
sup. Aj ➔ 6 1 2 4 5 sup. Aj ➔ 4 6 1 4 5
4.6. Codez un programme de tri à bulles d'un vecteur de strings.
4.7. Codez un programme de recherche dichotomique d'un nombre dans un vecteur de strings rangés par ordre croissant.
32
++- 63M. BENJELLOUN : 2019-2020 UMONS
1 2 3 4
Accès aux éléments d’un tableau à deux dimensions
Une matrice est un tableau à 2 dimensions; m lignes et n colonnes. Les m × n éléments sont rangés ligne par ligne. L’accès aux composantes se fait par double crochets
int a[10][5] ;a[1][0] = 7;
int x[2][2] = {{1,2},{3, 4}}; // 2 lignes et 2 colonnes
· Encapsule un traitement particulier formant un tout
· Peut implémenter la notion de module en logique
· Augmente la lisibilité d’un programme
· Réalise un objectif précis
· Améliore le débogage et la maintenance d’un programme
Son utilisation se décompose en trois phases :
· Définition de la fonction
· Déclaration de la fonction
· Appel de la fonction
++- 66M. BENJELLOUN : 2019-2020 UMONS
Fonctions en C++
Structure d'un programme C++
Définition d’une fonction
Fonctions pourquoi ?
Déclarer et appeler une fonction
Les Pointeurs et les Références
Appel par valeurs, pointeurs, références
Règles de visibilité des variables
Fonctions et récursivité
Surcharge des fonctions
Paramètres par défaut
Passage des tableaux aux fonctions
Allocation dynamique de la mémoire
34
++- 67M. BENJELLOUN : 2019-2020 UMONS
#include <iostream>
using namespace std;int Somme(int x, int y);
void main(void) {
int Som;
Som = Somme(7,9); //appel de la fonction
if ( Som > 10 ) {
cout <<" Som > 10 "<< Som<< endl;
}
else {cout <<" Som <= 10 "<< Som;
}
int Somme(int x, int y) { /* Définition de la fonction */
int S; S= x+y;return S ;
}
Directives du préprocesseur : accès avant la compilation
Programme
principal
Déclarations
TraitementsDonnéesStructures de contrôleCommentaires
Structure d'un programme C++ : exemple
++- 68M. BENJELLOUN : 2019-2020 UMONS
Type nom_fonction(liste_param_typés)
{//déclaration de variables locales
…. /* Corps de la fonction */
….
return (valeur);
}
Définition d’une fonction
Une fonction renvoie une valeur ou rien
liste_param_typés = 0, void ou plusieurs
int Somme(int x, int y) {int S; // Variable locale à Somme
S= x+y;return S ;
}
long pgcd(long a, long b) {long r;
while (b > 0) {r = a % b;a = b;b = r;
}return a;}
35
++- 69M. BENJELLOUN : 2019-2020 UMONS
Définition d’une fonction
void fonction1(){
cout<<"\n fonction1 \n";
void fonction2(){
cout<<"\n fonction2 \n";}
int fonction3(){
…. ;}
}
L'imbrication de définitions de fonctions n'est pas autorisée
++- 70M. BENJELLOUN : 2019-2020 UMONS
…
void main(){
int i, j, SomCar1=0, SomCar2=0, SomCar3=0;
for (i = 0; i <5; i++) {
SomCar1 = SomCar1 + i*i ;
}
cout<<" SC="<<SomCar1<< endl;
for (i = 0; i <10; i++) {
SomCar2 = SomCar2 + i*i ;
}
cout<<" SC="<<SomCar2<< endl;
for (j = 0; j < 7; j++) {
SomCar3 = SomCar3 + j*j ;
}
cout<<" SC="<<SomCar3<<endl;
}
…
void Fnct_SomCar(int N){
int i, S=0;
for (i = 0; i <N; i++)
S = S + i*i ; //S+=i*i;
cout<<" SC="<<S<< endl;
}
void main(){
Fnct_SomCar(5) ;
Fnct_SomCar(10) ;
Fnct_SomCar(7) ;
}
Fonctions pourquoi ?
36
++- 71M. BENJELLOUN : 2019-2020 UMONS
…
void main(){
Fnct_SomCar(5) ;
Fnct_SomCar(10) ;
Fnct_SomCar(7) ;
}
void Fnct_SomCar(int N) {
int i, S=0;
for (i = 0; i <N; i++)
S = S + i*i ;
cout<<" SC="<<S<< endl;
}
5
Fonctions pourquoi ?
10
++- 72M. BENJELLOUN : 2019-2020 UMONS
Fonctions pourquoi ?
#include <iostream>
using namespace std;
void main() {
int i, j, SomCar1=0, SomCar2=0, SomCar3=0;
for (i = 0; i <5; i++) {
SomCar1 = SomCar1 + i*i ;
}
for (i = 0; i <10; i++) {
SomCar2 = SomCar2 + i*i ;
}
for (j = 0; j < 7; j++) {
SomCar3 = SomCar3 + j*j ;
}
cout<<" SC1="<<SomCar1<<" SC2="
<< SomCar2 <<" SC3="<<SomCar3;
}
#include <iostream>
using namespace std;
int Fnct_SomCar(int N) {
int i, S=0;
for (i = 0; i <N; i++)
S = S + i*i ; //S+=i*i;
return S;
}
void main() {
int SomCar1, SomCar2, SomCar3;
SomCar1 = Fnct_SomCar(5) ;
SomCar2 = Fnct_SomCar(10) ;
SomCar3 = Fnct_SomCar(7) ;
cout<<" SC1="<<SomCar1<<" SC2="
<< SomCar2 <<" SC3="<<SomCar3;
}
37
++- 73M. BENJELLOUN : 2019-2020 UMONS
…
void main(){
int Val1, Val3;
…
Val1 = Fnct1_() ;
Fnct2_() ;
Val3 = Fnct3_() ;
}
……….………..return entier;
int Fnct1_()
……….………..Fnct4_();………..………..
void Fnct2_()
……….………..………..………..
void Fnct4_()
……….………..return entier;
int Fnct3_()
Fonctions pourquoi ?
Une fonction peut, pendant son exécution, faire appel à une autre fonction, qui elle-même en appelle d'autres, etc.
++- 74M. BENJELLOUN : 2019-2020 UMONS
…
int Somme(int x, int y);
void main(void) {
int a=5; b=6, Som;
Som = Somme(7,7);
cout <<" Som = "<< Som<< endl;cout <<" Som = "<< Somme(a,b);
}
int Somme(int x, int y) {int S; S= x+y;return S ;
}
…
int Somme(int x, int y) {int S; S= x+y;return S ;
}
void main(void) {
int a=5; b=6, Som;
Som = Somme(7,7);
cout <<" Som = "<< Som<< endl;cout <<" Som = "<< Somme(a,b);
}
Déclaration et appel d’une fonction Fonction Renvoyant une valeur au programme
38
++- 75M. BENJELLOUN : 2019-2020 UMONS
void main(void){
int Val ;Val = addition();cout << "val = "<< Val<<endl;
}
int addition(){
float tmp;tmp = calcule(2.5,3) + calcule(5,7.2);
return (int)tmp;}
float calcule(float C, float D){
return ( (C + D ) / 2) ;}
float calcule(float, float);int addition();
float calcule(float A, float B){
return ( (A + B ) / 2) ;}
int addition(){ // Appel d’une fonction dans une fonction
float tmp;tmp = calcule(2.5,3) + calcule(5,7.2);
return (int)tmp;}
void main(void){
int Val ;Val = addition();cout << "val = "<< Val<<endl;
}
Déclaration et appel d’une fonction
++- 76M. BENJELLOUN : 2019-2020 UMONS
#include <iostream>
using namespace std;
void Modifier(int v);
void main(){
int v = 5; // Variable locale à main()
Modifier(v); // Appel de la fonction Modifier
cout << "\n Main: v = " << v; /* Affiche la valeur de v après
passage dans la fonction Modifier*/
}
void Modifier(int v){
v = v *100; // Modifie la copie
cout << "Modifier: v = "<< v; /* Affiche la valeur de v dans la
fonction Modifier*/
}
v= 5
V’ = 500
Les paramètres sont copiés. La fonction travaille donc sur une copie de v.
Déclaration et appel d’une fonction
Modifier: v = 500
Main: v = 5
39
++- 77M. BENJELLOUN : 2019-2020 UMONS
#include <iostream>
using namespace std;
void Addition(int v, float f);
void main(){
int v = 5;
float f= 4.5 ;
Addition(v, f); // Appel de la fonction
cout << "\n Main: v et f = " << v << "et " <<f;
}
void Addition(int v, float f){
cout << " Addition: v + f = "<< v+f << endl;
f = f + v;
cout << " Addition: f = "<< f ;
}
v= 5 et f=4.5
5+ 4.5
f = 9.5
Les paramètres sont copiés. La fonction travaille donc sur une copie de v.
Déclaration et appel d’une fonction
Addition : v+f = 9.5
Addition : f = 9.5
Main: v et f = 5 et 4.5
++- 78M. BENJELLOUN : 2019-2020 UMONS
Fonction Renvoyant une valeur au programme
#include <iostream>
using namespace std;
int return_Val(int X);
void main(void){int var = 5;int valeur;
valeur = return_Val (var);
cout <<"main: var = "<< var << endl;cout <<"main: valeur = "<< valeur;
}
int return_Val (int v){
v = 100;cout <<" return_Val : v = "<< v << endl;return (v+1);
}
Une fonction se termine et ‘rend la main’ à la fonction appelantelorsque son exécution rencontre l’instruction: return expression;ou return;
Déclaration et appel d’une fonction
return_Val : v = 100main: var = 5main: valeur = 101
40
++- 79M. BENJELLOUN : 2019-2020 UMONS
#include <iostream>using namespace std;
int return_Val (int Z);
void main(void){int var = 5, valeur;
valeur = return_Val(var);
cout << "main: var = " << var << endl;cout << "main: valeur = "<< valeur;
}
int return_Val(int v){
if (v == 10) return (2*v);else return (3*v);
}
#include <iostream>using namespace std;
int return_Val (int K);
void main(void){int var = 5;int valeur;valeur = return_Val(var);
cout << "main: var = " << var << endl;cout << "main: valeur = "<< valeur;
}
int return_Val(int v) {if (v == 10) return (2*v);else return (3*v);cout <<" return_Val v = "<< v<<endl;
}
Qu’affiche ce programme à l’écran ? Qu’affiche ce programme à l’écran ?
Déclaration et appel d’une fonction
++- 80M. BENJELLOUN : 2019-2020 UMONS
Types de base …. donnée
8donnée
35….
Adr i Adr j
Mémoire
12FF80 12FF84
L'adresse de l'élément i est &i → i=8 et &i= 12FF80int i=8, j=35;
Les Pointeurs et les Références
Et les pointeurs ?
Le pointeur prend comme
valeurs des adresses de
données en mémoire
…. p=12FF84 …. 35 ….
12FF8412FF80
int *p; *p est le contenu pointé par p → 35p est l’adresse → 12FF84
41
++- 81M. BENJELLOUN : 2019-2020 UMONS
Déclaration de Pointeurs
Exemples de déclarations de pointeurs
int *pi; // pi est un pointeur vers un int ; *pi désigne le contenu de l'adressefloat *pf; // pf est un pointeur vers un floatchar c, d, *pc; // c et d sont des char; pc est un pointeur vers un char
int C = 4;
int *p;
p = &C; // p reçoit l'adresse de c; donc pointe sur c.
cout << "*p = "<<*p<<endl;
cout << "p = "<<p <<endl;
cout <<" *(&C) "<<*(&C);
L'adresse de C est &C
*p = 4
p = 0x12FF7C
*(&C) = 4
Les Pointeurs et les Références
++- 82M. BENJELLOUN : 2019-2020 UMONS
Une référence vers un objet permet de définir un nouveau nom, un alias, pourdésigner l’emplacement mémoire de l’objet référencé. En tant qu'alias, laréférence doit impérativement être initialisée, avec l'objet référencé.
int i = 35, j;int &ref = i ; /* ref une référence sur la variable i. permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a été déclarée.
i et ref deux identificateurs qui représentent la même variable */
int &ErRef; // INTERDIT : une référence doit être initialisée
j = ref; // j = la valeur de l'objet référencé par ref→ (j = i = 35)
ref = 100 ; // ref=i= 100 ; j reste à 35
i = j ; // ref=i=j = 35
Les Pointeurs et les Références
42
++- 83M. BENJELLOUN : 2019-2020 UMONS
#include …
void Modifier(int v);
void main(){
int v = 5;
Modifier(v);
cout << "\nmain: v = " << v;
}
void Modifier(int v){
v = v *100;
cout << "Modifier: v = "<< v;
}Modifier: v = 500
main: v = 5
#include …
void Modifier(int *v);
void main(){
int v = 5;
Modifier(&v);
cout << "\nmain: v = " << v;
}
void Modifier(int *v){
*v = *v *100;
cout << "Modifier: *v = "<< *v;
}
#include …
void Modifier(int &v);
void main(){
int v = 5;
Modifier(v);
cout << "\nmain: v = " << v;
}
void Modifier(int &v){
v = v *100;
cout << "Modifier: v = "<< v;
}
par Valeur Pointeur Référence
Appel par valeurs, pointeurs, références ??!!
var = 5
var = 500
Modifier: *v = 500
main: v = 500
var = 500
Modifier: v = 500
main: v = 500
var = 5
++- 84M. BENJELLOUN : 2019-2020 UMONS
#include …
void fonct (int a){
a=1 ;}
void main(void){int var = 5;fonct (var);cout << var << endl;
}
5
#include …
int fonct (int a){
a=1 ;return a;
}
void main(void){int var = 5;var = fonct (var);cout << var << endl;
}
1 1
#include …
void fonct (int *a){
*a=1 ;}
void main(void){int var = 5;fonct (&var);cout << var << endl;
}
#include …
void fonct (int &a){
a=1 ;}
void main(void){int var = 5;fonct (var);cout << var << endl;
}
1
Appel par valeurs, pointeurs, références ??!!
43
++- 85M. BENJELLOUN : 2019-2020 UMONS
#include <iostream> …void affiche (int a, int b) {
cout<<"\t i = " << a << " j = " << b << endl;}
void echange (int, int);void main () {
int i= 1, j=5;affiche (i, j);echange (i, j);affiche (i, j);
}void echange (int a, int b){
int tmp;tmp = b;b = a;a = tmp;
}
void echange (int*, int*);void main () {
int i= 1, j=5;affiche (i, j);echange (&i, &j);affiche (i, j);
}void echange (int *a, int *b) {
int tmp;tmp = *b;*b = *a;*a = tmp;
}
void echange (int&, int&);void main () {
int i= 1, j=5;affiche (i, j);echange (i, j);affiche (i, j);
}void echange (int &a, int &b) {
int tmp;tmp = b;b = a;a = tmp;
}
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
par Valeur Pointeur Référence
Appel par valeurs, pointeurs, références ??!!
++- 86M. BENJELLOUN : 2019-2020 UMONS
#include <iostream> …
int return_Val(int , int);
void main(void){
int var1 = 5, var2=0;
int valeur;
valeur = return_Val(var1, var2);
cout << "var1 = " << var1
<< " var2 = "<<var2 << endl;
cout << "main: valeur = "<< valeur;
}
int return_Val(int v1, int v2) {
v1 *= 10;
v2 += 7;
return …;
}
Comment retourner v1 et v2?
#include <iostream> …
void return_Val(int &, int&);
void main(void){
int var1 = 5, var2=0;
int valeur;
valeur = return_Val(var1, var2);
cout << "var1 = " << var1
<< " var2 = "<<var2 << endl;
cout << "main: valeur = "<< valeur;
}
void return_Val(int &v1, int &v2) {
v1 *= 10;
v2 += 7;
return …;
}
var1 = 50 var2 = 7
Appel par ------------------, références ??!!
44
++- 87M. BENJELLOUN : 2019-2020 UMONS
#include <iostream> …
void somme(int , int , int &);
int modif(int , int &, int &);
void main(){
int a, b, c;
a = 2; b = 8;
somme(a, b, c);
cout <<"Somme de a="<<a<<" et b="<<b<<" : " << c << endl;
a = modif(a, b, c);
cout << "Modif : a="<<a<<" et b="<<b<<" : " << c << endl;
}
void somme(int x, int y, int &z){
z = x + y;
y = 29;
}
int modif(int x, int &y, int &z){
x *= 2; y= x+ y; z= 5;
return x;
}
Qu'affiche le code à l'écran ?
Modif : a= et b= :
Somme de a= et b= :
Appel par ------------------, références ??!!
++- 88M. BENJELLOUN : 2019-2020 UMONS
Si x=1Si x =2Si x=3Si x=4Si x=5
…int Fonct1(int y){
y = 10; return (y);}void Fonct2(int y){
y = 11; exit(0);}void Fonct3(int y){
y = 12;}
void Fonct4(int &y){y = 13;
}
void main() {int x=0, y=0;cin >> x;
if (x== 1) y = Fonct1(y);if (x== 2) Fonct2(y);if (x== 3) return ( );if (x== 4) Fonct4(y);if (x== 5) Fonct3(y);
cout <<"ICI y="<<y ;}
45
++- 89M. BENJELLOUN : 2019-2020 UMONS
Règles de visibilité des variables
Le C++ est un langage structuré en blocs { } , les variables ne peuvent être utilisées que là où elles sont déclarées.
#include <iostream>using namespace std;
void main() {int i = 10;
for (int i = 0; i <3 ; i++) { cout << i << endl;
}
cout << i << endl; // valeur de i ??}
++- 90M. BENJELLOUN : 2019-2020 UMONS
Règles de visibilité des variables
Le C++ est un langage structuré en blocs { } , les variables ne peuvent être utilisées que là où elles sont déclarées.
46
++- 91M. BENJELLOUN : 2019-2020 UMONS
#include <iostream>using namespace std;
void main() {
const float PI= 3.14159;float rayon = 3.5;float circonference, surface;int choix;
cout << "1. Calculer la circonference\n";cout << "2. Calculer la surface\n";
int **T; // pointeur sur un pointeur sur un entier
int i, j, lignes, colonnes;
cout << "\nEntrez le nb de lignes et de colonnes: ";
cin >> lignes >> colonnes;T = new int* [lignes]; // Alloc. d’un tableau de pointeurs
// pour chaque ligne, alloc. du nb de col.
for (i=0; i<lignes; i++)T[i] = new int[colonnes];
for (i=0; i<lignes; i++)for (j=0; j<colonnes; j++) {
cout <<"T[" <<i <<"," <<j <<"]: ";cin >> T[i][j];
}// Destruction
for (i=lignes-1; i>=0; i--)delete[] T[i];
delete[] T;}
Tableau dynamique à deux dimensions
Allocation dynamique de la mémoire
54
++- 107M. BENJELLOUN : 2019-2020 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut #include <fstream>
On y trouve essentiellement les classes:• ofstream (output file stream) permet d’écrire les données dans le fichier ;• ifstream (input file stream) permet de lire les données du fichier ;
Ouverture et fermeture d’un fichier :
ofstream output, X;output.open("Res.txt"); ou output.open("c:\\labojeudi\\Res.txt");X.open("Data"); ou X.open("A:\\Data");
Écriture :
Lecture : ifstream input ;input.open("Data.txt"); ou input.open("c:\\labojeudi\\Data.txt");
cout << "\n\t Nom = " << AR.nom << " Prix = " << AR.prix;
}
void main(void) {
Article A, T[5];
cout << "Entrez le nom : "; cin >> A.nom;
cout << " \nEntrez le prix "; cin >> A.prix;
Affiche(A);
for (int i=0; i<5; i++){
cout << "Entrez le nom : "; cin >> T[i].nom;
cout << "\nEntrez le prix "; cin >> T[i].prix;
Affiche(T[i]);
}
}
nom1prix1
nom2prix2
nom3prix3
. . . …
Et si nom contenait un espace ?Exp. Mon Smartphone
Les Structures
++- 116M. BENJELLOUN : 2019-2020 UMONS
#include …
struct Article{
string nom;
int prix;
};
void Affiche(Article AR){
cout << "\n\t Nom = " << AR.nom
<< " Prix = " << AR.prix;
}
void Saisie(Article AR){
cout << "Entrez le nom : "; cin >> AR.nom;
cout << "\nEntrez le prix :"; cin >> AR.prix;
}
void main(void) {
Article A;
Saisie(A);
Affiche(A);
}
? Une structure peut être passée, comme une autre variable, par valeur ou par adresse ?
???
Les Structures
Entrez le nom :
Entrez le prix :
59
++- 117M. BENJELLOUN : 2019-2020 UMONS
#include …
struct Article{
string nom;
int prix;
};
void Saisie(Article &AR){
cout << "Entrez le nom : "; cin >> AR.nom;
cout << "\nEntrez le prix :"; cin >> AR.prix;
}
void main( ) {
Article T[5];
for (int i=0; i<5; i++)
Saisie(T[i]);
}
T[i]=Nouv();
Article Nouv(){
Article AA;
cout << "Entrez le nom : "; cin >> AA.nom;
cout << "\nEntrez le prix :"; cin >> AA.prix;
return AA;
}
L’opération d’affectation = peut se faire avec des structures
Les Structures
++- 118M. BENJELLOUN : 2019-2020 UMONS
struct E{int x;int y ;
} ;
#include …
void fonct (E *a) {
*a.x=1 ; *a.y=2;
}
void main(void){
struct E V;
V.x=V.y=0;fonct (&V);
cout << V.x << V.y;}
1 2
#include …
void fonct (E a) {
a.x=1 ; a.y=2;
}
void main(void){
struct E V;
V.x=V.y=0;
fonct (V);
cout << V.x << V.y;
}
0 0
#include …
E fonct (E a) {
a.x=1 ; a.y=2;
return a;
}
void main(void) {
struct E V;
V.x=V.y=0;
V = fonct (V);
cout << V.x << V.y;}
1 2
#include …
void fonct (E &a) {
a.x=1 ; a.y=2;
}
void main(void){
struct E V;
V.x=V.y=0;fonct (V);
cout << V.x << V.y;}
1 2
Les Structures
60
++- 119M. BENJELLOUN : 2019-2020 UMONS
Passer des tableaux aux fonctions
#include …
void Modif(int a[]){
a[0] = 5;
a[1] = 6;
}
void main() {
int p[2] = { 1, 2 };
cout <<p[0] <<" ; "<<p[1];
Modif(p);
cout <<p[0] <<" ; "<<p[1];
}
1 ; 2
5 ; 6
#include …
void Modif(struct E a[]){
a[0].x = a[0].y = 5;
a[1].x = a[1].y = 6;
}
void main( ) {
struct E p[2];
p[0].x= p[0].y= p[1].x= p[1].y = 0 ;
Modif(p);
cout << p[0].x << " ; "<< p[0].y;
cout << p[1].x << " ; "<< p[1].y;
}
Les Structures
++- 120M. BENJELLOUN : 2019-2020 UMONS
structElem{
int x ;string y ;
} ;3
Nom1
2
Nom4
5
Nom5
…
…
Elem Tab[Cste];
void Saisie(Elem Tab[], int n) {for(int i=0; i<n; i++) {
cout << "\n le nom de l article: "
cin >> Tab[i].y;cout << "\n le prix de l article: ";
cin >> Tab[i].x;}
}
Manipulation d’un tableau
Les Structures
61
++- 121M. BENJELLOUN : 2019-2020 UMONS
void Saisie(struct article Tab[], int &N) {… N?? // tester
for(int i=0;i<N;i++) {cout << "\n \n entrer le nom de l article: ";cin >> Tab[i].Nom;cout << "\n entrer le Code de l article: ";cin >> Tab[i].Code;cout << "\n entrer le prix de l article: ";cin >> Tab[i].Prix;
}…
1- Saisie et affichage:Est constitué de deux fonctions :
Saisie (…...) ; // de type voidDans cette fonction, on demandera et on testera N < Nmax pour initialiser
le tableau (par exemple 5) et on effectuera la saisie.Affichage (…….) ;
struct article {string Nom;char Code;float Prix;
};
Manipulation d’un tableau
Les Structures
++- 122M. BENJELLOUN : 2019-2020 UMONS
void main() {struct article Tab[Nmax];…
do{rep_menu=menu();
switch(rep_menu) {case 1: Saisie(Tab,n);
Affichage(Tab, n);break;
default : cout << " Il faut choisir entre 1) .... et 8) \n";}
}while (rep_menu!=8);
. . . . . .
struct article {string Nom;char Code;float Prix;
};
. . . . . .
Manipulation d’un tableau
Les Structures
62
++- 123M. BENJELLOUN : 2019-2020 UMONS
const int NMax = 5;
struct Etudiant{
string nom ;
int numero ;
int Matieres[NMax] ;
} ;
void saisie(Etudiant T[], int n, int NM) {
…
n?
NM?
…
}
const int NMax = 5;
struct Etudiant{
char *nom ;
int numero ;
int Matieres[NMax] ;
} ;
8.2. et 8.3. Écrire le même programme que 8.1. en remplaçant la structure par :
8.4 Donnez la structure représentant ce tableau :
Nom adresse Sexe res1 res2
… resN Code Myne
nom1 56 rue je ne sais pas, bte 10, …
M 10 15 … 8 A 13.3
nom2 33, rue qui n’existe pas, …
F 10 20 … 19 V 15.7
nom3 … M 13 14 … 15 C 13.9
nom20 … F 10 10 … 11 D 10.2
Écrire un programme permettant de manipuler un tableau de cette structure. Ce programme doit gérer en boucle le menu suivant :
1 - SAISIE et AFFICHAGE du tableau2 - Sauvegarde dans un fichier3 - Lecture fichier 4 - ARRET du programme
++- 124M. BENJELLOUN : 2019-2020 UMONS
☺☺☺
Les listes sont des structures de données dynamiques, linéaires. Elles sont composées de cellules chaînées les unes aux autres par pointeurs.
NULL
NULL
Une cellule étant une structure qui contient un élément à stocker et un pointeur sur la prochaine cellule de la liste.
struct Cellule{int Data;
struct Cellule *suiv; // pointeur sur le prochain maillon};
63
++- 125M. BENJELLOUN : 2019-2020 UMONS
Modéliser une liste chaînée consiste à allouer dynamiquement les cellules chaque fois que cela est nécessaire.
TêteElm1 Elm2 Elm3 Elm4
Liste simplement chaînée
@4000 Elem1
@ 0700
Elem2
@ 0900
Elem3
@ 2170
Elem4
NULL
@4000 @0700 @0900 @2170
Tête_List
Liste simplement chaînée
++- 126M. BENJELLOUN : 2019-2020 UMONS
Allouer et assigner une Cellule
Cette fonction réserve l'espace mémoire nécessaire pour une nouvelle Cellule dans la liste, assigne les données, et retourne un pointeur sur cette Cellule.
struct CEL{
string name;
struct CEL * suiv;
};
CEL cel, *Pcel;
cel . name = "Toto";
Pcel →name = "Jo";
Toto
NULL
debut
Nouvelle cellule dans une liste chaînée vide
CEL *debut;
debut = new CEL;
debut→name = "Toto";
debut→suiv = NULL;
Le début de la liste est indiqué par un pointeur indépendant (debut) et la fin par NULL
Liste simplement chaînée
64
++- 127M. BENJELLOUN : 2019-2020 UMONS
NULL
CEL *prec;
prec = new CEL;
prec→name= “Jo";
prec→suiv = debut;
debut = prec; prec
Jo Toto
debut
Ajouter une nouvelle cellule en tête de liste
Insérer une nouvelle cellule après la cellule prec
Claire Denis
NULL
prec
Jo Toto
NULL
prec
Alfred
p
debut
CEL *p;
p = new CEL;
p→name = "Alfred";
p→suiv = prec→suiv;
prec→suiv = p;
Liste simplement chaînée
++- 128M. BENJELLOUN : 2019-2020 UMONS
Recherche dans une liste
boolean EstDansL(string x, CEL a) {while (a != null) {if (a.name == x) return true;a = a.suiv;
}return false;
}
struct CEL{string name;struct CEL * suiv;
};
boolean EstDansL(string x, CEL a){for ( ; a != null; a = a.suiv)
if (a.name == x) return true;
return false;}
boolean EstDansL(string x, CEL a) {if (a == null)
return false;if (a.name == x)
return true;return EstDansL (x, a.suiv);}
Liste simplement chaînée
65
++- 129M. BENJELLOUN : 2019-2020 UMONS
Une pile est une liste qui respecte la règle “dernier arrivé, premier sorti”, (Last In, First Out). C’est une structure de données pour laquelle l’ajout et la suppression d’un élément ne sont autorisés qu’à une seule extrémité, appelée sommet de la pile.
PILE [stack, LIFO]
Une file d'attente est une structure de données pour laquelle l’ajout et la suppression d’un élément ne sont autorisés qu’aux seules extrémités, appelées la tête et la queue de la file. Les éléments sont ajoutés en queue de file et sont retirés en tête de file. Premier entré/ Premier sorti → liste FIFO (First In, First Out).