Aller au contenu

Langage C/Introduction au C

Leçons de niveau 15
Une page de Wikiversité, la communauté pédagogique libre.
Début de la boite de navigation du chapitre
Introduction au C
Icône de la faculté
Chapitre no 1
Leçon : Langage C
Retour auSommaire
Chap. suiv. :Outils
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « Langage C : Introduction au C
Langage C/Introduction au C
 », n'a pu être restituée correctement ci-dessus.

Esprit et but du tutoriel

[modifier | modifier le wikicode]

Ce tutoriel a été écrit dans un seul but : vous enseigner le langage C de la manière la plus complète, la plus rigoureuse et la plus instructive possible. Pour ce faire, le tutoriel combinera beaucoup de théorie, de connaissances importantes, de détails et de recherches en profondeur avec de la pratique par des exemples concrets, des exercices pratiques et des TP. Cette approche va réclamer de votre part des efforts puisque le tutoriel semblera parfois complexe, néanmoins il est important de passer tout le temps nécessaire à l'assimilation de chaque connaissance abordée. Pour s'assurer d’avoir bien assimilé une notion, il est fortement conseillé de se façonner ses propres programmes tout au long du cours, et ce en plus des exercices proposés au sein de celui-ci, c’est en vous exerçant que vous prendrez conscience de vos faiblesses, et que vous pourrez progresser.

Nous avons choisi cette méthode d’apprentissage, car c’est celle que nous jugeons la plus payante. Elle s’oppose à d'autres méthodes qui privilégient un cours beaucoup plus théorique, qui permettent certes d’acquérir des connaissances rapidement, mais qui s’avère bien souvent peu payante sur le long terme. Beaucoup de programmeurs débutants se sont retrouvés perdus lorsqu’ils se sont lancés dans la création d'un projet pour la première fois à la sortie d’un cours purement théorique, n’ayant pas acquis de bonnes pratiques et de la rigueur. Ce cours illustrera donc chaque notion abordée d'exemples et d'exercices, afin de vous enseigner non seulement un langage de programmation, mais aussi de bonnes méthodes de travail.

En résumé, ce tutoriel se composera d'un juste mélange entre théorie et pratique au travers de multiples exemples et exercices d'application qui nécessiterons une investissement personnel et des efforts pour fortifier chaque connaissance acquise.

À qui est destiné ce tutoriel ?

[modifier | modifier le wikicode]

Le tutoriel a pour intention d’être compréhensible par n’importe qui. Que vous soyez un parfait débutant qui souhaite apprendre la programmation sans aucune connaissance au préalable ou que vous soyez un programmeur expérimenté, vous êtes le bienvenu dans ce cours. Les explications seront les plus détaillées possible afin de rendre la lecture accessible à tous.

Cependant, afin que l'apprentissage de ce langage se passe au mieux, certaines qualités sont tout de même requises.

  • De la motivation : la motivation est primordiale dans l'apprentissage d'un langage de programmation, en effet, la manipulation de ce langage nécessite l'assimilation de nombreuses notions, souvent très théoriques et qui sembleront parfois complexes. Il faut donc être bien motivé pour profiter pleinement de cet apprentissage.
  • De la logique : réaliser un programme nécessite un esprit logique développé, bien sûr, ce tutoriel vous guidera dans votre réflexion tout au long de votre apprentissage, mais il faut néanmoins savoir réfléchir par soi-même et être capable de trouver des solutions inventives pour résoudre chaque problème rencontré. En effet, on ne peux pas se contenter d'apprendre par cœur la syntaxe du langage et de simplement recopier mot pour mot plusieurs morceaux de code trouvés par-ci par-là tout au long du cours. Pour obtenir un programme fonctionnel complet, il est nécessaire de réfléchir préalablement à la structure que vous allez donner à celui-ci, ainsi qu'aux nombreuses décompositions que vous serez contraints d'effectuer.
  • De la patience : vous vous apprêtez à apprendre un langage de programmation, et l'assimilation de nombreuses notions plus ou moins complexes vous sera demandée pour la réalisation de programmes qui auraient pu vous paraître très simples de prime abord. Il va donc falloir de la patience pour apprendre, comprendre, s’entraîner, faire des erreurs et les corriger pour enfin pouvoir réaliser les logiciels de vos rêves.
  • De la rigueur : cette qualité est très importante en programmation. Un travail sérieux et régulier tout au long de l'apprentissage du C est primordial, c’est tout ce qui fera la différence entre un bon et un mauvais programmeur.
  • De la passion : le plus important pour suivre ce tutoriel, c’est de prendre plaisir à programmer. Amusez-vous en codant, c’est le meilleur moyen de progresser !

Je tiens aussi à préciser qu’un niveau acceptable en anglais est très fortement recommandé. En effet, beaucoup de cours, de forums, de documentations et autres seront en anglais. Tôt ou tard, vous serez confronté à l'anglais, il faut vous y préparer. Si vous êtes encore étudiant, cela ne vous sera que bénéfique ! Si vraiment l’anglais n’est vraiment pas votre fort, vous pouvez toujours utiliser un dictionnaire pour vous aider.

Dernier point qui concerne les mathématiques : contrairement à la croyance populaire, un bon niveau en maths n’est absolument pas nécessaire pour faire de la programmation. Certes, ça peut aider en développant la logique, mais si les mathématiques ne sont pas votre fort, vous pourrez quand même suivre ce cours sans problèmes.

Allez plus loin

[modifier | modifier le wikicode]

Un des concepts fondamentaux de l’apprentissage de notions informatiques sur Internet est le croisement des sources. Il permet de voir la programmation sous un angle différent. Par exemple, quelques cours de Developpez ou de Wikibook, d’approches différentes, sont à votre entière disposition. N’hésitez pas non plus à lire des livres sur le C, notamment Le C en 20 heures écrit par Eric Berthomier et Daniel Schang ou encore le K&R, écrit par les créateurs du C. C’est un livre très complet qui pourra vous être utile.

Enfin le plus important : n’hésitez pas à programmer tout seul. Faites des exercices, modifiez les codes du tutoriel, regardez ceux des autres, participez à des projets. C’est la meilleure façon de progresser.

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

[modifier | modifier le wikicode]

La programmation est une branche de l’informatique qui permet la création de programmes. Votre ordinateur est intégralement contrôlé par des programmes, votre système d’exploitation (Windows, GNU/Linux, Mac OS X, ...) est un programme, votre navigateur web (Internet Explorer, Mozilla Firefox, Opera, ...) est un programme, et cela va de même pour votre logiciel de discussion instantanée, vos jeux vidéos, etc. Les programmes ne sont par ailleurs pas seulement contenus uniquement dans votre ordinateur, et de très nombreux appareils contiennent des programmes, comme par exemple votre lecteur MP3, votre console de jeux, etc.

Un programme est constitué d'une séquence d’instructions, d’ordres, donnés à l’ordinateur afin qu’il exécute des actions. Ces instructions sont généralement assez basiques. On trouve ainsi des opérations mathématiques de base, comme l'addition ou la multiplication, qui font de notre ordinateur une véritable machine à calculer. D’autres instructions plus complexes peuvent exister, comme des opérations permettant de comparer des valeurs, traiter des caractères, etc.

Créer un programme, c’est tout simplement assembler une suite d’instructions de base qui permettront de faire ce que l’on veut. Tous les programmes sont créés ainsi : votre système d'exploitation donne toutes les instructions nécessaires à votre ordinateur, votre logiciel de discussion instantanée donne les instructions nécessaires à l'ordinateur pour discuter avec d'autres gens sur le réseau, votre lecteur multimédia donne des instructions à l’ordinateur pour écouter de la musique ou lire des vidéos, etc.

Petite remarque : on ne peut pas créer d’autres instructions que celles déjà mises en place. Notre ordinateur est conçu, câblé, et peut traiter certaines instructions de bases, préconçues dans ses circuits, sans possibilité d’en inventer d’autres (sauf cas particulier vraiment tordus). Notre ordinateur contient un composant électronique spécialement conçu pour effectuer ces instructions : il s’agit du processeur. Ce qu’il faut retenir, c’est que notre ordinateur contient un circuit, le processeur, qui permet d’effectuer de petits traitements de base qu’on appelle instructions et qui sont la base de tout ce qu’on trouve sur un ordinateur, et que c’est en assemblant tous ces petits traitements de manière très précise que l’on peut obtenir des programmes complexes.

Pour les curieux, il existe un cours sur le fonctionnement d'un ordinateur expliqué depuis zéro.

Ces instructions sont stockées dans notre ordinateur sous la forme de bits, de petites données qui valent soit 0, soit 1. Ainsi, nos instructions ne sont rien d’autre que des suites de 0 et de 1, stockées dans notre ordinateur, et que notre processeur va interpréter comme étant des ordres à effectuer. Ces suites de zéros et un forment ce qu'on appelle le langage machine, qui est difficile à comprendre pour un être humain, communiquer avec l'ordinateur uniquement par le biais de ce langage serait très complexe et extrêmement long. Autant vous dire que créer des programmes de cette façon revient à se tirer une balle dans le pied. En effet, pour maîtriser le langage binaire, il faudrait connaître par cœur des suites de 0 et de 1 totalement abstraites.

Cependant, de nombreux outils servent d'intermédiaire entre le langage humain, bien trop complexe pour une machine, et le langage machine, bien trop abstrait pour un humain. Ces nombreux outils sont les langages de programmation, ceux-ci permettent l'écriture de programmes dans un langage bien plus proche des langages humains tel que le français ou l'anglais, mais néanmoins très logique et structuré afin de permettre une compatibilité avec le langage machine. Grâce à ces langages de programmations, il est possible d'écrire nos programmes sous forme de textes et de nombres en base décimale, c'est-à-dire avec des chiffres de 0 à 9. Il existe de très nombreux langages de programmations, le C est un de ces langages.

Malgré le fait que les langages de programmations soient extrêmement logiques et structurés, ils restent très loin du code binaire interprété par notre processeur. Ainsi, pour que celui-ci puisse suivre les instructions que nous avons programmées, il faut aussi avoir une sorte de traducteur qui fera le lien entre votre langage de programmation et le langage machine. Ce traducteur va ainsi traduire le texte écrit dans un langage de programmation évolué en une suite de zéros et d'un que le processeur peut comprendre. Ainsi vous pourrez commander votre processeur sans pour autant connaître le langage machine.

Pour illustrer, ce code écrit en C (que nous apprendrons à connaître) est quand même largement plus facile à comprendre qu’une suite de 0 et de 1.

#include <stdio.h>

int main(void)
{
    printf("Salut !");
    return 0;
}

Pour vous donner une idée de la difficulté de programmer sans l'intermédiaire d'un langage de programmation, voici ce même programme écrit en langage machine (sous format hexadécimal) :

Il ne reste plus qu’à utiliser un interprète qui va traduire ce texte (un programme écrit dans notre langage de programmation) vers la langue de l’ordinateur (des suites de 0 et de 1) : le compilateur. Voici un petit schéma qui résume tout ça :

Schéma simplifié de la compilation d'un programme.
Schéma simplifié de la compilation d'un programme.

Malgré tous ces langages de programmation disponibles, nous allons tout au long de ce cours nous concentrer sur le langage C. Avant d'entamer concrètement la programmation, il me semble important d'évoquer l'histoire de ce langage, ainsi que les caractéristiques et les choix qui nous amènent à l’étudier dans ce cours.

L'histoire du C

[modifier | modifier le wikicode]

Le langage C est né au début des années 1970 dans les laboratoires AT&T aux États-Unis. Son concepteur, Dennis Ritchie, souhaitait améliorer un langage existant, le B, afin de lui adjoindre des nouveautés. En 1973, le C était pratiquement au point, et il commença à être distribué l’année suivante. Son succès était tel auprès des informaticiens que l’ANSI en 1989, puis l’ISO en 1990 décidèrent de le normaliser, c’est-à-dire d’établir les règles officielles du langage. On parle donc de C89 / C ANSI ou bien C90 / C ISO (au choix). D’autres normes sortirent plus tard, en 1999 (on parle de C99) et en 2011 (on parle de C11).

Pourquoi apprendre le C ?

[modifier | modifier le wikicode]

C’est une très bonne question. Après tout, il existe tellement de langages différents, et on peut logiquement se demander pourquoi le C en particulier ? En fait, il y a plusieurs raisons qui peuvent motiver l'apprentissage du C.

  • Sa popularité : il fait partie des langages de programmation les plus utilisés. Il possède une communauté très importante et de nombreux tutoriels et documentations. Vous aurez donc toujours du monde pour vous aider. De plus, il existe beaucoup de programmes et de bibliothèques développés en et pour le C.
  • Sa rapidité : le C est connu pour être un langage très rapide, ce qui en fait un langage de choix pour tout programme où la vitesse d’exécution est cruciale.
  • Sa légèreté : le C est léger, ce qui le rend utile pour les programmes embarqués où la mémoire disponible est faible.
  • Sa portabilité : cela veut dire qu’un programme développé en C marche théoriquement sur n’importe quelle plate-forme. Il faut savoir que le C a été conçu pour la programmation système (pilotes, systèmes d'exploitation, matériel embarqué, etc). Or, les plate-formes étant différentes, il était difficile à l'époque d’avoir un code générique pouvant marcher dans n’importe quel environnement. La volonté des créateurs du C était donc de faire un langage permettant de produire du code portable.

Ce ne sont que quelques arguments parmi tant d'autres, mais se sont à mon goût des raisons plus que suffisantes pour justifier l'apprentissage de ce langage. Bien entendu, le C comporte aussi des défauts. On peut citer la tolérance aux comportements dangereux qui fait que le C demande beaucoup de rigueur pour ne pas tomber dans certains « pièges », le nombre restreint de concepts, qui impose de devoir recoder certains mécanismes qui existent nativement dans d’autres langages, etc. D’ailleurs, si votre but est de développer rapidement des programmes amusants, le C n’est pas du tout adapté à cet usage, et je vous encourage à vous tourner vers d’autres langages tel que le Python.

Le C possède aussi une caractéristique qui peut-être considérée à la fois comme un avantage et comme un défaut : c’est un langage de bas niveau. C'est-à-dire qu’il permet de programmer en étant proche de sa machine, en cherchant à vraiment comprendre ce que l’on fait. C’est à double tranchant : c’est plus difficile et plus long, mais on en apprend beaucoup sur sa machine et on a un grand contrôle sur ce que l’on fait. Cette notion de bas niveau est à opposer aux langages de haut niveau, qui permettent de programmer en faisant abstraction d’un certain nombre de notions primordiales dans le cas d'un langage de bas niveau. Le développement est souvent plus facile et plus rapide, mais en contrepartie on voit moins bien le fonctionnement de la machine. Ces notions de haut et bas niveau sont néanmoins à nuancer, car elles dépendent du langage utilisé et du point de vue du programmeur.

Même si c’est un langage qui ne sera pas abordé au long de ce cours, il me semble important d'évoquer le C++, dont vous avez peut-être déjà entendu parler. C’est un langage de programmation qui a été inventé dans les années 1980 par Bjarne Stroustrup, un collègue de Dennis Ritchie, qui souhaitait rajouter des éléments au C. Bien que très ressemblants à l’époque de sa création, ces deux langages sont aujourd’hui très différents (on ne programme pas et on ne réfléchit pas de la même façon en C qu’en C++). Ne croyez pas qu’il y a un langage meilleur que l’autre. Ils sont simplement différents. Si d’ailleurs votre but est d’apprendre le C++, je vous encourage à le faire directement. Contrairement à ce que l’on pense et dit souvent, il est tout à fait possible d'apprendre le C++ sans passer par l'apprentissage du C.

Comme précisé plus haut, le C est un langage qui possède des règles. Ces règles ont été définies par des informaticiens professionnels et sont toutes regroupées dans ce que l’on appelle la norme du langage. Chaque fois que l’on a un doute ou que l’on se pose une question, le premier réflexe est de regarder dans la norme ce qui est dit. Bien entendu, la norme n’est pas parfaite, elle ne répond pas à toutes les questions que l’on pourrait se poser et ne précise pas tous les détails dont on pourrait avoir besoin. Néanmoins, elle reste la référence de tout programmeur. Cette norme sert aussi de référence pour les compilateurs. En effet, tous les compilateurs respectent cette norme (en règle générale), afin de parer à différentes interprétations d’un même code.

Cette norme est donc comparable aux règles d’orthographe, de grammaire et de conjugaison de la langue française. Si l’on ne suit plus ces règles et que l’on commence à nous exprimer à notre guise, il devient rapidement impossible de nous comprendre. Le résultat sera le même si chacun commence à interpréter différemment tout ce qu’il entend. La norme sert donc à officialiser tout un tas de règles pour que chaque personne souhaitant communiquer (les programmeurs) puisse être parfaitement compris par chaque interprète (les compilateurs).

Il existe plusieurs versions de la norme : le C89, le C99 et le C11. Dans ce cours, nous avons décidé de nous servir de la norme C89. En effet, même si c’est la plus ancienne et qu’elle semble restrictive à certains, elle permet néanmoins de développer avec n’importe quel compilateur sans problèmes, contrairement aux normes C99 et C11 que tous les compilateurs ne connaissent pas. De plus, il est très facile de passer aux normes plus récentes ensuite. Voici le lien vers le brouillon de cette norme, ce n’est certes pas la version définitive et officielle, mais celle-ci est très chère et le brouillon est largement suffisant pour notre niveau et entièrement gratuit. Bien entendu, cette norme est en anglais.

L’algorithmique

[modifier | modifier le wikicode]

L'algorithmique est très liée à la programmation, et elle constitue même une branche à part des mathématiques. Elle consiste à définir et établir des algorithmes.

Un algorithme peut se définir comme étant une suite finie et non-ambiguë d'opérations permettant de résoudre un problème. En clair, il s'agit d'une succession de calculs qui prennent plusieurs paramètres et renvoient un résultat. Les algorithmes ne sont pas limités à l'informatique, ils existaient en effet bien avant son apparition.

L'intérêt principal des algorithmes est qu’ils sont très utiles lorsqu’ils sont en relation avec des ordinateurs. En effet, ces derniers peuvent exécuter plusieurs millions d'instructions à la seconde, et donc effectuer des calculs très complexes extrêmement rapidement. Illustrons : imaginez que vous deviez trier une liste de 10 nombres dans l’ordre croissant. C'est assez facile et faisable en quelques secondes. Et pour plusieurs milliards de nombres ? C'est parfaitement impossible pour un humain, alors qu'un ordinateur s'en occupera sans aucun problème.

Ce qu’il faut retenir, c’est qu'un algorithme est une suite d'opérations destinée à résoudre un problème donné. Nous aurons l’occasion d’utiliser quelques algorithmes dans ce cours, mais nous ne nous concentrerons pas dessus. Si vous voulez en savoir plus, lisez le tutoriel sur l'algorithmique pour l'apprenti programmeur.

Le pseudo-code

[modifier | modifier le wikicode]

Pour représenter un algorithme indépendamment de tout langage, on utilise ce qu'on appelle un pseudo-code. Il s'agit de la description des étapes de l'algorithme avec une structure proche du langage naturel (dans notre cas le français). Voici un exemple de pseudo-code :

Fonction max (x, y)
    
    Si x est supérieur à y
        Retourner x
    Sinon 
        Retourner y

Fin fonction

Durant ce cours, il y aura plusieurs exercices dans lesquels un algorithme fourni devra être implémenté (traduit) en C. Si vous voulez vous y entraîner davantage tout en suivant ce cours, je vous conseille le site France-IOI qui propose des implémentations de divers algorithmes en plusieurs langages dont le C. Ce qui pourra être un excellent complément.