Programmation Structurée en C
Programmation Structurée en C
Structurée IMA3
Version 2012/2013
Laure Gonnord
Premature optimization is the root of all evil (or
at least most of it) in programming.
[Link]@[Link]
Laure Gonnord Polycopié de Programmation Structurée IMA3 2012/2013
3 Fonctions/Actions 29
3.1 Actions/fonctions : notions de base . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2 Notions de complexité et de correction . . . . . . . . . . . . . . . . . . . . . . . 36
3.3 Actions/fonctions récursives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4 Vecteurs/Tableaux 44
5 Algorithmique du Tri 54
6 Variables modiables en C : les pointeurs 61
6.1 Notions de base sur les pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2 Pointeurs et tableaux et chaînes de caractères . . . . . . . . . . . . . . . . . . . 74
3/85
Laure Gonnord Polycopié de Programmation Structurée IMA3 2012/2013
Chapitre 1
Motivations et premiers pas en C
Dans ce cours nous abordons le concept de système informatique et nous motivons l'appren-
tissage de l'algorithmique et de la programmation.
Un premier programme C est étudié. Une démo illustre l'édition du programme, sa compilation,
son exécution.
4/85
Plan
Systèmes informatiques
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 3 / 13 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 4 / 13
Introduction Pourquoi ? Introduction Pourquoi ?
Différents types :
Création, développement de logiciels suivant les besoins et les
temps réel (contraintes de temps) : contrôle d’une chaîne offres matérielles :
de production, ou le contrôle commande d’un avion.
Systèmes complexes
transactionnels : contrôles de bases de données, . . .
Gros logiciels
embarqués (pda), distribués (réservation de train), . . .
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 5 / 13 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 6 / 13
Introduction Pourquoi ? Introduction Pourquoi ?
Objectifs de l’enseignement :
Conception de bout en bout d’un logiciel : du cahier des
charges à l’implémentation et la documentation.
Analyse du problème initial et hiérarchisation des Cours prérequis des enseignements de : réseaux, systèmes,
priorités : notion de sous problème. programmation avancée, programmation objet, . . .
Réflexion sur la correction d’une solution et de son mais aussi analyse numérique, électronique, automatique !
implémentation : Preuve d’invariants.
Réflexions sur la pertinence des solutions et leur coût
d’exécution : Analyses de complexité.
Travail contraint en équipe et en temps : Réalisation de
projet.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 7 / 13 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 8 / 13
Premier programme en C Premier programme en C
Premier programme
Effet :
affiche Bonjour tout le monde!,
retourne le code 0 (tout s’est bien passé).
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 9 / 13 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 10 / 13
Premier programme en C Premier programme en C
Lancement de l’éditeur en tâche de fond (&). Lancement de l’éditeur en tâche de fond (&).
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 11 / 13 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 11 / 13
Premier programme en C Premier programme en C
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 11 / 13 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 11 / 13
Premier programme en C Premier programme en C
Lancement de la compilation avec clang. Si le compilateur ne dit rien, tout s’est bien passé.
Un fichier [Link] “binaire” a été créé.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 11 / 13 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 11 / 13
Premier programme en C Premier programme en C
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 11 / 13 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 11 / 13
Premier programme en C Premier programme en C
avec :./hello
nom du compilateur option Wall (tiret devant!)
I clang est un compilateur. On peut aussi utiliser gcc (plus
courant) ou encore (l’ordre est indifférent) :
clang -Wall nomfichier.c -o nombinaire
clang nomfichier.c -o nombinaire -Wall
clang peut être remplacé par gcc (autre compilateur).
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 12 / 13 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 1 : Introduction et Hello World 2012 13 / 13
Laure Gonnord Polycopié de Programmation Structurée IMA3 2012/2013
Chapitre 2
Algorithmique/programmation C de base
Dans ce cours nous abordons les concepts fondamentaux en algorithmique que sont la notion
de constante, de variable, de type, d'expression, de boucle. Un pseudo-code sera utilisé pour
décrire les programmes. L'équivalent en langage C est aussi donné.
10/85
Plan
5 Instructions
Instruction simple, instruction composée
Structures de contrôle
Itérations
Notations
1 Notations, identificateurs
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 3 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 4 / 40
Notations, identificateurs Variables et Types de base
Identificateurs
1 Notations, identificateurs
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 5 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 6 / 40
Variables et Types de base Variables et Types de base
On veut stocker des informations qui ont un nom : Une variable est une place en mémoire qui a un nom
un entier x pour pouvoir exprimer la fonction x 7→ x + 1 (convention : en minuscules) :
une chaîne de caractères s qui contient le prénom de Une variable a un type qui définit quelles opérations sont
l’utilisateur valides (entier, booléen, réel, caractère, . . . )
x, s peuvent prendre des valeurs différentes dans un Elle doit être déclarée AVANT d’être utilisée.
programme donné, ce seront donc des variables. Une déclaration de variable est la donnée d’un type et d’un
De plus, on veut qu’il soit interdit de stocker autre chose qu’un nom (identificateur).
entier pour x, autre chose qu’une chaîne pour s, on va donc I Important ! Déclarer une variable d’un certain type interdit de
leur donner un type. l’utiliser pour stocker des informations d’un autre type !
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 7 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 8 / 40
Variables et Types de base Variables et Types de base
Caractéristiques : Caractéristiques :
Codé sur 2 (ou 4 octets, ou 8) : range = [−215 , 215 − 1] N’existe pas en C : int,
sizeof(int) rend 2 ou 4 ou 8 Représentation : deux valeurs entières, 0 pour faux, 1 pour
vrai (en fait toute valeur différente de 0) : stdbool
Opérateurs : +, *, /, %(reste modulo), << (shift)
Opérateurs et (&&), ou (||) : paresseux de gauche à droite
Comparaison : !=, ==, <=
Déclaration pseudo-code
Déclaration pseudo-code
b : Booléen
x : Entier
Déclaration en C
Déclaration en C
# include < s t d b o o l . h>
int x ; // declaration simple
bool a ;
i n t z =10; / / declaration avec v a l e u r initiale
b o o l b= f a l s e ; / / a v e c i n i t i a l i s a t i o n
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 9 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 10 / 40
Variables et Types de base Variables et Types de base
Caractéristiques : Caractéristiques :
Float 4 octets et double 8. 1 octet : 256 valeurs de l’ASCII étendu
Notation décimale ou exponentielle (12.3, -.38, .5e-11) Notation 'a'
Opérateurs : mêmes que int sauf %. / est la division réelle. Caractères spéciaux \n saut de ligne, \t tabulation, . . .
Déclaration en C Déclaration en C
float x ; / / declaration simple char c ; // declaration simple
f l o a t r =0.34; / / d e c l a r a t i o n avec v a l e u r initiale char c= ’ a ’ ; // declaration avec v a l e u r initiale
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 11 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 12 / 40
Variables et Types de base Variables et Types de base
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 13 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 14 / 40
Expressions Expressions
Expressions, pourquoi ?
1 Notations, identificateurs
2 Variables et Types de base On veut pouvoir effectuer des opérations avec les variables
d’un programme, par exemple :
3 Expressions Sommer des variables entières
Tester si une variable entière est plus petite qu’une autre
4 Constantes I Les opérations numériques seront des expressions
numériques, les opérations de tests seront des expressions
5 Instructions booléennes.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 15 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 16 / 40
Expressions Expressions
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 17 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 18 / 40
Expressions Expressions
On veut stocker des valeurs numériques dans des variables À gauche de l’affectation : une expression qui doit délivrer une
entières, des valeurs booléennes dans des variables variable (par opp. à constante) : une variable simple, ou un
booléennes, . . . . élément de tableau.
I Cette opération est appelée affectation. Sémantique :
Effet de bord : la valeur de droite est calculée et affectée à
la variable de gauche.
(en C) La valeur de l’expression entière est cette valeur
calculée : x = (y=8) +1 est une expression dont la valeur
vaut .....
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 19 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 20 / 40
Constantes Constantes
1 Notations, identificateurs
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 21 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 22 / 40
Constantes Constantes
Effet : dans la suite du programme, CST est remplacé par # define N ( ( x ) + ( y ) ) /∗ plus su ^ r ∗/
valeur (preprocessing C)
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 23 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 24 / 40
Instructions Instructions
Notion d’instruction
1 Notations, identificateurs
2 Variables et Types de base Une instruction est une ligne de pseudo-code/C qui effectue
un calcul, qui a un effet sur les variables du programme, . . .
3 Expressions Dans la suite, nous allons voir différentes formes
d’instructions :
4 Constantes les instructions simples
les instructions composées
5 Instructions
les instructions conditionnelles
Instruction simple, instruction composée
Structures de contrôle les instructions itération.
Itérations
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 25 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 26 / 40
Instructions Instruction simple, instruction composée Instructions Instruction simple, instruction composée
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 27 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 28 / 40
Instructions Structures de contrôle Instructions Structures de contrôle
Conditionnelle - 1 Conditionnelle - 2
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 29 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 30 / 40
Instructions Structures de contrôle Instructions Structures de contrôle
Conditionnelle - 3 Exercices
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 31 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 32 / 40
Instructions Itérations Instructions Itérations
Affectation
i ← inf
Utilisation classique avec compteur
Pour i de inf à sup Faire non
corps i ≤ sup ?
Fpour
i ← i + inc
(augmentation implicite de 1 à chaque tour). oui
f o r ( i = i n f ; i <=sup ; i = i + i n c )
corps
sortie
À utiliser en priorité lorsqu’on connaît le nombre d’itérations
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 35 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 36 / 40
Instructions Itérations Instructions Itérations
En C :
eval expr
while ( e x p r e s s i o n )
{
instructions non
expr ?
}
Sémantique (effet) I Tant que l’expression est vraie, le bloc
eval expr
est exécuté. oui
Si la condition est initialement fausse, le bloc n’est jamais
exécuté. corps de la boucle
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 37 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 38 / 40
Instructions Itérations Instructions Itérations
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 39 / 40 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 : Algo et C de base 2012 40 / 40
Laure Gonnord Polycopié de Programmation Structurée IMA3 2012/2013
2.2 Programmes en C
21/85
Plan
5 Exercices
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 3 / 21 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 4 / 21
Structure générale d’un programme Structure générale d’un programme
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 5 / 21 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 6 / 21
Exemple Exemple
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 7 / 21 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 8 / 21
Exemple Exemple
i n t main ( ) i n t main ( )
{ {
p r i n t f ( " Bonjour t o u t l e monde ! \ n " ) ; p r i n t f ( " Bonjour t o u t l e monde ! \ n " ) ;
return 0; return 0 ;
} }
Par convention, la fonction main renvoie un code de retour : La fonction printf permet d’écrire sur l’écran.
il est de type int (entier), elle fait partie de la bibliothèque C standard,
la convention est de retourner 0 si tout se passe bien, elle doit être importée depuis l’en-tête stdio.h.
les parenthèses de return sont facultatives,
le code de retour est exploitable depuis le shell.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 8 / 21 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 8 / 21
Exemple Printf et Scanf
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 8 / 21 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 9 / 21
Printf et Scanf Printf et Scanf
Lire une information au clavier : scanf Écrire quelque chose sur le terminal : printf
int x , y ;
p r i n t f ( ‘ ‘ donnez deux e n t i e r s svp ! \ n ’ ’ ) ;
s c a n f ( ’ ’%d %d ’ ’ ,&x ,& y ) ;
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 10 / 21 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 11 / 21
Les erreurs de compilation Les erreurs de compilation
2 Exemple
Lorsque le fichier source n’est pas correct, le compilateur
(clang, gcc) génère des erreurs de compilation.
3 Printf et Scanf
Remarque : les schémas d’erreurs sont différents selon les
4 Les erreurs de compilation compilateurs. Certains compilateurs récents (clang) ont des
messages plus explicites.
5 Exercices
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 12 / 21 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 13 / 21
Les erreurs de compilation Les erreurs de compilation
I Il manque un ;. Aucun binaire n’est généré. I Il manque un #include <stdio.h>. C’est un avertissement
non fatal.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 14 / 21 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 15 / 21
Les erreurs de compilation Les erreurs de compilation
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 16 / 21 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 17 / 21
Les erreurs de compilation Exercices
Commentaires
Commentaires : tout ce qui est entre /* et */ est ignoré. 1 Structure générale d’un programme
# include < s t d i o . h> / ∗ p o u r a v o i r printf ∗/
2 Exemple
/∗ la fonction principale
∗/
3 Printf et Scanf
i n t main ( / ∗ r i e n i c i ∗ / )
{
p r i n t f ( " toto \n" ) ; 4 Les erreurs de compilation
r e t u r n ( 0 ) ; / ∗ OK ∗ /
} 5 Exercices
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 18 / 21 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 19 / 21
Exercices Exercices
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 20 / 21 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 2 b: Algo et C de base 2012 21 / 21
Laure Gonnord Polycopié de Programmation Structurée IMA3 2012/2013
28/85
Laure Gonnord Polycopié de Programmation Structurée IMA3 2012/2013
Chapitre 3
Fonctions/Actions
29/85
Plan
Laure Gonnord
[Link] 2 Les Fonctions
[Link]@[Link]
4 Résumé
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 3 / 24 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 4 / 24
Conception Structurée Descendante Les Fonctions
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 5 / 24 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 6 / 24
Les Fonctions Les Fonctions
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 7 / 24 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 8 / 24
Les Fonctions Les Fonctions
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 9 / 24 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 10 / 24
Les Fonctions Les Fonctions
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 11 / 24 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 12 / 24
Les Actions / les Procédures Les Actions / les Procédures
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 13 / 24 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 14 / 24
Les Actions / les Procédures Les Actions / les Procédures
Exemple
L’appel d’une action est une instruction. Les paramètres resu : entier ;
formels sont TOUS remplacés par des paramètres effectifs de maxproc(3,43,resu);
même type
I Après l’appel, la variable resu contient le max des deux
Une donnée par une valeur (ou une expression qui a une entiers.
valeur)
Les actions/procédures sont surtout utiles pour :
Un résultat par une variable dans laquelle la procédure doit
ranger le résultat imprimer des valeurs, des structures, des messages . . .
Une Donnée/Résultat par une variable valuée. modifier des paramètres qui ne peuvent être retournés
(tableaux, paires, structures compliquées) : ceux-ci sont
alors appelés Données/Résultats ou entrées/sorties.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 15 / 24 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 16 / 24
Les Actions / les Procédures Les Actions / les Procédures
Définition
En C les actions/procédures sont des fonctions qui ne
void nom_action(liste-params) {
retournent rien (mot clef void).
liste-declarations (optionnelle)
void p r i n t m a x p r o c ( i n t a , i n t b ) liste_instructions
{ / / i m p r e s s i o n d u max }
i n t maxi ;
i f ( a<b ) maxi=b ; else maxi=a ;
p r i n t f ( " Le max e s t %d \ n " , maxi ) ; Appel
}
nom_action(liste-expressions)
Paramètres R ? voir le chapitre « pointeurs »
I on ne récupère pas le résultat d’une procédure, il n’y en a
PAS.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 17 / 24 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 18 / 24
Les Actions / les Procédures Résumé
Procédures en C - Exemples
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 19 / 24 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 20 / 24
Résumé Résumé
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 21 / 24 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 22 / 24
Résumé Résumé
Et si ? Et si ?
I Et si je veux “retourner” deux résultats ?
I Et si je veux modifier un paramètre d’entrée ? Action quotient_et_reste(a,b,q,r)
Action inc(a) D: a,b : Entiers
D/R: a : Entier R: q,r : Entiers
a ← a+1 .....
FAction (calcul de q et r)
FAction
Programme Main
L: x :Entier Programme Main
x ← 12 L: x,y,vq,vr :Entiers
inc(x) x ← 37
Imprime(x) y←7
Retourner 0 quotient_et_reste(x,y,vq,vr)
FProgramme Imprime(vq,vr)
Retourner 0
FProgramme
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 23 / 24 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3 Actions Procédures 2012 24 / 24
Laure Gonnord Polycopié de Programmation Structurée IMA3 2012/2013
36/85
Complexité Algorithmique
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours : Complexité Algorithmique 2012 3 / 12 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours : Complexité Algorithmique 2012 4 / 12
Complexité Algorithmique Complexité Algorithmique
Définition - 2 Exemple 1
Action maxproc(a,b,maxi)
D: a,b : entiers
La complexité se calcule :
R: maxi : entier
en moyenne sur toutes les exécutions possibles du Si a<b alors
programme, maxi ← b
au mieux (le minimum), Sinon
maxi ← a
au pire (le maximum).
Fsi
et s’exprime (en général), asymptotiquement, c’est-à-dire FAction
comme une limite pour de grandes valeurs des paramètres
d’entrées. I quels que soient a et b, on ne fait qu’un test. La complexité
en temps/nb ops/mémoire, en moyenne, au pire, au mieux, est
donc O(1).
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours : Complexité Algorithmique 2012 5 / 12 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours : Complexité Algorithmique 2012 6 / 12
Complexité Algorithmique Complexité Algorithmique
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours : Complexité Algorithmique 2012 7 / 12 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours : Complexité Algorithmique 2012 8 / 12
Correction Correction
1 Complexité Algorithmique
On aimerait garantir d’un programme/une fonction satisfait ses
spécifications, c’est-à-dire calcule le “bon résultat” quelles
2 Correction
que soient ses paramètres (paramètres d’entrée, variables
données par l’utilisateur, données de capteurs physiques, . . . ).
I On montre la correction du pseudo-code et/ou de
l’implémentation C à l’aide d’invariants !
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours : Complexité Algorithmique 2012 9 / 12 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours : Complexité Algorithmique 2012 10 / 12
Correction Correction
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours : Complexité Algorithmique 2012 11 / 12 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours : Complexité Algorithmique 2012 12 / 12
Laure Gonnord Polycopié de Programmation Structurée IMA3 2012/2013
La notion de récursivité est une notion-clef en algorithmique. Une fonction récursive est
une fonction qui dans son code fait un appel à elle-même. Ce type de fonctions permet de réaliser
des algorithmes complexes sans utiliser de boucles. Il convient néanmoins de faire attention à
la terminaison du programme, en faisant en sorte que chaque appel récursif fasse décroitre
strictement une certaine quantité. Au début de la fonction, un test sur cette quantité retournera
directement le résultat voulu.
40/85
Définition
Algorithmique et Programmation, IMA
Cours 3c - Récursivité
Laure Gonnord
[Link] Un algorithme (une fonction, une procédure) est dit récursif si
[Link]@[Link] sa définition (son code) contient un appel à lui-même.
Université Lille 1 - Polytech Lille Un algorithme qui n’est pas récursif est dit itératif.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3b récursivité 2012 3/9 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3b récursivité 2012 4/9
Quelques exemples classiques - 2 Quelques exemples classiques - 3
Fibonacci : F ibo(n) = F ibo(n − 1) + F ibo(n − 2)
Fonction fibo(n) : entier
D: n : entier positif ou nul Que calcule somme(5,0) ?
Si n=0 alors Fonction somme (n,r) :entier
Retourner 1 D: n,r : entier positifs ou nul
Sinon Si n = 1 alors
Si n=1 alors Retourner r + 1
Retourner 1 Sinon
Sinon Retourner somme (n -1 , r + n )
Retourner fibo(n-1)+fibo(n-2) {Appel récursif} Fsi
Fsi FFonction
Fsi I r est appelé paramètre d’accumulation.
FFonction
I Dérouler ! I Complexité en nb d’appels ?
I L’implémentation impérative est meilleure, pourquoi ?
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3b récursivité 2012 5/9 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3b récursivité 2012 6/9
La factorielle :
Un algorithme récursif est dit récursif terminal si l’appel Fonction fact(n) : entier
récursif est la dernière instruction réalisée. Fonction fact(n) : entier
D: n : entier positif ou
I Stockage non nécessaire de la valeur obtenue par D: n : entier positif ou nul
nul
récursivité. L: i,f :entier
Si n=0 alors
f← 1
Retourner 1
Factorielle : f act(n − 1) puis multiplication par n, donc non Pour i de 0 à n Faire
Sinon
récursif terminal. Retourner f← f*i
n*fact(n-1) Fpour
Somme : récursif terminal :
Fsi Retourner f
somme(5, 0) = somme(4, 5) = somme(...) . . . = 15
FFonction
FFonction
Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3b récursivité 2012 7/9 Laure Gonnord (Lille1/Polytech) AlgoProgIMA Cours 3b récursivité 2012 8/9
Attention
Chapitre 4
Vecteurs/Tableaux
Lorsque l'on veut utiliser un grand nombre de variables dans un programme, ou lorsqu'on
veut stocker un résultat de grande taille, on utilise une suite de cases adjacentes en mémoire,
c'est-à-dire un vecteur (ou tableau, en C). Dans ce cours nous voyons comment déclarer et
utiliser un tableau statique en pseudo-code et en C. Des exemples classiques de tableaux
d'entiers, de charactères, sont donnés. Les tableaux en deux dimensions ( matrices) sont éga-
lement abordés.
44/85
Plan
Vecteurs - Algo
1 Vecteurs et Tableaux
Vecteur = suite de cases dont le contenu est de même type :
2 Algorithmes sur les tableaux d’entiers
2 3 −5 −8
3 Algorithmes de mots
Déclaration (tableau de taille N fixée) :
4 Tableaux2d - Matrices v : Vecteur[N] de (type de base)
Les cases sont numérotées de 0 à N − 1 (attention source
5 Erreurs sur les tableaux - à la compilation et exécution d’erreurs !)
Accès à la case i : v[i]
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 3 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 4 / 35
Vecteurs et Tableaux Vecteurs et Tableaux
Déclaration Les tableaux que nous utilisons au semestre 5 ont une taille
fixée à l’avance (à la déclaration), ce sont des tableaux
int t [23] ; // tableau d ’ entiers
statiques.
char c h a r t a b [ 9 0 0 ] ; / / t a b l e a u d e c h a r a c t e r e s
I Comment écrire des fonctions qui fonctionnent pour des
Utilisation : tableaux de taille quelconque ? Deux possibilités :
x = t [10]; / / appel l i c i t e Utiliser des constantes symboliques à la déclaration des
y = chartab [ 1 5 1 5 ] ; / / p l a n t a g e a l ’ e x e c u t i o n tableaux et dans l’écriture des fonctions
z = t [ expr compliquee ] ;
int t [12]={0}; / / declaration − i n i t Utiliser des fonctions dans lesquelles la taille du tableau
est un nouveau paramètre.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 5 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 6 / 35
Algorithmes sur les tableaux d’entiers Algorithmes sur les tableaux d’entiers
Accès direct
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 7 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 8 / 35
Algorithmes sur les tableaux d’entiers Algorithmes sur les tableaux d’entiers
Swap, en C, avec constante symbolique (V1) Swap, en C, V2, en passant la taille en paramètre
# d e f i n e N 12 void swap ( i n t t [ ] , i n t i , i n t j , i n t s i z e ) {
i n t tmp ;
void swap ( i n t t [ N ] , i n t i , i n t j ) { i f ( i >=0 && i < s i z e && j >=0 && j < s i z e ) {
i n t tmp ; tmp = t [ i ] ;
i f ( i >=0 && i < N && j >=0 && j <N ) { t [ i ] = t [ j ];
tmp = t [ i ] ; t [ j ] = tmp ;
t [ i ] = t [ j ]; }
t [ j ] = tmp ; }
}
} i n t main ( ) {
i n t size = 12; / / ou s c a n f
i n t main ( ) { int t [ size ] ;
i n t t [N ] ; ...
... swap ( t , 2 , 3 , s i z e ) ;
swap ( t , 2 , 3 ) ; }
}
I Préférence pour celle-ci.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 9 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 10 / 35
Algorithmes sur les tableaux d’entiers Algorithmes sur les tableaux d’entiers
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 11 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 12 / 35
Algorithmes sur les tableaux d’entiers Algorithmes sur les tableaux d’entiers
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 13 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 14 / 35
Algorithmes sur les tableaux d’entiers Algorithmes sur les tableaux d’entiers
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 15 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 16 / 35
Algorithmes sur les tableaux d’entiers Algorithmes sur les tableaux d’entiers
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 19 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 20 / 35
Algorithmes sur les tableaux d’entiers Algorithmes de mots
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 21 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 22 / 35
Algorithmes de mots Algorithmes de mots
D’autres algorithmes classiques (à voir en TD, TP, . . . ) La librairie string fournit des fonctions de base sur les chaînes
Un mot donné (avec sa taille) est-il un palindrôme ? de caractères :
Calculer la concaténation de deux mots ? lecture à partir de l’entrée standard
Un mot est-il un sous mot d’un autre ? copie
Combien de fois apparaît un mot donné dans un texte (mot comparaison de chaînes
plus long) ? sous-chaîne, concaténation, . . .
I algorithmique du texte I Voir à la fin du chapitre sur les pointeurs !
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 25 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 26 / 35
Tableaux2d - Matrices Tableaux2d - Matrices
Matrices - Algo
Matrice = tableau 2D
1 Vecteurs et Tableaux
2 3 −5
2 Algorithmes sur les tableaux d’entiers 4 −13 42
1515 −77 0
3 Algorithmes de mots
Déclaration : matrice N × M (taille fixée)
m : Matrice[N][M] de (type de base)
4 Tableaux2d - Matrices
5 Erreurs sur les tableaux - à la compilation et exécution Accès à la case (ime ligne, j me colonne) : m[i][j]
Pour une ligne fixée, les cases sont numérotées de 0 à
M − 1 (il y a M colonnes).
Pour une colonne fixée, les cases sont numérotées de 0 à
N − 1 (il y a N lignes).
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 27 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 28 / 35
Tableaux2d - Matrices Tableaux2d - Matrices
Déclaration
Action ParcoursMat(t)
int t [23][42] ; // matrices d ’ entiers
L: i,j : Entiers
char c h a r t a b [ 9 0 0 ] [ 1 2 ] ; / / m a t r i c e d e c h a r a c t e r e s
D: t : Matrice[N][N] d’Entiers
Pour i de 0 à N-1 Faire
Utilisation :
Pour j de 0 à N-1 Faire
x = t [10][10]; / / appel Imprimer(t[i][j])
z = t [ expr compliquee ] [ exp2 ] ; Fpour
Important Les matrices sont des paramètres modifiables en C ! Fpour
FAction
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 29 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 30 / 35
Tableaux2d - Matrices Tableaux2d - Matrices
Ex : Impression de la diagonale d’une matrice carrée Ex : Recherche d’un élément dans une matrice
rectangulaire
Fonction ParcoursMat(t,el) :Booleen
L: i,j : Entiers
Action ParcoursMat(t) D: t : Matrice[N][M] d’Entiers
L: i,j : Entiers D: el : Entier
D: t : Matrice[N][N] d’Entiers Pour i de 0 à N-1 Faire
Pour i de 0 à N-1 Faire Pour j de 0 à M-1 Faire
Imprimer (t[i][i]) ; Si (t[i][j]=el) alors
Fpour Retourner Vrai
FAction Fsi
Fpour
Fpour
Retourner Faux
FFonction
I On n’effectue pas tout le programme si on trouve l’élément.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 31 / 35 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 4 Tableaux 2012 32 / 35
Tableaux2d - Matrices Erreurs sur les tableaux - à la compilation et exécution
Erreurs classiques :
Tableau déclaré et pas initialisé : aucune erreur,
impression du contenu courant de la case mémoire.
Accès en dehors du tableau : pas d’erreur de compilation,
Segmentation Fault ou valeur quelconque à l’exécution.
Copie de tableau non case par case :
int t[12]={0};
int g[12];
g=t;
Erreur à la compilation :
tab.c:46:4: error: array type 'int [12]' is not assignable
g=t;
~^
1 error generated.
Chapitre 5
Algorithmique du Tri
Premier chapitre d'algorithmique proprement dite ! Il s'agit ici de proposer des algorithmes
pour trier un tableau d'entiers. Les algorithmes classiques sont ainsi vus, et leur complexité est
évaluée. Ces algorithmes seront développés en TD et implémentés en C en TP.
Remarque 2 Le tribulle, algorithme classique mais peu ecace, n'est pas traité dans ce cours
54/85
Trions !
1 Trions !
Laure Gonnord
[Link] 2 Considérations diverses sur les tris
[Link]@[Link]
But
On va trier des tableaux d’entiers de taille N .
On dispose du test de comparaison entre entiers On dispose de l’action auxilliaire permuter de signature (ou
prototype) :
Exemple :
permuter(T:Tableau[N] d'Entiers,ind1:Entier,ind2:Entier)
11 -2 1515 42 2048 28 11 -78
devient qui permute les valeurs des éléments d’indices ind1 et ind2 du
-78 -2 11 11 28 42 1515 2048 tableau T .
I Let’s go !
I Attention transparents sans exemple ni dessin, donc, en
faire !
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 3 / 22 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 4 / 22
Trions ! Trions !
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 5 / 22 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 6 / 22
Trions ! Trions !
Correction : « L’algorithme tri-selection conserve les éléments «Tri des cartes à jouer» :
du tableau T et les trie dans l’ordre croissant » Je trie les 2 premières cartes.
Invariant : « à la fin du tour ideb, le sous-tableau T [0..ideb] Je regarde la troisième et l’insère à sa bonne place (par
contient les ideb + 1 plus petits éléments de T, dans l’ordre décalages vers la droite).
croissant de leurs valeurs » ...
Coût (nb comparaisons) : (N − 1) + (N − 2) + . . . 1 = O(N 2 ). I Algo, Correction, Complexité
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 7 / 22 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 8 / 22
Trions ! Trions !
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 9 / 22 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 10 / 22
Trions ! Trions !
Action tri-fusion-bis(T,premier,dernier)
D: premier,dernier : Entiers
Principe «diviser pour régner» : D: T : Tableau[N] d’entiers
Un tableau de taille 1 est trié ! L: milieu : entier
Je découpe en deux le tableau Si premier<dernier alors
milieu ← (premier+dernier)/2
Je trie chacun des sous-tableaux
tri-fusion-bis(T,premier,milieu) {Appel récursif 1}
Je fusionne tri-fusion-bis(T,milieu+1,dernier) {Appel réc. 2}
I Algo récursif !, Correction, Complexité fusion(T,premier,milieu,dernier)
Fsi
FAction
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 11 / 22 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 12 / 22
Trions ! Trions !
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 13 / 22 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 14 / 22
Trions ! Trions !
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 15 / 22 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 16 / 22
Trions ! Considérations diverses sur les tris
Tri Rapide
1 Trions !
Principe du pivot
Je partitionne le tableau en fonction d’un pivot (premier 2 Considérations diverses sur les tris
élement du tableau).
Je trie récursivement sur chacun des tableaux à sa gauche
et à sa droite.
I Algo, Correction, Complexité, en TD !
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 17 / 22 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 18 / 22
Considérations diverses sur les tris Considérations diverses sur les tris
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 19 / 22 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 20 / 22
Considérations diverses sur les tris Considérations diverses sur les tris
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 21 / 22 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 5 Ctes, Tris 2012 22 / 22
Laure Gonnord Polycopié de Programmation Structurée IMA3 2012/2013
Chapitre 6
Variables modiables en C : les pointeurs
Dans ce cours nous présentons l'implémentation C des variables modiables : les pointeurs.
En eet, le langage C donne un accès aux adresses de stockage des variables, et fournit un
nouveau type adresse que nous pouvons manipuler comme type de base. An de pouvoir com-
prendre nement ce qui se passe lors d'un appel de fonction C, nous aborderons aussi la notion
de schéma d'exécution, qui se veut une abstraction de ce qui se passe en mémoire lors de
l'exécution d'un programme C.
61/85
Schémas d’exécution - variables modifiables
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 3 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 4 / 32
Schémas d’exécution - variables modifiables Schémas d’exécution - variables modifiables
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 5 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 6 / 32
Schémas d’exécution - variables modifiables Schémas d’exécution - variables modifiables
main main
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 7 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 7 / 32
Schémas d’exécution - variables modifiables Schémas d’exécution - variables modifiables
type nom adresse valeur type nom adresse valeur type nom adresse valeur
int x 3A10 1 int x 3A10 1 int a 3F10
int y 3A20 int y 3A20 int retour 3F20
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 7 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 7 / 32
Schémas d’exécution - variables modifiables Schémas d’exécution - variables modifiables
type nom adresse valeur type nom adresse valeur type nom adresse valeur type nom adresse valeur
int x 3A10 1 int a 3F10 1 int x 3A10 1 int a 3F10 1
int y 3A20 int retour 3F20 int y 3A20 2 int retour 3F20 2
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 7 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 7 / 32
Schémas d’exécution - variables modifiables Schémas d’exécution - variables modifiables
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 7 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 8 / 32
Schémas d’exécution - variables modifiables Les pointeurs
Résumé
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 9 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 10 / 32
Les pointeurs Les pointeurs
En C Les adresses et le C
En C, on peut :
A SAVOIR :
obtenir l’adresse d’une variable existante (&),
le passage par valeur est le passage par défaut en C SAUF
pour les tableaux qui sont passés par adresse. accéder au contenu stocké à une adresse valide (*),
passer des adresses en argument, les retourner, les copier
(=),
I Pour passer un paramètre par adresse, on utilise les effectuer des opérations limitées sur les adresses (+, ==,
pointeurs . . . ).
I C’est l’objet des transparents suivants.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 11 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 12 / 32
Les pointeurs Les pointeurs
int i , a [ 2 ] ; ( main )
&i / ∗ a d r e s s e de i ∗ / i n t y =100;
p r i n t f ( "%p " ,& i ) /∗ impression d ’ adresse ∗/ i n c (& y ) ;
&(a [ 0 ] ) &a [ 0 ] &a / ∗ a d r e s s e d e a [ 0 ] ∗ /
&( i +1) / ∗ e r r o r : l v a l u e r e q u i r e d as u n a r y ’& ’ operand ∗/ I De quel type est la variable px ? int* !
s c a n f ( "%d " ,& i ) ; /∗ acces a l ’ adresse ∗/
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 13 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 14 / 32
Les pointeurs Les pointeurs
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 15 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 16 / 32
Les pointeurs Quelques exemples
Comparaison de pointeurs
2 Les pointeurs
On peut comparer deux pointeurs pour :
l’égalité == (pointent sur la même adresse ?)
3 Quelques exemples
la différence != (pointent sur des adresses
différentes ?).
4 Validité des pointeurs
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 17 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 18 / 32
Quelques exemples Quelques exemples
void permuter ( i n t ∗ px , i n t ∗ py )
Rappel {
*p : contenu de la mémoire à l’adresse p. i n t temp ;
temp = ∗px ;
&x : adresse de la variable x. ∗px = ∗py ;
int x , y ; ∗py = temp ;
y = 12; }
i n t ∗ p i = &x ;
∗ pi = 2; / ∗ p l a c e 2 dans x ∗ / ( main )
p i = &y ; i n t a=1 ,b =3;
∗ p i = ∗ p i +1; / ∗ i n c r e m e n t e y ∗ / permuter (&a ,& b ) ;
p r i n t f ( "%d %d " , a , b ) ;
I Réalisons le schéma d’exécution de ce programme.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 19 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 20 / 32
Quelques exemples Quelques exemples
Ex : Permutation - 2 Ex : Permutation - 2
appel de fonction
type nom adresse valeur type nom adresse valeur type nom adresse valeur
int a 3A10 1 int a 3A10 1 int* px 3F10 3A10
int b 3A20 3 int b 3A20 3 int* py 3F20 3A20
permuter
void permuter ( i n t ∗ px , i n t ∗ py ) void permuter ( i n t ∗ px , i n t ∗ py )
{ {
( main ) ( main )
i n t temp ; i n t temp ;
i n t a=1 ,b =3; i n t a=1 ,b =3;
temp = ∗px ; temp = ∗px ;
permuter (&a ,& b ) ; permuter (&a ,& b ) ;
∗px = ∗py ; ∗px = ∗py ;
p r i n t f ( "%d %d " , a , b ) ; p r i n t f ( "%d %d " , a , b ) ;
∗py = temp ; ∗py = temp ;
} }
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 21 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 21 / 32
Quelques exemples Quelques exemples
Ex : Permutation - 2 Ex : Permutation - 2
*px
type nom adresse valeur type nom adresse valeur type nom adresse valeur type nom adresse valeur
int a 3A10 1 int* px 3F10 3A10 int a 3A10 1 int* px 3F10 3A10
int b 3A20 3 int* py 3F20 3A20 int b 3A20 3 int* py 3F20 3A20
permuter permuter
void permuter ( i n t ∗ px , i n t ∗ py ) void permuter ( i n t ∗ px , i n t ∗ py )
{ {
( main ) ( main )
i n t temp ; i n t temp ;
i n t a=1 ,b =3; i n t a=1 ,b =3;
temp = ∗px ; temp = ∗px ;
permuter (&a ,& b ) ; permuter (&a ,& b ) ;
∗px = ∗py ; ∗px = ∗py ;
p r i n t f ( "%d %d " , a , b ) ; p r i n t f ( "%d %d " , a , b ) ;
∗py = temp ; ∗py = temp ;
} }
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 21 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 21 / 32
Quelques exemples Quelques exemples
Ex : Permutation - 2 Ex : Permutation - 2
type nom adresse valeur type nom adresse valeur type nom adresse valeur type nom adresse valeur
int a 3A10 1 int* px 3F10 3A10 int a 3A10 3 int* px 3F10 3A10
int b 3A20 3 int* py 3F20 3A20 int b 3A20 1 int* py 3F20 3A20
permuter permuter
void permuter ( i n t ∗ px , i n t ∗ py ) void permuter ( i n t ∗ px , i n t ∗ py )
{ {
( main ) ( main )
i n t temp ; i n t temp ;
i n t a=1 ,b =3; i n t a=1 ,b =3;
temp = ∗px ; temp = ∗px ;
permuter (&a ,& b ) ; permuter (&a ,& b ) ;
∗px = ∗py ; ∗px = ∗py ;
p r i n t f ( "%d %d " , a , b ) ; p r i n t f ( "%d %d " , a , b ) ;
∗py = temp ; ∗py = temp ;
} }
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 21 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 21 / 32
Quelques exemples Quelques exemples
Ex : Permutation - 2 Ex : Division
(paramètres R)
type nom adresse valeur
void d i v i s e ( i n t a , i n t b , i n t ∗ pdiv , i n t ∗ prem ) {
int a 3A10 3 ∗ pdiv = a / b ;
int b 3A20 1 ∗prem = a % b ;
}
main
void f ( ) {
int x , y ;
d i v i s e ( 100 , 10 , &x , &y ) ;
void permuter ( i n t ∗ px , i n t ∗ py ) }
{
( main )
i n t temp ; Attention ! C’est à l’appelant de fournir une adresse valide pour
i n t a=1 ,b =3;
temp = ∗px ; les valeurs de “retour”.
permuter (&a ,& b ) ;
∗px = ∗py ;
p r i n t f ( "%d %d " , a , b ) ;
∗py = temp ;
}
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 21 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 22 / 32
Quelques exemples Quelques exemples
a =42; b =12;
minmaxproc (&a ,& b ) ;
?
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 23 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 24 / 32
Quelques exemples Quelques exemples
? ?
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 24 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 24 / 32
Quelques exemples Quelques exemples
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 24 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 24 / 32
Quelques exemples Quelques exemples
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 25 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 26 / 32
Validité des pointeurs Validité des pointeurs
Le pointeur NULL
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 27 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 28 / 32
Validité des pointeurs Validité des pointeurs
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 29 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 30 / 32
Validité des pointeurs Validité des pointeurs
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 31 / 32 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6 Pointeurs 2012 32 / 32
Laure Gonnord Polycopié de Programmation Structurée IMA3 2012/2013
Dans ce cours nous présentons l'utilisation des pointeurs pour parcourir des tableaux et des
chaînes de caractère. Nous faisons une petite introduction à l'arithmétique des pointeurs.
Savoirs (en C)
Utiliser des pointeurs pour parcourir un tableau unidimensionnel.
Utiliser les fonctions de base de la bibliothèque string.h.
74/85
Pointeurs et tableaux
1 Pointeurs et tableaux
Laure Gonnord
[Link] 2 Le cas particulier des chaînes de caractères
[Link]@[Link]
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 3 / 20 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 4 / 20
Pointeurs et tableaux Pointeurs et tableaux
Équivalences
Si p et q pointent dans le même tableau, on peut : tab ' &tab[0]
comparer les indices des cases : p < q, p <= q, etc. tab+i ' &tab[i]
calculer la distance en cases : p - q. *tab ' tab[0]
*(tab+i) ' tab[i]
i[tab] ' tab[i] ( !)
void f ( ) void f ( ) {
{ int a[100];
int a[100]; i f ( cherche_zero (&a [ 1 0 ] , 5 ) ) ...
i f ( cherche_zero ( a , 1 0 , 5 ) ) . . . }
}
Avantage : remplace un couple tableau + indice.
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 9 / 20 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 10 / 20
Pointeurs et tableaux Le cas particulier des chaînes de caractères
1 Pointeurs et tableaux
Du fait qu’un tableau est un pointeur constant :
On ne peut créer de tableau dont la taille est une variable 2 Le cas particulier des chaînes de caractères
du programme
On ne peut créer de tableau bidimensionnel dont les lignes 3 Et encore ...
n’ont pas le même nombre d’éléments.
I Ces opérations deviennent possibles dès que l’on manipule
des pointeurs alloués dynamiquement (malloc, Semestre 6).
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 11 / 20 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 12 / 20
Le cas particulier des chaînes de caractères Le cas particulier des chaînes de caractères
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 13 / 20 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 14 / 20
Le cas particulier des chaînes de caractères Le cas particulier des chaînes de caractères
# define N 1024
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 15 / 20 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 16 / 20
Et encore ... Et encore ...
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 17 / 20 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 18 / 20
Et encore ... Et encore ...
Exemples complexes :
int** x; pointeur sur un pointeur sur un int,
Attention à la priorité de * et , dans les déclarations. *x : pointeur sur un int,
int *a,b; **x : int.
b a pour type int, pas int*. int *x[10]; tableau de 10 pointeurs sur des int,
int *a,*b; x[1] : pointeur sur un int,
a et b ont le type int*. *(x[1]) : int.
int (*x)[10]; pointeur sur un tableau de 10 int.
(inutile : on préférera un pointeur sur un élément du
tableau)
Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 19 / 20 Laure Gonnord (Lille1/Polytech) AlgoProgIMA3 Cours 6b Pointeurs++ 2012 20 / 20
Laure Gonnord Polycopié de Programmation Structurée IMA3 2012/2013
80/85
Département IMA / 3A (S5) Programmation Structurée 2012/2013
[Link]
Objectifs du Cours
1 Compétences attendues en Algorithmique
Connaître la syntaxe du pseudo langage algorithmique
Connaître les notions suivantes : les variables, les constantes, les fonctions, les actions, les
boucles tant que, les boucles pour.
Savoir écrire précisément la déclaration d'une action et l'appel de cette action (types,
syntaxe, . . . ). Pareil pour une fonction. Savoir décrire une exécution à l'aide de schémas
d'exécution. Savoir ce qu'est la signature d'une fonction.
Connaître les principes des tris courants (insertion, sélection, fusion). Savoir retrouver les
algorithmes en pseudocode. Savoir très rapidement écrire le tri sélection.
Les tableaux : déclaration, initialisation, savoir parcourir un tableau avec une boucle pour,
savoir parcourir avec une boucle tant que lorsque l'on veut s'arrêter avant.
Les matrices ou tableaux 2d : idem
Les chaînes de caractères codées avec marqueur de n : parcours, et les algorithmes courants
(longueur, concaténation, . . . )
Les variables modiables : utilisation à bon escient, et déclaration à l'aide des variables D
et/ou R.
Conception/Analyse : savoir analyser un problème et le découper en petits algorithmes.
Savoir choisir entre fonction et action, et déterminer les variables d'entrée nécessaires.
Savoir analyser son algorithme en terme de coût. Connaître le coût en moyenne des
principaux tris.
Syntaxe Algorithmique
Nom Syntaxe Exemple Commentaire
Aectation ← x ← 42 x doit être déclaré
Type entier Entier x :Entier déclaration de x entier
Type réel Réel x :Réel déclaration d'un réel, en machine ce sera un ottant
Type charactère Charactère c :Charactère déclaration d'un caractère ; les constantes sont 'a', 'b', . . .
Type booléen Booléen b :Booléen déclaration d'un booléen ; les constantes sont Vrai et Faux
Type chaîne Chaîne s ← ”toto” aectation d'une chaîne, s doit être déclarée.
Tableau Vecteur Vecteur[10] d'Entiers tableau de 10 entiers indexés de 0 à 9
constante Constante Constante N : 10 déclare une constante symbolique N qui vaut 10
Tests
Si condition alors
instructions si vrai Si condition alors
Sinon instructions si vrai
instructions si faux Fsi
Fsi
Boucles
Pour i de inf à sup Faire Tq condition faire
instructions instructions
Fpour Ftq
Programme/fonction/action : exemples
Fonction fonct(c) : Entier Action monact(a,b,c)
D: c :Charactère D: a : Entier
Programme Main
.... L: s :Entier D/R: b : Entier
.... .... R: c : Charactère
.... .... ...
Retourner 0 .... ...
FProgramme Retourner s ...
FFonction FAction
ici fonct est une fonction Caractère -> Entier :
L'unique paramètre (la donnée ) est un caractère, nommé c dans la suite de la fonction. La
variable s est locale. L'appel : resu ← f onct(d) où d a une valeur et resu est déclaré de
bon type.
ici monact est une action à trois arguments. Les modications apportées au premier
paramètre ne sont pas enregistrées (c'est une donnée ). Par contre les modications
apportées aux paramètres 2 et 3 sont enregistrées (donnée-résultat et résultat ). Appel :
monact(a,b,c) avec a, b ayant une valeur, et c étant déclaré.
Termes informatiques en chinois --- Programmation Structurée --
Glossaire réalisé avec l'aimable collaboration de Quanquan WANG, IMA3 en 2010/2011
Exemple Traduction
algorithme 算法
variable 变量
type 类型
entier 12,-7 整数
réel 42.67 实数
caractère a' 字符
expression 表达式
affectation X := 7 赋值
calculer 计算
stocker 储存
crochet [ , ] 方括号
accolade {, } 大括号
action / procédure 程序
fonction 函数
retourner 返回
paramètre 参数
indice 下标,标号
case 案例,个案
accès en lecture 可读
accès en écriture 可写
pointeur 指针
mémoire 内存
adresse 地址
déboguer 调试
tester 测试
compiler 编译