- Le Langage C -
Sommaire
Histoire du langage C
1. Introduction au langage
3. Les variables
4. Opérateurs et expressions
Origines
C a trois ancêtres : les langages CPL, BCPL et B.
BCPL : (pour Basic CPL) Cambridge en 1966 par Martin Richards. Version
siplifiée Ecriture d’un 1er Compilateur et de divers systèmes
d’exploitations
B : Ken Thompson vers 1970 dans les laboratoires Bell Version simplifiée
du BCPL
Histoire du C
C: développé par un collègue de Ken Thompson, Dennis Ritchie qui ajouta les
tableaux, les pointeurs, les nombres à virgule flottante, les structures...
1972 fut l'année de développement la plus productive et sans doute l'année
de baptême de C. En 1973, C fut suffisamment au point pour que 90% de
UNIX puisse être récrit avec.
Exemple: le nombre 5 est reconnu par une machine par la succession des symboles 101
(c'est la représentation du nombre en base 2).
De même, les opérations qu'une machine est capable d'exécuter sont codées par des
nombres, c'est-à-dire une succession de 0 et 1. Par exemple, l'instruction Machine
00011010 0001 0010 demande à la machine d'effectuer l'opération 1+2.
Ce langage est le seul qui soit compris par l'ordinateur, Est-il alors le seul moyen pour
communiquer avec celui-ci???
Il fut suivi par des langages plus sophistiqués et de plus en plus proche du langage
humain
1. Introduction au langage C
Compilateur
1. Introduction au langage C
Qu’est ce qu’un programme C?
C’est un texte écrit avec un éditeur de texte, respectant une certaine syntaxe et
stocké sous forme d'un ou plusieurs fichiers (généralement avec l'extension .c). A
l'opposé du langage assembleur, les instructions du langage C sont obligatoirement
encapsulées dans des fonctions et il existe une fonction privilégiée appelée main qui
est le point de départ de tout programme.
Exemple: main()
{
printf(’’Bonjour!’’);
}
Source.c
Compilation Objet.o Edition des liens Exécutable
2. Éléments de base
2.1 les fichiers include
Exemple:
# include <stdio.h>
main()
{
printf(’’Bonjour!’’);
}
Exemple:
# include <stdio.h> //pour pouvoir utiliser la fonction printf
main()
{
printf(’’Bonjour!’’);
}
/*Ce programme imprime la chaine de
caractère ‘’Bonjour!’’ à l’écran*/
2. Éléments de base
2.3 Présentation de quelques instructions du langage C
2. Éléments de base
2.3 Présentation de quelques instructions du langage C
Exemple 2 :
2. Éléments de base
2.4 Les identificateurs
Ils peuvent être signés ou non signés : signed ou unsigned (unsigned int x;)
2. Éléments de base
a. Les Types Entiers
long int ou long (entier sur 32 bits ou 64 bits, selon les machines)
Chacun des 3 peut être nuancé par l’utilisation du qualificatif unsigned pour ne
Float : codé sur 4 octets avec 1 bit de signe, 23 bits de mantisse et 8 bits
d'exposant
Double : codé sur 8 octets avec 1 bit de signe, 52 bits de mantisse et 11
bits d'exposant
Long : codé sur 10 octets avec 1 bit de signe, 64 bits de mantisse et 15 bits
d'exposant
NOTATION RESULTAT
\a cloche ou bip (alert ou audible bell)
\b Retour arrière (Backspace)
\f Saut de page (Form Feed)
\n Saut de Ligne (Line Feed)
\r Retour chariot (Carriage Return)
\t Tabulation horizontaLe (HorizontaL Tab)
\v Tabutation verticale (VerticaL Tab)
\\ \
\' ‘
\ '' ‘’
\? ?
2. Éléments de base
A propos du type booléen :
Pas de type booléen en C. Le type booléen est représenté par un entier. Il se comporte
comme la valeur booléenne vraie si cette valeur entière est non nulle.
Dans un contexte qui exige une valeur booléenne (comme les tests, par exemple), un
entier non nul équivaut à vrai et la valeur zero équivaut à faux
2. Éléments de base
2.6 Les Mots réservés
Les mots suivants sont réservés. Leur fonction est prévue par la syntaxe de C et ils ne
peuvent pas être utilisés dans un autre but :
Le qualificatif static, placé devant la déclaration d'une variable locale, produit une
variable qui est:
-Pour sa visibilité , locale
-Pour sa durée de vie, statique (Permanente)
Elle n'est accessible que depuis l'intérieur du bloc ou elle est déclarée, mais elle est créée
au début du programme et elle existe aussi longtemps que dure l'exécution de celui-ci.
Les opérateurs binaires ne sont à priori définis que pour deux opérandes ayant
le même type parmi: int, long int, float, double, long double et ils fournissent
un résultat de même type que leurs opérandes.
4. Opérateurs et Expressions
4.1 Opérateurs arithmétiques en C
De plus, il existe un opérateur de "modulo" noté % qui ne peut porter que sur
des entiers et qui fournit le reste de la division de son premier opérande par son
second. Par exemple, 11%4 vaut 3, 23%6 vaut 5
Conversions implicites :
On peut écrire des expressions mixtes dans lesquelles interviennent des opérandes
de types différents:
Int n,p; float x; n*x + p
(int * float) + int
Conversion implicite: int float ( float*float) + int
float + int
Même mécanisme : float + float float
Promotions numériques :
On a vu que les opérateurs numériques ne sont pas définis pour le types char et
short :
C prévoit que toute valeur char ou short soit d’abord convertie en int.
short n,p; float x; n*x + p
(short * float) + short
Conversion systématique: ( int * float) + int
Conversion implicite : float * float + int
float + float float
4. Opérateurs et Expressions
4.2 Opérateurs Relationnels
Par contre, C se distingue de la plupart des autres langages sur deux points:
1-le résultat de la comparaison est, non pas une valeur "booléenne" (on dit aussi
"logique") prenant l'une des deux valeurs vrai ou faux, mais un entier valant:
0 si le résultat de la comparaison est faux,
1 si le résultat de la comparaison est vrai.
Ainsi, la comparaison ci-dessus devient en fait une expression de type entier. Cela
signifie qu'elle pourra éventuellement intervenir dans des calculs arithmétiques;
4. Opérateurs et Expressions
4.2 Opérateurs Relationnels
Remarque: les opérateurs relationnels sont moins prioritaires que les opérateurs
arithmétiques ( x+y < a+2 (x+y) < (a+2) )
4. Opérateurs et Expressions
4.3 Opérateurs Logiques
Exemples:
n et p sont des entiers, le compilateur accepte des expression telles que:
n && p n||p if ( !n ) if (n == 0)
Nous avons déjà eu l'occasion de remarquer que : i = 5 était une expression qui
réalisait une action : l'affectation de la valeur 5 à i. Cet opérateur d'affectation (=)
peut faire intervenir d'autres expressions comme dans : c=b + 3
Priorité:
EXERCICES
5. Les Entées-Sorties Conversationnelles
Quelles sont les écritures autorisés pour des nombres fournis en données? Que se
Comment organiser les données lorsque l’on mélange les types numériques et les
types caractères?
d’informations?
c : char: caractère affiché ''en clair" (convient aussi à short ou à int compte tenu
u : unsigned int (convient aussi à unsigned char ou à unsigned short, compte tenu
ld : long
lu : unsigned long
5.Les Entées-Sorties Conversationnelles
5.1 Les possibilités de la fonction printf
f : double ou float écrit en notation "décimale" avec six chiffres après le point
Les entiers sont affichés par défaut sans espaces avant ou après. Les flottants avec six
chiffres après le point.
Pour agir sur l’affichage un nombre est placé après % et précise le nombre de
caractère minimum à utiliser.
Exemples: printf("%3d" , n );
n = 20 ^20
n=3 ^^3
n = 2358 2358
n = -5200 -5200
5.Les Entées-Sorties Conversationnelles
5.1 Les possibilités de la fonction printf
Exemples: printf("%f" , x );
x = 1.2345 1.234500
x = 12.3456789 12.345678
printf("%10f" , x );
x = 1.2345 ^^1.234500
x = 1.2345E5 123450.000000
printf("%e" , x );
x = 1.2345 1.234500e+000
x = 123.45 1.234500e+002
5.Les Entées-Sorties Conversationnelles
5.1 Les possibilités de la fonction printf
c. Actions sur la précision :
pour les flottants, on peut préciser un nombre de chiffres après le point décimal
Exemples: printf("%10.3f" , x );
x = 1.2345 ^^^^^1.235
x = 1.2345E3 ^^1234.500
x = 1.2345E7 12345000.000
Remarques:
Cadrage de l’affichage à gauche printf("%-10.3f" , x ); x = 1.2345 1.235^^^^^
- Le caractère * figurants à la place d’un gabarit ou une précision signifie que la valeur
effective est fournie dans la liste des arguments de printf:
printf("%8.*f" , n, x ); n=1; x=1.2345 ^^^^^1.2
- La fonction printf fournit une valeur de retour (nombre de caractère affichés)
5.Les Entées-Sorties Conversationnelles
5.1 Les possibilités de la fonction printf
d. Les erreurs de programmation :
c : char
d : int
u : unsigned int
hd : short int
hu : unsigned short
ld : long
lu : unsigned long
5.Les Entées-Sorties Conversationnelles
5.2 Les possibilités de la fonction scanf
Lorsque scanf attend des données, l’information frappée au clavier est rangée
exploré caractère par caractère au fur et à mesure des besoins. Certains caractères
123@
@
^25 n = 123 p=25
scanf("%d%c" , &n, &c );
12^a@ n = 12 c=‘ ‘
5.Les Entées-Sorties Conversationnelles
5.2 Les possibilités de la fonction scanf
Le traitement d’un code de format s’interrompe soit à la rencontre d’un séparateur, soit
lorsque le nombre de caractère indiqué a été atteint !!
12@
25@ n = 12 p=25
5.Les Entées-Sorties Conversationnelles
5.2 Les possibilités de la fonction scanf
Un espace entre deux codes de format demande à scanf de faire avancer le pointeur au
prochain caractère différent d’un séparateur !!
Un arrêt prématuré de scanf a lieu dans le cas où scanf n’est pas en mesur de fabriquer
une valeur adéquate !!
5.Les Entées-Sorties Conversationnelles
5.2 Les possibilités de la fonction scanf
Itération
Il existe deux manière de programmer une itération :
while (<condition>) Do
<actions>; <actions>
while(<condition>);
Exemple
i=0; i=2;
while(i<2) while (i<2)
{ i++; { i++;
printf("%d\n",i); printf("%d\n",i);
} }
printf("fin"); printf("fin");
i=0; i=2;
do do
{ {
i++; i++;
printf("%d\n",i); printf("%d\n",i);
} while (i<2) ; }
printf("fin"); while (i<2) ;
printf("fin");
6. Les structures de contrôle
Boucle for
for ([<instructions initiales>];[<condition>];[<instructions>])
[<corps de la boucle>];
for (exp1;exp2;exp3) équivalent à :
instruction; expr1;
while (expr2) {instruction;
expr3;
}
L'exp1 est exécutée à la première itération. Les exp2 et exp3 sont réévaluées à chaque
fois que l'instruction (le corps de la boucle) est exécutée.
S'il y a plusieurs instructions initiales ou finales, elles sont séparées par des virgules.
<condition> ⇔ Tant que la condition est vraie.
Les <instructions> sont exécutées après le corps de la boucle mais avant de tester à
nouveau la condition.
6. Les structures de contrôle
Exemple
for (;;); boucle infinie.
for (i=0;i<2;i++)
S+=i;
for(i=0,j=n;i<j;i++,j--)
{
instructions ;
}
for(c='A';c<='Z';c++)
{
instructions ;
}
7. Les tableaux statiques (Objets structurés)
Ensemble de variables de même type stockées consécutivement dans la
mémoire et que l'on peut manipuler globalement ou bien élément par
élément.
Les tableaux statiques sont représentés par des crochets, entre lesquels
est indiquée la taille du tableau. .
EXEMPLES :
int iTableau[10]; → tableau de 10 entiers,
iTableau est un pointeur, c'est-à-dire l'adresse de début d'une zone
mémoire de taille (nombre d'octets) égale au nombre entre crochets
multiplié par la taille du type du pointeur, soit 10*2 octets.
Pour accéder au xième élément du tableau iTableau, il faut faire :
iTableau[x-1]
ATTENTION : Les éléments des tableaux sont indicés de 0 à n-1.
7. Les tableaux statiques (Objets structurés)
EXEMPLE 2 :
int iTabDeuxDim[5][4]; → tableau d'entiers à deux
dimensions de 20 éléments.
iTabDeuxDim est un pointeur sur une zone de 4*5*2 octets.
EXEMPLE 3 :
On peut remplir un tableau lors de sa déclaration :
int iTableau[] = {4,5,8,12,-3};
déclaration et initialisation d'un tableau (on peut mettre le
nombre d'éléments à l'intérieur des crochets, mais dans ce
cas, ce n'est pas obligatoire). La taille du tableau est fixée à 5
éléments.
8. Les chaînes de caractères (Objets structurés)
Les chaînes de caractères sont représentées par des tableaux statiques
ou par des pointeurs.
EXEMPLES :
char identificateur[dimension];
On peut initialiser un tableau de caractères (ou chaîne de caractères) lors
de sa déclaration :
EXEMPLE 1 : char t[] = ''abcde''
EXEMPLE 2 : char t[] = {'a','b',...}
8. Les chaînes de caractères (Objets structurés)
Lecture de chaîne
scanf ("%s", adresse de la chaîne);
Fonctions gets et puts
char* gets (char*); // ramène l'adresse de la chaîne lue
void puts(char*); //affiche la chaîne qui est en argument
Fonction de manipulation:
Pensez à inclure préalablement string.h
strlen(<s>) : fournit la longueur de la chaîne sans compter le '\0' final.
strcpy(<s>, <t>) : copie <t> vers <s>
strcat(<s>, <t>) : ajoute <t> à la fin de <s>
strcmp(<s>, <t>) : compare <s> et <t> lexicographiquement et fournit un résultat :
négatif si <s> précède <t>;
zero si <s> est égal à <t>;
Positif si <s> suit <t>.
9. COMPLEMENT SUR LES POINTEURS
Opérateur * et &
• L'opérateur * désigne le contenu de l'adresse pointée ;
*iPointeur : désigne le contenu de la zone mémoire pointée par iPointeur.
• L'opérateur & est un opérateur unaire qui fournit comme résultat
l'adresse de son opérande.
Cet opérateur est déjà utilisé dans la fonction scanf.
Exemple:
int* iPointeur=NULL; /* Déclaration et initialisation d'un pointeur */
int iEntier =20; /* Déclaration et initialisation d'un entier */
iPointeur = &iEntier; /* Placement de l'adresse de l'entier dans le pointeur */
*iPointeur = 30; /* Modification de l'entier pointé */
/* équivalent à iEntie=30; * /
10. Allocation dynamique de la mémoire
Exemple de la déclaration:
/* fonction calculant le produit de deux entiers */
int calcule_produit (int arg1, int arg2)
/* Paramètres d'entrée : deux entiers */
/* Type retour : entier */
Exemple de la définition:
int calcule_produit (int iExp1, int iExp2)
{
int iProduit;
iProduit = iExp1 * iExp2;
return iProduit;
}
11. Les Fonctions
Exemple
/* Procédure affichant le produit de deux entiers */
/* */
/* Paramètres d'entrée : deux entiers */
/* Type retour : rien */
void affiche_produit (int iExp1, int iExp2)
{
int iProduit;
iProduit = iExp1 * iExp2;
printf ("Le produit de %d et %d est égal à %d", iExp1, iExp2, iProduit);
}
11. Les Fonctions
Syantaxe : Nom_fonction(arguments);
Affiche_produit(var1,var2);
void affiche_produit (int iExp1, int iExp2)
{
int iProduit;
iProduit = iExp1 * iExp2;
printf ("Le produit de %d et %d est égal à %d", iExp1, iExp2, iProduit);
}
int main()
{
int var1,var2;
var1=145; var2=35;
affiche_produit(var1,var2);//Appel de la fonction affiche_produit dans la fonction main
return 0;
} /*le programme affiche : Le produit de 145 et 35 est égal à 180*/
11. Les Fonctions
Définition
struct [<nom de la structure>]
{
<type> <nom ou identifiant>; /* champ */
} [<nom d'une variable>];
/* <nom d'une variable> est une variable de type struct <nom de la structure>*/
EXEMPLE :
/* Structure personne, composée de deux champs : cNom et iAge */
struct personne
{
char* cNom; int iAge;
};
struct personne individu; /* Déclaration d'un élément individu de type struct
personne */
12. les Structures (Objets structurés)
Accès à un élément d'une structure
/* Structure personne, composée de deux champs : cNom et iAge */
struct personne
{
char* cNom; int iAge;
};
int main()
{
struct personne individu;
struct personne *pindividu=NULL;
printf ("%s", individu.cNom);
printf("%d",individu.iAge);
printf("%s",(*pindividu).cNom);
printf("%s", pindividu->cNom);
}
13. Liens utiles
https://openclassrooms.com/courses/apprenez-a-programmer-en-c
http://www.apprendre-informatique.com/tutorial/programmation/langage-
c/apprendre-le-c/
https://www.rocq.inria.fr/secret/Anne.Canteaut/COURS_C/cours.pdf
https://www.rocq.inria.fr/secret/Anne.Canteaut/COURS_C/chapitre1.html