Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
1
++- 1M. BENJELLOUN : 2020-2021 IG Cha UMONS
Mohammed BENJELLOUN
Service d’Informatique
Faculté Polytechnique de Mons
2020-2021
++- 2M. BENJELLOUN : 2020-2021 IG Cha UMONS
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 de cours, où la présence est obligatoire comme auxTPs, 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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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 2019
De C++11 à C++20
Acquérir une parfaite maîtrise du C++ et de la programmation objet
Une référence :
Le langage C++
++- 6M. BENJELLOUN : 2020-2021 IG Cha 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
{char Rep;
Rep = ‘X’ ;cout << "Voulez vous continuer ? (O/N)" ;
if (Rep <> "O" ) cout << "Saisie …" ;
cout << "Fin …«…}
(suite finie d’opérations élémentaires)
4
++- 7M. BENJELLOUN : 2020-2021 IG Cha UMONS
Moi, ingénieur… que vais-je bien pouvoir faire ?
Pour commencer, j’aimerais programmer:
Y = X2, Z = X3 et
++- 8M. BENJELLOUN : 2020-2021 IG Cha UMONS
Fonction main() de type void ou int
Identificateurs
Types de données
Variables : déclarations et initialisations
Entrées /sorties : cin et cout
Directives préprocesseur
Pour commencer
5
++- 9M. BENJELLOUN : 2020-2021 IG Cha UMONS
void main()
{
}
Pour commencer
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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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).
Types de données en langage C++
Pour commencer
7
++- 13M. BENJELLOUN : 2020-2021 IG Cha UMONS
void main()
{
int X, Y;
float racine = 1.2;
X= 5;
Y= -X;
}
Variables : déclarations,
Syntaxe : Type identificateur1, id2,…. ;
char c1, c2, c3 ;int i, j, var_ent ;float f, variable ;double D, Mavariable ;
Exemples:
Initialisations/Affectations
int i=9; ou int i(9); int i;i=9;
char c1= 'A'; ou char c1('A’); ou char c1;
c1= 'A';
// déclaration de deux variables X et Y. Instruction se termine par ‘;’
// initialisation de la variable X à 5
// affectation de la valeur de -X à Y
// déclaration et initialisation de la variable ‘racine’ de type float
Pour commencer
++- 14M. BENJELLOUN : 2020-2021 IG Cha UMONS
• cout, le flux standard de sortie, habituellement associé à l'écran,
Syntaxe : cout << expression1 << expression2 … ;
• cin, le flux standard d’entrée, habituellement associé au clavier,
Syntaxe : cin >> var1 >> var2 >> var3 … ;
:
7
Pour commencer
Remarque : Lorsque plusieurs valeurs sont lues (cin) à la suite, le caractèreséparateur de ces valeurs est le retour à la ligne ou l’espace.
Attention ! Avec un cin on ne peut donc pas lire en une fois une ligne entièrecontenant des blancs (espaces).
(saisie clavier/affichage écran)Les entrées /sorties : cin et cout
8
++- 15M. BENJELLOUN : 2020-2021 IG Cha UMONS
(saisie clavier/affichage écran)
#include <iostream> using namespace std;
void main( ) {
int X, Y, Z;
cout << " Introduisez la valeur de X = ";cin >> X ;
Y = X * X;Z = - X ;
cout << " Actuellement X vaut:"<< X << " et X*X vaut: " << Y << endl;cout << " - X vaut : " << Z ;
}
// Directive préprocesseur/ Pour utiliser cout et cin
// Affichage du texte à l’écran
// Attend une saisie de X au clavier
// Déclaration des entiers X, Y et Z
//endl signifie un saut de ligne
Pour commencer
Les entrées /sorties : cin et cout
++- 16M. BENJELLOUN : 2020-2021 IG Cha UMONS
cout <<"Qu'il est agreable d'utiliser "
<<"cout en\t C++,\nlorsqu'on l'utilise " <<endl << "\t\tproprement";
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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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.
Pour commencer
3.141593.141592653.1
3.1.....3.14159265
10
++- 19M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include<iostream>using namespace std;#include <windows.h>
void Color(int couleurDuTexte) {HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(H, couleurDuTexte);
}
void main() {Color(10); //Couleur du texte : VERT fluo.
cout << "Salut a vous !!!" << endl;
Color(4); //Couleur du texte : ROUGE.cout << "Tous !!!" << endl;
system("pause"); // Attendre une touche au clavier}
Les couleurs :________________________________
| 0 : Noir | 1 : Bleu foncé || 2 : Vert foncé | 3 : Turquoise | | 4 : Rouge foncé | 5 : Violet | | 6 : Vert caca d'oie | 7 : Gris clair || 8 : Gris foncé | 9 : Bleu fluo | | 10 : Vert fluo | 11 : Turquoise || 12 : Rouge fluo | 13 : Violet || 14 : Jaune | 15 : Blanc |---------------------------------------------------
Résultat :
Les entrées /sorties : cin et coutFormatage de la présentation → écran
Pour commencer
Salut a vous !!!Tous !!!
++- 20M. BENJELLOUN : 2020-2021 IG Cha UMONS
Moi, ingénieur… que vais-je bien pouvoir faire ?
Pour commencer, j’aimerais programmer: Y = X2, Z = X3 et
#include <iostream> // pour cout et cin#include <cmath> // pour sqrt( )using namespace std;
void main() {int X, Y, Z ; // déclaration des variablesfloat racine;
cout << " ??valeur de X = "; // affichage du textecin >> X;
Y= X * X ; // X²Z= Y * X ; // X³racine = sqrt(X);
cout << "La racine de" << X << " est " << racine << endl;cout << " Y = " << Y << " et Z = " << Z ;
}
11
++- 21M. BENJELLOUN : 2020-2021 IG Cha UMONS
Les opérateurs arithmétiques : +, -, /, …
Les opérateurs de comparaison : >, =, <, …
Contractions d'opérateurs : +=, -=, …
Les opérateurs
++- 22M. BENJELLOUN : 2020-2021 IG Cha UMONS
Les opérateurs arithmétiques
Le C++ propose les opérateurs suivants :
+ addition- soustraction* multiplication/ division% modulo (reste de la division entière )
% ne peut être utilisé qu'avec des
entiers
7/2
7.0/2 7/2.0 7.0/2.0
3
3.5
…void main() {
int i = 6, j = 4, k;float f = 6.0, g = 4.0, h;
k = i / j; // k= 6/4 = 1h = f / g; // h = 6.0/4.0 = 1.5h = i / j; // h = 6/4 = 1.0
}
Modulo : C=A%B;
C = 4%2 = 0; 5%2 = 1; 8%3= 2;
C=A%2 Si C=0 alors A est pair sinon(=1) A est impair
12
++- 23M. BENJELLOUN : 2020-2021 IG Cha UMONS
Le C++ propose les opérateurs suivants :
+ addition- soustraction* multiplication/ division% modulo (reste de la division entière )
% ne peut être utilisé qu'avec des
entiers
…void main() {int d , t ;float V;
cout << " distance parcourue d (m) " ; cin >> d; // 7cout << " durée du parcours t (s) " ; cin >> t; // 4
cout << " La vitesse V = d/t " << d/t ; // ➔ 1
V = d / t;
cout << "\n La vitesse V = d/t " << V; // ➔ 1
}
…void main() {int d, t ;float V;
cout << " vitesse V m/s " ; cin >> V; // 1.8cout << " durée du parcours t (s) " ; cin >> t; // 4
cout << " distance parcourue d (m) " << V*t; // 7.2
d = V*t;
cout << "\n distance parcourue d (m) " << d; // 7
}
Les opérateurs arithmétiques
++- 24M. BENJELLOUN : 2020-2021 IG Cha UMONS
< plus petit
<= plus petit ou égal
> plus grand
>= plus grand ou égal
== égal
!= différent
Les opérateurs logiques&& et
|| ou (non exclusif)
! non
!
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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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 : 2020-2021 IG Cha 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.
17
++- 33M. BENJELLOUN : 2020-2021 IG Cha UMONS
for( ; ; ){
............;
............;}
for( initialisation ; (Condition vraie); itération ){
/* liste d'instructions */}
int i, j;
for(i = 0, j = 2 ; (i < 20) &&(j==2); i++)
int i,j;
for (i = 0; i <3; i++) {cout<< "i = " << i << endl;
}
cout <<endl<<endl;
for(j = 5; j > 0; j- -)cout<< "j = " << j << endl;
boucle infinie
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 : 2020-2021 IG Cha 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):
Les itérations – for
Test : X = 1--------------
X = 0 X = 1 X = 0 X = 1 X = 0 X = 1
18
++- 35M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include <iostream>using namespace std;
int main() {
for (char lettre = 'A'; lettre <= 'F'; lettre++)cout << lettre << char(lettre + 32) << char( lettre +('a' - 'A')) << " ";
cout << endl;
for (float pourcent = 0.0; pourcent < 0.5; pourcent += 0.1)cout << pourcent << endl;
for (int i = 2; i <= 3; i++) {cout << " Table de " << i << " :" << endl;for (int j = 0; j <= 3; j++) {cout << " " << i << " * " << j << " = " << i*j << endl;
}}
system("pause");return 1;
}
Les itérations – for
Aaa Bbb Ccc Ddd Eee Fff0 0.10.20.30.4Table de 2 :
2 * 0 = 02 * 1 = 22 * 2 = 42 * 3 = 6
Table de 3 :3 * 0 = 03 * 1 = 33 * 2 = 63 * 3 = 9
Appuyez sur une touche pour continuer...
Résultat :
++- 36M. BENJELLOUN : 2020-2021 IG Cha UMONS
Boucle pré-testée
Il s'agit de l'instruction while :tant que (expression vraie)faire{ BLOC D'INSTRUCTIONS }
Organigramme:
while (Condition vraie){............;
............;
............;}
Syntaxe:
tant que, pas jusqu’à ce que !
oui non
Suite du programme
Conditionvraie
Bloc 1 d’instructions
Le test se fait d'abord, le bloc d'instructions n'est pas forcément exécuté.
int i=1, Som=0; while (i<5) { Som = Som + i;cout<<“Som = " << Som << endl;i++;
}
while = Tant que ... Faire ...
19
++- 37M. BENJELLOUN : 2020-2021 IG Cha UMONS
i=1;while(i<5) {cout<<"Interieur " <<i << endl;i++;
}cout<<"Exterieur " <<i << endl;
Exemples
Interieur 1……
int j = 5;
cout<<"start \n ";while(j == 0)
cout<<"j = "<<j--<<endl;cout<<"end\n";
startend
i=1;
while(i<5);{cout<<"Interieur " <<i << endl;i++;
}
itération
……
while = Tant que ... Faire ...
++- 38M. BENJELLOUN : 2020-2021 IG Cha UMONS
do while = REPETER … tant que
do{ /* bloc d'instructions */
............;
............;} while (Condition vraie);Condition
vraie
oui non
Bloc d’instructions
programme
int j = 5;do
cout<<"j = "<<j-- << endl;while(j > 0);cout <<"stop\n";
Suite du programme
(garantit l’exécution au moins une fois)
int j = 5;do {
cout<<"j = "<<j <<endl;j--;
} while(j > 0);cout <<"stop\n";
j = 5j = 4j = 3j = 2j = 1stop
20
++- 39M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include …
void main() {
bool sortir = false;
char rep;
cout<<"Avant la boucle"<<endl;
while(!sortir) {
cout<<"Dans la boucle"<<endl;
cout<<"Voulez vous quitter (O/N)?"<<endl;
cin>>rep;
if(rep==‘O’ || rep == ‘o’)
sortir=true;
}
cout<<"Apres la boucle"<<endl;
}
#include …
void main() {
bool sortir = false;
char rep;
cout<<"Avant la boucle"<<endl;
do {
cout<<"Dans la boucle"<<endl;
cout<<"Voulez vous quitter (O/N)?"<<endl;
cin>>rep;
if(rep=='O’ || rep == ‘o’)
sortir=true;
} while(!sortir) ;
cout<<"Apres la boucle"<<endl;
}
Les itérations
++- 40M. BENJELLOUN : 2020-2021 IG Cha UMONS
Les itérations
for( init ; (Condition vraie); itération){
/* bloc d'instructions */
}
for (i = 0; i <4; i++) {
cout << "i = " << i << endl;
}
while (Condition vraie){
............; /* bloc d'instructions */
............;
............;}
int i = 0; while(i < 4) {
cout<< "i = " << i << endl;i++;
}
do{............; /* bloc d'instructions */
............;}while (Condition vraie);
int i = 0;do {
cout<< "i = " << i << endl;i++;
} while(i < 4);
21
++- 41M. BENJELLOUN : 2020-2021 IG Cha UMONS
Début programme
Fin
instructions
cout << " Modifier n = " ;cin >> n ;
if ( n == x) {…
}else {
…}
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 : 2020-2021 IG Cha 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
22
++- 43M. BENJELLOUN : 2020-2021 IG Cha 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
++- 44M. BENJELLOUN : 2020-2021 IG Cha UMONS
….
void main( ) {
const float PI= 3.14159;float rayon = 3.5;float diametre, circonference, surface;int choix;
cout << "1. Calculer la circonference\n";cout << "2. Calculer la surface\n";cout << "3. Calculer le diametre\n";cout << "Votre choix?";cin >> choix;
switch (choix) {case 1 : circonference = 2*PI*rayon; break;case 2 : surface = PI*rayon*rayon break;case 3 : diametre = 2*rayon; break;default : cout << "Mauvais choix…\n";
}}
char choix;
switch(choix)
{
case '1': …
!switch(i) {
case 2 * j:
....
float f;
switch(f) {
case 2:
....
instruction commode pour les "menus"
switch = AU CAS OU ... FAIRE ...
23
++- 45M. BENJELLOUN : 2020-2021 IG Cha UMONS
Tableaux
Déclaration, Initialisation & Interdiction
Accès aux éléments d’un tableau
Chaînes de caractères ou string
Lecture d’un string contenant des espaces
Algorithmes de tri
Recherche d'un élément dans un tableau
Accès aux éléments d’une matrice
++- 46M. BENJELLOUN : 2020-2021 IG Cha UMONS
Un tableau est une collection de variables de même type, appelées éléments
Type Nom_Tableau[dim];
int tab[4]; déclare un tableau de 4 valeurs entières tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5;int A[SIZE] // A est un tableau de 5 entiers float B[5]
int A[SIZE] = { 10, 20, 30, 40, 50 };int premier[] = { 1, 2, 3, 5, 7, 11, 13 };char Tab_Char[4] = { 'A', 'C', 'F', 'G' };int Tab[50] = { 0 };
int i = 10;int a[i];int primes[];
Déclaration
Initialisation
Interdiction
Constante
TableauxDéclaration, Initialisation & Interdiction
24
++- 47M. BENJELLOUN : 2020-2021 IG Cha UMONS
Les éléments sont numérotés de 0 à dim-1
Il n’y a pas de vérification des bornes
void main(){
int a[6];int i = 7;
a[0] = 9; a[5] = -10;a[i/2] = 2;
a[6] = 0;a[-1] = 5;
}
0
a
1
2
3
4
5
9
?
?
2
?
-10
Type Nom_Tableau[dim];
Accès aux éléments d’un tableau
++- 48M. BENJELLOUN : 2020-2021 IG Cha UMONS
Les éléments sont numérotés de 0 à dim-1
Il n’y a pas de vérification des bornes
void main( ) {
const int dim=4;
int i;
int A[dim] = { 1, 2, 3, 4 };
for (i=0;i<dim;i++) {
cout<<"A["<<i<<"]="<<A[i];
}
}
Type Nom_Tableau[dim];
Accès aux éléments d’un tableau
A[0] A[1] A[2] A[3]
A[0]=1 A[1]=2 A[2]=3 A[3]=4Résultat :
25
++- 49M. BENJELLOUN : 2020-2021 IG Cha UMONS
Accès aux éléments d’un tableau
#include …
int main(){
int i, j, tab[5];
for (i = 0; i <5; i++) { // Saisie
tab[i] = 2*i ;
}
for (i = 0; i <5; i++) { // Affichage
cout<< tab[i] << endl;
}
return 1;
}
Résultat :
0
2
4
6
8
++- 50M. BENJELLOUN : 2020-2021 IG Cha UMONS
Chaînes de caractères ou string
char Nom[dim];Initialisation
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.
char S[] = {'H','e','l','l','o','\0'}; 'H' 'e' 'l' 'l' 'o' '\0'
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = "Hello";
char S[5] = "Hello"; 'H' 'e' 'l' 'l' 'o'
char S[] = "Le main"; 'L' 'e' ' ' 'm' 'a' 'i' 'n' '\0'
• Un tableau de char à une dimension : char Nom[dim];
• Un type spécial string : string Nom; // Il faut inclure <string>
26
++- 51M. BENJELLOUN : 2020-2021 IG Cha UMONS
string Nom; // Il faut #include <string>
string Nom est équivalente à string Nom = ""; . Donc par défaut la chaîne est vide.
Il existe de nombreuses façons d’initialiser Ident, par exemple :
string s1 = "Bonjour a vous";
string s2 = s1; // s2 contient " Bonjour a vous "string s3(4, 'x'); // équivaut à string s3 = "xxxx"string s4(s1, 4, 8); // s4 contient "our a vo“ S1 de 4 + 8
B o n j o u r a v o u s0 1 2 3 4 5 6 7 8 9 10 11 12 13
#include <string>…string ST = "Salut";char H[6] = "Hello";
for (int i=0; i<5; i++) cout << ST[i] << " "; // affichera : S a l u t
for (int i=0; i<5; i++) cout << H[i] << " "; // affichera : H e l l o
Chaînes de caractères ou string
++- 52M. BENJELLOUN : 2020-2021 IG Cha UMONS
Pourquoi utiliser string Nom; plutôt que char Nom[dim]; ?
char S1[6] = "Salut", S2[6] = "Hello", S3[12];
S1= S2; S1= "Hooo"; S3=S1+S2; if(S1= =S2) … Interdit
string S1 = "Salut", S2 = "Hello", S3;
S1= S2; S1= "Hooo"; S3=S1+S2; if(S1= =S2) … Autorisé
S1= "Hello"
S1= "Hooo"
S3= "HoooHello"
false
Chaînes de caractères ou string
27
++- 53M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include <iostream>#include <string> // traitement de string
using namespace std; // espace de nommage std pour importer les
// symboles de la bibliothèque standard C++
void main( ) { string nom1, nom2, nom3 ; int len, size; cout << "Donnez Nom1 : " ; cin >> nom1;cout << "Donnez Nom2 : " ; cin >> nom2;
len = nom1.length(); // nombre de caractères dans nom1
size = nom2.size(); // nombre de caractères dans nom2
cout << "Nom1 : "<<nom1 << " Dim Nom1 = " << len << endl;
cout << "Nom2 : "<<nom2 << " Dim Nom2 = " << size << endl;nom3 = nom2+ " " +nom1;cout << "Nom3 = "<< nom3 << endl;
if(nom1>nom2) cout << "nom1 > nom2" << endl;else if (nom1==nom2) cout << "nom1 = nom2" << endl;
else cout << "nom1 < nom2" << endl;nom1=nom2;cout << "nom1 = " << nom1 << " nom2 : " << nom2 << endl;
}
Donnez Nom1 : salut
Donnez Nom2 : hello
Nom1 : salut Dim Nom1 = 5
Nom2 : hello Dim Nom2 = 5
Nom3 = hello salut
nom1 > nom2
nom1 = hello nom2 : hello
Donnez Nom1 : csou
Donnez Nom2 : pi
Nom1:csou Dim Nom1 = 4
Nom2:pi Dim Nom2 = 2
Nom3 = pi csou
nom1 < nom2
nom1 = pi nom2 : pi
Chaînes de caractères ou string
++- 54M. BENJELLOUN : 2020-2021 IG Cha UMONS
Lecture d’un string contenant des espaces
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
28
++- 55M. BENJELLOUN : 2020-2021 IG Cha 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
++- 56M. BENJELLOUN : 2020-2021 IG Cha 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)
29
++- 57M. BENJELLOUN : 2020-2021 IG Cha 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) {
perm =0;for (i=0;i<N-1;i++) {
if(x[i] > x[i+1]) {tmp = x[i];x[i] = x[i+1];x[i+1] = tmp;perm = 1;
}}
}}
Algorithmes de tri
// Boucles imbriquées
++- 58M. BENJELLOUN : 2020-2021 IG Cha UMONS
void tri_par_selection (int X[], int N) {int i, j, min, tmp;for (i = 0 ; i < N - 1 ; i++) {
min = i;for(j = i+1 ; j < N ; j++)
if(X[j] < X[min])min = j;
if(min != i) {tmp = X[i];X[i] = X[min];X[min] = tmp;
}}}
Le tri par sélection
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
30
++- 59M. BENJELLOUN : 2020-2021 IG Cha 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]
++- 60M. BENJELLOUN : 2020-2021 IG Cha 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.
◼ mid = (inf+sup) / 2; (0+3)/2 =1◼ inf=1 et sup=3◼…
31
++- 61M. BENJELLOUN : 2020-2021 IG Cha UMONS
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.
++- 62M. BENJELLOUN : 2020-2021 IG Cha 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
#include …
void main() {
int i, j, tab[5][4];
for (i = 0; i <5; i++) { // Saisie
for (j = 0; j < 4; j++) tab[i][j] = i;
}
for (i = 0; i <5; i++) { // Affichage
for (j = 0; j < 4; j++) cout<< tab[i][j] << ' ' ;
cout << endl;
}
}
Matrices
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
Résultat :
32
++- 63M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include <iostream>using namespace std;
void main() {int i,j;int a[3][3], b[3][3], c[3][3];
cout<<" Entrer matrice1 "<<"\n";for(i=0;i<3;i++)
for(j=0;j<3;j++)cin>>a[i][j];
cout<<" Entrer matrice2 "<<"\n";for(i=0;i<3;i++)
for(j=0;j<3;j++)cin>>b[i][j];
cout<<" Solution : ";
for(i=0;i<3;i++) {cout<<"\n";for(j=0;j<3;j++) {
c[i][j]=a[i][j]-b[i][j];cout<<c[i][j] << "\t";
}}}
Que fait ce programme ?Matrices
// Boucles imbriquées
++- 64M. BENJELLOUN : 2020-2021 IG Cha UMONS
Fonctions en C++
· 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
33
++- 65M. BENJELLOUN : 2020-2021 IG Cha 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
++- 66M. BENJELLOUN : 2020-2021 IG Cha 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éclarationsDéclarations
TraitementsDonnéesStructures de contrôleCommentaires
Structure d'un programme C++ : exemple
34
++- 67M. BENJELLOUN : 2020-2021 IG Cha 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;}
++- 68M. BENJELLOUN : 2020-2021 IG Cha 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
35
++- 69M. BENJELLOUN : 2020-2021 IG Cha 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 ?
++- 70M. BENJELLOUN : 2020-2021 IG Cha 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
36
++- 71M. BENJELLOUN : 2020-2021 IG Cha 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;
}
++- 72M. BENJELLOUN : 2020-2021 IG Cha 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.
37
++- 73M. BENJELLOUN : 2020-2021 IG Cha 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
++- 74M. BENJELLOUN : 2020-2021 IG Cha 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
38
++- 75M. BENJELLOUN : 2020-2021 IG Cha 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
++- 76M. BENJELLOUN : 2020-2021 IG Cha 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
39
++- 77M. BENJELLOUN : 2020-2021 IG Cha 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
++- 78M. BENJELLOUN : 2020-2021 IG Cha 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
40
++- 79M. BENJELLOUN : 2020-2021 IG Cha 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
++- 80M. BENJELLOUN : 2020-2021 IG Cha 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
41
++- 81M. BENJELLOUN : 2020-2021 IG Cha 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
++- 82M. BENJELLOUN : 2020-2021 IG Cha 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
42
++- 83M. BENJELLOUN : 2020-2021 IG Cha 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 ??!!
++- 84M. BENJELLOUN : 2020-2021 IG Cha 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 ??!!
43
++- 85M. BENJELLOUN : 2020-2021 IG Cha 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 ??!!
++- 86M. BENJELLOUN : 2020-2021 IG Cha 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 ??!!
44
++- 87M. BENJELLOUN : 2020-2021 IG Cha 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 ;}
++- 88M. BENJELLOUN : 2020-2021 IG Cha 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 ??}
45
++- 89M. BENJELLOUN : 2020-2021 IG Cha 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";
cout << "Votre choix?";cin >> choix;
switch (choix) {case 1 : rayon = 0;
circonference = 2*PI*rayon;cout << circonference << endl; break;
case 2 : surface = PI*rayon*rayon;cout << surface << endl; break;
}}
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.
++- 90M. BENJELLOUN : 2020-2021 IG Cha UMONS
Règles de visibilité des variables
#include …
int globale=0;
void fonc(int v) {double d, f; i++;globale --;
}
void main(void) {int i = 5, j; float f = 2.8, g;d = 3.7;globale =10;cout << " valeur de j= " << j ; cout << "\nglobale = " << globale ;fonc (i);cout << "\nglobale = " << globale ;
}
(0)
(1)
(2)
(3)
(4)
(5)
#include …
int g;
void affichage(int un, int deux) {cout << un << " " << deux << " " << g << endl;
}
void fonct(int un, int deux){
affichage(un, deux);
un += 2; deux += 2; g += 2;
affichage(un, deux);
}
void main(void) {
int i = 5, j;
affichage(i, j);
j=10;
fonct(i, j);
affichage(i, j);
}
5 -858993460 0
5 10 0
7 12 2
5 10 2
46
++- 91M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include <iostream>using namespace std ;
int k=0;
void Fct1(){k++;cout << "\nFct1: k = "<< k;
}
void Fct2() { // (1)k++;cout << "\nFct2: k = "<< k;
}
void main(){cout << "main: k = " << k; Fct1();Fct2();Fct1();Fct2();cout <<"\nmain: k = " << k;
}
void Fct2() { // (2)int I=30; k++;cout << "\nFct2: k = "<< k; I++;cout<<"\n Fct2: I = "<< I;
}
Qu’affiche ce programme selon les instructions de la fonction Fct2 () en // (1), (2) et (3) ?
void Fct2() { // (3)static int I=30; k++;cout << "\nFct2: k = "<< k; I++;cout<<"\n Fct2: I = "<< I;
}
Règles de visibilité des variables
++- 92M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include …const int Nmax=20;
void main() {int i,N=3,tab[Nmax];
saisie(tab,N);
for(i=0;i<N;i++)cout <<tab[i];
}
void saisie(int tab[], int N) {int i;for(i=0;i<N;i++)
cin>>tab[i];N=15;
}
mon_programme.cpp Mémoire utilisée par mon_programme.cpp
Nmax=20 i N=3
Mémoire pour saisie()
i N=3N=15
Tab[Nmax] 5 -1 9
i=0i=1i=2
i=0i=1i=2
i=3
…
47
++- 93M. BENJELLOUN : 2020-2021 IG Cha UMONS
Fonctions et récursivité
Tours de HanoïSuite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entière
Une fonction est dite récursive lorsqu’elle s’appelle elle-même.
int factorielle (int n ) {
if ( n < 0)
return (–1); //code d'erreur
else if ( n == 0 )
return 1; // 0! = 1
else
return n* factorielle( n-1 ); // n! = n*(n-1)!
}
a x an-1 si n > 0
1 si n = 0
an =
int pgcd(int a, int b) {int r;
r = a % b;
if (r == 0)return b;
elsereturn pgcd(b, r);
}
++- 94M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include <iostream> using namespace std;
void affiche(int a, int b) { cout << "Deux entiers:" << a << "et" << b << '\n';
}void affiche(float a, float b) {
cout << "Deux reels:" << a << "et" << b << endl; }void affiche(int c) { cout << "Un entier:" << c << '\n';
}void main() {
affiche (5.2 , 6.3);affiche (1 , 2);affiche (100);
}
Surcharge des fonctions
Le C++ permet d’utiliser des fonctions qui portent le même nom mais pas le même type et/ou le nombre de paramètres.
48
++- 95M. BENJELLOUN : 2020-2021 IG Cha UMONS
Paramètres par défaut
#include <iostream> using namespace std;
void affiche(int un = 1, int deux = 2, int trois = 3) {
cout << un << ' ' << deux << ' ' << trois << '\n';
}
void main(void) {
affiche(1, 2, 3);
affiche(5, 6, 7);
affiche(100, 200);
affiche(1000);
affiche();
}
1 2 35 6 7100 200 31000 2 31 2 3
++- 96M. BENJELLOUN : 2020-2021 IG Cha UMONS
Passer des tableaux aux fonctions
* Les tableaux peuvent être passés comme paramètres d'une fonction.
* Ils ne peuvent pas être retournés comme résultat d'une fonction.
* La longueur du tableau ne doit pas être définie à la déclaration de la fonction.
* Un tableau peut être modifié dans une fonction,.il est passé par référence (adresse) et non par valeur.
!
#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(int x[], int n);
void main( ) {int i;int p[6] = { 1, 2, 3, 5, 7, 11};Modif(p, 6);for (i=0; i<6; i++)
cout << p[i]<< endl;}
void Modif(int a[], int n) {int i; for(i = 0; i <n ; i++)
a[i] = 5;}
5
5
5
5
5
5
49
++- 97M. BENJELLOUN : 2020-2021 IG Cha UMONS
.. .. ..
const int Nmax=20;
void saisie (int N, int T [ ]) {cout<<"Entrez les données du tableau "<<endl;for(int i=0 ; i <N ; i++) {
cout<<"entrez la valeur "<<i+1<<endl;cin>> T[i];
}
}
void affichage (int N, int T [ ]) {cout<< " Les valeurs sont : " <<endl;for(int i=0 ; i < N ; i++ )
cout<<" T["<<i+1<< " ] = "<< T[i]<<endl;
}
void main () {
int N= 5, T[Nmax];
saisie (N, T);affichage (N, T);
}
// Remplissage du tableau T[ ]
// Affichage des données du tableau T[ ]
// Programme principal
Passer des tableaux aux fonctions
++- 98M. BENJELLOUN : 2020-2021 IG Cha UMONS
Écrire un programme modulaire qui permet de saisir et afficher les éléments de deux tableaux
(Tab1[10] et Tab2[10]) contenant des noms. Le nombre d’éléments (N1 et N2) saisis peut être
différents pour chacun des deux tableaux mais ne peut dépasser 10 éléments.
Combien de fonctions Saisie et Affichage contiendra votre programme? Justifiez.
Tableaux et fonctions
50
++- 99M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include …
const int Nmax = 7;
int LaSomme( ) {int A[Nmax], N, S = 0;for (int i=0;i< N ;i++) {
cout <<"Entrez A["<<i<<"]=" ;cin >>A[i];S= S+ A[i];}
return S;}
void main() {int A[Nmax], S=0, N=3;
S = LaSomme( );cout << " Affichage :" << endl;Affichage(A, N);cout << "\n La somme est = "<< S ;
}
Qu’affiche ce programme à l’écran ?void Affichage( int A[], int N) {for (int i=0;i < N ;i++) {
cout << " A["<<i<<"]= " <<A[i] <<endl;
}}
Tableaux et fonctions
++- 100M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include …
void Saisie_T( int tab[] ) {
int N, i;
N= 3;
for (i = 0; i <N; i++) tab[i] = i;
}
void Affiche_T(int tab[], int N ) {
int i;
for (i = 0; i <N; i++) cout << tab[i];
}
void main() {
int T[20], n;
Saisie_T( T );
Affiche_T(T, n );
}
Qu’affiche ce programme à l’écran ?
Tableaux et fonctions
51
++- 101M. BENJELLOUN : 2020-2021 IG Cha UMONS
void Saisie_Mat( int tab[][4], int m, int n) {
for (int i = 0; i <m; i++)
for (int j = 0; j < n; j++) tab[i][j] = i;
}
Exemple
void Affiche_Mat( int tab[][4], int m, int n) {
for (int i = 0; i <m; i++) {
for (int j = 0; j < n; j++) cout << tab[i][j] << " ";
cout << endl;
}
}
#include <iostream>using namespace std;
void main() {
int T[5][5];
Saisie_Mat( T , 4, 4 );
Affiche_Mat( T , 4, 4 );
}
Matrice et fonctions
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Résultat :
++- 102M. BENJELLOUN : 2020-2021 IG Cha UMONS
int *p; new int
p = new int ;
T= new int[N];
0 1 2 3 4 5 6
Tableaux statiques réserver plus de places en mémoire que nécessaire.
Allocation dynamique de la mémoire
52
++- 103M. BENJELLOUN : 2020-2021 IG Cha UMONS
Tableaux réserver plus de places en mémoire que nécessaire.
Création d’un tableau de taille quelconque →l'allocation dynamique
#include <iostream> …
void affiche(int T[], int d, char C[]){
for(int i=0; i<d; i++)
cout<< "\n T["<<i<<"] = " << T[i] << " C["<<i<<"] = " <<C[i];
cout << endl;
}
void main(){
int N, *T, i;
cout << " N = " ; cin >> N;
char *C = new char[N];
T= new int[N]; affiche(T, N, C);
for(i=0; i<N; i++){
T[i]=i;
C[i]='A'+i;
}
affiche(T, N, C);
delete[] T; affiche(T, N, C);
delete[] C; affiche(T, N, C);
}
Allocation dynamique de la mémoire
T[0] = -842150451 C[0] = ◙
T[1] = -842150451 C[1] = ◙
T[2] = -842150451 C[2] = ◙
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = ¦
T[1] = -572662307 C[1] = ¦
T[2] = -572662307 C[2] = ¦
++- 104M. BENJELLOUN : 2020-2021 IG Cha UMONS
Tableau de taille quelconque
#include <…
void saisie_vect(int Tab[], int n) {
for(int i=0;i<n;i++)
cin >> Tab[i];
}
void Affiche(int Tab[], int dim) {
for(int i=0;i<dim;i++)
cout << "Tab[" << i <<"]="
<< i <<Tab[i];
}
void main() {int *tab, n;cout << " N= ";cin >> n;
tab = new int [n];
saisie_vect(tab, n);Affiche(tab, n);
delete [] tab;
}
#include <…
void main() {
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
53
++- 105M. BENJELLOUN : 2020-2021 IG Cha 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");
++- 106M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include <fstream> …
void main() {
ofstream Ecri;
char Tab1[6]="Hello";
int Tab2[5]={1,2,3,4,5}, N=5;
Ecri.open("Mon_fichier.txt");
Ecri << "Donnees" << endl;
Ecri << N << endl;
for(int i=0; i<N; i++) {
Ecri << Tab1[i] << " "
<< Tab2[i]<<endl;
}
Ecri.close();
}
#include <fstream> …
void main() {ifstream Lec;
char Tab1[6], Titre[100];int Tab2[5], N;
Lec.open("Mon_fichier.txt");
Lec >> Titre; cout << Titre << endl;
Lec >> N; cout << N << endl;
for(int i=0; i<N; i++) {Lec >> Tab1[i] >> Tab2[i];cout << Tab1[i] << " ; "
<< Tab2[i]<< endl;}
Lec.close();
}Mon_fichier.txt
Donnees
5
H 1
e 2
l 3
l 4
o 5
Donnees
5
H ; 1
e ; 2
l ; 3
l ; 4
o ; 5
Gestion des fichiers en C++
54
++- 107M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include <fstream> …
void main() {
ifstream Lec;
char Tab1[6], Titre[100];
int Tab2[5], i=0;
Lec.open("Mon_fichier.txt");
Lec.getline(Titre,100); cout << Titre << endl;
while(!Lec.eof()) {
Lec >> Tab1[i] >> Tab2[i];
cout << Tab1[i] << " ; "
<< Tab2[i]<< endl;
i++;}
Lec.close();
}
Mes Donnees
H ; 1
e ; 2
l ; 3
l ; 4
o ; 5
o ; 5
#include <fstream> …
void main() {
ofstream Ecri;
char Tab1[6]="Hello";
int Tab2[5]={1,2,3,4,5}, N=5;
Ecri.open("Mon_fichier.txt");
Ecri << "Mes Donnees" << endl;
for(int i=0; i<5; i++) {
Ecri << Tab1[i] << " "
<< Tab2[i]<<endl;
}
Ecri.close();
}
Mes Donnees
H 1
e 2
l 3
l 4
o 5
Test!
Gestion des fichiers en C++
++- 108M. BENJELLOUN : 2020-2021 IG Cha UMONS
Ecri.open("Mon_fichier.txt");
if(Ecri) { // if (Ecri!= NULL)// on vérifie si l'ouverture se passe bien
Ecri << "Mes Donnees" << endl;for(int i=0; i<5; i++){
Ecri << Tab1[i] << " " << Tab2[i]<<endl;
}Ecri.close();
}else { // si échec à l'ouverture
cout<<"Erreur"<<endl;}
if (Ecri.bad()) return 0;Ecri.fail()
Gestion des fichiers en C++
Test!
55
++- 109M. BENJELLOUN : 2020-2021 IG Cha UMONS
Les Structures
Structure = ensemble de variables définissant un nouveau type sous un seul nom.
Id1Nom1Prenom1Date_Nais1…
Id2Nom2Prenom2Date_Nais2…
Id3Nom3Prenom3Date_Nais3
Id4Nom4Prenom4Date_Nais4
…
struct Etudiant { // tous les étudiants
int Id;string Nom;string Prenom;…
};
struct Article {
string nom;
int prix;
…
};
Etudiants
Articles
struct Etudiant Tab[Nmax];
++- 110M. BENJELLOUN : 2020-2021 IG Cha UMONS
Structure dans Structure
struct Date{
int jour;int mois;int an;
};
struct Date{
int jour;int mois;int an;
};
struct Etudiant {char nom[30];string prenom;char *adresse;int numero;float Cotes[3];struct Date D_Nais;
};
Etudiant J_D = {"Dupont", "Jpp","rue de Houdain, 9, 7000 Mons",102,10.5, 11, 14.5,{ 15, 10, 2000 }
};
Les membres sont accédés par le nom de l’instance, suivi de . , suivi du nom du membre
cout <<"nom = "<< J_D.nom;
cout <<"\n Cote 0 = "<< J_D.Cotes[0]<< endl;
cout << " jour de naissance "<<J_D. D_Nais.jour;
Les Structures
56
++- 111M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include …
struct Article{
string nom;
int prix;
};
int main( ) {
Article T[5];
for (int i=0; i<5; i++)
{
cout << "Entrez le nom : ";
cin >> T[i].nom;
cout << "\nEntrez le prix ";
cin >> T[i].prix;
}
return 1;
}
nom1150
nom213
nom3439
nom499
Nom5
31
T[0] T[1] T[2] T[3] T[4]
Les Structures
++- 112M. BENJELLOUN : 2020-2021 IG Cha UMONS
#include …
struct Article{
string nom;
int prix;
};
void Affiche(Article AR){
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
57
++- 113M. BENJELLOUN : 2020-2021 IG Cha 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 :
++- 114M. BENJELLOUN : 2020-2021 IG Cha 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
58
++- 115M. BENJELLOUN : 2020-2021 IG Cha 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
++- 116M. BENJELLOUN : 2020-2021 IG Cha 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
59
++- 117M. BENJELLOUN : 2020-2021 IG Cha 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
++- 118M. BENJELLOUN : 2020-2021 IG Cha 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
60
++- 119M. BENJELLOUN : 2020-2021 IG Cha 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
++- 120M. BENJELLOUN : 2020-2021 IG Cha 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