23
Support MOOC Concepts centraux Etude de cas c EPFL 2017-18 Jamila Sam & Jean-Cédric Chappelier ÉCOLE POLYTECHNIQUE DÉRALE DE LAUSANNE Programmation I : Cours de programmation (C++) Structures et chaînes de caractères Jamila Sam Laboratoire d’Intelligence Artificielle Faculté I&C Programmation I – Cours 8 : Structures et chaînes de caractères – 1 / 23

Programmation I : [5pt] Cours de programmation (C++

  • Upload
    others

  • View
    29

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

Conceptscentraux

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Programmation I :

Cours de programmation (C++)Structures et chaînes de caractères

Jamila Sam

Laboratoire d’Intelligence ArtificielleFaculté I&C

Programmation I – Cours 8 : Structures et chaînes de caractères – 1 / 23

Page 2: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

Conceptscentraux

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Vidéos, transparents et quiz

https://www.coursera.org/learn/init-prog-cpp/home/week/6

+ Semaine 6

Programmation I – Cours 8 : Structures et chaînes de caractères – 2 / 23

Page 3: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Données structurées

Âge Nom Taille Âge Sexe20 Dupond 1.75 41 M35 Dupont 1.75 42 M26 Durand 1.85 26 F38 Dugenou 1.70 38 M22 Pahut 1.63 22 F

Les tableaux permettent de représenter des structures dedonnées homogènes, c’est-à-dire des listes constituéesd’éléments qui sont tous du même type.

Les structures permettent de regrouper des types hétérogènes(mais en nombre limité, connu au préalable !).

Programmation I – Cours 8 : Structures et chaînes de caractères – 3 / 23

Page 4: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Déclaration d’un nouveau type

Exemples :struct Personne {string nom;double taille;int age;char sexe;

};

déclare un nouveau type, Personne, comme une structcomposée de quatre champs : un de type string, un autre detype double, un troisième de type int et un dernier de typechar.

Autre exemple :

struct Complexe {double x;double y;

};

Programmation I – Cours 8 : Structures et chaînes de caractères – 4 / 23

Page 5: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Initialisation d’une structure

Les structures peuvent être initialisées avec la syntaxe suivante :

struct Nom {type1 champ1;type2 champ2;// ....};

Nom identificateur = { val1, val2, ... };

On peut également utiliser cette syntaxe pour l’affectation.

Programmation I – Cours 8 : Structures et chaînes de caractères – 5 / 23

Page 6: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Accès aux champs d’une structure

On peut accéder aux champs d’une structure en utilisant lasyntaxe suivante :

structure.champ

Exemples :untel.taille = 1.75;

++(untel.age); // un an de plus !

cout << untel.nom << endl;

Programmation I – Cours 8 : Structures et chaînes de caractères – 6 / 23

Page 7: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Affectation de structuresUne variable de type composé struct peut être directementaffectée par une variable du même type

Exemple :Personne p1 = { "Durand", 1.75, 20, ’M’ };Personne p2;p2 = p1;

La valeur de chaque champ de p1 est affectée au champcorrespondant de p2

+ L’instruction p2=p1 est équivalente à la séquence d’instructions

p2.nom = p1.nom; p2.taille = p1.taille;p2.age = p1.age; p2.sexe = p1.sexe;

Note : l’affection (=) est la seule opération que l’on peut faireglobalement sur les struct.

On NE peut NI les comparer (p1 == p2),NI les afficher (cout << p1) globalement.

Programmation I – Cours 8 : Structures et chaînes de caractères – 7 / 23

Page 8: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Fonction à plusieurs valeurs de retour

On sait que les fonctions ne peuvent retourner qu’une seule valeur.

Comment faire lorsque l’on veut « retourner » plusieurs valeursavec une fonction ?

Solutions :1. renvoyer une structure contenant les valeurs à retourner ;2. passer les « variables retour » par référence et les affecter à

l’intérieur de la fonction ;3. renvoyer un tableau dynamique (vector), si les valeurs à

retourner sont de même type (homogène) ;4. combiner 1 et 3 : structure avec champs vector ou (au

choix) vector de structures (comme dans l’exempleprécédent)

Programmation I – Cours 8 : Structures et chaînes de caractères – 8 / 23

Page 9: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Les structures

Déclaration du type correspondant :

struct Nom_du_type {type1 champ1 ;type2 champ2 ;...

};

Déclaration d’une variable :Nom_du_type identificateur;

Déclaration/Initialisation d’une variable :Nom_du_type identificateur = { val1, val2, ...};

Accès à un champ donné de la structure :identificateur.champ

Affectation globale de structures :identificateur1 = identificateur2

Programmation I – Cours 8 : Structures et chaînes de caractères – 9 / 23

Page 10: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Alias de types

Pour des types composés complexes, dont l’utilisation directe estdifficile, on peut utiliser la commande typedef pour

donner un autre nom (alias) à ce typeSyntaxe :

typedef type alias;où alias est le nouveau nom de type et type un typeélémentaire ou composé.

Exemple :typedef vector<vector<double> > Matrice;

Un tableau bidimensionnel d’entiers pourra alors être déclaré plussimplement (et plus lisiblement) par :

Matrice rotation(3, vector<double>(3, 1.0)) ;

Mieux :typedef vector<double> Vecteur;typedef vector<Vecteur> Matrice;Matrice rotation(3, Vecteur(3, 1.0));

Programmation I – Cours 8 : Structures et chaînes de caractères – 10 / 23

Page 11: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

La classe string

"Bonjour tout le monde!"

Les chaînes de caractères C++ sont définies par le type string.(En toute rigueur, ce n’est pas un type comme les types élémentairesmais une classe.)

Pour utiliser des chaînes de caractères, il faut tout d’abordimporter les définitions :

#include <string>

La déclaration d’une chaîne de caractères se fait alors avec :string identificateur;

Exemple :#include <string>// declarationstring un_nom;// declaration avec initialisationstring maxime("Why use Windows when there are doors?");

Programmation I – Cours 8 : Structures et chaînes de caractères – 11 / 23

Page 12: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

La concaténation : exemple

Constitution du nom complet à partir du nom de famille et duprénom :

string nom;string prenom;string famille;...nom = famille + ’ ’ + prenom;

Ajout d’un ’s’ final au pluriel :string reponse("solution");//...if (n > 1) {

reponse = reponse + ’s’;}

Programmation I – Cours 8 : Structures et chaînes de caractères – 12 / 23

Page 13: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Fonctions spécifiques aux chaînes

Certaines fonctions propres aux string sont définies.Elle s’utilisent avec la syntaxe suivante :nom_de_chaine.nom_de_fonction(arg1,arg2,...);

Les fonctions suivantes sont définies (où chaine est une variablede type string) :

chaine.size() : renvoie la taille (i.e. le nombre de caractères)de chaine.

chaine.insert(position, chaine2) : insère, à partir de laposition (indice) position dans la chaîne chaine, la stringchaine2

Exemple :string exemple("abcd"); // exemple vaut "abcd"exemple.insert(1,"xx"); // exemple vaut "axxbcd"

construit la chaîne "axxbcd".

Programmation I – Cours 8 : Structures et chaînes de caractères – 13 / 23

Page 14: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Fonctions spécifiques aux chaînes

chaine.replace(position, n, chaine2) : remplace les ncaractères d’indice position, position+1, ..., position+n-1de chaine par la string chaine2.

Exemple :string exemple("abcd");exemple.replace(1,2,"1234");construit la chaîne "a1234d" (dans exemple).

Remarque : la fonction replace() peut également servir àsupprimer des caractères dans une chaîne.

Exemple :string exemple("abcd");exemple.replace(1,2,"");

exemple vaut "ad".

Programmation I – Cours 8 : Structures et chaînes de caractères – 14 / 23

Page 15: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Fonctions spécifiques aux chaîneschaine.find(souschaine) : renvoie l’indice dans chaine du1er caractère de l’occurrence la plus à gauche de la stringsouschaine.

Exemple :string exemple("baabbaab");exemple.find("ab") renvoie 2.

chaine.rfind(souschaine) : renvoie l’indice dans chainedu 1er caractère de l’occurrence la plus à droite de la stringsouschaine.

Exemple :string exemple("baabbaab");exemple.rfind("ab") renvoie 6.

Dans les cas où les fonctions find() et rfind() ne peuvents’appliquer, elles renvoient la valeur prédéfinie string::npos

Exemple :if (exemple.find("xy")!= string::npos) ...

Programmation I – Cours 8 : Structures et chaînes de caractères – 15 / 23

Page 16: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Fonctions spécifiques aux chaînes

chaine.substr(depart, longueur) : renvoie la chaîne dechaine, de longueur longueur et commençant à la positiondepart.

Exemple :string exemple("Salut à tous!");exemple.substr(8, 4) renvoie la string "tous".

Programmation I – Cours 8 : Structures et chaînes de caractères – 16 / 23

Page 17: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Complément: conversion vers et depuisstring

Convertir vers une string: to_string()

Exemple :string s("Ma valeur : ");int val(42);...s += to_string(val);

Convertir depuis une string: stoX()avec X = i (pour int), l (long int), ul (unsigned long int), ll (longlong int),ull (unsigned long long int), d (double) ou ld (long double)

Exemple :double val(3.14);string texte("12.345");...val += stod(texte);

Programmation I – Cours 8 : Structures et chaînes de caractères – 17 / 23

Page 18: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Valeurs littérales de type string

En toute rigueur, la valeur littérale "xyz" n’est pas de typestring( elle est de type const char*)

La conversion se fait souvent de façon totalement transparente.Mais si jamais il est nécessaire de vraiment spécifier, C++14 aintroduit le suffix s pour préciser.Son utilisation nécessite :using namespace std::string_literals;

Exemple : throw "Un message"s;

Programmation I – Cours 8 : Structures et chaînes de caractères – 18 / 23

Page 19: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

C++17: string_view (1/2)

C++17 introduit une généralisation des const string : lesstring_view.A préférer donc ! (lorsque c’est vraiment une const string)

Exemple :#include <string_view>...

void genereLettre(bool masculin,string_view destinataire, string_view sujet,string_view politesse, string_view auteur);

S’utilise comme des const string:vue.size(), vue[i], vue.substr(), ...

Programmation I – Cours 8 : Structures et chaînes de caractères – 19 / 23

Page 20: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

C++17: string_view (2/2)

Ont même deux « modificateurs » (qui modifient la « vue », pas lachaîne elle-même !): remove_prefix(size_t n) etremove_suffix(size_t n)

Exemple :string s("Un exemple simple !");

string_view vue(s);cout << vue << endl;

vue.remove_prefix(3);vue.remove_suffix(2);cout << vue << endl;

cout << s << endl;

affiche:Un exemple simple!exemple simpleUn exemple simple!

Programmation I – Cours 8 : Structures et chaînes de caractères – 20 / 23

Page 21: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

ConceptscentrauxStructures

Alias de types

La classe string

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Les chaînes de caractères

#include <string>déclaration/initialisation : string identificateur("valeur");

Affectation : chaine1 = chaine2;chaine1 = "valeur";chaine1 = ’c’;

Concaténation : chaine1 = chaine2 + chaine3;chaine1 = chaine2 + "valeur";chaine1 = chaine2 + ’c’;

Accès au (i+1)-ème caractère : chaine[i];Fonctions spécifiques :

taille : chaine.size()insertion : chaine.insert(position, chaine2)replacement : chaine.replace(position, longueur, chaine2)suppression : chaine.replace(position, longueur, "")sous-chaîne : chaine.substr(position, longueur)recherche : chaine.find(souschaine)

chaine.rfind(souschaine)

valeur "pas trouvé" d’une recherche : string::npos

Programmation I – Cours 8 : Structures et chaînes de caractères – 21 / 23

Page 22: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

Conceptscentraux

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Etude de cas

I Trêve de calcul d’IMC . . . et pourquoi pas une bonne fondue ?

Programmation I – Cours 8 : Structures et chaînes de caractères – 22 / 23

Page 23: Programmation I : [5pt] Cours de programmation (C++

Support MOOC

Conceptscentraux

Etude de cas

c©EPFL 2017-18Jamila Sam& Jean-Cédric Chappelier

ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E

Pour préparer le prochain cours

I Vidéos et quiz du MOOC semaine 7 :I Pointeurs et références : introduction [09:56]I Pointeurs : concept et analogie [06:07]I Pointeurs : déclaration et opérateurs de base [10:24]I Pointeurs : allocation dynamique [18:42]I Pointeurs « intelligents » [12:28]

I Le prochain cours :I de 15h15 à 16h (résumé et quelques approfondissements sur

les structures)I appui en cours de 16:15 à 17:00 (sur les tableaux)

Programmation I – Cours 8 : Structures et chaînes de caractères – 23 / 23