Licence CC BY-SA

Le langage C

Vous souhaitez apprendre à programmer, mais vous ne savez pas comment vous y prendre ? Vous connaissez déjà le C, mais vous avez besoin de revoir un certain nombre de points ? Ou encore, vous êtes curieux de découvrir un nouveau langage de programmation ? Si oui, alors permettez-nous de vous souhaiter la bienvenue dans ce cours de programmation consacré au langage C.

Pour pouvoir suivre ce cours, aucun prérequis n’est nécessaire : tout sera détaillé de la manière la plus complète possible, accompagné d’exemples, d’exercices et de travaux pratiques.

Remerciements

Avant de commencer, nous souhaitons remercier plusieurs personnes :

  • Mewtow pour sa participation à la rédaction et à l’évolution de ce cours ainsi que pour ses nombreux conseils ;
  • @Arius, @Saroupille, @amael et @Glordim pour la validation de ce cours ;
  • @Pouet_forever, SofEvans, @paraze et Mathuin pour leur soutien lors des débuts de la rédaction ;
  • @Dominus Carnufex et @patapouf pour leur suivi minutieux et leur bienveillance face à nos (nombreuses) fautes de français ;
  • @Karnaj, @Ifrit et @AScriabine pour leurs suggestions et corrections ;
  • @Maëlan pour sa relecture attentive du chapitre sur les encodages ;
  • toute l’équipe de Progdupeupl et de Zeste de Savoir ;
  • tous ceux qui, au fil du temps et de la rédaction, nous ont apporté leurs avis, leurs conseils, leurs points de vue et qui nous ont aidés à faire de ce cours ce qu’il est aujourd’hui ;
  • et surtout vous, lecteurs, pour avoir choisi ce cours.

Premiers pas

  1. Présentation du langage C

    1. La programmation, qu’est-ce que c’est ?

    2. Le langage C

    3. Notre cible

  2. Les outils nécessaires

    1. Windows

    2. GNU/Linux et *BSD

    3. Mac OS X

  3. Notre premier programme C

    1. Premier programme

    2. Erreur lors de la compilation

    3. Les commentaires

Les bases du langage C

  1. Les variables

    1. Qu’est-ce qu’une variable ?

    2. Déclarer une variable

    3. Initialiser une variable

    4. Affecter une valeur à une variable

    5. Les représentations octale et hexadécimale

  2. Manipulations basiques des entrées/sorties

    1. Les sorties

    2. Interagir avec l'utilisateur

  3. Les opérations mathématiques

    1. Les opérations mathématiques de base

    2. Raccourcis

    3. Le type d'une constante

    4. Le type d'une opération

    5. Les conversions

    6. Exercices

  4. Tests et conditions

    1. Les booléens

    2. Les opérateurs de comparaison

    3. Les opérateurs logiques

    4. Priorité des opérations

  5. Les sélections

    1. La structure if

    2. L'instruction switch

    3. L'opérateur conditionnel

  6. TP : déterminer le jour de la semaine

    1. Objectif

    2. Première étape

    3. Correction

    4. Deuxième étape

    5. Correction

    6. Troisième et dernière étape

    7. Correction

  7. Les boucles

    1. La boucle while

    2. La boucle do-while

    3. La boucle for

    4. Imbrications

    5. Boucles infinies

    6. Exercices

  8. Les sauts

    1. L'instruction break

    2. L’instruction continue

    3. Boucles imbriquées

    4. L'instruction goto

  9. Les fonctions

    1. Qu'est-ce qu'une fonction ?

    2. Définir et utiliser une fonction

    3. Les prototypes

    4. Variables globales et classes de stockage

    5. Exercices

  10. TP : une calculatrice basique

    1. Objectif

    2. Préparation

    3. Correction

  11. Découper son projet

    1. Portée et masquage

    2. Partager des fonctions et variables

    3. Fonctions et variables exclusives

    4. Les fichiers d'en-têtes

  12. La gestion d'erreurs (1)

    1. Détection d'erreurs

    2. Prévenir l'utilisateur

    3. Un exemple d'utilisation des valeurs de retour

Agrégats, mémoire et fichiers

  1. Les pointeurs

    1. Présentation

    2. Déclaration et initialisation

    3. Utilisation

    4. Pointeurs génériques et affichage

    5. Exercice

  2. Les structures

    1. Définition, initialisation et utilisation

    2. Structures et pointeurs

    3. Portée et déclarations

    4. Les structures littérales

    5. Un peu de mémoire

  3. Les tableaux

    1. Les tableaux simples (à une dimension)

    2. La vérité sur les tableaux

    3. Les tableaux multidimensionnels

    4. Les tableaux littéraux

    5. Exercices

  4. Les chaînes de caractères

    1. Qu'est-ce qu'une chaîne de caractères ?

    2. Définition, initialisation et utilisation

    3. Afficher et récupérer une chaîne de caractères

    4. Lire et écrire depuis et dans une chaîne de caractères

    5. Les classes de caractères

    6. Exercices

  5. TP : l'en-tête <string.h>

    1. Préparation

    2. Correction

    3. Pour aller plus loin : strtok

  6. L'allocation dynamique

    1. La notion d'objet

    2. Malloc et consoeurs

    3. Les tableaux multidimensionnels

    4. Les tableaux de longueur variable

  7. Les fichiers (1)

    1. Les fichiers

    2. Les flux : un peu de théorie

    3. Ouverture et fermeture d'un flux

    4. Écriture vers un flux de texte

    5. Lecture depuis un flux de texte

    6. Écriture vers un flux binaire

    7. Lecture depuis un flux binaire

  8. Les fichiers (2)

    1. Détection d'erreurs et fin de fichier

    2. Position au sein d'un flux

    3. La temporisation

    4. Flux ouverts en lecture et écriture

  9. Le préprocesseur

    1. Les inclusions

    2. Les macroconstantes

    3. Les macrofonctions

    4. Les directives conditionnelles

  10. TP : un Puissance 4

    1. Première étape : le jeu

    2. Correction

    3. Deuxième étape : une petite IA

    4. Correction

    5. Troisième et dernière étape : un système de sauvegarde/restauration

    6. Correction

  11. La gestion d'erreurs (2)

    1. Gestion de ressources

    2. Fin d'un programme

    3. Les assertions

    4. Les fonctions strerror et perror

Notions avancées

  1. La représentation des types

    1. La représentation des entiers

    2. La représentations des flottants

    3. La représentation des pointeurs

    4. Ordre des multiplets et des bits

    5. Les fonctions memset, memcpy, memmove et memcmp

  2. Les limites des types

    1. Les limites des types

    2. Les dépassements de capacité

    3. Gérer les dépassements entiers

    4. Gérer les dépassements flottants

  3. Manipulation des bits

    1. Les opérateurs de manipulation des bits

    2. Masques et champs de bits

    3. Les drapeaux

    4. Exercices

  4. Internationalisation et localisation

    1. Définitions

    2. La fonction setlocale

    3. La catégorie LC_NUMERIC

    4. La catégorie LC_TIME

  5. La représentation des chaînes de caractères

    1. Les séquences d'échappement

    2. Les tables de correspondances

    3. Des chaînes, des encodages

  6. Les caractères larges

    1. Introduction

    2. Traduction en chaîne de caractères larges et vice versa

    3. L'en-tête <wchar.h>

    4. <wchar.h> : les fonctions de lecture/écriture

    5. <wchar.h> : les fonctions de manipulation des chaînes de caractères

    6. L'en-tête <wctype.h>

  7. Les énumérations

    1. Définition

    2. Utilisation

  8. Les unions

    1. Définition

    2. Utilisation

  9. Les définitions de type

    1. Définition et utilisation

  10. Les pointeurs de fonction

    1. Déclaration et initialisation

    2. Utilisation

    3. Pointeurs de fonction et pointeurs génériques

  11. Les fonctions et macrofonctions à nombre variable d'arguments

    1. Présentation

    2. L'en-tête <stdarg.h>

    3. Méthodes pour déterminer le nombre et le type des arguments

    4. Les macrofonctions à nombre variable d'arguments

  12. Les sélections génériques

    1. Définition et utilisation

  13. T.P. : un allocateur statique de mémoire

    1. Objectif

    2. Première étape : allouer de la mémoire

    3. Correction

    4. Deuxième étape : libérer de la mémoire

    5. Correction

    6. Troisième étape : fragmentation et défragmentation

    7. Correction

Annexes

  1. Index

    1. Index



Ainsi s’achève ce cours, mais pas votre parcours dans le monde de la programmation ! En effet, même si vous avez appris certaines choses, vous ne connaissez pas tout : le C est un langage fabuleux qui réserve bien des surprises. Pour continuer votre apprentissage, voici quelques derniers conseils :

  • Soyez curieux : fouillez sur Internet pour découvrir de nouvelles méthodes, approfondissez celles que vous connaissez, renseignez-vous, testez de nouveaux outils, etc.
  • Entrainez-vous : c’est le meilleur moyen de progresser. Faites des projets qui vous tiennent à cœur, mettez en œuvre des algorithmes connus, réalisez des exercices, etc.
  • Lisez des codes produits par d’autres personnes : découvrez comment elles procèdent, apprenez d’elles de nouvelles techniques ou façons de faire et progressez en suivant leurs conseils. Vous pouvez par exemple commencer en visitant les forums de ce site.
  • Enfin, le plus important : amusez-vous ! ;)

Ces contenus pourraient vous intéresser

107 commentaires

@thglife on y travaille !

Pour l’immense majorité des tutoriels c’est déjà le cas. Pour celui-ci, nous avons découvert des petits problèmes, il faut dire que le tuto est grand et pousse notre moteur de génération de PDF dans ses retranchements, mais on va y arriver ! La preuve, le premier des problèmes a été réglé aujourd’hui, nous continuons pour fournir les dernières corrections d’ici peu.

En attendant, je te propose d’utiliser l’ebook, qui est tout aussi utilisable. On fait de notre mieux pour régler les soucis du PDF de ce tuto.

+3 -0

Salut l’équipe de ZDS, Le tutoriel est vraiment excellent et d’un très bon niveau. Je en suis à la dernière partie. Mais je constate, sauf erreur, que le sujet des listes chainées (simples et doubles) n’est pas abordé. Pas plus que celui des heap et stack ou hash. Celà étant, c’est une excellent travail.

Bonne continuation.

Salut @m.berriah,

Merci de ton retour. :)

Je en suis à la dernière partie. Mais je constate, sauf erreur, que le sujet des listes chainées (simples et doubles) n’est pas abordé. Pas plus que celui des heap et stack ou hash.

m.berriah

Effectivement, les structures de données ne sont pas abordées dans le tuto, mise à part les liste chaînées, qui le sont succintement lors du dernier TP. En fait, il y aurait beaucoup à dire au sujet des structures de données (tableaux, liste chaînées, piles, files, tables de hachage, arbres, graphes, etc.) ainsi que des algorithmes qui les emploient. Aussi, ce tuto se focalise uniquement sur le langage en lui-même et laisse ce sujet à une autre tuto (qui n’existe pas pour l’instant).

+0 -0

Coucou Jaja75,

Oui effectivement, pour ce cours en particulier le pdf est pour l’instant généré à la main par @atragis. Une nouvelle version arrivera dès qu’il l’aura publiée.

Pour ce qui est de ton apprentissage, si ton but est d’apprendre le C++, je te conseil de directement t’attaquer au tutoriel sur le C++. En effet, le C++ n’est pas une suite au C et peut s’apprendre indépendament du C++. Il y a d’ailleurs un tutoriel sur le C++ sur le site. ;)

Apprendre le C est toujours très intéressant et je te le conseil vivement. Si ton but est de connaître les deux langages alors effectivement apprendre le C avant le C++ (ou le contraire peu importe) l’un après l’autre est intéressant. La proximité des deux langages fait qu’il n’est pas facile de les apprendre en même temps et qu’il faut bien faire l’un après l’autre.

Bonne journée

+4 -0

Merci @ache de ta reactivité.

Le PDF généré par Atragis sera disponible au même endroit que le Latex, le HTML ou l’epub? Concernant l’apprentissage du C effectivement je suis intéressé pour faire de l’électronique embarquée, microcontroleurs etc. Je sais que ce n’est pas pas exactement la même manière de programmer que sur du PC mais ça me fera une bonne base. J’aimerai par la suite contribuer à l’écosystème linux pour faire avancer la cause. Il me semble que C et C++ sont de bons langages si l’on souhaite apprendre et évoluer dans la programmation. Merci.

Bonne journée

Le PDF du langage C est disponible en avant première !

Nous avons trouvé une solution technique pour le générer. Pour l’instant cette solution n’est disponible que sur la béta du site, mais comme le résultat est conforme à ce que nous attendions, j’ai téléversé le PDF sur notre site principal, vous donnant ainsi accès hors ligne à ce super tuto.

+6 -0

Yataaaa ! \o/
Merci infiniment pour tout le travail abattu. :)

Édit : je note juste déjà que les tableaux du chapitre « la représentation des types » sont coupés (ils sont trop longs ou la page trop petite, c’est selon :-° ).

+3 -0

Bonjour !
Quel magnifique cours ! Il est bien difficile de faire plus complet ou plus structuré… C’est une mine d’or pour tous ceux qui souhaitent débuter en C (ou qui, comme moi, n’en ont pas fait depuis longtemps).

Sauriez-vous si la version EPUB est à jour ? Contrairement au PDF, je n’ai pas réussi à trouver la date de génération.

Par ailleurs, je trouve le cours formidablement bien écrit. J’ai néanmoins remarqué quelques petites erreurs orthographiques et grammaticales (infimes, certes, mais méritant d’être corrigées). Ainsi "dans le but de facilité le développement de compilateurs" devrait-il être "dans le but de faciliter le développement de compilateurs" (dans la partie "Introduction à la programmation").

Bonne fin de journée,
Alexis

Salut,

Quel magnifique cours ! Il est bien difficile de faire plus complet ou plus structuré… C’est une mine d’or pour tous ceux qui souhaitent débuter en C (ou qui, comme moi, n’en ont pas fait depuis longtemps).

alexis03

Je suis heureux de lire que le cours te plaît. :)

Sauriez-vous si la version EPUB est à jour ? Contrairement au PDF, je n’ai pas réussi à trouver la date de génération.

alexis03

Mmm… Alors, je n’ai pas d’idées là-dessus, mais il semble dater un peu si je me réfère à cette ligne contenu dans l’EPUB.

<meta property="dcterms:modified">2019-06-20T07:35:15Z</meta>

Est-ce que vous en savez plus @artragis ou @Karnaj ?

Par ailleurs, je trouve le cours formidablement bien écrit. J’ai néanmoins remarqué quelques petites erreurs orthographiques et grammaticales (infimes, certes, mais méritant d’être corrigées). Ainsi "dans le but de facilité le développement de compilateurs" devrait-il être "dans le but de faciliter le développement de compilateurs" (dans la partie "Introduction à la programmation").

alexis03

Merci de ton retour, je vais corriger ça. ;)

+0 -0

Bonjour,

le format epub est à jour avec la même version que le PDF logiquement, la date de modification est peut-être erratique, il faudra que je regarde celle qu’on utilise.

Si la version "PDF" est très récente c’est simplement que la version PDF prend la date de génération et non la date de publication du tutoriel. Si la date de l’epub est celle-ci c’est probablement car la "last modified date" qu’on a techniquement subit un bug depuis quelques versions que nous n’avons pas encore géré.

Merci pour toutes ces informations !
Quand vous parlez des différentes bases, peut-être pourriez-vous préciser (par souci d’exhaustivité) que GCC accepte le préfixe 0b pour représenter un nombre en base 2, bien que ce préfixe ne soit défini par aucune norme. À moins que ce soit un souhait délibéré de votre part afin de garantir la compatibilité du code avec les autres compilateurs ?

Quand vous parlez des différentes bases, peut-être pourriez-vous préciser (par souci d’exhaustivité) que GCC accepte le préfixe 0b pour représenter un nombre en base 2, bien que ce préfixe ne soit défini par aucune norme. À moins que ce soit un souhait délibéré de votre part afin de garantir la compatibilité du code avec les autres compilateurs ?

alexis03

En effet, nous avons essayé de construire un tutoriel qui respecte la norme C11, nous ne parlons donc pas des extensions des compilateurs (même si certaines sont intéressantes). ;)

+0 -0

Bonjour ! Je viens de penser à quelque chose… Lorsque l’on installe GCC sous Windows avec MinGW (livré avec MSYS2), on ne peut pas utiliser l’indicateur de conversion "%Lf" avec printf. Il faut soit appeler la fonction __mingw_printf à la place, ou alors compiler avec -D__USE_MINGW_ANSI_STDIO.

Bonne journée :)

Je viens de penser à quelque chose… Lorsque l’on installe GCC sous Windows avec MinGW (livré avec MSYS2), on ne peut pas utiliser l’indicateur de conversion "%Lf" avec printf. Il faut soit appeler la fonction __mingw_printf à la place, ou alors compiler avec -D__USE_MINGW_ANSI_STDIO.

alexis03

C’est le cas si tu utilise MSys2 comme conseillé dans le tuto ? Ou bien c’est seulement si tu installes MinGW et non MSys2 ?

+0 -0

Lorsque l’on installe MSYS2, trois "sous-systèmes" sont en fait installés : MSYS2, MinGW64 et MinGW32. Ceux-ci sont accessibles via 3 différents shells. Les exécutables créés sous Windows avec la version MSYS2 de GCC reposent sur une couche d’émulation POSIX tandis que ceux créés avec la version MinGW de GCC sont parfaitement natifs (et ne reposent pas sur cette couche d’émulation). Le wiki officiel de MSYS2 conseille ainsi :

  • d’utiliser le shell MSYS2 pour installer et mettre à jour les paquets (y compris les paquets MinGW), ou pour les scripts shell
  • d’utiliser l’un des shells MinGW pour compiler les programmes.

Pour l’installation de GCC sous Windows, je conseillerais d’installer le paquet mingw-w64-x86_64-gcc (ou encore mieux mingw-w64-x86_64-toolchain qui le contient) plutôt que gcc (qui est la version MSYS2 du compilateur), notamment pour des raisons de performances (mais pas seulement).

Le post suivant est assez intéressant et permet de mieux comprendre le tout : Distinctions between MSYS2 and MINGW.

Pour répondre à ta question, cela dépend :

  • si on compile avec la version MSYS2 de GCC, alors il n’y aura pas ce problème, en raison justement de cette couche d’émulation
  • si on compile avec la version MinGW de GCC (ce qui est fortement conseillé par les auteurs de MSYS21), alors ce problème se présentera puisque le programme compilé fera appel aux bibliothèques natives de Windows. On peut néanmoins y remédier grâce à la solution donnée plus haut.

1"Use msys2 shell for running pacman, makepkg, makepkg-mingw and for building POSIX-dependent software that you don’t intend to distribute. Use mingw shells for building native Windows software and other tasks."

Bonne fin de journée ^^

+0 -0

Merci pour ces informations. :)
Il va falloir que je me repenche là-dessus quand j’aurai un Windows sous la main histoire d’adapter l’introduction au besoin. ^^

(Note si tu as directement une suggestion de modification ou que te sens chaud cela ne me dérange pas de te laisser modifier la partie en question ;) ).

+0 -0

Bonjour,

Dans la partie concernant le switch sans break compilé avec -Wall -Wextra -pedantic -std=c11 -fno-common -fno-builtin comme préconisé, gcc sort neuf lignes de warning : warning: this statement may fall through [-Wimplicit-fallthrough=].

Je trouve cela un peu curieux (gcc 7.5.0). Quelqu’un pourrait-i-l vérifier de son côté ?

Salut,

Je trouve cela un peu curieux (gcc 7.5.0). Quelqu’un pourrait-i-l vérifier de son côté ?

stéph

Je confirme avec GCC 8.3 et a priori c’est normal, le but est d’avertir qu’il « manque » des instructions break (dans le sens où c’est plus souvent un oubli qu’un souhait). ;)

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte