Vous êtes sur la page 1sur 42

Algorithmique 2

Les tableaux en langage C


Chaı̂nes de caractères
Fonctions
Récursivité

t
raf
ALGORITHMIQUE 2

MOHAMMED SADDOUNE

Faculté des Sciences et Techniques de Mohammedia,


département Informatique

November 22, 2012

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
raf
1 Les tableaux en langage C

2 Chaı̂nes de caractères

3 Fonctions

4 Récursivité

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Un tableau est un ensemble d’éléments consécutifs du même type. Les cases
d’un tableau sont numérotées à partir de 0.

raf
Syntaxe en C
La syntaxe pour déclarer un tableau en langage C est la suivante:
< type> <nom du tableau> [<taille du tableau>];

EXEMPLE:
- Déclaration d’un tableau de 10 caractères.

char tabCarac [10];

- Déclaration d’un tableau de 10 nombres entiers.

int tabEntier [10];

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
D’une manière plus génerale:

Généralisation

raf
On peut imaginer un tableau à plusieurs lignes. Dans ce cas, la déclaration se
fait de la façon suivante :
<type> <nom du tableau> [<taille 1ère dimension>][<taille 2nde
dimension>] ...;

EXEMPLE:
- Déclaration d’un tableau d’entiers à deux dimensions de 5 lignes * 5 colonnes.

int matriceEntiers[5][5];

- Déclaration d’un tableau des réels à deux dimensions de 3 lignes * 4 colonnes.

float tabReels [3][4];

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Utilisation d’un tableau

Pour accéder à un élément du tableau, le nom que l’on a donné à celui-ci


ne suffit pas car il comporte plusieurs éléments. Ainsi, on définit un

raf
nombre appelé indice (en anglais index) qui, combiné avec le nom du
tableau, permet de décrire exactement chaque élément.
Pour accéder à un élément du tableau, il suffit donc de donner le nom du
tableau, suivi de l’indice de l’élément entre crochets:
NomTableau[indice]

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Utilisation d’un tableau

Pour accéder à un élément du tableau, le nom que l’on a donné à celui-ci


ne suffit pas car il comporte plusieurs éléments. Ainsi, on définit un

raf
nombre appelé indice (en anglais index) qui, combiné avec le nom du
tableau, permet de décrire exactement chaque élément.
Pour accéder à un élément du tableau, il suffit donc de donner le nom du
tableau, suivi de l’indice de l’élément entre crochets:
NomTableau[indice]

Quelques remarques:

L’indice du premier élément du tableau est 0


Un indice est toujours positif
L’indice du dernier élément du tableau est égal au nombre d’éléments - 1
Ainsi, on accédera au 5ème élément du tableau en écrivant :
NomTableau[4]

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Manipulation des données
Un élément du tableau (repéré par le nom du tableau et son indice) peut être

raf
manipulé exactement comme une variable. On peut donc effectuer des
opérations avec (ou sur) des éléments de tableau.

EXEMPLE:
- Soit tabEntier un tableau de 10 entiers:
int tabEntier[10];
- Pour affecter la valeur 6 et 9 au deuxième et cinquième éléments
respectivement on écrit:
tab[1] = 6;
tab[4] = 9;
- Pour affecter au 10ème élément le résultat de l’addition des éléments 2 et 5,
on écrit :
tab[9] = tab[1] + tab[4]; // tab[9] = 15

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
raf
Initialisation d’un tableau
Lorsque l’on définit un tableau, les valeurs des éléments qu’il contient ne sont
pas définies


Alors, il faut les initialiser, c’est-à-dire leur affecter une valeur

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Première méthode

raf
Une méthode rustique consiste à affecter des valeurs aux éléments un par un:
int tab[6];
tab[0] = tab[1] = tab[2] = tab[3] = tab[4] = tab[5] = 0;

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Première méthode

raf
Une méthode rustique consiste à affecter des valeurs aux éléments un par un:
int tab[6];
tab[0] = tab[1] = tab[2] = tab[3] = tab[4] = tab[5] = 0;

Deuxième méthode plus élégante


Pour passer d’un élément du tableau à l’élément suivant, il suffit d’incrémenter
son indice. Il est donc possible d’utiliser une boucle qui va permettre d’initialiser
successivement chacun des éléments grâce à un compteur qui servira d’indice:
int tab[6];
int Indice;
for (Indice = 0; Indice < 6; Indice++) {
tab[Indice] = 0;
}

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Valeurs spécéfiques
Pour initialiser un tableau avec des valeurs spécifiques, il est possible
d’initialiser le tableau à la définition en plaçant entre accolades les valeurs,

raf
séparées par des virgules:

int tab[6] = {1, 2, 6, 5, 2, 1};

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Valeurs spécéfiques
Pour initialiser un tableau avec des valeurs spécifiques, il est possible
d’initialiser le tableau à la définition en plaçant entre accolades les valeurs,

raf
séparées par des virgules:

int tab[6] = {1, 2, 6, 5, 2, 1};

Remarques:

Le nombre de valeurs entre accolades ne doit pas être supérieur au nombre


d’éléments du tableau
Les valeurs entre accolades doivent être des constantes (l’utilisation de
variables provoquera une erreur du compilateur)
Si le nombre de valeurs entre accolades est inférieur au nombre d’éléments
du tableau, les derniers éléments sont initialisés à 0
Il doit y avoir au moins une valeur entre accolades
Ainsi, l’instruction suivante permet d’initialiser tous les éléments du
tableau à zéro:
int tab[6] = {0};
MOHAMMED SADDOUNE ALGORITHMIQUE 2
Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Façon plus sécuritaire
Il est conseillé d’employer le plus possible des constantes dans vos programmes,

raf
notamment pour la taille des tableaux. Le code ci-dessus peut s’écrire ainsi :
#define NB ELEMENT TAB 6
int Tab[NB ELEMENT TAB];
int Indice;
for (Indice = 0; Indice < NB ELEMENT TAB; Indice++) {
Tab[Indice] = 0;
}

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Façon plus sécuritaire
Il est conseillé d’employer le plus possible des constantes dans vos programmes,

raf
notamment pour la taille des tableaux. Le code ci-dessus peut s’écrire ainsi :
#define NB ELEMENT TAB 6
int Tab[NB ELEMENT TAB];
int Indice;
for (Indice = 0; Indice < NB ELEMENT TAB; Indice++) {
Tab[Indice] = 0;
}

Avantages:
Voici les avantages liés à l’utilisation des constantes :
Moins d’erreurs d’exécution dues à un débordement difficile à déceler.
Pour modifier la taille du tableau il suffit de changer le define en début du
code source.
Le code possède une lisibilité accrue.

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Définition
Une chaı̂ne de caractères (appelée string en anglais) est une suite de caractères,
c’est-à-dire un ensemble de symboles faisant partie du jeu de caractères

raf
MOHAMMED SADDOUNE ALGORITHMIQUE 2
Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Définition
Une chaı̂ne de caractères (appelée string en anglais) est une suite de caractères,
c’est-à-dire un ensemble de symboles faisant partie du jeu de caractères

raf
En langage C, il n’existe pas un type qui traite les chaı̂ne de caractères.
En langage C, une chaı̂ne de caractères est un tableau, comportant
plusieurs données de type char, dont le dernier élément est le caractère nul
’ \0’, c’est-à-dire le premier caractère du code ASCII (dont la valeur est 0).
Le ’ \0’ est un caractère de contrôle (donc non affichable) qui permet
d’indiquer une fin de chaı̂ne de caractères. Ainsi une chaı̂ne composée de
n éléments sera en fait un tableau de n+1 éléments de type char.

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Définition
Une chaı̂ne de caractères (appelée string en anglais) est une suite de caractères,
c’est-à-dire un ensemble de symboles faisant partie du jeu de caractères

raf
En langage C, il n’existe pas un type qui traite les chaı̂ne de caractères.
En langage C, une chaı̂ne de caractères est un tableau, comportant
plusieurs données de type char, dont le dernier élément est le caractère nul
’ \0’, c’est-à-dire le premier caractère du code ASCII (dont la valeur est 0).
Le ’ \0’ est un caractère de contrôle (donc non affichable) qui permet
d’indiquer une fin de chaı̂ne de caractères. Ainsi une chaı̂ne composée de
n éléments sera en fait un tableau de n+1 éléments de type char.

On peut par exemple représenter la chaı̂ne ” BONJOUR ” de la manière


suivante :

B O N J O U R \0

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Comment créer une chaı̂ne de caractères ?

Pour définir une chaı̂ne de caractères en langage C, il suffit de définir un


tableau de caractères.

raf
Le nombre maximum de caractères que comportera la chaı̂ne sera égal au
nombre d’éléments du tableau moins un (réservé au caractère de fin de
chaı̂ne).

char NomTableau[NombreElements]

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Comment créer une chaı̂ne de caractères ?

Pour définir une chaı̂ne de caractères en langage C, il suffit de définir un


tableau de caractères.

raf
Le nombre maximum de caractères que comportera la chaı̂ne sera égal au
nombre d’éléments du tableau moins un (réservé au caractère de fin de
chaı̂ne).

char NomTableau[NombreElements]

Astuce
En définissant le tableau de la manière suivante, vous mettez en évidence le
nombre de caractères maximal de la chaı̂ne :
char NomTableau[NombreElements+1]

Par exemple:

char Chaine[10+1]

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
raf
Initialiser une chaı̂ne

initialiser une chaı̂ne de caractères veut dire remplir les cases du tableau
avec des caractères, sachant que celui-ci devra obligatoirement contenir le
caractère de fin de chaı̂ne ”\0”.
Il y a deux façons de procéder:
1 remplir manuellement le tableau case par case
2 utiliser les fonctions de manipulation de chaı̂nes fournies dans les librairies
standard

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
#include < stdio.h >
void main(){
char chaine[7+1];

raf
chaine[0] = ’B’;
chaine[1] = ’O’;
chaine[2] = ’N’;
chaine[3] = ’J’;
chaine[4] = ’O’;
chaine[5] = ’U’;
chaine[6] = ’R’;
chaine[7] = ’\ 0’;
}
- D’une manière plus simple, on peut écrire:

#include < stdio.h >


void main(){
char chaine[7+1] = { ’B’, ’O’, ’N’, ’J’, ’O’, ’U’, ’R’, ’\ 0’ };
}
MOHAMMED SADDOUNE ALGORITHMIQUE 2
Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
raf
Définition
- On appelle fonction un sous-programme qui permet d’effectuer un ensemble
d’instructions par simple appel de la fonction dans le corps du programme
principal.
- Les fonctions permettent d’exécuter dans plusieurs parties du programme une
série d’instructions, cela permet une simplicité du code et donc une taille de
programme minimale.

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Déclaration d’une fonction
Avant d’être utilisée, une fonction doit être définie en précisant son nom, ses
arguments et les instructions qu’elle contient. La définition d’une fonction

raf
s’appelle déclaration.

Syntaxe de la déclaration d’une fonction


La déclaration d’une fonction se fait selon la syntaxe suivante :
typeDonnee NomDeFonction(type1 argument1, type2 argument2, ...) {
instruction 1;
instruction 2;
.
.
.
instruction N;
}

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Déclaration d’une fonction
Avant d’être utilisée, une fonction doit être définie en précisant son nom, ses
arguments et les instructions qu’elle contient. La définition d’une fonction

raf
s’appelle déclaration.

Syntaxe de la déclaration d’une fonction


La déclaration d’une fonction se fait selon la syntaxe suivante :
typeDonnee NomDeFonction(type1 argument1, type2 argument2, ...) {
instruction 1;
instruction 2;
.
.
.
instruction N;
}

Remarque ! ...
Une fois cette étape franchie, votre fonction ne s’exécutera pas tant que l’on ne
fait pas appel à elle quelque part dans la page.
MOHAMMED SADDOUNE ALGORITHMIQUE 2
Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
1 typeDonnee représente le type de valeur que la fonction est sensée
retourner (char, int, float ...)

raf
2 Si la fonction ne renvoie aucune valeur, on la fait alors précéder du
mot-clé void
3 Le nom de la fonction suit les mêmes règles que les noms de variables:
le nom doit commencer par une lettre
un nom de fonction peut comporter des lettres, des chiffres et les caractères
(les espaces ne sont pas autorisés)
le nom de la fonction, comme celui des variables est sensible à la casse
(différenciation entre les minuscules et majuscules)
4 Les arguments sont facultatifs, mais s’il n’y a pas d’arguments, les
parenthèses doivent rester présentes
5 Il ne faut pas oublier de refermer les accolades
6 Le nombre d’accolades ouvertes (fonction, boucles et autres structures)
doit être égal au nombre d’accolades fermés !
7 La même chose s’applique pour les parenthèses, les crochets ou les
guillemets

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Pour exécuter une fonction, il suffit de faire appel à elle en écrivant son nom

raf
(une fois de plus en respectant la casse) suivi d’une parenthèse ouverte
(éventuellement des arguments) puis d’une parenthèse fermée:
NomDeFonction();

Remarques :

le point-virgule signifie la fin d’une instruction et permet au navigateur de


distinguer les différents blocs d’instructions
si jamais vous avez défini des arguments dans la déclaration de la fonction,
il faudra veiller à les inclure lors de l’appel de la fonction (le même nombre
d’arguments séparés par des virgules)
NomDeFonction(argument1, argument2);

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Arguments d’une fonction

raf
Il est possible de passer des arguments à une fonction, c’est-à-dire lui
fournir une valeur ou le nom d’une variable afin que la fonction puisse
effectuer des opérations sur ces arguments ou bien grâce à ces arguments.
Le passage d’arguments à une fonction se fait au moyen d’une liste
d’arguments (séparés par des virgules) entre parenthèses suivant
immédiatement le nom de la fonction.
Le nombre et le type d’arguments dans la déclaration, le prototype et dans
l’appel doit correspondre au risque, sinon, de générer une erreur lors de la
compilation...
Un argument peut être :
une constante
une variable
une expression
une autre fonction

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Renvoie d’une valeur

La fonction peut renvoyer une valeur (et donc se terminer) grâce au

raf
mot-clé return.
Lorsque l’instruction return est rencontrée, la fonction évalue la valeur qui
la suit, puis la renvoie au programme appelant (programme à partir duquel
la fonction a été appelée).
Une fonction peut contenir plusieurs instructions return, ce sera toutefois
la première instruction return rencontrée qui provoquera la fin de la
fonction et le renvoi de la valeur qui la suit.

Syntaxe:
La syntaxe de l’instruction return est simple :

return (valeurOuVariable);

Note: Le type de valeur retourné doit correspondre à celui qui a été précisé
dans la définition (et le prototype).

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
Preuve par induction
Le principe est comme suit:

raf
C’est comme montrer qu’on sait grimper dans une échelle !
Il faut pouvoir atteindre le premier échelon
Il faut pouvoir passer d’un échelon quelconque à l’échelon suivant

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
EXEMPLE:

raf
MOHAMMED SADDOUNE ALGORITHMIQUE 2
Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
EXEMPLE:

raf
MOHAMMED SADDOUNE ALGORITHMIQUE 2
Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
raf
Définition
Fonction qui, directement ou indirectement, s’appelle elle même pour résoudre
une instance de problème plus simple

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
raf
Règles de la récursion

Définir le cas de base


Faire de progrès vers le cas de base
Supposer que la récursion fonctionne (avoir la foi)
Ne pas refaire deux fois le même travail

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
raf
EXEMPLE:

écrire un programme en C qui permet de calculer le factoriel d’un nombre


entier n quelconque.
En utilisant une approche itérative standard
En utilisant la récursivité

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
unsigned long factoriel iterative (unsigned int n)

raf
{
unsigned long ret = 1;
unsigned int i = 1;
for (i = 1; i <= n; i++)
{
ret *= i;
}
return ret;
}

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
unsigned long factoriel iterative (unsigned int n)

raf
{
unsigned long ret = 1;
unsigned int i = 1;
for (i = 1; i <= n; i++)
{
ret *= i;
}
return ret;
}

Question : Exécuter cet algorithme pour n = 6

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
unsigned long factoriel (int n)

raf
{
if (n < 0) {
exit (EXIT FAILURE);
}
else if (n == 1 || n == 0) {
return 1;
}
return n * factoriel (n - 1);
}

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
unsigned long factoriel (int n)

raf
{
if (n < 0) {
exit (EXIT FAILURE);
}
else if (n == 1 || n == 0) {
return 1;
}
return n * factoriel (n - 1);
}

Question : Exécuter cet algorithme pour n = 6

MOHAMMED SADDOUNE ALGORITHMIQUE 2


Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
TOUR DE HANOI:

raf
MOHAMMED SADDOUNE ALGORITHMIQUE 2
Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
TOUR DE HANOI:

raf
MOHAMMED SADDOUNE ALGORITHMIQUE 2
Algorithmique 2
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

t
TOUR DE HANOI:

raf
MOHAMMED SADDOUNE ALGORITHMIQUE 2
Algorithmique 2

D
Les tableaux en langage C
Chaı̂nes de caractères
Fonctions
Récursivité

POUR FINIR :::::::::::::

Définir le cas de base


Faire de progrès vers le cas de base
Supposer que la récursion fonctionne (avoir la foi)
Ne pas refaire deux fois le même travail

MOHAMMED SADDOUNE ALGORITHMIQUE 2

Vous aimerez peut-être aussi