1 Objectif 2 Notion d`objet 3 Le type String 4 Vector

Transcription

1 Objectif 2 Notion d`objet 3 Le type String 4 Vector
Université de Nice-Sophia Antipolis
Polytech ELEC4
Lundi 19 septembre 2016
Durée: 2h
C++ objet : string et vector
Travaux Dirigés – Séance n. 2
constatez-vous ? Comment l’expliquez-vous ?
exercice 4) Ajoutez à votre programme la variable s4 et affectez s3 à s4. Affichez s3 et s4.
exercice 5) On va modifier le 1er caractère de s4. On utilise la notation de tableau, et l’indice
du 1er caractère est égal à 0. Modifiez ce caractère, et affichez à nouveau s3 et s4 que pouvez-vous
en conclure sur l’opération d’affectation ?
exercice 6) Une description complète du type string peut être trouver à la page http://en.
cppreference.com/w/cpp/string/basic_string. Écrivez un programme qui met en évidence
l’utilisation de la méthode find.
1
Objectif
Le langage C++ a été conçu comme un langage à objets. Dans ce TD, vous allez manipuler
des objets prédéfinis dans l’environnement de programmation C++, et nous commencerons par
les chaı̂nes de caractères et les vecteurs.
2
Notion d’objet
En programmation objet, un objet contient à la fois des données et des méthodes (fonctions
et procédures). Les actions s’appliquent, en général, sur les données de l’objet. Dans les langages
à objets de classe, comme par exemple C++ ou Java, un objet est décrit de façon statique par
une classes. Nous verrons plus tard, comment déclarer une classe, mais pour l’instant nous allons
voir comment appliquer une méthode sur un objet (prédéfini du langage), ou accéder à une de ses
données.
Comme dans de nombreux langages, pour appliquer la méthode m d’un objet désigné par la
variable o, on utilise la notation pointée o.m(). Si l’objet possède une donnée accessible par la
variable v, on écrira o.v pour accéder à cette donnée.
On n’en dit pas plus pour l’instant car cela est suffisant pour faire les exercices qui suivent.
3
4
Vector
C++ inclut bien évidemment les tableaux de C. On rappelle qu’en C les tableaux sont statiques,
c’est-à-dire que leur taille (leur nombre d’éléments) est déterminée à la compilation.
Le type vector propose des tableaux dynamique, c’est-à-dire de taille variable. Après avoir
écrit la directive d’inclusion #include <vector>, on déclare une variable v de type vecteur comme
suit :
vector <type_élém > v;
Ci-dessous, on déclare des vecteurs d’entiers, de chaı̂nes de caractères, et de vecteur de réels.
#i n c l u d e < vector >
#i n c l u d e < string >
u s i n g namespace std ;
vector < i n t > v1 ;
vector < string > v2 ;
vector < vector < d o u b l e > > v3 ;
Les 3 vecteurs précédents ne contiennent pas d’éléments (leur taille est égale à 0). On peut
aussi spécifier un nombre d’éléments à sa construction :
Le type String
vector < i n t > v4 = vector < i n t >(10); // vecteur de 10 entiers
.
Nous l’avons vu dans le TD précédent, le type string représente les chaı̂nes de caractères.
Ce sont des objets, qui possèdent des données, en particulier les caractères de la chaı̂nes, et des
méthodes, comme par exemple length() qui donne la longueur de la chaı̂ne.
exercice 1) Écrivez un programme qui déclare la variable s de type string. Lisez sur l’entrée
standard une chaı̂ne de caractères que vous affecterez à s, puis vous écrirez sur la sortie standard
sa longueur. Par exemple :
ou en donnant des valeurs initiales :
vector < string > v5 = { " ab " , " ef " , " azy " }; // vecteur de 3 cha^ınes
exercice 7) Dans un programme, reprenez les déclarations précédentes, et afficher la taille de
chacun de ces vecteurs à l’aide de la fonction size().
exercice 8) Écrivez v5 sur cout. Que constatez-vous ?
Donnez une cha^
ıne de caractères : azerty123
azerty123 : longueur = 9
exercice 2) Écrivez un programme qui déclare 3 variables s1, s2 et s3, de type string. Affectez
à s1 la chaı̂ne "Bonjour" et à s2 la chaı̂ne " à tous". Affectez à s3 la concaténation de s1 s2.
L’opérateur de contamination est +.
exercice 3) Faites la même chose que précédemment, mais en utilisant la fonction strcat. Que
exercice 9) Écrivez la procédure afficherVecteur qui affiche les éléments du vecteur passé en
paramètre. Vous utiliserez la notation [] ;
exercice 10) Récrivez la procédure précédente avec l’énoncé foreach vu la semaine dernière.
exercice 11) Écrivez la fonction main qui déclare deux vecteurs de string v1 et v2. Vous initialiserez v1 avec les 3 valeurs "a", "b", "c". Affectez v1 à v2. Affichez le contenu de v1 et v2. Modifiez
v2[0] et affichez le contenu de v1. Que pouvez-vous en déduire ?
Les vecteurs sont des structures dynamiques et les méthodes push_back et pop_back permettent
1
2
d’ajouter, respectivement supprimer, un élément en fin de tableau.
exercice 12) Écrivez la procédure vecteurPair, qui initialise un vecteur v avec les n premières
valeurs paires positives (v et n sont les 2 paramètres de la procédure.
La notation v[i ] permet d’accéder ou modifier un élément d’un vecteur à l’indice i qui doit
être, nécessairement compris entre 0 et v.size()-1.
exercice 13) Dans la fonction main, déclarez un vecteur v1 et testez vos procédures pour afficher
les éléments de v1. Par exemple, l’appel de la fonction vecteurPair(v1, 6) produira 0 2 4 6 8
10.
Les fonctions insert et erase, permettent d’insérer, respectivement supprimer, un (ou plusieurs) éléments à partir d’une position. La position n’est pas un indice, mais un itérateur (nous
reviendrons sur cette notion ultérieurement). Les itérateurs begin() et end() donnent respectivement la position du premier élément, et celle qui suit le dernier. Ainsi, v.insert(v.begin()+i, x)
insert dans le vecteur v l’élément x avant l’élément d’indice i.
exercice 16) Écrivez la fonction main pour tester votre fonction.
On veut représenter un matrice m × n comme un vecteur de m vecteurs de dimension n.
exercice 17) Écrivez la fonction initMatrice qui renvoie une matrice m×n initialisée aléatoirement.
Cette fonction possède deux paramètres entiers m et n qui sont les 2 dimensions de la matrice.
exercice 18) Écrivez la procédure afficherMatrice qui écrit sur la sortie standard la matrice
passée en paramètre.
exercice 19) Écrivez la fonction main pour tester les deux fonctions précédentes.
exercice 14) Écrivez la procédure vecteurPairImpair qui insère dans un vecteur v qui contient
une suite de nombres pairs, les nombres impairs pour former un suite croissante d’entiers naturels.
Testez votre procédure. Avec le vecteur précédent, la suite formée sera donc 0 1 2 3 4 5 6 7 8
9 10 11.
5
Valarray
Le type valarray permet de représenter des tableaux de valeurs numériques, et de faire des
opérations mathématiques de façon efficace. Il permet aussi de gérer des sous-ensembles d’éléments
du tableaux. Pour utiliser ces tableaux, la directive #include <valarray> sera nécessaire.
L’exemple suivant déclare deux tableaux valarray, le premier de 5 entiers, intiallisés à 0, et le
second de 3 réels intialisé aux valeurs 1.2, 2.2 et 3.0.
valarray < i n t > v1 (5);
valarray < d o u b l e > v2 = { 1.2 , 2.2 , 3.0 };
La notation t[i] permet d’accéder à l’élément d’indice i.
La taille d’un valarray ne peut croı̂tre automatiquement avec des fonctions d’insertion, comme
pour vector. La modification de la taille du tableau doit être faite explicitement à l’aide de la
fonction resize.
exercice 15) Un vecteur (au sens mathématique) est représenté par un valarray de double.
Écrivez la fonction produitScalaire qui renvoie le produit scalaire de deux vecteurs transmis en
paramètre. On vérifiera que les deux vecteurs possèdent bien la même dimension. La signature de
cette méthode est la suivante :
/*
* R^
o le : renvoie le produit scalaire des vecteurs v1 et v2 .
*/
d o u b l e produitScalaire ( valarray < d o u b l e > v1 , valarray < d o u b l e > v2 )
Rappel :
v 0 .v 00 =
n
X
i=1
3
x0i ∗ x00i
4