Académique Documents
Professionnel Documents
Culture Documents
Alain Casali
Marc Laporte
Plan
A. Le type string (part 2)
F. Arguments de commande
J. Opérateurs ++ et –-
K. Opérateur ternaire
A. Le type string
A.1 Initialisation de string lors de la déclaration
Exemple :
string Str1 (10,’A’);
Str1 est une string contenant 10 fois le caractère ‘A’
Exemple :
string Str2 (Str1);
Construction par copie partielle :
string VarIdent (AnotherString, APos);
string VarIdent (AnotherString, APos, NbOfChars);
Exemple :
string Str3 (Str1, 3);
//Str3 est une string qui contient 7 fois le caractère ‘A’.
string Str4 (Str1, 3, 2);
//Str4 est une string qui contient 2 fois le caractère ‘A’.
A.2 Extraction d’une sous chaine
Exemple :
string Str ("Ma jolie chaine");
cout << Str.substr (4) << endl; //olie chaine
cout << Str.substr (4, 8) << endl; //olie cha
A.3 Recherche d’une chaine de caractères
Pour rechercher une sous-chaine dans une string, on appelle une des
méthodes find () sur l’objet (la variable) de type string.
Exemple :
string Str ("abracadrabrantesque");
cout << Str.find ("bra") << endl; //1
cout << Str.find ("bra", 8) << endl; //9
cout << Str.find ("bilou") << endl; //18446744073709551615
A.4 Lecture d’une ligne au clavier
Problème :
string Str;
cin >> Str; //ma jolie chaine
cout << Str; //ma
cin >> Str;
cout << Str; //jolie
F. Arguments de commande
J. Opérateurs ++ et –-
K. Opérateur ternaire
bibliothèque = ensemble de types
sous-programmes
classes, objets, ...
Fill() Shadow()
Paint() Project()
...
Draw() Draw()
...
conflit
utilisateur
Fill (something);
Project (quelque_chose);
Draw (autre_chose); quel Draw() ?
Draw (...); quel Draw() ?
bibliothèque standard du C++ = tous les types, classes, fonctions, objets, etc.
"prédéfinis" du C++ qui au langage C
string + ...
décrits dans
le fichier string
opérateur de
concaténation
utilisation
opérateur de
résolution de
int main () portée
{
std::string
string Message;
Message;
extracteur
cin >> Message;
std::cin >> Message;
cout << Message
std::cout << endl;
<< Message << std::endl;
return 0;
} // main()
ou
utilisation
int main ()
{
string Message;
} // main()
bibliothèque graphique 2D bibliothèque graphique 3D
nsGraph2D nsGraph3D
Fill() Shadow()
Paint() Project()
décrites dans
Draw() fichiers Draw()
Graph2D Graph3D
#include <Graph2D>
#include <Graph3D>
ou
nsGraph2D::Fill (something);
nsGraph3D::Project (quelque_chose);
nsGraph3D::Draw (autre_chose);
aucune ambiguïté
nsGraph2D::Draw (...);
bibliothèque graphique 2D bibliothèque graphique 3D
nsGraph2D nsGraph3D
Fill() Shadow()
Paint() Project()
décrites dans
Draw() fichiers Draw()
Graph2D Graph3D
#include <Graph2D>
#include <Graph3D>
using namespace nsGraph2D;
using namespace nsGraph3D;
Fill (something);
Project (quelque_chose);
nsGraph3D:: Draw (autre_chose);
non ambigu
nsGraph2D:: Draw (...);
Plan
A. Le type string (part 2)
F. Arguments de commande
J. Opérateurs ++ et –-
K. Opérateur ternaire
Exemple sans espace de noms
/**
Entete void DisAuRevoir (void)
**/ déclarations {
cout << "Au revoir"
#include <iostream> << endl;
} // DisBonjour () } // main()
Exemple avec espace de noms anonyme
} // DisBonjour () } // main()
Plan
A. Le type string (part 2)
F. Arguments de commande
J. Opérateurs ++ et –-
K. Opérateur ternaire
D. Valeur par défaut
D.1 Dans les fonctions « normales »
Déclaration/définition
Utilisation
unsigned Pos = FindDicho (V, 10);
D.2 Utilité des valeurs par défaut extensibilité
Utilisation
unsigned Pos = FindDicho (V, 10);
Utilisation
unsigned Pos = FindDicho (V, 10);
Ada95 autorise une autre façon de passer des paramètres effectifs lors de l'appel
procedure UneFonction (Largeur : in Integer,
Hauteur : in Integer,
Utilisation Profondeur : in Integer) is
F. Arguments de commande
J. Opérateurs ++ et –-
K. Opérateur ternaire
E. Passage optimal des
paramètres
Soit le programme suivant :
unsigned Find (vector <int> V, int Val)
{
…
}
int main ()
{
…
vector <int> VInt (4);
for (int &x : Vect) x = Rand (1, 10);
cout << (Find (VInt, 5) == VInt.size ()?
"pas " : " ") << "trouvé" << endl;
…
}
Etat de la mémoire avant l’appel à Find ()
Lors d’une déclaration de fonction tous les objets doivent avoir ces 2
propriétés.
Exemple :
unsigned Find (const CVint & V, int Val) {…}
…
string Chaine;
getline (cin, Chaine);
ToLower (Chaine);
cout << Chaine;
Est-ce qu’il n’y aurait pas moyen de combiner les deux dernières instructions?
…
cout << ToLower (Chaine);
…
cout << ToLower (Chaine);
F. Arguments de commande
J. Opérateurs ++ et –-
K. Opérateur ternaire
F. Arguments de
commande
F.1 Utilisation
Il faut transformer (transtyper) les arguments de commande en leur type C++ correspondant.
Chaine de caractères
string (argv[i]);
Entier
stoi (argv[i]);
Entier naturel
stoul (argv[i]);
F.3 Fixer des arguments de commande dans Qt
Plan
A. Le type string (part 2)
F. Arguments de commande
J. Opérateurs ++ et –-
K. Opérateur ternaire
G. Segmenter ses fichiers
Il existe 3 types de fichiers ayant pour extension :
• .h : regroupe toutes les signatures des fonctions;
• .cpp : regroupe touts les corps des fonctions déclarées dans le .h + d’autres fonctions
« locales »;
• .hpp : regroupe les signatures + corps des fonctions.
Règles :
1. Les fichiers de signature et de corps doivent posséder le même nom (à la casse près)!
2. Les paramètres par défaut ne sont présents que dans le fichier d’extension .h
3. On ne doit pas trouver deux fonction ayant la même signature dans le même espace de
nom, quelque soit le(s) fichier(s) où elles se trouvent
4. Le fichier XXX.h commence obligatoirement par
#ifndef __XXX_H
#define __XXX_H
5. Le fichier XXX.h se termine par
#endif
6. Le fichier XXX.cpp doit contenir
#include "XXX.h"
G.1 Exemple
nsUtil.h
#ifndef __NSUTIL_H
#define __NSUTIL_H
…
namespace nsUtil
{
std::string & ToLower (std::string & Str);
…
}
#endif
#include "nsUtil.h"
using namespace std;
main.cpp
#include "nsUtil.h"
using namespace std;
using namespace nsUtil;
Demo Qt
Plan
A. Le type string (part 2)
F. Arguments de commande
J. Opérateurs ++ et –-
K. Opérateur ternaire
H. Bloc à unique instruction
H.1 Règle
F. Arguments de commande
J. Opérateurs ++ et –-
K. Opérateur ternaire
I. Opérateurs mathématique
i = i + (expression_entiere);
i += (expression_entiere);
ou plus simplement :
i += expression_entiere;
Exemple :
int i = 25;
int Incr;
cin >> Incr;
// ...
i += Incr * 2; // ou i = i + (Incr * 2);
existe aussi pour autres opérateurs binaires
arithmétiques
i = i - (expression_entiere);
peut être écrite :
i -= (expression_entiere);
i = i / (expression_entiere);
peut être écrite :
i /= (expression_entiere);
i -= Incr; i = i - Incr;
De même :
i /= Incr; i = i / Incr;
i = i - Incr + 1;
et :
i = i / Incr / 2;
i *= Incr / 2; i = i * (Incr / 2);
Exemple :
i = 10;
Incr = 5;
i *= Incr / 2; i = i * (Incr / 2);
= 10 * (5 / 2);
= 10 * 2;
= 20;
i = i * Incr / 2;
= 10 * 5 / 2;
= 50 / 2;
= 25;
L'opérateur += existe aussi pour les strings
string S1 ("Coucou");
string S2 ("moi");
F. Arguments de commande
J. Opérateurs ++ et –-
K. Opérateur ternaire
J. Opérateurs ++ et --
J.1 Pré-incrémentation - Pré-décrémentation
i = i + 1; // incrémentation
peut être écrite :
i += 1; // incrémentation
ou même :
++i; // incrémentation
i est incrémenté de 1
i = 3;
affichage de 'o'
cout << Str [++i];
affichage de 'u'
cout << Str [++i];
pas équivalent à :
i = 3;
cout << Str [++i] << Str [++i];
i = 5 i = 4
ordre d'injection des opérandes : de gauche à droite
3 4
cout << Str [5] << Str [4]; affichage de 'u' suivi de'o'
autre exemple : afficher un mot lu au clavier
caractère/caractère à l'envers
string MotLu;
cin >> MotLu;
for ( ; ; )
{
if (0 == i) break;
i = i - 1; cout << MotLu [--i];
cout << MotLu [i];
}
// suite du programme
string MotLu;
cin >> MotLu;
for (unsigned i = MotLu.size (); i > 0; )
{
cout << MotLu [--i];
}
// suite du programme
ou même :
string MotLu;
cin >> MotLu;
// suite du programme
J.2 Pos-incrémentation - Post-décrémentation
string MotLu;
cin >> MotLu;
F. Arguments de commande
J. Opérateurs ++ et –-
K. Opérateur ternaire
K. Opérateur ternaire
K.1 Utilité Eviter les redondances
char C;
cin >> C;
char C;
cin >> C;
cout << C;
if (' ' == C || '\t' == C)
cout << " est";
else
cout << " n'est pas";
Sémantique
expression_1 doit être de type booléen,
char C;
cin >> C;
cout << C;
if (' ' == C || '\t' == C)
cout << " est";
else
cout << " n'est pas";
cout << " un espace" << endl;
expression_1 booléen
char C;
cin >> (C); expression_2 expression_3
même type : NTCTS
cout << C
<< ((' ' == C || '\t' == C) ? " est" : " n'est pas")
<< " un espace" << endl;
operateur ? :
résultat injecté : Littéral chaine de caractères
Un des avantages : une seule instruction if ..., for...
Exemple :
double X, AbsX;
cin >> X;
if (X < 0.0)
AbsX = -X;
else
AbsX = X;
double X, AbsX;
cin >> X;
} // ValidRang()
mieux :
CodeOp) ?
return ('I' == e1 min (Rang,
e2 Max)
: min (Rang,
e3 Max - 1);
encore mieux :
} // Hexa2Dec()
cout << X;
if (X >= 0) cout << " non";
cout << " négatif"; pas de même type
cout << X << ((X >= 0) ? " non" : ) << " négatif"; FAUX
cout << X << ((X >= 0) ? " non " : ' ') << "négatif"; FAUX
même type
cout << X << ((X >= 0) ? " non " : " ") << "négatif"; JUSTE