Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Eléments de Langage C++: Pierre Puiseux Université de Pau Et Des Pays de L'adour Département de Mathématiques

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 92

Elments de langage C++

Pierre Puiseux
Universit de Pau et des Pays de l'Adour

Dpartement de mathmatiques

Contents
1 Historique

2 Notions de base

2.1

Structure d'un programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.2

Premires instructions

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3

Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4

Compilation spare

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.5

Syntaxe, lments de base

2.6

Variables

2.7

Mots rservs

2.8

Constantes chiffres

2.9

Constantes de type caractre

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

. . . . . . . . . . . . . . . . . . . . . . . . . .

13

2.10 Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

2.11 Conversions de type

15

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.12 Dclarations de variables

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

2.13 Porte d'une variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

2.14 Dure de vie d'une variable

18

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.15 Rcapitulatif, variables globales

. . . . . . . . . . . . . . . . . . . . . . . .

19

2.16 Rcapitulatif, variables locales . . . . . . . . . . . . . . . . . . . . . . . . .

19

2.17 Tableaux

20

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Les oprateurs

21

3.1

Oprateurs arithmtiques

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.2

Oprateurs relationnels et logiques

22

. . . . . . . . . . . . . . . . . . . . . .

23

3.3

Oprateurs d'incrmentation et de dcrmentation . . . . . . . . . . . . .

24

3.4

Oprateur conditionnel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

3.5

Oprateurs d'affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

4 Les structures de contrle


4.1
4.2
4.3
4.4
4.5
4.6

if()...else . . . . .
Structure switch . . . . . . . .
Strucrures while et for
. . . .
Structure do ...while . . . . .
Instructions break et continue
Instructions goto etiquette . .

Structure

27
. . . . . . . . . . . . . . . . . . . . . . . . . . .

28

. . . . . . . . . . . . . . . . . . . . . . . . . . .

29

. . . . . . . . . . . . . . . . . . . . . . . . . . .

30

. . . . . . . . . . . . . . . . . . . . . . . . . . .

31

. . . . . . . . . . . . . . . . . . . . . . . . . . .

32

. . . . . . . . . . . . . . . . . . . . . . . . . . .

33

5 Les fonctions

34

5.1

Gnralits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

5.2

Dclaration d'une fonction (ou prototypage)

. . . . . . . . . . . . . . . .

36

5.3

Dfinition d'une fonction (ou implmentation) . . . . . . . . . . . . . . . .

37

5.4

Transmission des arguments

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

5.5

Rcursivit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

5.6

Surcharge de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

6 Les entres-sorties, les ux

41

6.1

Gnralits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

6.2

flots standards

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

6.3

Ouverture et fermeture des flots . . . . . . . . . . . . . . . . . . . . . . . .

44

6.4

Ouverture et fermeture des flots (suite) . . . . . . . . . . . . . . . . . . .

45

6.5

Ecriture : oprateur < < (insertion)

. . . . . . . . . . . . . . . . . . . . . .

46

6.6

Formatage des oprations d'criture, manipulateurs . . . . . . . . . . . .

47

6.7

Lecture : oprateur > > (extraction)

. . . . . . . . . . . . . . . . . . . . .

48

6.8

Lecture : autres mthodes disponibles . . . . . . . . . . . . . . . . . . . . .

48

6.9

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

6.10 Positionnement dans un flot en lecture . . . . . . . . . . . . . . . . . . . .

49

6.11 Autres fonctions de lecture/criture

. . . . . . . . . . . . . . . . . . . . .

50

. . . . . . . . . . . . . . . . . . . . . .

51

Etat d'un flot en lecture

6.12 Autres fonctions de gestion de flot

7 Pointeurs, rfrences, alias et tableaux

52

7.1

Dfinitions

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

7.2

Pointeurs et tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54

7.3

Chanes de caractres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

55

7.4

Tableaux multidimensionels, matrices . . . . . . . . . . . . . . . . . . . . . .

56

7.5

Remarques sur les pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . .

57

7.6

Pointeurs de fonctions

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

7.7

Allocation dynamique de mmoire

. . . . . . . . . . . . . . . . . . . . . . . .

59

8 Les classes, les objets

60

8.1

Les classes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

8.2

Les objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

8.3

Accs aux membres

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

8.4

Attributs de membres

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

8.5

Oprateur de rsolution de porte :: . . . . . . . . . . . . . . . . . . . . . .

64

8.6

Hritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

65

8.7

Constructeurs, recopie et initialisation ; destructeurs . . . . . . . . . .

66

8.8

Constructeur et hritage

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

66

8.9

Hritage multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

66

8.10 Mthodes virtuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67

8.11 Fonctions amies (friend) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9 La classe string

67

68

9.1

Constructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

69

9.2

Mthodes de la classe

. . . . . . . . . . . . . . . . . . . . . . . . . . .

70

string

10 La bibliothque standard

71

10.1 Fichiers d'en-tte standards en C


(norme ANSI) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

72

10.2 Fichiers d'en-tte spcifiques Linux . . . . . . . . . . . . . . . . . . . . . . .

73

11 C++ Notions avances

74

11.1 Polymorphisme : les templates ou patrons . . . . . . . . . . . . . . . . . . . . . . .

74

11.2 Support des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

11.3 Exceptions : exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

12 La STL (Standard Template Library)


12.1 Organisation de la STL
12.2 Le conteneur vector

77

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

13 Le prprocesseur

84

14 Premiers pas en Linux


14.1 Bref historique Linux

86
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

14.3 Arborescence sous Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

14.4 Commandes fondamentales

88

14.2 Gnralits

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14.5 Les tubes ou pipes, les redirections, les jobs


14.6 TP1

. . . . . . . . . . . . . . . . . . . . . .

91

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

1 Historique
1969

cration du systme Unix en assembleur aux laboratoires Bell (K. Thompson, D.


Ritchie)

1970

cration du langage B, rcriture d'Unix en B, par Kernighan et Ritchie

1972

dnition du C

1973

rcriture d'Unix en C version 5

1975

premire version commerciale : UNIX V6

1978

UNIX V7

1981

UNIX SYSTEM III (AT T)

1983

UNIX SYSTEM V (AT T) et UNIX 4.2 BSD (Berkeley). Premier compilateur C++
par B.Stroustrup

1988

Mise en place d'une norme C par l'ANSI, premiers compilateurs C++ pour PC

1991

(92 ?) Mise en place d'un comit de normalisation ANSI/ISO C++

1995

Edition d'une norme ISO/ANSI

2 Notions de base

2.1

Structure d'un programme

Le langage C++ contient le langage C : tout programme crit en C la norme ANSI doit pouvoir
tre compil par un compilateur C++.

C++

fait la dirence entre Majuscules et minuscules : par exemple les variables

Allo

et

allo

sont distinctes

C++ on ne parle pas de type mais de classe (la classe int, la classe char...)
C++ on ne parle pas de variables mais d'objets ou d'instances (int i=0; dclare ou instancie
objet de classe int)
En

En

un

Dans la pratique, sourtout pour les classes de base, on utilisera souvent la terminologie variable
de type xx au lieu de objet (ou instance ) de classe xx
Programme C++ = ensemble de fonctions comprenant une seule fonction

main()

(point

d'entre).

2.2

Premires instructions

Une instruction = la plus petite unit indpendante de C++, dlimite par un ; (point virgule)
une phrase du langage naturel.

#include <stdlib.h>
#include <iostream>
int main(void)
{
int age = 21; //reservation memoire pour age
float x[5]={1.0,0,0,2,-1.5};

2.3

/* Autre commentaire */
char Nom[25]="Etudiant", prenom[20] = "Lambda";
float note_partiel, note_exam, note_finale;
note_partiel = note_exam = note_finale = 0.0;
//C'est l'initialisation !
cout < < endl < < "entrer notes part et exam";
cin > > note_partiel > > note_exam;
note_finale = 0.3*note_partiel + 0.7*note_exam;//affectation
cout < < note_finale;

Compilation

Pour pouvoir etre utilis, un programme doit etre compil :

Compilation par l'instruction

>

g++ -c gourette.cxx
1. Appelle

cpp (C pr-processeur) pour traiter les lignes commenant par #.

d'un chier texte temporaire


2. Appelle

gcc (compilateur) pour traduction de tmp.c en langage machine.


gourette.o

d'un chier objet

tmp.c

Production

Production

Edition des liens (link)

>

g++ gourette.o -o artouste

edition des liens entre

gourette.o

et les direntes bibliothques systme ou autre utilises

(implicitement ou explicitement). Production d'un excutable

artouste

Raccourci : compilation + dition des liens

> g++ gourette.cxx -o artouste


.

Excution

> artouste

2.4

Compilation spare

Ces fonctions peuvent (doivent) tre rparties dans plusieurs chiers ; par exemple

chier main.cxx

#include <stdlib.h>
#include util.h
int main()
{
int i=doubler(3);
double x = tripler(0.0);//etc...
}

#include util.h
//ici des utilitaires et
//fonctions utiliss par main()
void tripler(int y)
{
cout< <endl< <3*y;
y=3*y;
};
double doubler(float x)
{
x*=2;
};

chier util.h

#ifndef UTIL_H
#define UTIL_H
void doubler(int);
void tripler(float);
#endif

chier util.cxx

Compilation

g++ -c main.cxx util.cxx

Edition des liens (link)

g++ main.o util.o -o mon_prog

Raccourci : compilation + dition des liens

g++ main.cxx util.cxx -o mon_prog

2.5

Syntaxe, lments de base

C++ fait la dirence entre Majuscules et minuscules :

par exemple les variables

Allo et allo sont

distinctes

Identicateurs : noms et types de variables, noms de fonctions, nom des constantes, nom
des macros-instructions

Mots rservs : jeu de mots cls du langage

Constantes :

Oprateurs :

Sparateurs :







+,*,-,/,%

etc...

caractres spciaux (espace, tabulation,cr/lf..)

terminaison d'instruction ou de dclaration

sparation d'lments

()

liste d'arguments ou de paramtres

[]

dimension ou indice d'un tableau

 {} bloc d'instructions, liste ou initialisation de tableau


 Commentaires : /* ceci est un commentaire (les commentaires
dits)*/

Commentaires : // ceci est un autre commentaire

imbriqus sont inter-

2.6

Variables

caractrises par :
.

un nom

un type

une classe de stockage (prcise la dure de vie, la visibilit, et l'emplacement mmoire)

le nom :
.

Squence de chires et de lettres

Premir caractre = caractre alphabtique

_ (underscore) est une lettre

direncie majuscule et minuscule

les 32 premiers caractres sont signicatifs

les mots cls ou rservs sont interdits

10

2.7

Mots rservs

int, char, short, long, double, float,


unsigned, struct, enum, union, void, signed

Types :

Classe de stockage :

Instructions :

Oprateurs :

Etiquette :

mots rservs C++ : asm, friend, virtual, class, catch, delete, inline, new,
operator, private, protected, public, template, this, throw, try.

auto, extern, static, register, typedef, const, volatile

if, else, while, do, for, switch, break, continue, goto, return
sizeof

case, default

11

2.8

Constantes chiffres
type

exemple

entier dcimal

squence de chires ne commenant pas par 0

125

entier octal

squence de chires commenant par 0

016

entier hexadcimal

squence de digits commenant par 0x ou 0X

0xFFA33

entier long

squence de digits nissant par l ou L

1450L

rel (double prcision)

squence de chires en notation dcimale

1.25

squence de chires en notation scientique

1.2E+3

rel, nissant par l ou L

1.78L

rel (long double)

12

2.9

Constantes de type caractre

1. caractre : encadr par deux apostrophes (`) exemple

`a'

2. caractre non imprimable ou squence d'chappements :

`\n'

newline

tabulation

`\t'

backspace

`\b'

.
.

antislash
NULL

`\\'

`\0'

3. chane de caractres : squence de caractres dlimite par des guillemets (double cote) ex :

"ceci est une chaine \n"

2.10
.

Une chaine de caractres se termine par le caractre

Une chane de caractres est un tableau de type caractres 1 dimension.

Types
types de base :





.
.

NULL '\0' ajout par le compilateur.

char
int

caractre (un seul caractre)

entier

float

rel, ottant

double

double prcision

modicateurs :

short, long, signed, unsigned

tailles : dpend de la machine. Pour le compilateur

gcc

(linux), on a (voir chiers limits.h

et oat.h )

Type

Taille (bits/octets)

valeurs

0. . . 255

unsigned char
char
short int
int/long
unsigned int/long
float
double
long double
L'usage du modicateur

unsigned

-128. . . 127

16

-32768. . . 32767

32

-2147483648. . . 2147483647

32

0. . . 4294967295

32/4

1.18e-38. . . 3.40e+38

68

2.23e-308. . . 1.80e+308
?

est vivement dconseill pour les indices de tableaux.

Exemple :

#include <iostream>
using namespace std;
int main(void)
{
unsigned int ui=0;
cout < <endl< <--ui;
int i=0;
13

cout < <endl< <--i;


}
$ g++ unsigned.cxx
$ ./a.out
4294967295
-1

14

2.11

Conversions de type

conversions automatiques
.

rgle de base : aprs valuation, le type du rsultat est celui de l'oprande de type le plus
lev.

exemple :

int i;
double x;
x = x+i; //i est converti (promu) en double.

La hirarchie des types est la suivante :

char,short > int > unsigned > long > double > long double < float

conversions explicites (cast)


.

pour forcer ou empcher une conversion

syntaxe :

exemple :

(type) expression

x = sqrt ((double) 23);

15

2.12

Dclarations de variables

Toute variable doit tre dclare avant son utilisation.

dclaration : permet au reste du programme de connatre l'existence et les proprits de la


variable.

allocation : rserve et alloue une place en mmoire ( la compilation ou l'excution).

la classe de stockage : dtermine l'emplacement en mmoire et la dure de vie d'une variable.


Elle est dduite de la dclaration et de l'emplacement de la dclaration.

syntaxe :

exemple :

type nom (initialisation)

int i(12);
extern double x ;
long double vect [] = {1.0L, 1.0L, 2.1L, 0.0L};

16

2.13

Porte d'une variable

la porte d'une variable est la rgion du programme o elle est connue. Elle dpend du mode et
du lieu de sa dclaration :

porte chier ou porte globale :

variables dclares en dbut de chier hors des blocs.

Elles sont connues de leur point de dclaration la n du chier.

porte prototype de fonction :

variables dclares et connues entre le nom de la fonction

et le dbut du bloc des instructions. Ce sont les arguments de la fonction. Par exemple :

(int a, int b);

porte bloc ou porte locale :

int max

commence son point de dclaration et se termine la n

du bloc englobant la dclaration.

porte fonction :

ce sont les tiquettes ou labels. Leur porte s'tend du dbut la n de

la fonction.

17

2.14

Dure de vie d'une variable

En relation troite avec la classe de stockage.

dure de vie statique :


.

mmoire alloue en dbut d'excution, dure jusqu' la n d'excution du programme.

Ce sont les variables porte chier et les variables dclares

Elles sont initialises 0.

Par dfaut, une variable porte chier a la classe

dure de vie locale :


.

extern

ou

static.

extern.

la plupart des variables que vous utiliserez sont de ce type.

mmoire alloue l'entre dans un bloc ou une fonction, dsalloue la sortie du bloc ou de
la fonction.

.
.

On parle aussi de variables automatiques.


Ce sont les variables porte bloc et les variables dclares

auto

ou

register

(registre

accs rapide; par exemple les indices de boucles).

Elles ne sont pas initialiss automatiquement.

Par dfaut les variables dclares dans un bloc ont la classe

auto.

dure de vie dynamique :


.

variables cres et dtruites par l'utilisateur.

(L'allocation se fait par les fonctions de la famille

ou bien par les oprateurs

new()

et

delete()

18

malloc()la

destruction par

free())

2.15

Rcapitulatif, variables globales

extern

extern

porte

chier

autres chiers

chier

instant d'allocation

compilation

aucune

compilation

classe de stockage

2.16

static

zone mmoire

donnes

donnes

dure de vie

le programme

le programme

initialisation

autorise

interdite

autorise

Rcapitulatif, variables locales


classe de
stockage
porte
instant
d'allocation

extern

static

auto

register

bloc

bloc

bloc

bloc

aucune

compilation

entre dans le bloc

entre dans le bloc

zone mmoire

donnes

pile

un registre

dure de vie

le programme

bloc

bloc

autorise,

autorise

0 par dfaut

sauf tableaux

initialisation

interdite

19

autorise

2.17

Tableaux

type nom [taille][...]

dclaration :

exemple :

les indices varient de 0

Pour un tableau multidimensionnel, seule la dernire dimension n'a pas besoin d'tre prcise.

pas de contrle eectu par le compilateur sur les rfrences hors limites.

double mat [10][2];


taille-1.

Initialisation : par exemple

int indice [5]={4, 8, 1, 2, 9};

d'indiquer la dimension (n=5).

.
.

Un tableau est un pointeur : dans

est un pointeur sur un

Les tableaux peuvent tre allous dynamiquement grce la fonction :

size)

double x [100]; x

dans ce cas il n'est pas ncessaire

de la bibliothque standard

et aussi par l'oprateur

<stdlib.h>

20

void *malloc(size_t

(dconseill)

new(): double*x=new double[10]

rels ( privilgier par rapport la fonction

double.

malloc)

dclare et alloue un tableau

de 10

3 Les oprateurs

21

3.1

Oprateurs arithmtiques

. +

addition :

. -

soustraction :

. *

multiplication :

. /

division :

12/4.0

. %

modulo :

a%b

a+b
x-y
2*s

est le reste de la division euclidienne de

par

b.

modulo ne s'utilise qu'avec a et b entiers les conversions de type standard s'appliquent.


vaut 0;

12%5

vaut 2.

* / %

Par ordre de priorit dcroissante :

donc

Les oprations s'eectuent de gauche droite.

a*b+c

vaut

puis

(a*b)+c.

22

+ -

12%3

3.2

Oprateurs relationnels et logiques

ont une priorit infrieure celle des oprateurs arithmtiques.

Relationnels :
. >strictement
. >=
. <

suprieur

suprieur ou gal

strictement infrieur

. <=

infrieur ou gal

. ==

gal

. !=

dirent

Le rsultat est

par exemple

1>2

(vrai) ou
vaut

(faux)

0; 0==0

vaut

1.

Logiques :
!

ngation

&&

et

||

ou

pour toute expression donnant un rsultat numrique,

if (expression!=0).

23

if (expression) est quivalent

3.3

Oprateurs d'incrmentation et de dcrmentation

l'incrmentation et la dcrmentation sont symbolises par

s'appliquent des entiers uniquement

notation postxe :

i++, i--

++

et

--

: la variable i est incrmente (dcrmente) de 1 une fois que

sa valeur a t utilise.

if (i++ != 0)

Exemple :

notation prxe :

Remarque :

i++

++i

test l'galit de

incrmente d'abord

avant de l'utiliser.

est quivalent

i = i+1;

24

0,

puis incrmente

i.

3.4

Oprateur conditionnel

expression0 ?

syntaxe :

donne le mme rsultat que

expression1 :

expression2

if (expression0)
expression1
else
expression2;
.

utilisation typique pour dnir la macro instruction (obsolete en C++)

#define max(a,b) (a>b) ?

a :

25

3.5
.

Oprateurs d'affectation
l'aectation est symbolise par



.

expression1=expression2

exemples :

i = 8 ; j = ((a >= b) && (k == 0)) ; c = getchar();

le rsultat de l'expression


.

syntaxe :

=,

exemples :

"expression1=expression2"

i = j = 0;

s'value comme

i = (j = 0);

e1 et e2 sont des expressions et si op est un


e1 = e1 op e2 est quivalent e1 op= e2.

si

exemples :

i += 2;

incrmente

de

2.

26

est la valeur de
et met

et

expression2.
j

la valeur

oprateur de l'ensemble {+,-,*,/,%} alors

4 Les structures de contrle

27

4.1
.

Structure

if()...else

syntaxe :

if (expression)
instruction1;
else
instruction2;
.

instruction simple :

if (n>0) x = a;
if (n>0)
x = a ;
else
x = b ;
.

instruction avec blocs :

if (n>0)
{
x = a;
i++;
}
else
{x = b ;}//accolades facultatives
.

instruction cas multiples :

if (n>0)
{
x = a;
i++;
}
else if (truc)
{
x = b ;
}
else
printf(i = %d,i);

28

4.2

Structure

switch

syntaxe : sur un exemple

switch
{
case
case
case

(expression_entiere)

'0' : /*rien*/;
'1' : /*rien*/;
'4' :
nb++;
break;
case  :
/*rien*/;
case '\n' : /*rien*/;
case '\t' :
nblancs++;
break;
default :
autres++;
break;

. expression_entiere
.

chaque

case

doit avoir une expression constante entire (ou caractre).

. break est facultatif.


du case suivant.
.

Lorsque

doit tre une expression entire (ou caractre) valuer.

break

S'il n'y est pas, le programme se poursuit par l'valuation de l'instruction

est rencontr, le programme eectue un branchement en dehors de la liste,

l'instruction suivante.

. default est
default.

facultatif. Si aucun des

case

n'est satisfait, il y a branchement sur le

29

label

4.3

Strucrures

while et for

syntaxe de while :
while (condition)
instruction;
.

correspond :

tant que (expression) faire


instruction
n tant que

exemples

while ((c=getchar())== || c=='\n'); //ne rien faire

syntaxe de for :
for (e1 ; e2 ; e3) instruction
.

correspond :

exexuter e1; /*initialisation*/


tant que (e2 est vrai) faire
instruction;
e3;
n tant que

exemple, initialisation d'un tableau :

for (i = 1 ; i == n; i++) x [i] = 0.0;


.

exemple, boucle innie

for(;;);

30

4.4
.

Structure

do ...while

syntaxe

do

instruction;
while (condition)
.

correspond au pseudo code :

rpter
instruction
jusqu' (non condition) (ou tant que (condition))
.

exemple : recopie de caractres

char source[10], dest[10];


i = 0 ;
do
dest[i] = source[i] ;
while (i++!='\0');

31

4.5

Instructions

. break
.

break et continue

: pour sortir d'une boucle

for, while,

ou

do. . . while,

exemple :

for (i=0; i <= n ; i++)


{
x = t[i];
if (traitement(x)=MAUVAIS)
break;
};
/*ici traitement des erreurs*/
. continue
.

passe l'itration suivante de la boucle

exemple :

for (i=0; i <= n ; i++)


{
x = t[i];
if (traitement(x)=MAUVAIS)
continue; //on va au i suivant
};

32

inconditionnellement.

4.6

Instructions

goto etiquette

ne pas utiliser si possible

syntaxe :

goto etiquette ;
instructions
....
...
etiquette : instruction ;
.

exemple

for (i=0; i <= n ; i++)


{
x = t[i];
if (traitement(x)=MAUVAIS)
goto erreur;
};
erreur : cout< < mauvais traitement pour i =< <i;

33

5 Les fonctions

34

5.1

Gnralits

Ce sont les lments de base d'un programme.

C ne distingue pas les fonctions des subroutines ou procdures.

Toute fonction doit tre dclare par un prototype puis dnie.

Ne pas confondre

. prototype

ou dclaration : qui indique le type de l'objet retourn et les arguments

. dnition

: qui indique le traitement eectuer. (C'est le corps de la fonction)

usuellement, on dclare la fonction (f) dans un chier entte (util.h, qui sera inclus dans
les chiers utilisant

f)

et on la dnit dans un autre chier (util.cpp par exemple).

Une fonction ne peut pas tre dnie l'intrieur d'un bloc :

float f(float x)
{
int f1(int i)
{/*....*/}
//implmentation illgale
//instructions f1
}

35

5.2

Dclaration d'une fonction (ou prototypage)

syntaxe :
type nom_fonction (type param1, type param2, ...)
param1, param2

... sont optionnels; par contre les

types

sont obligatoires

exemple1 :
//Deux critures quivalentes
int Ind_Max (double x [] ; int n)

int Ind_Max (double * ; int)


indique que

double

Ind_Max

est une fonction retournant un

(ou un pointeur sur

double

int

et prenant en arguments un tableau de

ce qui revient au mme), et une variable de type

int.

exemple 2 :
double Integrale (double (*f) (), double a, double b)
indique que

Integrale() est une fonction retournant un double


double, et deux variables de type double.

fonction de type

exemple 3 :

void Swap (int *a; int *b)


La classe d'une fonction est

extern

ou

//ne retourne rien.


static

par defaut

36

et prenant en arguments une

5.3

Dfinition d'une fonction (ou implmentation)

syntaxe :
type nom_fonction (type param1, type param2, ...)

instructions;
return var ;
//o var est du type retourne par la fonction

}
exemples fonction qui renvoit un objet :
double Max_Abs (double* x

, int n)

double amax (0.0) ;


for (int i=0 ; i<n ; i++)
if(abs(x[i])>amax)
amax=x[i] ;//sinon rien
return (amax) ;

};
.

return peut se trouver n'importe o, il peut y en avoir plusieurs ou aucun.

return rend le contrle la fonction appelante

Aucun contrle sur le type et le nombre des arguments n'est eectu par le compilateur.

Fonction qui ne renvoit rien :


void Max_Abs (double * ; int n)
{
double amax (0.0) ;
for (i=0 ; i<=n ; i++)
if (abs(x[i]>amax) amax=x[i] ; //rien sinon
cout < <  le max est : < <amax ;
};
.

Pas de return

37

5.4

Transmission des arguments

Transmission par

rfrence

transmise la fonction appele


La fonction

f.

& x)

f(type

peut alors modier la variable

c'est l'adresse de la variable

qui est

x.

exemple :

void f(float & x)


{x=2.0;}
Dans le programme appelant, la squence d'instructions

float y=0.0;
f(y);

modie eectivement la valeur de

Transmission par
la fonction appele
La fonction

f.

valeur :

qui vaut maintenant

f(type x)

C'est une copie de la variable

ne peut pas modier la variable

x.

exemple :

void f(float x)
{x=2.0;}
Dans le programme appelant, la squence d'instructions

float y=0.0;
f(y);

ne modie pas la valeur de

2.0

qui vaut toujours

38

0.0

x qui est transmise

5.5

Rcursivit
la rcurrence est humaine, la rcursivit est d'essence divine

En C++, la rcursivit est autorise, mais toujours coteuse ( viter)


exemple :

version rcursive
long Factorielle (short n)
{
(n == 1) ? return 1 : return (n*Factorielle(n-1));
};

version rcurrente
long Factorielle (short n)
{
long temp = 1;
short i ;
for (i = 2 ; i <= n ; i++)
temp *= i ;
return temp ;
};

5.6

Surcharge de fonctions

Evite les noms de fonctions baroques


En C++, les fonctions sont identies par leur signature c'est dire leur nom et la classe de
leurs arguments. On peut dnir deux fonctions distinctes portant le mme nom, condition que
les deux listes des arguments soit distinctes.

void swap (int& a, int& b)


{
int t = a;
a = b;
b = t;
}
void swap (complex& a, complex& b)
{
complex t = a;
a = b;
b = t;
}
void swap (double a, double b)
{
double t = a;
a = b;
b = t;
}
Le compilateur direntie les direntes versions par les arguments passs aux fonctions :

complex u,v;
double x,y;
int i,j;
39

swap(u,v);

//permute les complexes u et v

swap(i,j); // permute les entiers i et j


swap(x,y);

// ne fait rien (pourquoi ?)

40

6 Les entres-sorties, les ux

41

6.1
.

Gnralits
les fonctions d'entre/sortie n'appartiennent pas au langage C++ mais la bibliothque
standard

<iostream.h> ou <iostream>
<fstream.h> ou <fstream>

Les fonctions d'entre/sortie sont dclares dans le chier include


pour les ots ou standard (cin,

cout, cerr, clog)

et dans

pour les ots utilisateurs.

En C++, on parle de ux ou ots plutt que de chiers.

La marque de n de ot est le caractre spcial

42

EOF.

6.2
.

flots standards
4 ots sont automatiquement ouverts par le systme au dbut du programme et referms
la n :

. cin,

li l'entre standard : par dfaut le clavier

 c'est un objet de la classe istream


 Flot ouvert en lecture uniquement.
 Les donnes lues sont disponibles aprs la frappe de la touche return.
 Les donnes, une fois lues, ne sont plus disponibles.
 cin est bueris
. cout,




C'est un objet de la classe

li la sortie erreur standard

c'est un objet de la classe

ostream

Flot ouvert en criture uniquement.


non bueris

. clog,





ostream

Flot ouvert en criture uniquement.

. cerr,





li la sortie standard, par dfaut l'cran.

li la sortie erreur standard

c'est un objet de la classe

ostream

Flot ouvert en criture uniquement.


bueris

43

6.3

Ouverture et fermeture des flots

ofstream, puis l'ouvrir:

Pour ouvrir un ot en sortie (criture), dnir un objet

Pour ouvrir un ot en ecriture, s'il existe dj, il est cras.

par exemple

ofstream fichier_sortie;//dclaration
fichier_sortie.open(toto.out);//ouverture
.

On peut simultanment dclarer et ouvrir le ot:

ofstream fichier_sortie(toto.out);
.

Pour ouvrir un ot en ecriture, en mode  append  . S'il existe dj, les nouvelles critures
sont faites la n du ot.

ofstream fichier_sortie(toto.out,ios::app);
.

l'ouverture d'un ot renvoie 0 si tout c'est bien pass, un entier non nul si une condition
d'erreur existe.

if (!fichier_sortie)
{
cerr< <impossible d'ouvrir fichier_sortie;
exit(-1);
}
.

fermeture du ot par la mthode

close()

44

fichier_entree.close();

6.4
.

Ouverture et fermeture des flots (suite)


pour ouvrir un ot en entre (lecture), dnir un objet

ifstream puis l'ouvir :

par exemple

ifstream fichier_entree;
fichier_entree.open(toto.in); // ouvre le flot existant en lecture.
.

On peut rsumer l'ouverture en une instruction :

ifstream fichier_entree(toto.in);
.

l'ouverture d'un ot renvoie 0 si tout c'est bien pass, un entier non nul si une condition
d'erreur existe.

if (!fichier_entree)
{
cerr< <impossible d'ouvrir fichier_entree ;
exit(-1);
}
.

fermeture du ot par la mthode

close()

fichier_entree.close();

45

6.5

Ecriture : oprateur < < (insertion)

en C++ on parle d'insertion plutt que d'criture

L'oprateur

<<

est le principal oprateur d'insertion. Exemple :

fstream fout(toto.out,ios::out);
fout< <hello< <endl;
.

Cette dernire ligne quivaut

. endl
.

fout.(operator < <)(hello);

est un indicateur de saut de ligne (quivalent au caractre

l'oprateur

operator < <

'\n')

renvoie un pointeur sur le ot lui-mme. On peut donc enchaner

les oprations d'insertion :

fout< <x = < <x< <endl;


. write(const char* str,int length)est une mthode de ofstream qui permet d'insrer
les length caractres de la chane str sur le ot de sortie. Exemple cout.write(Hello,world,11)
;

. put(char) fournit une alternative


cout.put('\n') insre un saut de
.

< < pour insrer un caractre dans le ot.

Exemple

ligne;

L'utilisation de l'oprateur d'insertion

<<

est prfrable aux mthodes

46

write()

et

put().

6.6

Formatage des oprations d'criture, manipulateurs

mthodes de iostream : setf() et unsetf() sont des mthodes de iostream.


tions permanentes des attributs de formattage (jusqu'au prochain

unsetf()).

Modica-

. setf(long) et setf(long,long) sont deux mthodes de iostream permettant de xer des


attributs de formattage






setf(ios::showbase)

setf(ios::showpoint)
setf(ios::dec)

impose l'achage du point dcimal pour les rels

achage en decimal (oct en octal,

setf(ios::scientific)

. unsetf(long)
.

ache la base (decimale, octale, hexadcimale)

hex

en hexadcimal)

achage des ottants en notation scientique

dsactive les attributs de formattage (retour aux attributs par dfaut)

exemple

cout< <10.0;//affiche 10
cout.setf(ios::showpoint);
cout< <10.0;//affiche 10.0
cout< <5.0;//affiche 5.0

Manipulateurs
Inclure le chier

On dispose aussi de manipulateurs pour activer certaines options a la vole.

<iomanip.h>

. setw(int w);

<iomanip>

pour disposer de ces manipulateurs

xe la largeur du champ insrer.

. setfill(char c);

xe le caractre de remplissage (blanc par dfaut)

. setprecision(int p);
.

ou

xe la prcision du champ insrer (dfaut 6)

exemple

cout< <setw(4)< <setfill('#')< <12; //produit ##12


cout< <setprecision(3)< <sqrt(2); //produit 1.41

47

6.7

Lecture : oprateur > > (extraction)

en C++ on parle d'extraction plutt que de lecture.

L'oprateur > > est le principal oprateur d'extraction. Exemple :

istream fin(toto.in,ios::in);
char car;
fin> >car;//met le premier caractre de fin dans la variable car
.

les deux instructions

l'oprateur

fin> >car

operator> >

et

fin.(operator > >)(car);

sont quivalentes

renvoie un pointeur sur le ot lui-mme. On peut donc enchaner

les oprations d'extraction :

fin> >car> >car> >car;//car contient le 3ieme caractre du flot fin


.

Le caractre spcial

6.8

EOF

est le caractre de n de chier.

Lecture : autres mthodes disponibles

les fonctions suivantes sont des mthodes de

ifstream

. read(const char* str,int length)est une mthode de ifstream qui permet d'extraire
length caractres de la chane str du ot d'entre. Exemple char[20] str; cin.read(str,11)
;

. get(char) fournit une


cin.get(char x) ;

alternative > > pour extraire un caractre du ot.

Exemple

. getline (char * buf,int limit,char delim='\n') permet de lire et aecter buf une
ligne entire, jusqu'au caratre '\n' (par dfaut) lorsque l'on ne veut pas sauter de blancs.
getline() extrait au plus limit-1 caractres et ajoute un caractre NULL la n.
.

L'oprateur d'extraction

. peek()

>>

est prfrable aux mthodes

retourne le caractre suivant, (ventuellement

read()

EOF,

et

get()

et

getline()

sans l'extraire. (i.e. le curseur

reste positionn au caractre courant)

. ignore(int limit=1,int delim=EOF)dplace


curseur si rencontre le caractre delim.
. putback(char c)
. seekg(int pos)

remet en position courante le caractre

positionne le curseur la position

. gcount(), tellg()...

6.9

Etat d'un flot en lecture

Voici quelque mthodes utiles de la classe

. int eof()
. bad()

ifstream

: n de chier trouve

: le ot est altr

. fail()

: la prochaine opration chouera

. good()

: la prochaine opration peut russir

. clear()

le curseur de

: remet l'tat du ot

good()

48

pos

c.

limit

caractre mais arrte le

6.10

Positionnement dans un flot en lecture

49

6.11

Autres fonctions de lecture/criture

50

6.12

Autres fonctions de gestion de flot

caser quelque part l'exemple /home/puiseux/docs/tic/tic032.html

51

7 Pointeurs, rfrences, alias et tableaux

52

7.1

Dfinitions

2
i
ou (*p)
.

Un pointeur est une variable contenant l'adresse d'un objet en mmoire.

Un pointeur est dni par le couple

dclaration :

exemple :

type

(type, adresse)

de l'objet point.

*identificateur;

est un pointeur sur un entier, i.e.

contient l'adresse d'une case mmoire

contenant un entier.

int *p;
p

Si

exemple

est un pointeur sur le type

Type

alors on accde la valeur pointe par

*p

float *p;
*p=2.0;
.

si x est une variable de type

Type
.

Type,

alors

&x est l'adresse de x, c'est donc un pointeur sur

exemple

float x;
float *px;
px = &x;
.

si
de

x est
x.

un

float,

alors

float &xalias = x

est une dclaration lgale,

exemple

float x;
float &y = x; // initialisation obligatoire

53

xalias

est un alias

7.2

Pointeurs et tableaux

2
i
ou (*p)
.

en C++, pointeurs et tableaux sont trs lis :

int T[5] ;
int *p ;
.

Attention, l'indice d'un tableau n lment varie de 0 n-1

l'instruction

&T[0];

. p

p = T

; est autorise car

pointe sur le premier lment de

. p+i

pointe sur le

ime

est aussi un pointeur d'entiers ; quivaut

lment suivant;

*(p+i)

est gal

T[i].

Le nom d'un tableau est un pointeur constant sur le premier lment du tableau.

Allocation dynamique d'un tableau de n lments de type

Type *a;
a = new Type[n];
delete[]a;
.

Type

//allocation memoire
//liberation memoire

new retourne un pointeur sur le premier lment de la mmoire alloue,


NULL.

si l'allocation russit,
sinon il retourne

p =

Le programmeur qui alloue de la mmoire dynamiquement a en charge la libration de


mmoire qui n'est en aucun cas automatique au cours du droulement du programme.

54

7.3

Chanes de caractres

une chane de caractres est un tableau de caractres

Certaines fonctions sont disponibles. Ces fonctions sur chanes de caractres sont dclares

<string.h>.
string.

dans

Sous UNIX, une aide en ligne est disponible via la commande  man

La n d'une chane de caractre est signale par un caractre

NULL

(ou

'\0'),

insr par le

compilateur.

on accde aux constantes de type chane de caractres au moyen d'un pointeur de type
pointant sur le premier lment de la chane, par exemple

lors de l'instruction

mais

char * s=ceci est un message;

char *s;

char,

la chane n'est pas recopie dans

contient l'adresse du premier lment de cette chane.

Les fonctions les plus utiles :

. char *strcpy(char *dest, const char *src); recopie src dans dest (la place mmoire
de dest doit avoir t rserve)
. char *strcat(char *dest, const char *src);
mmoire de dest doit avoir t rserve)
. size_t strlen(const char *s);
La classe

recopie

src

la n de

retourne la taille de la chane

dest

(la place

string permet une manipulation plus intuitive et ecace des chaines de caractres.

exemple :

# include <iostream>
# include <string>
using namespace std;
int main(void) {
string S("Puiseux");
cout < < endl < < S +" Pierre"< < flush;
return 0;
}

55

Par

7.4

Tableaux multidimensionels, matrices

dclaration :

exemple :

type identificateur [dim1][dim2];

const int MAXDIM=100 ;


long double a[MAXDIM][MAXDIM] ;
.

les lments sont rangs par lignes :

a[i] est (l'adresse du premier lment de) la ligne numro i


*a[i] est le premier lment de la ligne numro i.
a[i]+j est l'adresse du jme lment de la ligne i
a[i][j] est l'lment ime ligne, jme colonne
*a[i]+j est l'lment ime ligne, jme colonne aussi
.

Allocation dynamique d'une matrice de taille

n*n

double **a;
//allocation
a = new (double *)[n];
for (i=0;i<n;i++) a[i] = new double[n];
//liberation
for (i=0;i<n;i++) delete []a[i];
delete[]a;
.

new retourne un pointeur sur le premier lment de la mmoire alloue,


NULL

si l'allocation russit,
sinon il retourne

56

7.5
.

Remarques sur les pointeurs


le C++ n'eectue pas de vrication sur les indices de tableau. C'est au programmeur de
prendre ses prcautions.

. a[i]
.

est valu par le C++ comme

*(a+i)

dans le cas de transmission de tableau en paramtre d'une fonction, seule l'adresse du premier
lment est transmise.

La valeur

NULL

(en fait 0) pour un pointeur est caractristique d'un pointeur mal initialis

ou mal dclar.

L'incrmentation d'un pointeur

p++

(ou

p--)

a pour eet d'incrmenter

de

sizeof(p)

octets.

. Int T[10][5][2];

est un tableau 10 lments, chaque lment tant une matrice 5

lignes, 2 colonnes.

 T[i] dsigne donc une matrice (deux dimensions) ;


 T[i][j] dsigne un tableau une dimension (ou vecteur) d'entiers ;
 T[i][j][k] dsigne un entier.

57

7.6

Pointeurs de fonctions

une fonction n'est pas une variable. Nanmoins, elle a une adresse en mmoire. On peut donc
dnir une variable qui pointe sur une fonction.

Dclaration :

double (*f) (int,float);


int (*g) ();
. f

est un pointeur sur une fonction prenant un

rsultat est de type

. g

double.

int

et un

float

en arguments et dont le

est un pointeur sur une fonction sans arguments dont le rsultat est de type

double *f();

int.
double.

A distinguer de

Peut s'utiliser lorsque la fonction utiliser peut varier, par exemple pour une mthode de

qui dsigne une fonction renvoyant un pointeur sur

Newton gnrique (1d), on dnira par exemple :

double Newton(double(*f)(double);int itmax);


{
/*ici, on peut utiliser la fonction f
comme on le dsire*/
};
//appel :
double solution ;
double f(double x) ;
solution = Newton(f,ITMAX);

58

7.7
.

Allocation dynamique de mmoire


Oprateurs

new

et

delete

solution suivante (malloc).

exemple :

voir ([7.2] et [7.4]).

On peut trouver aussi des fonctions de la famille

malloc

A privilgier par rapport la

(langage C):

 void *malloc(size_t size) ; aloue un bloc de mmoire de size octets dans la zone
de mmoire appele tas (heap).





NB : l'instruction

calloc(n,s)

Si l'allocation russit,

malloc

est quivalente

malloc(n*s).

renvoie un pointeur sur le bloc nouvellement allou.

Si la place disponible est insusante ou si

size vaut 0, malloc renvoie NULL. Le contenu

du bloc n'est pas modi.




Si l'argument

size

vaut

0,

alors

malloc

renvoie

exemple : allocation mmoire pour une matrice

NULL.
n*n

(produit un rsultat analogue

[7.2] et [7.4]):

/*tableau de n pointeurs 0-->n-1 */


if ((a = (double * *) malloc (n*sizeof(double *))) == NULL)
FatalWarning ("Memoire insuffisante \n");
for (i=0; i<n; i++)
if ( (a[i] = (double *) malloc(n*sizeof(double)))== NULL)
FatalWarning ("Memoire insuffisante \n");
/* Aprs utilisation, librer la mmoire par free */
for (i=0; i<n; i++) free(a[i]);
free(a);

59

8 Les classes, les objets

60

8.1
.

Les classes
Dnition : une classe est un type dni par l'utilisateur (au mme titre qu'un
un

int).

Une classe se dclare l'aide du mot cl

class

mthodes (ou fonctions membres) agissant sur ces donnes

Dclaration d'une classe :

class Nom_de_Classe
{
public :
dclaration_donnees_publiques ;
declarations_methodes_publiques ;
protected :
dclaration_donnees_protegees ;
declarations_methodes_protegees ;
private :
dclaration_donnees_privees ;
declarations_methodes_privees ;
};
.

Exemple :

class Etudiant
{
private :
char nom_[20];
int age_;
float note_exam_,note_partiel_,note_finale_;
public : //methodes et donnes publiques
float rien;
//calcul note finale, implement ailleurs
float Set_Note_Finale(void);

};

//retourne la note finale implmentation inline


float Get_Note_Finale(void)
{return note_finale_;}

61

float

ou

et regroupe des donnes et des

8.2
.

Les objets
Un objet est une instance d'une classe, c'est dire un emplacement mmoire adressable dont
le type est celui de la classe. De mme que
dclare un objet de type

int,

int

n'est pas un objet mais un type,

ou encore une instance d'int.

int i;

Exemple :

// dclaration d'objets de la classe Etudiant


Etudiant a, b, c;
//donne la taille en octets de la classe
int size=sizeof (Etudiant)
.

Pour les types prdnis (int, oat,...) on parle de type et de variables.

Pour les types dnis par l'utilisateur, on parle de classe et d'instances (ou objets ).

On peut crer dynamiquement des instances de classe en faisant appel au ( un des) constructeur(s) de la classe (cf : 8.7). Le compilateur gnre un constructeur par dfaut

Etudiant *a;
a = new Etudiant();
...
delete() a;

8.3

Accs aux membres

par l'intermdiaire des oprateurs unaires

exemples :

&

et

->

et

Etudiant e, *pe ;
pe = &e ;//pe prend pour valeur l'adresse de e
e.rien = 0.0 ; //e.rien accde au champ rien de e
*pe.rien = 1.0 ;
pe->rien = 19.00;
// pe->rien et *pe.rien identiques
float x = e.Get_Note_Finale();
x = pe->Get_Note_Finale();

62

8.4
.

Attributs de membres
les dirents membres d'une classe peuvent tre accs protg, priv ou public

private

les membres privs ne peuvent tre utiliss (modis pour les donnes, appels

pour les mthodes) que par les mthodes de la classe

protected

les membres protgs ne peuvent tre utiliss que par les mthodes de la classe

et des classes drives.

public
.

les membres publics peuvent tre utiliss et modis par tous

Les variables sont le plus souvent


usuellement

private

par convention le nom des membres

nom_
.

public.

ou

private

protected,

ou

a une variable de type Etudiant (voir 8.1).


. L'instruction a.age_ = 21; produit une erreur
. L'instruction a.rien = 0.0 est licite.

protected

tandis que les mthodes sont

se termine par '_'. exemple

Soit

63

de compilation car

age_

est a accs priv.

8.5

Oprateur de rsolution de porte ::

Usuellement :

toto

Une classe

elle est dnie (ou implmente ) dans le chier

dans le chier

est dclare (ou prototype ) dans chier

toto.cxx,

exemple

chier

toto.h

class toto
{
private : float x;
public : void FaireQuelqueChose(void);
};

toto.cxx

l'accs aux membres de la classe

de rsolution de porte ::

toto.h

chier toto.cxx

#include toto.h
void toto::FaireQuelqueChose(void)
{
cout< <endl
< <justement, je ne fais rien!!;
}

64

toto

se fait grce l'oprateur

8.6

Hritage

Une classe

peut driver (ou hriter) d'une autre classe.

dclaration :

class B : public A
{/*...*/}
Dans cet exemple, le mode de drivation de la classe

est

public.

Certaines mthodes et donnes

de la classe de base (A) sont disponibles dans la classe drive (B).

Mode de drivation

public

protected

private

Un membre dont le statut dans

a pour statut dans

la classe de base (A) est :

la classe drive (B) :

public

public

protected

protected

private

inaccessible

public

protected

protected

protected

private

inaccessible

public

private

protected

private

private

private

65

8.7
.

Constructeurs, recopie et initialisation ; destructeurs


Toute classe possde un constructeur. Soit un constructeur par dfaut gnr par le compilateur, soit un constructeur dni par le crateur de la classe.

Exemple :

class Vecteur
{
private :
float * v_;
int n_;
public :
void Vecteur(int );
//constructeur1
void Vecteur(istream&); //constructeur2
void Vecteur();
//constructeur3
/* ici, d'autres methodes */
~Vecteur;
//destructeur
}
.

ces constructeurs pourront etre implments sur le modle suivant :

Vecteur::Vecteur(int n)
{n_=n; v_=new float[n_];}
Vecteur::Vecteur(istream& filin)
{/*lecture et initialisation sur le flot filin*/}
Vecteur::Vecteur()
{//vecteur vide}
.

Les instructions pour crer un Vecteur seront du type :

Vecteur a(10); //appel du constructeur1


Vecteur b(cin); //appel constructeur2
Vecteur c;
//appel constructeur3
//le destructeur sera appel implicitement
Vecteur *pv;
pv = new Vecteur(15); //appel constructeur1
delete pv;
//appel explicite destructeur
//obligatoire car *pv cr dynamiquement

8.8

Constructeur et hritage

Si une classe b hrite de la classe a :

class b : public a
{
b(...);//constructeur
};
La syntaxe d'appel au constructeur de la classe de base est :

8.9
.

Hritage multiple
Une classe peut hriter de plusieurs classes.

66

class a : public b,public c


{...}
.

le constructeur de

//a hrite de b et de c

doit appeler les constructeurs de

et

dans le mme ordre qu'ils sont

dclars suivant la syntaxe :

a::a(liste_arguments_a) : b(liste_arguments_b)
: c(liste_arguments_c);
.

Les destructeurs sont appels dans l'ordre inverse

Si

et

variable

x, elle seront direncies dans a


a::x dsigneront respectrivement la

ont chacun une variable de mme nom, disons

l'aide de l'oprateur de rsolution de porte.

de

et celle de

b.

8.10

Mthodes virtuelles

8.11

Fonctions amies

(friend)

67

b::x

et

9 La classe string

68

9.1

Constructeurs

La classe

string

permet une manipulation aise des chanes de caractres.

string

Les dclarations de la classe

Construction. Les syntaxes suivantes sont autorises :

se trouvent dans

<string.h>

string ch1; //chaine vide


string ch2(bonjour);
char *str=salut //ancienne syntaxe, toujours valable
string mess(str);
//construction a partir de str
string mess1(mess); //constructeur recopie

69

9.2
.

Mthodes de la classe

string

concatnation :

string ch1(bon);
string ch2(jour);
string ch3 = ch1 + ch2; //ch3 contient bonjour
.

Les oprateurs d'insertion (< <) et d'extraction (> >) sont surchargs de manire naturelle
pour la classe

La fonction

string.

find

permet la recherche d'une chaine ou d'un caractre dans une chaine :

string s(bonjour);
string ch(onj);
int i = s.find(ch); // i=1
i = s.find(ur); //i=5
.

Il existe d'autres mthodes de recherche, remplacement suppression et insertion :

 rfind(toto) : recherche la dernire occurence de la chaine toto


 find_first_of(aeisw): recherche la premire occurence d'un des caractres 'a','e','i','s',ou
'w'

 insert(4,toto) : permet d'insrr la chaine toto en position 4


 replace(...) pour remplacer une partie de la chaine
 remove(...) pour supprimer une partie de la chaine
string

'\n'

Un

exemple d'utilisation : lire un chier complet dans un

peut contenir un ou plusieurs caractres

#include <string>
#include <iostream>
#include <fstream>
int main()
{
ifstream in("FillString.cpp");
string s, line;
while(getline(in, line))
s += line + "\n";
cout < < s;
}

70

ou

'\0'

string

ou autre.

10 La bibliothque standard

71

10.1

Fichiers d'en-tte standards en C


(norme ANSI)

Fichier

Description

assert.h

Macro de dbogage assert

ctype.h

Information pour les macros de classication et conversion de caractres

errno.h

Constantes symboliques de codes erreurs

float.h

Paramtres des routines de ottants.

limits.h

Paramtres d'environnement, limitations de domaines des entiers

locale.h

Fonctions des informations spciques aux pays et aux langues

math.h

Prototypes des fonctions math

signal.h

Constantes et dclarations pour signal et raise

stdarg.h

Macros pour lire la liste d'arguments des fonctions prvues avec un nombre d'arguments
variable

stddef.h

Types de donnes et macros diverses

stdio.h

Types et macros pour le "Standard I/O Package" ANSI

stdlib.h

Routines de base : conversion recherches/tris et autres

string.h

Manipulation de chanes et de donnes en mmoire

time.h

Structure renseigne par les conversions temporelles

72

10.2

Fichiers d'en-tte spcifiques Linux

Fichier

Description

alloc.h

Fonctions de gestion mmoire (rservation, libration, etc.)

bios.h

Appels de routines PC ROM BIOS

complex.h

Mathmatique des complexes du C++

conio.h

Appels de routines d'entres/sorties DOS console

dir.h

Structures, macros et fonctions de gestion de rpertoires et de chemins

direct.h

Structures, macros et fonctions de gestion de rpertoires et de chemins

dos.h

Constantes et dclarations pour des appels DOS et 8086

errno.h

Constantes symboliques de codes erreurs

mem.h

Gestion mmoire (voir aussi string.h.)

memory.h

Gestion mmoire

search.h

Recherches et tris

values.h

Constantes essentielles, et notamment de dpendance machine

73

11 C++ Notions avances


11.1

Polymorphisme : les templates ou patrons

Permet de dnir des classes et des fonctions dans lesquelles la classe est variable

inline
inline
inline
inline

double Max (double a, double b);


int Max (int a, int b);
unsigned int Max (int a, int b);
Complex (Complex a, Complex b);

etc...
sera remplac par

template <class T>


inline T max(T a, T b)
{
return (a>b ? a : b); /***/
}
On peut alors appeler

Max() avec n'importe quelle paire de variables de meme classe (pourvu qu'il
T an que a>b ait un sens dans ***).

existe une relation d'ordre dans

i
x
c
w

=
=
=
=

Max(1, 5);
Max(5.6, 4.2)
Max('a', '\t')
Max (3.1, 4);

//appel de int Max(int,int)


//appel de double Max (double, double)
//appel char Max(char, char)
//Pourquoi cela ne compile-t-il pas ?

74

11.2

Support des exceptions

Les trois attitudes usuelles faces aux erreurs potentielles :

Existentialiste : cool, cool, Albert, va gazer

Bureaucratique :
1. lister toutes les erreurs possibles
2. prvoir le traitement appropri

Autoritaire : exit(-1);

C++ propose un mcanisme plus labor : trois nouveaux mots cl :

throw

signale une erreur

catch

traite l'erreur

try

regroupe les instructions traites par une instruction

try{
/*instructions parmi lesquelles peuvent
etre jetes (throw) des exceptions
de classes diverses*/
classe1 Y; throw Y;
}
catch(classe1 x)
{/*...*/}
catch(classe2 x)
{/*...*/}

75

try, catch, throw

catch

11.3

Exceptions : exemple
#include <iostream.h>
int main()
{
try{
/*...*/
if (toto)
throw (ca va pas du tout);
throw 17;
cout < < "cette instruction ne sera jamais executee"
}
catch (int i){
cout < < "\nL'erreur numero
< <i
< < " vient de me parvenir ; que faire ?";
}
catch (char * message){
cout < < endl < < message;
}
}

Si

toto

est faux, cette squence d'instructions produira la sortie :

L'erreur numero 17 vient de me parvenir ; que faire ?


.

Si

toto

est vrai, on obtient :

ca va pas du tout
Il est possible d'crire un programme, des classes, fonctions...

sans utiliser les exceptions.

Le

traitement des exceptions peut tre rajouter par la suite, avec un nombre minimum de modications.

76

12 La STL (Standard Template Library)


.

Fait partie de C++

permet de manipuler les structures de donnes standards et les algorithmes s'y rattachant.

Un exemple : lire un chier d'entiers, les trier et acher sur

cout

#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
int main(void)
{ typedef vector<int> vector_int;
ifstream source("input.txt");
vector<int> v;
istream_iterator<int> start(source);
istream_iterator<int> end;
back_insert_iterator<vector_int> dest(v);
copy(start,end,dest);
sort(v.begin(),v.end());
copy(v.begin(),v.end(),ostream_iterator<int>(cout,"-"));
cout < < endl < < "Fin du test !" < < endl;
return 0;
}

12.1
.

Organisation de la STL
les conteneurs : permettent de contenir des lments









.

tableaux (classes

vector

et

deque)

listes (list)
piles (stack)
les (queue)
ensembles (set)
ensembles multiples (multiset)
cartes (map)
multicartes (multimap)

Les itrateurs : permettent aux algorithmes de manipuler les conteneurs. Un itrateur peut
tre vu comme un pointeur sur un lment d'un conteneur.

Les algorithmes : permettent de manipuler les donnes d'un conteneur. (tri, ...)

Les allocateurs : permettent de choisir entre plusieurs possibilits d'allocation de mmoire


(an de contenir les donnes).

77

12.2

Le conteneur vector

Dnition dans le chier d'entte

#include <vector>.

Un

vector

connait 2 valeurs:

* sa taille : le nombre d'lments qu'il contient,


* sa capacit : le nombre d'lments qu'il peut contenir.

#include <vector>
#include <iostream>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(3); // le tableau vaut [3], de taille 1
v.push_front(4); // le tableau vaut [4,3], taille 2
cout< <v[0]; // renvoie 4
v[1] = 5;
cout< <v[1]; // renvoie 5
return 0;
}

Attention, pas de contrle de dpassement d'indice


.

Exemple de lecture d'un chier de donnes

#include <vector>
#include <iostream>
#include <iterator>
#include <fstream>
int main(void)
{
ifstream file;
file.open("input.txt");
int nb;
file> >nb> >ws;
vector<int> x;
datas.reserve(nb);
for (;nb>0;--nb){
int d;
file> >d> >ws;
x.push_back(d);
}
copy(x.begin(),x.end(),ostream_iterator<int>(cout,"-"));
return 0;
}
Autres mthodes :

. T& back();

retourne le dernier lment de la collection.

. void pop_back();

supprime le dernier lment de la collection.

. iterator insert(iterator,const T &);


. iterator erase(iterator);
. void clear();
. int size();

insert un lment une position prcise.

supprime un lment une position prcise.

vide le conteneur

vetourne le nombre d'lments

. bool empty();

teste si le conteneur est vide

78

Ouvrages de rfrence

References
[1] Comprendre et utiliser C++ pour programmer objet, G.Clavel, I.Trillaud, L.Veillon ed. Masson
1994.
[2] L'essentiel du C++, S.B. Lippman, ed. Addison-Wesley, seconde dition, 1992.
[3] Le langage C++, Bjarne Stroustrup, ed. Addison-Wesley, seconde dition, 1992.
[4] Programmer en langage C++, C.Delannoy, ed. Eyrolles, 1998.
[5] La bibliothque standard STL du C++, A.B. Fontaine, ed. InterEditions, Masson 1997.

79

Tutoriaux, documentation

References
[1]

http://gustavo.net/programming/c_tutorials.html

[2]

http://math.nist.gov/acmd/Staff/RPozo/

[3]

http://w3imagis.imag.fr/Membres/Xavier.Decoret/STL_TUTORIAL/sommaire.html

[4]

http://www.infini-fr.com/Sciences/Informatique/Langages/Imperatifs/CPlusPlus/STL

80

Librairies et outils numriques en C++

une recherche sur internet avec les mots cl indiqus

doit permettre de retrouver aisment tous ces packages

References
[1] algebre linaire :

LAPACK++

[2] matrices creuses :

SparseLib++

[3] mthodes itratives :


[4] lments nis :

IML++

Diffpack, deal-II

[5] mathmatiques gnrales :


[6] vecteurs, matrices :
[7] algbre linaire :

Math.h++

M++

tnt

(R. Pozo)

81

La documentation d'un programme, d'une classe, d'une fonction ou de tout source

C++

fait

partie intgrante de la phase de programmation. Grosso-modo, on doit trouver autant de documentation que de code. Les chiers en-tte doivent tre particulirement bien documents, puisque
ce sont les seuls dlivrables lisibles en clair dans un projet industriel. Un utilitaire trs puissant,

doxygen, permet d'extraire du code et des chiers en-tte toute la documentation incluse, pourvu
qu'elle respecte une certaine syntaxe dont les lments essentiels sont donns ici.

Style JavaDoc :

/**
* ... text ...
*/
.

style Qt

/*!
* ... text ...
*/
.

style court (documentation inline)

/// ... text ...


.

autre style court

//!... text ...


Particularits

Les caractres '@' et '\' ont un signication particulire pour doxygen. Il introduisent une
balise. Par exemple si vous placez la ligne

@param i description du parametre i

dans un com-

mentaire doxygen elle sera interprt comme la description d'un certain paramtre i et
prsente de manire adhoc dans la documentation.

@date, @return @em

D'autres balises existent :

@author,

(emphasis)...

Doxygen peut interprter certaines balises html comme

<b>, <h1>, <p>, <br>, <ul>, <ol>, <li>

etc... la documentation sera prsente suivant la description html que vous en faites.

Doxygen interprte galement les formules

latex.

elles doivent tre encadre par \f$ ... \f$.

Par exemple

/**@return le ieme element du vecteur : \f$ u_i \f$


Un chier de conguration, en gnral nomm
lequel est passe la commande

doxygen.

Doxyfile

doit se trouver dans le rpertoire depuis

Un chier avec des valeurs par dfaut peut tre gnr par

doxygen

lui-mme, puis dit et

modi par vos soins. Il sut de passer la commande :

$ doxygen -g
Les ligne de documentation d'une fonction ou variable doivent se trouver avant la fonction ou
variable concerne.
Exemple :

Documentation de la classe Matrice :

1 pour

plus de prcision, voir

http://www.stack.nl/~dimitri/doxygen/

82

/** une classe qui traite des matrices pleines.


*\author Pierre Puiseux
*\version 1.0-limitee
*\date Novembre 1999
*\sa MatVirt MatMorse MatTriDiag
*/
.

Dclaration de la classe elle mme :

class Matrice : public MatVirt


{

protected:
public :

Documentation inline ou courte (une seule ligne) :

/// Constructeurs vide : la matrice est dimensionnee a 0.


Matrice();
.

Documentation d'une mthode sur plusieurs lignes

/**Constructeur recopie.
*Pour une raison pas tres claire, si l'on supprime le present
*consructeur, en esperant que Matrice(const MatVirt&); sera appele,
*ca n'est pas le cas. Ainsi, si l'on ecrit une instruction du
*type <tt>Matrice A(n,n);Matrice B(A); </tt> c'est
*MatVirt::MatVirt(const MatVirt&) qui est appele.
*Et puis ca va pas !
*/
Matrice(const Matrice&);

Un commentaire ignor par

doxygen

//operateurs methodes
.

Paramtres, valeur de retour, liste puces ...

/**
*@param k un indice, dans le vecteur v_ de stockage.
*@return w une structure IJ telle que :
*@li w.i est le numero de ligne de v_(k).
*@li w.j est le numero de colonne de v_(k).
*@li w.aij est la valeur v_(k).
*/
inline IJ WhoIs(const int k);

83

13 Le prprocesseur
traite les lignes commenant par

(en colone 1), avant la compilation.

#include
#include <nom_fichier>

#include nom_fichier

syntaxe :

demande au prprocesseur d'inclure le chier

ou bien

nom_fichier

en lieu et place de la ligne

prsente.

. <nom_fichier>

sera recherch dans les chiers include systme, tandis que

nom_fichier

sera d'abord recherch dans les chiers include utilisateur.

Essentiellement utilis pour les dclarations de variables globales et prototypes de fonctions


utiliss par plusieurs chiers.

#define et #undef
.

syntaxe :

#define NOM [chaine_carac]


...
#undef NOM
. #define demande au prprocesseur de remplacer
chaine_carac dans le reste du chier source.
. chaine_carac

toutes les occurences de la macro

est optionnel, dans ce cas, la macro

NOM

NOM

par

sera simplement dclare comme

dnie, mais vide.

. #undef
.

stoppe la substitution.

Exemples : voir aussi

#ifdef (13)

#define DEBUG 1
if (DEBUG)//DEBUG vaut 1
cout< <valeur de x =< <x;//x est imprim
#undef DEBUG
#define PI 3.14159
#undef PI
#ifndef et #ifdef
.

syntaxe :

#ifdef NOM
...

#endif

...

#endif

#define, alors #ifdef NOM aura la


#ifdef et #endif sera prise en compte par le compilateur
(ou le prprocesseur). Dans le cas contraire, les lignes comprises entre les directives #ifdef et
#endif seront ignores. La directive #ifndef renvoie vrai si et seulement si la directive #ifdef
Si la macro

NOM

#ifndef NOM
ou bien

a t prcdement dni par une directive

valeur vraie et la squence comprise entre

renvoie faux.

84

exemple : en tte d'un chier

foo.h,

on aura typiquement

#ifndef FOO_H
#define FOO_H
....
#endif
de sorte que si le chier

foo.h

a dja t inclus, il ne sera pas inclus une seconde fois.

85

Contents
14 Premiers pas en Linux
14.1

Bref historique Linux

LINUX est un systme d'exploitation cr en 1991 par un tudiant nlandais, Linus Torvalds.
Depuis, il a t dvelopp et amlior par des centaines de spcialistes dans le monde. La particularit de ce systme c'est qu'il est librement disponible avec son code source sur Internet. Il
existe des socits commerciales qui le distribuent et ils facturent alors soit le prix du support (CD
ROM) et de la documentation sur papier, soit ils facturent le service de maintenance et de support
tlphonique. En 1998, Linux et les logiciels libres ont acquis une notorit et une conscration
comme le montre la chronologie suivante:
* Avril 1998, Netscape le numro 1 mondial des navigateurs Internet annonce qu'elle transforme son logiciel Communicator en logiciel libre * Mai 1998, Corel Computer annonce la sortie de Netwinder, Un NC fonctionnant sous Linux * Juin 1998, IBM l'ex numro 1 mondial de
l'informatique abandonne son propre logiciel serveur Web et commence distribuer et supporter
le logiciel APACHE qui est un logiciel libre serveur Web * Juillet 1998 Informix et surtout Oracle,
le numro 1 mondial des SGBD annoncent le portage de leurs SGBD vers Linux * Septembre 1998,
Intel le numro 1 mondial des microprocsseurs entre dans le capital de RedHat un distributeur
commercial de Linux
on supposera dans toute cette partie que l'utilisateur se nomme
groupe

14.2

recherche.

puiseux,

et appartient au

Gnralits

LINUX est un systme d'exploitation (au mme titre que DOS,Windows, MacOS) qui satisfait
la norme UNIX et qui permet de "dialoguer" avec l'ordinateur. Ceci se fait dans une fentre

xterm (on dit aussi en mode console ) via un langage : le shell. Il existe, sous UNIX, 3 principaux

shell : le Bourne shell (sh) qui est le plus ancien, le C shell (csh) et le Korn shell (ksh) qui est
un peu un mlange des deux autres. Il existe aussi des versions un peu plus conviviales : ce sont
par exemple le

tcsh

(csh amlior) et le

bash

(sh amlior). C'est principalement avec ce dernier

que nous travaillerons.


Pour vous connecter sur une machine UNIX vous avez besoin d'un nom d'utilisateur, (ou userId
ou login ) et un mot de passe ou password. Chaque utilisateur appartient un groupe, ce qui lui
donne certains privilges (possibilit d'crire, lire ou excuter un programme dans une certaine
zone) communs tous les utilisateurs de ce groupe. Il existe cependant un utilisateur particulier,
nomm root qui a tous les privilges.
Les chiers sont classs dans l'ordinateur (sur le disque) selon une structure arborescente.

86

fileSystem.ps not found!

Chaque noeud de l'arborescence s'appelle un rpertoire ou directory (en anglais).

Dans ces

rpertoires se trouvent des chiers (ou le en anglais).


Les rpertoires et chiers de l'arborescence peuvent tre dsigns par leur chemin d'accs

Par exemple /home/puiseux/sources/zorro.c (chemin absolu) sigzorro.c se trouve dans le rpertoire sources qui se trouve lui mme dans
le rpertoire puiseux, qui se trouve lui mme dans... Supposons maintenant que le rpertoire
courant est /home/puiseux/sources (chemin absolu). Alors le rpertoire /home/puiseux/lib,
peut tre galement dsign par ../lib (chemin relatif ). Lors de la connexion, chaque utilisateur
est connect dans son rpertoire personnel (ou rpertoire home ), en gnral /home/puiseux. Le
rpertoire personnel d'un utilisateur est aussi dsign par ~, ou $HOME.
'.' (point) dsigne le rpertoire courant, '..' dsigne le rpertoire parent du rpertoire

(path ) absolu ou relatif.


nie que le chier

courant.
Cette partie vous explique les principales commandes de UNIX qu'il faut connatre : les commandes de gestion des chiers, les commandes concernant l'environnement, les commandes pour
l'dition ou pour la compilation des programmes que vous crirez.
Pour interrompre une commande, utiliser les touches :

14.3

Ctrl c

Arborescence sous Linux

(d'aprs Premiers pas sous Linux Auteur : Armand Delcros) Voici l'arborescence d'un systme
UNIX classique :

est le rpertoire racine, tous les autres rpertoires en dpendent. Par exemple le rpertoire o
est "mont" mon CD-ROM est sur

/mnt/cdrom.

On n'a donc pas comme sous MS-DOS,

direntes lettres qui correspondent dirents lecteurs disctincts physiquement.

/bin

contient les binaires fondamentaux la gestion de Linux. On y retrouve par exemple les
commandes tudies plus loin.

/dev

contient une multitudes de chiers dits spciaux.

/dev/hda1

correspond la premire par-

tition de mon disque dur IDE, si mon disque dur est un SCSI, son nom sera
dernire exemple :

/etc

/dev/fd0

contient tous les chiers de conguration de linux.

/etc/passwd,

/sbin

/dev/sda1.

Un

correspond mon lecteur de disquettes.


On y retrouve par exemple le chier

qui dnit les mots de passe des utilisateurs.

contient les binaires du systme.

On y trouve par exemple la commande

permet d'arrter l'ordinateur.

87

shutdown

qui

/home

est le rpertoire qui contient les rpertoires des utilisateurs du systme.

/lost+found

est le rpertoire des chiers perdus.

Des chiers qui, du fait d'erreur disque, se

retrouvent sans chemin d'accs.

/tmp

est un rpertoire accessible par tous les utilisateurs du systme, il permet de ne pas encombrer
son rpertoire personnel par des chiers que l'on souhaite de toute manire rapidemment
dtruire ou modier.

/var/spool

est le rpertoire des chiers qui servent de le d'attente.

Par exemple, les les

d'attente de l'imprimante se trouvent sous ce rpertoire.

/usr

contient grosso modo tout ce qui concerne les binaires utiles tous les utilisateurs et quelques
commandes d'administration. On y trouve cependant d'autres choses :

/usr/bin

contient donc les binaires disponibles pour les utilisateurs et les scripts.

/usr/X11R6

contient tout ce qui concerne

Xfree86

(les bibliothques, les binaires, la docu-

mentation).

/usr/include

contient tous les "headers" ncessaires la programmation dans les dirents

languages.

/usr/lib

contient toutes les bibliothques ncessaires au fontionnement des logiciels. (comme

par exemple la bibliothque

/usr/local

ou

C++

ou

tcl/tk).

on y met ce qu'on veut, mais surtout les chiers d'usage local et des logiciels

qui ne sont pas propres Unix.

14.4

Commandes fondamentales

En gnral, les noms des commandes sont des abbrviations de mots anglais.

Par exemple

cd

signie Change Directory. A vous de faire marcher votre imagination pour dterminer le ou les
mots l'origine d'une commande.

man, info, apropos

pour obtenir de l'aide sur une commande ou un mot cl. Exemples :

$ info ls
$ apropos float
$ man cd
cd

Pour se dplacer dans les rpertoires. Exemples :

$ cd /home/puiseux/sources

(chemin ou path absolu )

$ cd ~/sources
$ cd ..
$ cd
pwd
ls

(chemin relatif )
est quivalent

cd ~

O suis-je ?

Lister les chiers d'un rpertoire.

option -l pour une liste dtaille par exemple

$ ls -l

88

total 40
-rwxrwxr-x
-rw-rw-r--rw-rw-r--rw-rw-r-.

option

-a

1
1
1
1

puiseux
puiseux
puiseux
puiseux

puiseux
puiseux
puiseux
puiseux

16557 ao 29 17:20 a.out*


491 ao 29 17:20 copie
519 ao 29 17:11 monfichier
519 ao 29 17:11 toto.cxx

pour lister aussi les chiers cachs (ceux dont le nom commence par un point).

Par exemple

$ ls -a
./
chmod

../

a.out* copie .fichierCache monfichier toto.cxx

pour changer les droits d'un chier ou d'un rpertoire en lecture, criture ou excution.

chmod [options] mode fichier.

Syntaxe

Les options sont choisir dans[ugoa][+-][rwx]




.

u=user, g=groupe, o=other, a=all


+=ajouter les droits, -=supprimer les droits
r=lecture, w=criture, x=excution

Exemples

$ chmod a-x a.out


utilisateurs (a).

: change le chier

$ chmod g-w toto.cxx :

a.out

en chier non-excutable (-x) pour tous les

change le chier toto.cxx en chier non-modiable (-w) pour tous

les utilisateurs du groupe (g).

less

Voir le contenu d'un chier texte. Exemple :

$ less toto.cxx
emacs
cp

diter un chier (autre diteurs :

vi, nedit

...)

Copier un chier. Exemples :

$ cp toto.cxx sauvegarde/toto.cxx.bak
$ cp toto.cxx sauvegarde

(recopie dans le sous rpertoire

sauvegarde,

sous le mme

nom)

rm

Supprimer un chier. Exemples :

$ rm toto.cxx.bak

(avec conrmation)

$ rm -f toto.cxx.bak
$ rm -r sauvegarde/

(suppression rcursive de tous les sous rpertoires et chiers)

$ rm -rf sauvegarde/
mkdir

(sans conrmation)

(idem, sans conrmation,

Crer un rpertoire :

$ mkdir toto
mv

Dplacer ou renommer un chier ou un rpertoire

$ mv toto.cxx toto.cxx.bak
89

danger )

$ mv toto.cxx ..
locate

Retrouver un chier

$ locate toto :

liste tous les chiers contenant la chane toto,

locate est indirent la

casse.

which et whereis

localise une commande :

$ which ls
/bin/ls
grep
.

Trouver du texte dans un chier et ache la ligne correspondante


syntaxe :

grep [-il] reg_exp fichiers

 reg_exp

o :

est la chaine de caractres trouver (en ralit, il s'agit d'une expression

rgulire, dont la description ncessite plusieurs pages ! Consulter

$ man perlretut

pour en savoir plus).

 fichiers : la liste des chiers o chercher,


 l'option -i pour ignorer les dirences majuscules/minuscules,
 l'option -l pour n'acher que les noms des chiers contenant reg_exp

sans acher la

ligne correspondante.

Exemple :

$ grep main *.cxx


ln

Crer des liens entre chiers. (L'quivalent des raccourcis de windows). Syntaxe

[dest]

ou bien

ln -s source...

$ ln -s toto.cxx toto.cc
gzip

repertoire.

cre un lien symbolique entre

toto.cxx

et

toto.cc

Le compactage et le dcompactage des chiers au format .gz

$ gzip toto.cxx remplace toto.cxx par toto.cxx.gz, la


$ gunzip toto.cxx.gz permet de dcompacter le chier.
tar

ln -s source

Exemple.

Archivage de donnes.

version compacte.

tar [options] archive [fichiers]

$ tar -czvf rep.tgz rep cre une archive compacte au format gzip de tout le rpertoire
rep et la place dans le chier rep.tgz
$ tar -xzvf rep.tgz pour dtarer, i.e. extraire les chiers de l'archive et reconstituer le
rpertoire.

df du

Connatre l'espace disque restant (df, du)

$ df-h
Filesystem Size
/dev/sda2 99M
/dev/sdb2 8.2G
/dev/scd0 72M
ps et kill

Used Avail Use%


66M
28M
70%
6.8G 1.5G 82%
72M
0 100%

Mounted on
/
/home
/mnt/cdrom

La gestion des processus. Si un processus (ou job) bloque ou ralentit la machine (par

exemple

mozilla

ici) il est possible de le tuer :

90

$ ps -u puiseux
PID TTY
TIME
16457 pts/4 00:00:00
27547 pts/4 02:19:10
30904 pts/4 00:00:00
31146 pts/4 00:00:00
$ kill -9 30904

CMD
bash
vmware
mozilla-bin
ps

14.5
|

Les tubes ou pipes, les redirections, les jobs

Les pipes : pour chaner plusieurs commandes, la sortie de l'une tant l'entre de la suivante

$ ls | less
$ cat toto | sort
> >>

Les redirections : pour rediriger la sortie standard (cran) vers un chier

$ ls > list.txt

: le chier

$ df > > list.txt :


&

list.txt

est cr et contient le rsultat de la commande

ajoute le rsultat de la commande

df

la suite du chier

ls.

list.txt

lancer un job en background :

$ toto&

14.6

: pour lancer la commande

toto

et rcuprer la main durant son excution.

TP1

A l'aide des commandes dcrites ci-dessus:


1. Placez vous dans votre rpertoire. Vriez que vous y tes bien. (pwd)
2. Regardez la liste des chiers :

(ls)

3. Regardez la liste des chiers cachs :


4. Visualiser le contenu du chier
5. Crer un rpertoire

essai.

(ls)

.bashrc (less)

Vrier son existence. (mkdir,

ls)

6. Aller dans ce rpertoire. Vrier que vous y tes. (cd)


7. Crer 3 chiers vides

fic1, fic2

et

fic3 (touch)

8. Revenir dans le rpertoire principal. Vriez que vous y tes. Crer un rpertoire
contenant 4 chiers vides

ex1, ex2, fic1, fic2

9. Revenir dans votre home directory. Taper les commandes ls, puis
et enn

ls *.

10. Rediriger la sortie de la commande


de

liste1. (>)

11. Copier le chier

liste1

12. Renommer le chier

2 Si

ls

vers un chier nomm

dans un chier nomm

liste1

en chier

liste2.

exemple

ls exemple, ls exemple/fic*

liste1.

Visualiser le contenu

copie. (cp)
Vrier avec la commande

ls.

l'cran graphique est gel, il est possible de passer en mode non graphique : Ctl+Alt+F1. Puis se connecter

et tuer le job fautif.


Ctl+Alt+F7 vous permet ensuite de repasser en mode graphique.

91

13. Copier le chier

liste2

liste2

14. Dplacer le chier


15. Dtruire le chier

dans le rpertoire

liste2

16. Rcrer 4 chiers vides

exemple.

dans le rpertoire
du rpertoire

Vrier.

exemple

essai

. Vrier le rsultat.

puis tous les chiers de

ex1, ex2, fic1, fic2

dans

essai. (touch)

17. Revenir dans votre home directory copier le rpertoire


toire

exemple1. (cp -r)

18. Eacer le rpertoire

exemple

19. Crer trois rpertoires :

essai.

exemple

et ses chier dans un rper-

et son contenu.

bin, lib

et

include.

Ces rpertoires vous seront utiles pour la

suite et vous permettront de mettre des excutables (bin), vos librairies (lib) ou des chiers
include (include).

20. Trouver un chier dans votre home directory contenant le mot 'alias'. (grep)
21. Trouver tous les chiers de votre ordinateur dont le nom contient la chaine de caractre

'include'. (locate)

22. Lancer l'diteur

emacs,

ouvrez le chier

23. En mode console, tuer le job


24. Lancer l'diteur

emacs,

copie.

emacs.(ctl c)

en background. (&)

25. En mode console, tuer le job

emacs.(ps et kill)

26. Lister le contenu du rpertoire


27. Idem en utilisant un pipe :

/usr/bin.

ls /usr/bin | less
essai sous le nom essai.tgz, comparer la taille de essai/
tar, du, ls)

28. Archiver-compacter le rpertoire


et

essai.tgz

(commandes

29. O se trouve le chier manuel de la commande

man ls)

? (whereis)

ls

(i.e. le chier utilis par la commande

Bibliographie
.

Ouvrages de rfrence




Le Systme Linux, Matt Welsh & Lar Kaufman, ed. O'Reilly&Associate, inc.,1999.
Linux in a nutshell, Manuel de rfrence, J.P.Hekman et l'quipe de O'Reilly&Associates,
1997.

Tutoriaux, apprentissage en ligne :

 http://linux.uhp-nancy.fr/gs-french-2.1.1/gs2/html/gs.html
 http://www.linux-kheops.com/doc/bien-debuter/html/gs.html
 http://www.ee.surrey.ac.uk/Teaching/Unix/index.html

92

Vous aimerez peut-être aussi