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

Bonjour, Merci pour ce tuto qui va a l’essentiel (contrairement à un bouquin du Zéro sur le même sujet, qui pourrait être réduit de plus de la moitié en enlevant les élucubrations narcissiques de l’auteur). J’aimerai trouver la version PDF, comme pour le cours sur le C++. Depuis 2016, la production PDF a du retrouver sa fonctionnalité.

…comme le cours sur le C++…

Si tu parles tu cours C++ d’OC, c’est un très mauvais cours qui aurait besoin d’une mise à jour (mais qui resterais mauvais quand-même).

Le cours C++ de ce site est bon (mais partiellement en bêta) par contre.

Mais pour parler de ce tuto (le C de ZDS), c’est effectivement un bon tuto qui en plus d’aller à l’essentiel et d’exploiter toute la puissance du langage, apprend des bonnes pratiques et explique clairement ce qu’il ne faut pas faire.

Bravo aux auteurs!

Edit:

Petit bug du serveur (erreur interne du serveur) qui m’a fait actualiser la page et envoyer deux fois ce message.

+0 -0

Non je parle du livre de Mathieu Nebra : « Apprenez à programmer en C ». Rien sur les boucles imbriquées, ni sur plein d’autres trucs, d’ailleurs. Sur les directives de préprocesseur et sur les boucles conditionnelles, c’est vraiment succinct.

Pour le PDF de ce tuto de ZDS sur le C, y’a pas de PDF ? Ou alors quelqu’un peut m’expliquer comment faire pour imprimer du markdown. est-ce que c’est possible au moins, sans passer par un autre format ? Je pratique un peu Latex, mais Markdown, point.

+0 -0

Il est en UTF-8, le document Markdown ? Parce que je viens de transformer l’intro en html avec pandoc et y’a plein de caractères comme ça :

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.```

Le cours est bien en utf-8. ^^
Avec pandoc, tu peux obtenir un pdf aussi si tu veux.

Ton problème vient de comment tu génères le fichier pdf. Sans rien spécifier, pandoc va générer le HTML correspondant uniquement à la partie HTML, il manque les headers. Pour faire un fichier HTML seul, tu peux utiliser l’option -s pour créer un fichier standalone.

pandoc -s introduction.md -o introduction.html

+1 -0

Le cours est bien en utf-8. ^^
Avec pandoc, tu peux obtenir un pdf aussi si tu veux.

Ton problème vient de comment tu génères le fichier html. Sans rien spécifier, pandoc va générer le HTML correspondant uniquement à la partie markdown, sans les headers. Pour faire un fichier HTML complet, tu peux utiliser l’option -s pour créer un fichier standalone.

pandoc -s introduction.md -o introduction.html

+0 -0

Merci #ache, ça le fait avec -s. Et pour le pdf il faut passer par pandoc ET latex, si j’ai bien compris ? Faut-il convertir les documents un à un ou bien est-il possible de le faire globalement ? Est-ce que ça va respecter la hiérarchie ? Quand j’ouvre un document markdown avec un éditeur de texte (kate, emacs ou vim), il est déjà formaté, je ne vois pas les entêtes. Et à quoi sert le fichier _manifest.json et comment est-il utilisé ? Vu son contenu, il semble justement indiquer la hiérarchie du livre.

Pandoc est capable d’utiliser plusieurs “versions” de LATXE\LaTeX. Il faut qu’un des moteurs de rendu LATXE\LaTeX soit installé.

Ensuite, pandoc gère tout.

Chez moi par exemple, j’ai pdflatex, xelatex et wkhtmltopdf. Par défault il me semble que c’est pdflatex qui est utilisé.

pandoc introduction.md -f introduction.pdf

Et j’ai mon pdf ^^
Que pandoc passe par LATXE\LaTeX ou par de l’HTML pour me générer mon pdf m’est caché, je dois pouvoir le retrouver mais j’avoue que je m’en fiche un peu tant que j’ai le pdf x)

Je ne suis pas un expert en pandoc.

+0 -0

Bonsoir, pour mes besoins je suis en train de mettre en forme ce cours en un unique PDF depuis markdown via LATE​X. Si quelqu’un est intéressé, je transmet les source latex et le PDF dès que j’ai fini ( j’en suis aux « Notions avancées, limites des types » )

Bonjour @moricef, le plus simple est sans.doute de mettre les sources sur Github où tu pourras sans doute obtenir l’aide d’autres membres et donc finir plus vite.

+0 -0

Bien. Pour faire un fichier latex unique de tous ces markdown dans chaque partie, je rame un peu parce que la conversion me mélange un peu les paragraphes et je dois reprendre tous les codes depuis le site, ainsi que refaire les tableaux. Je coince sur l’animation gif du triangle de Pascal dans le chapitre suer les tableaux car passé un certain nombre de pages le compilateur Lualatex coince. Je l’ai donc finalement enlevé (package animate). je coince aussi sur un tableau assez large dans le paragraphe sur La représentation des flottants dans le chapitre la représentation des types.

Et aussi sur les doubles chevrons dans une tcbox \newtcbox{mybox}{on line, fontupper=\scriptsize, arc=0pt,outer arc=0pt, colback=blue!5!white, colframe=black!30!white, colupper=cardinal, boxsep=0pt,left=1pt,right=1pt,top=1pt,bottom=1pt, boxrule=0.5pt,bottomrule=0.5pt,toprule=0.5pt} dans le chapitre sur la manipulations des bits malgré l’utilisation du package microtype avec l’option \DisableLigatures[<,>]{encoding=, family=}

J’ai mis une commande pandoc et un script sed de mise en forme des latex dans l’arborescence des fichiers

https://github.com/moricef/Cours-C-ZestedeSavoir/tree/master/

+0 -0

Bien. Pour faire un fichier latex unique de tous ces markdown dans chaque partie, je rame un peu parce que la conversion me mélange un peu les paragraphes et je dois reprendre tous les codes depuis le site, ainsi que refaire les tableaux.

Je coince sur l’animation gif du triangle de Pascal dans le chapitre suer les tableaux car passé un certain nombre de pages le compilateur Lualatex bloque. Je l’ai donc finalement enlevé (package animate).

je coince aussi sur un tableau assez large dans le paragraphe sur La représentation des flottants dans le chapitre la représentation des types.

Et aussi sur les doubles chevrons dans une tcbox \newtcbox{mybox}{on line, fontupper=\scriptsize, arc=0pt,outer arc=0pt, colback=blue!5!white, colframe=black!30!white, colupper=cardinal, boxsep=0pt,left=1pt,right=1pt,top=1pt,bottom=1pt, boxrule=0.5pt,bottomrule=0.5pt,toprule=0.5pt} dans le chapitre sur la manipulations des bits malgré l’utilisation du package microtype avec l’option \DisableLigatures[<,>]{encoding=\*, family=\*}

J’ai mis dans l’arborescence des fichiers une commande pandoc et un script sed de mise en forme des latex créés avec pandoc : sed -f ../../sed_format.sed manipulation-des-bits.tex > temp_sed.tex

https://github.com/moricef/Cours-C-ZestedeSavoir/tree/master/

J’en suis à manipulation des bits.

Edit : J’ai fini les chapitres. Reste à faire l’index et corriger deux-trois trucs comme les entêtes de pages vers la table des matières, ajouter des labels aux tableaux qui n’en ont pas.

+0 -0

@tamhero 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 !

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.

Bonjour,

J’ai une question, dans le cours sur les boucles, dans le jeu du puissance 3 (voir correction) , vous définissez la variable i dans la boucle for, puis l’appeler ensuite en dehors de la boucle via un if/else (cours : Le langage C : Les boucles). Or sur mon compilateur cela m’indique constamment une erreur me disant i n’est pas défini (i existe juste dans la boucle "for" en faîte). Je dois donc définir i en dehors de ma boucle for pour que le programme fonctionne. Rien de bien méchant mais c’était pour savoir si le souci vient de mon compilateur ? J’ai testé sur d’autres programmes j’ai forcément l’erreur si je tente d’appeler une variable défini dans une boucle for.

Merci d’avance !

Le lien du cours : Cours ZesteSavoir

+2 -0

Effectivement, ici i doit être déclaré hors de la boucle, avant la boucle.
C’est une erreur à corriger.

Merci pour ton retour ^^

+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