Uploaded by Sylvain Labranche

1- intro CPP

advertisement
Programmation orientée objet en C++
Août 2021
Programmation orientée
objet en C++
Ch. 1
Introduction à C++
par Alain Pilon
•1
Contenu du cours
 Généralités
 Interprétation vs compilation
 Édition de liens
 Anatomie d’un programme C++
 Identificateurs, variables et types de données de base
 Entrées et sorties en C++, mise en forme de la sortie
 Portée d’une variable
 Expressions
 Opérateurs
 Opérateurs arithmétiques
 Manipulation des bits
 Incrémentation
 Affectation
 Relationnel
 Conditionnel
 Séquence et taille
 Conversions explicites et implicites
•2
par Alain Pilon
Page 1
Programmation orientée objet en C++
Août 2021
Généralités
 Le langage C++ est né après la
combinaison du C et du Simula pour
former dans un premier temps le langage
« C avec des classes ».
 En 1983 Bjarne Stroustrup, informaticien
pour AT&T, finalise les spécifications et lui
donne le nom de C++.
 Le C++ est simplement une extension du
langage C.
 Le langage Java s’est inspiré de C++
(avec quelques différences importantes).
•3
Compilation vs interprétation
Compilateur
Exécutable
Source
Interpréteur
•4
par Alain Pilon
Page 2
Programmation orientée objet en C++
Août 2021
Compilation C++ vs Java
Compilateur
C++
fichier.cpp
Exécutable
fichier.java
Source
Java Virtual
Machine
Compilateur
Java
fichier.class
•5
Édition de liens
Compilateur
Objet
Source
Édition
de liens
Compilateur
Objet
Source
Exécutable
Compilateur
Source
Objet
Librairies
•6
par Alain Pilon
Page 3
Programmation orientée objet en C++
Août 2021
Anatomie d’un programme C++
#include <iostream>
using namespace std;
int main() {
cout << "IFT1166\n";
return 0;
}
•7
Découpage du programme
Directives au préprocesseur
#include <iostream>
Espace de noms
using namespace std;
Programme principal
int main( )
ou
int main(int argc, char* argv[])
•8
par Alain Pilon
Page 4
Programmation orientée objet en C++
Août 2021
Directives au préprocesseur
Lignes qui commencent par #
Inclusion de fichiers, substitutions, macros
et compilation conditionnelle
Par exemple:
#include <iostream>
Informe le préprocesseur de charger le
fichier iostream (dans les répertoires
standards) et de le compiler en même
temps que le fichier courant.
Le fichier <iostream> est nécessaire pour
faire les entrées/sorties standards en C++.
•9
Espace de noms
Permet de rendre accessible au
programme ce qui est défini dans
l’espace de noms mentionné.
La directive:
using namespace std;
Informe le compilateur de rendre
accessible tout ce qui est défini
dans la bibliothèque std
(standard).
•10
par Alain Pilon
Page 5
Programmation orientée objet en C++
Août 2021
Programme principal
 Le point d’entrée d’un programme C++ est la
méthode main( )
 Une seule méthode main( ) doit exister dans un projet
et c’est elle qui sera appelée lors de l’exécution du
programme.
 Elle peut avoir aucun paramètre ou les deux
paramètres montrés précédemment: argc et argv.
 argc est un entier qui représente le nombre de paramètres
passés au programme.
 argv contient une liste de paramètres sous forme d’un
tableau de chaînes de caractères.
 La méthode main retourne un entier qui représente
l’état de l’exécution du programme. La valeur 0 est
retournée pour indiquer que le programme s’est
exécuté correctement. Une valeur différente est
retournée pour indiquer qu’une erreur s’est produite.
•11
C++ vs Java
 Beaucoup de ressemblance, mais…
 C++ est un langage procédural avec la
capacité de manipuler des objets alors que
Java est purement orienté objet.
 La gestion de la mémoire se fait
automatiquement en Java (par garbage
collector ou rammasse-miettes). En C++ cette
gestion est laissée au programmeur.
 C++ permet l’héritage multiple pas Java. Par
exemple, alors que C++ permettra à une classe
d’hériter de Employe et de Etudiant pour créer
une nouvelle classe, ce ne sera pas possible en
Java.
 C++ est un langage compilé alors que Java est
à mi-chemin entre compilé et interprété (plus
près de interprété).
•12
par Alain Pilon
Page 6
Programmation orientée objet en C++
Août 2021
Normalisation et compilateurs
C++ a été normalisé en 1998 pour
standardiser la base du langage et la
librairie C++ standard.
En 2003 une nouvelle normalisation
concernant la bibliothèque de modèles
standard (STL).
Il existe plusieurs compilateurs différents
pour le C++ (par compagnies différentes)
et ils ne respectent pas nécessairement
ces normes. Par exemple, gcc (plus
précisément g++) et dev C++.
•13
g++ en Linux ou console Windows
 g++ -v
 Permet d’afficher la version du compilateur utilisé.
 g++ test.cpp -o test
 Permet de compiler le fichier test.cpp et de produire
un exécutable dont le nom est test. Cela permet de
compiler et de faire l’édition des liens avec la même
commande. Nous ferons l’édition de liens séparé
lorsque nous aurons plusieurs classes à lier ensemble.
 g++ test.cpp -o test.o
 Permet de compiler (sans faire l’édition des liens).
 g++ -c test.o test2.o -o test
 Permet de faire l’édition des liens (uniquement).
 g++ -g test.cpp -o test
 Compiler, éditer les liens et inclusion des informations
de débogage du programme.
•14
par Alain Pilon
Page 7
Programmation orientée objet en C++
Août 2021
Dev C++
Dev C++ est un environnement
intégré de développement. Il
permet d’éditer et de compiler
des programmes C et C++.
•15
Identificateurs
 Servent à nommer les objets (variables, fonctions, méthodes,
classes, etc).
 Premier caractères: une lettre ou un souligné.
 Les autres caractères: lettres, chiffres et/ou soulignés.
 Certains compilateurs ne reconnaissent que les 31 premiers
caractères.
 Les doubles soulignés (deux soulignés consécutifs) sont
réservés (ne pas utiliser).
 Les majuscules et minuscules sont distinguées (A est différent
de a).
 Exemples:
 Correct: total, total99, nomEtudiant, _bidon, etc…
 Incorrect: 9ici, __reserve, $pas, étudiant, true, if, int, …
 Correct (mais soyez assuré que je ne les accepterai pas dans
vos travaux): a, b, a1, x1, x2, zz, a123, …
 Choisissez des noms significatifs. Commencez par une lettre
minuscule les variables et méthodes (fonctions) et une lettre
majuscule pour classes et types de données. Tout en
majuscules pour constantes.
•16
par Alain Pilon
Page 8
Programmation orientée objet en C++
Août 2021
Mots réservés
•17
Types de base
 Un nombre entier:
 short int (ou short)
 int
 long int (ou long)
 On peut ajouter le qualificatif unsigned devant (peu
utilisé)
 Représentation des nombres:
 Décimal: 10, 27
 Hexadécimal: 0x8, 0x10, 0xEF
 Octal: 07, 03, 010
 Suffixe: L ou l (pour entier long), U ou u (pour non signé)
 Exemples de déclaration de variables:
int total;
int compteur = 2;
int nbEtudiants = 0, indice = 9;
int x = y = 0;
•18
par Alain Pilon
Page 9
Programmation orientée objet en C++
Août 2021
Types de base (suite)
Un nombre réel:
float
double
long double
Représentation des nombres:
double: 12.43, -0.38, 4., .27, 4.25E4, 4.e+4, 542.7E-33,
48e13
float: 12.43f, 12.43F
long double: 12.43l, 12.42L
Exemples de déclaration de variables:
double salaire = 35000.00;
double moyenne;
double totalSalaire = 0.0;
•19
Types de base (suite)
Un booléen:
bool
Accepte les valeurs: true, false
(interne true vaut 1 et false vaut 0)
Exemples de déclaration de variables:
bool valide = false;
if (valide) …
Un caractère:
char
Accepte un caractère entre apostrophes
Exemples:
char caractere = 'a';
char finLigne = '\n', tab = '\t';
char aMajuscule = char(65), enHexa = '\x41';
•20
par Alain Pilon
Page 10
Programmation orientée objet en C++
Août 2021
Types de base (suite)
Une chaîne de caractères:
Une suite de caractères entre " (guillemets).
Les constantes sont stockés en zone de
mémoire permanente.
En réalité, elles sont conservées dans un
tableau de caractères de longueur de la
chaîne plus 1. En effet, un caractère null ('\0')
est ajouté à la chaîne pour indiquer la fin.
Exemples:
char nom[] = "Roger";
char *message;
message = "Bonjour";
•21
Types de base (suite)
Type énumération:
enum Jour { lundi=1, mardi, mercredi, jeudi,
vendredi, samedi, dimanche };
Permet d’associer un synonyme textuel pour
représenter des valeurs entières;
lundi vaut 1, mardi vaut 2 et ainsi de suite…
•22
par Alain Pilon
Page 11
Programmation orientée objet en C++
Août 2021
Affectation
int compteur;
// quelle est la valeur de compteur??
compteur = 10;
compteur = compteur + 5;
compteur += 5;
•23
Constantes
 const int nbEtudiants = 20;
 Permet d’identifier par un nom une
valeur qui ne pourra pas changer
pendant l’exécution du programme.
 La directive au préprocesseur #define
peut aussi être utilisée (pas
recommandée car le type n’est pas
validé)
ex: #define nb 20
 Exemples:
const double baremeIntra = 0.20;
const double baremeFinal = 0.40;
•24
par Alain Pilon
Page 12
Programmation orientée objet en C++
Août 2021
Entrées/Sorties
Elles se font à travers des flux de données
“stream” en utilisant le fichier <iostream>
avec l’instruction #include.
#include <iostream>
En Java: System.out.println(12);
En Java: System.out.printf("%d\n", 12);
En C++: std::cout << 12 << std::endl;
ou bien: cout << 12 << "\n";
Pour lire: std::cin >> variable;
•25
Exemple Entrées/Sorties
#include <iostream>
int main() {
int nombre;
std::cout << "Entrez un nombre:";
std::cin >> nombre;
std::cout << "Le carre de " << nombre << " est " \
<< nombre * nombre << std::endl;
return 0;
}
Démonstration…
•26
par Alain Pilon
Page 13
Programmation orientée objet en C++
Août 2021
Exemple 2
#include <iostream>
using namespace std;
int main() {
int nombre;
cout << "Entrez un nombre:";
cin >> nombre;
cout << "Le carre de " << nombre << " est " \
<< nombre * nombre << endl;
return 0;
}
•27
Exemple 3
#include <iostream>
using namespace std;
int main() {
int nombre1, nombre2;
cout << "Entrez deux nombres:";
cin >> nombre1 >> nombre2;
cout << "La somme de " << nombre1 << " et " \
<< nombre2 << " est " << nombre1 + nombre2 << endl;
return 0;
}
•28
par Alain Pilon
Page 14
Programmation orientée objet en C++
Août 2021
Mise en forme de la sortie
#include <iomanip>
#include <iostream>
using namespace std;
int main() {
int n = 123;
cout << setw(6) << n << endl;
// affiche la valeur de n cadré à droite dans 6 espaces
cout << setw(2) << n << endl;
// affiche n et ne tient pas compte de setw
cout << setfill('*') << setw(6) << n << endl;
// affiche n précédé de 3 * :***123:
cout << hex << n << endl; // affiche en hexa
cout << oct << n << endl; // affiche en octal
}
// Note: les commentaires comme ci-dessus seraient inutiles dans vos progr.
•29
Définition des formats d’affichage
Format
endl
Description
Affiche le caractère fin de ligne (\n)
Précise la longueur minimale du champ en sortie (où x est
un entier positif). Affecte seulement le nombre qui suit.
setw(x) ou Exemple: cout << setw(7) << 12 << endl;
width(x)
Qui permet d'afficher le nombre 12 en utilisant
exactement 7 position (5 espaces insérés devant le
nombre).
Pour justifer à gauche ou à droite droite.
left ou
Exemple: cout << left<< setw(7) << 12 << endl; Qui fait la
right
même chose que l'exemple précédent mais justifié à
gauche (5 espaces insérés après le nombre).
Pour remplir avec un car au lieu d'utiliser des espaces.
Exemple: cout << setfill('0') << setw(7) << 12 << endl;
Qui permet d'afficher le nombre 12 en utilisant
setfill(car)
exactement 7 position (5 '0' insérés devant le nombre) ==>
0000012.
NB: setfill affecte tous les affichages qui suivent.
•30
par Alain Pilon
Page 15
Programmation orientée objet en C++
Août 2021
Définition des formats d’affichage
Format
Description
Permet de définir combien de chiffres affichés
setprecision(x)
après le point. Utiliser avec fixed (voir plus loin).
Pour afficher les nombres réels en utilisant une
fixed
notation fixe (opposé de scientifique).
Pour afficher les nombres réels en utilisant la
scientific
notation scientifique.
Pour afficher les booléens en format texte (true
boolalpha
ou false).
uppercase, nouppercase, dec, oct, hex,
setbase(8),
quelques
setbase(10), setbase(16), setiosflags( ),
autres
etc...(faites un peu de recherche sur Internet et
vous trouverez facilement leurs significations)
Une petite référence:
http://www.arachnoid.com/cpptutor/student3.html
•31
Exemple 1:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n = 123;
cout << setw(6) << n << endl;
cout << setfill('*') << setw(6) << n << endl;
cout << hex << n << endl; // affiche en hexa
cout << oct << n << endl; // affiche en octal
return 0;
}
•32
par Alain Pilon
Page 16
Programmation orientée objet en C++
Août 2021
Exemple 2:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
const float tenth = 0.1;
const float one
= 1.0;
const float big
= 1234567890.0;
cout << "A." << tenth << "," << one << "," << big << endl;
cout << "B." << fixed << tenth << ", " << one << ", " << big << endl;
cout << "C." << scientific << tenth << "," << one << "," << big << endl;
cout << "D." << fixed << setprecision(3) << tenth << "," << one << "," << big << endl;
cout << "E." << setprecision(20) << tenth << endl;
cout << "F." << setw(8) << setfill('*') << 34 << 45 << endl;
cout << "G." << setw(8) << 34 << setw(8) << 45 << endl;
return 0;
}
•33
Spécificités du C++
 Commentaires (comme en Java)
 /* commentaire sur plusieurs lignes */
 // le reste de la ligne est ignorée
 Trop de commentaires c’est comme pas assez!
 Quoi commenter??
 Le programme: au début expliquer son utilité (ce qu’il
fait), les valeurs entrées, les valeurs produites (résultats
affichés), la date et l’auteur.
 Chaque variable utilisée.
 Chaque méthode: utilité, paramètres, valeurs
retournées.
 Dans le programme: les sections plus complexes.
 Par exemple:
// Boucle for !
Commentaire inutile
for (int i=0 ; i<10 ;i++) {
Il serait plus judicieux de
dire à quoi peut servir
cette boucle…
•34
par Alain Pilon
Page 17
Programmation orientée objet en C++
Août 2021
Portée d’une variable
{
int a;
// a est visible ici
{
int b;
// a et b peuvent être utilisées ici
{
int c;
// a, b et c sont visibles ici
}
// a et b peuvent être utilisées ici
}
// seulement a est visible ici
}
•35
Généralisation portée d’une variable
#include <iostream>
using namespace std;
int main() {
int i=500;
cout << "i du main vaut avant: " << i << endl;
for (int i=0; i< 2; i++) {
cout << "i boucle vaut: " << i << endl;
}
cout << "i du main vaut après: " << i << endl;
return 0;
}
En sortie:
i du main vaut avant: 500
i boucle vaut: 0
i boucle vaut: 1
i du main vaut après: 500
•36
par Alain Pilon
Page 18
Programmation orientée objet en C++
Août 2021
Expression
Une expression est la composition
d’opérateurs, de variables, de
constantes, de fonctions et de
parenthèses.
Une expression sera évaluée et
remplacée par sa valeur.
La valeur d’une expression a un type
et peut être utilisée dans une autre
expression.
Exemple:
x = y + 25 * z + 32 * t;
•37
Opérateurs arithmétiques
Notes:
12%10 vaut 2
9%10 vaut 9
C’est le reste de la division entière
•38
par Alain Pilon
Page 19
Programmation orientée objet en C++
Août 2021
Opérateurs de manipulation de bits
•39
Opérateurs d’incrémentation/décrémentation
 Notes:
 pré: opération est effectuée avant que la valeur soit utilisée.
 post: opération est effectuée après que la valeur soit utilisée.
 Exemples:
 toto = compteur++ ou ++compteur???
•40
par Alain Pilon
Page 20
Programmation orientée objet en C++
Août 2021
Opérateurs d’affectation
•41
Opérateurs relationnels
 Une expression est fausse si elle vaut 0
 Elle est vraie sinon (si != 0)
•42
par Alain Pilon
Page 21
Programmation orientée objet en C++
Août 2021
Exemples
op1
op2
op1 && op2
op1 || op2
!op1
0
0
0
0
1
0
1
0
1
1
1
0
0
1
0
1
1
1
1
0
•43
Opérateur conditionnel
(expression1) ? expression2 : expression3;
 « expression1 » est évaluée, si sa valeur est:
 Vraie: alors « expression2 » est évaluée et son résultat
est utilisé.
 Faux: alors « expression3 » est évaluée et son résultat
est utilisé.
 Exemple:
int n = -5;
n = (n < 0) ? –n : n;
 Est-ce que « expression1 » est vraie? -5<0
 Oui alors « expression2 » est évaluée et sa
valeur est utilisé: - -5 => évaluée à 5
n=5
 Attention ne pas mettre un bloc d’instructions
(utiliser un if à la place)…
•44
par Alain Pilon
Page 22
Programmation orientée objet en C++
Août 2021
Opérateur de taille
sizeof(expression)
Permet d’évaluer la taille occupée par
une variable, un type ou une
expression.
Cette taille dépend de l’architecture
interne de l’ordinateur.
int i, tab[10];
double x, y;
sizeof(i) est évaluée à 4
sizeof(x) est évaluée à 8
sizeof(tab) est évaluée à 40
sizeof(tab[0]) est évaluée à 4
•45
Opérateur de séquence
Il est représenté par la virgule et
permet d’évaluer les opérations
dans l’ordre (de gauche vers la
droite).
•46
par Alain Pilon
Page 23
Programmation orientée objet en C++
Août 2021
Priorité des opérateurs
•47
Conversions
Implicite
Lorsqu’une expression utilise des valeurs de
types différents. Par exemple un int et un long
dans la même expression ou encore un int et
un float. Il y aura automatiquement
conversion du type inférieur (plus petit) vers le
type supérieur. Le int sera convertit en long ou
en float selon le reste de l’expression.
Attention cela peut occasionner des bogues si
nous ne sommes pas attentif surtout lorsqu’on
commence. Il est recommandé de ne pas
mélanger les types.
•48
par Alain Pilon
Page 24
Programmation orientée objet en C++
Août 2021
Conversions
Explicite
Il s’agit de demander explicitement la
conversion dans le type désiré. On appelle
cette opération « casting » ou « transtypage ».
Exemple:
int i = 5; float x = 10.0, y = 20.5;
i = int(x); // méthode C++
i = (int)x; // méthode C aussi acceptée
•49
par Alain Pilon
Page 25
Related documents
Download