# Anatomie d'un programme en C

Un programme en langage C est constitué des éléments suivants :

- Directives de préprocesseur
- Fonctions
- Déclarations de variables
- Instructions
- Structures de contrôle
- Commentaires

En langage C, un programme est souvent découpé en plusieurs fichiers afin d’être plus clair et mieux organisé. On utilise principalement deux types de fichiers :

- les fichiers .c (fichiers source)
- les fichiers .h (fichiers d’en-tête, ou headers)

Un fichier .c contient le **code réel** du programme, c’est-à-dire :

- les fonctions (leur définition)
- les instructions exécutées

C’est dans les fichiers .c que se trouve le "travail" effectué par le programme.

Un fichier .h sert à **déclarer** ce qui sera utilisé ailleurs dans le programme.

On y trouve généralement :

- les prototypes de fonctions
- les constantes (#define)
- parfois des types (struct, typedef)

En résumé
- .h : une fiche descriptive, une table des matière
- .c : le mode d’emploi détaillé

## Exemple minimaliste

```c
#include <stdio.h>    // Directive de préprocesseur

int main() {          // Début de la fonction principale
  puts("Bonjour.");   // Instruction
  return 0;           // Retourne le code 0 pour indiquer la fin du programme
}
```

### Directives de préprocesseur

Les directives de préprocesseur commencent par le symbole `#` et sont traitées avant la compilation. Elles servent principalement à inclure des bibliothèques ou définir des constantes.

La directive `#include` permet d’indiquer au compilateur d’insérer le contenu d’un fichier.

Cela permet à un fichier .c de connaître les fonctions définies ailleurs.

Inclure la bibliothèque d'entrées/sorties standard (stdio : standard input output)

```c
#include <stdio.h>
```

Déclarer une constante

```c
#define PI 3.1415
```

### Blocs de code

En langage C, les accolades `{ }` définissent un bloc de code. Un bloc regroupe plusieurs instructions qui vont être exécutées ensemble.

Un bloc commence avec `{` et se termine avec `}`.

Tout ce qui se trouve entre les accolades appartient au même bloc.

### Fonctions

La fonction `main` est le point d'entrée de tout programme C. Elle retourne un code numérique pour spécifier si le traitement (quelqu'il soit) s'est bien déroulé.

### Variables

Une variable doit être déclarée avant utilisation, en précisant son type.

```c
int age = 25;          // variable de type nombre entier (integer)
float taille = 1.75;   // variable de type nombre réel à virgule flottante
char initiale = 'A';   // variable de type caractère (character)
```

### Instructions

Les instructions sont des opérationsqui sont exécutées par le programme elle peuvent iclure des tests, des opérations mathématiques ou des appels de fonctions.

Chaque instruction en C se termine par un point-virgule ;.

### Commentaires

Il existe deux manières d'écrire des commentaires : en-ligne ou en bloc.

Les commentaires en-ligne doivent obligatoirement tenir sur une ligne. Ils Peuvent se trouver à la suite d'une instruction.

```c
// Calcul du discriminant
delta = b * b - 4 * a * c; // Δ = b² - 4ac
```

Les commentaires en bloc peuvent s'étendre sur plusieurs lignes. Ils sont délimités par /* et */

```c
/* Résolution d'une équation du 2nd degré
Auteur: Emmanuel Medina */
```

## Bibliothèques

### stdio

La bibliothèque standard d'entrée/sortie ***stdio.h***, est essentielle pour interagir avec les flux d'entrée et de sortie. Elle fournit des fonctions pour lire et écrire des données, ainsi que pour manipuler les fichiers.

### stdlib

La bibliothèque standard ***stdlib.h*** (standard library) fournit des fonctions essentielles pour la gestion de la mémoire, le contrôle des processus, le tri des données, les fonctions mathématiques simples et les conversions de texte en nombre.

### string

La bibliothèque ***string.h*** fournit des fonctions pour manipuler les chaînes de caractères et les blocs mémoire.

- `strlen()` : Calculer la longueur de la chaîne (sans compter le caractère nul).
- `strcpy()` : Copier une chaîne dans une autre (=).
- `strcmp()` : Comparer deux chaînes (==).
- `strcat()` : Concaténer deux chaînes (+).

[VOIR](string) en détail le fonctionnement des chaines de caractères.

### ctype

La bibliothèque ***ctype.h*** fournit des fonctions pour tester et manipuler des caractères.

- `tolower` : Transforme une lettre majuscule en une minuscule.
- `toupper` : Transforme une lettre minuscule en une majuscule.
- `isalpha` : Vérifie si un caractère est alphabétique (A-Z a-z).
- `islower` : Vérifie si un caractère est une lettre minuscule (a-z).
- `isupper` : Vérifie si un caractère est une lettre majuscule (A-Z).
- `isdigit` : Vérifie si un caractère est un chiffre. (0-9)
- `isalnum` : Vérifie si un caractère est alpha-numérique. (A-Z a-z 0-9).
- `isblank` : Vérifie si un caractère est blanc (espace ou tabulation).
- `isspace` : Vérifie si l'on a à faire à un caractère d'espacement. (caractère blanc \f \r \n \v)
- `iscntrl` : Vérifie si l'on a à faire à un caractère de contrôle.
- `ispunct` : Vérifie si l'on a à faire à un caractère de ponctuation (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~).
- `isprint` : Vérifie si un caractère est affichable (printable).
- `isgraph` : Vérifie si un caractère posséde une représentation graphique.
- `isxdigit` : Vérifie si un caractère est un chiffre hexadécimal (0-F 0-f).

### math

La bibliothèque ***math.h*** , permet de définir les principales fonctions usuelles mathématiques.

[VOIR](math) les fonctions de la bibliothèque math.h
