Programmation impérative en C - LIPN - Université Paris 13

La syntaxe est l'ensemble des mots et des règles d'écriture (la « grammaire »)
qui ... Le programme doit également encore ensuite être corrigé pour être ..... Il
existe en particulier une première phase de compilation qui est exécuté par un
..... Exercice. Pour suivre le déroulement de la boucle while, présenter une table
 ...

Part of the document


Université Paris 13
Institut Galilée
Licence 1ère année
2005-2006 Programmation Impérative
Polycopié de cours n° 1 C. Recanati Table des matières 1 Premières notions de programmation 3 1.1 Généralités 3
1.2 Programmation impérative 4
1.3 Variables : identificateur, valeur et type, adresse 5
1.3.1 Identificateur, valeur et type 6
1.3.2 Adresse 7
1.4 Instructions et programme 7
1.4.1 L'affectation 8
1.4.2 Les instructions d'entrée/sortie 8
1.4.3 Les instructions de contrôle 9
1.5 Système d'exploitation, fichiers 9
1.6 Compilation 10 2 Eléments de base du langage C 13 2.1 Premiers programmes 13
2.1.1 « Bonjour tout le monde ! » 13
2.1.2 Conversion de degrés Fahrenheit en degrés Celsius 16
2.1.3 Constantes symboliques 20
2.1.4 Lecture d'entrées 22
2.2 L'alphabet et les mots du langage 24
2.2.1 Identificateur 24
2.2.2 Mots réservés 25
2.2.3 Constantes 25
2.2.4 Opérateurs, délimiteurs et séparateurs 26
2.3 Notation syntaxique 27 3 Types, opérateurs et expressions 28 3.1 Types de base 28
3.1.1 Types entiers 28
3.1.2 Types réels 30
3.1.3 Type caractère 32
3.1.4 Autres types 33
a. Type booléen 33
b. Type chaine de caractères 34
c. Type void 34
3.2 Opérateurs et expressions 34
3.2.1 Opérateurs numériques et logiques 35
3.2.2 Conversions de types 37
a. Conversion implicite 37
b. Conversion forcée (casting) 38
3.2.3 Opérateurs de modification de variables : les affectations 38
a. Affectations de variables 39
b. Incrémentation et décrémentation 40
3.3 Types dérivés des types de base 40
3.3.1 Types définis par l'utilisateur 41
3.3.2 Structures 41
3.3.3 Exemple de tableau 43
3.4 Autres opérateurs 46
3.4.1 Opérateurs binaires (bits à bits) 46
3.4.2 Opérateur sizeof 46
3.4.3 Opérateur conditionnel 46
3.4.4 Opérateur de séquence 47
3.4.5 Divers 47
3.4.6 Précédence et associativité des opérateurs 47 4 Les instructions du langage 49 4.1 Instruction et blocs d'instructions 49
4.2 Instructions de contrôle 50
4.2.1 L'instruction conditionnelle 50
4.2.2 L'instruction de branchement (switch) 53
4.2.3 Boucle while et boucle for 54
4.2.4 Boucle do-while 56
4.2.5 Instructions de rupture de séquence 56
4.3 Instructions d'entrée/sortie 57
4.3.1 Entrée/sortie de caractères : getchar et putchar 57
4.3.2 Entrée/Sortie « formatées » : Printf et scanf 57 Premières notions de programmation
1 Généralités
La programmation recouvre l'ensemble des techniques permettant de résoudre
des problèmes à l'aide de programmes s'exécutant sur un ordinateur. Une
étape essentielle consiste en l'écriture d'un texte de programme dans un
langage particulier (un langage de programmation). Mais l'écriture du
programme, bien que fondamentale, n'est qu'une étape du processus de
programmation que l'on peut décomposer de la manière suivante : 1. L'analyse et la spécification du problème, qui permettent de préciser le
problème à résoudre et/ou d'isoler les fonctionnalités du logiciel à
mettre en oeuvre. Dans cette phase, on détermine quelles sont les données
et leurs propriétés, quels sont les résultats attendus, ainsi que les
relations exactes entre les données et les résultats. 2. La conception (ou modélisation) : il s'agit généralement de déterminer
la méthode de résolution du problème (un algorithme) et d'en identifier
les principales étapes. C'est également dans cette phase que l'on conçoit
la manière dont on va mettre en ?uvre les fonctionnalités d'un logiciel
(celles qui ont été identifiées dans la phase d'analyse). 3. L'implantation (ou codage) dans un ou plusieurs langages de
programmation particuliers. Il s'agit de traduire la méthode et les
algorithmes préconisés en un ou plusieurs textes de programmes. A ce
stade, il faut respecter la syntaxe du langage de programmation choisi et
préciser tout ce qui était resté dans l'ombre. La syntaxe est l'ensemble des mots et des règles d'écriture (la
« grammaire ») qui détermine la structure d'un texte de programme correct,
c'est-à-dire, que la machine peut transformer en code exécutable grâce à un
compilateur prévu pour ce langage de programmation. Cette syntaxe doit être
rigoureusement suivie. Un seul mot ou caractère mal placé et le texte du
programme ne peut être traduit en code exécutable. Franchir cette étape
n'est pas très difficile car on bénéficie de l'aide du compilateur qui
signale une à une les erreurs qu'il rencontre. Mais on peut malheureusement
aussi commettre des erreurs de type sémantique (erreurs relatives au
« sens » du programme) : dans ce cas, le texte du programme peut être
transformé en code exécutable par le compilateur, mais ce code peut
provoquer des interruptions brutales avec certaines données, ou pire,
fournir des résultats erronés. Le risque d'erreurs de codage étant en fait relativement élevé,
l'implantation doit toujours être suivie d'une phase de mise au point dans
laquelle on effectue des tests permettant de vérifier la robustesse du
programme obtenu. Le programme doit également encore ensuite être corrigé
pour être simplement maintenu à son niveau de performances dans un
environnement en constante évolution - ce qui fait que la phase de mise au
point est de durée a priori indéterminée. Notons que l'écriture du programme proprement dit ne vient qu'en troisième
étape du processus de programmation, et que les deux premières étapes sont
souvent longues. Il faut aussi être conscient du fait qu'il y a un travail
considérable entre la fin de la seconde étape et l'entrée du texte du
programme dans l'ordinateur. En particulier, on aura parfois à se poser des
questions d'architecture de programmes pour faire fonctionner ensemble des
parties développées avec des éléments préexistants (récupération de données
dans des bases de données ou sur Internet, etc.), ou pour articuler des
modules de programmes écrits dans des langages de programmation différents. De même, la phase de tests et de mise au point d'un programme reste souvent
négligée par les débutants en programmation, mais les problèmes
apparaissant alors peuvent être fort complexes et coûteux de sorte que si
cette étape n'est pas réellement menée à bien, il est souvent plus simple
de repartir de zéro, même dans le cas de programmes industriels ayant coûté
plusieurs hommes/années. La qualité du travail accompli dans les deux premières étapes reste bien
entendu primordiale pour la qualité du programme produit. Différentes
branches de compétences et de techniques basées sur des modélisations
mathématiques se sont d'ailleurs développées avec succès pour résoudre des
problèmes de structuration de données, donnant ainsi naissance à une
branche de l'informatique : l'algorithmique. (On en verra une introduction
au second semestre via la présentation de quelques algorithmes de tri et de
recherche d'élements stockés dans des structures de données classiques). 2 Programmation impérative
Les structures de données et la nature des algorithmes étudiés dans le
cadre classique de l'algorithmique sont intimement liées à la nature des
langages de programmation utilisés. Ces langages dits « impératifs », sont
basés sur la notion d'action exécutée, l'action la plus typique étant
l'affectation de variable. Le concept de variable dans ces langages de
programmation est très différent de la notion mathématique. Grossièrement,
une variable est une case mémoire de l'ordinateur dans laquelle on peut
stocker une valeur de donnée, numérique ou autre. L'opération d'attribution
de valeur à une variable s'appelle l'affectation. La valeur d'une variable
peut être récupérée et modifiée à volonté, et la programmation dans ces
langages est basée principalement sur l'utilisation et la modification
judicieuse de variables. Ces langages sont qualifiés d' impératifs, car un
programme consiste en une série d'ordres (ou instructions) donnés à
exécuter par la machine. Parmi ces ordres, l'affectation est une opération
fondamentale. Le langage C que nous allons utiliser dans ce cours est un représentant
typique des langages impératifs. Ce type de langages est particulièrement
adapté à la structure des ordinateurs classiques, car, bien que qualifiés
de langages de programmation « évolués » - par opposition aux langages
machine[1] - ils restent très proches dans leur conception de ces langages
de bas niveaux. C'est une des raisons qui les rend incontournables, car
cette proximité de structure leur assure une supériorité de performances
indéniable dans le contexte des architectures de machines actuelles. Une
autre raison importante est que, ayant été historiquement inventé les
premiers, la plupart des langages utilisés aujourd'hui (comme les langages
à objet), comportent eux aussi un noyau « impératif » et concervent la
possibilité d'écrire des modules de programmes dans ce style de
programmation. D'autres types de langages s'écartant plus de cette structure existent,
comme les langages dits « fonctionnels » ou « déclaratifs ». Ces langages
permettent de résoudre et spécifier plus facilement certains problèmes, en
offrant d'autres moyen de structurations de données (et en ne manipulant
pas que des nombres ou des caractères). Mais nous n'aurons guère le temps
d'aborder cette année la programmation qu'ils mettent en oeuvre. Bien qu'un cours de programmation ne puisse se réduire à un cours sur un ou
des langages de programmation (cf. les premières étapes d'un processus de
programmation), leur apprentissage et leur pratique restent une nécessité
absolue, car c'est