Termes les plus recherchés
[PDF](+179👁️) Télécharger 2011 Dunod Initiation A L Algorithmique Et A La Programmation En pdf
Liver de programation en C par Dunod
Télécharger gratuit 2011 Dunod Initiation A L Algorithmique Et A La Programmation En pdf
INITIATION
À L'ALGORITHMIQUE et
à LA PROGRAMMATION
EN C
Cours avec 129 exercices corrigés
Rémy Malgouyres
Professeur à l'université d'Auvergne
Rita Zrour
Maître de conférences à l'université de Poitiers
Fabien Feschet
Professeur à l'université d'Auvergne
2 e édition
DUNOD
Illustration de couverture : Géométrie figures-1© 25-Fotolia.com
Le pictogramme qui figure ci-contre
mérite une explication. Son objet est
d'alerter le lecteur sur la menace que
représente pour l'avenir de l'écrit,
particulièrement dans le domaine
de l'édition technique et universi-
taire, le développement massif du
photocopillage.
Le Code de la propriété intellec-
tuelle du 1 er juillet 1992 interdit
en effet expressément la photoco-
pie à usage collectif sans autori-
sation des ayants droit. Or, cette pratique
s'est généralisée dans les établissements
d'enseignement supérieur, provoquant une
baisse brutale des achats de livres et de
revues, au point que la possibilité même pour
les auteurs de créer des œuvres
nouvelles et de les faire éditer cor-
rectement est aujourd'hui menacée.
Nous rappelons donc que toute
reproduction, partielle ou totale,
de la présente publication est
interdite sans autorisation de
l'auteur, de son éditeur ou du
Centre français d'exploitation du
droit de copie (CFC, 20, rue des
Grands-Augustins, 75006 Paris).
DANGER
LE PHOTOCOPILLAGE
TUE LE LIVRE,
© Dunod, Paris, 2008, 2011
ISBN 978-2-10-055903-9
Le Code de la propriété intellectuelle n'autorisant, aux termes de l'article
L. 1 22-5, 2° et 3° a), d'une part, que les « copies ou reproductions strictement
réservées à l'usage privé du copiste et non destinées à une utilisation collective »
et, d'autre part, que les analyses et les courtes citations dans un but d'exemple et
d'illustration, « toute représentation ou reproduction intégrale ou partielle faite
sans le consentement de l'auteur ou de ses ayants droit ou ayants cause est
illicite » (art. L. 122-4).
Cette représentation ou reproduction, par quelque procédé que ce soit, constitue-
rait donc une contrefaçon sanctionnée par les articles L. 335-2 et suivants du
Code de la propriété intellectuelle.
© Dunod. La photocopie non autorisée est un délit.
Table des matières
Avant-propos XIII
Partie 1
Bases du langage C
Chapitre 1. Qu’est-ce qu’un ordinateur? 3
1.1 Exemples d’applications de l'informatique B
1 .2 Codage des données B
1.3 Fonctionnement d'un ordinateur 4
1.3.1 Système d'exploitation 4
1.3.2 Processeur 4
1.3.3 Mémoire centrale 5
1.3.4 Périphériques 5
Chapitre 2. Premiers programmes 7
2.1 Qu’est-ce qu'un programme? 7
2.2 Afficher un mot 8
2.3 Lire un nombre 8
2.4 Effectuer un calcul et mémoriser le résultat 9
Exercices 1 0
Corrigés 1 1
Chapitre 3. Types de données 1 5
3.1 Variables et opérations 15
3.2 Type entier int 1 5
3.3 Les types réels float et double 1 6
3.4 Le type char 1 7
3.5 Les types unsigned 1 7
3.6 Affectations et conversions 1 7
3.7 Les constantes et le #define 1 8
3.8 Définir ses propres types 1 9
Exercices 20
Corrigés 20
Chapitre 4. Entrées-sorties : stdio.h 23
4.1 Qu’est-ce qu'une bibliothèque d'entrées-sorties? 23
4.2 L’affichage de données sous forme de texte 23
4.2.1 Afficher des caractères 23
4.2.2 Afficher d’autres données 24
4.3 Lecture au clavier 25
V
Initiation à l’algorithmique et à la programmation en C
Exercices 26
Corrigés 27
Chapitre 5. Exécution conditionnelle 29
5.1 Qu’est-ce l’exécution conditionnelle? 29
5.2 Condition si-alors 29
5.5 Condition si-alors-sinon 30
5.4 Notions de calcul booléen 31
5.4.1 Expressions de base 31
5.4.2 Opérations booléennes 32
5.5 Le switch 34
Exercices 35
Corrigés 35
Chapitre 6. Structuration d’un programme C 41
6.1 Qu’est-ce qu’un sous-programme? 41
6.2 Exemple de fonction C 41
6.3 Exemple de structuration d’un programme 42
6.4 Forme générale d’une fonction C 44
6.4.1 Prototype 44
6.4.2 Déclaration et définition 45
6.4.3 Variables locales 45
6.5 Passage de paramètres par valeur 45
Exercices 46
Corrigés 47
Chapitre 7. Structures 51
7.1 Déclaration d’une structure 51
7.2 Utilisation d'une structure 51
Exercices 54
Corrigés 55
Chapitre 8. Itération 59
8.1 Boucle while 59
8.2 Boucle for 60
Exercices 61
Corrigés 63
Partie 2
Structures séquentielles
Chapitre 9. Tableaux 71
9.1 Déclaration d’un tableau 71
9.2 Accès aux éléments 71
9.3 Nombre d'éléments fixé 72
VI
© Dunod. La photocopie non autorisée est un délit.
Table des matières
9.4 Nombre d'éléments variable borné 73
9.5 Initialisation lors de la déclaration 75
Exercices 76
Corrigés 76
Chapitre 10. Fichiers texte 79
10.1 Qu’est-ce qu’un fichier texte? 79
10.2 Ouverture et fermeture d’un fichier texte 79
10.3 Lire et écrire des données formatées 81
10.3.1 Lire des données formatées 81
10.3.2 Écrire des données formatées 84
Exercices 85
Corrigés 86
Chapitre 1 1. Adresses, pointeurs et passage par adresse 91
11.1 Mémoire centrale et adresses 91
11.2 Variables de type pointeur 91
11.3 Passage de paramètre par valeur 93
1 1 .4 Passage de paramètre par adresse 93
Exercices 95
Corrigés 96
Chapitre 12. Allocation dynamique 101
12.1 Gestion de la mémoire centrale 101
12.2 Allocation avec malloc 101
12.3 Allocation avec calloc 103
Exercices 1 05
Corrigés 1 07
Chapitre 1 3. Chaînes de caractères 1 1 3
13.1 Qu’est-ce qu’une chaîne de caractères? 113
13.2 Opérations prédéfinies sur les chaînes 114
13.2.1 Fonctions de <stdio.h> 114
13.2.2 La bibliothèque <string.h> 117
Exercices 1 20
Corrigés 1 2 1
Chapitre 14. Fichiers binaires 127
14.1 Différence entre fichiers texte et binaire 127
14.2 Ouverture et fermeture d’un fichier binaire 127
14.3 Lecture dans un fichier binaire 128
14.4 Écriture dans un fichier binaire 130
14.5 Se positionner dans un fichier binaire 131
Exercices 1 32
Corrigés 1 34
VII
Initiation à l’algorithmique et à la programmation en C
Chapitre 1 5. Tableaux à double entrée 143
15.1 Tableaux de dimension 2 143
15.2 Allocation dynamique et libération d’un tableau de dimension 2 144
Exercices 1 46
Corrigés 1 48
Partie 3
Algorithmes
Chapitre 16. Langage algorithmique et complexité 1 57
16.1 Pourquoi un autre langage? 157
1 6.2 Types 1 57
16.3 Entrées-sorties 157
16.3.1 Clavier et écran 157
16.3.2 Fichiers texte 158
16.4 Syntaxe 158
16.5 Fonctions et procédures 159
1 6.5.1 Fonctions 1 59
16.5.2 Procédures 160
16.6 Enregistrements 161
16.7 Pointeurs, adresses et allocation 161
16.8 Notion de complexité d’un algorithme 162
16.8.1 Définition intuitive de la complexité 162
16.8.2 Notion de grand O 162
Exercices 1 64
Corrigés 1 66
Chapitre 1 7. Algorithmes de tri quadratiques 1 71
17.1 Qu’est-ce qu’un tri ? 171
17.2 Tri par sélection 171
17.2.1 Principe du tri par sélection 171
17.2.2 Algorithme de tri par sélection 172
17.2.3 Estimation du nombre d’opérations 172
17.3 Tri par insertion 173
17.3.1 Principe du tri par insertion 173
17.3.2 Algorithme de tri par insertion 174
17.3.3 Estimation du nombre d’opérations 174
1 7.4 Tri par bulles 1 75
17.4.1 Principe du tri par bulles 175
17.4.2 Algorithme du tri par bulles 175
17.4.3 Estimation du nombre d’opérations 176
VIII
© Dunod. La photocopie non autorisée est un délit.
Table des matières
Chapitre 1 8. Le tri rapide ( quicksort ) 1 77
18.1 Partitionnement 177
18.2 L’algorithme de tri rapide 178
1 8.3 Comparaison de temps de calcul 1 79
Exercices 1 79
Corrigés 1 80
Partie 4
Structures de données
Chapitre 19. Listes chaînées 185
19.1 Qu’est-ce qu’une liste chaînée ? 185
19.2 Déclarer une liste chaînée 185
19.3 Insertion en tête de liste 187
19.4 Construction d’une liste chaînée 187
19.5 Parcours de liste 188
19.6 Insertion en queue de liste 190
19.7 Libération de mémoire 191
Exercices 1 92
Corrigés 1 95
Chapitre 20. Piles 213
20.1 Qu’est-ce qu’une pile? 213
20.2 Implémentation sous forme de tableau 214
20.2.1 Types 214
20.2.2 Créer une pile vide 214
20.2.3 Pile vide, pile pleine 214
20.2.4 Accéder au sommet de la pile 215
20.2.5 Ajouter un élément au sommet 215
20.2.6 Supprimer un élément 215
20.2.7 Vider et détruire 216
20.3 Implémentation sous forme de liste chaînée 216
20.3.1 Types 216
20.3.2 Créer une pile vide 217
20.3.3 Pile vide, pile pleine 217
20.3.4 Accéder au sommet de la pile 217
20.3.5 Ajouter un élément au sommet 217
20.3.6 Supprimer un élément 218
20.3.7 Vider et détruire 218
20.4 Comparaison entre tableaux et listes chaînées 219
Exercices 219
Corrigés 220
IX
Initiation à l’algorithmique et à la programmation en C
Chapitre 21. Files 225
21.1 Qu’est-ce qu’une file? 225
21.2 Gestion naïve par tableaux 226
21.3 Gestion circulaire par tableaux 228
21.3.1 Enfiler et défiler 228
21.3.2 Autres primitives 228
21.4 Gestion par listes chaînées 230
21.4.1 Structures de données 230
21.4.2 Primitives 231
Exercices 232
Corrigés 233
Chapitre 22. Récursivité 235
22.1 Qu’est-ce que la récursivité? 235
22.2 Comment programmer une fonction récursive? 235
22.2.1 Résolution récursive d'un problème 235
22.2.2 Structure d’une fonction récursive 236
22.3 Pile d’appels 236
Exercices 237
Corrigés 239
Chapitre 23. Arbres binaires 245
23.1 Qu’est-ce qu’un arbre binaire? 245
23.2 Parcours d’arbres binaires 246
23.2.1 Parcours préfixé 246
23.2.2 Parcours postfixé 248
23.2.3 Parcours infixé 248
23.3 Libération de mémoire 249
Exercices 249
Corrigés 252
Chapitre 24. Graphes 265
24.1 Définition mathématique d’un graphe 265
24.2 Chemins dans un graphe 265
24.3 Représentation par matrices d’adjacence 266
Exercices 267
Corrigés 268
Chapitre 25. Parcours de graphes 273
25.1 Parcours en profondeur récursif 273
25.2 Parcours en largeur 274
Exercices 275
Corrigés 276
X
© Dunod. La photocopie non autorisée est un délit.
Table des matières
Chapitre 26. Listes d’adjacence 281
26.1 Représentation par listes d’adjacence 281
Exercices 282
Corrigés 284
Annexes
Annexe A. Notions sur la compilation 293
A.l Qu’est-ce qu’un compilateur C ANSI? 293
A. 2 Compiler son premier programme 293
A. 2.1 Créer un répertoire 294
A. 2. 2 Lancer un éditeur de texte 294
A. 2. 3 Compiler et exécuter le programme 294
Annexe B. Programmation multifichiers 295
B. l Mettre du code dans plusieurs fichiers 295
B. 2 Compiler un projet multifichiers 296
B. 2.1 Sans makefile 296
B. 2. 2 Avec makefile 297
Annexe C. Compléments sur le langage C 299
C. l Énumérations 299
C.2 Unions 300
C.3 Variables globales 301
C.4 Do...while 302
C.5 i++ et ++i 302
C.6 Le générateur aléatoire : fonction rand 303
C .7 break et continue 304
C.8 Macros 305
C.9 atoi, sprinf et sscanf 306
C.10 Arguments d’un programme 307
C.l 1 fgetc et fputc 308
C. l 1.1 Lire caractère par caractère 308
C.l 1.2 Écrire caractère par caractère 309
C.l 2 Arithmétique de pointeurs 310
Exercices 311
Corrigés 312
Index 317
XI
© Dunod. La photocopie non autorisée est un délit.
Avant-propos
Que contient ce livre?
Cet ouvrage est destiné aux étudiants de première année des filières informatique
(Ll, DUT, certaines licences professionnelles), et à tous ceux qui veulent acquérir
des bases solides en programmation, sans connaissances préalables, avec la volonté
d’approfondir. Il inclut la programmation en langage C (syntaxe, exécution condi-
tionnelle, boucles itératives, tableaux, fichiers, allocation dynamique de mémoire, ré-
cursivité...), les algorithmes et complexité (langage algorithmique, complexité d’al-
gorithmes, tris...), et les structures de données (listes chaînées, piles, files, arbres,
graphes et parcours de graphes). L’un des objectifs fixés lors de la rédaction de ce
livre était de produire un ouvrage digeste. Le texte ne vise pas l’exhaustivité sur le
langage C.
Ce livre permet d’aborder la programmation en langage C sans connaissance préa-
lable de l’informatique. Il est conçu pour pouvoir être utilisé comme un outil d’ap-
prentissage en autodidacte. L’étudiant peut utiliser ce livre, et notamment les exer-
cices corrigés, en complément de l’enseignement qu’il reçoit par ailleurs. L’étudiant
peut aussi apprendre seul, en abordant les chapitres dans Tordre, en contrôlant ses
connaissances avec les exercices corrigés et avec les travaux pratiques sur machine.
Le texte présente de manière concise les bases qui sont nécessaires aux exercices.
Les exercices de chaque chapitre sont progressifs et doivent de préférence être traités
dans Tordre. Une indication de la difficulté des exercices est donnée par des étoiles
lors de l’énoncé.
Les pièges et les erreurs les plus courants sont mis en évidence clairement
dans le texte par des panneaux spéciaux Attention!
V Des compléments sont donnés au fil du texte; ils apportent un éclairage sur
certaines notions difficiles et peuvent être abordés lors d’une seconde lecture
ou lors de la phase d’exercices.
A l’étudiant
Compléments
XIII
Initiation à l’algorithmique et à la programmation en C
Des annexes expliquent comment compiler un programme C sur son ordinateur
personnel avec le compilateur gratuit gcc. Des sujets supplémentaires de travaux pra-
tiques sur machine pour chaque chapitre sont disponibles sur le site web de l’auteur
Rémy Malgouyres http : //www .malgouyres . fr/.
À l’enseignant
Le langage C, dont découlent de très nombreux autres langages actuels, reste la réfé-
rence pour la programmation bas niveau. En particulier, ce langage est très présent en
programmation système et réseaux. L’apprentissage de l’algorithmique en C permet
notamment de percevoir la gestion mémoire à partir d’une gestion manuelle, qui ap-
porte une meilleure compréhension des constructeurs et destructeurs du C++ ou des
subtilités du garbage collector en Java... L’apprentissage des structures de données
en C permet de comprendre en détail la nature des objets manipulés à travers les li-
brairies Java ou la STL du C++. L’abord de la programmation par le C est le moyen
le plus efficace de former des informaticiens complets, ayant au final une maîtrise
parfaite du bas niveau comme du haut niveau et une compréhension profonde des
concepts.
L’enseignant pourra s’appuyer sur la structure de l’ouvrage, qui permet de dé-
rouler le contenu sans référence à ce qui suit. L’exposé, mais surtout les exercices
contiennent de très nombreux exemples qui peuvent être réutilisés. L’ouvrage est
conçu pour un apprentissage autonome. Les exercices de chaque chapitre sont pro-
gressifs. En complément des exercices propres à chaque enseignant, les exercices du
livre peuvent être donnés à faire aux étudiants qui peuvent consulter la solution a
posteriori.
XIV
Partie 1
Bases du langage C
© Dunod. La photocopie non autorisée est un délit.
Qu’est-ce
qu’un ordinateur?
1.1 Exemples d’applications
DE L’INFORMATIQUE
Voici quelques exemples d’utilisation des ordinateurs :
• Bureautique L’ordinateur emmagasine des données saisies par une secrétaire ou
autre (textes, chiffres, fichiers clients, etc.) ou des données issues d’archives, et les
met en forme pour permettre une compréhension synthétique, un affichage, ou une
communication de ces données.
• Jeux vidéo L’ordinateur combine des données entrées par le concepteur du jeu
(données sur l’univers) avec les événements créés par l’utilisateur du jeu (clics de
souris, etc...) pour générer des images, du son, etc.
• Prévision météorologique À partir de la donnée des relevés de toutes les stations
météo d’une zone géographique, l’ordinateur calcule une situation future et génère
des cartes de températures et de pressions atmosphériques.
• Applications multimédia sur Internet L’ordinateur télécharge des données sto-
ckées sur un serveur distant et affiche ces données sur l’ordinateur de l’utilisateur.
Éventuellement, des actions de l’utilisateur peuvent influer sur les données affi-
chées (on parle alors d’applications interactives).
Dans tous ces exemples, l’ordinateur traite des données, et produit un résultat, soit
communiqué à l’utilisateur (son, images, texte), soit affiché sur un écran, ou stocké
sur un disque, ou autre.
1.2 Codage des données
Les données informatiques sont toujours, en fin de compte, codées en binaire, c’est-
à-dire qu’elles sont représentées par des suites de 0 et de 1. En effet, les données
binaires sont plus faciles à mémoriser sur des supports physiques (bandes magné-
tiques, disques, etc.).
Par exemple, si l’on veut stocker un nombre entier sur le disque dur d’un ordina-
teur, on code généralement ce nombre en base 2 au lieu de le coder en base 10 comme
nous y sommes naturellement habitués.
3
Chapitre 1 • Qu’est-ce qu’un ordinateur?
Ainsi le nombre 12 (en base 10) sera codé en base 2 par la suite binaire 00001 100,
ce qui signifie que :
12 = 0 + 0 + 0 + 0 + 8 + 4 + 0 + 0
= 0x2 7 + 0x 2 6 + 0x2 5 +0x2 4 + 1x2 3 + 1x 2 2 + 0x 2 1 +0x 2°
Une donnée égale soit à 0 soit à 1 s’appelle un bit. Une séquence de 8 bits consé-
cutifs s’appelle un octet (en anglais byte). On mesure la quantité de mémoire stockée
dans les ordinateurs en :
• Octets : 1 octet = 8 bits ;
• Kilo-octets (en abrégé Ko ou en anglais Kb) : un Ko vaut 1024 octets.
• Méga-octets (en abrégé Mo ou Mb) : un Mo vaut 1 048 576 octets
• Giga-octets (en abrégé Go ou Gb) : un Go vaut 1 073 741 824 octets
L’apparition des nombres 1024, 1 048 576 et 1 073 741 824 peut paraître surpre-
nante, mais ce sont des puissances de 2. On retient en général qu’un Ko fait environ
mille octets, un Mo environ un million, et un Go environ un milliard.
1.3 Fonctionnement d’un ordinateur
l.B.l Système d’exploitation
Un programme informatique doit recevoir des données pour les traiter, et produire
d’autres données. Pour que le programme puisse fonctionner, il faut du matériel (com-
posants électroniques), et il faut une couche logicielle intermédiaire avec le matériel,
appelée système d’ exploitation. Le système assure la communication entre le pro-
gramme informatique et le matériel, et permet au programme d’agir sur le matériel.
1.B.2 Processeur
Le processeur effectue des opérations (par exemple des opérations arithmétiques
comme des additions ou des multiplications). Ces opérations sont câblées dans le
processeur, c’est-à-dire qu’elles sont effectuées par des circuits électroniques pour
être efficaces. Avec le temps, de plus en plus d’opérations complexes sont câblées au
niveau du processeur, ce qui augmente l’efficacité. La vitesse d’un processeur, c’est-
à-dire en gros le nombre d’opérations par seconde, appelée vitesse d’horloge, est
mesurée en hertz (Hz), kilohertz (1 kHz = 1 ()()() Hz.) , mégahertz (1 MHz = 10 6 Hz, et
gigahertz (1 GHz = 10 9 Hz). Sur les architectures récentes, la puce contient plusieurs
cores, chaque core étant l’équivalent d’un processeur et les cores communiquant entre
eux très rapidement par des bus de données. Pour la personne qui programme en C,
la configuration et la structure de la puce est transparente, c’est-à-dire que l’on n’a
pas à s’en préoccuper (sauf pour l’optimisation en programmation très avancée).
4
© Dunod. La photocopie non autorisée est un délit.
T. B. Fonctionnement d’un ordinateur
l.B.B Mémoire centrale
Au cours du déroulement du programme, celui-ci utilise des données, soit les don-
nées fournies en entrée, soit des données intermédiaires que le programme utilise
pour fonctionner. Ces données sont stockées dans des variables. Physiquement, les
variables sont des données binaires dans la mémoire centrale (appelée aussi mémoire
RAM). La mémoire centrale communique rapidement avec le processeur. Lorsque le
processeur effectue un calcul, le programmeur peut indiquer que le résultat de ce cal-
cul doit être mémorisé dans une variable (en RAM). Le processeur pourra accéder
plus tard au contenu de cette variable pour effectuer d’autres calculs ou produire un
résultat en sortie. La quantité de mémoire RAM est mesurée en octets (ou en mégaoc-
tets ou gigaoctets). Les données en mémoire centrale ne sont conservées que pendant
le déroulement du programme, et disparaissent lorsque le programme se termine (no-
tamment lorsque l’on éteint l’ordinateur).
1.3.4 Périphériques
Le programme reçoit des données des périphériques en entrée, et communique ses
résultats en sortie à des périphériques. Une liste (non exhaustive) de périphériques
usuels est :
• le clavier qui permet à l’utilisateur de saisir du texte ;
• la souris qui permet à l’utilisateur de sélectionner, d’activer ou de créer à la main
des objets graphiques ;
• l’écran qui permet aux programmes d’afficher des données sous forme graphique ;
• l'imprimante qui permet de sortir des données sur support papier ;
• le disque dur ou la clef USB qui permettent de stocker des données de manière
permanente. Les données sauvegardées sur un tel disque sont préservées, y compris
après terminaison du programme ou lorsque l’ordinateur est éteint, contrairement
aux données stockées en mémoire centrale qui disparaissent lorsque le programme
se termine.
Les périphériques d’entrée (tels que le clavier et la souris) transmettent les données
dans un seul sens, du périphérique vers la mémoire centrale. Les périphériques de
sortie (tels que l’écran ou l’imprimante) reçoivent des données dans un seul sens, de
la mémoire centrale (ou de la mémoire vidéo) vers le périphérique. Les périphériques
d’entrée-sortie (tels que le disque dur, le port USB, ou la carte réseau) permettent la
communication dans les deux sens entre la mémoire centrale et le périphérique.
5
Chapitre 1 • Qu’est-ce qu’un ordinateur?
Figure 1.1- Schéma d’architecture d’un ordinateur.
6
© Dunod. La photocopie non autorisée est un délit.
Premiers
PROGRAMMES
2.1 Qu’est-ce qu’un programme?
Un programme informatique réalise en général trois choses :
• Il lit des données en entrée. Le programme doit en effet savoir à partir de quoi tra-
vailler. Par exemple, pour utiliser une calculatrice, on doit lui donner des nombres
et lui dire quelles opérations effectuer. Pour cela, on utilise souvent un clavier,
mais le programme peut aussi tirer les données d’un disque dur ou encore d’un
autre ordinateur via un réseau ou autre.
• Il effectue des calculs. À partir des données en entrée, le programme va appliquer
automatiquement des méthodes pour traiter ces données et produire un résultat.
Les méthodes que sont capables d’effectuer les ordinateurs s’appellent des algo-
rithmes. Par exemple, une calculatrice va appliquer l’algorithme d’addition ou de
multiplication.
• Il écrit des données en sortie. Lorsque le programme a obtenu un résultat, il
doit écrire ce résultat quelque part pour qu’on puisse l’utiliser. Par exemple, une
calculatrice va afficher un résultat à Y écran ou stocker le résultat en mémoire.
Le travail d’un programmeur consiste à créer des programmes informatiques. Le
programmeur doit pour cela expliquer à l’ordinateur dans un certain langage, appelé
langage de programmation, quelles sont les données et quelles sont les méthodes à
appliquer pour traiter ces données. Dans ce chapitre, nous verrons en langage C, les
premiers exemples permettant :
1 . de lire une donnée au clavier avec la fonction scanf ;
2 . d’effectuer les calculs les plus simples sur des nombres et de stocker le résultat
dans une variable ;
3. d’afficher un texte ou un nombre à l’écran avec la fonction printf .
Ce faisant, nous verrons la structure d’un programme C très simple et quelques
notions sur la syntaxe du langage. Les notions vues dans ces exemples seront déve-
loppées dans les chapitres suivants. Une fois que le programmeur a écrit son pro-
gramme, qui est du texte en langage C, il doit compiler le programme pour créer un
fichier exécutable pour qu’un utilisateur du programme puisse utiliser ce programme.
Le processus de compilation est décrit en annexe.
7
Chapitre 2 • Premiers programmes
2.2 Afficher un mot
Voici un programme C qui écrit un message de bienvenue : le mot “Bonjour”.
#inelude <stdio.h> /* pour pouvoir lire et écrire */
int main(void) /* programme principal */
{
printf ("Bonjour !\n"); /* écriture à l’écran */
return 0;
I }
Les phrases comprises entre /* et */ sont des commentaires. Elles n’ont pas d’in-
fluence sur le déroulement du programme. Les (bons) programmeurs mettent des
commentaires pour clarifier leur code, ce qui est crucial lorsqu’on travaille en équipe.
La première ligne est une instruction #include < stdio.h > qui permet d’utili-
ser les fonctions de la bibliothèque stdio.h dans le programme. Cette bibliothèque
contient notamment les fonctions d’affichage à l’écran printf et de lecture au clavier
scanf .
Vient ensuite la ligne déclarant le début de la fonction main, le programme prin-
cipal. Le programme principal est la suite des instructions qui seront exécutées. En
l’occurrence, il n’y a qu’une seule instruction : un affichage à l’écran par printf. Le
\n permet de passer à la ligne après l’affichage du mot “Bonjour”.
2. B Lire un nombre
Voici un programme permettant à l’utilisateur de taper un nombre au clavier. Ce
nombre est lu par le programme et mémorisé dans une variable x qui est un nombre
réel (type de données f loat). La variable x est ensuite ré-affichée par printf.
#inelude <stdio.h> /* pour pouvoir lire et écrire */
int main(void) /* programme principal */
{
float x; /* déclaration d’une variable x (nombre réel) */
printf ("Veuillez entrer un nombre réel au clavier\n");
scanf ("7«f", &x) ; /* lecture au clavier de la valeur de x */
/* affichage de x : */
printf ("Vous avez tapé 7«f , félicitations !", x) ;
return 0;
}
8
© Dunod. La photocopie non autorisée est un délit.
2.4. Effectuer un calcul et mémoriser le résultat
Le format d’affichage et de lecture %f correspond à des nombres réels (type
f loat). Dans printf, lors de l’affichage, le %f est remplacé par la valeur de x.
Par exemple, si l’utilsateur a entré la valeur 15 . 6 au clavier, le programme affiche la
phrase suivante :
Vous avez tapé 15.600000, félicitations !
Ne pas oubier le & dans le scanf ! Cela provoquerait une erreur mémoire (ou er-
reur de segmentation) lors de l’exécution du programme, et le programme serait
brutalement interrompu.
2.4 Effectuer un calcul et mémoriser
LE RÉSULTAT
Le programme suivant mémorise le double de x dans une variable y, par le biais d’une
affectation. L’affectation (symbole =) permet de stocker le résultat d’un calcul dans
une variable.
#inelude <stdio.h> /* pour pouvoir lire et écrire */
int main(void) /* programme principal */
{
float x, y; /* déclaration de deux variables x et y */
printf ("Veuillez entrer un nombre réel au clavier\n");
scanf &x) ; /* lecture au clavier de la valeur de x */
y = 2*x; /* on met dans y le double du contenu de x */
printf ("Le double du nombre tapé vaut °/ 0 f \n" , y);
return 0;
Le symbole = de l’affectation a une toute autre signification que l’égalité mathéma-
tique. L’affectation signifie qu'une variable prend la valeur du résultat d'un calcul.
Il correspond à une opération de recopie d’une donnée.
Compléments
V La syntaxe doit être respectée rigoureusement. Si on oublie un point-virgule,
ou bien si on remplace par exemple un guillemet " par une quote cela pro-
voque en général une erreur à la compilation. Dans certains cas très précis,
il y a plusieurs possibilités pour la syntaxe. Par exemple, le mot void dans la
déclaration du main est facultatif.
V Parfois, surtout en phase de conception, un programme peut être syntaxique-
ment correct, mais le comportement du programme n’est pas celui souhaité
9
Chapitre 2 • Premiers programmes
par le programmeur, en raison d’une erreur de conception ou d’inattention.
On dit que le programme comporte un bogue (en anglais bug).
V Le return 0 à la fin du main indique seulement que la valeur 0 est retournée
au système (ce qui indique que le programme ce termine sans erreur). Nous
n’utiliserons pas la possibilité de retourner des valeurs au système. Ces fonc-
tionalités sont généralement étudiées avec les systèmes d’exploitation.
Exercices
2.1 (*) Pour convertir des degrés Fahrenheit en degrés Celsius, on a la formule sui-
vante :
C =* 0.55556 x (F -32)
où F est une température en degrés Fahrenheit et C la température correspondante en
degrés Celsius.
a) Écrire un programme C qui convertit une température entrée au clavier exprimée
en degrés Fahrenheit et affiche une valeur approchée de la même température en de-
grés Celsius. Les températures seront exprimées par des nombres réels.
b) Même question qu’au a) pour la conversion inverse : de degrés Celsius en degrés
Fahrenheit.
2.2 (*) Lors d’une opération de promotion, un magasin de composants hardware
applique une réduction de 10% sur tous les composants. Écrire un programme qui
lit le prix d’un composant au clavier et affiche le prix calculé en tenant compte de la
réduction.
2.3 (**) Soit la fonction mathématique / définie par f(x) = (2x + 3)(3x~ + 2)
a) Écrire un programme C qui calcule l’image par / d’un nombre saisi au clavier.
b) Une approximation de la dérivée /' de la fonction / est donnée en chaque point x,
pour h assez petit (proche de 0), par :
s, , f(x + h)-f(x)
f W , .
Écrire un programme C qui calcule et affiche une approximation de la dérivée de /
en un point x entré au clavier. On pourra faire saisir le paramètre h au clavier.
10
© Dunod. La photocopie non autorisée est un délit.
Corrigés
2.4 (c-*) Une bille de plomb est lâchée du haut d’un immeuble et tombe en chute
libre. Au bout d’un temps t (exprimé en secondes), la bille est descendue d’une hau-
teur (en mètres) :
avec
g = 9.81 (exprimé en (m.s 2 ))
a) Écrire un programme qui calcule la hauteur descendue au bout d’un temps t saisi
au clavier.
b) Écrire un programme qui calcule la durée totale de la chute connaissant la hau-
teur totale h de l’immeuble saisi au clavier. (On pourra utiliser la fonction sqrt de la
bibliothèque math. h qui calcule la racine carrée d’un nombre.)
2.1
Corrigés
a)
int main (void)
{
float celsius, fahrenheit;
printf ("Entrez une température en degrés Fahrenheit : ");
scanf ("°/ 0 f " , &fahrenheit) ;
celsius = 0.55556 * (fahrenheit - 32.0);
printf ("Température de 7«f degré Celsius. \n", celsius);
return 0;
}
b)
int main (void)
{
float celsius, fahrenheit;
printf ("Entrez une température en degrés Celsius : ");
scanf ("°/ 0 f", &celsius) ;
fahrenheit = (celsius / 0.55556) + 32.0;
printf ("Température de 7«f degré Fahrenheit . \n" , fahrenheit);
return 0;
}
1 1
Chapitre 2 • Premiers programmes
2.2
int main(voî'ûf)
{
float prix, prixRemise;
printf ("Entrez un prix : ");
scanf ("°/ 0 f", feprix) ;
prixRemise = 0.9 * prix;
printf ("Le prix avec 10 °/°L de remise est de °/ 0 f.\n", prixRemise);
return 0;
I }
2.3
a)
int main(vo('ûf)
{
float x, fx;
printf ("Entrez un nombre : ");
scanf ("°/of", &x) ;
fx = (2.0 * x + 3.0) / (3.0 * x * x + 2.0);
printf ("f (°/.f) = 7.f\n", x, fx) ;
return 0;
I }
b)
int main (voit/)
{
float x, h, fx, fx_plus_h, fPrime_x;
printf ("Entrez un nombre : ");
scanf ("°/«f" , &x) ;
printf ("Entrez un écart h : ");
scanf ("°/«f" , &h) ;
fx = (2.0 * x + 3.0) / (3.0 * x * x + 2.0);
fx_plus_h = (2.0 * (x + h) +3.0) / (3.0 * (x + h) * (x + h) +2.0)
fPrime_x = (fx_plus_h - fx) / h;
printf ("f ’ (°/ 0 f) = °/ 0 f\n", x, fPrime_x) ;
return 0;
I }
2.4
a)
int main(vo/ûf)
{
float h , t ;
12
© Dunod. La photocopie non autorisée est un délit.
Corrigés
printf ("Entrez une durée : ");
scanf ("°/ 0 f " , &t) ;
h = (9.81 * t * t) / 2.0;
printf ("A t = °/ 0 f , h = °/ 0 f\n", t, h);
return 0;
I }
b) Ne pas oubliez d’ajouter -lm à la compilation
int main (voù/)
{
float h , t ;
printf ("Entrez la hauteur totale (en mètres) : ");
scanf (" 0 / O f", &h) ;
t = sqrt(2.0 * h / 9.81);
printf ("La bille touche le sol au bout de 7,f secondes\n" , t) ;
return 0;
}
13
© Dunod. La photocopie non autorisée est un délit.
Types de données
3.1 Variables et opérations
Dans un programme, il apparaît des variables qui permettent de donner des noms à
des données. Chaque variable doit avoir un type (nombre entier, nombre réel, carac-
tère, suite de caractères, ou type plus complexe). Chaque variable a aussi un identifi-
cateur qui est le nom de la variable. Une déclaration de variable a toujours la forme :
type identificateur;
ou bien la forme avec l’initialisation (c’est-à-dire que l’on donne à la variable une
valeur initiale) : type ident if icateur = valeur;
On peut aussi déclarer plusieurs variables d’un même type séparées par des virgules.
Exemple
fioat x, y=2.0; /* nombres réels, y a pour valeur initiale 2.0 */
int n; /* nombre entier */
Suivant le type des variables, certaines opérations sont définies sur ces variables
(par exemple la multiplication dans le cas des nombres entiers, etc.).
3.2 Type entier int
Le type int (abréviation de l’anglais integer ) est une représentation des nombres
entiers. Comme toute variable informatique, un int ne peut prendre qu’un nombre
fini de valeur. Un int est généralement codé sur 4 octets (32 bits). Dans ce cas, les
valeurs sont entre -2 31 et 2 31 - 1 (ce qui fait bien 2 32 valeurs possibles). Notons que
sur certains vieux systèmes, les int sont codés seulement sur 2 octets.
Les opérations arithmétiques binaires sont définies sur les int et donnent
toujours pour résultat un int.
Si le résultat, par exemple, d'une multiplication dépasse la limite 2 31 - 1
0 de capacité d’un int, le résultat est tronqué, donnant un résultat parfois
3 ° ^ inattendu. On parle de dépassement de capacité ou en anglais overflow.
La division de deux entiers est une division euclidienne dont le résultat
est toujours un entier. Par exemple, 7/2 est égal à 3 et non pas 3.5. Ceci est
source de nombreux bugs. Par exemple, il arrive que le résultat d'une division
entre deux variables de type int donne toujours 0 de manière inattendue, ce
qui est dû à une division entre deux entiers dont le quotient réel est entre 0
et 1 .
15
Chapitre 3 • Types de données
Le signe - peut aussi désigner l’opposé d’un nombre. On parle alors d’opération
unaire et non pas binaire.
Il y a aussi une opération appelée modulo. Le modulo correspond au reste de la
division entre deux entiers, et est noté %.
Par exemple, quand on dit
• “dans 17 combien de fois 5 ?”
• “3 fois et il reste 2”
En mathématiques, on écrit : 17 = 3x5 + 2.
En informatique, on écrit que 17/5 est égal à 3 et que 17%5 est égal à 2.
Plus généralement, on a toujours l’expression dite de la division euclidienne :
7 1 = p * ( n/p ) +(n%p )
quotient reste
Voici un autre exemple : un programme qui affiche le chiffre des unités d’un
nombre saisi au clavier.
ffinclude <stdio . h>
int main(void){
int nombre, chiffre;
putsC'Tapez un nombre entier
scanf ("7«d" , &nombre) ;
chiffre = nombre/dO;
printfC'Le dernier chiffre est : 7«d" , chiffre);
return 0;
I >
3.3 Les types RÉELS f loat ET double
Les types f loat et double permettent de représenter des nombres réels avec une
certaine précision (suivant une représentation des nombres appelée virgule flottante
ou nombre bottant).
Un nombre réel tel qu’il est ainsi représenté possède une mantisse (des chiffres) et
un exposant qui correspond à la multiplication par une certaine puissance de 10. Par
exemple 3. 5467? - 3 est égal à 3.546 x 10 -3 , ce qui fait 0.003546.
Le type double (codé sur 8 octets) est plus précis que le type f loat (codé sur 4 oc-
tets). La valeur maximale d’un double est d’environ 10 308 alors que celle d’un f loat
est de l’ordre de 10 38 . (Les valeurs limites exactes sont données par les constantes
DBL_MAX et FLT_MAX de la bibliothèque f loat. h).
16
© Dunod. La photocopie non autorisée est un délit.
3.4. Le type char
Sur les nombres réels sont définies les quatres opérations binaires ainsi
que le - unaire.
La bibliothèque math. h contient les fonctions de calcul scientifique pow (puis-
sance), sqrt (racine carrée), cos, sin, tan, etc.
3.4 Le TYPE char
Le type char (abréviation de l’anglais character ) est un type caractère codé sur
1 octet. C’est la plus petite donnée qui puisse être stockée dans une variable. Les
valeurs (de -126 à 125) peuvent réprésenter des caractères conventionnels.
Par exemple, les caractères alphabétiques majuscules A, B,..., Z ont pour va-
leur 65, 66, . . . , 90 et les minuscules correspondantes a, b , ... ,z ont pour valeurs
97, 98, . . . , 122. On appelle ce codage des caractères le code ASCII.
Une variable de type char peut être considérée soit comme un nombre, soit comme
un caractère que l’on peut afficher. Dans tous les cas, il s’agit du même type. Pour
désigner par exemple le caractère Z dans un programme, on peut soit écrire ’ Z ’ (entre
quotes), soit écrire 90 qui est le code ASCII du caractère Z. Dans les deux cas il s’agit
du même caractère et de la même donnée qui peut être stockée dans la même variable
de type char.
3.5 Les TYPES unsigned
Aux types int et char correspondent des types unsigned int (aussi sur 4 octets) et
unsigned char (aussi sur 1 octet) qui représentent uniquement des valeurs positives.
Un unsigned int sur 4 octets va de 0 à 2 32 - 1.
Un unsigned char sur 1 octet va de 0 à 2 8 - 1 (c’est-à-dire de 0 à 255).
3.6 Affectations et conversions
Étant données deux variables de même type, on peut recopier le contenu d’une va-
riable dans l’autre par une affectation (signe =). Plus généralement, on peut copier
dans une variable la valeur de toute une expression.
Si les deux variables sont de types différents, l’opération d’affectation = va réa-
liser, lorsque c’est possible, une conversion. Si la conversion n’est pas possible, le
compilateur affichera un message d’erreur.
17
Chapitre 3 • Types de données
Exemple d’affectation
int varl=0, var2=3; /* déclarations avec initialisations */
varl=2*var2+l ; /* affectation : après ceci varl vaut 7 */
Exemple de conversion d’un f îoat vers un int
int n;
float x=7.6587e2;
n = ( int)x ; /* après ceci n vaut 765 (arrondi à la partie entière) */
Exemple de conversion d’un unsigned int vers un unsigned char
unsigned char c;
unsigned int n = 321;
c = ( unsigned char)n; /* après ceci c vaut 65 (321 modulo 256) */
/* c’est-à-dire que c vaut ’A’ */
Lorsqu’on affecte (par exemple) un double x à un int n, il y a en général une perte
d’information. Le compilateur nous donne un message d’avertissement ( waming ), à
moins que l’on effectue un cast, appelé aussi conversion explicite, en indiquant le
type int entre parenthèses :
n = (int)x; /* Affectation avec conversion explicite (cast) */
Un dernier exemple : calculer la valeur précise d’un quotient (| sur l’exemple
suivant) de deux entiers :
int n=2 , m=3 ;
double deuxtiers;
/* conversion avant division : */
deuxtiers = ( (double) n) /( (double) m) ;
Une autre possibilité est d’écrire :
double deuxtiers;
deuxtiers = 2. 0/3.0;
Pour le calcul de deuxtiers ci-dessus, écrire deuxtiers=n/m ou encore deuxtiers=2/3
est une grave erreur qui conduit au résultat que deuxtiers est égal à 0 , car le
quotient entre entiers donne une division euclidienne, même lorsqu'on l’affecte
ensuite à un float ou un double.
3.7 Les CONSTANTES ET LE #def ine
18
Une constante est une valeur qui n’est pas susceptible de varier lors de l’exécution
d’un programme. Par exemple, 9.81 est une constante de type float, 1024 est une
constante de type int (qui peut aussi être affectée à une variable de type float).
© Dunod. La photocopie non autorisée est un délit.
3.8. Définir ses propres types
Enfin, 65, ou 'A' est une constante de type char (qui peut aussi être affectée à un int
ou un f loat).
On peut donner un nom à une constante (ce qui évite de répéter des chiffres au
risque de se tromper et augmente la souplesse du programme) par un #def ine au
début du programme (après les #include) :
#define PI 3.14159265358979323846 /* Constante de type float */
#define G 9.81 /* Constante de type float */
#define H 4816 /* Constante de type int */
/* Voici aussi une constante de type chaîne de caractères : */
#define MESSAGE1 "Erreur, vous devez mettre le #define hors du main !"
Le #def ine n’est pas une instruction comme les autres. Comme le #include, c’est
une directive de précompilation .
Ne pas confondre les constantes de type caractère (char), avec des simples quotes
comme ’Z’, et les constantes de types chaînes de caractères, entre double quotes,
comme "Voici une phrase" qui peuvent contenir plusieurs caractères. La chaîne
de caractère "Z" existe aussi, c’est un cas particulier d’une chaîne avec une seule
lettre, mais elle n’est pas de type char (nous étudierons plus loin le type chaîne).
Ne pas confondre le caractère ’6\ dont le code ASCII vaut 54, avec le caractère 6,
dont le code ASCII vaut 6, mais qui représente un autre caractère.
3.8 Définir ses propres types
En C, le programmeur peut définir ses propres types et donner les
Lire la suite
- 1.89 MB
- 15
Vous recherchez le terme ""

179

71