Académique Documents
Professionnel Documents
Culture Documents
Plan du cours
1. Introduction à l'algorithmique & rappels
2. Fonctions récursives
3. Les structures
4. Listes linéaires chaînées
5. Piles et Files
6. Arbres binaires
7. Arbres binaires de recherche
8. Tables de hachage
9. Graphes
1
28/02/2024
Rappels et compléments de C
Algorithme
• Permet de résoudre un problème donné
ex: Trier une liste de noms par ordre
alphabétique
• Définition. Un algorithme est une
procédure de calcul bien définie qui prend
en entrée un ensemble de valeurs et qui
délivre en sortie un ensemble de valeurs.
2
28/02/2024
Algorithme
Informations
en entrée
Algorithme informatique
=
procédure de calcul
Informations
en sortie
Algorithme
• Séquence d'instructions élémentaires
3
28/02/2024
Algorithme
• Définition .Une valeur particulière de
l'ensemble des valeurs données en entrée est
appelée instance du problème.
Algorithme
Les ordinateurs ne comprennent que quatre
catégories d'instructions :
1.l'affectation de variables ;
2.la lecture/écriture ;
3.les tests (les structures conditionnelles) ;
4.les boucles (les structures itératives).
4
28/02/2024
Exemple
• Exemple de problème à résoudre
Comment trier une liste d'élèves par ordre
alphabetique?
Algorithme et programme
• Programme :
– codage d’un algorithme afin que l’ordinateur
puisse exécuter les actions décrites
– doit être écrit dans un langage compréhensible
par l’ordinateur
• langage de programmation
• Un programme est donc une suite ordonnée
d’instructions élémentaires codifiées dans un
langage de programmation
10
5
28/02/2024
Algorithme et Programme
• Un algorithme est implémenté dans un
langage de programmation
• Pseudo-code
11
Structure de Données
• Moyen de stocker et organiser les données
d'un algorithme
– accès aux données
– modification des données
6
28/02/2024
Structures de contrôle
• Structures de contrôle conditionnelle
– Si cond Alors instr FinSi
– Si cond Alors instr sinon instr1 FinSi
(imbrications possibles)
13
La structure de contrôle
conditionnelle
• La structure de contrôle conditionnelle se
présente en général sous la forme :
si expression alors
première séquence d'instructions
sinon
deuxième séquence d'instructions
finsi
14
7
28/02/2024
15
16
8
28/02/2024
Autres règles
• Contraintes imposées par le langage
– Toute variable apparaissant dans le bloc d'instructions
doit être déclarée.
• Contraintes imposées par l'usage
Bloc déclaration
type nom_variable ;
• Syntaxe
– Nom_variable est un identificateur :
• les caractères sont les lettres (A..Z,a..z) et les chiffres 0..9 et le
soulignement (pas de caractères spéciaux, pas de blancs)
• ne commence pas par un chiffre
• minuscules et majuscules sont différentes M≠m
• Déclarer une variable sert à
– désigner son nom
– spécifier le domaine des valeurs que peut «contenir »
cette variable
18
9
28/02/2024
Types
• Généralités
– Un type est un nom pour un ensemble de valeurs.
Un type est muni d'opérateurs.
– Déclarer une variable sert aussi à connaître les
opérateurs applicables à (la valeur de) la variable
• Les types entiers: int, char
• Les types réels: float, double
• Type booléen: Le booléen faux est représenté par
l’entier 0, et le booléen vrai par tout entier
différent de 0. , le OU : et le NON :
19
Contractions d'opérateurs
10
28/02/2024
Opérateurs et Expressions
Opérateurs arithmétiques en C
• De plus, il existe un opérateur de "modulo" noté % qui ne peut porter
que sur des entiers et qui fournit le reste de la division de son premier
opérande par son second. Par exemple: 11%4 vaut 3 et 23%6 vaut 5
21
• ( )
• - ! Opérateurs unaires, ex, -a !a
• * / %
• + -
• < <= > >=
• == !=
• && ||
• =
11
28/02/2024
Opérateurs et Expressions
23
Operateur Conditionnel
• c = a < b ? a + 1 : b – 1;
24
12
28/02/2024
Casting
( type_name ) expression
float f, frac_part;
frac_part = f – (int) f;
float quotient;
int dividend, divisor;
quotient = (float) dividend / divisor;
25
Instructions d’entrée-sortie
scanf("FORMAT", &nom_variable);
– Permet de saisir (lire) des données tapées au clavier
– FORMAT permet de spécifier le type de la variable lue. Par exemple,
"%d" pour un entier, "%f" pour un réel
Exemple
int I;
scanf ("%d",&I) ;
Lecture d’un caractère:
• getchar lit un caractère
• putchar affiche un caractère
• exemple:
int c;
c = getchar();
putchar(c); /* affiche la valeur de c à l’écran */
26
13
28/02/2024
Instructions d’entrée-sortie
27
Conditionnelle
if (condition)
instruction1 ;
if (condition);
instruction1 ;
condition est une expression booléenne
L'exécution de l'instruction globale
évalue la condition
si la condition est vraie, exécute l'instruction 1.
Attention : si la condition est fausse, il ne se passe rien.
Exemple
N = 4 ; I=2;
if (N==I*I)
printf ("L'entier %d est un carré parfait", N);
28
14
28/02/2024
Conditionnelle
if (condition) instruction1; else instruction2;
• Exemple
N = 5; I=2;
if (N= =I*I) printf ("L'entier %d est un carre parfait", N);
else printf("L'entier %d n'est pas un carre parfait", N);
29
Conditionnelle
• Exemple
N=5;
if (N % 2 = =0) printf("%d est pair", N);
else {
N = N-1 ;
printf ("%d est pair", N);
}
30
15
28/02/2024
if imbriqués
int i = 100;
if(i > 0)
if(i > 1000)
printf("i > 1000\n");
else
printf(“else \n");
31
if imbriqués
•
int i = 100;
if(i > 0) {
if(i > 1000)
printf(" i> 1000 \n");
} else
printf(“i est negative\n“);
32
16
28/02/2024
Conditionnelle
switch (expression) {
case expression-constante : bloc-instruction 1; break;
case expression-constante : bloc-instruction 2; break;
...
case expression-constante : bloc-instruction n; break;
default : bloc-instruction;
}
• le cas default est facultatif.
• L'instruction break provoque une sortie immédiate du switch
33
Conditionnelle
• Exemple
N=5
switch (N%2) {
case 1 : printf ("%d est impair", N) ; break;
case 0 : printf ("%d est pair", N) ;
}
• Exemple
switch (C) {
case ‘0’ : case ‘2’ : case ‘4’ : case ‘6’ : case ‘8’ :
printf("%d est le code d’un chiffre pair" , C); break;
case ‘1’ : case ‘3’ : case ‘5’ : case ‘7’ : case ‘9’ :
printf("%d est le code d’un chiffre impair", C); break;
default :
printf ("%d n’est pas le code d’un chiffre, c’est %c", C, C);
}
34
17
28/02/2024
35
36
18
28/02/2024
37
38
19
28/02/2024
Exemple
i=1;
while(i<5)
{
printf(“dans la boule %d\n",i);
i++;
}
printf("Extérieur%d\n",i);
39
40
20
28/02/2024
int i,j;
for (i = 0; i <3; i++) {
printf ( "i = %d\n", i);
}
for(j = 3; j > 0; j- -)
printf("j = %d\n", j);
float angle;
41
42
21
28/02/2024
43
Récursivité
• Une fonction est récursive si elle s'appelle elle-
même.
exemple :
int factoriel ( int n )
{
if ( n <= 1 )
return 1 ;
else
return n * factoriel(n-1) ;
}
44
22
28/02/2024
Récursivité
• Pour écrire une fonction récursive:
• Il faut:
– Trouver une condition d’arrêt, c’est-à-dire, un cas
où la solution est triviale.
– Décomposer le problème non trivial en un
problème d’ordre inférieur.
45
Récursivité : Fibonacci
• Un autre exemple classique de récursivité est la suite de
Fibonacci :
int fib ( int n )
{
if ( n <= 1 )
return 1 ;
else
return fib(n-1)+fib(n-2);
}
46
23
28/02/2024
Tableaux et pointeurs
• la variable nom tableau contient l'adresse de
la première case du tableau.
47
Pointeurs
• Un pointeur est une variable "pointant " vers
un emplacement en mémoire.
• En pratique :
• Un pointeur est une variable qui contient
l'adresse mémoire d'une variable.
48
24
28/02/2024
2 operateurs spécifiques :
• & donne l'adresse d'une variable:
• char c = 'a';
• char *p = &c; /* p est de type (char *) */
• * donne la valeur pointée par un pointeur (la valeur à
l'adresse correspondante) :
• printf("%c", *p); /* affiche a */
• Exemples :
• int x = 1, y = 2, z[10];
• int *pi;
• pi = &x;
• y = *pi;
• *pi = 0;
• pi = &z[0]; /* pi=z */
49
50
25
28/02/2024
D'autres exemples
• Déclarations :
• int i=6, b, *p, *pi, t[10]={10,20,30,40,50,60,70,80,90,100};
• Affectations et arithmétique :
• pi = &i;
• p = t;
• t = p; /* NON! pas d'affectation de tableau. */
• p += i;
• p = &t[3];
• *pi += 1; /* incrémente *pi */
• b = *t+1; /* b=t[0]+1 */
• b = *(t+1); /* b=t[1] ... attention aux priorités !*/
• un pointeur qui ne pointe sur rien : NULL.
• int *p = NULL; 51
Pointeurs et tableaux
• Si on déclare un tableau statique et un pointeur :
• int tab[10];
• int *p;
• alors l'affectation : p=&tab[0] est équivalente a
p=tab et *p désigne tab[0].
• les crochets sont une simplification d‘écriture :
tab[i] , *(tab+i)
• Il existe tout de même une différence entre
pointeur et tableau : un nom de tableau n'est pas
une variable, on ne peut donc rien affecter a un
nom de tableau, contrairement a un pointeur :
tab = p alors que p = tab. 52
26
28/02/2024
L'operateur sizeof()
• L'operateur sizeof() : Renvoie la taille en octets de
l'argument (soit un type, soit une variable)
• int A; char B[5][10];
• Sizeof( A) 2, sizeof (B) 50, sizeof ("abcd“) 5,
sizeof(float) 4, sizeof(double) 8
53
Allocation dynamique
• #include <stdlib.h>
• Pour réserver de l'espace au moment de
l’exécution, Il faut allouer la mémoire
dynamiquement: malloc ;
• Renvoie un pointeur sur la mémoire allouée ;
• La zone de mémoire n'est pas initialisée.
• long *a = (long *)malloc( sizeof(long) );
• int n = 100;
• long *tab = (long *) malloc(n * sizeof(long));
54
27
28/02/2024
Allocation dynamique
• calloc : Alloue et remplit de 0 la mémoire nécessaire;
renvoie un pointeur sur la zone allouée.
• int n = 100;
• long *tab = (long *) calloc(n, sizeof(long)); /* n fois 0 */
• realloc : realloc(p,size):Réduit (ou augmente) la taille du
bloc de mémoire pointé par p a une taille de size octets ;
conserve les size premiers octets a l'adresse p. Le reste de
la nouvelle zone n'est pas initialisé.
• int * tab;
• tab = (int *) calloc ( 2, sizeof(int) );
• tab[0] = 33; tab[1] = 55;
• tab = (int *)realloc(tab, 3 * sizeof(int) );
• tab[2] = 77; 55
Allocation dynamique
• Il peut toujours se produire des erreurs lors de
l'allocation dynamique de mémoire : il faut
toujours vérifier que le pointeur retourné lors
de l'allocation n'est pas NULL!
• int *p;
• if((p=(int *)malloc(nb*sizeof(int)))==NULL)
printf("alloc. ratée !");
56
28
28/02/2024
Libération de la mémoire
• Lorsqu'un emplacement mémoire n'est plus
utilisé, il est important de libérer cet espace.
• La fonction free(p ) : libère l'espace mémoire
pointé par p qui a été obtenu lors d'un appel a
malloc, calloc ou realloc
57
Chaînes de caractères
58
29
28/02/2024
Chaînes de caractères
• char ch;
• int i;
• i = ‘a’; /* i= 97 */
• ch = 65; /* ch = ‘A’ */
• ch = ch + 1; /* ch = ‘B’ */
• ch++; /* ch = ‘C’ */
59
Chaînes de caractères
• ‘a‘, ‘b’, ‘c’ sont des caractères constants
• Chaine de caractères: tableaux de caractères
• − " une chaine constante"
• − 'x' "x"
60
30
28/02/2024
Chaînes de caractères
61
Chaînes de caractères
• char chaine [ 256 ] ;
• déclare un tableau de 256 caractères pour
stocker une chaîne. Par contre l’instruction :
• chaine=" bonjour " ;
• générera une erreur de compilation, puisque
dans ce cas on cherche à modifier l’adresse de
la variable tableau, ce qui est impossible.
62
31
28/02/2024
Chaînes de caractères
• On ne peut pas affecter une chaîne en dehors de la déclaration.
char mot[8] = "bonjour"; // OK
char mot[8] ;
mot = "bonjour"; // ERREUR
• On ne peut pas affecter une chaîne à une autre.
char mot1[8] ;
char mot2[8] ; // déclaration de deux chaînes
…
mot1 = mot2; // ERREUR
64
32
28/02/2024
• Ce programme affichera :
• La longueur de la chaine programmation est 13. 65
33
28/02/2024
67
68
34
28/02/2024
Copie
• La fonction strcpy permet de copier une chaîne
dans une autre :
• char chaine[]=" bonjour " ;
• char dest [ 256 ] ;
• strcpy ( dest , chaine ) ;
• La fonction strncpy permet de copier n
caractères d’une chaîne dans une autre
• strncpy(dest, chaine, n);
69
Recherche
• Il existe plusieurs fonctions standard permettant de
rechercher l’occurrence d’un caractère ou d’une sous-
chaîne dans une chaîne. C’est le cas de la fonction
strchr cherche la première occurrence d’un caractère
dans une chaîne donnée :
• char occ= ’ o ’ ;
• char *chaine=" bonjour " ;
• strchr ( chaine , occ) ;
• Retourne l’adresse du premier caractère ’o’ dans la
chaîne si le caractère cherché n’est pas dans la chaine
NULL est retourné.
• strrchr ( chaine , occ) ; cherche la dernière occurrence
de ‘o’ dans chaine.
70
35
28/02/2024
Recherche
• la fonction strstr effectue le même type de
recherche que strchr, mais le motif recherché
est une chaîne et non pas un caractère.
• strstr(ch1,ch2); recherche la première
occurrence de ch2 dans ch1; sinon NULL
• La fonction strpbrk
• strpbrk(ch1,ch2) cherche dans ch1 la
première occurrence d‘un caractère
quelconque de ch2
71
Recherche
• char *strtok(char *s1, const char*s2);
• Cette fonction permet de couper la chaine de
caractères «s1» en symbole élémentaire en les
séparant par les caractères de la chaine de
caractères «s2».
72
36
28/02/2024
Recherche
• Exemple:
• #include <stdio.h>
• #include <string.h>
• int main ()
• {
• char ch[] ="Cette fonction, ajoute une chaîne la suite d'une autre;
On appelle concaténation.";
• char * pch;
• printf (" les éléments de \"%s\" sont :\n",ch);
• pch = strtok (ch, " ,.;'");
• while (pch != NULL)
• {
• printf ("%s\n",pch);
• pch = strtok (NULL, " ,.;'");
• }
• }
73
Chaînes de caractères
• Le fichier d’en-tête ctype.h contient la déclaration de
fonctions destinées à tester les caractères:
37
28/02/2024
Chaînes de caractères
38
28/02/2024
78
39