Académique Documents
Professionnel Documents
Culture Documents
1
● Année Académique:
2014/2015
● Parcours
INFOTEL
● Enseignant
Douwé Hallam Vincent
1
Informations générales
● Organisation du cours
CM: 12h
TD: 8h
TP: 10h
● Organisation des évaluations
1 CC de 2h
1 TPE: une semaine
Examen final 3h
Rattrapage 3h 2
Objectifs du cours
3
Plan du cours
4
Bibliographie
6
Algorithmique - Définition
9
Opérations sur les variables
options
if(x>2)
printf('x est supérieur à 2') ;
else
printf('x est inférieur à 2') ;
13
La sélection
while (x>0)
x-- ;
15
Les itérations
16
L'utilisation des sous-programmes
17
La déclaration de sous-programme
18
Déclaration de sous-programme
• Le corps du sous-programme est constitué des
déclarations locales(variables qui n'ont de
signification qu'à l'intérieur du sous-
programme) et du code correspondant au
sous-programme.
int carre (int entree){
int resultat ;
resultat=entree*entree ;
return resultat ;
}
19
Appel de sous-programme
20
Paramètres des sous-programmes
• Les variables utilisées comme arguments
lors de la déclaration d'un sous-programme
sont appelées paramètres formels.
• Les variables utilisées lors de l'appel du
sous-programme sont appelées paramètres
effectifs.
• Les variables déclarées à l'intérieur d'un
sous-programme sont appelées des
variables locales. 21
Passage des paramètres
Il existe trois façons de passer les paramètres
actuels aux sous-programmes :
• Passage par valeur. Le paramètre effectif
23
Les types de base
24
Les types composés
25
Le type énuméré
26
Les tableaux
27
Les enregistrements
29
LES POINTEURS ET
L'ALLOCATION DYNAMIQUE DE
LA MÉMOIRE
30
Introduction
35
Les pointeurs
Exemple:
int x=1; /* x est de type int */
int y=2; /* y est de type int */
int *ip; /* ip est de type int * */
ip=&x; /* ip pointe sur x */
y=*ip ; /* y contient la valeur pointée par ip */
*ip=0 ; /* la valeur pointée par ip vaut 0 */
x=?? y= ??
37
Les pointeurs
39
Le pointeur générique
41
Le pointeur générique
42
Priorité des opérateurs
43
Priorité des opérateurs.
48
Pointeurs et tableaux
Exemple:
int vecteur[10]; déclare 10 emplacements qui
peuvent contenir des valeurs de type int.
La notation vecteur[i] fait référence au i ème
élément du tableau.
int *pa=&vecteur[0];
pa contient l'adresse du premier élément du
tableau
pa+1 l'adresse du deuxième élément.
50
Pointeurs et tableaux
51
Pointeurs et tableaux
52
Exemple
55
Opérations arithmétiques
56
Opérations
57
Pointeurs et chaînes de caractères
58
Les chaînes constantes
59
Les pointeurs et chaînes
60
Les pointeurs et chaînes
62
Opérations sur les chaînes
63
Pointeurs de fonctions
64
Pointeurs de fonctions
68
Exercice
71
LA GESTION DYNAMIQUE DE
LA MÉMOIRE
72
Allocation dynamique de la mémoire
73
Les données statiques
74
Les données automatiques
76
Inconvénients des données statiques
Les données statiques présentent certains défauts:
●Mauvaise utilisation de l'ensemble de la mémoire.
78
Les opérations de base
Le langage C offre quatre fonctions définies
dans la bibliothèque stdlib.h pour la gestion
dynamique de la mémoire. Il s'agit des
opérations:
●malloc permet d'allouer un emplacement de
taille définie
●calloc alloue des espaces en les initialisant à 0
alloué
●free libère un emplacement alloué.
79
La fonction malloc
80
La fonction malloc
81
La fonction malloc
#include <stdlib.h>
#include <stdio.h>
main(){
char *adr1;
adr1=malloc(100);
*adr1='y';
free(adr1) ;
}
84
La fonction calloc
La fonction
void * calloc(size_t nb_blocs, size_t taille);
Alloue l'emplacement nécessaire à nb_blocs
consécutifs, ayant chacun une taille de taille
octets.
Contrairement à ce qui se passe avec malloc
où le contenu de l'espace mémoire alloué était
imprévisible, calloc remet à zéro chacun des
octets de la zone ainsi 85allouée.
La fonction realloc
La fonction
void * realloc(void *pointeur, size_t taille);
permet de modifier la taille d'une zone
préalablement allouée (par malloc, calloc ou
realloc).
Le pointeur doit être l'adresse de début de la
zone dont on veut modifier la taille.
taille représente la nouvelle taille souhaitée.
86
Les fonctions d'allocation
87
LES STRUCTURES DE DONNÉES
ABSTRAITS
88
Définition
Les algorithmes et les systèmes réactifs
manipulent les données. Ils les lisent,
manipulent et livrent des résultats à l'extérieur
Ces tâches peuvent se laissent spécifier sans
se soucier de l'organisation interne de ces
données.
Ce principe se nomme abstraction des données.
Les données sont alors des objets avec une
interface c'est à dire une liste d'opérations qui
peuvent s'exécuter sur ces objets.
89
Définition
91
Les fondements mathématiques
95
Définition mathématique
différentes opérations.
97
La sémantique
98
La sémantique
101
Opérations sur les listes
position p.
102
Opérations sur les listes
● NEXT(p,L) et PREVIOUS(p,L) renvoient
respectivement les positions avant et après p
dans la liste L.
● MAKENULL(L) transforme L en une liste vide
liste
● PRINTLIST(L) affiche les éléments de L dans
l'ordre d'apparence.
● END(L) renvoie la position après le dernier
createList:{} → List
●Cons: permet d'ajouter un élément à une liste
104
Caractéristiques
List
type List T
opns : createList: {} → List
cons: T x List → List
insert: T x Int x List → List
locate: T x List → List
retrieve: int x List → List
delete: int x List → List
next: int x List → List
previous: int x List → T
makeNull: List → T
first: List → T
printList: List → {}
105
Problème
106
Solution
111
Implémentation des listes en utilisant les
pointeurs
struct celltype{
T element;
celltype* next;
}
typedef celltype* LIST;
typedef LIST* position;
position END ( LIST L){
return null ;
}
112
Les listes linéaires
la liste (l'opérateur:)
●length qui donne le nombre d'éléments dans la
liste
●head qui renvoie l'élément qui se trouve en tête
de la liste.
●tail qui donne le reste de la liste sans l'élément de
tête 114
●++ qui permet de fusionner deux listes en une.
Les listes linéaires
116
Les vecteurs
117
Les vecteurs
Les opérations suivantes peuvent être
invoquées sur les vecteurs :
●makeArray qui transforme une liste en un
vecteur
●length qui donne le nombre d'éléments du
vecteur
●lookup prend un indice et renvoie l'élément qui
un indice donné.
118
Les vecteurs
119
Les vecteurs
120
Les piles
partir du néant
●push permet d'insérer un élément au sommet
de la pile
●pop permet d'enlever l'élément stocké au
sommet de la pile
●top lit la valeur stockée au sommet de la pile
123
Les piles
124
Les files d'attentes
126
Les files d'attente
127
Les files d'attente
131
Les arbres binaires
132
LA RÉCURSIVITÉ
133
Introduction
134
Définition
135
Définition
Une fonction récursive f est définie pour partie
en référence à elle-même. Sa définition est une
structure conditionnelle comprenant :
●Un test d'arrêt qui détecte un sous-ensemble
139
Exemples
140
La puissance de la récursivité
141
Usage
142
Dangers
143
Dangers
144
Schéma général
● P = P[S, if B P]
145
Quand ne pas utiliser la récurrence?
● P = S ; if B P
146
Exemple
La fonction factorielle
On a :
f(0)=1
f(n+1)=(n+1)*f(n)
Si on ajoute deux variables I et F pour contenir
n et f(n) correspondant, on a :
P= if I<n {I=I+1 ; F=I*F ; P}
147
Exemple
On a la fonction suivante :
appelle P
Ainsi la récurrence peut ne pas être apparente
quand on a un algorithme.
150
Les algorithmes récursifs
154
La fonction d'Ackermann
●A(m+1,0) = A(m,0)
155
Les structures de données récursives
La définition d'un type est la spécification de
l'ensemble des valeurs d'un domaine.
On a des types statiques et des types
dynamiques.
Les types de données récursifs sont des types
qui se définissent en termes d'eux même.
Exemples :
le type des expressions
L'arbre généalogique.
156
Les structures de données récursives
159
Les listes linéaires
Avec les listes linéaires, on a les
constructeurs :
●createList qui crée une liste vide
liste.
On a aussi les opérations suivantes :
●head qui donne l'élément de tête
de tête
●length qui donne le nombre d'éléments de la
liste 160
Les listes linéaires
161
Implémentations
162
Implémentations
173
Le problème des huit reines
fois,
●un disque peut être déplacé d'un des trois
1 2 3
178
Les Tours d'Hanoï
180