Vous êtes sur la page 1sur 90

LES NOTIONS DE BASE DU Safa CHEBBI

Safa.chebbi@supcom.tn
LANGAGE C 18/11/2020
PLAN DU COURS

I. Les structures
II. Les tableaux
III. Les fonctions
IV. Les chaines de caractères
LES STRUCTURES
INTRODUCTION

En langage C, on peut:

➢faire des choix (if.. else et switch) => Structures alternatives

➢faire des boucles (répéter plusieurs fois un ensemble donné d’instructions)


(do..while, while et for) => Structures répétitives
LES STRUCTURES ALTERNATIVES
IF …ELSE
❑Sous forme d’un bloc: suite d’instructions placées
entre { }
❑Les instructions dans un bloc peuvent être des
instructions simples ou des instructions structurées
(choix, boucle) lesquelles peuvent à leur tour
renfermer d’autres blocs.
❑Dans un bloc composé d’une seule instruction, les
accolades sont facultatives
❑Une instruction if peut se présenter sans else.
❑Si on a des conditions dépassant 2, on les
représente ainsi: if … else if …else
LES STRUCTURES ALTERNATIVES
EXEMPLES IF …ELSE
❑Exemple 1 :
Ecrire un programme qui lit un entier au clavier et affiche entier positif, s’il est supérieur ou égal à zéro,
ou affiche entier négatif s’il est strictement négatif.

Les blocs qui suivent le if et le else


contiennent une seule instruction. Les
accolades sont donc facultatives.
LES STRUCTURES ALTERNATIVES
EXEMPLES IF …ELSE
❑Exemple 2 :
Ecrire un programme qui lit un entier au clavier et affiche l'entier est strictement positif, s’il est
strictement positif, ou affiche l'entier est strictement négatif s’il est strictement négatif, ou affiche l'entier
est nul s’il est égal à zéro.
LES STRUCTURES ALTERNATIVES
EXEMPLES IF …ELSE
❑Exemple 3:
Ecrire un programme qui lit un entier au clavier et affiche Lundi si l’entier est égal à 1, Mardi si l’entier
est égal à 2,….. Dimanche si l’entier est égal à 7, Autre sinon.
LES STRUCTURES ALTERNATIVES
SWITCH …CASE
❑Exécution de switch …case permet de:
✓Évaluer l’expression figurant après le mot switch
✓Rechercher dans le bloc qui suit s’il existe une étiquette
de la forme «constante_i » correspondant à la valeur
ainsi obtenue
✓Si c’est le cas, on se branche à l’instruction figurant
après cette étiquette
✓Dans le cas contraire on passe à l’instruction qui suit le
bloc

❑Remarque: l’instruction break demande de sortir


du bloc
LES STRUCTURES ALTERNATIVES
SWITCH …CASE
❑Exemple:
Ecrire un programme qui lit un entier au clavier et affiche Lundi si l’entier est égal à
1, Mardi si l’entier est égal à 2,….. Dimanche si l’entier est égal à 7, Autre sinon.

Le break qui suit l’instruction default: printf


(“AUTRE”); est facultatif, puisque le
programme quittera automatiquement le
switch et passera à l’instruction suivante.
LES STRUCTURES RÉPÉTITIVES

En C, il existe trois structures qui permettent la définition de boucles


conditionnelles:

1. la structure : while
2. la structure : do - while
3. la structure : for
LES STRUCTURES RÉPÉTITIVES
WHILE…

❑Tant que la condition est vraie, le bloc


d'instructions est exécuté.

❑Le bloc d'instructions est exécuté zéro


ou plusieurs fois.
LES STRUCTURES RÉPÉTITIVES
EXEMPLES WHILE…
❑ Exemple 1:
LES STRUCTURES RÉPÉTITIVES
EXEMPLES WHILE…
LES STRUCTURES RÉPÉTITIVES
DO…WHILE

❑La structure do - while est semblable à la structure


while, avec la différence suivante :

✓while évalue la condition avant d'exécuter le bloc


d'instructions,

✓do - while évalue la condition après avoir exécuté le bloc


d'instructions. Ainsi le bloc d'instructions est exécuté au
moins une fois.
LES STRUCTURES RÉPÉTITIVES
EXEMPLES DO…WHILE
❑ Exemple 1: Ecrire un programme qui saisit un entier strictement positif ensuite l’affiche. Le
programme doit faire un test sur l’entier lu.
LES STRUCTURES RÉPÉTITIVES
EXEMPLES DO…WHILE
❑ Exemple 2: Ecrire un programme qui lit un entier qui doit être compris entre 0 et 10.
LES STRUCTURES RÉPÉTITIVES
INSTRUCTION FOR
❑Initialisation:
✓Elle est utilisée pour initialiser les données de la boucle.
✓Elle est évaluée une seule fois avant d’entrer dans la boucle

❑Test:
✓Est évaluée avant chaque passage de la boucle.
✓Elle est utilisée pour décider si la boucle est répétée ou non.

❑Avancement:
✓Est évaluée à la fin de chaque passage de la boucle.
✓Elle est utilisée pour réinitialiser les données de la boucle. les
parties initialisation et avancement peuvent contenir plusieurs
initialisations ou réinitialisations, séparées par des virgules.
LES STRUCTURES RÉPÉTITIVES
FOR
❑ Remarques:
LES STRUCTURES RÉPÉTITIVES
EXEMPLE FOR
❑ Exemple: Ecrire un programme qui calcule la somme des entiers de 1 à 100.
LES STRUCTURES RÉPÉTITIVES
CONTINUE
❑ continue: permet de passer prématurément à l'itération suivante de la boucle (si la condition est
vraie).
LES STRUCTURES RÉPÉTITIVES
GOTO
❑ goto: permet le branchement en un emplacement quelconque du programme.
EXERCICES
❑ Exercice 1:
Ecrire un programme qui lit des entiers. Le nombre d’entiers à lire n’est pas connu à l’avance. Le programme
s’arrêtera de lire les entiers quand leur somme dépasse 100
EXERCICES
❑ Exercice 1:
Ecrire un programme qui lit des entiers. Le nombre d’entiers à lire n’est pas connu à l’avance. Le programme
s’arrêtera de lire les entiers quand leur somme dépasse 100
EXERCICES
❑ Exercice 2:

Écrire un programme qui lit N nombres entiers au clavier et qui affiche leur somme, leur
produit et leur moyenne. Le nombre N est à entrer au clavier.
✓ en utilisant while,
✓ en utilisant do - while,
✓ en utilisant for.
EXERCICES
❑ Exercice 2: en utilisant while
EXERCICES
❑ Exercice 2: en utilisant do - while,
EXERCICES
❑ Exercice 2: en utilisant for
EXERCICES
❑ Exercice 3:
Ecrire un programme qui:
1. saisit un nombre formé de 3 chiffres (faites un test lors du saisie)
2. affiche le chiffre des dizaines et des centaines de ce nombre
EXERCICES
❑ Exercice 3:
Ecrire un programme qui:
1. saisit un nombre formé de 3 chiffres (faites un test lors du saisie)
2. affiche le chiffre des dizaines et des centaines de ce nombre
EXERCICES
❑ Exercice 4:
Écrire un programme qui lit deux entiers (A et B) au clavier et qui affiche le signe du produit de A et B sans
faire la multiplication.
EXERCICES
❑ Exercice 4:
Écrire un programme qui lit deux entiers (A et B) au clavier et qui affiche le signe du produit de A et B sans
faire la multiplication.
LES TABLEAUX
LES TABLEAUX À UNE DIMENSION
❑ Les tableaux sont certainement les variables structurées les plus populaires. Ils sont disponibles
dans tous les langages de programmation et servent à résoudre une multitude de problèmes.

❑ Les tableaux à une dimension (uni-dimensionnels): c’est une variable formée d'un nombre
entier n de valeurs de même type, qui sont appelées les éléments du tableau.

❑ Déclaration d’un tableau:


❖ Syntaxe: <Type> <Identifiant_tableau>[Dimension];
❖ Exemples: int tab[50]; float A[30]; char nom[20];
❖ La déclaration int tab[5]: définit un tableau nommé tab de 5 éléments. Ces éléments sont
de type entier. On peut accéder au premier élément du tableau par tab[0], au deuxième
élément par tab[1], . . . , au dernier élément par tab[4].
LES TABLEAUX À UNE DIMENSION
Mémorisation d’un tableau:

❑ En C, le nom d'un tableau est le représentant de


l'adresse du premier élément du tableau. Les adresses
des autres composantes sont calculées
(automatiquement) relativement à cette adresse.

❑ Si n est le nombre d'éléments, alors:


✓ l'accès au premier élément du tableau se fait par
tab[0]
✓ l'accès au dernier élément du tableau se fait par
tab[n-1]
LES TABLEAUX À UNE DIMENSION
Mémorisation d’un tableau:

❑ Si un tableau est formé de n éléments, et si un élément a besoin de m octets en mémoire,


alors le tableau occupera de n*m octets.

❑ Exemple: En supposant qu'une variable du type long occupe 4 octets ( sizeof(long)=4 ),


pour le tableau tab déclaré par:

long tab[15]; => n*m = 15*4 = 60 octets réservés en mémoire.


LES TABLEAUX À UNE DIMENSION
Initialisation et réservation automatique

❖Initialisation d’un tableau:

✓ Lors de la déclaration d'un tableau, on peut initialiser les composantes du tableau,


en indiquant la liste des valeurs respectives entre accolades.
✓ Exemples: int tab[5] = {10, 20, 30, 40, 50}; char tab[5]={‘A’,’b’,’C’, ‘d’, ‘e’};
✓ Il faut évidemment veiller à ce que le nombre de valeurs dans la liste corresponde
a la dimension du tableau.
✓ Si la liste ne contient pas assez de valeurs pour toutes les composantes, les
composantes restantes sont initialisées par zéro.
LES TABLEAUX À UNE DIMENSION

❖Réservation automatique:

✓ Si la dimension n'est pas indiquée explicitement lors de l'initialisation,


alors l'ordinateur réserve automatiquement le nombre d'octets nécessaires.

✓ Exemples
int tab[] = {10, 20, 30, 40, 50}; ==> réservation de 5*sizeof(int)= 10
octets
int C[] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1}; ==> réservation de 10*sizeof(int)=
20 octets
LES TABLEAUX À UNE DIMENSION
EXEMPLES
❑ Exemple 1: Ecrire un programme permettant de saisir le nombre d’éléments d’un tableau d’entiers
le remplit, puis l’affiche.
LES TABLEAUX À UNE DIMENSION

❑ Exercice: Ecrire un programme qui remplit et affiche un tableau d’entiers, ensuite calcule et affiche
la somme et la moyenne des éléments du tableau.
LES TABLEAUX À UNE DIMENSION
EXEMPLES
❑ Exemple 2: Ecrire un programme qui remplit et affiche un tableau d’entiers, ensuite calcule et
affiche la somme et la moyenne des éléments du tableau.
LES TABLEAUX À DEUX DIMENSIONS: MATRICES
❑ Déclaration: <type> <nom_matrice>[nb_lignes_l][nb_colonnes_c];

❑ Exemple: int mat [20][30]; //l=20 et c=30: mat est un tableau à deux dimensions de 20
éléments, tel que chaque élément est un tableau de 30 éléments.

❑ On appelle l le nombre de lignes du tableau et c le nombre de colonnes du tableau.

❑ l et c sont alors les deux dimensions du tableau. Un tableau à deux dimensions contient
donc l*c éléments.

❑ On dit que la matrice est carrée, si l est égal à c.


LES TABLEAUX À DEUX DIMENSIONS: MATRICES
❑ Déclaration et initialisation:

✓ Lors de la déclaration d'un tableau, on peut initialiser les composantes du tableau, en indiquant la
liste des valeurs respectives entre accolades.
✓ A l'intérieur de la liste, les composantes de chaque ligne du tableau sont encore une fois comprises
entre accolades int mat[2][3]={ {10,11,12},{20,21,22}};
✓ Comme pour les tableaux à une dimension, le nom d'une matrice représente l'adresse du premier
élément du tableau (c.-à-d. l'adresse de la première ligne du tableau).
✓ Un tableau de dimensions l et c, formé d'éléments dont chacun a besoin de m octets, occupera l*c*m
octets en mémoire.
✓ Lors de l'initialisation, il n'est pas nécessaire d'indiquer toutes les valeurs: Les valeurs manquantes
seront initialisées par zéro.
✓ les indices du tableau varient de 0 à l-1, respectivement de 0 à c-1.
✓ la composante de la nième ligne et mième colonne est notée: mat[n-1][m-1]
LES TABLEAUX À DEUX DIMENSIONS: MATRICES
EXEMPLE
❑ Exemple: Ecrire un programme qui remplit et affiche un tableau à deux dimensions.
EXERCICES À FAIRE
❑ Exercice 1: Ecrire un programme qui permet de compter le nombre d’occurrences
d’un entier donné dans un tableau donné ainsi que l’indice de sa première
apparition.
EXERCICES À FAIRE

❑ Exercice 2: Ecrire un programme qui permet d’afficher la valeur et l'indice du


maximum et du minimum. Si le tableau en contient plusieurs, le programme
retiendra la position du premier maximum ou minimum rencontré.
EXERCICES À FAIRE

❑ Exercice 3: Ecrire un programme qui remplit et affiche un tableau d’entiers, ranger


ensuite les éléments du tableau dans l'ordre inverse sans utiliser de tableau d'aide.
Afficher le tableau résultant.
EXERCICES À FAIRE

❑ Exercice 4: Ecrire un programme qui remplit et affiche un tableau d’entiers, et


efface toutes les occurrences de la valeur 0 dans le tableau tab et tasser les
éléments restants. Afficher le tableau résultant.
LES FONCTIONS
LES FONCTIONS: PRINCIPE
❑La structuration de programmes en sous-programmes se fait en C à l'aide de fonctions.
❑Nous avons déjà utilisé quelques fonctions prédéfinies dans des bibliothèques standard (printf de stdio , sqrt de math, etc.).
❑Jusqu'ici, nous avons résolu nos problèmes à l'aide de fonctions prédéfinies et d'une seule fonction: la fonction principale main().
❑Pour des problèmes plus complexes, nous obtenons ainsi de longues listes d'instructions, peu structurées et par conséquent peu
compréhensibles. En plus, il faut souvent répéter les mêmes suites de commandes dans le programme.

❑A l'aide des fonctions nous pouvons modulariser nos programmes pour obtenir des solutions plus efficientes.
✓Meilleure lisibilité
✓Diminution du risque d'erreurs
✓Possibilité de tests sélectifs
✓Réutilisation de modules déjà existants
✓ Simplicité de l'entretien
✓Favorisation du travail en équipe
✓Hiérarchisation des modules
LES FONCTIONS
FONCTION VS PROCEDURE
❑Une fonction dispose de 0 ou plusieurs arguments qui correspondent à des informations qui
lui sont transmises et elle fournit un unique résultat.
❑Une fonction peut apparaitre dans une expression. (exemple: g=somme(x,y,z)+9);

❑La procédure ne possède pas une valeur de retour, son appel ne peut pas apparaitre dans
une expression.
❑Une procédure dispose d'arguments. Parmi les arguments, certains sont des informations qui
lui sont transmises, d'autres, sont des informations qu'elle produit en retour de son appel.

➢En langage C, une fonction désigne à la fois une procédure et une fonction.
LES FONCTIONS
TYPE D’UNE FONCTION
❑Si une fonction F fournit un résultat du type T, on dit que 'la fonction F est du type T‘.
Exemple: somme est du type int.
❑Si une fonction ne fournit pas de résultat, il faut indiquer void (vide) comme type du
résultat.
❑Si une fonction n'a pas de paramètres, on peut déclarer la liste des paramètres
comme (void) ou simplement comme ().
❑Le type par défaut est int: si le type d'une fonction n'est pas déclaré explicitement,
elle est automatiquement du type int.
❑Il est interdit de définir des fonctions à l'intérieur d'une autre fonction.
LES FONCTIONS:
DÉFINITION D’UNE FONCTION
Dans la définition d'une fonction, nous
indiquons:

✓ le nom de la fonction
✓ le type, le nombre et les noms des
paramètres de la fonction
✓ le type du résultat fourni par la
fonction
✓ les variables locales à la fonction
✓ les instructions à exécuter

Les noms des arguments n'ont d'importance qu'au sein du corps de la fonction. Ils servent à décrire le travail que devra
effectuer la fonction quand elle est appelée: Ce sont des variables locales
LES FONCTIONS
DECLARATION D’UNE FONCTION (1)
❑ La déclaration (prototype) d'une fonction indique uniquement le type des paramètres transmis et reçus
par la fonction.
❑ Lors de la déclaration, le nombre et le type des paramètres doivent nécessairement correspondre à
ceux de la définition de la fonction.
❑ On peut facultativement inclure les noms des paramètres dans la déclaration, mais ils ne sont pas
considérés par le compilateur.
❑ Les noms fournissent une information intéressante pour le programmeur qui peut en déduire le rôle des
différents paramètres.
LES FONCTIONS
DECLARATION D’UNE FONCTION (2)
Pour écrire un programme comportant des fonctions, deux schémas sont possibles:
❖ Schéma 1: (c'est le schéma utilisé dans l'exemple précédent de somme). La fonction est définie avant son
appel. Dans ce cas, elle n'a pas besoin d'être déclarée.
❖ Schéma 2: Déclarer chaque fonction avant de l'utiliser. La déclaration informe le compilateur du type des
paramètres et du résultat de la fonction. A l'aide de ces données, le compilateur peut contrôler si le nombre
et le type des paramètres d'une fonction sont corrects.
LES FONCTIONS
RÈGLES DE VISIBILITÉ DES VARIABLES
❑Par définition, une variable est visible par toutes les fonctions et les expressions de code qui
suit sa déclaration si ces dernières sont à un niveau de bloc égal ou inférieur.

❑Les variables globales :


 Elles sont déclarées hors de toute fonction
 Elles sont donc connues, valides et utilisables dans tout le fichier où elle est définie; cela à
partir de l’endroit de sa déclaration. Selon sa classe de mémorisation, elle peut même
s’étendre à d’autres fichiers.

❑Les variables locales :


 Elles sont définies à l’intérieur d’un bloc ou d’une fonction. Par définition, elles sont donc
visibles, valides et utilisables uniquement pour ces blocs ou fonctions.
LES FONCTIONS
RÈGLES DE VISIBILITÉ DES VARIABLES
LES FONCTIONS
RENVOYER UN RÉSULTAT
❑Par définition, toutes les fonctions fournissent un résultat d'un type que nous devons
déclarer.
❑Une fonction peut renvoyer une valeur d'un type simple ou l'adresse d'une variable ou
d'un tableau.
❑Pour fournir un résultat en quittant une fonction, il faut utiliser la commande return.
❑L'instruction return a les effets suivants:
✓évaluation de l‘expression
✓conversion automatique du résultat de l'expression dans le type de la fonction
✓renvoi du résultat
✓terminaison de la fonction
LES FONCTIONS
EXEMPLES
❑Exemple1: Ecrire un programme qui affiche la moyenne de trois entiers saisis au clavier.
=> dans ce programme, on fait appel à la fonction somme.
LES FONCTIONS
EXEMPLES
❑Exemple2: Ecrire un programme qui affiche le maximum de deux entiers lus au clavier
(fonction contenant plusieurs return).
LES FONCTIONS
EXEMPLES
❑Exemple2: Ecrire un programme qui affiche le maximum de deux entiers lus au clavier
(fonction contenant plusieurs return).
LES FONCTIONS
PASSAGE DES PARAMÈTRES PAR VALEUR
❑En C, le passage des paramètres se fait toujours par la valeur, c.-à-d. les fonctions
n'obtiennent que les valeurs de leurs paramètres et n'ont pas d'accès aux variables elles-
mêmes.

❑Les paramètres d'une fonction sont à considérer comme des variables locales qui sont
initialisées automatiquement par les valeurs indiquées lors d'un appel.

❑A l'intérieur de la fonction, nous pouvons donc changer les valeurs des paramètres sans
influencer les valeurs originales dans les fonctions appelantes.
LES FONCTIONS
PASSAGE DES PARAMÈTRES PAR VALEUR
❑Exemple: Ecrire un programme qui permute deux entiers saisis au clavier.
LES FONCTIONS
PASSAGE PAR ADRESSE (1)
❑Passage par valeur: une fonction n'obtient que les valeurs de ses paramètres.

❑Pour changer la valeur d'une variable de la fonction appelante, nous allons procéder comme
suit:
o la fonction appelante doit fournir l'adresse de la variable.
o la fonction appelée doit déclarer le paramètre comme pointeur.

Passage par adresse


LES FONCTIONS
PASSAGE PAR ADRESSE (2)
❑On peut alors atteindre la variable à l'aide du pointeur.

Ainsi, à partir de la fonction fct,


il est possible de modifier la
valeur de la variable ‘x’ de
main, en utilisant le pointeur ‘a’
qui pointe sur x.
LES FONCTIONS
PASSAGE PAR ADRESSE (3)
❑Exemple: Ecrire un programme qui permute deux entiers saisis au clavier.
LES FONCTIONS
FONCTIONS RÉCURSIVES
Exemple : Le calcul de la factorielle

❑ La définition mathématique de la factorielle est connue et simple :


est indéfini si n  0
n!= 1 si n = 0
n

 i = 1 2  3  ... (n − 1)  n
i =1
si n  0

 erreur si n  0

Fact(n) =  1 si n = 0
n  Fact(n − 1) si n  0

LES FONCTIONS
FONCTIONS RÉCURSIVES
❑Suite de l’exemple : le calcul de la factorielle
 erreur si n  0

Fact(n) =  1 si n = 0
n  Fact(n − 1) si n  0

Fonction-Factoriel (Nombre)
SI Nombre < 0
retourne erreur
Si Nombre = 0
retourne 1
SINON
retourne Nombre * Fonction-Factoriel(Nombre – 1)

int Factoriel(int N)
{
if (N < 0) { /* Parametre d’entree invalide */
return -1; /* -1 represente erreur */
} else if (N == 0) {
return 1; /* Cas limite */
} else {
return N * Factoriel(N – 1); /* Appel recursif */
}
}
Application 1:
Ecrire un programme qui permute deux entiers saisis
au clavier. Utiliser une fonction permuter avec un
passage par valeur et par adresse
Application 1:
Application 1:
Application 2:
Ecrire un programme qui retourne le maximum, le minimum, la somme et la moyenne d’un
tableau d’entiers.
Utiliser 3 fonctions:
➢Maximum: pour retourner le max d’un tableau
➢Minimum: pour retourner le min d’un tab
➢Somme: pour calculer les éléments d’un tab
Application 3:
Ecrire un programme qui permet de compter le nombre d’occurrences
d’un entier donné dans un tableau donné.
Utiliser une fonction:
➢Nb_Occurences: pour retourner le nombre d’occurrences d’un élément
dans un tab
Application 4:
Ecrire un programme qui lit un tableau et l'affiche dans l'ordre inverse
Utiliser une fonction:
➢Remplir_Tab(): pour remplir un tab donné.
➢Afficher_Tab(): pour afficher un tab donné.
➢Inverser_Tab: pour inverser un tab donné.
Application 5:
Ecrire un programme permettant de fusionner deux tableaux tab1 et tab2,
contenant respectivement N1 et N2 entiers.
Utiliser les fonctions :
➢Remplir_Tab(): pour remplir un tab donné.
➢Afficher_Tab(): pour afficher un tab donné.
➢Fusion_Tab() : pour fusionner les éléments de tab1 et tab2 dans un tableau
fusion.
LES CHAÎNES DE CARACTÈRES
LES CHAÎNES DE CARACTÈRES (1)
❑Définition: Une chaîne de caractères est un tableau à une
dimension de caractères. Il existe des notations particulières et
une bonne quantité de fonctions prédéfinies pour le traitement
de tableaux de caractères.
❑Déclaration et mémorisation:
✓Lors de la déclaration, il faut indiquer l'espace à réserver en
mémoire pour le stockage de la chaîne. (char nom[30]; )
✓La représentation interne d'une chaîne de caractères est terminée par
le symbole '\0'. Ainsi, pour un texte de n caractères, il faut prévoir
n+1 octets (taille de char est 1 octet).
✓Le nom d'une chaîne représente l'adresse du premier caractère de la
chaîne.
✓utilisation du format %s pour les chaines de caractères.
✓Comme le nom d'une chaîne de caractères est le représentant de
l'adresse du premier caractère de la chaîne, il ne doit pas être
précédé de l'opérateur adresse '&'.
LES CHAÎNES DE CARACTÈRES (2)
LES CHAÎNES DE CARACTÈRES (3)
Initialisation de chaînes de caractères:

❑ En général, les tableaux sont initialisés par l'indication de la liste des éléments du tableau entre accolades:
✓ char nom[8] = {'m','o','h','a','m','e','d','\0'}; obligatoire lors de l’initialisation avec une liste
ou bien
✓ char nom[] = {'m','o','h','a','m','e','d','\0'};

❑ Pour le cas spécial des tableaux de caractères, il est possible d’utiliser une initialisation plus confortable en
indiquant simplement une chaîne de caractère constante: char nom[] = "mohamed";

❑ Lors de l'initialisation par [], il y a réservation automatiquement du nombre d'octets nécessaires pour la
chaîne, c.-à-d.: le nombre de caractères + 1. Il est aussi possible d’indiquer explicitement le nombre d'octets
à réserver, si celui-ci est supérieur ou égal à la longueur de la chaîne d'initialisation.
LES CHAÎNES DE CARACTÈRES (4)
Exercice: Déclaration correcte? Nb octets?

1. char a[] = "un\ndeux\ntrois\n"; => oui, 15 octets (\n est un caractère aussi)

=>incorrecte, correction: char b[14] = "un deux trois"; ou mieux: char b[] = "un deux
2. char b[12] = "un deux trois"; trois";

3. char c[] = 'abcdefg'; =>incorrecte, correction: char c[8] = "abcdefg"

4. char d[10] = 'x'; => Correction: char d[10] = {'x', '\0'} ou mieux: char d[10] = "x"; Espace: 2 octets

5. char e[5] = "cinq"; => Déclaration correcte Espace: 5 octets

6. char g[2] = {'a', '\0'}; => Déclaration correcte Espace: 2 octets

=> Déclaration incorrecte, Dans une liste de caractères, il faut aussi indiquer le symbole de fin
7. char h[4] = {'a', 'b', 'c'}; de chaîne, correction: char h[4] = {'a', 'b', 'c', '\0'}; Espace: 4 octets
LES CHAÎNES DE CARACTÈRES (5)

❑ Accès aux éléments d'une chaîne

L'accès à un élément d'une chaîne de caractères peut se faire de la même façon que l'accès à un élément
d'un tableau.
LES CHAÎNES DE CARACTÈRES (5)
Les bibliothèques de fonctions de C contiennent une série de fonctions spéciales pour le traitement de chaînes de
caractères (stdio, string, stdlib, ctype)

❑ Les fonctions de stdio.h (puts et gets):

✓ puts: permet d’afficher une chaine de caractère en provoquant un retour à la ligne


➢ Syntaxe: puts( char * )

➢ gets: permet de lire une ligne de caractères et la copie à l'adresse indiquée. Le retour à la ligne final est
remplacé par le symbole de fin de chaîne '\0'.
➢ Syntaxe: gets( char * )
LES CHAÎNES DE CARACTÈRES (6)
❑ Exemples avec puts et gets:
LES CHAÎNES DE CARACTÈRES (7)
❑ Les fonctions de string.h: La bibliothèque fournit une multitude de fonctions pratiques pour le traitement de
chaînes de caractères.

✓ strlen(char*) fournit la longueur de la chaîne sans compter le '\0'

✓ strcpy(char *s, char *t) copie <t> vers <s>


LES CHAÎNES DE CARACTÈRES (8)

✓ int strcmp(char *s , char *t): compare <s> et


<t> lexicographiquement et fournit un
résultat:
➢ négatif si <s> précède <t>
➢ zéro si <s> est égal à <t>
➢ positif si <s> suit <t>
LES CHAÎNES DE CARACTÈRES (8)
✓ strcat(char * s, char *t) ajoute <t> à la fin
de <s>
EXERCICES
EXERCICE 1:

Ecrire un programme qui lit une chaine de caractères, et affiche le nombre d'occurrences
d'un caractère lu au clavier dans la chaine.
ch: bonjour bonjour
caract: o
le nombre d'occurrences de la lettre o est 4
PS: Utiliser deux fonctions:
1/saisir_caractere: pour saisir le caractère à chercher
2/nb_occurences: pour retourner le nombre d’occurrences d’un caractère dans une chaine
EXERCICES
EXERCICE 2:

Ecrire un programme qui lit une chaine de caractère et l'affiche dans l'ordre inverse, après avoir
permuté les caractères.
Exemple:
bonjour
ruojnob
PS: Utiliser une fonction:
1/Inverser_Chaine: pour inverser la chaine de caractères
EXERCICES
EXERCICE 3:

Ecrire un programme permettant de tester si un mot donné est un palindrome. On appelle


palindrome tout mot qui se lit de la même façon de gauche à droite ou de droite à gauche.
Exemple MUM, LAVAL, ELLE, …
Utiliser la fonction
➢ palindrome: qui retourne true si le mot passé en argument est palindrome et faux
sinon.
EXERCICES
EXERCICE 4:

Ecrire un programme qui lit une chaine de caractères, et supprime toutes les occurrences d’un
caractère, lu au clavier, de la chaine
ch: bonjour bonjour
caract: o
bnjur bnjur
Utiliser 2 fonctions:
✓ saisir_caractere: pour saisir le caractère à supprimer de la chaine de caractères et le retourne.
✓ Supprimer_Caractere: pour supprimer toutes les occurrences d’un caractère, introduit en
paramètre, de la chaine.

Vous aimerez peut-être aussi