I – Introduction
I-A – Historique
I-B – Caractéristiques du langage C
I-B-1 – Universalité
I-B-2 – Concision, souplesse
I-B-3 – Puissance
I-B-4 – Portabilité
I-B-5 – Omniprésence
I-C – A propos de ce document
I-D – Remerciements
II – Instruction, programme et fonction
II-A – Structure générale d’un programme C
II-A-1 – Un premier programme
II-A-2 – Les commentaires
II-A-3 – Sensibilité à la casse
II-A-4 – Le format libreII-B – Du fichier source à l’exécutable
II-B-1 – La compilationII-B-2 – Applications consoles
II-B-3 – Manipulations avec Visual C++ et Code::Blocks
II-B-3-a – Avec Visual C++ 6
II-B-3-b – Avec Visual Studio .NETII-B-3-c – Avec Code::Blocks 1.0
II-C – Les fonctions
II-C-1 – Introduction
II-C-2 – Exemple avec une fonction « mathématique
II-C-3 – Exemple avec une « procédure
II-C-4 – Remarques
II-D – Les macros
II-D-1 – Le préprocesseur
II-D-2 – Définition
II-E – Exercices
II-E-1 – La lettre X
II-E-2 – Périmètre d’un rectangle
III – Expressions et instructions
III-A – Introduction aux types de données du langage C
III-A-1 – Les types de base du langage C
III-A-2 – Règle d’écriture des constantes littérales Nombres entiers Nombres flottants Caractères et chaînes de caractères
III-A-3 – Spécification de format dans printf
III-A-3-a – Généralités
III-A-3-b – Les « options
III-A-3-c – Le type entier
III-A-3-d – Le type flottant
III-A-4 – Les variables et les constantes
III-A-5 – Définition de nouveaux types
III-B – Les pointeurs
III-B-1 – Définition
III-B-2 – Saisir des données tapées au clavier avec la fonction scanf
III-B-3 – Exemple de permutation des contenus de deux variables
III-C – Les expressions
III-C-1 – Introduction
III-C-2 – lvalue et rvalue
III-C-3 – Opérations usuelles
III-C-3-a – Les opérateurs arithmétiques courants
III-C-3-b – Les opérateurs de comparaison
III-C-3-c – Les opérateurs logiques
III-C-4 – L’opérateur virgule
III-C-5 – Taille des données. L’opérateur sizeof
III-C-6 – Les opérateurs d’incrémentation et de décrémentation
III-C-7 – Expressions conditionnelles
III-C-8 – Autres opérateurs d’affectation
III-C-9 – Ordre de priorité des opérateurs
III-D – Considérations liées à la représentation binaire
III-D-1 – Généralités
III-D-2 – Les caractères
III-D-3 – Dépassement de capacité
III-E – La conversion de type
III-E-1 – Conversion implicite
III-E-2 – Conversion explicite (cast
III-F – Les instructions
III-F-1 – Introduction
III-F-2 – Bloc d’instructions
III-F-3 – L’instruction if
III-F-4 – L’instruction do
III-F-5 – L’instruction while
III-F-6 – L’instruction for
III-F-7 – Les instructions switch et case
III-F-8 – L’instruction break
III-F-9 – L’instruction continue
III-F-10 – L’instruction return
III-F-11 – L’instruction vide
III-G – Exercices
III-G-1 – Valeur absolue
III-G-2 – Moyenne
III-G-3 – L’heure dans une minute
III-G-4 – Rectangle
III-G-5 – Triangle isocèle
III-G-6 – Somme
IV – Tableaux, pointeurs et chaînes de caractères
IV-A – Les tableaux
IV-A-1 – Définition
IV-A-2 – Initialisation
IV-A-3 – Création d’un type « tableau
IV-A-4 – Les tableaux à plusieurs dimensions
IV-A-5 – Calculer le nombre d’éléments d’un tableau
IV-B – Les pointeurs
IV-B-1 – Les tableaux et les pointeurs
IV-B-2 – L’arithmétique des pointeurs
IV-B-3 – Pointeurs constants et pointeurs sur constante
IV-B-4 – Pointeurs génériques
IV-B-5 – Exemple avec un tableau à plusieurs dimensions
IV-B-6 – Passage d’un tableau en argument d’une fonction
IV-C – Les chaînes de caractères
IV-C-1 – Chaîne de caractères
IV-C-2 – Longueur d’une chaîne
IV-C-3 – Représentation des chaînes de caractères en langage C
IV-C-4 – Les fonctions de manipulation de chaînestrcpy, strncpystrcat, strncatstrlenstrcmp, strncmp
IV-C-5 – Fusion de chaînes littérales
IV-D – Exercices
IV-D-1 – Recherche dans un tableau
IV-D-2 – Calcul de la moyenne
IV-D-3 – Manipulation de chaînes
V – Les entrées/sorties en langage C
V-A – Introduction
V-B – Les fichiers
V-C – Les entrée et sortie standardsV-D – Exemple : lire un caractère, puis l’afficherV-E – Saisir une chaîne de caractères
V-F – Lire une ligne avec fgets
V-G – Mécanisme des entrées/sorties en langage C
V-G-1 – Le tamponnage
V-G-1-a – Les tampons d’entrée/sortieV-G-1-b – Les modes de tamponnage
V-G-2 – Lire de manière sûre des données sur l’entrée standard
VI – L’allocation dynamique de mémoire
VI-A – Les fonctions malloc et free
VI-B – La fonction realloc
VI-C – Exercices
VI-C-1 – Calcul de la moyenne (version 2
VI-C-2 – Recherche dans un tableau (version 2
VI – Solutions des exercices
VI-A – La lettre X (II-E-1
VI-B – Périmètre d’un rectangle (II-E-2
VI-C – Valeur absolue (III-G-1
VI-D – Moyenne (III-G-2
VI-E – L’heure dans une minute (III-G-3
VI-F – Rectangle (III-G-4
VI-G – Triangle isocèle (III-G-5
VI-H – Somme (III-G-6
VI-I – Recherche dans un tableau (IV-D-1
VI-J – Calcul de la moyenne (IV-D-2
VI-K – Manipulation de chaînes (IV-D-3
VI-L – Calcul de la moyenne (version 2) (VI-C-1
VI-M – Recherche dans un tableau (version 2) (VI-C-2
VIII – Conclusion
I – Introduction
I-A – Historique
L’histoire du langage C est intimement liée à celle du système d’exploitation UNIX. En 1969, Ken Thompson, qui travaillait pour Bell Laboratories, mit au point sur un DEC PDP-7 un système d’exploitation semblable à Multics mais plus simple et plus modeste. Ce système reçut par la suite le nom d’Unics (Uniplexed Information and Computing System) qui ne tarda pas à être définitivement changé en UNIX.
A l’époque, le seul langage vraiment adapté à l’écritute de systèmes d’exploitation était le langage d’assemblage. Ken Thompson développa alors un langage de plus haut niveau (c’est-à-dire plus proche du langage humain), le langage B (dont le nom provient de BCPL, un sous-ensemble du langage CPL, lui-même dérivé de l’Algol, un langage qui fut populaire à l’époque), pour faciliter l’écriture d’UNIX. C’était un langage faiblement typé (un langage non typé, par opposition à un langage typé, est un langage qui manipule les objets sous leur forme binaire, sans notion de type (caractère, entier, réel, …)) et trop dépendant du PDP-7 pour permettre de porter UNIX sur d’autres machines. Alors Denis Ritchie et Brian Kernighan, de Bell Laboratories également, améliorèrent le langage B pour donner naissance au langage C. En 1973, UNIX fut réécrit entièrement en langage C.
I-B – Caractéristiques du langage C
I-B-1 – Universalité
Langage de programmation par excellence, le C n’est pas confiné à un domaine particulier d’applications. En effet, le C est utilisé dans l’écriture
• de systèmes d’exploitations (comme Windows, UNIX et Linux) ou de machines virtuelles (JVMs, Runtimes et Frameworks .NET, logiciels de virtualisation, etc.)
• de logiciels de calcul scientifique, de modélisation mathématique ou de CFAO (Matlab, R, Labview, Scilab,)
• de bases de données (MySQL, Oracle, etc.)
• d’applications en réseau (applications intranet, internet, etc.)
• de jeux vidéo (notamment avec OpenGL ou la SDL et/ou les différents moteurs (de jeu, physique ou 3D) associés))
• d’assembleurs, compilateurs, débogueurs, interpréteurs, de logiciels utilitaires et dans bien d’autres domaines encore.
Oui, le C permet tout simplement de tout faire, ce qui lui a valu, à juste titre, l’appelation courante « the God’s programming language » (le langage de programmation de Dieu). A cause de son caractère proche du langage de la machine, le C est cependant peu productif, ce qui signifie qu’il faut souvent écrire beaucoup pour faire peu. C’est donc le prix à payer pour l’utilisation de ce langage surpuissant !
I-B-2 – Concision, souplesse
C’est un langage concis, très expressif, et les programmes écrits dans ce langage sont très compacts grâce à un jeu d’opérateurs puissant.
I-B-3 – Puissance
Le C est un langage de haut niveau mais qui permet d’effectuer facilement des opérations de bas niveau et d’accéder aux fonctionnalités du système, ce qui est la plupart du temps impossible ou difficile à réaliser dans les autres langages de haut niveau. C’est d’ailleurs ce qui fait l’originalité du C, et aussi la raison pour laquelle il est autant utilisé dans les domaines où la performance est cruciale comme la programmation système, le calcul numérique ou encore l’informatique embarquée.
I-B-4 – Portabilité
C’est un langage qui ne dépend d’aucune plateforme matérielle ou logicielle, c’est-à-dire qui est entièrement portable.
De plus, de par sa simplicité, écrire un compilateur C pour un processeur donné n’est pas beaucoup plus compliqué que d’écrire un assembleur pour ce même processeur. Ainsi, là où l’on dispose d’un assembleur pour programmer, on dispose aussi généralement d’un compilateur C, d’où l’on dit également que le C est un « assembleur portable ».
I-B-5 – Omniprésence
La popularité du langage mais surtout l’élégance des programmes écrits en C est telle que son style et sa syntaxe ont influencé de nombreux langages :
• C++ et Objective C sont directement descendus du C (on les considère souvent comme des extensions du C)
• C++ a influencé Java
• Java a influencé JavaScript
• PHP est un mélange de C et de langage de shell-scripting sous Linux
• C# est principalement un mix de C++ et de Java, deux langages de style C, avec quelques influences fonctionnelles d’autres langages comme Delphi et Visual Basic (le # de C# vient-il dit-on de deux « ++ » superposés)
I-C – A propos de ce document
Ce document contient des cours et des exercices. Chaque fois que vous tombez sur des exercices, traitez-les avant de passer au chapitre ou au paragraphe suivant.
I-D – Remerciements
J’adresse un remerciement tout particulier à JagV12 pour sa relecture très attentive de cet article ainsi qu’à Franck.h pour ses conseils et son soutien.
Initiation au Langage C (801.02 KO) (Cours PDF)