Cours C 1
Cours C 1
SUPPORT DE COURS
Semestre 2
Auditoire :
1
Cours Algorithme et Programmation 2024-2025
PLAN DU COURS
2
Cours Algorithme et Programmation 2024-2025
3
Cours Algorithme et Programmation 2024-2025
Chapitre 1 :
Introduction à la programmation
Problème
Analyse
Algorithme
Programme objet
(.obj)
Programme
exécutable (.exe)
4
Cours Algorithme et Programmation 2024-2025
- Le langage C a été crée par Dennis M. Ritchie en 1972 dans « Bell Laboratories » avec un
objectif relativement limité : développer une version portable du système d’exploitation
UNIX.
- En 1978, Dennis M. Ritchie et Brian W. Kernighan ont publié la définition classique du
langage C dans un livre intitulé « The C Programming Language ».
- En 1983, le langage C est devenu un standard ANSI-C suite à une commission réalisée
dans « American National Standards Instituté (ANSI) ».
- La seconde édition du livre « The C Programming Language » est parue en 1988, elle
respecte tout à fait le standard ANSI-C et elle est devenue par la suite, la « bible » des
programmeurs en C.
- Le C est un langage de procédures de haut niveau. Il est conçu pour fonctionner avec des
techniques de programmation structurée. Ses qualités « opérationnelles » l’ont très vite
fait adopté par une large communauté de programmeurs.
I. 3. Structure d’un programme en C
Un programme en C est une suite d’instruction manipulant des objets (variables ou des
constantes) regroupées en une ou plusieurs fonctions.
Une fonction :
Une fonction en C est constituée :
- D’une entête (type et nom de la fonction suivis d’une liste d’arguments entre
parenthèses),
- D’instructions composées constituant le corps de la fonction délimitées par des
accolades {}.
Une instruction :
Une instruction en C se termine toujours par un point virgule ; Ex : int a=5 ;
Plusieurs instructions peuvent être rassemblées par des accolades {} pour former une
instruction composée ou bloc qui est syntaxiquement équivalent à une instruction.
La fonction main :
Dite encore fonction principale qui doit être toujours présente. L’exécution du programme C
commence toujours main.
Une variable :
Une variable est un objet défini par un nom et un type dont la valeur peut être modifiée
pendant l’exécution du programme.
Les types de base sont :
- Les entiers,
- Les caractères,
- Les flottants (réels).
Un identificateur :
Un identificateur est le nom donné à diverse composantes d’un programme (variable, tableau,
…) :
- Le nom est formé de lettre (maj ou min), de chiffres et du caractère « _ ».
- Le premier caractère ne doit pas être un chiffre.
- La longueur maximale d’un identificateur est de 31 caractères.
Remarque :
5
Cours Algorithme et Programmation 2024-2025
Le langage C est un langage à mots-clés, ce qui signifie qu’un certain nombre de mots sont
réservés pour le langage lui-même et ne peuvent donc pas être utilisés comme identificateurs.
Un commentaire :
Un commentaire est utilisé dans un programme pour faciliter sa compréhension. Il n’est pas
compilé et n’est pas pour le programmeur. Un commentaire peut s’étendre sur plusieurs lignes
délimités par /* et */ ou sur une seule ligne précédé par deux slashs //.
Reprenons le programme précédent :
#include <stdio.h> bibliothèque standard d’input output
void main() fonction principale
{ début de la fonction main
// Notre premier programme en C commentaire
printf("Bonjour Tout le monde!\n"); fonction de la bibliothèque <stdio.h>
} fin de la fonction main
6
Cours Algorithme et Programmation 2024-2025
Chapitre 2 :
- Types de base
Les types simples : types entiers : types entiers et types rationnels,
La déclaration des variables simples, constantes numériques et initialisation
des variables
- Les opérateurs connus
L’affectation standard
Les opérateurs arithmétiques,
Les opérateurs logiques,
Les opérateurs de comparaison.
- Les opérateurs particuliers
L’affectation particulière,
L’incrémentation,
La décrémentation.
- Les expressions
- La priorité des opérateurs
- Les opérateurs arithmétiques standards
- Les conversions de types : automatiques et forcées
7
Cours Algorithme et Programmation 2024-2025
Introduction
Le C est un langage typé. Cela signifie en particulier que toute variable, constante ou fonction
est d’un type précis. Le type d’un objet définit la façon dont il et représenté en mémoire. La
taille mémoire correspondant aux différents types dépend des compilateurs (8bits, 16bits,
32bits) ; toutefois, la norme ANSI spécifie un certain nombre de contraintes.
I. Les types simples
Avant de pouvoir utiliser une variable, on doit s'intéresser à deux caractéristiques de son type:
(1) le domaine des valeurs admissibles
(2) le nombre d'octets qui est réservé pour une variable
Le tableau suivant résume les caractéristiques des types numériques entiers de C :
définition description domaine min domaine max nombre d'octets
char caractère -128 127 1
short entier court -32768 32767 2
int entier standard -32768 32767 2
long entier long -2147483648 2147483647 4
Tableau 1. Les caractéristiques des types numériques entiers de C
Les modificateurs signed/unsigned: Si on ajoute le préfixe unsigned à la définition d'un type
de variables entières, les domaines des variables sont déplacés comme suit:
8
Cours Algorithme et Programmation 2024-2025
9
Cours Algorithme et Programmation 2024-2025
Exemples :
base décimale base octale base hexadécimale représ. binaire
100 0144 0X64 1100100
255 0377 0xff 11111111
10
Cours Algorithme et Programmation 2024-2025
+ addition
- soustraction
* multiplication
/ division (entière et rationnelle!)
% modulo (reste d'une div. entière)
Tableau 7. Les opérateurs arithmétiques
Opérateurs logiques Opérateurs de comparaison
&& Et logique (and) == égal à
|| Ou logique (or) != différent de
! négation logique (not) <, <=, >, >= plus petit que, ...
Tableau 8. Les opérateurs logiques Tableau 9. Les opérateurs de comparaison
Les résultats des opérations de comparaison et des opérateurs logiques sont du type int:
- la valeur 1 correspond à la valeur booléenne vrai
- la valeur 0 correspond à la valeur booléenne faux
Les opérateurs logiques considèrent toute valeur différente de zéro comme vrai et zéro
comme faux:
32 && 2.3 1
!65.34 0
0||!(32 > 12) 0
III.2 Les opérateurs particuliers de C
Opérateurs d'affectation
En pratique, nous retrouvons souvent des affectations comme: i = i + 2
En C, nous utiliserons plutôt la formulation plus compacte: i += 2 (+= est un opérateur
d'affectation).
+= ajouter à
-= Diminuer de
*= multiplier par
/= diviser par
%= modulo
Tableau 10. Les opérateurs d’affectation
I=I+1 et I=I-1
11
Cours Algorithme et Programmation 2024-2025
incrémenter/décrémenter une variable ([Link]: dans une boucle). Dans ce cas il n'y a pas de
différence entre la notation préfixe (++I --I) et la notation postfixe (I++ I--).
12
Cours Algorithme et Programmation 2024-2025
L’ordre de priorité des opérations est représenté de la plus forte à la plus faible dans ce
tableau. Si plusieurs opérateurs apparaissent dans la même classe alors l’opérateur qui
apparaît le premier dans l’expression est évalué le premier (de gauche à droite) à l’exception
de deux classes (2 et 9) ou l’évaluation commence de droite à gauche.
13
Cours Algorithme et Programmation 2024-2025
Ces manipulations implicites convertissent en général des types plus 'petits' en des types
plus 'larges'; de cette façon on ne perd pas en précision.
Lors d'une affectation, la donnée à droite du signe d'égalité est convertie dans le type à
gauche du signe d'égalité. Dans ce cas, il peut y avoir perte de précision si le type de la
destination est plus faible que celui de la source.
Exemple : Considérons le calcul suivant:
int I = 8;
float X = 12.5;
double Y;
Y = I * X;
Pour pouvoir être multiplié avec X, la valeur de I est convertie en float (le type le plus large
des deux). Le résultat de la multiplication est du type float, mais avant d'être affecté a Y, il est
converti en double. Nous obtenons comme résultat: Y = 100.00
Appels de fonctions
Lors de l'appel d'une fonction, les paramètres sont automatiquement convertis dans les types
déclarés dans la définition de la fonction.
Exemple : pour les expressions suivantes, nous assistons à trois conversions automatiques:
int A = 200;
int RES;
RES = pow(A, 2);
A l'appel de la fonction pow, la valeur de A et la constante 2 sont converties en double, parce
que pow est définie pour des données de ce type. Le résultat (type double) retourné par pow
doit être converti en int avant d'être affecté à RES.
Règles de conversion automatique
Conversions automatiques lors d'une opération avec,
(R1) opération avec deux entiers:
D'abord, les types char et short sont convertis en int. Ensuite, l'ordinateur choisit le plus
large des deux types dans l'échelle suivante: int, unsigned int, long, unsigned long
(R2) opération avec un entier et un rationnel:
Le type entier est converti dans le type du rationnel.
(R3) opération avec deux rationnels:
L'ordinateur choisit le plus large des deux types selon l'échelle suivante: float, double, long
double
(4) opération avec affectations et opérateurs d'affectation:
Lors d'une affectation, le résultat est toujours converti dans le type de la destination. Si ce
type est plus faible, il peut y avoir une perte de précision.
Exemple : Observons les conversions nécessaires lors d'une simple division:
int X;
float A=12.48;
char B=4;
14
Cours Algorithme et Programmation 2024-2025
X=A/B;
B est converti en float (règle 2). Le résultat de la division est du type float (valeur 3.12) et
sera converti en int avant d'être affecté à X (règle 4), ce qui conduit au résultat X=3.
Remarque : le dépassement de capacité entraîne une perte de précision.
Exemple : unsigned int A=70000 ;
/* la valeur de A sera : 70000 mod 65536=4464*/
VII.2 Les conversions de type forcées (casting)
Il est possible de convertir explicitement une valeur en un type quelconque en forçant la
transformation à l'aide de la syntaxe: (<Type>) <Expression>
Exemple : Nous divisons deux variables du type entier. Pour avoir plus de précision, nous
voulons avoir un résultat de type rationnel. Pour ce faire, nous convertissons l'une des deux
opérandes en float. Automatiquement C convertira l'autre opérande en float et effectuera une
division rationnelle:
int A=3;
int B=4;
float C;
C = (float)A/B;
La valeur de A est explicitement convertie en float. La valeur de B est automatiquement
convertie en float (règle 2). Le résultat de la division (type rationnel, valeur 0.75) est affecté
à C.
Résultat: C=0.75
Attention !
Les contenus de A et de B restent inchangés; seulement les valeurs utilisées dans les calculs
sont converties !
15
Cours Algorithme et Programmation 2024-2025
Chapitre 3:
16
Cours Algorithme et Programmation 2024-2025
17
Cours Algorithme et Programmation 2024-2025
18
Cours Algorithme et Programmation 2024-2025
19
Cours Algorithme et Programmation 2024-2025
20
Cours Algorithme et Programmation 2024-2025
21
Cours Algorithme et Programmation 2024-2025
Exemple
La suite d'instructions
int JOUR, MOIS, ANNEE, RECU;
RECU = scanf("%i %i %i", &JOUR, &MOIS, &ANNEE);
réagit de la façon suivante ( - valeur indéfinie):
Introduit: RECU JOUR MOIS ANNEE
12 4 1980 ==> 3 12 4 1980
12/4/1980 ==> 1 12 - -
12.4 1980 ==> 1 12 - -
12 4 19.80 ==> 3 12 4 19
III. la macro putchar
La fonction putchar (c) joue le même rôle que printf(“%c” ,c) ;
IV. la macro getchar.
L’expression c=getchar() joue le même rôle que scanf(“%c” ,&c) ;
Exemples
char c ;
c=getchar() ; /*lecture d’une lettre c*/
putchar (c) ; /*afficher la lettre c*/
getchar et putchar sont deux macros de la biblilothèque <stdio.h>.
22
Cours Algorithme et Programmation 2024-2025
Chapitre 4:
LA STRUCTURE ALTERNATIVE
- if - else
- if sans else
- if-else if-…-else
- Switch
- L’opérateur conditionnel
23
Cours Algorithme et Programmation 2024-2025
I. If-else
Algorithmique C
si (<expression>) if ( <expression> )
alors <bloc d'instructions 1>
<bloc d'instructions 1> else
sinon <bloc d'instructions 2>
<bloc d'instructions 2>
Fin si
Si l'<expression> a la valeur logique vrai ( 0 ), alors le <bloc d'instructions 1> est
exécuté. Sinon le <bloc d'instructions 2> est exécuté.
La partie <bloc d'instructions> peut désigner :
Plusieurs instructions comprises entre accolades,
Une seule instruction terminée par un point-virgule.
Exemple 1 Exemple 2
Algorithmique C Algorithmique C
si (a > b) si (a > b)
alors alors
max ← a aide ← A
sinon A←C
max ← b C← aide
Sinon
finsi
Aide ← B
B←C
C ← aide
Finsi
24
Cours Algorithme et Programmation 2024-2025
max ← B
finsi
finsi
si (N>0)
alors
si (A>B)
alors
max ← A
finsi
sinon
max ← B
finsi
Par Convention
En C une partie else est toujours liée au dernier if qui ne possède pas de partie else.
Solution
Pour éviter des confusions et pour forcer une certaine interprétation d'une expression, il est
recommandé d'utiliser des accolades { }.
III. if-else if-…-else
En combinant plusieurs structures if - else en une expression nous obtenons une structure qui
est très courante pour prendre des décisions entre plusieurs alternatives:
if ( <expr1> )
<bloc1>
else if (<expr2>)
<bloc2>
else if (<expr3>)
<bloc3>
…………………
else if (<exprN>)
<blocN>
else
<blocN+1>
Les expressions <expr1> ... <exprN> sont évaluées du haut vers le bas jusqu'à ce que l'une
d'elles soit différente de zéro. Le bloc d'instructions y lié est alors exécuté et le traitement de
la commande est terminé.
Algorithmique C
Algorithme grand
A,B : entier
Début
Ecrire (“entrez deux nombres entiers :”)
Lire (A,B)
Si (A>B)
Alors
25
Cours Algorithme et Programmation 2024-2025
Si <expr1> fournit une valeur différente de zéro, alors la valeur de <expr2> est fournie
comme résultat
Si <expr1> fournit la valeur zéro, alors la valeur de <expr3> est fournie comme
résultat
Exemple
La suite d'instructions
if (A>B)
MAX=A; peut être remplacée par: MAX = (A > B) ? A : B;
else
MAX=B;
26
Cours Algorithme et Programmation 2024-2025
Chapitre 5:
LA STRUCTURE REPETITIVE
27
Cours Algorithme et Programmation 2024-2025
28
Cours Algorithme et Programmation 2024-2025
Impair 1
Somme 0
écrire(“Donner le dernier nombre impair”)
lire(dernier)
tan que (impair<=dernier)
faire
somme somme+impair
impair impair+2
fin faire
écrire(“La somme =”, sommme)
fin
III. For (pour)
Algorithmique C
Pour compteur de VI à VF For (compteur=VI ; compteur<=VF ;
Faire compteur++)
<bloc d’instruction> <bloc d’instruction>
Fin faire
Pour compteur de VI à VF par pas (-1) For (compteur=VI ; compteur>=VF ;
Faire compteur--)
<bloc d’instruction> <bloc d’instruction>
Fin faire
Pour compteur de VI à VF par pas de (K) For (compteur=VI ; compteur>=VF ;
Faire compteur+=K)
<bloc d’instruction> <bloc d’instruction>
Fin faire
<expr1> est évalué une fois avant le passage de boucle. Elle est utilisée pour initialiser les
données de la boucle.
<expr2> est évalué avant chaque passage de la boucle. Elle est utilisée pour décider si la
boucle est répétée ou non.
<expr3> est évaluée à la fin de chaque passage de la boucle. Elle est utilisée pour réinitialiser
les données de la boucle.
Exemple
L’algorithme suivant permet de calculer la somme S des n premiers termes de la « série
harmonique » définie comme suit :
S=1+ 1 + 1 + 1 + ……. + 1
2 3 4 n
n doit être strictement positif.
29
Cours Algorithme et Programmation 2024-2025
Algorithmique C
Algorithme suite
i,n :entier
s : réel
Début
S0
Répéter
écrire(“combien de termes : ”)
lire(n)
jusqu’à (n 1 )
pour i de 1 à n
faire
SS+ 1
i
fin pour
écrire(“La somme des”, n, “premiers termes
est ”, S)
Fin
IV. Application
Ecrire un programme qui détermine si un nombre de deux chiffres est parfait. Un nombre est
parfait s’il est égal à la somme de ses diviseurs stricts.
Par exemple, 28 est parfait car 28= 1+2+4+7+14.
Algorithmique C
Algorithme parfait
I,nb,s :entier
Début
Répéter
écrire(“donner un nombre de deux chiffres :”
lire(nb)
jusqu’à ((nb>9) et (nb<=99))
s0
pour i de 1 à nb/2 faire
si(nb mod i =0) alors
ss+i
fin si
fin pour
si (nb=s) alors
écrire(nb, “est parfait”)
sinon
écrire(nb, “n’est pas parfait”)
fin si
fin
30
Cours Algorithme et Programmation 2024-2025
Chapitre 6:
LES TABLEAUX :
Vecteurs et Matrices
31
Cours Algorithme et Programmation 2024-2025
32
Cours Algorithme et Programmation 2024-2025
Conclusion :
Considérons un tableau T de dimension N:
- l'accès au premier élément du tableau se fait par T[0]
- l'accès au dernier élément du tableau se fait par T[N-1]
5. Remplissage d’un vecteur
Void main ()
{
int A[5] ;
int i ; // compteur
printf(“remplir le tableaux”) ;
for(i=0 ; i<5 ; i++)
scanf(“%d\n”,&A[i]);
}
6. Affichage d’un vecteur
Void main ()
{
int A[5]={10,20,30,40,50} ;
int i ; // compteur
printf(“remplir le tableaux”) ;
for(i=0 ; i<5 ; i++)
printf(“%d\n”,A[i]) ;
}
33
Cours Algorithme et Programmation 2024-2025
Remarque
1. Si le nombre de lignes L n'est pas indiqué explicitement lors de l'initialisation,
l'ordinateur réserve automatiquement le nombre d'octets nécessaires.
Exemple
int A[][10] = {{ 0,10,20,30,40}, {10,11,12,13,14},{ 1,12,23,34,45}};
i. Réservation de 3*10*2 = 60 octets
2. Le nombre de colonne doit être toujours indiqué lors de l’initialisation.
3. Mémorisation
Comme pour les tableaux à une dimension, le nom d’un tableau représente l’adresse du
premier élément du tableau (c.-à-d. l'adresse de la première ligne du tableau). Les
composantes d'un tableau à deux dimensions sont stockées ligne par ligne dans la mémoire.
Exemple
short A[3][2] = {{1, 2 }, {10, 20 }, {100, 200}};
34
Cours Algorithme et Programmation 2024-2025
printf(“%d\n”,A[i][j]) ;
}
35