Académique Documents
Professionnel Documents
Culture Documents
C est un langage de programmation à usage général, développé en 1972, et toujours très populaire.
C est très puissant ; il a été utilisé pour développer des systèmes d'exploitation, des bases de
données, des applications, etc.
Exemples dans chaque chapitre
Example
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
C'est quoi C?
C est un langage de programmation à usage général créé par Dennis Ritchie aux Bell Laboratories
en 1972.
C'est une langue très populaire, malgré son ancienneté.
C est fortement associé à UNIX, car il a été développé pour écrire le système d'exploitation UNIX.
Pourquoi apprendre le C ?
• C'est l'un des langages de programmation les plus populaires au monde
• Si vous connaissez C, vous n'aurez aucun problème à apprendre d'autres langages de
programmation populaires tels que Java, Python, C++, C#, etc., car la syntaxe est similaire.
• C est très rapide, comparé à d'autres langages de programmation, comme Java et Python
• C est très polyvalent; il peut être utilisé à la fois dans les applications et les technologies
Différence entre C et C++
• C++ a été développé comme une extension de C, et les deux langages ont presque la même syntaxe
• La principale différence entre C et C++ est que C++ prend en charge les classes et les objets, alors
que C ne le fait pas.
Il n'est pas nécessaire d'avoir une expérience préalable en algorithmique.
Pour commencer à utiliser C, vous avez besoin de deux choses :
• Un éditeur de texte, comme Notepad, pour écrire du code C
• Un compilateur, comme GCC, pour traduire le code C dans un langage que l'ordinateur
comprendra
Il existe de nombreux éditeurs de texte et compilateurs parmi lesquels choisir.
Installer un IDE
Un IDE (Integrated Development Environment) est utilisé pour éditer et compiler le code.
Les IDE populaires incluent Code : Blocks, Eclipse et Visual Studio. Ils sont tous gratuits et
peuvent être utilisés à la fois pour éditer et déboguer du code C.
Remarque : les IDE basés sur le Web peuvent également fonctionner, mais les fonctionnalités sont
limitées.
Nous utiliserons Code :: Blocks, qui, selon nous, est un bon point de départ.
Vous pouvez trouver la dernière version de Codeblocks sur http://www.codeblocks.org/ .
Téléchargez le mingw-setup.exefichier, qui installera l'éditeur de texte avec un compilateur.
Démarrage
Créons notre premier fichier C.
Ouvrez Codeblocks et accédez à Fichier > Nouveau > Fichier vide.
Écrivez le code C suivant et enregistrez le fichier sous myfirstprogram.c
(Fichier > Enregistrer le fichier sous) :
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
Dans Codeblocks, cela devrait ressembler à ceci :
Ensuite, allez dans Build > Build and Run pour lancer (exécuter) le programme. Le résultat
ressemblera à ceci :
Hello World!
Process returned 0 (0x0) execution time : 0.011 s
Press any key to continue.
monpremierprogramme.c
Code:
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
Résultat:
Hello World!
Syntaxe
Décomposons le code pour mieux le comprendre :
Exemple
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
Exemple expliqué
Ligne 1 : #include <stdio.h> est une bibliothèque de fichiers d'en-tête qui nous permet de
travailler avec des fonctions d'entrée et de sortie, telles que printf()(utilisé à la ligne 4). Les
fichiers d'en-tête ajoutent des fonctionnalités aux programmes C.
Ne vous inquiétez pas si vous ne comprenez pas comment #include <stdio.h>fonctionne.
Considérez-le simplement comme quelque chose qui apparaît (presque) toujours dans votre
programme.
Ligne 2 : une ligne vide. C ignore les espaces blancs. Mais nous l'utilisons pour rendre le code plus
lisible.
Ligne 3 : Une autre chose qui apparaît toujours dans un programme C, c'est main(). C'est ce qu'on
appelle une fonction. Tout code à l'intérieur de ses accolades {} sera exécuté.
Ligne 4 : printf() est une fonction utilisée pour sortir/imprimer du texte à l'écran. Dans notre
exemple, il affichera "Hello World".
Notez que : Chaque instruction C se termine par un point-virgule;
Remarque : Le corps de int main()peut également être écrit comme suit :
int main(){printf("Hello World!");return 0;}
Rappel : Le compilateur ignore les espaces blancs. Cependant, plusieurs lignes rendent le code
plus lisible.
Ligne 5 : return 0 termine la main()fonction.
Ligne 6 : N'oubliez pas d'ajouter l'accolade fermante} pour terminer la fonction principale.
int main() {
printf("Hello World!");
return 0;
}
Vous pouvez utiliser autant de printf()fonctions que vous le souhaitez. Cependant, notez qu'il
n'insère pas de nouvelle ligne à la fin de la sortie :
Exemple
#include <stdio.h>
int main() {
printf("Hello World!");
printf("I am learning C.");
return 0;
}
Nouvelles lignes
Pour insérer une nouvelle ligne, vous pouvez utiliser le \n caractère :
Exemple
#include <stdio.h>
int main() {
printf("Hello World!\n");
printf("I am learning C.");
return 0;
}
Vous pouvez également générer plusieurs lignes avec une seule printf()fonction. Cependant,
sachez que cela rendra le code plus difficile à lire :
Exemple
#include <stdio.h>
int main() {
printf("Hello World!\nI am learning C.\nAnd it is awesome!");
return 0;
}
Astuce : Deux \n caractères l'un après l'autre créeront une ligne vide :
Exemple
#include <stdio.h>
int main() {
printf("Hello World!\n\n");
printf("I am learning C.");
return 0;
}
Qu'est-ce que c'est \n exactement ?
Le caractère de saut de ligne (\n) est appelé une séquence d’échappement, et il force le curseur à
changer sa position au début de la ligne suivante sur l'écran. Il en résulte une nouvelle ligne.
Voici des exemples d'autres séquences d'échappement valides :
Sequence d'échappement Description
Crée un onglet
\t
horizontal
Insère un
caractère barre
\\
oblique inverse
(\)
Insère un
\" guillemet
double
Commentaires en C
Les commentaires peuvent être utilisés pour expliquer le code et le rendre plus lisible. Il peut
également être utilisé pour empêcher l'exécution lors du test d'un code alternatif.
Les commentaires peuvent être monolignes ou multilignes.
Commentaires multilignes
Les commentaires multilignes commencent par /*et se terminent par */.
Tout texte entre /*et */sera ignoré par le compilateur :
Exemple
/* The code below will print the words Hello World!
to the screen, and it is amazing */
printf("Hello World!");
C'est à vous de décider lequel vous souhaitez utiliser. Normalement, nous l'utilisons //pour des
commentaires courts et /* */plus longs.
Bon à savoir : Avant la version C99 (sortie en 1999), vous ne pouviez utiliser que des
commentaires multilignes en C.
Variables C
Les variables sont des conteneurs pour stocker des valeurs de données, comme des nombres et des
caractères.
En C, il existe différents types de variables (définies avec différents mots clés), par exemple :
• int- stocke des nombres entiers (nombres entiers), sans décimales, comme 123ou-123
• float- stocke des nombres à virgule flottante, avec des décimales, telles que 19.99ou-19.99
• char- stocke des caractères uniques, tels que 'a'ou 'B'. Les valeurs char sont entourées de
guillemets simples
Variables de sortie
Vous pouvez sortir des valeurs/imprimer du texte avec la printf()fonction :
Exemple
printf("Hello World!");
Dans de nombreux autres langages de programmation (comme Python , Java et C++ ), vous
utiliseriez normalement une fonction d'impression pour afficher la valeur d'une variable.
Cependant, ce n'est pas possible en C:
Exemple
int myNum = 15;
printf(myNum); // Nothing happens
Pour sortir des variables en C, vous devez vous familiariser avec quelque chose appelé
"spécificateurs de format".
Spécificateurs de format
Les spécificateurs de format sont utilisés avec la printf() fonction pour indiquer au compilateur
quel type de données la variable stocke. Il s'agit essentiellement d'un espace réservé pour la valeur
de la variable.
Un spécificateur de format commence par un signe de pourcentage %, suivi d'un caractère.
Par exemple, pour afficher la valeur d'une int variable, vous devez utiliser le spécificateur de
format %d ou %i entouré de guillemets doubles, à l'intérieur de la printf()fonction :
Exemple
int myNum = 15;
printf("%d", myNum); // Outputs 15
Pour imprimer d'autres types, utilisez %c for char et %f for float:
Exemple
// Create variables
int myNum = 15; // Integer (whole number)
float myFloatNum = 5.99; // Floating point number
char myLetter = 'D'; // Character
// Print variables
printf("%d\n", myNum);
printf("%f\n", myFloatNum);
printf("%c\n", myLetter);
Pour combiner à la fois du texte et une variable, séparez-les par une virgule à l'intérieur de la
printf()fonction :
Exemple
int myNum = 15;
printf("My favorite number is: %d", myNum);
Pour imprimer différents types dans une seule printf()fonction, vous pouvez utiliser ce qui suit
:
Exemple
int myNum = 15;
char myLetter = 'D';
printf("My number is %d and my letter is %c", myNum, myLetter);
Modifier les valeurs des variables
Remarque : Si vous affectez une nouvelle valeur à une variable existante, elle écrasera la valeur
précédente :
Exemple
int myNum = 15; // myNum is 15
myNum = 10; // Now myNum is 10
Vous pouvez également affecter la valeur d'une variable à une autre :
Exemple
int myNum = 15;
// Print variables
printf("Student id: %d\n", studentID);
printf("Student age: %d\n", studentAge);
printf("Student fee: %f\n", studentFee);
printf("Student grade: %c", studentGrade);
Types de données
Une variable en C doit être un type de données spécifié, et vous devez utiliser un spécificateur de
format à l'intérieur de la printf()fonction pour l'afficher :
Exemple
// Create variables
int myNum = 5; // Integer (whole number)
float myFloatNum = 5.99; // Floating point number
char myLetter = 'D'; // Character
// Print variables
printf("%d\n", myNum);
printf("%f\n", myFloatNum);
printf("%c\n", myLetter);
Types de données de base
Le type de données spécifie la taille et le type d'informations que la variable stockera.
Nous allons nous concentrer sur les plus basiques :
Data Type Size Description
int 2 or 4 bytes Stores whole numbers, without decimals
Stores fractional numbers, containing one or more decimals. Sufficient
float 4 bytes
for storing 6-7 decimal digits
Stores fractional numbers, containing one or more decimals. Sufficient
double 8 bytes
for storing 15 decimal digits
char 1 byte Stores a single character/letter/number, or ASCII values
printf("%f\n", myFloatNum); // Default will show 6 digits after the decimal point
printf("%.1f\n", myFloatNum); // Only show 1 digit
printf("%.2f\n", myFloatNum); // Only show 2 digits
printf("%.4f", myFloatNu m); // Only show 4 digits
Conversion de type
Parfois, vous devez convertir la valeur d'un type de données en un autre type. C'est ce qu'on appelle
la conversion de type.
Par exemple, si vous essayez de diviser deux nombres entiers 5 par 2, vous vous attendez à ce que
le résultat soit 2.5. Mais comme nous travaillons avec des entiers (et non des valeurs à virgule
flottante), l'exemple suivant affichera simplement 2 :
Exemple
int x = 5;
int y = 2;
int sum = 5 / 2;
printf("%d", sum); // Outputs 2
Pour obtenir le bon résultat, vous devez savoir comment fonctionne la conversion de type.
Il existe deux types de conversion en C :
• Conversion implicite (automatiquement)
• Conversion explicite (manuellement)
Conversion implicite
La conversion implicite est effectuée automatiquement par le compilateur lorsque vous affectez
une valeur d'un type à un autre.
Par exemple, si vous affectez une int valeur à un floatt ype :
Exemple
// Automatic conversion: int to float
float myFloat = 9;
printf("%f", myFloat); // 9.000000
Comme vous pouvez le voir, le compilateur convertit automatiquement la valeur int 9 en une
valeur flottante de 9.000000.
Cela peut être risqué, car vous pourriez perdre le contrôle de valeurs spécifiques dans certaines
situations.
Surtout si c'était l'inverse - l'exemple suivant convertit automatiquement la valeur float 9.99 en
une valeur int de 9:
Exemple
// Automatic conversion: float to int
int myInt = 9.99;
printf("%d", myInt); // 9
Que s'est-il passé .99 ? Nous voudrions peut-être ces données dans notre programme ! Donc sois
prudent. Il est important que vous sachiez comment le compilateur fonctionne dans ces situations,
pour éviter des résultats inattendus.
Comme autre exemple, si vous divisez deux nombres entiers : 5 par 2, vous savez que la somme
est 2.5. Et comme vous le savez depuis le début de cette page, si vous stockez la somme sous
forme d'entier, le résultat n'affichera que le nombre 2. Par conséquent, il serait préférable de stocker
la somme sous la forme a float ou a double, n'est-ce pas ?
Exemple
float sum = 5 / 2;
Constantes
Si vous ne voulez pas que les autres (ou vous-même) modifient les valeurs des variables existantes,
vous pouvez utiliser le mot-cle const.
Cela déclarera la variable comme "constante", ce qui signifie non modifiable et en lecture seule :
Exemple
const int myNum = 15; // myNum will always be 15
myNum = 10; // error: assignment of read-only variable 'myNum'
Vous devez toujours déclarer la variable comme constante lorsque vous avez des valeurs peu
susceptibles de changer :
Exemple
const int minutesPerHour = 60;
const float PI = 3.14;
Bonnes pratiques
Une autre chose à propos des variables constantes est qu'il est considéré comme une bonne pratique
de les déclarer en majuscules. Ce n'est pas obligatoire, mais utile pour la lisibilité du code et
commun aux programmeurs C :
Exemple
const int BIRTHYEAR = 1980;
Les opérateurs
Les opérateurs sont utilisés pour effectuer des opérations sur des variables et des valeurs.
Dans l'exemple ci-dessous, nous utilisons l' + opérateur pour additionner deux valeurs :
Exemple
int myNum = 100 + 50;
Bien que l' +opérateur soit souvent utilisé pour additionner deux valeurs, comme dans l'exemple
ci-dessus, il peut également être utilisé pour additionner une variable et une valeur, ou une variable
et une autre variable :
Exemple
int sum1 = 100 + 50; // 150 (100 + 50)
int sum2 = sum1 + 250; // 400 (150 + 250)
int sum3 = sum2 + sum2; // 800 (400 + 400)
C divise les opérateurs dans les groupes suivants :
• Opérateurs arithmétiques
• Opérateurs d'affectation
• Opérateurs de comparaison
• Opérateurs logiques
• Opérateurs au niveau du bit
Opérateurs arithmétiques
Les opérateurs arithmétiques sont utilisés pour effectuer des opérations mathématiques courantes.
Operator Name Description Example
+ Addition Adds together two values x+y
- Subtraction Subtracts one value from another x-y
* Multiplication Multiplies two values x*y
/ Division Divides one value by another x/y
% Modulus Returns the division remainder x%y
++ Increment Increases the value of a variable by 1 ++x
-- Decrement Decreases the value of a variable by 1 --x
Opérateurs d'affectation
Les opérateurs d'affectation sont utilisés pour affecter des valeurs aux variables.
Dans l'exemple ci-dessous, nous utilisons l’opérateur d’affectation (=) pour affecter la valeur 10 à
une variable appelée x :
Exemple
int x = 10;
L’opérateur d'affectation d'addition (+=) ajoute une valeur à une variable :
Exemple
int x = 10;
x += 5;
Une liste de tous les opérateurs d'affectation :
Operator Example Same As
= x=5 x=5
+= x += 3 x=x+3
-= x -= 3 x=x-3
*= x *= 3 x=x*3
/= x /= 3 x=x/3
%= x %= 3 x=x%3
&= x &= 3 x=x&3
|= x |= 3 x=x|3
^= x ^= 3 x=x^3
>>= x >>= 3 x = x >> 3
<<= x <<= 3 x = x << 3
Opérateurs de comparaison
Les opérateurs de comparaison sont utilisés pour comparer deux valeurs (ou variables). Ceci est
important dans la programmation, car cela nous aide à trouver des réponses et à prendre des
décisions.
La valeur de retour d'une comparaison est soit 1 ou 0, ce qui signifie vrai (1) ou faux (0). Ces
valeurs sont appelées valeurs booléennes
Dans l'exemple suivant, nous utilisons l’opérateur supérieur à (>) pour savoir si 5 est supérieur à
3:
Exemple
int x = 5;
int y = 3;
printf("%d", x > y); // returns 1 (true) because 5 is greater than 3
Une liste de tous les opérateurs de comparaison :
Operator Name Example
== Equal to x == y
!= Not equal x! = y
Greater
> x>y
than
< Less than x<y
Greater
>= than or x >= y
equal to
Less than
<= x <= y
or equal to
Opérateurs logiques
Vous pouvez également tester les valeurs vraies ou fausses avec des opérateurs logiques.
Les opérateurs logiques sont utilisés pour déterminer la logique entre les variables ou les valeurs :
Operator Name Description Example
&& Logical and Returns true if both statements are true x < 5 && x < 10
|| Logical or Returns true if one of the statements is true x < 5 || x < 4
Reverse the result, returns false if the result
! Logical not !(x < 5 && x < 10)
is true
Taille de l'opérateur
La taille mémoire (en octets) d'un type de données ou d'une variable peut être trouvée avec sizeof
opérateur :
Exemple
int myInt;
float myFloat;
double myDouble;
char myChar;
printf("%lu\n", sizeof(myInt));
printf("%lu\n", sizeof(myFloat));
printf("%lu\n", sizeof(myDouble));
printf("%lu\n", sizeof(myChar));
Notez que nous utilisons le %lu spécificateur de format pour imprimer le résultat, au lieu de %d.
C'est parce que le compilateur s'attend à ce que l'opérateur sizeof renvoie un long unsigned int(
%lu), au lieu de int( %d). Sur certains ordinateurs, cela peut fonctionner avec %d, mais il est plus
sûr d'utiliser %lu.
Booléens
Très souvent, en programmation, vous aurez besoin d'un type de données qui ne peut avoir qu'une
des deux valeurs, comme :
• OUI NON
• ALLUMÉ ÉTEINT
• VRAI FAUX
Pour cela, C a un bool type de données, appelé booleans.
Les booléens représentent des valeurs qui sont soit true ou false.
Variables booléennes
En C, le bool type n'est pas un type de données intégré, comme int ou char.
Il a été introduit dans C99 et vous devez importer le fichier d'en-tête suivant pour l'utiliser :
#include <stdbool.h>
Une variable booléenne est déclarée avec le bool mot clé et ne peut prendre que les valeurs true
ou false :
bool isProgrammingFun = true;
bool isFishTasty = false;
Avant d'essayer d'imprimer les variables booléennes, vous devez savoir que les valeurs booléennes
sont renvoyées sous forme d'entiers :
• 1 (ou tout autre nombre différent de 0) représente true
• 0 représente false
Par conséquent, vous devez utiliser le %d spécificateur de format pour imprimer une valeur
booléenne :
Exemple
// Create boolean variables
bool isProgrammingFun = true;
bool isFishTasty = false;
Exemple réel
Pensons à un "exemple réel" où nous devons savoir si une personne est assez âgée pour voter.
Dans l'exemple ci-dessous, nous utilisons l’opérateur >= de comparaison pour savoir si l'âge (25)
est supérieur OU égal à la limite d'âge pour voter, qui est fixée à 18 :
Exemple
int myAge = 25;
int votingAge = 18;
printf("%d", myAge >= votingAge); // Returns 1 (true), meaning 25 year olds are allowed to vote!
Une approche encore meilleure (puisque nous sommes sur une lancée maintenant), serait
d'envelopper le code ci-dessus dans une if...else déclaration, afin que nous puissions effectuer
différentes actions en fonction du résultat :
Exemple
Sortie "Assez vieux pour voter !" si myAge est supérieur ou égal à 18. Sinon, affichez "Pas assez
vieux pour voter." :
int myAge = 25;
int votingAge = 18;
Conditions et instructions If
Vous avez déjà appris que C supporte les conditions logiques usuelles des mathématiques :
• Inférieur à: a < b
• Inférieur ou égal à: a <= b
• Supérieur à: a > b
• Supérieur ou égal à: a >= b
• Égal à a == b
• Différent de: a!= b
Vous pouvez utiliser ces conditions pour effectuer différentes actions pour différentes décisions.
C contient les instructions conditionnelles suivantes :
• Utilisez if pour spécifier un bloc de code à exécuter, si une condition spécifiée est true
• Utilisez else de spécifier un bloc de code à exécuter, si la même condition est false
• Utilisez else ifpour spécifier une nouvelle condition à tester, si la première condition est false
• Utilisez switch pour spécifier de nombreux blocs de code alternatifs à exécuter
L'instruction if
Utilisez l'instruction if pour spécifier un bloc de code à exécuter si une condition est true.
Syntaxe
if (condition) {
// block of code to be executed if the condition is true
}
Notez que if c'est en lettres minuscules. Les lettres majuscules (If ou IF) généreront une erreur.
Dans l'exemple ci-dessous, nous testons deux valeurs pour savoir si 20 est supérieur à 18. Si la
condition est true, imprimez du texte :
Exemple
if (20 > 18) {
printf("20 is greater than 18");
}
On peut aussi tester des variables :
Exemple
int x = 20;
int y = 18;
if (x > y) {
printf("x is greater than y");
}
Exemple expliqué
Dans l'exemple ci-dessus, nous utilisons deux variables, x et y , pour tester si x est supérieur à y (à
l'aide de l' opérateur >). Comme x est 20, et y est 18, et nous savons que 20 est supérieur à 18, nous
affichons à l'écran que "x est supérieur à y".
La déclaration d'autre
Utilisez l’instruction else pour spécifier un bloc de code à exécuter si la condition est false.
Syntaxe
if (condition) {
// block of code to be executed if the condition is true
} else {
// block of code to be executed if the condition is false
}
Exemple
int time = 20;
if (time < 18) {
printf("Good day.");
} else {
printf("Good evening.");
}
// Outputs "Good evening."
Exemple expliqué
Dans l'exemple ci-dessus, le temps (20) est supérieur à 18, donc la condition est false. Pour cette
raison, nous passons à la else condition et imprimons à l'écran "Bonsoir". Si l'heure était inférieure
à 18, le programme imprimerait "Bonne journée".
L'instruction else if
Utilisez l’instruction else if pour spécifier une nouvelle condition si la première condition est
false.
Syntaxe
if (condition1) {
// block of code to be executed if condition1 is true
} else if (condition2) {
// block of code to be executed if the condition1 is false and condition2 is true
} else {
// block of code to be executed if the condition1 is false and condition2 is false
}
Exemple
int time = 22;
if (time < 10) {
printf("Good morning.");
} else if (time < 20) {
printf("Good day.");
} else {
printf("Good evening.");
}
// Outputs "Good evening."
Exemple expliqué
Dans l'exemple ci-dessus, le temps (22) est supérieur à 10, donc la première condition est false.
La condition suivante, dans la déclaration else if, est également false, nous passons donc à la
else condition puisque condition1 et condition2 sont les deux false- et affichons à l'écran
"Bonsoir".
Cependant, si l'heure était 14h, notre programme afficherait "Bonne journée".
Un autre exemple
Cet exemple montre comment vous pouvez utiliser if..else pour savoir si un nombre est positif
ou négatif :
Exemple
int myNum = 10; // Is this a positive or negative number?
if (myNum > 0) {
printf("The value is a positive number.");
} else if (myNum < 0) {
printf("The value is a negative number.");
} else {
printf("The value is 0.");
}
switch (day) {
case 1:
printf("Monday");
break;
case 2:
printf("Tuesday");
break;
case 3:
printf("Wednesday");
break;
case 4:
printf("Thursday");
break;
case 5:
printf("Friday");
break;
case 6:
printf("Saturday");
break;
case 7:
printf("Sunday");
break;
}
switch (day) {
case 6:
printf("Today is Saturday");
break;
case 7:
printf("Today is Sunday");
break;
default:
printf("Looking forward to the Weekend");
}
Boucles
Les boucles peuvent exécuter un bloc de code tant qu'une condition spécifiée est atteinte.
Les boucles sont pratiques car elles permettent de gagner du temps, de réduire les erreurs et de
rendre le code plus lisible.
while (i < 5) {
printf("%d\n", i);
i++;
}
Remarque : N'oubliez pas d'augmenter la variable utilisée dans la condition (i++), sinon la boucle
ne se terminera jamais !
do {
printf("%d\n", i);
i++;
}
while (i < 5);
N'oubliez pas d'augmenter la variable utilisée dans la condition, sinon la boucle ne se terminera
jamais !
Pour la boucle
Lorsque vous savez exactement combien de fois vous voulez parcourir un bloc de code, utilisez
la boucle for au lieu d'une boucle while :
Syntaxe
for (statement 1; statement 2; statement 3) {
// code block to be executed
}
L’instruction 1 est exécutée (une fois) avant l'exécution du bloc de code.
L’instruction 2 définit la condition d'exécution du bloc de code.
L’instruction 3 est exécutée (à chaque fois) après l'exécution du bloc de code.
L'exemple ci-dessous imprimera les chiffres de 0 à 4 :
Exemple
int i;
Un autre exemple
Cet exemple n'imprimera que les valeurs paires entre 0 et 10 :
Exemple
for (i = 0; i <= 10; i = i + 2) {
printf("%d\n", i);
}
Boucles imbriquées
Il est également possible de placer une boucle à l'intérieur d'une autre boucle. C'est ce qu'on appelle
une boucle imbriquée.
La "boucle interne" sera exécutée une fois pour chaque itération de la "boucle externe” :
Exemple
int i, j;
// Outer loop
for (i = 1; i <= 2; ++i) {
printf("Outer: %d\n", i); // Executes 2 times
// Inner loop
for (j = 1; j <= 3; ++j) {
printf(" Inner: %d\n", j); // Executes 6 times (2 * 3)
}
}
Pause
L’instruction break utilisée dans un chapitre précédent. Il a été utilisé pour "sauter" d'une switch
déclaration.
L’instruction break peut également être utilisée pour sortir d'une boucle.
Cet exemple sort de la boucle for lorsque i est égal à 4 :
Exemple
int i;
Continuer
L’instruction continue interrompt une itération (dans la boucle), si une condition spécifiée se
produit, et continue avec l'itération suivante dans la boucle.
Cet exemple ignore la valeur de 4 :
Exemple
int i;
// Outputs 25
printf("%d", myNumbers[0]);
// Add elements
myNumbers[0] = 25;
myNumbers[1] = 50;
myNumbers[2] = 75;
myNumbers[3] = 100;
En utilisant cette méthode, vous devez connaître la taille du tableau, afin que le programme
stocke suffisamment de mémoire.
Vous ne pouvez pas modifier la taille du tableau après sa création.
Tableaux multidimensionnels
Vous avez découvert les tableaux , également appelés tableaux à une dimension. C'est quelque
chose que vous utiliserez beaucoup lors de la programmation en C. Cependant, si vous voulez
stocker des données sous forme de tableau, comme un tableau avec des lignes et des colonnes, vous
devez vous familiariser avec les tableaux multidimensionnels.
Un tableau multidimensionnel est essentiellement un tableau de tableaux.
Les tableaux peuvent avoir n'importe quel nombre de dimensions. Nous présenterons les plus
courantes ; tableaux à deux dimensions (2D).
Tableaux bidimensionnels
Un tableau 2D est également connu sous le nom de matrice (un tableau de lignes et de colonnes).
Pour créer un tableau 2D d'entiers, regardez l'exemple suivant :
int matrix[2][3] = { {1, 4, 2}, {3, 6, 8} };
La première dimension représente le nombre de lignes [2], tandis que la deuxième dimension
représente le nombre de colonnes [3]. Les valeurs sont placées dans l'ordre des lignes et peuvent
être visualisées comme suit :
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 3; j++) {
printf("%d\n", matrix[i][j]);
}
}
Chaine de caractères
Les chaînes sont utilisées pour stocker du texte/des caractères.
Par exemple, "Hello World" est une chaîne de caractères.
Contrairement à de nombreux autres langages de programmation, C n'a pas de type String pour
créer facilement des variables de chaîne. Au lieu de cela, vous devez utiliser le type char et créer
un tableau de caractères pour créer une chaîne en C :
char greetings [] = "Hello World!";
Notez que vous devez utiliser des guillemets doubles ("").
Pour générer la chaîne, vous pouvez utiliser la printf()fonction avec le spécificateur de format
%s pour indiquer à C que nous travaillons maintenant avec des chaînes :
Exemple
char greetings [] = "Hello World!";
printf("%s", greetings);
Chaînes d'accès
Étant donné que les chaînes sont en fait des tableaux en C, vous pouvez accéder à une chaîne en
vous référant à son numéro d'index entre crochets [].
Cet exemple imprime le premier caractère (0) dans les messages d’accueil :
Exemple
char greetings [] = "Hello World!";
printf("%c", greetings[0]);
Notez que nous devons utiliser le %c spécificateur de format pour imprimer un seul caractère.
Différences
La différence entre les deux façons de créer des chaînes est que la première méthode est plus facile
à écrire et vous n'avez pas besoin d'inclure le \0 caractère, car C le fera pour vous.
Vous devez noter que la taille des deux tableaux est la même : ils ont tous les deux 13 caractères
(l'espace compte également comme un caractère d'ailleurs), y compris le \0 caractère :
Exemple
char greetings [] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0'};
char greetings2[] = "Hello World!";
Fonctions de chaîne
C a également de nombreuses fonctions de chaîne utiles, qui peuvent être utilisées pour effectuer
certaines opérations sur les chaînes.
Pour les utiliser, vous devez inclure le <string.h>fichier d'en-tête dans votre programme :
#include <string.h>
Longueur de chaine
Par exemple, pour obtenir la longueur d'une chaîne, vous pouvez utiliser la strlen()fonction :
Exemple
char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("%d", strlen(alphabet));
Dans le chapitre Chaînes , nous avions l'habitude sizeof d'obtenir la taille d'une chaîne/d'un
tableau. Notez que sizeof et strlen se comporte différemment, car sizeof inclut également le
\0 caractère lors du comptage :
Exemple
char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("%d", strlen(alphabet)); // 26
printf("%d", sizeof(alphabet)); // 27
Il est également important que vous sachiez que sizeof renverra toujours la taille de la mémoire
(en octets), et non la longueur réelle de la chaîne :
Exemple
char alphabet[50] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("%d", strlen(alphabet)); // 26
printf("%d", sizeof(alphabet)); // 50
// Print str1
printf("%s", str1);
Notez que la taille de str1 doit être suffisamment grande pour stocker le résultat des deux chaînes
combinées (20 dans notre exemple).
// Print str2
printf("%s", str2);
Notez que la taille de str2 doit être suffisamment grande pour stocker la chaîne copiée (20 dans
notre exemple).
Entrée utilisateur
Vous avez déjà appris que printf()est utilisé pour sortir des valeurs en C.
Pour obtenir l'entrée de l’utilisateur, vous pouvez utiliser la scanf()fonction :
Exemple
Sortie d'un nombre saisi par l'utilisateur :
// Create an integer variable that will store the number we get from the user
int myNum;
Entrées multiples
La scanf()fonction autorise également plusieurs entrées (un entier et un caractère dans l'exemple
suivant) :
Exemple
// Create an int and a char variable
int myNum;
char myChar;
// Ask the user to type a number AND a character
printf("Type a number AND a character and press enter: \n");
// Get and save the number AND character the user types
scanf("%d %c", &myNum, &myChar);
Adresse mémoire
Lorsqu'une variable est créée en C, une adresse mémoire est affectée à la variable.
L'adresse mémoire est l'emplacement où la variable est stockée sur l'ordinateur.
Lorsque nous attribuons une valeur à la variable, elle est stockée dans cette adresse mémoire.
Pour y accéder, utilisez l'opérateur de référence (&), et le résultat représente l'endroit où la variable
est stockée :
Exemple
int myAge = 43;
printf("%p", &myAge); // Outputs 0x7ffe5367e044
Remarque : L'adresse mémoire est au format hexadécimal (0x..). Vous n'obtiendrez peut-être pas
le même résultat dans votre programme.
Vous devez également noter qu'il &myAge est souvent appelé "pointeur". Un pointeur stocke
essentiellement l'adresse mémoire d'une variable comme sa valeur. Pour imprimer des valeurs de
pointeur, nous utilisons le %pspécificateur de format.
Création de pointeurs
Vous avez appris du chapitre précédent, qu'on peut obtenir l’adresse mémoire d'une variable avec
l'opérateur de référence & :
Exemple
int myAge = 43; // an int variable
Déréférence
Dans l'exemple ci-dessus, nous avons utilisé la variable de pointeur pour obtenir l'adresse mémoire
d'une variable (utilisée avec l’opérateur de & référence).
Cependant, vous pouvez également obtenir la valeur de la variable vers laquelle pointe le pointeur,
en utilisant l' opérateur * (l' opérateur de déréférencement ) :
Exemple
int myAge = 43; // Variable declaration
int* ptr = &myAge; // Pointer declaration
// Reference: Output the memory address of myAge with the pointer (0x7ffe5367e044)
printf("%p\n", ptr);
Bon à savoir : Il existe trois manières de déclarer des variables de pointeur, mais la première est
principalement utilisée :
int* myNum; // Most used
int *myNum;
int * myNum;
Fonctions prédéfinies
Il s'avère donc que vous savez déjà ce qu'est une fonction.
Par exemple, main()est une fonction, qui est utilisée pour exécuter du code, et printf()est une
fonction ; utilisé pour afficher/imprimer du texte à l'écran :
Exemple
int main() {
printf("Hello World!");
return 0;
}
int main() {
myFunction(); // call the function
return 0;
}
int main() {
myFunction();
myFunction();
myFunction();
return 0;
}
Paramètres de la fonction C
Paramètres et arguments
Les informations peuvent être transmises aux fonctions en tant que paramètre. Les paramètres
agissent comme des variables à l'intérieur de la fonction.
Les paramètres sont spécifiés après le nom de la fonction, entre parenthèses. Vous pouvez ajouter
autant de paramètres que vous le souhaitez, il vous suffit de les séparer par une virgule :
Syntaxe
returnType functionName(parameter1, parameter2, parameter3) {
// code to be executed
}
La fonction suivante qui prend une chaîne de caractères avec le nom comme paramètre. Lorsque
la fonction est appelée, nous transmettons un nom, qui est utilisé à l'intérieur de la fonction pour
imprimer "Bonjour" et le nom de chaque personne.
Exemple
void myFunction(char name[]) {
printf("Hello %s\n", name);
}
int main() {
myFunction("Liam");
myFunction("Jenny");
myFunction("Anja");
return 0;
}
// Hello Liam
// Hello Jenny
// Hello Anja
Lorsqu'un paramètre est passé à la fonction, il est appelé argument. Ainsi, à partir de l'exemple
ci-dessus : name est un paramètre tandis que Liam, Jenny et Anja sont des arguments.
Paramètres multiples
Dans la fonction, vous pouvez ajouter autant de paramètres que vous le souhaitez :
Exemple
void myFunction(char name[], int age) {
printf("Hello %s. You are %d years old.\n", name, age);
}
int main() {
myFunction("Liam", 3);
myFunction("Jenny", 14);
myFunction("Anja", 30);
return 0;
}
int main() {
int myNumbers[5] = {10, 20, 30, 40, 50};
myFunction(myNumbers);
return 0;
}
Exemple expliqué
La fonction ( myFunction) prend un tableau comme paramètre ( int myNumbers[5]) et parcourt
les éléments du tableau avec la boucle for.
Lorsque la fonction est appelée à l'intérieur main()de , nous transmettons le tableau myNumbers,
qui génère les éléments du tableau.
Notez que lorsque vous appelez la fonction, vous n'avez qu'à utiliser le nom du tableau lorsque
vous le passez en argument myFunction(myNumbers). Cependant, la déclaration complète du
tableau est nécessaire dans le paramètre de fonction ( int myNumbers[5]).
Valeurs de retour
Le mot-clé void, utilisé dans les exemples précédents, indique que la fonction ne doit pas renvoyer
de valeur. Si vous souhaitez que la fonction renvoie une valeur, vous pouvez utiliser un type de
données (tel que int ou float, etc.) au lieu de void, et utiliser le mot clé return à l'intérieur de
la fonction :
Exemple
int myFunction(int x) {
return 5 + x;
}
int main() {
printf("Result is: %d", myFunction(3));
return 0;
}
// Outputs 8 (5 + 3)
Cet exemple retourne la somme d'une fonction à deux paramètres :
Exemple
int myFunction(int x, int y) {
return x + y;
}
int main() {
printf("Result is: %d", myFunction(5, 3));
return 0;
}
// Outputs 8 (5 + 3)
Vous pouvez également stocker le résultat dans une variable :
Exemple
int myFunction(int x, int y) {
return x + y;
}
int main() {
int result = myFunction(5, 3);
printf("Result is = %d", result);
return 0;
}
// Outputs 8 (5 + 3)
int main() {
myFunction(); // call the function
return 0;
}
Une fonction se compose de deux parties :
• Declaration: le nom de la fonction, le type de retour et les paramètres (le cas échéant)
• Définition: le corps de la fonction (code à exécuter)
void myFunction() { // declaration
// the body of the function (definition)
}
Pour l'optimisation du code, il est recommandé de séparer la déclaration et la définition de la
fonction.
Vous verrez souvent des programmes C qui ont une déclaration de fonction ci-dessus main()et une
définition de fonction ci-dessous main(). Cela rendra le code mieux organisé et plus facile à lire :
Exemple
// Function declaration
void myFunction();
// Function definition
void myFunction() {
printf("I just got executed!");
}
Un autre exemple
Si nous utilisons l'exemple du chapitre précédent concernant les paramètres de fonction et les
valeurs de retour :
Exemple
int myFunction(int x, int y) {
return x + y;
}
int main() {
int result = myFunction(5, 3);
printf("Result is = %d", result);
return 0;
}
// Outputs 8 (5 + 3)
Il est considéré comme une bonne pratique de l'écrire comme ceci à la place :
Exemple
// Function declaration
int myFunction(int, int);
// Function definition
int myFunction(int x, int y) {
return x + y;
}
Récursivité
La récursivité est la technique permettant à une fonction de s'appeler elle-même. Cette technique
permet de décomposer des problèmes compliqués en problèmes simples plus faciles à résoudre.
La récursivité peut être un peu difficile à comprendre. La meilleure façon de comprendre comment
cela fonctionne est de l'expérimenter.
Exemple de récursivité
Additionner deux nombres ensemble est facile à faire, mais ajouter une plage de nombres est plus
compliqué. Dans l'exemple suivant, la récursivité est utilisée pour additionner une plage de
nombres en la décomposant en la simple tâche d'additionner deux nombres :
Exemple
int sum(int k);
int main() {
int result = sum(10);
printf("%d", result);
return 0;
}
int sum(int k) {
if (k > 0) {
return k + sum(k - 1);
} else {
return 0;
}
}
Exemple expliqué
Lorsque la sum()fonction est appelée, elle ajoute un paramètre kà la somme de tous les nombres
inférieurs à ket renvoie le résultat. Lorsque k devient 0, la fonction renvoie simplement 0. Lors de
l'exécution, le programme suit ces étapes :
(9)
10 + sum (9)
10 + (9 + sum (8))
10 + (9 + (8 + sum (7))) ...
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + sum (0)
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0+ s8) )
10 + ( 9 + ( 8 +
Comme la fonction ne s'appelle pas quand k vaut 0, le programme s'arrête là et renvoie le résultat.
Le développeur doit être très prudent avec la récursivité car il peut être assez facile de se glisser
dans l'écriture d'une fonction qui ne se termine jamais, ou qui utilise des quantités excessives de
mémoire ou de puissance de processeur. Cependant, lorsqu'elle est écrite correctement, la
récursivité peut être une approche de programmation très efficace et mathématiquement élégante.
Fonctions mathématiques
Il existe également une liste de fonctions mathématiques disponibles, qui vous permet d'effectuer
des tâches mathématiques sur des nombres.
Pour les utiliser, vous devez inclure le fichier math.h d'en-tête dans votre programme :
#include <math.h>
Racine carrée
Pour trouver la racine carrée d'un nombre, utilisez la sqrt() fonction :
Exemple
printf("%f", sqrt(16));
Arrondir un nombre
La fonction ceil() arrondit un nombre vers le haut à son entier le plus proche, et la méthode
floor() arrondit un nombre vers le bas à son entier le plus proche, et renvoie le résultat :
Exemple
printf("%f", ceil(1.4));
printf("%f", floor(1.4));
De puissance
La fonction pow() renvoie la valeur de x à la puissance y ( x y ):
Exemple
printf("%f", pow(4, 3));
Structures C
Les structures sont un moyen de regrouper plusieurs variables liées en un seul endroit. Chaque
variable de la structure est connue comme un membre de la structure.
Contrairement à un tableau , une structure peut contenir de nombreux types de données différents
(int, float, char, etc.).
int main() {
// Create a structure variable of myStructure called s1
struct myStructure s1;
// Print values
printf("My number: %d\n", s1.myNum);
printf("My letter: %c\n", s1.myLetter);
return 0;
}
Vous pouvez désormais créer facilement plusieurs variables de structure avec des valeurs
différentes, en utilisant une seule structure :
Exemple
// Create different struct variables
struct myStructure s1;
struct myStructure s2;
s2.myNum = 20;
s2.myLetter = 'C';
int main() {
struct myStructure s1;
return 0;
}
Une erreur se produira :
prog.c:12:15: error: assignment to expression with array type
Cependant, il existe une solution pour cela ! Vous pouvez utiliser la strcpy() fonction et attribuer
la valeur à s1.myString, comme ceci :
Exemple
struct myStructure {
int myNum;
char myLetter;
char myString[30]; // String
};
int main() {
struct myStructure s1;
return 0;
}
Résultat :
My string: Some text
int main() {
// Create a structure variable and assign values to it
struct myStructure s1 = {13, 'B', "Some text"};
// Print values
printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);
return 0;
}
Remarque : L'ordre des valeurs insérées doit correspondre à l'ordre des types de variables déclarés
dans la structure (13 pour int, 'B' pour char, etc.).
s2 = s1;
int main() {
// Create a structure variable and assign values to it
struct myStructure s1 = {13, 'B', "Some text"};
// Modify values
s1.myNum = 30;
s1.myLetter = 'C';
strcpy(s1.myString, "Something else");
// Print values
printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);
return 0;
}
La modification des valeurs est particulièrement utile lorsque vous copiez des valeurs de structure :
Exemple
// Create a structure variable and assign values to it
struct myStructure s1 = {13, 'B', "Some text"};
// Copy s1 values to s2
s2 = s1;
// Change s2 values
s2.myNum = 30;
s2.myLetter = 'C';
strcpy(s2.myString, "Something else");
// Print values
printf("%d %c %s\n", s1.myNum, s1.myLetter, s1.myString);
printf("%d %c %s\n", s2.myNum, s2.myLetter, s2.myString);
Ok, alors, comment les structures sont-elles utiles ?
Imaginez que vous deviez écrire un programme pour stocker différentes informations sur les
voitures, telles que la marque, le modèle et l'année. Ce qui est génial avec les structures, c'est que
vous pouvez créer un seul "modèle de voiture" et l'utiliser pour toutes les voitures que vous
fabriquez. Voir ci-dessous pour un exemple concret.
Exemple réel
Utilisez une structure pour stocker différentes informations sur Cars :
Exemple
struct Car {
char brand[50];
char model[50];
int year;
};
int main() {
struct Car car1 = {"BMW", "X5", 1999};
struct Car car2 = {"Ford", "Mustang", 1969};
struct Car car3 = {"Toyota", "Corolla", 2011};
return 0;
}
Énumérations C
Une énumération est un type spécial qui représente un groupe de constantes (valeurs non
modifiables).
Pour créer une énumération, utilisez le mot-clé enum, suivi du nom de l'énumération, et séparez les
éléments de l'énumération par une virgule :
enum Level {
LOW,
MEDIUM,
HIGH
};
Notez que le dernier élément n'a pas besoin de virgule.
Il n'est pas obligatoire d'utiliser des majuscules, mais souvent considéré comme une bonne pratique.
Enum est l'abréviation de "énumérations", ce qui signifie "spécifiquement répertorié".
Pour accéder à l'énumération, vous devez en créer une variable.
Dans la méthode main(), spécifiez le mot-clé enum, suivi du nom de l'énumération ( Level) puis
du nom de la variable enum ( myVar dans cet exemple) :
enum Level myVar;
Maintenant que vous avez créé une variable enum ( myVar), vous pouvez lui attribuer une valeur.
La valeur attribuée doit être l'un des éléments à l'intérieur de l'énumération ( LOW, MEDIUMou HIGH) :
enum Level myVar = MEDIUM;
Par défaut, le premier élément (LOW) a la valeur 0, le second (MEDIUM) a la valeur 1, etc.
Si vous essayez maintenant d'imprimer myVar, il affichera 1, ce qui représenteMEDIUM :
int main() {
// Create an enum variable and assign a value to it
enum Level myVar = MEDIUM;
return 0;
}
int main() {
enum Level myVar = MEDIUM;
switch (myVar) {
case 1:
printf("Low Level");
break;
case 2:
printf("Medium level");
break;
case 3:
printf("High level");
break;
}
return 0;
}
Pourquoi et quand utiliser les énumérations ?
Les énumérations sont utilisées pour donner des noms aux constantes, ce qui facilite la lecture et
la maintenance du code.
Utilisez des énumérations lorsque vous avez des valeurs dont vous savez qu'elles ne changeront
pas, comme les jours du mois, les jours, les couleurs, le jeu de cartes, etc.