# Langage C/Introduction au C
## Avant-propos
### Esprit et but du tutoriel

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 ?

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

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 ?

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.
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) :
0000020 000002 000003 000001 000000 101440 004004 000064 000000 0000040 010574 000000 000000 000000 000064 000040 000011 000050 0000060 000036 000033 000006 000000 000064 000000 100064 004004 0000100 100064 004004 000440 000000 000440 000000 000005 000000 0000120 000004 000000 000003 000000 000524 000000 100524 004004 0000140 100524 004004 000023 000000 000023 000000 000004 000000 0000160 000001 000000 000001 000000 000000 000000 100000 004004 0000200 100000 004004 002664 000000 002664 000000 000005 000000 0000220 010000 000000 000001 000000 007410 000000 117410 004004 0000240 117410 004004 000430 000000 000434 000000 000006 000000 0000260 010000 000000 000002 000000 007424 000000 117424 004004 0000300 117424 004004 000350 000000 000350 000000 000006 000000 0000320 000004 000000 000004 000000 000550 000000 100550 004004 0000340 100550 004004 000104 000000 000104 000000 000004 000000 0000360 000004 000000 162520 062164 002330 000000 102330 004004 0000400 102330 004004 000054 000000 000054 000000 000004 000000 0000420 000004 000000 162521 062164 000000 000000 000000 000000 0000440 000000 000000 000000 000000 000000 000000 000006 000000 0000460 000020 000000 162522 062164 007410 000000 117410 004004 0000500 117410 004004 000370 000000 000370 000000 000004 000000 0000520 000001 000000 066057 061151 066057 026544 064554 072556 0000540 027170 067563 031056 000000 000004 000000 000020 000000 0000560 000001 000000 047107 000125 000000 000000 000002 000000 0000600 000006 000000 000030 000000 000004 000000 000024 000000 0000620 000003 000000 047107 000125 021435 024626 046372 044653 0000640 016467 030042 143463 045430 132143 037363 000002 000000 0000660 000004 000000 000001 000000 000005 000000 020000 020000 0000700 000000 000000 000004 000000 045655 140343 000000 000000 0000720 000000 000000 000000 000000 000000 000000 000032 000000 0000740 000000 000000 000000 000000 000022 000000 000063 000000 0000760 000000 000000 000000 000000 000040 000000 000041 000000 0001000 000000 000000 000000 000000 000022 000000 000013 000000 0001020 102314 004004 000004 000000 000021 000017 066000 061151 0001040 027143 067563 033056 057400 047511 071537 062164 067151 0001060 072537 062563 000144 071160 067151 063164 057400 066137 0001100 061151 057543 072163 071141 057564 060555 067151 057400 0001120 063537 067555 057556 072163 071141 057564 000137 046107 0001140 041111 057503 027062 000060 000000 000002 000000 000002 0001160 000001 000000 000001 000001 000001 000000 000020 000000 0001200 000000 000000 064420 006551 000000 000002 000102 000000 0001220 000000 000000 117774 004004 001006 000000 120014 004004 0001240 000407 000000 120020 004004 001007 000000 120024 004004 0001260 001407 000000 101523 004354 111750 000000 100400 041703 0001300 000035 105400 176203 177777 102777 072300 164005 000056 0001320 000000 142203 055410 000303 000000 000000 000000 000000 0001340 032777 120004 004004 022777 120010 004004 000000 000000 0001360 022777 120014 004004 000150 000000 164400 177740 177777 0001400 022777 120020 004004 004150 000000 164400 177720 177777 0001420 022777 120024 004004 010150 000000 164400 177700 177777 0001440 166461 104536 101741 170344 052120 064122 102260 004004 0001460 040150 002204 050410 064126 102035 004004 147750 177777 0001500 172377 110146 110146 110146 110146 110146 110146 110146 0001520 016213 141444 110146 110146 110146 110146 110146 110146 0001540 021670 002240 026410 120040 004004 174203 073406 141401 0001560 000270 000000 102400 072300 052766 162611 166203 143430 0001600 022004 120040 004004 150377 141711 133215 000000 000000 0001620 020270 002240 026410 120040 004004 174301 104402 140702 0001640 017752 150001 174321 000565 135303 000000 000000 151205 0001660 173164 104525 101745 014354 042211 002044 002307 020044 0001700 002240 177410 144722 104703 106766 023674 000000 000000 0001720 036600 120040 004004 072400 052423 162611 166203 164010 0001740 177574 177777 002706 120040 004004 144401 141763 110146 0001760 010241 002237 102410 072300 134037 000000 000000 140205 0002000 013164 104525 101745 014354 002307 010044 002237 177410 0002020 144720 074751 177777 110377 071751 177777 052777 162611 0002040 162203 101760 010354 002307 150044 002204 164010 177276 0002060 177777 000270 000000 144400 063303 063220 063220 110220 0002100 053525 177461 051526 002750 177777 100777 132703 000033 0002120 101400 016354 066213 030044 131615 177414 177777 050750 0002140 177776 106777 004203 177777 024777 140706 001376 173205 0002160 023564 133215 000000 000000 042213 034044 026211 104444 0002200 022104 105410 022104 104464 022104 177404 135624 177410 0002220 177777 143603 034401 072767 101737 016304 057133 056537 0002240 165703 110015 110220 110220 110220 110220 110220 110220 0002260 141763 000000 101523 004354 111750 177776 100777 041703 0002300 000033 101400 004304 141533 000003 000000 000001 000002 0002320 060523 072554 020164 000041 015401 035403 000050 000000 0002340 000004 000000 177010 177777 000104 000000 177505 177777 0002360 000150 000000 177550 177777 000210 000000 177730 177777 0002400 000304 000000 000024 000000 000000 000000 075001 000122 0002420 076001 000410 006033 002004 000610 000000 000040 000000 0002440 000034 000000 176674 177777 000100 000000 007000 043010 0002460 006016 007512 072013 074004 037400 035432 031052 021044 0002500 000034 000000 000100 000000 177325 177777 000034 000000 0002520 040400 004016 001205 006502 054005 006305 002004 000000 0002540 000070 000000 000140 000000 177330 177777 000141 000000 0002560 040400 004016 001205 007101 103414 041403 010016 002206 0002600 007101 101424 047005 030016 044002 012016 141501 010016 0002620 143101 006016 143501 004016 142501 002016 000020 000000 0002640 000234 000000 177414 177777 000002 000000 000000 000000 0002660 000000 000000 000000 000000 000000 000000 000000 000000 0002700 000000 000000 000000 000000 000000 000000 000000 000000 0002720 000000 000000 000000 000000 000000 000000 000000 000000 0002740 000000 000000 000000 000000 000000 000000 000000 000000 0002760 000000 000000 000000 000000 000000 000000 000000 000000 0003000 000000 000000 000000 000000 000000 000000 000000 000000 0003020 000000 000000 000000 000000 000000 000000 000000 000000 0003040 000000 000000 000000 000000 000000 000000 000000 000000 0003060 000000 000000 000000 000000 000000 000000 000000 000000 0003100 000000 000000 000000 000000 000000 000000 000000 000000 0003120 000000 000000 000000 000000 000000 000000 000000 000000 0003140 000000 000000 000000 000000 000000 000000 000000 000000 0003160 000000 000000 000000 000000 000000 000000 000000 000000 0003200 000000 000000 000000 000000 000000 000000 000000 000000 0003220 000000 000000 000000 000000 000000 000000 000000 000000 0003240 000000 000000 000000 000000 000000 000000 000000 000000 0003260 000000 000000 000000 000000 000000 000000 000000 000000 0003300 000000 000000 000000 000000 000000 000000 000000 000000 0003320 000000 000000 000000 000000 000000 000000 000000 000000 0003340 000000 000000 000000 000000 000000 000000 000000 000000 0003360 000000 000000 000000 000000 000000 000000 000000 000000 0003400 000000 000000 000000 000000 000000 000000 000000 000000 0003420 000000 000000 000000 000000 000000 000000 000000 000000 0003440 000000 000000 000000 000000 000000 000000 000000 000000 0003460 000000 000000 000000 000000 000000 000000 000000 000000 0003500 000000 000000 000000 000000 000000 000000 000000 000000 0003520 000000 000000 000000 000000 000000 000000 000000 000000 0003540 000000 000000 000000 000000 000000 000000 000000 000000 0003560 000000 000000 000000 000000 000000 000000 000000 000000 0003600 000000 000000 000000 000000 000000 000000 000000 000000 0003620 000000 000000 000000 000000 000000 000000 000000 000000 0003640 000000 000000 000000 000000 000000 000000 000000 000000 0003660 000000 000000 000000 000000 000000 000000 000000 000000 0003700 000000 000000 000000 000000 000000 000000 000000 000000 0003720 000000 000000 000000 000000 000000 000000 000000 000000 0003740 000000 000000 000000 000000 000000 000000 000000 000000 0003760 000000 000000 000000 000000 000000 000000 000000 000000 0004000 000000 000000 000000 000000 000000 000000 000000 000000 0004020 000000 000000 000000 000000 000000 000000 000000 000000 0004040 000000 000000 000000 000000 000000 000000 000000 000000 0004060 000000 000000 000000 000000 000000 000000 000000 000000 0004100 000000 000000 000000 000000 000000 000000 000000 000000 0004120 000000 000000 000000 000000 000000 000000 000000 000000 0004140 000000 000000 000000 000000 000000 000000 000000 000000 0004160 000000 000000 000000 000000 000000 000000 000000 000000 0004200 000000 000000 000000 000000 000000 000000 000000 000000 0004220 000000 000000 000000 000000 000000 000000 000000 000000 0004240 000000 000000 000000 000000 000000 000000 000000 000000 0004260 000000 000000 000000 000000 000000 000000 000000 000000 0004300 000000 000000 000000 000000 000000 000000 000000 000000 0004320 000000 000000 000000 000000 000000 000000 000000 000000 0004340 000000 000000 000000 000000 000000 000000 000000 000000 0004360 000000 000000 000000 000000 000000 000000 000000 000000 0004400 000000 000000 000000 000000 000000 000000 000000 000000 0004420 000000 000000 000000 000000 000000 000000 000000 000000 0004440 000000 000000 000000 000000 000000 000000 000000 000000 0004460 000000 000000 000000 000000 000000 000000 000000 000000 0004500 000000 000000 000000 000000 000000 000000 000000 000000 0004520 000000 000000 000000 000000 000000 000000 000000 000000 0004540 000000 000000 000000 000000 000000 000000 000000 000000 0004560 000000 000000 000000 000000 000000 000000 000000 000000 0004600 000000 000000 000000 000000 000000 000000 000000 000000 0004620 000000 000000 000000 000000 000000 000000 000000 000000 0004640 000000 000000 000000 000000 000000 000000 000000 000000 0004660 000000 000000 000000 000000 000000 000000 000000 000000 0004700 000000 000000 000000 000000 000000 000000 000000 000000 0004720 000000 000000 000000 000000 000000 000000 000000 000000 0004740 000000 000000 000000 000000 000000 000000 000000 000000 0004760 000000 000000 000000 000000 000000 000000 000000 000000 0005000 000000 000000 000000 000000 000000 000000 000000 000000 0005020 000000 000000 000000 000000 000000 000000 000000 000000 0005040 000000 000000 000000 000000 000000 000000 000000 000000 0005060 000000 000000 000000 000000 000000 000000 000000 000000 0005100 000000 000000 000000 000000 000000 000000 000000 000000 0005120 000000 000000 000000 000000 000000 000000 000000 000000 0005140 000000 000000 000000 000000 000000 000000 000000 000000 0005160 000000 000000 000000 000000 000000 000000 000000 000000 0005200 000000 000000 000000 000000 000000 000000 000000 000000 0005220 000000 000000 000000 000000 000000 000000 000000 000000 0005240 000000 000000 000000 000000 000000 000000 000000 000000 0005260 000000 000000 000000 000000 000000 000000 000000 000000 0005300 000000 000000 000000 000000 000000 000000 000000 000000 0005320 000000 000000 000000 000000 000000 000000 000000 000000 0005340 000000 000000 000000 000000 000000 000000 000000 000000 0005360 000000 000000 000000 000000 000000 000000 000000 000000 0005400 000000 000000 000000 000000 000000 000000 000000 000000 0005420 000000 000000 000000 000000 000000 000000 000000 000000 0005440 000000 000000 000000 000000 000000 000000 000000 000000 0005460 000000 000000 000000 000000 000000 000000 000000 000000 0005500 000000 000000 000000 000000 000000 000000 000000 000000 0005520 000000 000000 000000 000000 000000 000000 000000 000000 0005540 000000 000000 000000 000000 000000 000000 000000 000000 0005560 000000 000000 000000 000000 000000 000000 000000 000000 0005600 000000 000000 000000 000000 000000 000000 000000 000000 0005620 000000 000000 000000 000000 000000 000000 000000 000000 0005640 000000 000000 000000 000000 000000 000000 000000 000000 0005660 000000 000000 000000 000000 000000 000000 000000 000000 0005700 000000 000000 000000 000000 000000 000000 000000 000000 0005720 000000 000000 000000 000000 000000 000000 000000 000000 0005740 000000 000000 000000 000000 000000 000000 000000 000000 0005760 000000 000000 000000 000000 000000 000000 000000 000000 0006000 000000 000000 000000 000000 000000 000000 000000 000000 0006020 000000 000000 000000 000000 000000 000000 000000 000000 0006040 000000 000000 000000 000000 000000 000000 000000 000000 0006060 000000 000000 000000 000000 000000 000000 000000 000000 0006100 000000 000000 000000 000000 000000 000000 000000 000000 0006120 000000 000000 000000 000000 000000 000000 000000 000000 0006140 000000 000000 000000 000000 000000 000000 000000 000000 0006160 000000 000000 000000 000000 000000 000000 000000 000000 0006200 000000 000000 000000 000000 000000 000000 000000 000000 0006220 000000 000000 000000 000000 000000 000000 000000 000000 0006240 000000 000000 000000 000000 000000 000000 000000 000000 0006260 000000 000000 000000 000000 000000 000000 000000 000000 0006300 000000 000000 000000 000000 000000 000000 000000 000000 0006320 000000 000000 000000 000000 000000 000000 000000 000000 0006340 000000 000000 000000 000000 000000 000000 000000 000000 0006360 000000 000000 000000 000000 000000 000000 000000 000000 0006400 000000 000000 000000 000000 000000 000000 000000 000000 0006420 000000 000000 000000 000000 000000 000000 000000 000000 0006440 000000 000000 000000 000000 000000 000000 000000 000000 0006460 000000 000000 000000 000000 000000 000000 000000 000000 0006500 000000 000000 000000 000000 000000 000000 000000 000000 0006520 000000 000000 000000 000000 000000 000000 000000 000000 0006540 000000 000000 000000 000000 000000 000000 000000 000000 0006560 000000 000000 000000 000000 000000 000000 000000 000000 0006600 000000 000000 000000 000000 000000 000000 000000 000000 0006620 000000 000000 000000 000000 000000 000000 000000 000000 0006640 000000 000000 000000 000000 000000 000000 000000 000000 0006660 000000 000000 000000 000000 000000 000000 000000 000000 0006700 000000 000000 000000 000000 000000 000000 000000 000000 0006720 000000 000000 000000 000000 000000 000000 000000 000000 0006740 000000 000000 000000 000000 000000 000000 000000 000000 0006760 000000 000000 000000 000000 000000 000000 000000 000000 0007000 000000 000000 000000 000000 000000 000000 000000 000000 0007020 000000 000000 000000 000000 000000 000000 000000 000000 0007040 000000 000000 000000 000000 000000 000000 000000 000000 0007060 000000 000000 000000 000000 000000 000000 000000 000000 0007100 000000 000000 000000 000000 000000 000000 000000 000000 0007120 000000 000000 000000 000000 000000 000000 000000 000000 0007140 000000 000000 000000 000000 000000 000000 000000 000000 0007160 000000 000000 000000 000000 000000 000000 000000 000000 0007200 000000 000000 000000 000000 000000 000000 000000 000000 0007220 000000 000000 000000 000000 000000 000000 000000 000000 0007240 000000 000000 000000 000000 000000 000000 000000 000000 0007260 000000 000000 000000 000000 000000 000000 000000 000000 0007300 000000 000000 000000 000000 000000 000000 000000 000000 0007320 000000 000000 000000 000000 000000 000000 000000 000000 0007340 000000 000000 000000 000000 000000 000000 000000 000000 0007360 000000 000000 000000 000000 000000 000000 000000 000000 0007400 000000 000000 000000 000000 101760 004004 101720 004004 0007420 000000 000000 000001 000000 000001 000000 000014 000000 0007440 101264 004004 000015 000000 102264 004004 000031 000000 0007460 117410 004004 000033 000000 000004 000000 000032 000000 0007500 117414 004004 000034 000000 000004 000000 177365 067777 0007520 100654 004004 000005 000000 101034 004004 000006 000000 0007540 100714 004004 000012 000000 000114 000000 000013 000000 0007560 000020 000000 000025 000000 000000 000000 000003 000000 0007600 120000 004004 000002 000000 000030 000000 000024 000000 0007620 000021 000000 000027 000000 101234 004004 000021 000000 0007640 101224 004004 000022 000000 000010 000000 000023 000000 0007660 000010 000000 177776 067777 101164 004004 177777 067777 0007700 000001 000000 177760 067777 101150 004004 000000 000000 0007720 000000 000000 000000 000000 000000 000000 000000 000000 0007740 000000 000000 000000 000000 000000 000000 000000 000000 0007760 000000 000000 000000 000000 000000 000000 000000 000000 0010000 117424 004004 000000 000000 000000 000000 101366 004004 0010020 101406 004004 101426 004004 000000 000000 000000 000000 0010040 041507 035103 024040 061125 067165 072564 046057 067151 0010060 071141 020157 027064 027070 026461 030061 061165 067165 0010100 072564 024471 032040 034056 030456 043400 041503 020072 0010120 052450 072542 072156 027565 064514 060556 067562 032040 0010140 033456 031456 033455 061165 067165 072564 024463 032040 0010160 033456 031456 000000 071456 066571 060564 000142 071456 0010200 071164 060564 000142 071456 071550 071164 060564 000142 0010220 064456 072156 071145 000160 067056 072157 027145 041101 0010240 026511 060564 000147 067056 072157 027145 067147 027165 0010260 072542 066151 026544 062151 027000 067147 027165 060550 0010300 064163 027000 074544 071556 066571 027000 074544 071556 0010320 071164 027000 067147 027165 062566 071562 067551 000156 0010340 063456 072556 073056 071145 064563 067157 071137 027000 0010360 062562 027154 074544 000156 071056 066145 070056 072154 0010400 027000 067151 072151 027000 062564 072170 027000 064546 0010420 064556 027000 067562 060544 060564 027000 064145 063137 0010440 060562 062555 064137 071144 027000 064145 063137 060562 0010460 062555 027000 067151 072151 060537 071162 074541 027000 0010500 064546 064556 060537 071162 074541 027000 061552 000162 0010520 062056 067171 066541 061551 027000 067547 000164 063456 0010540 072157 070056 072154 027000 060544 060564 027000 071542 0010560 000163 061456 066557 062555 072156 000000 000000 000000 0010600 000000 000000 000000 000000 000000 000000 000000 000000 0010620 000000 000000 000000 000000 000000 000000 000000 000000 0010640 000000 000000 000033 000000 000001 000000 000002 000000 0010660 100524 004004 000524 000000 000023 000000 000000 000000 0010700 000000 000000 000001 000000 000000 000000 000043 000000 0010720 000007 000000 000002 000000 100550 004004 000550 000000 0010740 000040 000000 000000 000000 000000 000000 000004 000000 0010760 000000 000000 000061 000000 000007 000000 000002 000000 0011000 100610 004004 000610 000000 000044 000000 000000 000000 0011020 000000 000000 000004 000000 000000 000000 000104 000000 0011040 177766 067777 000002 000000 100654 004004 000654 000000 0011060 000040 000000 000005 000000 000000 000000 000004 000000 0011100 000004 000000 000116 000000 000013 000000 000002 000000 0011120 100714 004004 000714 000000 000120 000000 000006 000000 0011140 000001 000000 000004 000000 000020 000000 000126 000000 0011160 000003 000000 000002 000000 101034 004004 001034 000000 0011200 000114 000000 000000 000000 000000 000000 000001 000000 0011220 000000 000000 000136 000000 177777 067777 000002 000000 0011240 101150 004004 001150 000000 000012 000000 000005 000000 0011260 000000 000000 000002 000000 000002 000000 000153 000000 0011300 177776 067777 000002 000000 101164 004004 001164 000000 0011320 000040 000000 000006 000000 000001 000000 000004 000000 0011340 000000 000000 000172 000000 000011 000000 000002 000000 0011360 101224 004004 001224 000000 000010 000000 000005 000000 0011400 000000 000000 000004 000000 000010 000000 000203 000000 0011420 000011 000000 000002 000000 101234 004004 001234 000000 0011440 000030 000000 000005 000000 000014 000000 000004 000000 0011460 000010 000000 000214 000000 000001 000000 000006 000000 0011500 101264 004004 001264 000000 000043 000000 000000 000000 0011520 000000 000000 000004 000000 000000 000000 000207 000000 0011540 000001 000000 000006 000000 101340 004004 001340 000000 0011560 000100 000000 000000 000000 000000 000000 000020 000000 0011600 000004 000000 000222 000000 000001 000000 000006 000000 0011620 101440 004004 001440 000000 000622 000000 000000 000000 0011640 000000 000000 000020 000000 000000 000000 000230 000000 0011660 000001 000000 000006 000000 102264 004004 002264 000000 0011700 000024 000000 000000 000000 000000 000000 000004 000000 0011720 000000 000000 000236 000000 000001 000000 000002 000000 0011740 102310 004004 002310 000000 000020 000000 000000 000000 0011760 000000 000000 000004 000000 000000 000000 000246 000000 0012000 000001 000000 000002 000000 102330 004004 002330 000000 0012020 000054 000000 000000 000000 000000 000000 000004 000000 0012040 000000 000000 000264 000000 000001 000000 000002 000000 0012060 102404 004004 002404 000000 000260 000000 000000 000000 0012100 000000 000000 000004 000000 000000 000000 000276 000000 0012120 000016 000000 000003 000000 117410 004004 007410 000000 0012140 000004 000000 000000 000000 000000 000000 000004 000000 0012160 000000 000000 000312 000000 000017 000000 000003 000000 0012200 117414 004004 007414 000000 000004 000000 000000 000000 0012220 000000 000000 000004 000000 000000 000000 000326 000000 0012240 000001 000000 000003 000000 117420 004004 007420 000000 0012260 000004 000000 000000 000000 000000 000000 000004 000000 0012300 000000 000000 000333 000000 000006 000000 000003 000000 0012320 117424 004004 007424 000000 000350 000000 000006 000000 0012340 000000 000000 000004 000000 000010 000000 000344 000000 0012360 000001 000000 000003 000000 117774 004004 007774 000000 0012400 000004 000000 000000 000000 000000 000000 000004 000000 0012420 000004 000000 000351 000000 000001 000000 000003 000000 0012440 120000 004004 010000 000000 000030 000000 000000 000000 0012460 000000 000000 000004 000000 000004 000000 000362 000000 0012500 000001 000000 000003 000000 120030 004004 010030 000000 0012520 000010 000000 000000 000000 000000 000000 000004 000000 0012540 000000 000000 000370 000000 000010 000000 000003 000000 0012560 120040 004004 010040 000000 000004 000000 000000 000000 0012600 000000 000000 000001 000000 000000 000000 000375 000000 0012620 000001 000000 000060 000000 000000 000000 010040 000000 0012640 000125 000000 000000 000000 000000 000000 000001 000000 0012660 000001 000000 000021 000000 000003 000000 000000 000000 0012700 000000 000000 010165 000000 000406 000000 000000 000000 0012720 000000 000000 000001 000000 000000 000000 000001 000000 0012740 000002 000000 000000 000000 000000 000000 013054 000000 0012760 002060 000000 000035 000000 000055 000000 000004 000000 0013000 000020 000000 000011 000000 000003 000000 000000 000000 0013020 000000 000000 015134 000000 001121 000000 000000 000000 0013040 000000 000000 000001 000000 000000 000000 000000 000000 0013060 000000 000000 000000 000000 000000 000000 000000 000000 0013100 100524 004004 000000 000000 000003 000001 000000 000000 0013120 100550 004004 000000 000000 000003 000002 000000 000000 0013140 100610 004004 000000 000000 000003 000003 000000 000000 0013160 100654 004004 000000 000000 000003 000004 000000 000000 0013200 100714 004004 000000 000000 000003 000005 000000 000000 0013220 101034 004004 000000 000000 000003 000006 000000 000000 0013240 101150 004004 000000 000000 000003 000007 000000 000000 0013260 101164 004004 000000 000000 000003 000010 000000 000000 0013300 101224 004004 000000 000000 000003 000011 000000 000000 0013320 101234 004004 000000 000000 000003 000012 000000 000000 0013340 101264 004004 000000 000000 000003 000013 000000 000000 0013360 101340 004004 000000 000000 000003 000014 000000 000000 0013400 101440 004004 000000 000000 000003 000015 000000 000000 0013420 102264 004004 000000 000000 000003 000016 000000 000000 0013440 102310 004004 000000 000000 000003 000017 000000 000000 0013460 102330 004004 000000 000000 000003 000020 000000 000000 0013500 102404 004004 000000 000000 000003 000021 000000 000000 0013520 117410 004004 000000 000000 000003 000022 000000 000000 0013540 117414 004004 000000 000000 000003 000023 000000 000000 0013560 117420 004004 000000 000000 000003 000024 000000 000000 0013600 117424 004004 000000 000000 000003 000025 000000 000000 0013620 117774 004004 000000 000000 000003 000026 000000 000000 0013640 120000 004004 000000 000000 000003 000027 000000 000000 0013660 120030 004004 000000 000000 000003 000030 000000 000000 0013700 120040 004004 000000 000000 000003 000031 000000 000000 0013720 000000 000000 000000 000000 000003 000032 000001 000000 0013740 000000 000000 000000 000000 000004 177761 000014 000000 0013760 117420 004004 000000 000000 000001 000024 000031 000000 0014000 101540 004004 000000 000000 000002 000015 000056 000000 0014020 101620 004004 000000 000000 000002 000015 000101 000000 0014040 101720 004004 000000 000000 000002 000015 000127 000000 0014060 120040 004004 000001 000000 000001 000031 000146 000000 0014100 117414 004004 000000 000000 000001 000023 000215 000000 0014120 101760 004004 000000 000000 000002 000015 000231 000000 0014140 117410 004004 000000 000000 000001 000022 000270 000000 0014160 000000 000000 000000 000000 000004 177761 000001 000000 0014200 000000 000000 000000 000000 000004 177761 000277 000000 0014220 102660 004004 000000 000000 000001 000021 000315 000000 0014240 117420 004004 000000 000000 000001 000024 000000 000000 0014260 000000 000000 000000 000000 000004 177761 000331 000000 0014300 117414 004004 000000 000000 000000 000022 000352 000000 0014320 117424 004004 000000 000000 000001 000025 000363 000000 0014340 117410 004004 000000 000000 000000 000022 000406 000000 0014360 120000 004004 000000 000000 000001 000027 000434 000000 0014400 102260 004004 000002 000000 000022 000015 000454 000000 0014420 000000 000000 000000 000000 000040 000000 000510 000000 0014440 101520 004004 000004 000000 001022 000015 000536 000000 0014460 120030 004004 000000 000000 000040 000030 000551 000000 0014500 000000 000000 000000 000000 000022 000000 000573 000000 0014520 120040 004004 000000 000000 000020 000030 000602 000000 0014540 102264 004004 000000 000000 000022 000016 000610 000000 0014560 120030 004004 000000 000000 000020 000030 000625 000000 0014600 000000 000000 000000 000000 000040 000000 000644 000000 0014620 120034 004004 000000 000000 001021 000030 000661 000000 0014640 102314 004004 000004 000000 000021 000017 000700 000000 0014660 000000 000000 000000 000000 000022 000000 000735 000000 0014700 102100 004004 000141 000000 000022 000015 000755 000000 0014720 120044 004004 000000 000000 000020 000031 000762 000000 0014740 101440 004004 000000 000000 000022 000015 000771 000000 0014760 102310 004004 000004 000000 000021 000017 001000 000000 0015000 120040 004004 000000 000000 000020 000031 001014 000000 0015020 102035 004004 000034 000000 000022 000015 001021 000000 0015040 000000 000000 000000 000000 000040 000000 001045 000000 0015060 120040 004004 000000 000000 001021 000030 001061 000000 0015100 000000 000000 000000 000000 000040 000000 001113 000000 0015120 101264 004004 000000 000000 000022 000013 061400 072162 0015140 072163 063165 027146 000143 057537 041512 057522 044514 0015160 052123 057537 062000 071145 063545 071551 062564 057562 0015200 066564 061537 067554 062556 000163 062562 064547 072163 0015220 071145 072137 057555 066143 067157 071545 057400 062137 0015240 057557 066147 061157 066141 062137 067564 071562 060537 0015260 074165 061400 066557 066160 072145 062145 033056 030066 0015300 000070 057537 067544 063537 067554 060542 057554 072144 0015320 071157 057563 072541 057570 064546 064556 060537 071162 0015340 074541 062537 072156 074562 063000 060562 062555 062137 0015360 066565 074555 057400 063137 060562 062555 062137 066565 0015400 074555 064537 064556 057564 071141 060562 057571 067145 0015420 071164 000171 062564 072163 061456 057400 043137 040522 0015440 042515 042537 042116 057537 057400 045137 051103 042537 0015460 042116 057537 057400 064537 064556 057564 071141 060562 0015500 057571 067145 000144 042137 047131 046501 041511 057400 0015520 064537 064556 057564 071141 060562 057571 072163 071141 0015540 000164 043537 047514 040502 057514 043117 051506 052105 0015560 052137 041101 042514 000137 057537 064554 061542 061537 0015600 072563 063137 067151 000151 044537 046524 062137 071145 0015620 063545 071551 062564 052162 041515 067554 062556 060524 0015640 066142 000145 057537 034170 027066 062547 057564 061560 0015660 072137 072550 065556 061056 000170 060544 060564 071537 0015700 060564 072162 070000 064562 072156 040146 043500 044514 0015720 041502 031137 030056 057400 062145 072141 000141 063137 0015740 067151 000151 057537 060544 060564 071537 060564 072162 0015760 057400 063537 067555 057556 072163 071141 057564 000137 0016000 057537 071544 057557 060550 062156 062554 057400 047511 0016020 071537 062164 067151 072537 062563 000144 057537 064554 0016040 061542 071537 060564 072162 066537 064541 040156 043500 0016060 044514 041502 031137 030056 057400 066137 061151 057543 0016100 071543 057565 067151 072151 057400 067145 000144 071537 0016120 060564 072162 057400 070146 064137 000167 057537 071542 0016140 057563 072163 071141 000164 060555 067151 057400 073112 0016160 051137 063545 071551 062564 041562 060554 071563 071545 0016200 057400 052137 041515 042537 042116 057537 057400 052111 0016220 057515 062562 064547 072163 071145 046524 066103 067157 0016240 052145 061141 062554 057400 067151 072151 000000
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 :

## Le langage C

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

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 ?

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.

### La norme

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

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

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