Objectifs du cours d aujourd hui. Informatique I : Cours d introduction à l informatique et à la programmation Types avancés (1)



Documents pareils
INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Utilisation d objets : String et ArrayList


TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Cours d initiation à la programmation en C++ Johann Cuenin

LES TYPES DE DONNÉES DU LANGAGE PASCAL

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Java Licence Professionnelle CISII,

TD3: tableaux avancées, première classe et chaînes

Définitions. Numéro à préciser. (Durée : )

Chap III : Les tableaux

Bases de programmation. Cours 5. Structurer les données

Premiers Pas en Programmation Objet : les Classes et les Objets

TP 1. Prise en main du langage Python

Algorithmique et Programmation, IMA

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Programmation C++ (débutant)/instructions for, while et do...while

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Les structures. Chapitre 3

UE C avancé cours 1: introduction et révisions

Introduction à MATLAB R

TP : Gestion d une image au format PGM

STAGE IREM 0- Premiers pas en Python

PROJET ALGORITHMIQUE ET PROGRAMMATION II

I. Introduction aux fonctions : les fonctions standards

Introduction au langage C

Cours d Algorithmique et de Langage C v 3.0

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmer en JAVA. par Tama

TP, première séquence d exercices.

Généralités sur le Langage Java et éléments syntaxiques.

Conventions d écriture et outils de mise au point

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Les chaînes de caractères

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Recherche dans un tableau

Architecture des Systèmes d Information Architecture des Systèmes d Information

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Poker. A rendre pour le 25 avril

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Notions fondamentales du langage C# Version 1.0

Plan du cours. Historique du langage Nouveautés de Java 7

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

1 Recherche en table par balayage

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Chapitre 1 : La gestion dynamique de la mémoire

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Objectifs du cours d aujourd hui. Informatique II : Cours d introduction à l informatique et à la programmation objet. Complexité d un problème (2)

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Rappels Entrées -Sorties

Algorithme. Table des matières

Algorithmique, Structures de données et langage C

Programmation en langage C

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Introduction à l algorithmique et à la programmation M1102 CM n 3

Informatique Générale

Une introduction à Java

Claude Delannoy. 3 e édition C++

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Adama MBODJI MBODJ.SYSTEM

Création et Gestion des tables

Travaux Dirigés n 1 : chaînes de caractères

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Rappel sur les bases de données

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Démonstration d utilisation De NesmaCom

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Le langage SQL Rappels

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Algorithmique et programmation : les bases (VBA) Corrigé

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

La classification automatique de données quantitatives

Initiation à la Programmation en Logique avec SISCtus Prolog

Structurer ses données : les tableaux. Introduction à la programmation

Programmation Par Objets

Package Java.util Classe générique

Exercices sur les interfaces

Présentation du langage et premières fonctions

Souad EL Bernoussi. Groupe d Analyse Numérique et Optimisation Rabat http ://

Initiation à la programmation en Python

OCL - Object Constraint Language

Gestion distribuée (par sockets) de banque en Java

Initiation à LabView : Les exemples d applications :

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Quelques éléments de compilation en C et makefiles

Transcription:

Objectifs du cours d aujourd hui Informatique I : Cours d introduction à l informatique et à la programmation Types avancés (1) Jamila Sam Haroud Présenter des structures de données plus avancées (que les types élémentaires) : Tableaux Tableaux de taille fixe Tableaux de taille variable (vector) Chaîne de caractères (string) Types élémentaires avancés Laboratoire d Intelligence Artificielle et la suite la semaine prochaine : Faculté I&C Structures Pointeurs Informatique I Cours 6 :Types composés 1 Informatique I Cours 6 :Types composés 2 Rencontre du 5 e type Exemples de données structurées À ce stade du cours, la représentation des données se réduit aux types élémentaires int, double, char et bool. Ils permettent de représenter, dans des variables, des concepts simples du monde modélisé dans le programme : dimensions, sommes, tailles, expressions logiques, Cependant, de nombreuses données plus sophistiquées ne se réduisent pas à un objet informatique élémentaire. un langage de programmation évolué doit donc fournir le moyen de composer les types élémentaires pour construire des types plus complexes, les types composés. Âge Nom Taille Âge Sexe 20 Dupond 1.75 41 M 35 Dupont 1.75 42 M 26 Durand 1.85 26 F 38 Dugenou 1.70 38 oui 22 Pahut 1.63 22 F tableaux, structures de données hétérogènes (par exemple, «un enregistrement» dans la liste ci-dessus), chaînes de caractères (par exemple, le «nom»), etc. Informatique I Cours 6 :Types composés 3 Informatique I Cours 6 :Types composés 4

Les types composés : les tableaux Une première façon de composer les types élémentaires est de faire des tableaux. Les tableaux en C++ sont des types composés homogènes, c est-à-dire constitués d éléments qui sont tous du même type. On pourra donc définir des tableaux d int, de double, de char, mais aussi de types composés, par exemple des tableaux de tableaux (!!) Dans un premier temps, nous allons nous intéresser aux tableaux de taille fixe Les tableaux de taille variable (vector) viendront ensuite. Déclaration d un tableau de taille fixe La syntaxe de déclaration d un tableau de taille fixe est : type identificateur[taille] ; où type est le type des éléments constitutifs du tableau, identificateur est le nom du tableau et taille est le nombre d éléments que contient le tableau. Ce nombre doit être connu à l avance ( sinon vector) Exemples : int age[5] ; correspond à la déclaration d un tableau de 5 entiers. int const NB_CANTONS(26) ; double superficie[nb_cantons] ; correspond à la déclaration d un tableau de 26 double. Informatique I Cours 6 :Types composés 5 Informatique I Cours 6 :Types composés 6 Déclaration d un tableau de taille fixe (2) Initialisation d un tableau de taille fixe Attention! Ne pas confondre int age(5) ; un entier initialisé à la valeur 5 et int age[5] ; un tableau de cinq entiers Conseil : N écrivez jamais explicitement la taille d un tableau (valeur littérale) int age[5] ; mais préférez mettre sa taille dans une constante. int const NB_CANTONS(26) ; double superficie[nb_cantons] ; Cela vous permet par la suite de référencer à plusieurs endroit la taille (par exemple dans des boucles) sans recopier la valeur explicite. Ainsi en cas de changement du programme vous n aurez qu une seule valeur à modifier : l initialisation de la constante. Comme pour les variables de type élémentaire, un tableau de taille fixe peut être initialisé directement lors de sa déclaration. Par contre la syntaxe est différente (des autres types) : type identificateur[taille] = {val 1,, val taille ; int age[5] = {20,35,26,38,22 ; Âge 20 35 26 38 22 Informatique I Cours 6 :Types composés 7 Informatique I Cours 6 :Types composés 8

Accès aux éléments d un tableau de taille fixe Le i+1 ème élément d un tableau d identificateur tab est référencé par tab[i] Attention! les indices correspondant aux éléments d un tableau de taille taille varient entre 0 et taille-1 et il n y a pas de contrôle de débordement!! tab[10000] Le 1 er élément d un tableau tablo précédemment déclaré est donc tablo[0] et son 10 e élément est tablo[9] int const TAILLE(5); int age[taille]; Le passage d un tableau en argument d une fonction Pour le passage d un tableau en argument d une fonction, on peut omettre de spécifier la taille : int f(double tableau[]) ; La fonction f prend comme argument un tableau dont on n a pas spécifié la taille Conseil : Veillez néanmoins à ce que la taille du tableau soit connue de la fonction, par exemple en faisant : int f(double tableau[], int const taille) ; for(int i(0); i < TAILLE; ++i) { cout << "Age de l employé " << i+1 << "? " << flush; cin >> age[i]; Informatique I Cours 6 :Types composés 9 Informatique I Cours 6 :Types composés 10 Le passage d un tableau en argument d une fonction (2) Tableaux à plusieurs dimensions Attention! Il faut avoir consience que le passage d un tableau de taille fixe en argument d une fonction se fait toujours par référence, bien que ce ne soit pas explicitement marqué par le signe &. void g(int tab[], int const taille) { for (int i(0); i < taille; ++i) tab[i] = i+1 ; main { int const TAILLE(3) ; int t[taille] = { 0, 0, 0 ; g(t, TAILLE) ; for (int i(0); i < TAILLE; ++i) cout << t[i] << " " ; Ce programme affichera 1 2 3 donc l appel à la fonction g aura modifié le tableau tab. Si vous voulez évitez les effets de bord, ajoutez const Informatique I Cours 6 :Types composés 11 Comment déclarer un tableau à plusieurs dimensions? On ajoute simplement un niveau de [ ] de plus : C est en fait un tableau de tableaux Exemples : double rotation[2][2] ; int statistiques[nb_cantons][nb_statistiques] ; double tenseur[3][2][4] ; rotation[1][0] = 0.231 ; En faisant une analogie avec les mathématiques, un tableau à une dimension représente donc un vecteur, un tableau à deux dimensions une matrice et un tableau de plus de deux dimensions un tenseur. Informatique I Cours 6 :Types composés 12

Tableaux à plusieurs dimensions Les tableaux multidimensionnels peuvent également être initialisés lors de leur déclaration. Il faut bien sûr spécifier autant de valeurs que les dimensions et ceci pour chacune des dimensions. Passage de tableaux à plusieurs dimensions Attention! Lors du passage d un tableau multidimentionnel seule la première taille a le droit de ne pas être spécifiée. Toutes les autres doivent l être : void f(int tab[][3][5]) ; int matrice[4][3] = { { 0, 1, 2, { 3, 4, 5, { 6, 7, 8, { 9, 0, 1, ; matrice[i][] matrice[][j] 0 1 2 3 4 5 6 7 8 9 0 1 matrice[2][1] Informatique I Cours 6 :Types composés 13 int const N(3); int const M(3); void f(int tab[][m]); main() { int tablo[n][m]; f(tablo); Informatique I Cours 6 :Types composés 14 Les tableaux déclaration : type identificateur[taille] ; déclaration/initialisation : type identificateur[taille] = {val 1,, val taille ; Accès aux éléments : tab[i] i entre 0 et taille-1 Le passage type1 f(type2 tab[]) ; d un tableau tab à une fonction f se fait automatiquement par référence pour éviter les effet de bords : type1 f(const type2 tab[]) ; tableau multidimentionnel : type identificateur[taille1][taille2] ; tab[i][j] ; Les vector Nous avons jusqu ici vu les tableaux de taille fixe (i.e. connue à l avance). Que faire si la taille n est pas connue? Il existe en C++ ce que l on appelle des tableaux dynamiques, c est-à-dire dont la taille peut changer au cours du déroulement du programme, par exemple lorsqu on ajoute ou retire des éléments dans le tableau. Les tableaux dynamique sont définis en C++ par le biais du type vector. (ce n est en toute rigueur pas un type mais un «template». Nous verrons les «templates» bien plus tard dans le cours (vers Pâques)). Pour les utiliser, il faut tout d abord importer les définitions associées à l aide d un include : #include <vector> Informatique I Cours 6 :Types composés 15 Informatique I Cours 6 :Types composés 17

Déclaration d un tableau dynamique Une variable correspondant à un tableau dynamique se déclare de la façon suivante : vector< type > identificateur ; où identificateur est le nom du tableau et type correspond au type des éléments du tableau. Il peut être simple ou composé (on peut donc faire des vector de vector!). #include <vector> vector< int > tableau ; Initialisation d un tableau dynamique Le fait que l on s intéresse ici à des tableaux de taille potentiellement variable explique que la déclaration ne comporte pas d indication sur la taille initiale du tableau. Un tableau ainsi déclaré correspond alors tout simplement à un tableau vide (pas du tout d éléments!). Une taille initiale peut cependant être indiquée si nécessaire. La syntaxe de la déclaration est alors : vector< type > identificateur(taille) ; vector< int > tab(5) ; correspond à la déclaration d un tableau initialement constitué de 5 entiers. Attention! ce n est pas la même chose que int tab[5] car dans ce dernier cas on ne pourra plus changer la taille du tableau, alors que dans le cas de vector on le peut. Informatique I Cours 6 :Types composés 18 Informatique I Cours 6 :Types composés 19 Initialisation d un tableau dynamique (2) L indexation La déclaration d un tableau peut de plus être associée à une initialisation explicite des éléments contenus dans le tableau. Cela s écrit : soit : vector< type > identificateur(n, valeur) ; où valeur est la même valeur initiale affectée à tous les N éléments du tableau soit : vector< type > identificateur(reference) ; où reference est une référence à un tableau de type de base type. Exemples : vector< int > tab1(5,1); vector< int > tab2(tab1); correspondent toutes deux à la déclaration d un tableau d entiers dont les 5 éléments de départ sont initialisés à la valeur 1. Remarque : il n y a pas de moyen simple pour initialiser un tableau dont les éléments n ont pas tous la même valeur. Écrire une fonction Informatique I Cours 6 :Types composés 20 L indexation des différents éléments d un tableau dynamique (c est-à-dire l accès direct aux éléments du tableau) se fait de la même façon que pour un tableau de taille fixe : Si tableau est un vector, alors tableau[i] est une référence au (i+1)ème élément de tableau. Attention! Il est impératif que cet éléments existe effectivement! Sinon risque de Segmentation Fault! Exemple (à ne pas suivre!) d erreur classique : vector<double> v; v[0] = 5.4; // NON!! Informatique I Cours 6 :Types composés 21

Fonctions spécifiques Contrairement aux tableaux de taille fixe, un certain nombre d opérations sont directement attachées au type vector. L utilisation de ces opérations spécifiques se fait avec la syntaxe suivante : nom_de_tableau.nom_de_fonction(arg1,arg2,) ; vector<double> mesures ; nombre = mesures.size() ; Fonctions spécifiques Quelques fonctions disponibles pour un tableau dynamique tableau de type vector< type > : int tableau.size() : renvoie la taille de tableau Une manière usuelle pour parcourir les éléments d un tableau dynamique est donc l itération for suivante : for (int i(0) ; i < tableau.size() ; ++i) { bool tableau.empty() : détermine si tableau est vide ou non. void tableau.clear() : supprime tous les éléments de tableau (et le transforme donc en un tableau vide). void tableau.pop_back() : supprime le dernier élément de tableau. void tableau.push_back(valeur) : ajoute un nouvel élément de valeur valeur à la fin de tableau. Informatique I Cours 6 :Types composés 22 Informatique I Cours 6 :Types composés 22 Exemple Affectation globale d un tableau dynamique Voici un bout de code qui initialise un vecteur d entiers que l on suppose strictement positifs. Lors de la saisie, l utilisateur peut de plus recommencer à zéro en entrant 0 ou effacer le dernier élément en entrant un nombre négatif. void saisie(vector<int>& vect, int const TAILLE = 4) { int val; vect.clear(); cout << "Saisie de " << TAILLE << " valeurs :" << endl; while (vect.size() < TAILLE) { cout << "Entrez le coef. " << vect.size() << " : " << flush; cin >> val; if (val < 0) vect.pop_back(); else if (val == 0) vect.clear(); else vect.push_back(val); Informatique I Cours 6 :Types composés 23 Tout tableau dynamique (qui n a pas été déclaré comme constant) peut être modifié par une affectation globale du tableau en tant que tel. On parle ici de l affectation d un tableau complet, dans sa totalité. La syntaxe est : identificateur = tableau ; où tableau est un tableau dynamique de même type qu identificateur. vector< int > tab1(5,1) ; vector< int > tab2 ; tab2 = vector< int >(6,2) ; tab2 = tab1 ; Attention! On ne peut pas faire cela avec les tableaux statiques!! Informatique I Cours 6 :Types composés 24

Les tableaux multidimensionnels Les tableaux multidimensionnels Le type de base d un tableau peut être n importe quel type, y compris composé. En particulier, le type de base d un tableau peut être lui même un tableau. Les tableaux correspondants sont alors des tableaux de tableaux, i.e. des tableaux multidimensionnels. vector< vector< int > > tab(5, vector< int >(6)) ; correspond à la déclaration d un tableau de 5 tableaux de 6 entiers, autrement dit un tableau bidimensionnel (une matrice) à 5 lignes et 6 colonnes. Comme pour les tableaux multidimensionnels de taille fixe, tab[i][j] permet alors de référencer l élément de la (i+1)ème ligne et de la (j+1)ème colonne. Informatique I Cours 6 :Types composés 25 Notez que en toute rigueur vector< vector< int > > n est pas la même chose que int[][] : dans le premiers cas les lignes de la «matrice» n ont pas forcément toutes la même longueur alors que c est le cas pour les tableau de taille fixe. Un vector< vector< int > > n est pas une matrice mais un vecteur de vecteurs d entiers (pas nécessairement tous de la même taille!). vector< vector< int > > tableau ; tableau[i][] 0 1 2 3 4 5 6 7 8 9 0 1 tableau[0].size() renvoie 4 tableau[2].size() renvoie 2 tableau[2][1] Informatique I Cours 6 :Types composés 26 Code de l exemple vector< vector <int> > tableau; tableau.push_back(vector<int>(4)); tableau.push_back(vector<int>(3)); tableau.push_back(vector<int>(2)); tableau.push_back(vector<int>(3)); tableau[0][0] = 0; tableau[0][1] = 1; tableau[0][2] = 2; tableau[0][3] = 3; tableau[1][0] = 4; tableau[1][1] = 5; tableau[1][2] = 6; tableau[2][0] = 7; tableau[2][1] = 8; tableau[3][0] = 9; tableau[3][1] = 0; tableau[3][2] = 1; for (unsigned int i(0); i < tableau.size(); ++i) { for (unsigned int j(0); j < tableau[i].size(); ++j) cout << tableau[i][j] << " "; cout << endl; for (unsigned int i(0); i < tableau.size(); ++i) cout << "tableau[" << i <<"].size()=" << tableau[i].size() << endl; #include <vector> Le template vector Déclaration : vector< type > identificateur ; Déclaration/Initialisation : vector< type > identificateur(taille) ; Accès au (i+1)-ème élément (quand il existe!) : tab[i] Fonctions spécifiques : int tab.size() : renvoie la taille bool tab.empty() : détermine s il est vide ou non void tab.clear() : supprime tous les éléments void tab.pop_back() : supprime le dernier élément void tab.push_back(valeur) : ajoute un nouvel élément à la fin Informatique I Cours 6 :Types composés 27 Informatique I Cours 6 :Types composés 28

La classe string Affectation de chaînes "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émentaires mais une classe.) Pour utiliser des chaînes de caractères, il faut tout d abord importer les définitions : #include <string> La déclaration d une chaîne de caractères se fait alors avec : string identificateur ; #include <string> // déclaration string un nom; // déclaration avec initialisation string maxime("why use Windows when there are doors?"); Informatique I Cours 6 :Types composés 30 Comme pour n importe quel autre type, toute variable de type string (qui n a pas été déclarée comme constante) peut être modifiée par une affectation. string chaine ; // -> chaine vaut "" string chaine2("test") ; // -> chaine2 vaut "test" chaine = "test3" ; // -> chaine vaut "test3" chaine = chaine2 ; // -> chaine vaut "test" chaine = a ; // -> chaine vaut "a" Remarque 1 : dans le cas de l affectation d un caractère, la valeur affectée à la chaîne est la chaîne réduite au caractère affecté. Remarque 2 : Toute variable déclarée mais non initialisée est automatiquement initialisée à la valeur correspondant à la chaîne vide (""). Informatique I Cours 6 :Types composés 31 La concaténation La concaténation de chaînes est représentée par l opérateur +. chaine1 + chaine2 correspond à une nouvelle chaîne associée à la valeur littérale constituée de la concaténation des valeurs littérales de chaine1 et de chaine2. Les combinaisons suivantes sont possibles pour la concaténation de deux chaînes : string + string, string + "", "" + string, string + char, char + string où string correspond à une variable de type string, "" correspond à une valeur littérale et char à une variable ou une valeur littérale de type char. Remarque : les concaténations de la forme string+char (resp. char+string) constituent un moyen très pratique pour ajouter des caractères à la fin (resp. au début) d une chaîne. La concaténation : exemple Constitution du nom complet à partir du nom de famille et du pré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 ; Informatique I Cours 6 :Types composés 32 Informatique I Cours 6 :Types composés 33

Les opérateurs relationnels Les opérateurs relationnels == égalité!= non-égalité < strict. inférieur <= inférieur ou égal > strict. supérieur >= supérieur ou égal sont également définis pour les chaînes de type string. La relation d ordre utilisée pour ces différents opérateurs est l ordre alphabétique. Les opérateurs relationnels Exemples : do reponse=poser_question() ; while (reponse!= "oui") ; if ((nom <= "d") && (nom >= "b")) cout << "votre nom commence par b, c ou d" << endl ; Attention! L ordre alphabétique des ordinateurs ne respecte pas les lettres accentuées et l ensemble des majuscules est inférieur à n importe quelle minuscule : Z < a Note : Pour avoir l ordre alphabétique de l ordinateur, exécutez ce petit programme : for (unsigned char a(32); a < 255; ++a) cout << (int) a << " : " << a << " " << endl; Informatique I Cours 6 :Types composés 34 Informatique I Cours 6 :Types composés 34 L indexation Si chaine est une string, alors chaine[i] est le (i+1)ème caractère de chaine (de type char). Attention! Les éléments d une chaîne sont indicés de 0 à (taille 1), où taille est la taille (i.e. le nombre de caractères) de la chaîne. Exemples : string demo("abcd"); char prems; char der; prems = demo[0]; // recoit A der = demo[3]; // reçoit D L indexation Si chaine est une string, alors chaine[i] est le (i+1)ème caractère de chaine (de type char). Attention! Les éléments d une chaîne sont indicés de 0 à (taille 1), où taille est la taille (i.e. le nombre de caractères) de la chaîne. Exemples : string essai("essai"); string test; for (unsigned int i(1); i <= 3; ++i) { test = test + essai[6-2*i]; test = essai[i] + test; cout << test << endl; affichera : Informatique I Cours 6 :Types composés 35 Informatique I Cours 6 :Types composés 35

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 variable de type string) : chaine.size() : renvoie la taille (i.e. le nombre de caractères) de chaine. chaine.insert(position, chaine2) : insère, à partir de la position (indice) position dans la chaîne chaine, la string chaine2 string exemple("abcd") ; // exemple vaut "abcd" exemple.insert(1,"xx") ; // exemple vaut "axxbcd" construit la chaîne "axxbcd". Fonctions spécifiques aux chaînes chaine.replace(position, n, chaine2) : remplace les n caractères d indice position, position+1,, position+n-1 de chaine par la string chaine2. 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. string exemple("abcd") ; exemple.replace(1,2,"") ; exemple vaut "ad". Informatique I Cours 6 :Types composés 36 Informatique I Cours 6 :Types composés 37 Fonctions spécifiques aux chaînes chaine.substr(depart, longueur) : renvoie la chaîne de chaine, de longueur longueur et commençant à la position depart. string("salut à tous!").substr(8, 4) renvoie la string "tous". chaine.find(souschaine) : renvoie l indice dans chaine du 1er caractère de l occurrence la plus à gauche de la string souschaine. string("baabbaab").find("ab") renvoie 2. chaine.rfind(souschaine) : renvoie l indice dans chaine du 1er caractère de l occurrence la plus à droite de la string souschaine. string("baabbaab").rfind("ab") renvoie 6. Dans les cas où les fonctions find() et rfind() ne peuvent s appliquer, elles renvoient la valeur prédéfinie string : :npos Informatique I Cours 6 :Types composés 38 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 : recherche : chaine.substr(position, longueur) chaine.find(souschaine) chaine.rfind(souschaine) valeur "pas trouvé" d une recherche : string : :npos Informatique I Cours 6 :Types composés 39

Types élémentaires «avancés» En plus des types composés, signalons qu il existe aussi d autres types élémentaires, dérivés des types élémentaires présentés. Trois modificateurs peuvent être utilisés : pour les int et les double, on peut demander d avoir une plus grande précision de représentation à l aide du modificateur long. long int nb_etoiles ; pour les int, on peut aussi demander d avoir une moins grande précision de représentation à l aide du modificateur short. short int nb_cantons ; pour les int (et les char), on peut demander de travailler avec des données non signées, à l aide du modificateur unsigned. unsigned int nb_cacahouetes ; On peut bien sûr combiner : unsigned long int nb_etoiles ; unsigned short int nb_cantons ; Types élémentaires «avancés» En C++, la taille des types n est pas spécifiée dans la norme. Seules indications : le plus petit type est char les inégalités suivantes sont toujours vérifiées sur les tailles mémoires : char short int int long int double long double Cependant, les tailles généralement utilisées sont 8 bits pour les char 16 bits pour les short int 32 bits pour les long int Informatique I Cours 6 :Types composés 41 Informatique I Cours 6 :Types composés 41 Types élémentaires «avancés» Ces choix typiques conduisent aux bornes suivantes : type min. max. char 128 127 unsigned char 0 255 short int 32768 32767 unsigned short int 0 65535 long int 2147483648 2147483647 unsigned long int 0 4294967295 type min. (valeur absolue) max. précision double 2.22507e 308 1.79769e+308 2.22045e 16 long double 3.3621e 4932 1.18973e+4932 1.0842e 19 Note : «précision» correspond au plus petit nombre x tel que 1 + x 1. Informatique I Cours 6 :Types composés 41 Type enuméré En C++, il est également possible de donner des noms aux valeurs de types énumérés, comme par exemple la liste des couleurs, la liste des cantons, etc Cela permet d utiliser ensuite ces valeurs sans avoir à se préoccuper de leur codage effectif. Ceci se fait à l aide du mot clé enum. Pour déclarer un type enuméré, la syntaxe est la suivante : enum Type { valeur1, valeur2, ; Par exemple : enum CantonRomand { Vaud, Valais, Geneve, Fribourg, Neuchatel, Jura ; On peut alors ensuite utiliser simplement ces valeurs comme pour un type entier : CantonRomand moncanton(vaud) ; moncanton = Valais ; switch (moncanton) { case Valais : case Vaud : Informatique I Cours 6 :Types composés 42

Type enuméré (2) On peut même les utiliser comme entiers, sachant que la convention utilisée est que la première valeur enumérée (Vaud dans l exemple précédent) correspond à 0. On pourrait alors par exemple faire : int const NB_CANTONS_ROMANDS(Jura+1) ; ou encore for (unsigned int i(vaud) ; i <= Jura ; ++i) Remarque : on peut aussi les utiliser pour indexer des tableaux : population[moncanton] = 616 ; Ce que j ai appris aujourd hui à structurer mes données en tableaux, de taille fixe ou variable comment représenter/manipuler des chaînes de caractères (mots/phrases) à mieux spécifier les types élémentaires en fonction de mes besoins (long/short, unsigned, enum) je peux maintenant écrire des programmes modélisant des données plus complexes Informatique I Cours 6 :Types composés 43 Informatique I Cours 6 :Types composés 44 La suite Exercices de cette semaine : Programmation : tableaux, chaînes de caractères Le prochain cours : les structures les pointeurs Informatique I Cours 6 :Types composés 45