Introduction Générale à la Programmation C (PDF)
Document Details
Uploaded by Deleted User
Tags
Summary
This document provides a general introduction to algorithms and programming languages, with a specific focus on the C language. It covers foundational concepts such as algorithms, representation, and compilation. The document seems to be part of a larger course or curriculum in computer science focusing on C programming.
Full Transcript
1 Introduction Générale Dans cette section introductive, nous abordons d’abord quelques concepts généraux relatifs à l’algorithmique et aux langages de programmations d’une manière générale. Nous présentons ensuite plus particulièrement le langage C, avant d’aborder ses caractéristiques plus en déta...
1 Introduction Générale Dans cette section introductive, nous abordons d’abord quelques concepts généraux relatifs à l’algorithmique et aux langages de programmations d’une manière générale. Nous présentons ensuite plus particulièrement le langage C, avant d’aborder ses caractéristiques plus en détails dans les sections suivantes. 1.1 Définitions 1.1.1 Notion d’algorithme Un algorithme est une séquence finie d’actions permettant de résoudre un problème donné. Les premiers algorithmes sont destinés à résoudre certains problèmes mathématiques simples, par exemple multiplier ou diviser des nombres. Ils étaient appliqués manuellement, et sont antérieurs de plusieurs siècles à l’invention des ordinateurs. Ceci permet ainsi d’établir l’indépendance entre un algorithme et sa mise en œuvre, c’est à dire (dans le cadre informatique) son implémentation (c'est-à-dire sa traduction avec un langage de programmation donné). L’Algorithmique est l’ensemble des méthodes permettant de définir et/ou d’étudier des algorithmes. 1.1.2 Représentation d’un algorithme Un algorithme est généralement exprimé dans un langage informel, ou incomplètement formalisé : texte libre (c’est-à-dire description des différentes étapes en français ou autre langue), organigramme (diagramme représentant les étapes), pseudo-code (version simplifiée d’un langage informatique) ou autres. Par opposition, une démonstration mathématique ou un programme informatique sont exprimés en utilisant des langages formels. Cela signifie donc que l’écriture d’un algorithme est souple, elle vise à exprimer une méthode de résolution de façon compréhensible à un être humain. Mais pour la même raison, un algorithme ne peut pas être traité directement par un ordinateur : il doit être formalisé, c’est à dire transformé en un programme. 1.1.3 Diviser pour régner D’une manière générale, le problème à résoudre est souvent compliqué, et l’algorithme permettant de le résoudre n’est pas évident à définir. Pour cela, on utilise en général l’approche appelée « diviser pour régner ». Cette méthode hiérarchique consiste à diviser le problème complexe en plusieurs sous-problèmes plus simples à résoudre. L’approche s’applique récursivement aux sous-problèmes s’ils sont eux-mêmes trop complexes, c'est-à-dire, on les divise eux-mêmes en sous-problèmes plus simples si nécessaire. On aboutit finalement à des sous-problèmes élémentaires, donc, on ne peut plus les réduire à des sous-problèmes plus simples. La résolution de ces sous-problèmes est supposée facile, et il en est de même pour la définition de l’algorithme correspondant. 1.1.4 Programme et compilation On peut considérer un programme comme la traduction d’un algorithme dans un langage de programmation, c'est-à-dire un langage formel compréhensible par un ordinateur. On dit alors que ce programme est l’implémentation de cet algorithme. Prepa A1 AU : 24-25 1/10 Programmation C / H.CH Programme : séquence d’instructions destinées à être exécutées par un ordinateur. Instruction : action que l’ordinateur connait et peut réaliser. Un langage de programmation (y compris le C) est caractérisé par son jeu d’instructions : Jeu d’instructions : ensemble des instructions autorisées dans un langage de programmation. Un programme est stocké dans un fichier. On distingue deux types de fichiers, correspondant à deux versions différentes d’un programme : fichier source et fichier exécutable. Le premier contient ce que l’on appelle le code source, il s’agit d’un fichier texte, alors que le second contient le code binaire, aussi appelé code machine ou code objet. Code source : programme exprimé dans un langage de programmation compréhensible par un être humain, et ne pouvant pas être exécuté directement par l’ordinateur. Code binaire : programme exprimé en langage machine, pouvant être directement exécuté par l’ordinateur. C'est-à-dire le programme écrit par l’informaticien (code source) est traduit en programme prêt à être exécuté par la machine (code binaire). Remarque : on utilise souvent le seul terme programme pour désigner le code source ou le code binaire. Son interprétation dépend alors du contexte. Le code binaire est obtenu à partir du code source, en réalisant un traitement appelé compilation. Ce traitement est réalisé par un programme spécial appelé compilateur. Compilation : action de transformer un code source en code binaire, de manière à obtenir un fichier exécutable à partir d’un fichier source. Le code binaire est spécifique au processeur qui va exécuter le programme. Par contre, le code source en est généralement indépendant. Cela signifie qu’un même code source sera compilé différemment en fonction du processeur (et/ou du système d’exploitation) que l’on veut utiliser pour exécuter le programme. Remarque : il est important de bien comprendre qu’un code source et l’algorithme qu’il implémente sont deux choses bien distinctes. En effet, le même algorithme peut être implémenté (c'est-à-dire traduit avec un langage de programmation) différemment, en fonction de : La personne qui écrit le programme ; Le langage de programmation employé ; La machine et/ou le système d’exploitation utilisé(s) ; Le niveau de précision de l’algorithme ; etc. La procédure de compilation varie en fonction du langage de programmation. On s’intéresse ici au cas du langage C, décrit dans la figure ci-dessous. Un programme C prend généralement la forme de plusieurs fichiers source distincts, que l’on veut compiler de manière à obtenir un seul fichier exécutable. La décomposition d’un programme en plusieurs fichiers séparés permet de le rendre modulaire, ce qui facilite la maintenance, le débogage (éliminer les anomalies de fonctionnement) et l’évolution du programme. La première étape consiste à précompiler les fichiers source, en appliquant les directives de pré- compilation indiquées dans le code source au moyen du caractère # (dièse). Ces directives seront décrites plus tard, mais on peut déjà dire que le travail de pré-compilation consiste à transformer et compléter le code source. On obtient ainsi une version complétée de chaque fichier source traité. Les fichiers obtenus contiennent toujours du code source. La deuxième étape est la compilation proprement dite. Cependant, elle ne produit pas directement du code binaire, mais un code source intermédiaire, utilisant le langage assembleur. Ce langage Prepa A1 AU : 24-25 2/10 Programmation C / H.CH est qualifié de bas-niveau, car son jeu d’instructions correspond aux actions les plus simples qu’un processeur peut effectuer. Par conséquent, un programme assembleur se traduit très facilement en un programme binaire. À ce stade de la procédure, on obtient autant de fichiers assembleur qu’on avait initialement de fichiers source. La troisième étape est appelée l’assemblage, et consiste à transformer chaque fichier assembleur en un fichier binaire. Là encore, on obtient autant de fichiers binaires que de fichiers source originaux. Ces fichiers prennent généralement l’extension.o. La quatrième et dernière étape est l’édition des liens. Elle consiste à rassembler dans un seul fichier binaire tout le code binaire nécessaire à l’exécution du programme. On obtient finalement un seul fichier que l’on peut exécuter. fichiers fichiers fichiers fichiers fichier source complétés assembleur objet exécutable main( ) main( ) ADD 0001110 fonct1( ) fonct1( ) JUMP X 1101110 Edition des liens 0000111 1001010 Précompilation Assemblage Compilation 1010000 fonct2( ) fonct2( ) ADD X, Y 0111100 0111010 ADD Y, Z 0011100 1011100 0100010 1011110 1100101 fonct3( ) fonct3( ) LABEL UN 0110010 fonct4( ) fonct4( ) JUMP DE 0101110 0111001 Remarque : par abus de langage, on appelle compilation l’ensemble de la procédure permettant d’obtenir un fichier binaire à partir d’un ou plusieurs fichiers sources, alors qu’en réalité, la compilation proprement dite n’est qu’une étape de cette procédure (ici, la deuxième étape). 1.1.5 Erreurs de compilation et d’exécution On distingue deux types de problèmes pouvant survenir lors de l’écriture d’un programme, en fonction du moment où elles sont détectées : en compilation ou en exécution. Erreur de compilation : problème détecté lors du processus de compilation. Le compilateur peut indiquer un simple avertissement, auquel cas le problème détecté n’est que potentiel, et n’empêche pas la création d’un fichier binaire qui pourra ensuite être exécuté. Ce type de problème est généralement indiqué par l’IDE (Integrated Development Environment) en signalant la portion de code source concernée. Le compilateur peut indiquer une erreur proprement dite, qui empêche de finaliser la compilation. Dans ce cas-là, il n’est pas possible de créer le fichier exécutable correspondant à votre programme. Il est donc inutile de tenter d’exécuter votre programme si la compilation a échoué. Des messages d’information sont indiqués pour chaque avertissement et erreur de compilation, afin d’aider le programmeur à résoudre le problème identifié. Cependant, il faut savoir que ces messages ne sont pas toujours très explicites. Il est nécessaire d’avoir une certaine expérience du compilateur utilisé pour être capable de les interpréter correctement. De plus, une erreur de compilation peut en provoquer d’autres. Pour cette raison, il faut absolument commencer par Prepa A1 AU : 24-25 3/10 Programmation C / H.CH corriger la toute première erreur détectée par le compilateur, puisqu’elle est susceptible de causer les erreurs ultérieures. Erreur d’exécution : erreur se produisant quand le programme n’a pas le comportement attendu lors de son exécution. Les erreurs d’exécution ne sont pas détectées par le compilateur, mais par l’utilisateur. Autrement dit, leur détection n’est pas automatique, mais manuelle. Par conséquent, rien n’indique précisément la partie du code source qui pose problème : le débogage (résolution du problème) se fait complètement manuellement. Ces erreurs sont donc beaucoup plus difficiles à corriger que les erreurs de compilations. On distingue deux types d’erreurs d’exécution : les erreurs fatales et les erreurs non-fatales. Les premières provoquent la terminaison non-naturelle du programme. Autrement dit, votre programme se termine alors qu’il ne devrait pas. C’est par exemple le cas si vous effectuez une division par zéro. Dans ce cas-là, il est facile de détecter la présence d’une erreur, puisque le programme se termine intempestivement. Par contre, localiser la partie du code source concernée n’est pas forcément simple. Les erreurs non-fatales sont beaucoup plus difficiles à détecter, car l’exécution continue, et la conséquence de ce type d’erreur peut se manifester bien après l’apparition de l’erreur elle-même. 1.2 Présentation du langage C L’écriture de programmes en C nécessite de comprendre un grand nombre de concepts tous liés les uns aux autres. Dans cette partie, on se contentera donc d’introduire les notions essentielles de façon superficielle, afin de pouvoir progresser dans le cours. La plupart de ces notions seront ensuite revues plus tard, de façon plus approfondie. 1.2.1 Historique Le langage C est un langage de programmation développé à partir de 1972 dans les laboratoires Bell, dans le but d’écrire le système d’exploitation Unix. Sa paternité est attribuée à Dennis Ritchie et Ken Thompson, tandis que Brian Kernighan est intervenu plus tard dans son évolution. L’un des objectifs était de définir un langage portable. Portabilité : un langage de programmation est dit portable s’il peut être compilé sur des machines et de systèmes différents, sans avoir besoin d’être modifié. Cependant, on ne peut pas vraiment considérer que cet objectif a été atteint, car différentes versions du C sont apparues, qui ne sont pas complètement compatibles entre elles. Les principales sont les suivantes : La version originale s’est stabilisée en 1978 et est appelée Kernighan & Ritchie ou C K&R ; L’ANSI (American National Standards Institute) a défini sa propre version en 1989, basée sur le C K&R et appelée C89 ou C ANSI ; L’ISO ( International Standards Organization) a défini sa version basée sur le C ANSI en 1999, qui est appelée C99. Dans ce cours, nous nous concentrerons sur la version C89, qui est la plus répandue. On qualifie parfois le C de langage bas niveau car il est relativement proche de l’assembleur. Assembleur : langage de programmation bas niveau (proche du processeur) permettant de représenter le langage machine avec une forme lisible par l’être humain. Prepa A1 AU : 24-25 4/10 Programmation C / H.CH Toutefois, le langage C est de plus haut niveau que ce dernier. Sa syntaxe a fortement influencé d’autres langages de haut niveau apparus plus tard, tels que C++, Java, C#, JavaScript ou PHP. Un grand nombre de systèmes d’exploitation et de jeux vidéo sont encore (complètement ou partiellement) écrits en C aujourd’hui. 1.2.2 Notion de fonction Par définition, un programme est une séquence d’instructions. À noter qu’en langage C, chaque instruction se termine par un point-virgule ‘;’. Pour améliorer la lisibilité du code source et sa gestion, il peut être pratique de découper un programme en plusieurs parties relativement indépendantes. Cela se fait grâce à la notion de bloc. Bloc d’instructions : sous-séquence d’instructions, délimitée par des accolades ‘{‘ et ‘}’. Exemple : les instructions 2, 3 et 4 suivantes sont contenues dans un bloc distinct. instruction 1; { instruction 2; instruction 3; instruction 4; } instruction 5; Il est aussi possible de définir un bloc à l’intérieur d’un autre bloc, et de répéter cela récursivement. On peut alors parler de sous-bloc. Exemple : les instructions 3 et 4 sont maintenant dans un sous-bloc : instruction 1; { instruction 2; { instruction 3; instruction 4; } } instruction 5; Lorsqu’on a besoin d’utiliser plusieurs fois un bloc donné, on peut lui donner un nom, afin de le désigner facilement. On obtient alors ce qu’on appelle une fonction. Outre son nom, une fonction est aussi caractérisée par ses entrées/sorties, c'est-à-dire, les informations qu’elle reçoit pour effectuer son traitement (entrées), et celles qu’elle renvoie à la fin de ce traitement (sorties). Fonction : bloc d’instructions identifié par un nom, des entrées et des sorties. Le nom de la fonction est aussi appelé identificateur. Le bloc d’instructions qui décrit le traitement effectué par la fonction est appelé corps de la fonction, alors que son identificateur et ses entrées-sorties sont décrits sous la forme d’un en-tête. Corps de fonction : bloc d’instructions implémentant le traitement réalisé par la fonction. En-tête de fonction : type de retour, identificateur (nom) et paramètres de la fonction. Le type de retour décrit quel genre d’information la fonction calcule : cela peut être rien du tout (noté void) si la fonction ne renvoie rien, ou bien une valeur entière, une valeur réelle, ou encore d’autres données. La notion de type sera abordée plus en détails à la suite du cours. Les paramètres de la fonction sont des variables que la fonction reçoit et sur lesquelles elle peut travailler. Elles sont indiquées entre parenthèses et séparées par des virgules. Pour chacune, on doit préciser son type (comme pour le type de retour) et son identificateur (c’est-à-dire son nom). La notion de variable sera approfondie à la suite du cours. Le nombre de paramètres n’est pas limité, il peut même ne pas y avoir de paramètre du tout, et on a alors des parenthèses vides : ( ). Prepa A1 AU : 24-25 5/10 Programmation C / H.CH Exemple : une fonction appelée ma_fonction, dont le type de retour est type_r et qui possède trois paramètres p1, p2 et p3 de types respectifs type_p1, type_p2 et type_p3. type_r ma_fonction(type_1 p1, type_2 p2, type_3 p3) { instruction_1; instruction_2;... } 1.2.3 Fonctions principales et secondaires Un programme en langage C peut contenir une séquence de fonctions. La notion de fonction sera explorée en détails dans une autre section. Ce programme doit obligatoirement contenir une fonction principale, dont le nom est obligatoirement main. En règle générale, un programme ne peut pas contenir plusieurs fonctions portant le même nom. La fonction main a, de plus, un type de retour et des paramètres imposés : int main(int argc, char** argv) { instruction 1; instruction 2;... } Le type de retour (int) et les deux paramètres (int argc et char** argv) seront expliqués plus tard en cours. On appelle programme minimal le programme le plus court possible autorisé par les règles d’un langage de programmation donné. Dans le cas du langage C, il s’agit du programme suivant, que vous pouvez copier-coller dans votre IDE puis compiler : int main(int argc, char** argv) { } Notez que ce programme ne fait absolument rien du tout ! Exemple : un programme composé de trois fonctions secondaires f1, f2, f3 et d’une fonction principale : t_a f1(t_b p1, t_c p2) {... } void f2(t_a p1) {... } t_c f3() {... } int main(int argc, char** argv) {... } 1.2.4 Commentaires et lisibilité Comme dans la plupart des langages de programmation, il est possible de définir des commentaires en langage C. Prepa A1 AU : 24-25 6/10 Programmation C / H.CH Commentaire : un texte exprimé en langage naturel (par exemple en français ou en anglais) et dont le but est d’expliquer le fonctionnement du programme à un programmeur. Ce programmeur peut être celui qui a écrit le code source, ou une autre personne. Les commentaires permettent d’insérer dans le programme des indications précieuses destinées à un être humain, et ils sont par conséquent complètement ignorés par le compilateur. En C, un commentaire est délimité par , et peut occuper plusieurs lignes. On peut aussi faire des commentaires d’une seule ligne en insérant // en début de ligne. Exemples : Commentaire de plusieurs lignes : Commentaire d’une seule ligne // Ceci est un commentaire en une seule ligne De manière générale, il est très important de mettre des commentaires lorsqu’on programme, car cela améliore la lisibilité du code. Lisibilité du code source : propriété d’un code source à être facilement compris par une personne qui ne l’a pas forcément écrit. L’indentation du code est un autre facteur affectant la lisibilité du code. Indentation : décalage introduit en début de ligne pour aligner horizontalement certaines lignes du code source. Toute accolade fermante } doit être alignée avec l’accolade ouvrante { correspondante ; Toute instruction doit être alignée avec la première instruction appartenant au même bloc. Exemple : le programme à gauche n’est pas indenté (instruction 4 n’est pas alignée avec l’instruction 3) et le même programme correctement indenté à droite : instruction 1;{ instruction 1; instruction 2; { instruction 2; { instruction 3; { instruction 3; instruction 4; instruction 4; instruction 5; instruction 5; } } instruction 6; instruction 6; } } 1.2.5 Identificateurs et mots-clés Nous revenons ici sur la notion d’identificateur, que l’on a déjà mentionnée pour les fonctions. Il s’agit cependant d’un concept plus général. Identificateur : nom donné par le programmeur à un élément de programmation : fonction, variable, constante symbolique, type, etc. La règle principale pour un identificateur, est qu’il doit être unique, dans une certaine mesure qui dépend de l’élément concerné : variable, constante, fonction, etc. Pour une fonction, Prepa A1 AU : 24-25 7/10 Programmation C / H.CH l’identificateur doit être unique pour le programme entier, en considérant tous les fichiers source qui constituent le programme : fichier principal et bibliothèques. Pour une variable, l’identificateur doit être unique dans le bloc où elle est créée. Un identificateur doit aussi respecter un certain nombre de contraintes pour être valide. Pour simplifier, on utilisera les règles suivantes dans le cadre de ce cours : On utilisera seulement des lettres (minuscules et majuscules), des chiffres et le caractère tiret-bas (aussi appelé underscore : _ ) ; On n’utilisera pas de signes diacritiques sur les lettres (accents, trémas, tilde, etc.) Le premier caractère de l’identificateur sera toujours une lettre. Remarque : le compilateur C fait la distinction entre lettres minuscules et majuscules. Par exemple, les identificateurs var et VAR sont considérés comme différents. Les conventions suivantes sont généralement utilisées en C. Les noms des variables et fonctions ne contiennent pas de majuscules (ex. : var1) Les constantes symboliques ne contiennent pas de minuscules (ex. : CST) On utilise le caractère underscore pour séparer les mots (ex : ex_de_var) Quand on choisit le nom d’un identificateur, il faut que ce nom ait un sens, ce qui permet d’améliorer la lisibilité du code source. Un certain nombre de mots ne peuvent pas être utilisés comme identificateurs. On les appelle mots protégés ou mots réservés. Il s’agit essentiellement des mots-clés du langage C. Mot-clé d’un langage informatique : mot associé à une action particulière dans le cadre de ce langage. Exemples : quelques mots clés du C : for, if, else, return… 1.2.6 Directives de pré-compilation En dehors des fonctions mentionnées, il est possible de placer dans le programme ce que l’on appelle des directives de pré-compilation. Il s’agit d’instructions traitées lors de la première étape du processus de compilation. Pour cette raison, elles ne suivent pas la même syntaxe que les instructions qui s’adressent au compilateur. Chaque directive doit : Être précédée du caractère dièse (i.e. #). Ne pas être terminée par un point-virgule (i.e. ;). Dans le cadre de ce cours, on s’intéressera essentiellement aux deux directives #include et #define. La première permet de faire référence à des programmes écrits dans d’autres fichiers. Il peut s’agir de programmes écrits par la même personne, ou bien par d’autres. Les noms de ces programmes doivent prendre la forme xxxx.h. On distingue deux formes pour cette directive : Une forme locale, dans laquelle le nom du fichier est entouré de guillemets (i.e. " et ") : #include "xxxx.h" Une forme système, dans laquelle le nom du fichier est entouré des signes mathématiques < et >. #include Dans le premier cas, le fichier sera recherché dans le même dossier que votre propre programme. On dit qu’il est local à votre programme. Dans le second cas, le fichier sera recherché dans les chemins définis au niveau de votre système d’exploitation. Prepa A1 AU : 24-25 8/10 Programmation C / H.CH La seconde directive permet de définir des constantes symboliques, que l’on appelle aussi parfois des macros. Constante symbolique : identificateur associé à une valeur qui ne change pas au cours de l’exécution du programme. Pour rappel, l’identificateur utilisé pour désigner une constante ne doit pas contenir de lettres minuscules. La définition se fait en utilisant la syntaxe suivante : #define XXXX valeur Où XXXX est l’identificateur et valeur est la valeur associée. Par exemple, pour définir une constante C de valeur 5, on écrira : #define C 5 Cette directive fonctionne de la façon suivante : lors de la pré-compilation, à chaque fois qu’on trouve XXXX dans le code source, cette expression est remplacée par valeur. Il est donc complètement impossible de modifier XXXX lors de l’exécution. Encore une fois, notez bien l’absence du signe ; à la fin de la ligne. Remarquez aussi qu’à la différence des variables, on n’utilise pas ici l’opérateur d’affectation =. Ces deux directives sont à placer au tout début de votre programme. Exemple : la fonction printf permet d’afficher du texte à l’écran. Pour l’utiliser, il faut mentionner que le programme utilise la bibliothèque stdio.h (Standard Input/Output = entrées/sorties standards). Supposons également que l’on veut définir une constante CSTE de valeur 5. Alors on écrira : #include #define CSTE 5 int ma_fonction() {... } int main(int argc, char** argv) { printf("j’affiche du texte");... } 1.2.7 Modularité des programmes Comme expliqué précédemment, le langage C permet de décomposer un programme en plusieurs fichiers relativement indépendants, qui sont rassemblés lors de la compilation. On a tout d’abord un fichier principal, qui contient la fonction principale main. Celui-ci doit obligatoirement être défini. Son nom n’est pas contraint, mais par convention nous l’appellerons main.c. Outre la fonction main, il peut contenir des fonctions secondaires. Le reste des fichiers formant le programme sont ce que l’on appelle des bibliothèques. Bibliothèque : paire de fichiers (.h et.c) définissant un ensemble de fonctionnalités thématiquement liées. Une bibliothèque nommée xxxx est formée de deux fichiers : xxxx.c, qui contient essentiellement les fonctions complètes ; xxxx.h qui contient essentiellement les en-têtes des fonctions (et pas leurs corps). Le second est d’ailleurs appelé fichier d’en-tête, ce qui se traduit en header file en anglais, d’où l’extension en.h. Outre les en-têtes des fonctions, le fichier.h peut également contenir des Prepa A1 AU : 24-25 9/10 Programmation C / H.CH types, des variables, des constantes destinées à être utilisées dans d’autres programmes (ces notions seront abordées plus tard dans ce cours). Comme nous l’avons indiqué précédemment, pour pouvoir utiliser une bibliothèque dans un autre programme, il est nécessaire d’utiliser la directive de pré-compilation #include. Mais cette directive sert aussi à lier les fichiers.c et.h composant une bibliothèque : elle doit apparaître au début du fichier.c. Exemple : une bibliothèque très simple, appelée xxxx, avec : Le fichier xxxx.h : int ma_fonction(int x); Et le fichier xxxx.c : #include "xxxx.h" int ma_fonction(int x) { instruction 1; instruction 2;... } Vous remarquerez que dans le fichier d’en-tête.h, l’en-tête de la fonction ma_fonction est terminé par un point-virgule (;), alors que ce n’est pas le cas dans le fichier.c. Si on veut utiliser cette bibliothèque dans un programme principal main.c, alors il faut rajouter la directive #include "xxxx.h" au début de ce programme main.c. On appelle bibliothèque standard une bibliothèque qui fait partie de la norme définissant le C. Ces bibliothèques contiennent donc des fonctions et types supposées accessibles à n’importe quel compilateur C. Exemples : stdlib.h : (standard library) fonctions diverses ; stdio.h : (standard input-output) afficher du texte à l’écran, saisir du texte au clavier ; math.h : fonctions mathématiques (valeur absolue, puissance, cosinus, etc.) ; time.h : fonctions liées aux temps (heure, date, etc.). Bien que standard, ces bibliothèques doivent faire l’objet d’un #include avant de pouvoir être utilisées dans un programme. Prepa A1 AU : 24-25 10/10 Programmation C / H.CH