Comment programmer en C

Vous êtes fasciné par le monde de la programmation, et comme vous avez récemment du temps libre pour vous concentrer sur la programmation, vous décidez d'en savoir plus. Suivant les conseils d'amis déjà experts dans le domaine, vous avez choisi le langage C comme point de départ, qui est sans aucun doute l'un des langages C les plus polyvalents et qui est toujours utilisé dans le domaine informatique. Déterminé et déterminé à aller de l'avant, vous avez ouvert votre ami de confiance Google et cherché des instructions sur la façon de programmer en C, vous avez donc trouvé ce guide, dans l'espoir d'obtenir les informations nécessaires sur la façon de commencer à écrire du code du travail. Eh bien, vous serez heureux car c'est exactement là que vous le souhaitez. En fait, dans les lignes suivantes, vous verrez un aperçu du langage C, expliquant tout ce qui est nécessaire pour écrire le premier programme de travail.

Mais avant d'aller plus loin et d'entrer dans le vif du sujet, il faut vous faire part d'une prémisse importante : la programmation en C est un sujet assez vaste, qui n'entre certainement pas complètement dans la page que vous allez lire. Au contraire, vous allez en savoir plus : la structure même de ce site ne suffirait pas pour le traiter en profondeur ! Ne vous inquiétez pas, cependant, car ce guide veillera à vous orienter, dans les dernières lignes, vers des ressources et des points de vue utiles pour enrichir, si vous le souhaitez, vos connaissances sur le sujet. À ce stade, il faut bannir le babillage et de commencer. Alors, bonne lecture et bon appétit !

Informations préliminaires

Avant de commencer à apprendre les concepts de base de la programmation en C, voici quelques informations supplémentaires sur ce langage puissant. Premièrement, C est un langage de programmation impératif, c'est-à-dire qu'il peut traiter des données via des opérations mathématiques et est regroupé en procédures spécifiques définies comme des fonctions (décrites plus loin dans ce guide). C'est un langage de haut niveau, c'est-à-dire que la syntaxe qu'il utilise est similaire au langage humain, mais loin du langage d'assemblage et du langage machine. En d'autres termes, de nombreuses commandes C existantes proviennent de l'anglais.

Contrairement à de nombreux langages de programmation connus jusqu'à présent, le langage C ne nécessite pas l'utilisation d'objets. Chaque structure de données complexe (par exemple, les tableaux, les enregistrements et toute autre entité qui ne représente pas des types de données primitifs) doit être déclarée manuellement et allouée à la mémoire. Cependant, certains «dérivés» de C (tels que C, C # ou Objective-C) ressemblent plus à des langages objet. Comme vous le découvrirez plus loin dans ce guide, C est un langage compilé. Cela signifie que le code source du programme écrit doit être "traduit" en langage machine via un logiciel appelé compilateur, puis il peut être exécuté. Le fichier exécutable peut être traité par le processeur et le matériel de la machine, grâce à la coordination du système d'exploitation.

En général, le langage C est extrêmement flexible et est encore utilisé aujourd'hui dans un grand nombre de scénarios. Par exemple, vous pouvez utiliser le C pour écrire un système d'exploitation entier, programmer des appareils connectés, créer des bibliothèques dédiées aux jeux, effectuer des calculs mathématiques distribués complexes, etc.

Si vous souhaitez mieux comprendre le cycle de vie d'un programme générique et approfondir les "étapes" à suivre pour en rédiger un de manière efficace, il est suggéré de consulter l’analyse approfondie sur la manière de créer un programme.

Syntaxe de base

Alors, prêt à partir ? Parfait ! Dans les sections suivantes, vous allez voir l'explication des concepts de base de la syntaxe du langage C, en vous donnant les notions nécessaires sur les composantes fondamentales du langage C. Ce faisant, vous acquerrez les compétences nécessaires pour rédiger, en toute autonomie, un petit programme de travail.

Tout d'abord, un programme C est écrit à l'aide d'un ou plusieurs fichiers sources, dans lesquels sont spécifiées les instructions à exécuter pour traiter les données de la manière choisie. À moins qu'il n'intervienne par des sauts, des conditions ou des cycles de contrôle spéciaux (abordé plus tard), le C utilise une approche séquentielle. Cela signifie qu'en général, les instructions sont exécutées dans le même ordre que celui dans lequel elles sont spécifiées dans le code source.

Déclaration

L'énoncé est l'entité de base du langage C. En termes simples, il s'agit d'une instruction complète qui traite d'une manière ou d'une autre des données. Une déclaration en C se termine toujours par un ; (point-virgule) et peut effectuer tout type d'opération. Elle peut ajouter deux nombres, comparer deux chaînes de caractères, appeler une fonction, déclarer ou attribuer une valeur à une variable et bien plus encore. En d'autres termes, chaque déclaration contient une "commande" de manipulation de données. Par convention, chaque déclaration en C doit résider sur une ligne de code source différente.

Pour vous donner un exemple, la déclaration printf ("Bonjour tout le monde !") ; elle contient la commande d'impression de la phrase "Bonjour tout le monde" à l'écran.

La directive #inclut

Comme il a déjà été dit, un programme C peut fonctionner sur différents fichiers sources. Cela arrive, d'une manière particulière, pour maintenir un certain ordre dans les très gros projets. Tout taper dans un seul fichier de dizaines de milliers de lignes de code pourrait rendre fou même le plus patient des programmeurs. Ce serait un exploit que de modifier une seule instruction !

Selon ce critère, le C fournit une directive spéciale, ce #include, qui est spécifié au début de chaque code source et communique au compilateur les autres fichiers à "inclure" dans le programme en cours de compilation. Pour vous donner un exemple, presque tous les programmes écrits en C commencent par la directive #include.

De cette façon, il est possible d'utiliser toutes les commandes C spécifiées dans la bibliothèque dite standard d'entrées/sorties, résidant dans le chemin d'installation du compilateur lui-même.

La bibliothèque stdio.h contient les définitions des commandes de base et des constantes, pour permettre au programmeur de manipuler les entrées/sorties (c'est-à-dire ce que vous voyez à l'écran, ce que vous acquérez par le clavier et la souris) et la gestion des fichiers. Vous trouverez ci-dessous une liste des plus utilisés.

Avec stdio.h, la bibliothèque stdlib.h, également incluse dans l'environnement de développement C, est souvent incluse dans le code source. Elle contient des fonctions générales et des constantes, y compris des instructions d'utilisation pour allouer la mémoire et manipuler les données qu'elle contient.

La directive include peut être spécifiée de deux façons : #include indique l'inclusion d'une bibliothèque présente dans l'environnement de développement par défaut, tandis que #include "library.h" indique l'inclusion d'une bibliothèque écrite par le programmeur et présente dans le même répertoire que le fichier source dans lequel elle est déclarée.

Types de données

Comme déjà expliqué, le C n'est pas un langage objet, de sorte que les structures de données les plus complexes doivent être déclarées et structurées en mémoire manuellement. Cela n'enlève cependant rien au fait que ce langage est capable de gérer et de manipuler nativement de nombreux types de données élémentaires, qui peuvent être affectées aux variables nécessaires au fonctionnement du programme, acquises comme valeurs d'entrée ou rendues comme valeurs de retour de fonction. Vous trouverez ci-dessous une liste des types de données les plus couramment utilisés et les informations nécessaires sur chacun d'entre eux.

Définition des variables

C’est sûr que, d'une manière ou d'une autre, vous connaissez déjà le concept de variable. Si vous voulez le formaliser, une variable est juste un "conteneur", situé en mémoire, qui doit contenir des valeurs pouvant être modifiées pendant le déroulement de l'exécution d'un programme.

Avant de poursuivre, il faut préciser la différence entre la déclaration d'une variable et sa définition ou son affectation. Dans le premier cas, vous informez le compilateur que vous devez allouer une partie de la mémoire pour contenir les données ; dans le second cas, vous remplissez la mémoire avec les données requises. Il est possible de déclarer une ou plusieurs variables sans les définir, mais il n'est pas possible de définir une ou plusieurs variables sans les déclarer (le compilateur, dans ce cas, ne saurait pas où placer les données en mémoire).

Déclarer une variable en C est très simple : il suffit de taper une déclaration précisant le type de données que la variable doit contenir, son nom et, si nécessaire, la valeur initiale (spécifiée avec l'opérateur d'affectation =). Par exemple, vous pouvez déclarer une variable entière vide par le biais de l'instruction variable int ; ou lui attribuer la valeur initiale de 10 en donnant à la place la variable int = 10.

Une fois qu'une variable a été déclarée, il est possible de la manipuler dans les parties suivantes du code en utilisant l'affectation avec l'opérateur = (par exemple variable=51 ;), les opérateurs d'incrémentation et de décrémentation et tout ce qui est requis par le type de données spécifié. Gardez toujours à l'esprit que, pour être utilisée, une variable doit nécessairement être déclarée dans une partie précédente du code : le C, comme déjà expliqué, est un langage séquentiel, on ne peut donc pas demander à une déclaration d'opérer sur une donnée qu'elle ne connaît pas !

Habituellement, en C, vous pouvez faire référence aux variables de deux manières différentes. Pour les opérations d'affectation via l'opérateur = ou les fonctions de manipulation de sortie (par exemple printf()), vous utilisez simplement son nom (par exemple printf("%i", variable) ; ou sum = add(a,b) ;). Si, en revanche, vous devez écrire des données dans une variable en utilisant certaines fonctions de manipulation d'entrée, comme la fonction scanf() par exemple, vous devez y faire référence par un pointeur vers le contenu de la mémoire : pour ce faire, il suffit de préfixer le nom de la variable avec le caractère

Principaux opérateurs

Comme tous les langages de programmation existant dans le monde, la programmation en C nécessite également l'utilisation d'opérateurs, c'est-à-dire de certains caractères qui, dans une déclaration, peuvent acquérir un sens "spécial", combinant ainsi les données de la déclaration elle-même. Le langage C fournit un grand nombre d'opérateurs pour la gestion des cas les plus disparates : le plus important est l'opérateur d'affectation, c'est-à-dire =, qui permet d'attribuer une valeur (ou une expression plus ou moins complexe) à une variable ou une série de variables. Par exemple, tapez la déclaration int a = 1 2 3 4 ; cela signifie qu'il faut déclarer une variable entière a et lui attribuer la valeur initiale de 10.

Outre l'opérateur d'affectation, il existe de nombreux autres opérateurs dans la catégorie C : ils sont divisés en quatre catégories distinctes, que vous allez voir ci-dessous.

Contrôles conditionnels

Comme déjà expliqué au début, le C est un langage séquentiel, c'est-à-dire qu'il peut exécuter des instructions dans l'ordre où elles apparaissent dans le code source du programme. Cependant, il existe des directives qui permettent de modifier le déroulement de l'exécution du programme, en modifiant son ordre lorsque certaines conditions se produisent/ne se produisent pas. Ces directives prennent l'ordre des contrôles conditionnels. Dans les lignes qui suivent, vous allez voir les plus utilisées.

Si/autre

Si vous mâchez un peu d'anglais, il vous sera facile de comprendre le contrôle conditionnel si : donner cette instruction signifie, en fait, communiquer au programme quelque chose de similaire à "si une condition spécifique se produit, alors suivez cette (ces) instruction(s)". Synthétiquement, le chèque est présenté sous la forme

Si vous le souhaitez, vous pouvez spécifier une condition supplémentaire en utilisant la clause if : combinée avec la clause if, elle vous permet d'abstraire le concept "si une condition spécifique se produit, alors suivez ces instructions, sinon (sinon) suivez ces autres)".

Vous pouvez exprimer la condition en utilisant les opérateurs qui renvoient les résultats vrai/faux, c'est-à-dire les résultats logiques et relationnels. Pour vous donner un exemple concret, voici une partie de code qui peut déterminer la valeur maximale entre deux variables en l'imprimant à l'écran.

Si nécessaire, vous pouvez "enrichir" la construction vue ci-dessus avec l'autre clause if : syntaxiquement similaire à if, elle vous permet de spécifier des conditions spécifiques supplémentaires à prendre en compte, comme expliqué ci-dessous.

Interrupteur/boîtier

La construction du commutateur/boîtier, tout comme celle vue ci-dessus, peut affecter l'exécution séquentielle des instructions dans le code source d'un programme. Bien que son fonctionnement soit similaire à celui du if/else (c'est-à-dire "sauter" à un ensemble d'instructions donné lorsque certaines conditions se présentent), il est utilisé dans des scénarios tout à fait différents. Le switch/case, en effet, convient aux décisions dépendant de la valeur d'une variable et non à une opération booléenne. En langage humain, on peut le comprendre un peu comme "passer à la casse (case) X si la variable à analyser (switch) prend la valeur X, sinon effectuer l'opération par défaut".

Par exemple, il est possible d'utiliser l'interrupteur/le boîtier dans le cas de la gestion des entrées. Par exemple, le programme se comporte lorsque la touche a est enfoncée, une autre lorsque la touche b est enfoncée, une autre encore lorsque la touche c est enfoncée, et ainsi de suite. Synthétiquement, ce contrôle conditionnel s'exprime comme suit.

A la fin de chaque série d'instructions pour le traitement des différents cas, il est essentiel de spécifier la clause de rupture pour sortir du cycle d'exécution et de ne pas bloquer le programme dans une boucle infinie, c'est-à-dire dans une condition dont il ne peut pas sortir.

Par exemple, cet extrait de code pourrait être utilisé pour un programme qui offre plusieurs fonctions en même temps, variant selon l'entrée au clavier (dans ce cas, l'utilisateur est invité à taper les lettres a ou c pour choisir la fonctionnalité souhaitée).

Opérateurs ternaires

Une autre forme de la condition "si/autre" implique l'utilisation d'opérateurs ternaires ? et :. Celles-ci permettent en effet de "raccourcir" la syntaxe de la condition ci-dessus, et sont particulièrement utilisées si vous devez donner deux instructions différentes en fonction du résultat (vrai ou faux) de l'expression booléenne de comparaison.

Par exemple, si vous souhaitez comparer deux variables et informer l'utilisateur du résultat, vous pouvez utiliser le code suivant.

Fonctions

Maintenant que vous avez bien compris les parties fondamentales du langage C, il est temps de les rassembler pour créer quelque chose qui fonctionne. Mais avant cela, il est bon d'aborder le concept de fonction. Par définition, une fonction en C est une partie de code qui exécute l'algorithme nécessaire pour obtenir le résultat souhaité.

En d'autres termes, la fonction est l'ensemble des déclarations permettant de manipuler les données d'entrée et de produire des données de sortie conformes aux besoins du programmeur. En C, les fonctions peuvent être à la fois déclarées et définies. Dans le premier cas, vous "avertissez" le compilateur des données entrantes, des données de sortie et du nom de la fonction elle-même (par exemple int a, int b) ;), afin de lui permettre de préparer les différentes zones de mémoire, tandis que dans le second cas, vous spécifiez les déclarations nécessaires au traitement des données, comme le montre l'exemple ci-dessous.

La valeur que la fonction doit retourner est exprimée par la clause de retour, spécifiée juste avant la fin du code de la fonction ; en outre, toutes les déclarations qui en font partie doivent être incluses entre deux parenthèses. Après avoir été déclarée et définie, la fonction peut être utilisée dans toute autre partie du code source, en spécifiant les valeurs d'entrée, le cas échéant, et, si nécessaire, en attribuant la valeur de sortie à une variable. Dans le code suivant, la valeur de la variable somme est fixée à 9.

En général, les fonctions sont déclarées avant le corps du principal (abordé tout à l'heure) et définies immédiatement après. Une fonction déclarée peut être incluse dans le code qui précède sa définition mais elle doit obligatoirement être définie dans le code source où elle est appelée, sinon une erreur sera générée lors de l'exécution du programme (qui, au contraire, sera compilé sans problème).

La fonction principale "spéciale"()

Maintenant que vous disposez de toutes les bases de ce langage, il est temps de vous expliquer comment fonctionne une fonction assez spéciale, celle à partir de laquelle commence l'exécution de tout code source C : la fonction main(). Il représente le principal flux d'exécution d'un code source et contient toutes les instructions nécessaires au traitement des données requises par le programmeur. En d'autres termes, la fonction main() est le "moteur" d'un programme C, qui permet d'exécuter l'algorithme principal conçu par le programmeur lui-même.

A l'intérieur de celui-ci, des variables et des expressions conditionnelles de toute sorte peuvent être utilisées, des fonctions appartenant aux bibliothèques spécifiées par la clause #include, des fonctions déclarées et définies dans le même corps du code source, etc. Une fonction principale ne doit pas être déclarée, mais doit être définie directement dans le code (cela se fait généralement après la déclaration des variables et fonctions "globales", c'est-à-dire des fonctions qui peuvent être utilisées par toutes les fonctions sources, et avant leur définition).

À ce stade, il est absolument facile de deviner qu'un code source C, pour être exécuté, doit contenir une seule et unique fonction main(). En général, la fonction principale renvoie une valeur entière (qui est généralement utilisée pour traiter les erreurs d'exécution) et ne prend pas de valeurs d'entrée.

Exemple d'un code de travail

Maintenant que vous connaissez toutes les informations de base sur cette langue fascinante, vous devriez être parfaitement capable de les rassembler et de rédiger un petit programme de travail. Le premier exemple à vous montrer est le classique "Hello World", c'est-à-dire un programme qui se contente d'imprimer à l'écran la salutation "Hello, world !". Voici ci-dessous le code source de HelloWorld.c, qui sera ensuite compilé pour devenir un fichier prêt à l'emploi.

Avez-vous été en mesure de comprendre pleinement le code illustré ci-dessus ? C'est génial ! Ensuite, comme preuve supplémentaire, voici un second code source (pour appeler, par exemple, calc.c), légèrement plus complexe, qui simule le comportement d'une calculatrice très basique.

La fonction principale consiste à collecter les données et à les transmettre à l'une des quatre fonctions conçues pour effectuer les principales opérations (addition, soustraction, multiplication et division). Enfin, la fonction principale montrera toujours le résultat final.

C’est probable que vous avez réussi à comprendre parfaitement le fonctionnement de ce programme, mais avez-vous peur de ne pas pouvoir écrire quelque chose comme ça ? Ne jetez pas l'éponge et continuez à vous entraîner : c’est sûr que d'ici quelques heures, vous serez capable d'écrire un programme qui fonctionne !

Comment compiler et exécuter un programme en C

Après avoir acquis les bases du langage C, et après avoir examiné un prototype de programme fonctionnel, le temps est venu de passer à la pratique et de comprendre comment compiler et exécuter un programme C en utilisant les différents systèmes d'exploitation. Il est annoncé dès le départ que, contrairement à Windows (qui a besoin de logiciels supplémentaires), MacOS et Linux sont nativement "prédisposés" à compiler des codes sources C : il suffit de connaître les bonnes instructions à donner !

Windows

Comme déjà dit, pour transformer un code source C en un programme de travail, il faut installer un composant supplémentaire pour préparer le système d'exploitation à cette opération : il s’agit de Visual Studio Community.

Pour ce faire, connectez-vous à la page Internet du programme, appuyez sur le bouton Free Download situé dans le panneau Visual Studio Community, lancez le fichier téléchargé (par exemple Community.exe), puis appuyez sur le bouton Continue, cochez la case située à côté de l'élément Desktop Application Development avec C dans la fenêtre proposée, répétez l'opération avec l'élément Support C /Cli situé dans le panneau de droite et, pour terminer, cliquez sur le bouton Install, puis fermez la fenêtre d'installation à la fin de la procédure.

À ce stade, appelez le Bloc-notes à partir du dossier Accessoires Windows dans le menu Démarrer (accessible en cliquant sur le bouton du drapeau dans le coin inférieur gauche de l'écran), tapez le code de votre programme dans la fenêtre de l'éditeur et, pour l'enregistrer, cliquez sur le menu Fichier dans le coin supérieur gauche et sélectionnez Enregistrer sous..... Ensuite, sélectionnez Tous les fichiers dans le menu déroulant Enregistrer sous, joint à l'écran d'enregistrement qui s'ouvre, saisissez le nom de votre programme, suivi de l'extension .c (par exemple calc.c), dans la zone Nom du fichier, puis enregistrez-le sur le bureau.

Pour compiler le code source qui vient d'être créé, lancez une invite de commandes pour les développeurs en l'appelant depuis le dossier Visual Studio dans le menu Démarrer, tapez-y les commandes cd %USERPROFILE%\Desktop et cl nomeProgram.c, toutes deux suivies du bouton Entrée, puis lancez le programme nouvellement créé sur le bureau (par exemple calc.exe) en double-cliquant dessus.

macOS/Linux

Comme expliqué précédemment, macOS et Linux sont nativement préparés pour compiler des programmes écrits en C, car ces systèmes d'exploitation sont fortement basés sur ce dernier. Ainsi, pour compiler et exécuter un programme en C, appelez le Terminal depuis le Launchpad de macOS ou depuis la vue principale des tâches/menus de la distribution Linux que vous utilisez, tapez le cd ~/Desktop (si vous êtes sous macOS) ou cd ~/Screenboard (si vous utilisez Linux à la place) suivi de la touche Entrée et, à nouveau, de la commande tactile nomeprogram.c (par exemple calc.c), toujours suivie de la touche Entrée.

A ce stade, en laissant le Terminal ouvert (vous pouvez le réduire si vous le souhaitez), double-cliquez sur le fichier .c ainsi créé sur le Bureau, tapez le code de votre programme C et enregistrez le fichier. Pour le compiler, appelez le terminal et tapez la commande gcc nomeprogram.c -o nomeprogram, puis appuyez sur la touche Entrée et, pour l'exécuter, donnez la commande ./nomeprogram, en appuyant toujours ensuite sur la touche Entrée.

Il vous est conseillé de lire attentivement les messages d'avertissement renvoyés par le compilateur. Ils constituent, dans la plupart des cas, un bon point de départ pour localiser et corriger les erreurs éventuelles de votre programme.

Ressources utiles

Maintenant que vous avez toutes les bases du dossier et que vous avez une idée claire de la façon de programmer en C, vous êtes parfaitement capable d'évaluer si ce langage de programmation vous convient. Si tel est le cas, comme promis au début de ce tutoriel, vous allez être orienté vers d'autres ressources utiles qui peuvent vous aider à améliorer votre approche de la langue en question, ainsi qu'à accroître vos connaissances et vous aider à acquérir d'autres compétences spécifiques à cet égard.