From 5ea7dcf5c93b7d415921b142e5f6b02d34cd09b8 Mon Sep 17 00:00:00 2001 From: medina5 Date: Mon, 5 Jan 2026 22:36:14 +0100 Subject: [PATCH] Concepts --- README.md | 38 +++++++++++++++- anatomie.md | 121 +++++++++++++++++++++++++++++++++++++++++++++++++ compilation.md | 31 +++++++++++++ variables.md | 88 +++++++++++++++++++++++++++++++++++ 4 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 anatomie.md create mode 100644 compilation.md create mode 100644 variables.md diff --git a/README.md b/README.md index 5942382..3d98e91 100644 --- a/README.md +++ b/README.md @@ -1 +1,37 @@ -Voir le [wiki](../../../wiki) +> [!NOTE] +> Le langage C reste aujourd'hui très utilisé, notamment pour le développement du noyau des systèmes d'exploitation, des logiciels embarqués et des applications nécessitant des performances élevées. Sa simplicité, sa proximité avec le matériel et sa portabilité sont les principales raisons de son succès durable. + +- [Histoire du langage C](histoire) + +## Caractéristiques + +- Langage de programmation **procédural** ; +- Langage de bas niveau : conçu pour être compilé en un nombre d'instructions machine prévisible en termes d'occupation mémoire et de charges de calcul ; +- Langage extrêmement utilisé dans : + - La programmation embarquée sur micro-contrôleurs ; + - Les calculs intensifs ; + - L'écriture du noyau de systèmes d'exploitation ; + - Les modules où la rapidité de traitement est importante. + +Sa syntaxe de base a inspiré de nombreux langages plus récents dont C++, Java et PHP, C#, JavaScript, ... + +### Avantages + +- Nombre restreint de concepts, ce qui facilite sa maîtrise ; +- Nombre restreint de mots clés, ce qui facilite l'apprentissage ; +- Proche de la machine : opérateurs proches du langage machines et fonctions permettant un accès direct au système ; +- Programmation modulaire : permet de gérer plusieurs fichiers sources ⇒ structuration, compréhensibilité et réutilisation du code ; +- Grand nombre de bibliothèques tierces existantes. + +### Inconvénients + +- Pas universel car la génération des exécutables dépend du compilateur et donc de la cible ; +- Langage bas niveau offrant peu de fonctionnalités notamment pour la gestion de la mémoire et les chaînes de caractères ; +- Pas de gestion efficace des erreurs et beaucoup de libertés laissées au programmeur ⇒ rigueur et discipline de programmation ; +- Bibliothèque standard assez pauvre. + +## Concepts + +- [Anatomie d'un programme](anatomie) +- [La compilation](compilation) +- [Les variables](variables) diff --git a/anatomie.md b/anatomie.md new file mode 100644 index 0000000..a83d6e1 --- /dev/null +++ b/anatomie.md @@ -0,0 +1,121 @@ +# 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 + +### Exemple minimaliste + +```c +#include // 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. + +Inclure la bibliothèque d'entrées/sorties standard (stdio : standard input output) + +```c +#include +``` + +Déclarer une constante + +```c +#define PI 3.1415 +``` + +### 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 diff --git a/compilation.md b/compilation.md new file mode 100644 index 0000000..81efd44 --- /dev/null +++ b/compilation.md @@ -0,0 +1,31 @@ +# Compilation + +**Prétraitement** : Le traitement par le préprocesseur : le fichier source est analysé par le préprocesseur qui effectue des transformations textuelles dans le fichier source. Substitution de chaine de caractère, des constantes, prise en compte des directives de compilation, inclusion des autres fichiers sources... + +```c +#define PI 3.1415 + +double aire = PI * pow(rayon, 2); +``` + +remplacé par + +```c +double aire = 3.1415 * pow(rayon, 2); +``` + +**La compilation** : C'est la traduction du fichier généré par le préprocesseur en assembleur, c'est-à-dire en une suite d'instruction correspondant au microprocesseur cible. (en mnémonique rendant la lecture encore possible). + +**L'assemblage** : L'assembleur traduit le code assembleur en code objet binaire directement compréhensible par le processeur. (fichiers objets). + +**L'édition de liens** : Le linker combine le code objet avec les bibliothèques nécessaires (comme la bibliothèque standard C) pour produire un exécutable. (fichiers exe ou out). + +```mermaid +graph LR; + A((Source C .c)) --> B[Prétraitement] + B --> C[Compilation] + C --> D[Assemblage] + D --> E((Code Objet .o)) + E --> F[Édition des liens] + F --> G((Exécutable .exe)) +``` diff --git a/variables.md b/variables.md new file mode 100644 index 0000000..a20177b --- /dev/null +++ b/variables.md @@ -0,0 +1,88 @@ +# Variables + +> Une variable est un élément qui associe un **identifiant** à une **valeur**. + +## Caractéristiques + +Une variable possède plusieurs caractéristiques ou propriétés. + +La **déclaration**, c'est l'endroit dans le code qui défini l'existence de la variable. + +```c +int age = 19; +``` + +Un **nom** sous lequel la variable est déclarée. Dans cette déclaration le nom de la variable est `age`. + +Un **type**. Dans la mémoire d'un ordinateur, toute information est stockée sous forme d'éléments binaires appelés `bit` (en: binary digit, nombre binaire). Un même ensemble de bits peut être représenté sous différentes aspects : nombre entier, nombre réel, texte, photo, vidéo, audio, ... C'est la convention d'interprétation du type qui défini la valeur de la variable. + +Dans cette déclaration le type de la variable `age` est un entier `int`. + +La **taille** associée au type. Dans le cas des types fixe, le type de la variable spécifie aussi le nombre de bits ou le nombre de mots (en: bytes, octets) utilisés. + +Dans cette déclaration la taille de la variable `age` est de 4 octets ou 32 bits, qui est la taille associée à un type `int`. + +La **valeur**, c'est la valeur intrasèque des bits suivant la représentation associée au type; + +Dans cet exemple la valeur de la variable `age` est `10`. + +L'**adresse**, c'est l'endroit dans la mémoire de l'ordinateur où est stockée physiquement la variable. + +La **portée**, c'est la portion de code où la variable est utilisable. Une variable est accessible depuis sa définition jusqu'à la fin du bloc où elle est déclarée. + +Sa **durée de vie**, c'est le temps d'exécution pendant laquelle la variable existe. Il est possible de masquer une variable par une autre en utilisant un même identifiant. La première variable est hors de portée mais existe toujours. Une variable `static` est utilisable que dans la fonction dans laquelle elle a été déclarée, cependant sa durée de vie s'étend sur l'intégralité de l'éxécution du programme. + +Sa **visibilité**, dans un langage évolué comme le C++, le C# ou Java, c'est un ensemble de règles qui fixe qui peut utiliser la variable. + +### Règles + +#### Déclaration + +> [!WARNING] +> Les variables doivent être déclarées **avant** d'être utilisées. + + +```c +#include + +int main() +{ + printf("%d", age); + int age = 10; +} +``` + +Ce code provoque une erreur : la variable est non déclarée avant sont utilisation ! + +``` +error: ‘age' undeclared (first use in this function) +``` + +Voici le code correct + +```c +#include + +int main() +{ + int age = 10; + printf("%d", age); +} +``` + +## Expressions littérales + +Dans un programme il est possible de manipuler des valeurs sans pour autant les avoir déclarées avant. Ces valeurs existent de manières littérales à l'intérieur même du code du programme. + +> [!WARNING] +> Attention, dans le cas des chaines de caractères, il ne faut pas confondre le nom de la variable avec sa valeur. + + +```c +char joueur[10] = "Alice"; + +printf("%s\n", "joueur"); +printf("%s\n", joueur); +``` + +`"joueur"` avec des guillemets est une valeur littérale. On peut considérer, sans que cela soit le cas, que c'est une variable sans nom, qui possède la valeur `joueur`.