Académique Documents
Professionnel Documents
Culture Documents
Définition
La programmation concerne toutes les actions liées au codage des programmes
informatiques à destination des différents systèmes informatiques (logiciels, sites
internet, applications mobiles et web, plugins, etc.).
Le On obtient un
programme programme en
Votre programme est de binaire que votre
écrit dans un langage traduction ordinateur
simplifié traduit en
« Fais le calcul 3 + 5 » comprend :
code 00101010110101010
« binaire » 010
Comment écrire un programme
But de la programmation
Dans le cadre de la conception de systèmes informatiques, la programmation est la
base du développement informatique. Son but est l’écriture du code source des
programmes pour l’implémentation des logiciels, site internet, application web et
mobile, services, plugins, chiffrements… Généralement, le développeur est le
professionnel qui gère cette programmation informatique et dispose des différentes
compétences techniques pour maitriser les langages informatiques tels que le C, C#,
PHP, le Javascript, l’HTML, le CSS,
Le langage C est à l’origine de nombreux logiciels, mais surtout des plus grands
systèmes d’exploitation.
Un autre langage, comme le C++ par exemple, est un dérivé qui apporte la possibilité
de faire de la programmation orientée objet. On parle parfois de surcouche, ce qui est
le cas, mais le code diffère tout de même.
Qualités et défauts
C est un des langages les plus utilisés car :
• Faible gestion des erreurs à cause du peu de vérifications offertes par les
compilateurs d'origine (K&R C), et l'absence de vérifications à l'exécution,
• Son approche de la modularité restée au niveau de ce qui se faisait au début
des années 1970, et largement dépassée depuis par d'autres langages :
o il ne facilite pas la programmation orientée objet,
• Il ne permet pas de créer des espaces de noms, le support très limité de
la généricité, malgré l’introduction des expressions à type générique en
C11 ;
• Les subtilités de l'écriture de programmes portables, car le comportement
exact des exécutables dépend de l'ordinateur cible ;
• Les bugs graves qui peuvent être causés par un simple manque d'attention
du développeur ; tel le dépassement de tampon qui constitue une faille de
sécurité informatique exploitable par les logiciels malveillants ;
• Certaines erreurs ne peuvent être détectées automatiquement qu'à l'aide
d'outils supplémentaires et non standardisés, comme lint et Valgrind ;
• La faible productivité du langage par rapport aux langages plus récents
Fonctionnement du langage C
C est un langage de programmation de bas niveau qui utilise un compilateur pour
effectuer l’opération de conversion du code source en langage de programmation en
code binaire. Le code source se trouve dans fichier ayant une extension .c.
Exemple : main.c, exercice.c, algo.c…
DevC++, Visual Studio code, Sublime Text, Code::Blocks, Eclipse, NetBeans, IntelliJ,
NotePad, NotePad++, Code Lite, XCode, KDevelop …
La syntaxe du langage
#include <stdio.h>
int main(void)
{
printf("hello, world\n");
return 0;
}
Le mot-clé void entre parenthèses signifie que la fonction n'a aucun paramètre
Les variables
Définition
Avant d'utiliser une variable, il faut tout d'abord la déclarer (c'est-à-dire la créer).
La déclaration se réfère donc à la création ou à l’instanciation de la variable
Exemple :
int a ;
double nombre ;
L’affectation
Lorsque la variable est déclarée, il est possible de l'affecter (ou lui donner une
valeur). L'opérateur = permet d'effectuer cette affectation.
Exemple :
a = 23 ;
nombre = 2.7 ;
Les types de variables
Définir le type d’une variable permet donc de préciser son contenu potentiel et ce que
nous pouvons faire avec. Le langage C fournit neuf types de base.
_Bool un entier
int un entier
float un réel
double un réel
Les types short int, int, long int et long long int servent tous à stocker des nombres
entiers qui peuvent prendre des valeurs positives, négatives, ou nulles. On dit qu’il
s’agit de types signés (car ils peuvent comporter un signe). Pour chacun de ces quatre
types, il existe un type équivalent dit non signé. Un type entier non signé est un type
entier qui n’accepte que des valeurs positives ou nulles : il ne peut pas stocker de
valeurs négatives. Pour déclarer des variables d’un type non signé, il vous suffit de
faire précéder le nom du type entier du mot-clé unsigned.
Le type _Bool est un type entier non signé un peu particulier : il permet de stocker soit
0, soit 1, on parle d’un booléen (nous verrons de quoi il s’agit un peu plus tard). À ce
titre, _Bool est le type entier non signé avec la plus faible capacité.
Le type char peut lui aussi servir à stocker des nombres. Il sert surtout au stockage de
caractères, mais ces derniers étant stockés dans l’ordinateur sous forme de nombres,
il est possible de stocker des nombres dans un char. Le seul problème, c’est que ce
type peut être signé ou non signé de base suivant les compilateurs. Pour éviter les
ennuis, spécifiez ce que vous souhaitez lors de la déclaration : non signé (unsigned
char) ou signé (signed char).
Les types float, double et long double permettent quant à eux de stocker des nombres
réels.
auto if unsigned
break inline void
case int volatile
char long while
const register _Alignas
continue restrict _Alignof
default return _Atomic
do short _Bool
double signed _Complex
else sizeof _Generic
enum static _Imaginary
extern struct _Noreturn
float switch _Static_assert
for typedef _Thread_local
goto union
On peut en l’occurrence utiliser la notation camel case pour nommer les variables :
nombre_de_vie = nombreDeVie.
NB : Le C fait la différence entre les majuscules et les minuscules (on dit qu’il respecte
la casse). Ainsi les trois identificateurs suivants sont différents.
variable
Variable
VaRiAbLe
return 0;
}
Les constantes
En plus d’attribuer une valeur à une variable, il est possible de préciser que cette
variable ne pourra pas être modifiée par la suite à l’aide du mot-clé const. Ceci peut
être utile pour stocker une valeur qui ne changera jamais (comme la constante \piπ qui
vaut toujours 3,14159265).
Notez qu’il n’y a aucune limite au nombre d’affectations, comme le démontre l’exemple
ci-dessous.
petite_valeur = 2;
petite_valeur = 4;
petite_valeur = 8;
petite_valeur = 16;
petite_valeur = 8;
petite_valeur = 4;
petite_valeur = 2;
À chaque affectation, la variable va prendre une nouvelle valeur. Par contre, on ne met
pas le type quand on veut changer la valeur, sinon il y aura une erreur du type
« redefinition of 'nom_de_votre_variable' » car on aurait créé deux variables avec le
même identificateur !
Les entrées/sorties
Les entrées/sorties (E/S) en programmation C sont les mécanismes qui permettent à
un programme de communiquer avec l'utilisateur et le monde extérieur. Les fonctions
d'E/S sont essentielles pour afficher des résultats à l'écran, lire des données depuis
la console, et manipuler des fichiers.
b. Importance
Les E/S sont cruciales pour rendre les programmes interactifs. Elles permettent à
l'utilisateur de fournir des informations au programme et d'obtenir des résultats en
retour. Sans un mécanisme d'E/S efficace, un programme serait limité dans son
utilité pratique.
La sortie standard
printf()
La fonction printf() est utilisée pour afficher des données à la console. Elle utilise des
spécificateurs de format pour définir le type de données à afficher.
Exemple :
Format Description
%d Une donnée entière de type int
Une donnée entière de type int. Si la valeur est inférieure à 100, des caractères
%3d
blancs sont ajoutés pour compléter sur 3 caractères.
Une donnée entière de type int. Si la valeur est inférieure à 100, des caractères 0
%03d
sont ajoutés pour compléter sur 3 caractères.
Une donnée décimale de type double, affichée au total sur cinq caractères (.
%5.2lf
compris) et avec deux chiffres après le caractère de séparation.
%10s Une donnée de type chaîne de caractères sur 10 caractères alignés par la droite.
Une donnée de type adresse en mémoire. Cette adresse sera présentée sous
%p
forme hexadécimale.
puts()
La fonction puts() est spécialement conçue pour afficher des chaînes de caractères.
Elle ajoute automatiquement un saut de ligne à la fin.
Exemple :
L’entrée standard
scanf()
La fonction scanf() est utilisée pour lire des données depuis la console. Elle utilise
des spécificateurs de format pour indiquer le type de données à lire.
Exemple :
getchar()
La fonction getchar() permet de lire un seul caractère depuis la console. Elle est
souvent utilisée pour attendre une pression sur la touche "Entrée".
Exemple :
La fonction gets() était autrefois utilisée pour lire une chaîne de caractères depuis la
console en langage C. Cependant, elle a été dépréciée en raison de problèmes de
sécurité, car elle ne prend pas en compte la taille maximale de la chaîne et peut
conduire à des dépassements de tampon. Par conséquent, son utilisation est
fortement déconseillée.
Au lieu de gets(), la fonction recommandée pour lire une ligne de texte depuis la
console est fgets(). fgets() permet de spécifier une taille maximale pour la chaîne,
ce qui contribue à éviter les problèmes de dépassement de tampon.
fgets()
La fonction fgets() est utilisée pour lire une ligne de texte depuis la console. Elle
prend en compte la taille maximale de la chaîne pour éviter les dépassements de
tampon.
Exemple :
Remarque : fgets() inclut le caractère de nouvelle ligne ('\n') dans la chaîne lue, il
peut donc être nécessaire de le traiter en conséquence
fgets() est plus sûr que gets() car elle permet de spécifier la taille maximale du
tampon, réduisant ainsi le risque de dépassement de tampon.
Exemples de Soustraction
Exemples de Multiplication
Exemples de Modulo
#include <stdio.h>
int main() {
int a = 7, b = 3;
int reste = a % b;
return 0;
}
L’incrémentation et la décrémentation
En informatique, l'incrémentation est l'opération qui consiste à ajouter 1 (et par
extension toute valeur entière fixée) à un compteur. L'opération inverse,
la décrémentation, consiste à retirer 1 (ou toute valeur entière fixée) au compteur.
Cette opération est très courante dans les programmes informatiques, notamment
dans les boucles d'itération, si bien que la plupart des langages de
programmation implémentent des opérateurs d'incrémentation et de décrémentation.
Ainsi, dans un grand nombre de langages, la syntaxe suivante permet d'ajouter ou
de retirer une unité à la variable x :
• y = x++ équivaut à y = x ; x = x + 1
• y = ++x équivaut à x = x + 1 ; y = x
Structure Séquentielle
La structure séquentielle est la structure de base où les instructions sont exécutées
une après l'autre, dans l'ordre dans lequel elles apparaissent.
Exemple :
Structures Conditionnelles
Les structures conditionnelles permettent d'exécuter des blocs de code en fonction
de conditions.
IF
SWITCH
La boucle do-while
La boucle do while fonctionne comme la boucle while, à un petit détail près : elle
s’exécutera toujours au moins une fois, alors qu’une boucle while peut ne pas
s’exécuter si la condition est fausse dès le départ.
Syntaxe
do
{
/* Bloc d'instructions à répéter */
} while (/* Condition */);
Si vous n’avez qu’une seule instruction à exécuter, les accolades sont facultatives.
do
/* Une seule instruction */
while (/* Condition */);
Exemple 1
#include <stdio.h>
int main(void)
{
int i = 0;
do
{
printf("La variable i vaut %d\n", i);
++i;
} while (i < 5);
return 0;
}
Résultat
La variable i vaut 0
La variable i vaut 1
La variable i vaut 2
La variable i vaut 3
La variable i vaut 4
Opérateur Ternaire
a. Définition
L'opérateur ternaire est une expression conditionnelle compacte qui permet d'écrire
une condition en une seule ligne.
b. Syntaxe
(condition) ? expression_si_vraie : expression_si_fausse;
#include <stdio.h>
int main() {
int a = 5, b = 10;
// Utilisation de l'opérateur ternaire pour déterminer le plus grand nombre
int plusGrand = (a > b) ? a : b;
return 0;
}
Les opérateurs ternaires sont des constructions compactes pour écrire des
conditions simples en une seule ligne. En C, l'opérateur ternaire est souvent utilisé
pour remplacer une structure de contrôle if-else lorsqu'une seule instruction doit être
exécutée en fonction d'une condition.
6. Opérateur Ternaire
a. Définition
L'opérateur ternaire est une expression conditionnelle compacte qui permet d'écrire
une condition en une seule ligne.
b. Syntaxe
cCopy code
(condition) ? expression_si_vraie : expression_si_fausse;
Exemple
cCopy code
#include <stdio.h> int main() { int a = 5, b = 10; // Utilisation de l'opérateur ternaire
pour déterminer le plus grand nombre int plusGrand = (a > b) ? a : b; printf("Le plus
grand nombre est : %d\n", plusGrand); return 0; }
Avantages et Limitations
a. Avantages
• Compacité : L'opérateur ternaire permet de réduire la quantité de code
nécessaire pour exprimer des conditions simples.
• Lisibilité : Il peut rendre le code plus lisible lorsqu'il est utilisé de manière
judicieuse.
b.Limitations
• Complexité : Son utilisation excessive peut rendre le code difficile à
comprendre, en particulier pour des conditions complexes.
• Limité à une instruction : Il est conçu pour des conditions simples avec une
seule instruction dans chaque branche.
L'instruction break
L'instruction break est utilisée pour sortir d'une boucle (for, while, ou do-while)
prématurément, avant que la condition normale de sortie soit satisfaite.