0% ont trouvé ce document utile (0 vote)
433 vues110 pages

Introduction au langage C et programmation

Le document présente un cours sur le langage C. Il contient des informations pratiques sur le cours comme les horaires et les professeurs, ainsi que des règles à suivre. Le document décrit également l'organisation du cours, le système d'évaluation, les objectifs et les références bibliographiques.

Transféré par

elarifdouaa
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
433 vues110 pages

Introduction au langage C et programmation

Le document présente un cours sur le langage C. Il contient des informations pratiques sur le cours comme les horaires et les professeurs, ainsi que des règles à suivre. Le document décrit également l'organisation du cours, le système d'évaluation, les objectifs et les références bibliographiques.

Transféré par

elarifdouaa
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Langage C

Prof. Asmaa EL HANNANI


Mr Rahhal ERRATTAHI

2018/2019

Informations pratiques
 Cours: Grand Amphi, site ENSAJ
 Mr Rahhal ERRATTAHI
[email protected]

 TP: salle de A2, site ENSAJ


 Mr Rahhal ERRATTAHI

 Matériel du cours et exercices sous:


http://moodle.ensaj.ucd.ac.ma

Prof Asmaa El Hannani 2AP-S3 2

1
Règles d’or

 Ponctualité: Arriver à l’heure !


 Respecter le droit des autres à écouter : pas de
bavardage en classe !
 Respecter vos collègues !

 Prendre des notes pendant la séance du cours


 Poser des questions
 Faire les devoirs et les rendre dans les délais

Prof Asmaa El Hannani 2AP-S3 3

Organisation

 1h15 de cours
 Transparents
 Publication des supports sur Moodle,

 1h30 de TP
 Correction du TP précédent, explication du TP courant,
travail sur PC.

Prof Asmaa El Hannani 2AP-S3 4

2
Evaluation

 Contrôles continus / QCM sur Moodle (25%)


 Evaluation des TPs (25%)
 1 Examen écrit (50%)

Prof Asmaa El Hannani 2AP-S3 5

Objectifs du module

 Appréhender le langage C.

 Apprendre à traduire un algorithme dans le langage


de programmation C pour produire un programme
exécutable.

Prof Asmaa El Hannani 2AP-S3 6

3
Références bibliographiques:

 Programmer en langage C, Stephen Kochan, ISBN : 2-744-07081-5


 Programmer en langage C, Claude Delannoy, ISBN : 2-212-11072-3
 Le livre du C premier langage, Claude Delannoy, ISBN : 2-212-11052-9
Prof Asmaa El Hannani 2AP-S3 7

Références webographiques:
 http://c.developpez.com/cours
 https://openclassrooms.com/fr/courses/1526901-apprenez-a-
developper-en-c

Prof Asmaa El Hannani 2AP-S3 8

4
INITIATION À MOODLE

Prof Asmaa El Hannani 2AP-S3 9

Prof Asmaa El Hannani 2AP-S3 10

5
Prof Asmaa El Hannani 2AP-S3 11

Le login est obligatoirement composé du nom


séparé par un point de la première lettre du nom.

Exemple pour : Rahhal Errattahi cela devient le


login : errattahi.r

Prof Asmaa El Hannani 2AP-S3 12

6
Prof Asmaa El Hannani 2AP-S3 13

Prof Asmaa El Hannani 2AP-S3 14

7
Partie 1
LES BASES DU LANGAGE C

Prof Asmaa El Hannani 2AP-S3 15

Introduction

8
Algorithme vs programme

 Un algorithme est la description non ambigüe en un nombre fini d’étapes


pour la résolution d'un problème.
 Un programme est la traduction d'un algorithme dans un langage de
programmation (comme le langage C ) compréhensible par une machine.

 Il s'agit donc de fournir la solution à un problème, la première étape consiste


donc à analyser le problème et le mettre en forme dans un langage descriptif.
L'étape suivante consiste à traduire l'algorithme dans un langage de
programmation spécifique, il s'agit de la phase de programmation.

Analyse Codage Execution

Problème Algorithme Programme Résultat

Prof Asmaa El Hannani 2AP-S3 17

Classification du langage C
Tous les Languages
de Programmation

Languages Languages
Imperatifs Declaratifs

Programmation Programmation Programmation Programmation Programmation


Procedurale Orientee Objets Concurrente Fonctionelle Logique
Ada, Pascal, C C++, Java Ada 95 LISP, SCHEME PROLOG

 Languages Imperatifs: Langages incluant des moyens pour le


programmeur d’attribuer des valeurs a des locations en mémoire.
 Languages Declaratifs: Langages pour lesquels le programmeur
réfléchit en terme de valeurs des fonctions et de relations entre
entités diverses. Il n ’y a pas d ’attribution de valeurs aux variables.
Prof Asmaa El Hannani 2AP-S3 18

9
Mise au point d’un programme

 Un ordinateur est une machine capable d’exécuter des


opérations, données par l’homme, à une très grande vitesse.
Ces opérations doivent telles qu’elles être comprises par
l’ordinateur.
 Pour réaliser le programme, correspondant à la résolution d’un
certain problème, on devra indiquer à l’ordinateur toutes les
opérations à effectuer dans tous les cas que l’on juge
possibles.
 La préparation d’un problème, en vue de son passage sur
ordinateur va nécessiter plusieures étapes:

Prof Asmaa El Hannani 2AP-S3 19

Mise au point d’un programme: étape 1

1. Définition exacte du probème: On ne peut pas espérer


resoudre, à l’aide d’un ordinateur, un problème non
complétement défini. Il faudra en particulier définir
clairement les objectifs que l’on souhaite atteindre (et leurs
limitations éventuelles), à partir des données existantes.

Données Résultats
?

Traitement par ordinateur


Prof Asmaa El Hannani 2AP-S3 20

10
Mise au point d’un programme: étape 2

2. Choix de la méthode de résolution: Pour atteindre nos


objectifs à partir des données existantes, une méthode
résolution s’impose.

Exemple: Déterminer la moyenne de 4 nombres positifs

1. Définition du problème
données: 4 nombres
objectifs: la moyenne en sortie

2. Choix de la méthode
Additionner tous les nombres et faire la division par 4.

Prof Asmaa El Hannani 2AP-S3 21

Mise au point d’un programme: étape 3

3. Étude détaillée de l´algorithme: Une fois la méthode de


résolution fixée, il reste à détailler l’algorithme
correspondant, en étudiant tous les cas possibles qui
peuvent se présenter afin que cette méthode puisse
engendrer un résultat.

Prof Asmaa El Hannani 2AP-S3 22

11
Mise au point d’un programme: étape 4

4. Codage et mise au point du programme: L’algorithme étant


explicité, il ne reste plus qu’à le traduire dans un langage de
programmation. Pour que ce programme puisse nous donner
des résultats, deux étapes doivent suivre:
a. Compilation: traduction du programme dans le langage
machine. Des erreurs peuvent survenir (lexicales, syntaxiques).
b. Exécution: une fois que la compilation est correcte, la phase
d’exécution peut commencer. Le résultat obtenu est relatif aux
données introduites.
 erreurs: le programme peut ne pas donner les résultats
escomptées: revoir la méthode de résolution, l’algorithme ou
le codage.

Prof Asmaa El Hannani 2AP-S3 23

Mise au point d’un programme


Définition

Choix de la méthode de résolution

P ANALYSE
R Étude détaillée de l’algorithme correspondant
O
G
R Codage suivant un langage de programamtion
A
M
M Entrée du programme en ordinateur
A
T
I
Exécution
O
N
Prof Asmaa El Hannani 2AP-S3 24

12
Langage C

Histoire du langage C

 Origines
C a trois ancêtres : les langages CPL, BCPL et B.

CPL : (pour Combined Programming Language) a été conçu au début des


années 1960 - universités de Cambridge et de Londres. Fortement
typé mais trop complexe  disparition dans las année 70

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

Prof Asmaa El Hannani 2AP-S3 26

13
Histoire du langage C

 Le language C à été développé par un collègue de Ken


Thompson, Dennis Ritchie en 1972 qui ajouta les tableaux,
les pointeurs, les nombres à virgule flottante, les
structures...
 En 1973, C fut suffisamment au point pour que 90% de
UNIX puisse être récrit avec.
 Une 1ère définition du langage est apparue en 1978 avec
l’ouvrage de Ritchie et Kernighan « The C programming
language ».

Prof Asmaa El Hannani 2AP-S3 27

Histoire du langage C

 Son succès international a contribué à sa normalisation:


1. ANSI (American National Standard Institute)

2. ISO (International Standadization Organisation)

Version Standard Publication Date


K&R n/a 1978-02-22
C89 ANSI X3.159-1989 1989-12-14
C90 ISO/IEC 9899:1990 1990-12-20
C95 ISO/IEC 9899/AMD1:1995 1995-03-30
C99 ISO/IEC 9899:1999 1999-12-16
C11 ISO/IEC 9899:2011 2011-12-15

Prof Asmaa El Hannani 2AP-S3 28

14
Prof Asmaa El Hannani 2AP-S3 29

Introduction au langage C

 Le langage C est un langage de bas niveaux, dans le sens où il


permet la manipulation de données que manipulent les ordinateurs
(bit, octet, adresse) ≠ Langages évolués (Pascal, Fortran, ADA)

 Il est suffisamment général pour permettre de développer des


applications de type scientifique ou de gestion basée sur l’accès
aux bases de données (Word et Excel sont écrits à partir de C ou
C++)

 Il est un des 1ers langages offrant des possibilités de


programmation modulaire: Un programme peut être constitué de
plusieurs module (module = fichier.c)

Prof Asmaa El Hannani 2AP-S3 30

15
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 (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.

main()
{
printf(’’Bonjour!’’);
}
file.c

Pré-processeur file.i Compilation file.o Edition des liens Exécutable

Prof Asmaa El Hannani 2AP-S3 31

Programme minimum en C
Le programme
commence toujours par Directives préprocesseur – Inclure les
la fonction main bibliothèques

Instruction toujours
terminée par ;

Bloc d’instructions
encadré par des
accolades

Le programme renvoie toujours une valeur

Insérer de préférence une ligne vide

Prof Asmaa El Hannani 2AP-S3 32

16
Phases d’élaboration d’un programme C
 L’élaboration d’un programme C passe par 4 phases :
1. Ecriture du code source: Cette phase consiste à écrire le code du programme C en
utilisant un éditeur de texte. Ce code est enregistrer dans un fichier texte
d’extension « .c».
2. Traitement du pré-processeur: Consiste à préparer la phase de compilation en
effectuant les transformations textuelles , dans le code source, suivantes :
 L’inclusion de code source (fichiers en-tête (Header) « .h ») : #include
 La compilation conditionnelle : #if … #else #end if
 Le traitement de macros : #define
3. Compilation: Consiste à traduire le code généré par le pré-processeur en langage
machine. Le résultat de compilation porte le nom de module objet (fichier.o). Ce
module objet n'est pas directement exécutable.
4. Édition de liens: Produit, à partir d'un ou de plusieurs fichiers objets et des
bibliothèques standards, un fichier exécutable (fichier.exe). Outre l'assemblage des
divers fichiers objets, l'édition des liens inclut les définitions des fonctions prédéfinies
utilisées par le programme.
Prof Asmaa El Hannani 2AP-S3 33

Phases d’élaboration d’un programme C

main()
{
printf(’’Bonjour!’’);
}

file.c

Pré-processeur file.i Compilation file.o Edition des liens Exécutable

Prof Asmaa El Hannani 2AP-S3 34

17
conio.h Fichier2.c Fichier1.c math.h
/* conio.h */ graphics.h #include<conio.h> #include<stdio.h>
stdio.h /* math.h */
. #include<graphics.h> #include<maths.h> .
. /* graphics.h */
. … … /* conio.h */ .
. .
. .
. main() Calcul() .
{ { .
… …
} }

Pré-processeur

Fichier2.i Fichier1.i
/* conio.h */ /* stdio.h */
… …
/* graphics.h */ /* maths.h */
… …
… …
main() Calculs()
{ {
… …
} }

Compilation Math.lib

stdio.lib
Fichier2.o Fichier1.o Graphics.lib

Edition de liens

Prof Asmaa El Hannani 2AP-S3


Fichier.exe 35

Options de compilation

 Compilation sans édition de lien


gcc –c imprime2.c
imprime2.c => imprime2.o

 Création de l’exécutable
gcc monProg.c imprime1.o –o monProg
Ou bien
gcc monProg.o imprime1.o –o monProg

Par défaut, le nom de l’exécutable est a.out

Prof Asmaa El Hannani 2AP-S3 36

18
Structure d’une application en C
Programme typique en C

include
Main() est toujours la
1ere fonction appelée
main()

fonction a() instructions

fonction b() instructions

instructions
Prof Asmaa El Hannani 2AP-S3 37

Structure d’un programme C

 Un programme C peut se décomposer par :


 Des directives de préprocesseur
 Des déclarations de types, de variables et de constantes
 Des prototypes de fonctions
 Des définitions de fonctions parmi lesquelles la fonction main

Prof Asmaa El Hannani 2AP-S3 38

19
Exemple

Prof Asmaa El Hannani 2AP-S3 39

Comment développer une application?

Deux façons d’écrire des programmes C:


 En écrivant le code dans un simple éditeur de texte (emacs, Xemacs,
gedit, notepad, . . . ).
 Compilation et exécution du code en ligne de commande

 En utilisant un environnement de développement (Integrated


Development Environment - IDE)
 Code::Blocks (Windows, Mac OS, Linux)
 Visual C++ (Windows seulement)
 Xcode (Mac OS seulement)
 …

Prof Asmaa El Hannani 2AP-S3 40

20
la barre d'outils

la zone principale
la liste des fichiers
du projet

la zone de notification

Prof Asmaa El Hannani 2AP-S3 41

Eléments de base

21
#include

# include <stdio.h>
main()
{
printf(’’Bonjour!’’);
}

 La directive #include inclue le fichier stdio.h au programme avant la


compilation (pour pouvoir utiliser la fonction prédéfinie printf.

 Une directive ne s’applique qu’à la partie du programme qui lui succède.


D’une manière générale, il est préférable de les placer au début !

 On parle alors de directives à destination du préprocesseur.

Prof Asmaa El Hannani 2AP-S3 43

Les commentaires
 Il existe trois types de commentaire en C :
 Tout texte entre « // » et la fin de la ligne
 Tout texte entre « /* » et « */ »: commentaire multi ligne

# include <stdio.h> //pour pouvoir utiliser la fonction printf


main()
{
printf(’’Bonjour!’’);
}
/* Ce programme imprime la chaine de
caractère ‘’Bonjour!’’ à l’écran */

Prof Asmaa El Hannani 2AP-S3 44

22
Les identificateurs

 Les identificateurs servent à désigner les différents objets


manipulés par le programme: variables, fonctions, …
 Commence nécessairement par une lettre.
 Une lettre majuscule est tenue pour différente de la lettre
minuscule correspondante.
 Au plus 32 caractère.
 Le caractère _ (appelé « blanc souligné ») est considéré
comme une lettre ; il peut donc figurer à n'importe quelle place
dans un identificateur: _Total2, Prix_unit.

Prof Asmaa El Hannani 2AP-S3 45

Les mots-clés

 Certains « mots-clés » sont réservés par le langage à un usage


bien défini et ne peuvent pas être utilisés comme
identificateurs.

Auto break case char const continue default do


double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while

Prof Asmaa El Hannani 2AP-S3 46

23
Types et variables

 Qu'est-ce qu'une variable ?


 c'est le nom d’un emplacement mémoire

 on en crée (presque) autant qu’on veut

 son contenu peut changer dans le temps

 elle contient toujours quelque chose !!!

 Qu'est-ce qu'un type ?


 définit une convention de codage de l'information

 dans un emplacement de taille préfixée

Une variable sera toujours définie par un type avant utilisation


Prof Asmaa El Hannani 2AP-S3 47

Les types de données

Prof Asmaa El Hannani 2AP-S3 48

24
Les types dans C

 Les types de base du langage C se répartissent en 3 grande


catégories en fonction de la nature des informations qu’ils
permettent de représenter:
 Nombres entiers (int)
 Nombres flottants (float ou double)
 Caractère (char): apparaît en C comme un cas particulier de int.

 Ils peuvent être signés ou non signés : signed ou unsigned

Prof Asmaa El Hannani 2AP-S3 49

Les types Entiers

 short int ou short (entier sur 16 bits : - 32 768 à 32 767)


 int (entier sur 32 bits : - 2 147 483 648 à 2 147 483 647)
 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
représenter que des nombres positifs:
Exemple: unsigned short x; x peut aller de 0 à 65 535
pas de bit réservé pour le signe

 C accepte aussi les constantes entière en notation hexadécimale ou octale:


 014 (octale) correspond à la valeur décimale 12

 0x1A (hexadécimale) correspond à la valeur décimale 26 (16+10)

Prof Asmaa El Hannani 2AP-S3 50

25
Les types Flottants

 float : codé sur 4 octets avec 1 bit de signe, 23 bits de mantisse et 8 bits
d'exposant (3.4 x 10-38 à 3.4 x 1038)
 double : codé sur 8 octets avec 1 bit de signe, 52 bits de mantisse et 11 bits
d'exposant (1.7 10-308 à 1.7 10308)
 long double : codé sur 10 octets avec 1 bit de signe, 64 bits de mantisse et
15 bits d'exposant (3.4 10-4932 à 3.4 104932)

 C accepte les constantes flottante en notation décimale ou scientifique:


3.5e+3 3500 2.43 -0.38 -.38 4. .27

Prof Asmaa El Hannani 2AP-S3 51

Le type Char

 char : un caractère est un entier signé codé sur 1 octet (-128 à 127)

 Les constantes de type « caractère », lorsqu’elles correspondent à


des caractères imprimables, se notent de façon classique, en écrivant
entre apostrophes le caractère voulu, comme dans ces exemples :
'a' 'Y' '+' '$‘

 Il existe des caractères non imprimables, tel que le changement de


ligne, de tabulation, … en voici un tableau récapitulatif

Prof Asmaa El Hannani 2AP-S3 52

26
Caractères spéciaux

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)
\\ \
\' ‘
\'' ‘’
\? ?

Prof Asmaa El Hannani 2AP-S3 53

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.

Prof Asmaa El Hannani 2AP-S3 54

27
Les conversions de types

 Dans certains cas, le compilateur peut être amené à effectuer certaines


conversions lors des évaluations pour obtenir un exécutable correct :
int i, j, k; On peut laisser faire certaines
float x; conversions implicites, mais il
x = i; faut mieux apprendre à les
j = k+x; maîtriser soi-même.

 Pour forcer une conversion : (type) expression ;


int i, j, k;
float x;
x = (float) i;
j = k + (int) x;

Prof Asmaa El Hannani 2AP-S3 55

La déclaration de variables

 Les déclarations des types des variables sont obligatoires et doivent être
regroupées au début du programme. Elles peuvent être soit individuelle ou
groupées :

type variable (optionnel = valeur) ;

Le ; est obligatoire

Une variable peut être initialisée à une valeur au


moment de sa déclaration

Le nom de la variable doit commencer par une lettre

Le type détermine la taille (ou l’occupation mémoire) de la


variable
Prof Asmaa El Hannani 2AP-S3 56

28
La déclaration de variables

char
unsigned short
auuto signed int
register const
long int Identificateur;
static volatile float
extern double
long double

Prof Asmaa El Hannani 2AP-S3 57

Les constantes

 Il est possible de déclarer que la valeur d’une variable ne doit


pas changer lors de l’exécution du programme.

const double CST = 20.3 ;

Le ; est obligatoire

Opérateur = obligatoire

La constante reçoit une valeur lors de la compilation et est


ensuite protégée contre d’autres modifications

Le Type de la constante

Prof Asmaa El Hannani 2AP-S3 58

29
Opérateurs et Expressions

Les opérateurs du C

 C dispose d'un important éventail d'opérateurs:


 les opérateurs de calcul
 ………………d'assignation
 ………………d'incrémentation
 ………………de comparaison
 ………………logiques
 ………………bit-à-bit
 ………………de décalage de bit
 Les priorités

Prof Asmaa El Hannani 2AP-S3 60

30
Les opérateurs de calcul

 Les opérateurs de clacul (arithmétiques) 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.

Prof Asmaa El Hannani 2AP-S3 61

Les opérateurs de calcul

 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

 Remarque: le quotient de deux entiers fournit un entier.


Ainsi 5/2 vaut 2; en revanche, le quotient de deux flottants
(noté, lui aussi, /) est bien un flottant (5.0/2.0 vaut bien
approximativement 2.5).

Prof Asmaa El Hannani 2AP-S3 62

31
Conversion implicite de type

 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

 On parle de conversion implicite de type:


intlongfloatdoublelong double

Prof Asmaa El Hannani 2AP-S3 63

Promotions numériques

 En C 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

Prof Asmaa El Hannani 2AP-S3 65

32
Exercice

 Soient les déclarations:


char A=3;
int B=4;
float C=4;
float D,E;
char F;

Quels sont le type et la valeur de chacune des expressions:


D = A/C;
E = A/B;
F = A/C;
Prof Asmaa El Hannani 2AP-S3 66

Les opérateurs d'assignations

 i = 5 est une expression qui réalise une action d'affectation de


la valeur 5 à i. Cet opérateur d'affectation (=) peut faire
intervenir d'autres expressions comme dans : c=b + 3

 En C une opération x = x + 2 peut aussi s'écrire x += 2;

Prof Asmaa El Hannani 2AP-S3 67

33
Opérateurs d’incrémentation et de
décrémentation
 ++ : incrémente de 1 la valeur de la variable
 On dit que ++ est:
 un opérateur de pré incrémentation lorsqu'il est placé à gauche
 un opérateur de post incrémentation lorsqu'il est placé à droite
x=3;
//post-incrémentation
y= x++;  y=x; x=x+1; //y=3, x=4
//pré incrémentation
y=++x;  x=x+1; y=x; //x=y=5

 --: decrémente de 1 la valeur de la variable


 Utilise les même règles que le ++
Prof Asmaa El Hannani 2AP-S3 68

Les opérateurs de comparaison

 Comme tout langage, C permet de "comparer" des expressions à l'aide


d'opérateurs classiques de comparaison. exemple : 2*a > b +5

 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;

Prof Asmaa El Hannani 2AP-S3 69

34
Les opérateurs de comparaison

2- les expressions comparées pourront être de type quelconque et seront


soumises au règles de conversion présentées précédemment.

Liste des opérateurs: < <= > >= == !=


même priorité > même priorité

Exemple: a < b == c < d  (a < b) == (c < d)

Remarque: les opérateurs relationnels sont moins prioritaires que les


opérateurs arithmétiques ( x+y < a+2  (x+y) < (a+2) )

Prof Asmaa El Hannani 2AP-S3 70

Les opérateurs Logiques

 C dispose de trois opérateurs logiques classiques: et (noté &&), ou (noté | |)


et non (noté ! ).

 Ces opérateurs acceptent n'importe quel opérande numérique, y compris les


types flottants, avec les règles de conversion implicite déjà rencontrées. à
condition de considérer que:
 0 correspond à faux,
 toute valeur non nulle correspond à vrai

Prof Asmaa El Hannani 2AP-S3 71

35
Les 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)

Remarque1: l’opérateur ! a une priorité supérieur à celle de tous lés


opérateurs arithmétiques et relationnels.
La négation de a==b serait !(a==b) et non !a==b

Remarque2: l’opérateur | | est moins prioritaire que &&. Tous deux sont de
priorité inférieure aux opérateurs arithmétique et relationnels
a<b && c<d équivaut à (a<b) && (c<d)

Ne sera évaluée que si a<b est vrai


Prof Asmaa El Hannani 2AP-S3 72

Les opérateurs bit-à-bit

Prof Asmaa El Hannani 2AP-S3 73

36
Les opérateurs de décalage de bit

Prof Asmaa El Hannani 2AP-S3 74

Autres opérateurs

 L’opérateur de CAST :
Exemple: n=10, p=3;
(double) (n/p) aura comme valeur 3.0
(double) n/p aura comme valeur 3.33333…

 L’opérateur conditionnel : (seul opérateur ternaire en C)


syntaxe : condition ? Valeur si vrai : valeur si faux

z = (x==y) ? a : b ; on utilise la valeur de l’expression


a>b ? i++ : i-- ; la valeur de l’expression n’est pas utilisée

Prof Asmaa El Hannani 2AP-S3 75

37
Les priorités

Prof Asmaa El Hannani 2AP-S3 76

38
Partie 2
ENTRÉE-SORTIE ET
STRUCTURES DE CONTRÔLE

Prof Asmaa El Hannani 2AP-S3 77

Les Entrées-Sorties

1
Les Entrées-Sorties Conversationnelles

 C dispose d’une multitude de fonctions pour afficher des


informations à l’écran ou pour en lire au clavier.

 C’est ce que nous avons appelé les « entrées-sorties


conversationnelles ».

 Plus tard, nous verrons que ces mêmes fonctions (moyennant


la présence d’un argument supplémentaire) permettent
également d’échanger des informations avec des fichiers.

Prof Asmaa El Hannani 2AP-S3 79

Les Entrées-Sorties Conversationnelles

 Fonctions pour l’affichage des données:


printf("Format" , expr [ , expr,…]) ; /*affiche des données selon un format */
puts(Chaine); /* affiche une chaîne de caractère */
putchar(caractere); /* affiche un caractère */

 Fonctions pour la lecture des données


scanf("Format" ,adres_var [ ,adresse_var,…]) ; /*Lit des donnée selon un format */
gets(Var_Chaine); /* Lit une chaîne de caractère */
var_caratere = getchar(); /* Lit un caractère */
var_caratere = getch() ; /* Lit un caratère sur le clavier */

Prof Asmaa El Hannani 2AP-S3 80

2
Les possibilités de la fonction printf

 La fonction printf se présente ainsi:


printf ( format[, liste_d’expressions] )
 format une chaîne de caractères qui spécifie:
 Des caractères à afficher tels quels;
 Des code de format repérés par % (c, d, f..) qui précise le type de
l’information à afficher.
 liste_d’expressions : suite d’expressions séparées par des virgules d’un
type en accord avec le code format correspondant.

Exemple: printf("leur somme est : %d", n1+n2);

 Un code de format peut contenir des informations complémentaires


agissant sur le cadrage, le gabarit ou la précision.
Prof Asmaa El Hannani 2AP-S3 81

printf: Les principaux codes de conversion

 c : char: caractère affiché ''en clair" (convient aussi à short ou à


int compte tenu des conversions systématiques)
 d : int (convient aussi à char, compte tenu des conversions
systématiques)
 u : unsigned int (convient aussi à unsigned char ou à unsigned
short, compte tenu des conversions systématiques)
 ld : long
 lu : unsigned long

Prof Asmaa El Hannani 2AP-S3 82

3
printf: Les principaux codes de conversion

 f : double ou float écrit en notation "décimale" avec six


chiffres après le point
 e : double ou float écrit en notation ''exponentielle'' (mantisse
entre 1 et 9) avec six chiffres après le point décimal, sous la
forme x.xxxxxxe+yyy ou x.xxxxxxe-yyy pour les nombres
positifs et -x.xxxxxxe+yyy ou -x.xxxxxxe-yyy pour les
nombres négatifs
 s : chaîne de caractères dont on fournit l'adresse (notion qui
sera étudiée ultérieurement)

Prof Asmaa El Hannani 2AP-S3 83

printf: Action sur le gabarit d’affichage:

 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 // ^ désigne un espace
n=3 ^^3
n = 2358 2358
n = -5200 -5200

Prof Asmaa El Hannani 2AP-S3 84

4
printf: Action sur le gabarit d’affichage:

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

Prof Asmaa El Hannani 2AP-S3 85

printf: 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.2346 ^^^^^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)
Prof Asmaa El Hannani 2AP-S3 86

5
printf: Les erreurs de programmation

Erreur1: Code de format en désaccord avec le type de l’expression à afficher:


Conséquence : mauvaise interprétation si même taille (int en %u),
sinon, conséquences plus désastreuses.

Erreur2: Nombre de code de format différents du nombre d’expressions de


la liste
Conséquence 1: si des expressions de la liste n’ont pas de format,
elles ne seront pas affichées
( printf("%d" , n, p ); // valeur de p ne sera pas affiché )

Conséquence 2 : s’il y a trop de code de format, printf cherchera à


afficher n’importe quoi
( printf("%d %d" , n ); n=8  8 2 )

Prof Asmaa El Hannani 2AP-S3 87

Les possibilités de la fonction scanf

 La fonction scanf se présente ainsi:


scanf ( format, liste_d_adresse )
 format une chaîne de caractères qui spécifie:
 Des code de format repérés par %, précisant le type de
l’information à lire.
 liste_d_adresses : liste d’adresse, séparées par des virgules, d’un type
en accord avec le code de format correspondant.

Exemple: scanf ("%d", &p) ;

 Il faut noter la nécessité de recourir à l’opérateur & pour désigner


l’adresse de la variable pour laquelle on souhaite lire une valeur.

Prof Asmaa El Hannani 2AP-S3 88

6
scanf : Les principaux codes de conversion :

 c : char
 d : int
 u : unsigned int
 hd : short int
 hu : unsigned short
 ld : long
 lu : unsigned long
 f ou e : float écrit en notation "décimale" ou ‘'exponentielle''
 Lf ou le : double écrit en notation "décimale" ou ‘'exponentielle''
 s : chaîne de caractères dont on fournit l'adresse (notion qui sera
étudiée ultérieurement)

Prof Asmaa El Hannani 2AP-S3 89

scanf : Notion de tampon et de séparateurs

 Lorsque scanf attend des données, l’information frappée au clavier


est rangée temporairement dans l’emplacement mémoire nommé
« tampon ».

 Le tampon est exploré caractère par caractère au fur et à mesure des


besoins.

 Certains caractères jouent un rôle particulier: les séparateurs


(l’espace et la fin de ligne \n)

Prof Asmaa El Hannani 2AP-S3 90

7
scanf : Les règles utilisées par scanf

 Les codes de format correspondant à un nombre entraînent


l’avancement du pointeur jusqu’au 1er caractère différent d’un
séparateur, puis scanf prend en compte tous les caractères
suivants jusqu’à la rencontre d’un séparateur.

 Quand au code de format %c, il entraîne la prise en compte du


caractère désigné par le pointeur (même un séparateur) et il est
avancé sur le caractère suivant.

Prof Asmaa El Hannani 2AP-S3 91

scanf : Les règles utilisées par scanf

Exemples : (n et p sont de type int, c char, @ désigne une fin de ligne)


 scanf("%d%d" , &n, &p );

12^25@ n = 12 p=25
^12^^25^^@ n = 12 p=25
 scanf("%d%d" , &n, &p );
12@
@
^25 n = 12 p=25
 scanf("%d%c" , &n, &c );
12^a@ n = 12 c=‘ ‘
Sans espace entre deux codes de format, le code de format
%c entraîne la prise en compte du séparateur !
Prof Asmaa El Hannani 2AP-S3 92

8
scanf : On peut imposer un gabarit maximal

 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 !!

Exemples : (n et p sont de type int, @ désigne une fin de ligne)

scanf("%3d%3d" , &n, &p );


12^25@ n = 12 p=25
^^^^^12345@ n = 123 p=45
12@
25@ n = 12 p=25

Prof Asmaa El Hannani 2AP-S3 93

scanf : Rôle d’un espace dans le format

 Un espace entre deux codes de format demande à scanf de


faire avancer le pointeur au prochain caractère différent d’un
séparateur !!

Exemples : (n et p de type int, c char, @ désigne la fin de ligne)

espace

scanf("%d %c" , &n, &c );


12^a@ n = 12 c=‘a‘
12^^^@
a@ n = 12 c=‘a‘

Prof Asmaa El Hannani 2AP-S3 94

9
scanf : Arrêt prématuré de scanf

 Un arrêt prématuré de scanf a lieu dans le cas où scanf n’est


pas en mesure de fabriquer une valeur adéquate !!

Exemples : (n et p de type int, c char, @ désigne la fin de ligne)

compte = scanf("%d %d %c" , &n, &p, &c );


12^25^b@ n = 12 p = 25 c=‘b‘ compte = 3
12b@ n = 12 p indéfini c indéfini compte = 1
b@ n indéfini p indéfini c indéfini compte = 0

 La valeur de retour fournie par scanf indique le nombre de


valeurs convenablement lues.
Prof Asmaa El Hannani 2AP-S3 95

scanf : Problème de synchronisation entre l’écran


et le clavier
 Le tampon n’est pas vide à chaque nouvel appel de scanf
 Pour vider le buffer d'entrée il faut utiliser: fflush ( stdin );
 Exemple:

233^122@

donner une valeur pour n : 233 122


 Résultat à l’exécution: Merci pour 233
donner une valeur pour p : Merci pour 122
Prof Asmaa El Hannani 2AP-S3 96

10
scanf : Les erreurs de programmation

Erreur1: Code de format en désaccord avec le type de l’expression:


Conséquence: Si même taille  introduction d’une mauvaise valeur
Si la variable a une taille inférieur  écrasement d’un
emplacement mémoire consécutif à cette variable

Erreur 2: Nombre de codes de format différent du nombre d’éléments de la


liste:
Conséquence: Scanf("%d",&n, &p);  seule la valeur de n est lue
Scanf("%d%d",&n);  on affecte une valeur à un
emplacement aléatoire de la mémoire

Prof Asmaa El Hannani 2AP-S3 97

Les instructions de contrôle

11
Les instructions de contrôle

 A priori, dans un programme, les instructions sont exécutées


séquentiellement, c’est-à-dire dans l’ordre où elles apparaissent.
 Or la puissance et le « comportement intelligent » d’un programme
proviennent essentiellement :
 de la possibilité d’effectuer des choix, de se comporter différemment
suivant les circonstances;
 de la possibilité d’effectuer des boucles, autrement dit de répéter
plusieurs fois un ensemble donné d’instructions.

 C dispose d’instructions structurées permettant de réaliser :


 des choix : instructions if...else et switch,
 des boucles : instructions do...while, while et for
 des branchements inconditionnel : goto, break et continue
Prof Asmaa El Hannani 2AP-S3 99

Instruction if

Prof Asmaa El Hannani 2AP-S3 100

12
Instruction if … else

Prof Asmaa El Hannani 2AP-S3 101

Instruction if … else

 Exemple:

Prof Asmaa El Hannani 2AP-S3 102

13
Attention aux forêts d’if()

 Exemple:

Prof Asmaa El Hannani 2AP-S3 103

Instruction de choix multiples switch

Prof Asmaa El Hannani 2AP-S3 104

14
Instruction de choix multiples switch

 Exemple:

Prof Asmaa El Hannani 2AP-S3 105

Exercice : if-else et switch

 Ecrire un programme une fois avec « if-else » et une


fois avec « switch » qui lit deux entiers et un
caractère (Le caractère sera *, +, / ou -) et affiche le
résultat de l'opération indiquée appliquée aux deux
entiers.

Prof Asmaa El Hannani 2AP-S3 106

15
Exercice : if-else et switch
#include<stdio.h> case '*':
int main() printf("%d * %d = %d",a,b,a*b);
{ break;
int a,b; case '/':
char c; printf("%d / %d = %f",a,b,(float)a/b);
printf("Entrez a c b:"); break;
scanf("%d %c %d" , &a,&c, &b ); default:
switch (c){ printf("Erreur ! operateur invalide");
case '+': }
printf("%d + %d = %d",a,b,a+b); return 0;
break; }
case '-':
printf("%d - %d = %d",a,b,a-b);
break;

Prof Asmaa El Hannani 2AP-S3 107

Instruction while

Prof Asmaa El Hannani 2AP-S3 108

16
Instruction do…while

Prof Asmaa El Hannani 2AP-S3 109

Instruction for

Prof Asmaa El Hannani 2AP-S3 110

17
Attention aux boucle sans fin

Prof Asmaa El Hannani 2AP-S3 111

Instruction de branchement continue

Prof Asmaa El Hannani 2AP-S3 112

18
Instruction de branchement continue

Prof Asmaa El Hannani 2AP-S3 113

Instruction de branchement break

Prof Asmaa El Hannani 2AP-S3 114

19
Instruction de branchement break

Prof Asmaa El Hannani 2AP-S3 115

Exercice : les boucles

 Écrivez un programme une fois avec « for », une fois avec


« while » et une fois avec « do-while » qui affiche la table de
multiplication d’un chiffre. Ce chiffre sera entré par
l’utilisateur. Par exemple, si le chiffre est 3, le programme
affiche:
1x3=3
2x3=6
3x3=9
4 x 3 = 12

9 x 3 = 27
Prof Asmaa El Hannani 2AP-S3 116

20
Exercice : les boucles

#include<stdio.h>
/* Ce programme permet d'afficher la tables de multiplication d’un chiffre
*/
int main ()
{
int i, n; /* declaration de i et n */
int resultat = 0;
printf ("Veuillez entrer un chiffre :");
scanf ("%d",&n);
for (i = 1; i < 10; i++){
resultat = i * n;
printf ("%d x %d = %2d\n",i,n,resultat);
}
return 0;
}
Prof Asmaa El Hannani 2AP-S3 117

21
Partie 3
LES POINTEURS ET LES
TABLEAUX

Prof Asmaa El Hannani 2AP-S3 118

Les pointeurs et les tableaux

1. Les pointeurs
2. Les tableaux
 Les chaînes de caractères
 Les tableaux à plusieurs indices

Prof Asmaa El Hannani 2AP-S3 119

1
Les pointeurs

Les pointeurs : définition

 Un pointeur est une variable qui contient l'adresse


d'une autre variable :
 d’une donnée,
 d’une fonction (fera l'objet du prochain cours).

Prof Asmaa El Hannani 2AP-S3 121

2
Déclaration d’un pointeur sur donnée

 La déclaration :
Type_donnee *Ident_ptr;

 Exemple :
int *pAdi;

/* pAdi est codé sur 4 octets (adressage 32


bits) et contiendra l'adresse d'un entier */

Prof Asmaa El Hannani 2AP-S3 122

Les opérateurs * et &

int i;
int *pAdi;

 &  pour accéder à l'adresse d'une donnée


 &i  le numéro de la case mémoire correspondant à la
variable i
 pAdi = &i;  pAdi correspondra aussi à l’adresse de i

 *  pour accéder au contenu d'une adresse


 *pAdi  permet d'accéder au contenu de l'adresse pAdi
 contenu de &i (adresse de i)  i

Prof Asmaa El Hannani 2AP-S3 123

3
L’adressage indirect

int i,*pAdi; i Adresse de i 10


contenant contenu
i = 10;

pAdi = &i; pAdi Adresse de pAdi Adresse de i


contenant contenu

Prof Asmaa El Hannani 2AP-S3 124

L’adressage indirect

int i,*pAdi; i Adresse de i 12


contenant contenu
i = 10;

pAdi = &i; pAdi Adresse de pAdi Adresse de i

*pAdi = 12; contenant contenu

Prof Asmaa El Hannani 2AP-S3 125

4
Arithmétique des pointeurs sur données

 Additions et soustractions d'entiers sur les adresses


contenues dans les pointeurs.

 Elles les déplacent de la quantité, qui a été


additionnée ou soustraite, multipliée par la taille en
octet du type de l'objet pointé.

Prof Asmaa El Hannani 2AP-S3 126

Exemple

double *pAd; 60 i = 80
int i = 80; 64 xx = 3.1415
double xx=3.1415; 100 pAd = ?

…… 60 i = 80
64 xx = 3.1415
pAd = &xx; 100 pAd = 64

pAd = pAd + i; 60 i = 80
64 xx = 3.1415
/* pAd +i*sizeof(double)
pAd + 80*8 octets */ 100 pAd = 704
Prof Asmaa El Hannani 2AP-S3 127

5
Exercice
 Expliquez les valeurs qui vont être afficher.
#include <stdio.h>
int main() {
int var =10;
int *p;
p= &var;
printf ( "%p \n", &var);
printf ( "%p \n", p);
printf ( "%d \n", var);
printf ( "%d \n", *p);
printf ( "%d \n", *(&var));
Printf ( "%p \n", p);
printf ( "%p ", &p);
return 0;
}
Prof Asmaa El Hannani 2AP-S3 128

Les Tableaux

6
Définition et Déclaration

 Un tableau est un ensemble d’éléments de même type désignés


par un identificateur unique ;
 chaque élément est repéré par un indice précisant sa position au sein de
l’ensemble.

 Déclaration:
Type_donnee Ident_Tab [NbElem];
 int, double, char …
 Ident_Tab : le nom du tableau, c'est le pointeur sur le tableau, c'est la
variable qui contient l'adresse du 1er élément du tableau
 NbElem : le nombre d’éléments du tableau

 Exemple: int tab[20];


Prof Asmaa El Hannani 2AP-S3 130

Quelques règles
 Chaque élément est repéré par sa position dans le tableau, nommée
indice et qui est placé entre [ ]. Le 1er élément du tableau déclaré
par int tab[20]; sera désigné par tab[0], le 2ème pat tab[1], ….
 Un indice peut prendre la forme de n’importe quelle expression
arithmétique de type entier.
 La dimension d’un tableau ne peut être qu’une constante ou une
expression constante. #define N 50
Ainsi, cette construction: … est correcte.
int t[N] ;
float h[2*N-1] ;
En revanche, elle ne le serait pas (en C) si N était une constante
symbolique définie par const int N=50, les expressions N et 2*N-1
n’étant alors plus calculables par le compilateur!
Prof Asmaa El Hannani 2AP-S3 131

7
L'initialisation explicite d'un tableau

 Un tableau peut être initialisé lors de sa déclaration :


int MyTab [5] = {1,4,8,7,6};
/* place les valeurs 1,4,8,7 et 6 dans
chacun des cinq éléments du tableau */

 La taille du tableau n'est pas obligatoire si le tableau est


initialisé à sa création.
int tableau[] = {10,20,30,40,50};

 Il est possible de ne mentionner dans les accolades que les


premières valeurs
int tab[5] = { 10, 20 } ;
int tab[5] = { 10, 20, 5 } ;

Prof Asmaa El Hannani 2AP-S3 132

Tableaux à un seul indice et Pointeur

 L’identificateur d’un tableau, lorsqu’il est employé seul (sans


indices à sa suite), est considéré comme un pointeur (constant)
sur le début du tableau

Prof Asmaa El Hannani 2AP-S3 133

8
Exemple

 Supposons, par exemple, que l’on effectue la déclaration


suivante :
int t[10];

 Les notations suivantes sont équivalentes:

t &t[0]
t+1 &t[1]
t+i &t[i]
t[i] *(t+i)

Prof Asmaa El Hannani 2AP-S3 134

Chaînes de caractères :
Tableau 1D de caractères
 Déclaration et initialisation :
char chaine[10];
char source[]="Ma premiere chaine de char";
char lettre[]={'t','a','r','a','t','a','t','a',0};

 Format:
printf("\nLe contenu de source est %s",source);

scanf("%s",chaine);
\\ou
gets(chaine);

Prof Asmaa El Hannani 2AP-S3 135

9
Exemple

 Imprimer une chaine de caractère à l’envers:

char *pfin;
char cBonjour [] = "Bonjour";
pfin = cBonjour + strlen(cBonjour);

do{
printf ("%c",*--pfin);
}while (cBonjour != pfin );

Prof Asmaa El Hannani 2AP-S3 136

Pour comprendre

 strlen(cBonjour) renvoie 7
 strlen est une fonction prédéfinie en C, qui donne le
nombre de caractères de la chaine donnée en paramètre.
 pfin = cBonjour + 7

Prof Asmaa El Hannani 2AP-S3 137

10
Tableau de Tableaux

 Déclaration:
Type_donne Indent_Tab_Tab[Nlign][Ncol];
 Nlign et Ncol sont des constantes entières

 Exemple
float mat[3][3];
int trice[3][3]={{1,1,1}, {1,1,1}, {1,1,1}};
printf("%d %d %d", trice[0][0],trice[1][1],trice[2][2]);
scanf("%f",&mat[0][0]); \*ou*\ scanf("%f",mat[0]);

Prof Asmaa El Hannani 2AP-S3 138

Tableau à 2 indices et Pointeurs

 Tab[i] est un pointeur constant sur un tableau de nCol


éléments.

 Tab est un pointeur constant sur un tableau d’adresses de


tableaux de nCol éléments

Prof Asmaa El Hannani 2AP-S3 139

11
Exemple
int t[3][4];

 Voici un schéma récapitulant les notations du slide précédent:

Prof Asmaa El Hannani 2AP-S3 140

Exercice:

 Ecrivez un programme qui remplie puis affiche un tableau


avec des chiffres de 0 à 9 en utilisant une boucle:
a) en utilisant le "formalisme tableau"
b) en utilisant le "formalisme pointeur"

 Ecrivez un programme qui lit 10 nombres entiers dans un


tableau (depuis la console) puis calcule et affiche la moyenne.

Prof Asmaa El Hannani 2AP-S3 141

12
Partie 4
LA PROGRAMMATION
MODULAIRE ET LES FONCTIONS

Prof Asmaa El Hannani 2AP-S3 120

Généralités

 Comme tous les langages, C permet de découper un


programme en plusieurs parties nommées souvent «modules ».
 Chaque module regroupe des fonctions de même nature
(Graphisme, Algorithmes principaux, interface utilisateur, …)
 Un seul des modules contient la fonction main ()

Prof Asmaa El Hannani 2AP-S3 121

1
Les avantages

 Cette programmation dite modulaire se justifie pour de


multiples raisons :
 Un programme écrit d’un seul tenant devient difficile à
comprendre et à maintenir dès qu’il dépasse une ou deux pages.
 La programmation modulaire permet d’éviter des séquences
d’instructions répétitives.
 La programmation modulaire permet le partage d’outils
communs qu’il suffit d’avoir écrits et mis au point une seule fois.
 La compilation est beaucoup plus rapide, car seuls les
modules qui ont été modifiés sont compilés.

Prof Asmaa El Hannani 2AP-S3 122

La mise en œuvre

Prof Asmaa El Hannani 2AP-S3 123

2
Introduction

 Une fonction vue du processeur


 C'est un code exécutable à une adresse en mémoire
terminé par une instruction de retour.
 À l'appel de la fonction, le micro-processeur exécute le
code à partir de l'adresse de la fonction et l'instruction
retour le fait revenir à l'instruction suivant l'appel.
 Des données peuvent être transmises à la fonction en
paramètres. Lors du retour une valeur peut être
récupérée.

Prof Asmaa El Hannani 2AP-S3 124

Introduction

Prof Asmaa El Hannani 2AP-S3 125

3
Introduction

 Une fonction du point de vue du programmeur


 Un programme est un ensemble de fonctions.
 Il s'exécute à partir de la fonction main ().
 En programmation structurée, le programme est divisé en
fonctions qui réalisent chacune une partie de la tâche
(modularité). Ceci facilite l'organisation et la mise au point
du programme.
 Un programmeur professionnel utilise des bibliothèques de
fonctions pour accélérer le développement de son
application.
Prof Asmaa El Hannani 2AP-S3 126

Introduction

Prof Asmaa El Hannani 2AP-S3 127

4
Fonction : Mise en oeuvre

#include <stdio.h>
/* 1) Le Prototypage */
int main()
{

/* 3) L'appel */

}
/* 2) La définition */
Prof Asmaa El Hannani 2AP-S3 128

Le Prototypage

 Syntaxe:
Type_Ret Ident_fonc (Type Argument,…);
 Exemples :
double CalcDiscri (double Arga, double Argb, double Argc);
int printf (const char *pFormat,… );
void fdouble (double *pVar);

 Localisation :
#include <stdio.h>
//c'est ICI pour le prototypage des fonctions
int main()
{…}
Prof Asmaa El Hannani 2AP-S3 129

5
La Définition
Paramètres formels
 Exemple:
double CalcDisc(double Arga,double Argb,double Argc)
{
// Déclaration des variables si besoin
// Instructions
return Argb*Argb-4*Arga*Argc;
}

 Localisation:
#include <stdio.h>
int main()
{…}
//c'est ICI les définitions des fonctions

Prof Asmaa El Hannani 2AP-S3 130

L'appel de la fonction

{ Paramètres effectifs
Double ValDisc;
……
ValDisc = CalcDisc(a,b,c);
……
}

 Localisation de l'appel :
 Dans n'importe quelle définition de fonction, y compris
dans sa propre définition  Récursivité

Prof Asmaa El Hannani 2AP-S3 131

6
Types de fonctions

 Les fonctions qui retournent quelque chose (si on ne met rien,


une fonction retourne un entier (int) par défaut). Pour cela, il
faut utiliser l'instruction return :
return expression;

 Exemple:
/* Une fonction calculant le produit de deux entiers */
/* Param. d'entrée : deux entiers, Type retour : entier */
int calcule_produit (int iExp1, int iExp2)
{
int iProduit;
iProduit = iExp1 * iExp2;
return iProduit;
}

Prof Asmaa El Hannani 2AP-S3 132

L’instruction return

 Voici quelques règles générales concernant cette instruction:


 L’instruction return peut mentionner n’importe quelle
expression.
 L’instruction return peut apparaître à plusieurs reprises dans

une fonction (par exemple dans des structures


conditionnelles)
 Une instructions return sans expression, interrompe
simplement l’éxecution de la fonction.
 Si le type de l’expression figurant dans return est différent
du type du résultat dans l’en-tête, le compilateur mettra
automatiquement en place des instructions de conversion.

Prof Asmaa El Hannani 2AP-S3 133

7
Types de fonctions

 Les fonctions qui ne retournent rien (void) . Elles sont


également appelées procédures:
void nom_fonction(déclarations_d'arguments)

 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);
}

Prof Asmaa El Hannani 2AP-S3 134

Passage de paramètres : par valeurs

//Prototypage On indique au compilateur que


void fonction1(double z); fonction1 est une fonction qui ne
retourne rien et qui admet pour
//Définition paramètre un double
void fonction1(double z)
{ On donne le code de la fonction.
z = z * 2.0;
Le compilateur réserve 8 octets de
printf("z = %lf\n",z);
la pile désignés par z. Pour le
}
moment, le contenu de cette zone
est indéterminé.
Lors de l'appel de la fonction, le
contenu de la zone repérée par z
sera multiplié par 2

Prof Asmaa El Hannani 2AP-S3 135

8
Exécution : Appel de la fonction
Zone de
8 octets 20.0
réservée
par x

/* A l'intérieur de la fonction
appelante par exemple le main()*/
double x = 20.0;
... Zone de
fonction1 (x); 8 octets
20.0
réservée
par z

Prof Asmaa El Hannani 2AP-S3 136

Exécution : Appel de la fonction


Zone de
8 octets 20.0
Hors de la portée de fonction1 réservée
par x

void fonction1 (double z)


{ Zone de
z = z*2.0; 8 octets
40.0
réservée
} par z

Prof Asmaa El Hannani 2AP-S3 137

9
Après l’exécution
Zone de
8 octets 20.0
réservée
par x

La zone mémoire réservée pour z n’est plus


accessible et le contenu de x n’a pas été
modifié.

Prof Asmaa El Hannani 2AP-S3 138

Passage de paramètres : par adresse

//Prototypage On indique au compilateur que


void fonction2(double *pz); fonction2 est une fonction qui ne
retourne rien et qui admet pour
//Définition paramètre un pointeur sur double
void fonction2(double *pz)
{ 4 octets désignés par pz sont
*pz = (*pz) * 2.0;
réservés dans la pile.
}

Ce qui est pointé par pz sera


multiplié par 2 lors de l'appel de la
fonction.

Prof Asmaa El Hannani 2AP-S3 139

10
Exécution : Appel de la fonction
Zone de
8 octets 20.0
réservée
par x

/* A l'intérieur de la fonction
appelante par exemple le main()*/
double x = 20.0;
... Zone de
fonction1 (&x); 4 octets
&x
réservée
par pz

Prof Asmaa El Hannani 2AP-S3 140

Exécution : Appel de la fonction


Zone de
8 octets 40.0
x est atteint par adressage indirect réservée
par x

void fonction1 (double z)


{ Zone de
*pz = (*pz)*2.0; 4 octets
&x
réservée
} par pz

Prof Asmaa El Hannani 2AP-S3 141

11
Après l’exécution
Zone de
8 octets 40.0
réservée
par x

La zone mémoire réservée pour pz n’est plus


accessible et le contenu de x a été modifié par
adressage indirect.

Prof Asmaa El Hannani 2AP-S3 142

A RETENIR !

 Pour modifier le contenu d'une variable déclarée


dans la fonction appelante par la fonction appelée, il
est nécessaire de passer en paramètre l'adresse de
cette variable.

 Donc, dans le prototypage et la définition de la


fonction, l'argument doit être un pointeur.

Prof Asmaa El Hannani 2AP-S3 143

12
Squelette d'un programme

Zone des directives de préprocesseur


#include …
#define …

Déclaration des variables de portée fichier


Prototypage des fonctions

Définition de la fonction main()


int main()
{
}

Définition de vos fonctions

Prof Asmaa El Hannani 2AP-S3 144

Résumé

 3 étapes pour la mise en œuvre :


 La définition,
 Le prototypage,
 et l'appel.
 Les arguments : (constante, variable, expression,
fonction)
 Si pas void alors return à la fin de la définition
 Passage par valeur et passage par adresse

Prof Asmaa El Hannani 2AP-S3 145

13
La fonction main

 La fonction principale main est une fonction comme les autres.


Elle est souvent déclarée sans type.
 En fait la fonction main est de type de retour int dont la valeur
est 0 si l'exécution se passe bien différente de 0 sinon
 On peut utiliser deux constantes définies dans la librairie stdlib.h :
 EXIT_SUCCESS = 0

 EXIT_FAILURE = 1

 En principe la fonction main sans arguments et sans


arguments a pour prototype :
void main(void)

Prof Asmaa El Hannani 2AP-S3 146

La fonction main
 La fonction main peut également posséder des paramètres formels.
 En effet un programme C peut recevoir une liste d'arguments au
lancement de son exécution.
 La ligne de commande est dans ce cas là est composée du nom du
fichier exécutable suivi par des paramètres.
 main possède 2 paramètres formels appelés par convention :
int main (int argc, char *argv[]);
 argc (argument count) : variable de type int fourni le nombre de mots
composant la ligne de commande y compris l'exécutable.
 argv (argument vector) : est un tableau de chaînes de caractères
correspondant chacune à un mot de la ligne de commande.
 argv[0] contient le nom du fichier exécutable
 argv[1] contient le premier paramètre
 …
Prof Asmaa El Hannani 2AP-S3 147

14
Exemple: fonction main
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])


{
int a, b;
if (argc !=3)
{
printf("\nErreur : nombre invalide d'arguments");
printf("\nUsage : %s int int \n",argv[0]);
return(EXIT_FAILURE);
}
a = atoi(argv[1]);
b = atoi(argv[2]);
printf("\nLe produit de %d par %d vaut : %d \n", a, b, a*b);
return(EXIT_SUCCESS);
}
En mode ligne de commande on lance l'exécutable avec deux paramètres :
a.out 12 8
Prof Asmaa El Hannani 2AP-S3 148

La portée des variables

 Les variables locales sont temporaires et ne sont connues qu’à


l’intérieur de la fonction où elles sont déclarées.
 Leur portée est donc limitée à cette fonction.
 Il est toutefois possible de demander d’attribuer un emplacement
permanent à une variable locale et qu’ainsi sa valeur se conserve
d’un appel au suivant. Il suffit pour cela de la déclarer à l’aide du
mot-clé static

 Les variables globales sont permanentes et peuvent être


partagées par plusieurs fonctions.
 Leur portée (ou encore leur espace de validité) est limitée à la
partie du programme source qui suit leur déclaration;

Prof Asmaa El Hannani 2AP-S3 149

15
La portée des variables

 Exemple:
 VARLIFE.C

Prof Asmaa El Hannani 2AP-S3 150

Tableaux passés en paramètres à une


fonction
 Tableaux à une dimension (un indice)
Type_ret Ident(Type_Tab *Tab, int nSize, …);
OU
Type_ret Ident(Type_Tab Tab[], int nSize, …);

 Exemple
void affichetableau(float *tab, int Nb){

int i ;
for (i=0 ; i<Nb ; i++)
printf("valeur %d : %f \n", i, tab[i]);

Prof Asmaa El Hannani 2AP-S3 151

16
Tableaux passés en paramètres à une
fonction
 Tableaux à une dimension (un indice)
Type_ret Ident(Type_Tab *(Tab)[NCOL], int nLign, …);
OU
Type_ret Ident(Type_Tab Tab[][NCOL], int nLign, …);

 Exemple
void affiche2D(float *tab[10], int NbLign){
int i,j ;
for (i=0 ; i<NbLign ; i++)
for (j=0 ; j<10 ; j++){
printf("%f ", tab[i]);
}
printf("\n");
}
}
Prof Asmaa El Hannani 2AP-S3 152

La Récursivité

 La fonction s'appelle elle-même !


 Exemple:
//Prototype
double Factorielle (int n);

//définition de la fonction
double Factorielle (int n)
{
if (n <= 0){
return 1;
}
return n*Factorielle (n-1);
}

Prof Asmaa El Hannani 2AP-S3 153

17
Les fichiers en-tête

 Grâce à la directive #include, vous pouvez demander au


préprocesseur d’introduire des instructions (en langage C)
provenant de ce que l’on appelle des fichiers «entête».

 De tels fichiers comportent, entre autres choses :


 des prototype relatives aux fonctions prédéfinies.
 des définitions de type utilisateurs (structures).
 des définitions de macros prédéfinies.

Prof Asmaa El Hannani 2AP-S3 154

Exercice: Qu’affichent les programmes suivants ?

A.

Prof Asmaa El Hannani 2AP-S3 155

18
Exercice: Qu’affichent les programmes suivants ?

B.

Prof Asmaa El Hannani 2AP-S3 156

19
Partie 5
STRUCTURES ET FICHIERS

Prof Asmaa El Hannani 2AP-S3 187

Structures

1
Types de variables personnalisés

 Le langage C permet de faire quelque chose de très puissant :


créer des « types de variables personnalisés », .

 Créer de nouveaux types de variables devient indispensable


quand on cherche à faire des programmes plus complexes.

 Les structures sont un des types de variables personnalisés les


plus utilisés en langage C .

Prof Asmaa El Hannani 2AP-S3 189

De la fiche à la structure

 Pour gérer une clientèle, une bibliothèque, un stock


de pièces détachées, etc… on a besoin d'informations
sur chacun des éléments de l'ensemble.
 Ces informations sont consignées dans des fiches qui
sont remplies grâce à un formulaire unique.
 C'est le formulaire qui structure les informations
contenues dans les fiches.

Prof Asmaa El Hannani 2AP-S3 190

2
La fiche d'un élève

Nom : Mahfoudh Prénom : Najib


Adresse : Av. Ahmed Chaouki
Département : 123
Année : 2010
Spécialité : 1
Login : ENSAJ10 Password : juste00
Email : Najib.Mahfoudh@c_juste.fr

Prof Asmaa El Hannani 2AP-S3 191

Traduction Informatique

 Formulaire Type de donnée


Modèle
Structure struct

 Fiche Variable de type


Objet
struct

 Fichier Tableau ou liste de Ensemble


variables de type d’objet
struct
Prof Asmaa El Hannani 2AP-S3 192

3
Structure

 La structure, va nous permettre de désigner sous un


seul nom un ensemble de valeurs pouvant être de
types différents.

 L’accès à chaque élément de la structure (nommé


champ) se fera, cette fois, non plus par une indication
de position, mais par son nom au sein de la structure.

Prof Asmaa El Hannani 2AP-S3 193

Définir une structure

 Les structures sont généralement définies dans les fichiers.h,


au même titre donc que les prototypes et les define.
 Dans un programme mono-fichier il faut les placer après les
include.

struct nom_struc
{
type_1 ident_champ1;
type_2 ident_champ2,ident_champ3;
type_3 ident_champ4;
};

Prof Asmaa El Hannani 2AP-S3 194

4
Exemple 1 : Définition du type ETUDIANT

struct ETUDIANT
{
char Nom[80];
char Prenom[80];
char Adresse[200];
int Depart;
int Annee;
int Spec;
char Login[10];
char Passw[8];
char Email[30];
};
 Cette déclaration définit un modèle de structure mais ne réserve pas de
variables correspondant à cette structure.
 Ce modèle s’appelle ici ETUDIANT et il précise le nom et le type de
chacun des champs constituant la structure.
Prof Asmaa El Hannani 2AP-S3 195

Déclaration d'une donnée

 Syntaxe
struct nom_struc nom_var;

 Exemple
struct ETUDIANT UnEleve; //variable
struct ETUDIANT TabElev[250]; //tableau
struct ETUDIANT *pElev; //pointeur

 Pour ne pas devoir mettre le mot struct à chaque déclaration


d’une donnée il faut utiliser l’instruction typedef !

Prof Asmaa El Hannani 2AP-S3 196

5
Simplifier la déclaration de types: typedef
 La déclaration typedef permet de définir ce que l’on nomme en
langage C des types synonymes.
 A priori, elle s’applique à tous les types et pas seulement aux structures.
Typedef struct ETUDIANT Etudiant;
struct ETUDIANT
{ Le nom de ce nouveau
char Nom[80]; type est Etudiant
char Prenom[80];
.
.
. définition d'un type synonyme au type
char Email[30]; Struct ETUDIANT
};
 Écrire le mot Etudiant est désormais équivalent à écrire
struct ETUDIANT lors de déclaration de variable:
Etudiant UnEleve; //variable
Etudiant TabElev[250]; //tableau
Etudiant *pElev; //pointeur
Prof Asmaa El Hannani 2AP-S3 197

Utilisation d’une structure

 En C, on peut utiliser une structure de deux manières :

 en travaillant individuellement sur chacun de ses champs ;


 en travaillant de manière globale sur l’ensemble de la
structure.

Prof Asmaa El Hannani 2AP-S3 198

6
Accès aux champs de la structure
 Syntaxe :
 Si variable de type structure non_struc:
nom_struc.nom_var

 Exemple:
Etudiant UnEleve;
UnEleve.Annee = 2001;

 Si pointeur sur type structure nom_struct:


nom_ptr_struc->nom_var
(*nom_ptr_struc).nom_var

 Exemple:
Etudiant TabElev[250];
TabElev->Annee = 2001;

Prof Asmaa El Hannani 2AP-S3 199

Exemple:

int main()
{ Déclarations des variables
Etudiant TabElev[250]; TabElev et UnEleve de
Etudiant UnEleve; type Etudiant

printf("\nNom de l'élève :");
scanf ("%s",UnEleve.Nom);
printf("\nAnnée de l'élève :");
Utilisation de ces
scanf ("%d",&UnEleve.Annee);
variables

TabElev[10] = UnEleve;
TabElev[10].Depart = 123
TabElev+10->Annee = 2017;
}

Prof Asmaa El Hannani 2AP-S3 200

7
Initialisations de structures
 Comme pour les variables, tableaux et pointeurs, il est vivement
conseillé d’initialiser les structures dès leur création.
struct Coordonnees
{
int x;
int y;
};
 Il y a plusieurs façons d'initialiser une variable de type structure :
 en initialisant les champs un à un :
struct Coordonnees UnPoint;
UnPoint.x = 0;
UnPoint.y = 0;
 à la déclaration de la variable :
struct Coordonnees UnPoint = {0,0}
 à la déclaration de la variable, en les nommant :
struct Coordonnees UnPoint = {.x=0, .y=0}
Prof Asmaa El Hannani 2AP-S3 201

Utilisation globale d’une structure

 Il est possible d’affecter à une structure le contenu d’une structure


définie à partir du même modèle.

 Par exemple, si les structures point1 et point2 ont été déclarées


suivant le modèle Coordonnees défini précédemment, nous
pourrons écrire :
struct Coordonnees point1 = { 2, 10} ;
struct Coordonnees point2;
point2 = point1 ;

 Une telle affectation globale remplace avantageusement :


Point2.x = point1.x ;
Point2.y = point1.y ;

Prof Asmaa El Hannani 2AP-S3 202

8
Transmission d’une structure en argument d’une
fonction
 Arguments et paramètres d'une fonction, sans la structure :
void NewElev(char pNom,char pPrenom,char pAdr,int
pDepart, int pAnnee,int pSpec,char lplogin,char
ppass,char pemail);

 En utilisant la structure :
 Transmission de la valeur d’une structure

void NewElev(Etudiant Nouveau);

 Transmission de l’adresse d’une structure


void NewElev(Etudiant *pNouveau);

Prof Asmaa El Hannani 2AP-S3 203

Exemple complet

 Voir l’exemple: ETUDIANT.c

Prof Asmaa El Hannani 2AP-S3 204

9
Fichiers

1 Fichier sur 1 Disque

 Un fichier est caractérisé par


 Chemin d'accès "path" :

 Le mode d'accès
 Les attributs de protection

Prof Asmaa El Hannani 2AP-S3 206

10
Gestion de Fichiers pour le programmeur

 Transférer l'information d'une source vers une destination.


 Par conséquent, gérer un flot d'informations.

Prof Asmaa El Hannani 2AP-S3 207

La direction du Flot

 Dans la gestion d'un flot, au moins l'une des destinations est la


mémoire de l'ordinateur.
 Pour écrire dans le fichier les informations de la mémoire, on
accède au fichier en écriture.
 Le flot est en sortie.
 Pour lire les informations du fichier et les stocker dans la
mémoire, on accède au fichier en lecture.
 Le flot est en entrée.

Prof Asmaa El Hannani 2AP-S3 208

11
Ouverture/Fermeture de flots en C

 Toutes les fonctions de gestion des flots admettent


comme paramètre un pointeur sur la structure FILE
définie dans stdio.h.

 On ouvre le flot en appelant fopen() qui affecte une


valeur à cette variable pointeur.

 Le flot est fermé par fclose().

Prof Asmaa El Hannani 2AP-S3 209

Les Modes d'ouverture

 Les flots/fichiers peuvent être ouverts en mode :


 "r": lecture seule. Le fichier doit avoir été créé au préalable.
 "w": écriture seule. Si le fichier n'existe pas, il sera créé.
 "a": mode d'ajout. Le texte sera ajouté à la fin du fichier. Si le fichier
n'existe pas, il sera créé.
 "r+": lecture et écriture. On peut lire et écrire dans le fichier. Le
fichier doit avoir été créé au préalable.
 "w+": lecture et écriture, avec suppression du contenu au préalable. Si
le fichier n'existe pas, il sera créé.
 "a+": ajout en lecture / écriture à la fin. Vous écrivez et lisez du texte
à partir de la fin du fichier. Si le fichier n'existe pas, il sera créé.
 Si la lecture ou l'écriture doivent être faits en binaire, il faut
ajouter "b" au mode (ex : "rb","wb","ab","rb+","wb+","ab+").
Prof Asmaa El Hannani 2AP-S3 210

12
Les Fonctions générales

 Création, ouverture d'un fichier


 FILE *fopen(const char *nom, const char *mode)

 Fermeture d'un fichier


 int *fclose(FILE *stream)

 Fin d'un fichier


 int feof(FILE *stream)

Prof Asmaa El Hannani 2AP-S3 211

Écriture dans un fichier

 Ecriture au format texte :


int fprintf(FILE *pfile,const char *format, …)
/* écrit la chaîne formatée dans le fichier. Elle
retourne le nombre de caractères écrits, ou un nombre <0
si erreur */

int fputc(int caractere,FILE *pfile)


/* cette fonction écrit le caractère c (converti en
unsigned char). le caractère écrit est retourné, EOF
sinon */

int fputs(const char *s,FILE *pfile)


/* cette fonction écrit la chaîne s dans le fichier. Elle
retourne une valeur positive ou nulle, EOF s'il y a eu
une erreur */

Prof Asmaa El Hannani 2AP-S3 212

13
Écriture dans un fichier

 Ecriture au format binaire :


size_t fwrite(const void *source,size_t taille,
size_t nombre, FILE *pfile)
/* cette fonction écrit plusieurs blocs, chacun ayant la
taille indiquée, qui se trouvent les uns à la suite des
autres à l'adresse indiquée par source. Elle renvoie le
nombre d'objets écrits, qui peut être inférieur au nombre
demandé (en cas d'erreur). */

Prof Asmaa El Hannani 2AP-S3 213

Exemple1: Enregistrer séquentiellement dans un


fichier texte une suite de nombres entiers saisis au clavier.

Prof Asmaa El Hannani 2AP-S3 214

14
Lecture depuis un fichier
 Lecture au format texte :
int fscanf(FILE *pfile,const char *format,…)
/* cette fonction lit la chaîne formatée dans le fichier.
Elle retourne le nombre de caractères luts, ou un nombre
<0 si erreur */

int fgetc(FILE *pfile)


/* Renvoie le caractère suivant sur le flot indiqué, ou
EOF si la fin du fichier est atteinte ou si une erreur
survient. C'est une vraie fonction */

int fgets(char *s,int n,FILE *pfile)


/* cette fonction lit des caractères dans le fichier et
les place dans l'espace pointé par s. Elle s'arrête
lorsqu'elle a lu n-1 caractères ou lorsqu'elle a rencontré
un caractère '\n‘. Elle retourne le pointeur chaîne en cas
de lecture sans erreur, ou NULL dans le cas de fin de
fichier ou d'erreur. */
Prof Asmaa El Hannani 2AP-S3 215

Lecture depuis un fichier

 Lecture au format binaire :


size_t fread(void *dest, size_t taille,
size_t nombre, FILE *pfile)
/* cette fonction lit sur le flot indiqué le nombre
objets, chacun ayant la taille indiquée, et les copie les
uns à la suite des autres dans l'espace pointé par
destination .*/

Prof Asmaa El Hannani 2AP-S3 216

15
Exemple2: Lister le contenu d’un fichier quelconque
tel qu’il a pu être créé par Exemple1.

Prof Asmaa El Hannani 2AP-S3 217

Positionnement dans un fichier


 Déplacement :
int fseek(FILE *pfile,long deplacement,int orig)
avec orig = SEEK_SET déplacement depuis le début du fichier,
SEEK_CUR déplacement depuis la position courante,
SEEK_END déplacement depuis la fin du fichier
 Re-positionnement au début du fichier :
void rewind(FILE *pfile)

 Connaître la position dans le fichier :


void fgetpos(FILE *flot, fpos_t *ptr)
/*Place dans ptr la position courante dans le fichier
indiqué en vue de son utilisation par fsetpos*/
 Fixer la position dans le fichier :
void fsetpos(FILE *flot, const fpos_t *ptr)

Prof Asmaa El Hannani 2AP-S3 218

16
Exemple3: Enregistrer séquentiellement dans un
fichier texte une suite de nombres entiers saisis au clavier.

Prof Asmaa El Hannani 2AP-S3 219

Exemple4: Afficher l’entier qui se trouve à un rang


quelconque dans un fichier tel qu’il a pu être créé par Exemple3.

Prof Asmaa El Hannani 2AP-S3 220

17
Détection de la fin d'un fichier
 Lors de la fermeture d'un fichier ouvert en écriture, la fin du fichier
est marquée automatiquement par le symbole de fin de fichier EOF
(End Of File).
 Lors de la lecture d'un fichier, la fonction int feof(FILE *stream)
nous permettent de détecter la fin du fichier. Elle retourne une
valeur différente de zéro, si la fin du fichier est atteinte; sinon la
valeur du résultat est zéro.
 Une boucle de lecture typique pour lire un fichier référencé par un
pointeur FP peut avoir la forme suivante:
FP = fopen("C:\\AUTOEXEC.BAT", "r");
while(1){ Il faut indiquer le symbole '\' (back-slash)
fread(...) ; par '\\', pour qu'il ne soit pas confondu
if (feof(entree)) avec le début d'une séquence
break; d'échappement (p.ex: \n, \t, \a, ...).
...
}
Prof Asmaa El Hannani 2AP-S3 221

Exemple5: Lister le contenu d’un fichier binaire


tel qu’il a pu être créé par Exemple3.

Prof Asmaa El Hannani 2AP-S3 222

18
Les flots prédéfinis

 3 pointeurs sur structure FILE sont gérés par le


système d'exploitation :
 stdin gère les informations envoyées par le clavier
(entrée).
 stdout gère les informations dirigées vers l'écran
(sortie).
 stderr dirige les informations générées par les erreurs
vers un périphérique de sortie.

Prof Asmaa El Hannani 2AP-S3 223

Exemple

 Dans cet exemple la chaine "toto et titi" est afficher


sur l’écran:

Prof Asmaa El Hannani 2AP-S3 224

19
Exercice (solution file.c)
On veut réaliser un répertoire téléphonique. Chaque personne est représentée
dans le répertoire par un nom, prénom et le numéro de téléphone.
 définir un type de structure Personne qui contient deux chaînes de caractères et un
entier.
 écrire une fonction void ajout_personne (FILE *rep) qui saisit une personne et
l'ajoute à la fin du fichier passé en paramètre
 écrire une fonction void affiche_ensemble_personne (FILE *rep) qui affiche le
contenu du fichier
 écrire une fonction void trouve_numéro_personne (FILE *rep, char *nom) qui
permet de trouver le numéro de téléphone d’une personne donnée en paramètre
 écrire une fonction void changer_numéro_personne (FILE *rep, char *nom) qui
permet de changer le numéro de téléphone d'une personne donnée en paramètre
 écrire une fonction void menu(FILE *rep) qui demande l'opération à exécuter :
ajouter une personne, afficher le contenu du répertoire, trouver un numéro ou
quitter le programme
 écrire le programme principal
Prof Asmaa El Hannani 2AP-S3 225

20

Vous aimerez peut-être aussi