Sunteți pe pagina 1din 56

VERSION 1.

ALGORITHMIQUE & PROGRAMMATION LANGAGE C/C++.

PROGRAMMATION ALGORITHMIQUE LANGAGE C/C++. | Prof. E. El Bachari

Introduction
Apparu au dbut des annes 90, le langage C++ est actuellement lun des plus utiliss dans le monde, aussi bien pour les applications scientifiques que pour le dveloppement des logiciels. En tant quhritier du langage C, le C++ est dune grande efficacit. Mais il a en plus des fonctionnalits puissantes, comme par exemple la notion de classe, qui permet dappliquer les techniques de la programmation-objet. Le but de ce cours est de prsenter la syntaxe de base du langage C++. La programmation-objet, quant elle, sera abord dans un autre cours au deuxime semestre. Ce document est la compilation de notes de cours Algorithmique et programmation C/C++ donnes aux tudiants de la filire Mathmatiques (SMA S3) la facult des sciences Semlalia Universit Cadi A Marrakech. Toute remarque ou erreur peut tre notifie lauteur ladresse lectronique suivante : elbachari@uca.ma

Plan du cours
o o o o o o o Chapitre I. Chapitre II. Chapitre III. Chapitre IV. Chapitre V. Chapitre VI. Chapitre VII. Gnralits Identificateurs, types et variables Oprateurs, expressions et conversions Entres/Sorties Instructions de contrle Fonctions Tableaux et pointeurs

Page 2

Chapitre I. Gnralits
Introduction Programmer un ordinateur, cest lui fournir une srie dinstructions quil doit excuter. Ces instructions sont gnralement crites dans un langage dit volu, puis, avant dtre excutes, sont traduites en langage machine (qui est le langage du microprocesseur). Cette traduction sappelle compilation et elle est effectue automatiquement par un programme appel compilateur. Pour le programmeur, cette traduction automatique implique certaines contraintes : il doit crire les instructions selon une syntaxe rigoureuse, il doit dclarer les donnes et fonctions quil va utiliser (ainsi le compilateur pourra rserver aux donnes une zone adquate en mmoire et pourra vrifier que les fonctions sont correctement employes). La seule langue connue par lordinateur est le langage binaire (machine) qui ne scrit quavec les chiffres 0 et 1. Dans notre cas, on va tudier le langage de programmation C++. Cest un langage vocation gnrale, il est efficace dans les applications commerciales, la programmation systme et dans les applications techniques. La prsentation du systme en couches

Usager

Langage

Compilateur

Systme

Hardware

Page 3

La structure dun programme C++ Un programme C++, se compose de trois parties

Les fichiers en-tte

Les dclarations

Le corps du programme

1- Les fichiers en-tte Ils sont composs des instructions < include >. Ils contiennent les donnes, des types et des fonctions utilises par le compilateur. 2- Les dclarations Cette partie contient les dclarations et les dfinitions de toutes les variables et fonctions. 3- Le corps du programme Cette partie contient des fonctions utilises dans le programme. Un programme C++ peut contenir un nombre indfini de fonctions. Il doit au minimum en contenir une appele main. Cette fonction obligatoire constitue la fonction principale de tout le programme C++. Elle contient les instructions excutes au dmarrage du programme. Elle a la forme suivante:

Page 4

Directives au processeur - Cest une ligne de programme commenant par le caractre #. - Elle permet de manipuler le code du programme source avant sa compilation. - Parmi les directives, on trouve : inclusions de fichiers, substitutions, macros, compilation conditionnelle. - La ligne #include <iostream> est interprte par le prprocesseur qui recherche dans des rpertoires standards le fichier dont le nom est iostream . - Si le prprocesseur trouve ce fichier, il l inclut en lui faisant subir le mme traitement que le fichier initial (traitement des lignes commenant par #, recherche des macros etc.). - Ce simple programme ncessite linclusion du fichier externe iostream contenant les mthodes ncessaires pour manipuler les entres et les sorties. Espace de noms

- La bibliothque standard C++ est dfinie dans son propre espace de noms, un bloc (ou espace) portant le nom std . - La directive using namespace std dit au compilateur que toutes les choses dfinies dans std doivent tre rendues accessibles pour tre directement utilises. - La bibliothque std contient par exemple la dfinition de la fonction cout utilise pour laffichage en sortie. Programme Principal fonction main est le point dentre dun programme C++. - Cest travers cette fonction main quun programme C++ dmarre. - La signature de la mthode main peut-tre avec paramtres ou sans, comme suit:

- La

Page 5

-Les paramtres argc et argv permettent de rcuprer les arguments de la ligne de commande qui a lanc ce programme. - La variable argc reprsente le nombre d'arguments, nom du programme compris. - La variable argv est un tableau de chanes de caractres contenant la liste des arguments. - La mthode main retourne une valeur entire reprsentant ltat de lexcution du programme. - La valeur entire retourne est par convention positive non nulle en cas derreur. - Dans notre exemple, la valeur retourne est 0 pour signifier que lexcution du programme sest faite correctement. Gnration dun programme excutable Le dveloppement dun programme passe par trois phases successives : 1) criture et enregistrement des diffrents fichiers-source, 2) compilation spare des fichiers .cpp, chacun deux donnant un fichier-objet portant le mme nom, mais avec lextension .obj, 3) lien des fichiers-objets (assure par un programme appele linker) pour produire un unique fichier-excutable, portant lextension .exe ; ce dernier pourra tre lanc et excut directement depuis le systme dexploitation. Les diffrentes tapes intervenant dans le processus dlaboration dun programme excutable sont comme suit :

Page 6

Les outils ncessaires au programmeur Voici le strict minimum pour un programmeur : Un diteur de texte pour crire le code source du programme en C++. En thorie un logiciel comme le Bloc-Notes sous Windows ou vi sous Linux fait l'affaire. L'idal, c'est d'avoir un diteur de texte intelligent qui colore tout seul le code, ce qui permet de sy reprer bien plus facilement. Un compilateur pour transformer ( compiler ) le code source en binaire. Un dbugger ( Dbogueur ou Dbugueur en franais) pour traquer les erreurs dans le programme N.B. On n'a malheureusement pas encore invent le correcteur , un truc qui corrigerait tout seul nos erreurs). Il existe plusieurs environnements de dveloppement IDE incluant ces trois outils. Visual Studio .NET
Page 7

Visual C++ 2005 Express Borland C++ Builder Code::Blocks Dev C++ Eclipse + CDT etc.

Pour ce cours, nous allons utiliser le compilateur gratuit du domaine public le plus rcent g++. Comme IDE nous optons pour Code::Blocks incluant entre autre ce compilateur. Il est galement gratuit et disponible pour la plupart des systmes d'exploitation (Linux, Macintosh, Windows). La figure suivante inclut toutes les commandes ncessaires (variantes) pour compiler un code.

Page 8

Chapitres II. Identificateurs, types et variables


Les lments du langage Pour crire un texte dans une langue dfinie, il est indispensable de connatre les symboles ncessaires la formation des mots et des phrases. Pour crire un programme en C++ les caractres suivants sont autoriss. - les majuscules - les minuscules - les caractres spciaux - les chiffres - les caractres invisibles (retour chariot, saut de ligne, saut de page, tabulation) On distingue habituellement les notions suivantes : - Les commentaires - Les identificateurs - Les mots rservs - Les types primitifs - Les variables et les constantes, - etc. Exemple int main ( ) { a=2; b=3; mult= a * b ; cout << "le rsultat est : " << mult; return 0; } Les commentaires Pour faciliter linterprtation des programmes sources, il est conseill dy ajouter des commentaires. Les commentaires C++ peuvent tre placs partout, ils peuvent scrire sous la forme suivante : /* le commentaire */ // sur la mme ligne avec une instruction a = a + 1 ; // incrmentation de la variable a Les identificateurs Les identificateurs nomment les objets C++ (variables, fonctions, classes etc.). Un identificateur valide est constitu dun ou plusieurs caractres qui peuvent tre des lettres, des chiffres ou le caractre de soulignement.

Page 9

Le premier caractre doit tre constitu par une lettre ou par le caractre de soulignement. Pas despaces entre les caractres dun identificateur. Les identificateurs qui contiennent un double soulign ou bien qui commencent par un soulign suivi par une lettre en majuscule sont rservs pour tre utiliss par le systme. Exemple

N.B. Un identificateur peut-tre arbitrairement trs long mais certains compilateurs ne vont distinguer que les 31 premiers caractres. Mots cls rservs - Un identificateur ne peut-tre un mot cl rserv du langage. Les mots cls du C++ sont :

Certains de ces mots cls proviennent du langage C. Dautres ont t repris par le langage Java. Types primitifs Un type de donne dfinit la taille de la mmoire occupe et la forme de sa mmorisation. La taille dpend du systme dexploitation et de la version du compilateur. Pour connatre la taille dun type, on utilise la fonction sizeof(). Par exemple sizeof(int) indique la taille dun type entier. Le tableau suivant indique titre dexemple la taille et lintervalle pour certains types de donnes trs utiliss. Type char unsigned char int unsigned int short unsigned short long Taille 1 octet 1 octet 4 octet 4 octet 2 octet 2 octet 4 octet Valeurs -128 127 0 255 -32768 32767 0 65535 -32768 32767 0 65535 -2147483648 + 2147483647
Page 10

unsigned long float double long double

4 octet 4 octet 8 octet 10 octet

0 4294967295 3.4 10-38 3.4 10+38 1.7 10-308 1.7 10+308 1.2 10-4932 1.2 10+4932

Les types primitifs disponibles dj en C sont utilisables en C++. - Les donnes peuvent tre : 1. un nombre entier, 2. un rel, 3. un boolen, 4. un caractre, 5. une chane de caractres. Nombre entier - Dcimal, octal ou hexadcimal. - Un prfixe permet de prciser la base : 0X ou 0x pour un entier hexadcimal, 0 pour un octal, rien pour un dcimal. - Ce nombre peut avoir aussi un suffixe, une combinaison des lettres U (ou u) et L (ou l). U pour unsigned non sign et L Long pour long. - Si un nombre entier est cod sur 2 bits dont le bit le plus lev est le bit de signe, on ne peut avoir pour cette reprsentation que les nombres entiers suivants : -1 (11), -0 (10), +0 (00) et 1 (01). - Si un nombre entier est non sign, le bit le plus lev ne sert plus le signe puisque tous les nombres sont des entiers positifs. Ce bit va permettre de reprsenter encore plus de nombres. Nous aurons ainsi, toujours pour un entier cod sur 2 bits, les nombres suivants : 0 (00), 1 (01), 2 (10) et 3 (11). - La reprsentation Long signifie que nous allons coder les nombres en utilisant plus de prcision (donc plus de bits).

Nombre Rel - Un nombre reprsent en virgule flottante et peut avoir un de ces types : 1. Float : pour une reprsentation en simple prcision. 2. Double : pour une reprsentation en double prcision. 3. Long double : pour une reprsentation prcision tendue.

Boolen
Page 11

- Une constante du type bool qui peut prendre les valeurs true pour vraie et false pour faux.

Caractre - Un caractre est gnralement crit entre apostrophes. - Le type utilis pour le reprsenter est char . - Par exemple, le caractre a peut tre exprim sous lune des formes suivantes : 'a', char (97), '\0141','\x61'. - Quelques caractres de contrle ncessitent lutilisation dune forme symbolique. Cette forme est reprsente par \ . Par exemple '\t' signifie une tabulation, '\?' pour reprsenter un point dinterrogation. - Un caractre a une valeur gale la valeur numrique du caractre dans le code caractre de la machine. Si le code Ascii est utilis, la valeur numrique de a est 97 alors que celle de A est 65. - Un caractre est reprsent sur 1 octet. Dans ce cas, sa valeur numrique sera entre 0 et 127. - Un caractre peut-tre reprsent aussi dune manire non signe. Dans ce cas, sa valeur numrique sera comprise entre 0 et 255. Ici, on parle dune table Ascii tendue. Chane de caractres - Elle est constitue dune srie de caractres. - Elle est dlimite par les guillemets " . - Les constantes chanes de caractres sont stockes en zone de mmoire permanente. - Elles sont considres comme un tableau dont la taille est la longueur de la chane plus 1. Ce 1 en plus, cest le caractre nul \0 plac la fin de la chane.

Dclaration et dfinition - Pour pouvoir utiliser un identificateur, un compilateur doit savoir quoi correspond cet identificateur : un type donn, un nom de variable, un nom de fonction ou toute autre chose. - Une dclaration informe le compilateur sur la nature exacte de lidentificateur. - Une dfinition est associe un espace mmoire, une valeur, un corps ou le contenu dune dclaration. - La diffrence entre une dclaration et une dfinition est que la premire fournit le nom et le type de lidentificateur alors que la seconde une vue matrielle de lidentificateur. Les variables Une variable est un emplacement de mmoire dun ou de plusieurs octets qui permet de stocker des valeurs. Chaque variable possde : - Un type - Une valeur - Une adresse - Un nom

Page 12

Dclaration dune variable type nom_de_variable [ = valeur ] Exemple int x; x = 12 ; Une variable possde un nom unique et doit tre dclare avant dtre utilise. Syntaxe :

- Pour une variable les notions de dclaration et de dfinition se confondent. - Une variable peut tre dclare nimporte quel emplacement du programme (cest aussi le cas en Java mais pas en C). - Une variable peut-tre initialise au moment de sa dclaration. - Une variable peut-tre utilise sans tre pralablement initialise (ce serait une erreur en Java). - On peut dcaler son initialisation plus loin dans le programme. - Une variable peut-tre initialise aussi avec la valeur dune expression.

Les constantes Ce sont des lments qui ne changent pas de valeur durant lexcution du programme. Pour les dclarer on doit utiliser le mot cl const Syntaxe de dclaration const Exemple const int x = 2 ; type nom = valeur ;

Page 13

Chapitres III. Oprateurs, expressions et conversions


Expressions - Une expression est la composition doprateurs, de variables, de constantes, de fonctions et de parenthses. - Une expression retourne toujours un rsultat, sa valeur. - La valeur de lexpression a un type et, elle peut-tre utilise dans une autre expression Dans cet exemple :

Oprateurs Un oprateur reprsente une opration effectue sur un ou deux oprandes. Le langage C++ est riche en oprateurs. Il existe cinq types doprateurs : - Les oprateurs arithmtiques - Les oprateurs de comparaison - Les oprateurs logiques - Les oprateurs daffectation - Les oprateurs dincrmentation et de dcrmentation

Page 14

Oprateurs arithmtiques

- Le symbole % reprsente loprateur modulo. - Il fournit le reste de la division entire de son premier oprande par son second. - Remarque : la division entire nest ralise que sur des nombres entiers.

Oprateurs de manipulation de bits

Page 15

Oprateurs dincrment et de dcrment - Les oprateurs dincrmentation ou dcrmentation sont placs soit avant (pr) soit aprs (post) la variable.

- Pr : Lincrmentation/dcrmentation est effectue puis la variable est utilise. - Post : Lutilisation de la variable est effectue avant lincrmentation/dcrmentation.

Exemple. a = 1, b = 0 a = 1, b = 0 a = 1, b = 0 a = 1, b = 0 b = ++a b = --a b = a++ b = a-a=2,b=2 a=0,b=0 a=2,b=1 a=0,b=1

Oprateurs daffectation - Llment gauche du = se voit affecter la valeur retourne par lexpression de droite. - Les conversions ventuelles sont prises en considration lors de laffectation.

Page 16

Oprateurs relationnels et boolens - Le rsultat de la comparaison de deux expressions vaut : -false (0) si le rsultat de la comparaison est FAUX. - true (1) si le rsultat de la comparaison est VRAI.

- Une expression est vraie si elle est non nulle. - Une expression est fausse si elle est gale zro.

Oprateur de squence - Loprateur de squence est reprsent par le symbole , . - Il est le moins prioritaire dans la table des oprateurs. - Il permet dvaluer les diffrentes oprations dans lordre. - Dans une liste dexpressions spares par , , chaque expression est value en premier avant de passer la suivante qui se trouve sa droite.

Oprateur conditionnel - Il est appel aussi oprateur ternaire. - Il prend comme oprandes 3 expressions. - La syntaxe de loprateur conditionnel est comme suit :
Page 17

- expression1 est value en premier. - Si expression1 est vraie alors : expression2 est value. Le rsultat est celui fourni par expression2 - Si expression1 est fausse alors : expression3 est value. Le rsultat est fourni par expression3 .

Oprateur de taille - Loprateur de taille est reprsent par le mot cl rserv sizeof . - Il permet de dterminer la taille en octets dune variable ou dun type ou dune expression. - Cette taille est calcule en fonction de larchitecture interne de la machine.

Conversions - Le langage C++ a deux types de conversion: implicite et explicite.

Conversions implicites - Les conversions implicites peuvent avoir lieu dans le calcul dune expression quand on passe directement un argument une fonction ou lors du retour dune valeur par une fonction. - Ces conversions implicites facilitent la tche du programmeur. - Cependant elles risquent dtre potentiellement dangereuses si lon ne garde pas un il ouvert. - En effet, elles peuvent gnrer des bogues lors de lexcution dun programme. Des bogues qui sont parfois difficiles cerner pour le commun des mortels ! - Les rgles de conversion sont comme suit : o Si loprande est du type char , short ou bool elle est convertie en int . o Si loprande est un nombre entier tellement grand que lon ne peut pas reprsenter par un int , il sera reprsent par un unsigned int o Aprs ces deux premires tapes de conversion, si une expression contient un ensemble de types diffrents, la hirarchie suivre lors de la conversion est comme suit int < unsigned < long < unsigned long < float < double < long double.
Page 18

Loprande, ayant un type moins lev dans la hirarchie, est promue un type plus lev et lexpression rcupre ce type. Conversions explicites - On peut demander explicitement une conversion dun oprande dans un type dsir. - Cette opration sappelle casting ou transtypage . - Les rgles de forage de conversion de type du langage C peuvent tre utilises aussi en C++.

- 4 nouveaux oprateurs ont t introduits en C++, pour forcer la conversion de type.

Page 19

Chapitre IV : Entre/Sorties en C++


La bibliothque iostream offre deux oprateurs surchargs de manire approprie pour les flux: Loprateur d'insertion << (criture) Loprateur d'extraction >> (lecture) 1- le flux de sortie cout Sortir des donnes laide dun flux nest pas trs difficile. La syntaxe scrit sous la forme : cout << donnes; cout : le flux de sortie << : Loprateur de transfert donnes : les donnes a afficher qui sont de type ( int, char, char *, float )

chanage

Si vous avez plusieurs variables a afficher. Vous pouvez utiliser autant dinstructions de sortie que de variables afficher, ou vous pouvez lcrire dans une mme instruction. Par exemple cout << 123456; cout << \n; cout << 1.23456; ou on peut les chaner dans une mme instruction cout << 123456 << \n << 1.23456; Mise en forme de la sortie Vous pouvez choisir le format des sorties que vous voulez laide des fonctions prdfinies de la bibliothque iostream, appeles manipulateurs. Il ya deux types de manipulateurs, manipulateurs avec paramtres et sans paramtres.

Remarque : pour utiliser un manipulateur, il suffit dcrire son nom avant la valeur afficher en ajoutant comme sparateur un nouvel exemplaire de loprateur de transfert (<<).

Page 20

Exemple

Manipulateur dec Oct Hex setprecision(nombre) setw(nombre) setfill(caractere)

Formatage Base de numrotation dcimale Base de numrotation octale

Librairie iostream iostream

Base de numrotation hexadcimale iostream Prcision en virgule flottante Largeur minimale daffichage Le caractre de remplissage iomanip iomanip iomanip

2. Le flux dentre cin Le flux dentre cin conduit les donnes tapes au clavier vers votre programme (en mmoire). Le cin commence la lecture aprs la touche Enter (le retour chariot). Syntaxe : cin >> variable cin : mot cl qui le nom du flux dentre >> : oprateur de transfert variable : nom de la case mmoire qui vas recevoir la valeur entre. Chanage Si vous avez plusieurs variables a lire. Vous pouvez utiliser autant dinstructions de lecture que de variables a lire, ou vous pouvez lcrire dans une mme instruction. Par exemple cin >> i; cin >> c; cin >> d; ou on peut les chaner dans une mme instruction : cin >> i >> c >> d; il suffit de sparer les diffrentes saisies, par des caractres despacement :espace, tabulation, ou saut de ligne ( Enter ).
Page 21

Chapitre V : Structures de contrle


Gnralits Matrisant la construction d'expressions, nous pouvons aborder les instructions. Une instruction peut revtir diffrentes formes. On distingue les instructions simples, les instructions de saut, les instructions composes, les instructions alternatives et les instructions rptitives. Instructions simples Pour former une instruction simple, il suffit de suffixer une expression par un point-virgule ";". Les exemples suivants sont des instructions simples en C++ : X = X + Y; X--; X -= Y, Y++; Instructions de saut Une instruction de saut provoque une rupture inconditionnelle dans l'excution squentielle des instructions d'un programme et ont leur utilit dans les structures de contrle, nous y reviendrons plus tard. Instructions composes Les instructions composes, encore appeles blocs, regroupent des dclarations et des instructions et sont dlimites par des accolades "{" et "}". La syntaxe exige que les dclarations soient regroupes au dbut du bloc, elles ne peuvent donc tre mlanges avec les instructions du bloc. Exemple { double pi = 3.1415; circonference = 2 * pi * rayon; } Instructions alternatives Les instructions de contrle sont un des lments qui font que le langage C++ appartient la catgorie des langages de programmation de haut niveau. Linstruction IF simple : L'expression est value. Si elle est diffrente de zro (en d'autres termes si elle est "vraie"), l'instruction ou le bloc dinstructions aprs le if est excut. 1) lalgorithme: si (expression) instruction; ou bien

Page 22

si (expression) { instruction1; instruction2; . . . instructionn; } 2) le programme en C++ IF (expression) instruction; ou bien if (expression) { instruction1; instruction2; . . instructionn; }

Linstruction If else : L'expression est value. Si elle est diffrente de zro (en d'autres termes si elle est "vraie"), l'instruction instruction1 est excute, sinon, l'instruction instruction2 est excute. lalgorithme: si (expression) { instruction1; instruction2; . . . instructionn; } sinon { instruction1; instruction2; . . . instructionn; }

Page 23

Le programme en C++ if (expression) { instruction1; instruction2; . . . instructionn; } else { instruction1; instruction2; . . . instructionn; } L'exemple suivant illustre l'alternative simple : if (delta >= 0) { x1 = (-b + sqrt (delta)) / (2 * a); x2 = (-b - sqrt (delta)) / (2 * a); cout <<"solutions : =<< x1 << x2 << endl; } else cout <<"pas de solution\n";

Les tests imbriqus If else if . else : Parfois, on a des cas plus nuancs traiter. On peut alors recourir aux alternatives imbriques qui ont la forme : algorithme si (expression1) { instructions; } sinon si (expressioni) { instructions; } sinon { instruction1;
Page 24

programme if (expression1) { instructions; } else if (expressioni) { instructions; } else { instruction1; } exemple : if (delta > 0) { x1 = (-b + sqrt (delta)) / (2 * a); x2 = (-b - sqrt (delta)) / (2 * a); cout <<"solutions =" << x1 << x2 << endl; } else if (delta == 0) { x = (-b + sqrt (delta)) / (2 * a); cout <<"solution x = " << x << endl; } else cout <<"pas de solution\n"; Il ne faut pas confondre entre lexemple suivant : if (delta > 0) { x1 = (-b + sqrt (delta)) / (2 * a); x2 = (-b - sqrt (delta)) / (2 * a); cout <<"solutions = " << x1 << x2 << endl; } if (0 == delta) { x = (-b + sqrt (delta)) / (2 * a); cout <<"solution x = " << x << endl; } else cout << "pas de solution\n";
Page 25

Linstruction switch Le dernier type d'alternative que l'on trouve en C++ est le choix multiple, encore appel instruction d'aiguillage. Elle opre un choix parmi un nombre quelconque de propositions; elle de ce point de vue comparable une instruction if .. else imbrique. Chaque bloc doit se terminer par un break afin de quitter le bloc. Forme algorithmique Cas ou (expression) { cas valeur1 : bloc1; [break;] cas valeur2 : bloc2; [break;] ... ... ... cas valeurn : blocn; [break;] [default : bloc default;] } Programmation switch (expression) { case valeur1 : bloc1; [break;] case valeur2 : bloc2; [break;] ... ... ... case valeurn : blocn; [break;] [default : bloc default;] } Remarque

L'expression doit tre de type caractre ou entier. Toutes les expressions constantes associes aux tiquettes case doivent tre de type caractre ou entier et doivent avoir des valeurs diffrentes.
Page 26

Il ne peut y avoir qu'une seule instruction tiquete default Si un choix multiple est imbriqu dans un autre, ses instructions tiquetes case peuvent bien sr utiliser les mmes valeurs constantes que le choix multiple englobant et il peut bien videmment avoir sa propre instruction tiquete default. Le choix multiple provoque l'valuation de l'expression et le saut l'instruction tiquete case dont la valeur constante associe est identique celle de l'expression value. Si aucune valeur constante ne correspond, le choix multiple provoque le saut l'instruction tiquete default. S'il n'y a pas d'instruction tiquete dans le choix multiple, il est sans effet. Lorsque l'instruction associe l'tiquette case a t excute, l'excution continue avec l'instruction qui suit cette instruction tiquete. Pour sortir du bloc on utilise l'instruction break qui provoque un saut l'extrieur de la structure de contrle. L'exemple suivant illustre ceci :

switch (sexe) { case 'm' : cout <<"Bonjour Monsieur."; break; case 'f' : cout <<"Bonjour Madame."; break; default : cout <<"Bonjour."; } Cas multiples Une tiquette case ne doit pas obligatoirement tre suivie d`instructions, vous pouvez donc attribuer les mmes instructions a plusieurs tiquettes. Syntaxes : switch (expression) { case valeur1 : case valeur2 : case valeur3 : bloc dinstruction; [break;] case valeur4 : bloc4; [break;] [default : bloc default;] }

Page 27

Exemple : switch (chiffre) { case 0 : case 2 : case 4 : case 6 : case 8 : cout <<le nombre est pair \n; break; case 1 : case 3 : case 5 : case 7 : case 9 : cout <<le nombre est impair \n; } Instructions rptitives La ncessit dexcuter certaines tapes de travail plusieurs fois la suite simpose trs souvent lors du dveloppement dun programme. Par exemple on veut crire un programme qui compte jusqu' 100 et affiche chaque valeur compte.

soit on crit 100 instructions lune la suite de lautre pour afficher chaque valeur compte. Soit on crit une seule instruction qui affiche lintrieur dune structure rptitive ou boucle. 1-) while (expression logique) instruction; 2-) do instruction; while (expression logique) 3-) for (initialisation; expression logique; reinitialisation) instruction;

Il existe trois structures rptitives en C++ :

Dans toutes ces structures, l'instruction, appele corps de boucle, est excute jusqu' ce que l'expression logique, appele condition de maintien dans la boucle, devienne vraie. Les instructions while et do while correspondent tout fait des constructions que l'on peut trouver dans d'autres langages. L'instruction for cependant est un peu particulire. 1-) linstruction while Cest une instruction qui rpte un certain travail selon une condition.L'instruction while value d'abord l'expression logique avant d'excuter l'instruction. L'exemple suivant pourrait servir au calcul de la factorielle d'un entier positif n : Cin >> n; while ( n > 0 ) fact = fact * n--;

Page 28

1) lalgorithme tant que ( expression logique ) { instruction (s); } 2) programme while ( expressiom logique ) { instruction (s); } Exemple.

2-) linstruction do while l'instruction do while, par contre, excute d'abord l'instruction avant d'valuer l'expression logique. L'exemple suivant lit une squence d'entiers jusqu'au premier entier ngatif : Do { cout <<" donnez une valeur " << endl; cin >> n; } while ( n >= 0 );
Page 29

1) lalgorithme faire { instruction (s); } tant que ( condition logique); 2) programme do { instruction (s); } while ( expressiom logique ); Exemple Som = 0; I = 1; Do { som += i; i++; } while ( n >= 0 ); cout <<" la somme totale = " << som << endl;

3-) linstruction for Enfin, comme nous l'avons signal, l'instruction for est assez particulire. La smantique du for est quivalente celle de la squence d'instructions suivante : for (initialisation; expr. logique; reinitialisation) { instruction(s); }

Page 30

1) lalgorithme pour (initialisation; expr. logique; reinitialisation) { instruction(s); } 2) programme for (initialisation; expr. logique; reinitialisation) { instruction(s); } Exemple for (somme = 0, i = 1; i <= 100; i++) { cin >> n; somme += n; } Remarque - En C++, on peut dclarer des variables dans la partie initialisation . - La visibilit de ces variables sera le bloc for dlimit par { } .

4-) instructions de saut L'instruction associe aux structures rptitives peut contenir les instructions de saut break et continue. Le break, comme dans le cas du choix multiple, provoque tout simplement un saut l'extrieur de la structure rptitive tant disque le continue provoque un saut la fin de l'instruction. Le morceau de programme suivant cumule au maximum 100 entiers qu'on a lus sur le fichier standard d'entre jusqu'au moment o l'on lit un entier ngatif ou nul auquel cas on arrte le traitement rptitif prmaturment : for (somme = 0, i = 1; i <= 100; i++) {
Page 31

cin >> n; if (n <= 0) continue; somme += n; } Dans le morceau de programme suivant, on fait presque la mme chose. La seule diffrence est qu'on continue le traitement rptitif mais sans cumuler la valeur ngative ou nulle: for (somme = 0, i = 1; i <= 100; i++) { cin >> n; if (n < =0) continue; somme += n; }

Porte (visibilit) des variables


En C++ il y a plusieurs catgories de visibilit : fichier, fonction, bloc, classe, prototype de la fonction, espace de nom. - Visibilit au niveau du fichier : la porte de la variable stend de lendroit o elle a t dclare dans le fichier jusqu la fin de ce fichier. Cette possibilit nest offerte que dans les langages C et C++ puisque Java est un langage pur objet. La variable est appele dans ce cas variable globale car sa porte est globale. - Visibilit bloc : la dure de vie dune variable est celle du bloc o elle a t dclare sauf dans le cas dune variable globale. Exemple 1.

Exemple 2. Attention aussi aux dclarations dans les instructions de contrle

Page 32

Exemple 3.

En sortie: i du main vaut avant: 500 i boucle vaut: 0 i du main vaut aprs: 500 Il est impossible d'afficher la valeur de la variable i de la mthode main partir de la boucle for.

Page 33

Exemple 4.

En sortie: i du main vaut avant: 500 i en dehors du main vaut avant: 1000 i boucle vaut: 0 i du main vaut apres: 500 i en dehors du main vaut apres: 1000 - Le symbole :: dsigne l'oprateur unaire de rsolution de porte. On lappelle aussi l'oprateur de visibilit (scope qualifier operator). Dans cet exemple, :: fait rfrence l'espace de nom anonyme (qui ne porte pas de nom).

Page 34

Chapitre VI. Fonctions


Gnralits Pour dcomposer un programme complexe en plusieurs programmes plus lmentaires, on a le plus souvent recours la notion de sous-routine ou fonction. Les fonctions C/C++ sont des sections de programme qui remplissent une tache partielle du programme global. Chacune de ces fonctions possde un nom par lequel il sera facile de lancer son excution. Ce chapitre se propose de discuter les problmes du passage des paramtres aux fonctions en C/C++ et du retour d'un rsultat vers la fonction appelante. 1-Dclaration des fonctions Avant dutiliser une fonction il faut la dclarer. Une dclaration de fonction est instruction qui contient des informations sur les caractristiques de cette fonction. Il sagit du nom de la fonction, de la description de ses paramtres et de sa valeur de retour et elle se termine par un point-virgule. La dclaration de fonction est la dfinition de son prototype (entte). Syntaxe Type_de_valeur_de_retour nomn ] ); nom_de_la_fonction ( [ type1 nom1 ], [ type2 nom2 ], , [ typen

Remarque: Ce qui figure entre crochets est facultatif. Exemple int somme( int a, int b); void somme( int a, int b ); 2-Dfinition des fonctions La dfinition se fait comme suit : type_de_retour { nom ( [ type1 nom1 ], [ type2 nom2 ], , [ typen nomn ] )

les instructions; }

Page 35

Exemple void somme ( int a, int b) { int s; s = a + b; cout<< somme est : <<s<<endl; }

3-Appel de fonction La syntaxe dappel de fonction, est relativement simple : elle se constitue du nom de la fonction et de la liste des paramtres qui lui sont transmis pour traitement. Syntaxe : Nom_de_la_fonction ( [par1], [par2], , [parn] ); Exemple. Somme( 5, 4 ); Remarque. - Le prototype est facultatif en C mais OBLIGATOIRE en C++, - Une fonction doit tre dclare avant d'tre appele.

Page 36

- Les deux prcdentes critures reviennent dire la mme chose. - Le compilateur dans tous les cas ignore le nom des variables dans la dclaration dune fonction. -Lappel dune fonction se fait en donnant son nom puis les valeurs de ses paramtres entre parenthses. - On peut galement crire le prototype et dfinition en mme temps

4- valeur de retour dune fonction : return 4-1 fonction sans valeur de retour La sortie d'une fonction est effectue avec l'instruction de saut return. Dans le cas des fonctions sans rsultat, c'est--dire des fonctions de type void, l'instruction return est utilise isolment (on pourra lomettre) comme dans l'exemple suivant : void somme(int a, int b) { int s; s=a + b; cout<<"la somme de a et b : "<<endl; [return;] } 4-2 fonction avec valeur de retour Dans le cas d'une fonction avec rsultat, l'instruction return s'utilise avec une expression. Le type de cette expression doit ncessairement correspondre au type dclar de la fonction. Ceci est illustr par la fonction suivante qui calcule la somme de deux valeurs int : int somme( int a, int b) {
Page 37

int s; s = a + b; return s; } On peut dclarer une fonction sans spcifier le type du rsultat. Le type par dfaut est le type int. 4-3 paramtres par dfaut Le nombre de paramtres rels ne doit obligatoirement correspondre celui des paramtres formels, il peut tre plus petit ou plus grand. Ici nous examinons les fonctions auxquelles il est possible de transmettre moins de paramtres rels qu`elle ne dispose de paramtres formels. Le C/C++ nous permet de donner une valeur par dfaut un paramtre formel sil na pas de paramtre rel correspondant. La spcification des paramtres par dfaut se ralise avant lappel de la fonction, dans la liste des paramtres formels, donc dans len-tte de la fonction. Exemple int somme( int a = 2, int b = 1) { int s; s = a + b; return s; } /****** lappel ******/ somme ( 5, 6 ); ou somme ( ); ou somme( 5 );

4-1 Fonction sans paramtres (arguments) - Une fonction sans arguments restera sans type

Remarque. - En C par dfaut retourne un int si on lignore. - En C++ dclaration du type de la valeur retourne est OBLIGATOIRE,

5. Surdfinition de fonctions - Un nom (de fonction, d'oprateur, etc.) est surdfini s'il dsigne plus d'une chose la fois. - 5/2 division entire (2, et le reste est perdu) - 5.0/2.0 division relle (2.5) - Loprateur / a un double rle: la division des nombres entiers et des nombres rels. - En C++, on peut dfinir diffrentes fonctions ayant le mme nom mais le nombre et le type de paramtres sont diffrents.
Page 38

- Le compilateur recherche la meilleure correspondance possible. - S'il y a plusieurs arguments, le compilateur essaye chacun sparment. - Le compilateur signale une erreur de compilation si aucune fonction ne convient ou bien si plusieurs fonctions conviennent. Donc, il y a plusieurs choix possibles (ambigut) dans celles-ci.

Page 39

- Pour un seul argument, le compilateur essaie dans l'ordre: - Correspondance exacte de types. - Promotion numrique

6. Fonctions inline (en ligne) #define est utilis pour la substitution de texte. - Une autre utilit du #define est la dfinition de macros. - Une macro est une pseudo fonction substitue dans tout le programme pendant le prtraitement (prprocesseur) avant la compilation. - Elle vite le cot d'un appel de fonction en contrepartie le code excutable devient plus volumineux.

Page 40

Chapitre VII. Tableaux & pointeurs


Gnralits Ce chapitre dcrit les mcanismes de composition de types dont le programmeur dispose en C/C++. Nous discutons plus particulirement les tableaux, les chaines de caractres et les pointeurs. Nous avons vu qu'un dveloppeur C/C++ tait amen manipuler des objets de type caractre, entier ou rel dans ses programmes. Ces types sont des types prdfinis du langage. Le langage C/C++ intgre cependant des mcanismes offrant au dveloppeur la possibilit de dfinir de nouveaux types, sur base des types prdfinis. Ces nouveaux types doivent permettre au programmeur de mieux rendre compte, dans son programme, du problme concret qu'il a rsoudre. 1-Tableaux unidimensionnel Un deuxime mcanisme de composition de types est la dfinition de tableaux. Un tableau est un ensemble fini d'lments de mme type pour lesquels un espace contigu est allou en mmoire centrale. La taille dun tableau (en octects) depend du type des objets destins y etre stocks.

1-2- Dclaration dun tableau unidimensionnel

Pour dclarer un tableau unidimensionnel en C/C++, on utilise les crochets "[" et "]" et on indique le type des lments du tableau, son nom et ainsi que sa taille. Par exemple, dans les dclarations suivantes : Int tab [ 6 ]; On a dclar un tableau de 6 lments de type entier. Le premier lment du tableau est dsign par tab[0], le deuxieme par tab[1] et ainsi de suite. La taille du tableau est 24 octets.

Tab[0]

tab[1]

tab[2]

tab[3]

tab[4]

tab[5]

1-3- initialisation du tableau

Au moment de la dclaration dun tableau on peut affecter des valeurs au lments de ce dernier. On indique cet ffet les valeurs initiales sous forme dune liste ( que lon place entre accolades ), spares par des virgules. Selon la regle suivante:
Page 41

Type nom_du_tableau [ nombre dlements ] = { val1, val2, val3,, valn };

Exemple. Int note [ 10 ] = { 15, 17, 09, 10, 14, 19, 16, 14, 17, 12 };

15

17

09

10

14

19

16

14

17

12

1-4- Accs aux lments dun tableau Pour manipuler les lments dun tableau, un procd permettant daccder nimporte quel lment de tableau est ncessaire qui lindexation. Pour distinguer les diffrents lments du tableau en vue dy accder, on leur attribue des dnominations uniques laide du nom du tableau et dun index cres selon le modele suivant: Nom_tableau [ index ]

Lindex doit etre une expression nombres entiers place entre crochets. Lindexation commence toujours 0. Exemple: Note [0], Note [1], Note [2], Note [3], Note [4], . , Note [8], Note [9]

1-5- adresse dun lment du tableau Au niveau de la mmoire centrale chaque lment du tableau est stoch dans une adresse fixe. Supposon que ladresse du dbut du tableau note est 3188. ladresse du 3eme lment est not comme : & note [ 2 ] = 3188 + 2 * 4 = 3188 + 8 = 3196 en gnral ladresse dun lment n est : & note [n] = adresse du debut + n * taille du type de donnes Exemple 1: soit un programme qui dclare un tableau de 10 lments de type entier, linitialise et faire la somme des lments du tableau. #include < iostream.h > void main ( ) { int tab [10] = { 2, 4, 6, 8, 10, 1, 3, 5, 7, 9}; int I, total = 0 ; for ( I = 0; I<10; I++ )
Page 42

total += tab[I]; } Exemple 2: soit un programme qui dclare un tableau de 10 lments de type entier, le remplit et laffiche par la suite. #include < iostream.h > void main ( ) { float tab [10] ; int I ; for ( I = 0; I<10; I++ ) cins >> tab[I]; /** l<affichage du tableau ***/ for ( I = 0; I<10; cout << tab[I]; } 1-6)- Le tri des lments du tableau le tri des lments de tableau seffectue selon la mthode de base appele algorithme de tri ou tri bulles. Elle consiste parcourir le tableau concern plusieurs fois du dbut la fin de la partie non trie et chaque parcours de dplacer la premiere case non trie le plus petit lment ( pour un ordre de tri croissant ) ou le plus grand lment ( pour un ordre de tri dcroissant ). I++ )

Exemple
#include < iostream.h > void main ( ) { float tab [10] ; int I ,j; /************** le remplissage du tableau *************/ for ( I = 0; I<10; I++ ) cin >> tab[I]; /***************** le tri du tableau ******************/ for ( I = 0; I<9; I++ ) for ( j = I+1; j<10; j++ )
Page 43

if ( tab[ I ] > tab[ j ]) { temp = tab[ I ]; tab[ I ] = tab[ j ]; tab[ j ] = temp; } /*********************** l affichage du tableau ****************/ for ( I = 0; I<10; I++ ) cout << tab[I]; }

2-Tableaux bidimensionnel Un tableau deux dimensions est un ensemble fini d'lments de mme type pour lesquels un espace contigu est allou en mmoire centrale. Il est considr comme un tableau une seule dimension dont chaque case est un tableau une seule dimension. La taille dun tableau deux dimensions (en octects) depend du type des objets destins y etre stocks.

2-2- Dclaration dun tableau bidimensionnel

Pour dclarer un tableau bidimensionnel en C/C++, on utilise les crochets "[" et "]" et on indique le type des lments du tableau, son nom et ainsi que sa le nombre de lignes et le nombre de colonnes. Par exemple, dans les dclarations suivantes : Int tab [ 4 ][ 6 ]; On a dclar un tableau de 4 lignes et de 6 colonnes de type entier. Le premier lment du tableau est dsign par tab[ 0 ][ 0 ], le deuxieme par tab[ 0 ][ 1 ] et ainsi de suite. La taille du tableau est ( 4*6*4 = 96) octets.

2-3- initialisation du tableau

Au moment de la dclaration dun tableau on peut affecter des valeurs au lments de ce dernier. On indique cet ffet les valeurs initiales sous forme dune serie de liste ( que lon place entre accolades ), spares par des virgules. Selon la regle suivante: Type nom_du_tableau [ lignes ][ colonnes ] = {{ val01, val2, , val0n }, {val10,val12,,val1n }, .. {valm0, valm1,, valmn} };
Page 44

Exemple:

Int

note [ 4 ][ 6 ] = { {1, 2, 3, 4, 5, 6},{ 7, 8, 9, 10, 11, 12}, { 13, 14, 15, 16, 17, 18 },{ 19, 20, 21, 22, 23, 24}} ;

2-4- Accs aux lments dun tableau deux dimensions Pour manipuler les lments dun tableau deux dimensions, un procd permettant daccder nimporte quel lment de tableau est ncessaire qui est lindexation. Pour distinguer les diffrents lments du tableau en vue dy accder, on leur attribue des dnominations uniques laide du nom du tableau, le numro de ligne et le numro de colonne selon le modele suivant: Nom_tableau [ ligne ] [ colonne ]; Exemple: int Note [4 ] [ 6 ]; Note [0][0], Note [0][1], Note[0] [2], Note[0] [3], Note[0] [4], Note [0][5] Note [1][0], Note [1][1], Note[1] [2], Note[1] [3], Note[1] [4], Note [1][5] Note [2][0], Note [2][1], Note[2] [2], Note[2] [3], Note[2] [4], Note [2][5] Note [3][0], Note [3][1], Note[3] [2], Note[3] [3], Note[3] [4], Note [2][5]

1-5- adresse dun lment du tableau Au niveau de la mmoire centrale chaque lment du tableau est stoch dans une adresse fixe. Supposon que ladresse du dbut du tableau note est 3188. ladresse du 3me lment est not comme : & note [ 2 ][3] = 3188+2*6*4 + 3 * 4 = 3188 +48+12 = 3248 en gnral ladresse dun lment n est : & note [n][m] = adresse du debut + n*m * taille du type + m*taille du type

Exemple 1: soit un programme qui dclare un tableau de 4 lignes et de 6 colonnes de type float, le remplit et laffiche par la suite. #include < iostream.h > void main ( ) { float tab [ 4 ][ 6 ] ;
Page 45

int l ,c; for ( l = 0; l<4; l++ ) for ( c = 0; c<6; c++ ) cin >> tab[ l ][ c ]; /** l<affichage du tableau ***/ for ( l = 0; l<4; l++ ) for ( c = 0; c<6; c++ ) cout << tab[ l ] [c ] ; }

3- les chaines de caracteres 3-1) Definition Avant d'exposer les fonctions sur les chanes de caractres en C, il faut tout d'abord expliciter la notion de chane de caractres. Une chane de caractres C/C++ est un tableau unidimensionnel de caractres. Par convention, la fin de la chane de caractres est indique par le caractre nul '\0'. Par consquent, une chane de caractres occupe en mmoire un espace correspondant au nombre de caractres significatifs de la chane plus un. Une chane de caractres constante est dlimite par des doubles quotes et peut contenir n'importe quel caractre sauf le caractre nul, par exemple :

"Programmeur en C/C++"

qui occupera en mmoire 21 octets, si un caractre est cod sur un octet. Il revient au programmeur de prvoir la place ncessaire pour reprsenter une chane de caractres.

3-2) Declaration dune chaine de caracteres

La dclaration d'une chane de caractres pourrait notamment se faire de la faon suivante :

char Chaine[100] = "Programmeur en C/C++"; Remarque


Page 46

On a dclar un une chaine de caracteres de 100 lments de type char. Le premier lment de la chaine est dsign par chaine[0], le deuxieme par chaine [1] et ainsi de suite.

\0

chaine [0]

chaine [1]

chaine [2]

chaine [99]

3-4) Fonctions prdfinies Le langage C intgre des fonctions prdfinies qui rpondent des besoins divers. Dans cette section, nous allons en exposer quelques-unes qui nous semblent parmi les plus importantes. Nous ne serons pas exhaustifs, le lecteur pourra se rapporter aux ouvrages de rfrence mentionns dans la bibliogrphie pour plus de dtails. Le but de cette partie n'est pas d'tre exhaustif au niveau des fonctions prdfinies du langage C. Ceci dpasserait le cadre de ce cours. Nous allons nous limiter aux fonctions essentielles. Fonctions sur les chanes de caractres La fonction strcpy permet de copier une chane source dans une chane destination. Son entte est la suivante en C :

char *strcpy (char *destination, const char *source);

Cette fonction copie les caractres de la chane source dans la chane destination, y compris le caractre nul. elle retourne destination. destination doit tre assez grand pour pouvoir contenir tous les caractres de source, aucune vrification n'tant effectue. De plus, si les deux chanes se rec ouvrent, le comportement de la fonction est indtermin. On aurait pu initialiser le tableau jeSuisUneChaine dclar prcdemment comme suit : strcpy (jeSuisUneChaine, "Programmer en C"); Il existe une version plus prudente de cette fonction, la fonction strncpy qui copie galement une chane source dans une chane destination mais avec un maximum de n caractres. Son prototype est le suivant :

char *strncpy (char *destination, const char *source, size_t n);

Page 47

le type size_t tant un type dfini dans le fichier string.h. La fonction copie n caractres de source vers destination. La copie s'arrte aprs n caractres ou lorsqu'un caractre nul est trouv dans la chane source. Si n caractres sont copis, aucun caractre nul n'est ajout destination. Si source ne contient pas n caractres, la fonction remplit destination avec des caractres nuls. destination doit tre assez grand pour pouvoir contenir n caractres, aucune vrification n'tant effectue. Si les deux chanes se recouvrent, le comportement de la fonction est indtermin. Les fonctions strcat et strncat permettent de concatner des chanes de caractres. L'entte de la fonction strcat est la suivante :

char *strcat (char *destination, const char *source);

La fonction copie la chane source la suite de la chane destination y compris le caractre nul. Le caractre nul de la chane destination originale est effac par le premier caractre de la chane source. destination doit tre assez grand pour pouvoir contenir tous les caractres de destination et source, aucune vrification n'tant effectue. De plus, si les deux chanes se recouvrent, le comportement de la fonction est indtermin. La fonction ANSI strncat copie n caractres de la chane source derrire la chane Destination :

Char *strncat (char *destination, const char *source, size_t n);

La copie s'arrte aprs n caractres ou lorsqu'un caractre nul est trouv dans la chane source. Le caractre nul de la chane destination originale est effac par le premier caractre de la chane source. strncat ajoute toujours un caractre nul derrire la chane concatne. Par consquent, destination doit tre assez grand pour pouvoir contenir tous les caractres de destination plus n+1 caractres, aucune vrification n'tant effectue. Elle retourne destination. Les fonctions strcmp et strncmp permettent de comparer des chanes de caractres. L'entte de la fonction strcmp est la suivante :

int strcmp (const char *chaine1, const char *chaine2);

La fonction compare caractre par caractre la chane chaine1 la chane chaine2. La comparaison s'arrte lorsque la fonction trouve une diffrence entre les deux chanes ou lorsqu'elle est arrive la fin des deux chanes. Le rsultat est ngatif lorsque la fonction trouve une diffrence et que, dans la paire de caractres diffrents, le caractre de chaine1 est infrieur au caractre de chaine2. Le rsultat est positif lorsque la fonction trouve une diffrence et que, dans la paire de caractres diffrents, le caractre de
Page 48

chaine1 est suprieur au caractre de chaine2. Si la fonction ne dtecte pas de diffrences entre les deux chanes, le rsultat vaut zro. La fonction ANSI strncmp procde la mme comparaison, mais sur un maximum de n caractres. Son prototype est le suivant :

int strncmp (char *chaine1, char *chaine2, size_t n);

La fonction strlen fournit la longueur d'une chane de caractres. Son prototype s'crit :

size_t strlen (const char *chaine);

La fonction retourne le nombre de caractres significatifs de chane sans compter le caractre nul. La fonction strchr et strrchr char *strchr (const char *chaine, int caractere); char *strrchr (const char *chaine, int caractere);

La function strchr recherchent la premire occurrence d'un caractre dans une chane de caractres, le caractre nul inclu. Elles retournent un pointeur sur le caractre trouv en cas de succs, sinon, elles retournent un pointeur NULL. La fonction strrchr recherchent la dernire occurrence d'un caractre dans une chane de caractres. Elles retournent un pointeur sur le caractre trouv en cas de succs, sinon, elles retournent un pointeur NULL. 3-5. Autres fonctions Signalons encore l'existence de fonctions de manipulation de caractres. Pour les utiliser, il faut inclure ctype.h en dbut de texte source : #include <ctype.h>

Nous nous contenterons de les numrer :


isalnum vrifie si le caractre est un caractre alphanumrique (une lettre ou un chiffre). isalpha vrifie si le caractre est un caractre alphabtique (une lettre). iscntrl vrifie si le caractre est un caractre de contrle (un caractre non imprimable).
Page 49

isdigit vrifie si le caractre est un chiffre. isgraph vrifie si le caractre est un caractre imprimable ( l'exception du caractre blanc). islower vrifie si le caractre est une lettre minuscule. isprint vrifie si le caractre est un caractre imprimable (y compris le caractre blanc). ispunct vrifie si le caractre est un caractre de ponctuation (tout caractre imprimable qui n'est pas un caractre alphanumrique, l'exception du caractre blanc). isspace vrifie si le caractre est un caractre d'espacement (blanc, saut la page, saut la ligne, retour chariot, tabulation horizontale, tabulation verticale). isupper vrifie si le caractre est une lettre majuscule. isxdigit vrifie si le caractre est un chiffre hexadcimal. tolower convertit le caractre en minuscule. toupper convertit le caractre en majuscule.

Toutes ces fonctions prennent en paramtre un entier et retournent un entier. Les fonctions de test retournent zro si le test est faux, une valeur diffrente de zro sinon. Illustrons cela par un exemple :

if (isalnum(caractere)) printf("caractere alphanumerique\n");

4. Pointeurs Les pointeurs constituent un premier mcanisme de composition de types. Une variable manipule dans un programme est stocke quelque part en mmoire centrale. Cette mmoire est un espace constitu d'lments appels octets ou encore "bytes". Chaque octet peut tre rfrenc individuellement, tant identifi de faon univoque par un numro qu'on appelle son adresse. Pour retrouver une variable stocke en mmoire, il suffit donc de connatre son adresse ou plus prcisment l'adresse de l'octet ou elle est stocke (si c'est une variable qui recouvre plusieurs octets, il suffira de connatre l'adresse du premier d'entre eux pour la retrouver). Comme ceci n'est pas un moyen facile pour faire rfrence des variables, on utilise la plupart du temps des identificateurs dans les programmes et on laisse au compilateur le soin de faire le lien entre le nom d'une variable et l'endroit o elle est stocke en mmoire. Toutefois, pour des raisons diverses, dont quelques-unes seront exposes ultrieurement dans le cours, il peut parfois tre intressant d'utiliser quand-mme l'adresse d'une variable pour y faire rfrence. L'adresse de cette variable devient ainsi une valeur qu'on manipule dans un programme au mme titre que d'autres valeurs entires, relles etc.. On manipule donc un objet d'un type nouveau qui n'est ni un caractre, ni un entier ni un rel mais qui est un objet dont la valeur est l'adresse d'un autre objet en mmoire centrale. Un tel objet est appel un pointeur. On imagine tout de suite certaines oprations de base indispensables, savoir :

ayant un objet, on voudrait connatre son adresse ; ayant une adresse, on voudrait savoir ce qui est stock en mmoire cette adresse.

En C++, toutes ces fonctionnalits existent.


Page 50

1) dclaration dun pointeur Pour dclarer un objet de type pointeur, on utilise le symbole "*" et on indique le type des objets dont le pointeur pourra contenir l'adresse. Par exemple, dans les dclarations suivantes : Char *pc; Int *pi; On pourrait se demander ici pourquoi il est ncessaire d'indiquer le type des objets dont un pointeur pourra contenir l'adresse. Finalement, il n'y a aucune diffrence fondamentale entre l'adresse d'un caractre et celle d'un entier. Dans les deux cas, il s'agit d'un numro d'octet en mmoire centrale. De tels numros peuvent toujours tre reprsents avec le mme format interne quels que soient les objets auxquels ils renvoient, tout au plus pourront-ils varier en fonction de l'architecture matrielle des machines (bus d'adresse sur 16, 32 voire 64 bits). En effet, le problme ne se pose pas au niveau de la reprsentation interne de la valeur d'un pointeur mais au niveau de l'interprtation du contenu de la mmoire l'endroit o il pointe. En d'autres termes, ayant une adresse prcise en mmoire, encore fautil savoir ce qu'on espre y trouver. Si, par exemple, on s'attend y trouver un caractre, il ne faudra prendre en compte que le seul octet se trouvant cette adresse. Par contre, si on s'attend y trouver un entier, il faudra non seulement prendre en compte l'octet se trouvant cette adresse mais, dans un environnement ou un entier serait reprsent sur 32 bits, galement les trois octets suivants, les quatre formant alors l'entier point. 2) initialisation dun pointeur pour initialiser un pointeur on utilise loprateur dadresse &. Par exemple int x; int *pt; x = 5; pt = &x; /* pt contient ladresse de x */ 3) utilisation dun pointeur pour faire rfrence une variable en utilisant son pointeur, il faut prcder le pointeur par loprateur dindirection *. Exemple int x=5, *pt; pt = &x; /* pt contient ladresse de x */ cout << *pt << endl; /* elle affiche la valeur 5 */ 4) les tableaux et pointeurs on peut parcourir un tableau en utilisant un pointeur. Exemple #include < iostream.h > void main ( ) { int tab [ 4 ], *pt ;
Page 51

int l; pt = &tab [0]; for ( l = 0; l<4; l++ ) cin >> *(pt + l); /** laffichage du tableau ***/ for ( l = 0; l<4; l++ ) cout << *(pt + l) ; } 5) le tri dun tableau avec un pointeur void main ( ) { int tab [10], *pt ; int I ,j; pt = & tab[0]; for ( I = 0; I<9; I++ ) for ( j = I+1; j<10; j++ ) if ( *(pt + I)] > *(pt + j) { temp = *(pt + I); *(pt + I) = *(pt + j); *(pt + j) = temp; } }

4- Passage de paramtres dune fonction - Pour rappel, il y a 2 types de paramtres: o paramtres rels: dans l'appel de fonction o paramtres formels: dans l'entte de la fonction - En C++, 3 types de passage de paramtres: o Par valeur (existe aussi dans les langages C) o Par adresse (existe aussi dans le langage C) o Par rfrence (uniquement dans les langages C++)

Page 52

4-1 Passage de paramtres par valeur

4-2 paramtres par adresses

Page 53

4-3 paramtres par rfrences - En C++ le compilateur peut se charger lui mme de la gestion des adresses. - Le paramtre formel est un alias de l'emplacement mmoire du paramtre rel.

5. Passage d'un tableau - Deux configurations possibles:

Page 54

5.1. Par pointeur

5.2. Par semi-rfrence

Page 55

Rfrences
1. Delannoy, Le langage C++ , Eyrolles Trs bon livre pour commencer le C++, livre trs pdagogique. A servi de base pour ces notes de cours. 2. Stroustrup, Le langage C++ , Addison Wesley, Pearson Education Le livre de rfrence par lauteur du C++. Complet mais beaucoup trop riche pour dbuter. 3. Scott Meyers, Le C++ efficace , Addison Wesley Des rgles pour programmer proprement et efficacement en C++. 4. Schaum, C++ cours et exercices corrigs C++ dtaill avec exemples, exercices corrigs. A servi de base pour une partie des notes de ce cours. Par contre, les classes, lhritage et les fonctions virtuelles ne sont pas assez dvelopps. 5. Johannes Weidl, The Standard Template Library Tutorial . Un tutorial sur la STL, accessible sur le Web. Pour programmeur confirm. 6. Thinking in C++ Bruce Eckel. Une version franaise gratuite de cet ouvrage est tlchargeable au lien suivant :http://bruce eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/ 7. Cours Programmation Oriente Objet avec C++, Mohamed Lokbani, accessible au lien http://www.iro.umontreal.ca/~pift1166 8. Cours Algorithmique et Langage de Programmation C++, Ahmed Bounouar, Collge Ottaouais, Gatineau, Canada

Page 56

S-ar putea să vă placă și