Tpalgo Langc L1mi L1inf L1maths 2022 Lesboucles
Tpalgo Langc L1mi L1inf L1maths 2022 Lesboucles
Tpalgo Langc L1mi L1inf L1maths 2022 Lesboucles
Exemple :
<Directives de compilation>
<Déclaration de variables externes>
<Déclaration de prototypes de fonctions>
main ( )
{
corps du programme
(commentaires,
déclaration de variables et constantes, instructions)
}
<Définition de fonctions>
Remarque :
Nous nous intéressons dans ce chapitre aux directives de compilation et différents éléments de base
composant le corps du programme.
Syntaxe :
#include < nom_fichier>
1
indique le fichier de bibliothèque C à inclure dans le programme. Ce fichier contient les définition
Algorithmes et langage C
Directives de compilation
#include <stdio.h> /*ce fichier contient les fonctions d'entrées/sorties comme printf*/
/*pi sera remplacé par la valeur 3.14*/
#define pi 3.14 /*entier sera remplacé par le type prédéfini int*/
#define entier int /*la macro somme(x,y) sera remplacée par x+y*/
#define somme(x,y) x+y
3 LES COMMENTAIRES
Un commentaire est un texte placé entre les signes /* et */. Il permet de commenter une ou plusieurs
lignes de commandes en vue d'éclairer le lecteur.
Syntaxe :
/* texte du commentaire */
Exemples :
Commentaires
main( )
{
printf("bonjour");
/* ce programme affiche bonjour*/
}
Syntaxe :
Type identificateur;
Ou
Type identificateur1, identificateur2, … ,identificateur n;
Déclaration de variables
a) Identificateurs
Exemples :
2
Algorithmes et langage C
Identificateurs
solution1 est un identificateur valide (constitué de lettres et de 1)
1solution n'est pas un identificateur valide.
prix unitaire n'est pas un identificateur valide (Il contient un espace).
prix_unitaire est un identificateur valide.
jour, Jour et JOUR sont 3 identificateurs différents
int n'est pas un identificateur valide. C'est un mot utilisé en C
b) Types de données
Types simples prédéfinis en C
Type Signification Représentation système
Taille Valeurs limites
(bits)
int Entier 16 -32768 à 32767
short (ou short int) Entier 16 -32768 à 32767
long (ou long int) Entier en double longueur 32 -2147483648 à 2147483647
char Caractère 8
float (ou short float) Réel 32 ± 10-37 à ± 1038
double(ou long float) Réel en double précision 64 ± 10-307 à ± 10308
long double Réel en très grande précision 80 ± 10-4932 à ± 104932
unsigned Non signé (positif) 16 0 à 65535
Remarques :
int équivaut à short sur PC et à long sur station.
La fonction sizeof retourne la taille en octets d'un objet.
3
Algorithmes et langage C
Exemples :
n=sizeof(int); /* n reçoit 2 */
n=sizeof(3.14); /* n reçoit 8 */
c) fonctions prédéfinies sur les types simples : Des fonctions appliquées aux différents
types de données sont prédéfinies dans des fichiers de bibliothèque C.
Fonctions mathématiques
Math.h
Ce fichier contient des fonctions mathématiques pouvant être appliquées aux types numériques.
Exemples :
ctype.h
Ce fichier contient les définitions des fonctions pouvant être appliquées à des caractères.
Ces fonctions permettent de vérifier si un caractère appartient à une catégorie donnée. Elles retournent 0 si faux et u
Fonction Signification
isalpha (c) c est une lettre
isupper (c) c est une lettre majuscule
islower (c) c est une lettre minuscule
isdigit (c) c est un chiffre
isxdigit (c) c est hexadécimal [0-9], [A-F] ou [a-f]
isalnum (c) c est alphanumérique (chiffre ou lettre)
isspace (c) c est un blanc, tabulation, retour chariot, newline ou formfeed
ispunct (c) c est un caractère de ponctuation
isprint (c) c est un caractère imprimable (de 32 (040) à 126 (0176) tilde)
isgraph (c) c est un caractère imprimable différent d'espace
iscntrl (c) c est un caractère de contrôle différent d'espace et (<32) ou delete (0177)
isascii (c) c est un caractère ASCII (0 c < 128)
4
Algorithmes et langage C
4.2 DECLARATION DE CONSTANTES
Remarque:
Une valeur constante peut, également, être exprimée au moyen d’un identificateur défini en
utilisant la directive define: #define Identificateur Valeur
Exemples :
Déclaration de constantes
main( )
1- {
const float pi=3.14; printf("pi égale à %f",pi);
/*déclare la constante pi avec const*/
}
/*affiche la valeur de pi*/
#define pi 3.14 main( )
{
2- printf("pi égale à %f",pi); /*définit la constante pi avec define*/
}
/*affiche la valeur de pi*/
Une valeur initiale peut être affectée à une variable dès la déclaration sous forme :
Syntaxe :
Exemples :
Initialisation de variables
main( )
{
int i, j=3, k; float f=1.2/*
e5;
seul
intj i=011;
est initialisé
char c='A';
à 3*/ char c=65;
} /* f est initialisé à 120000 (1.2*105)*/
/* i est initialisé à 11 en octal soit 9 en décimal*/
/* c est initialisé à la lettre A*/ 5
/* c est initialisé à A dont le code ASCII est 65*/
Algorithmes et langage C
Remarque :
Des caractères spéciaux sont représentés à l'aide du métacaractère \.
6
Algorithmes et langage C
Exemples :
Représentation Signification
\0 Caractère NULL
\a Bip (signal sonore)
\b Espace arrière
\t Tabulation
\n Nouvelle ligne
\f Nouvelle page
\r Retour chariot
\" Guillemet
\' Apostrophe
\\ Antislash (\)
\ddd Caractère ayant pour valeur ASCII octale ddd
\x hhh Caractère ayant pour valeur ASCII hexadécimale ddd
5 L’AFFECTATION (ASSIGNATION)
L'affectation est l'opération qui attribue à une variable, au moyen de l'opérateur =, une valeur
constante ou résultat d'une expression.
Syntaxe :
Exemples :
Affectation
main( )
{
int i, j; i=2; j=(i*3)+5; i=j=2;
}
/*i reçoit 2*/
/*j reçoit 11 résultat de (2*3)+5*/
/*j reçoit d'abord 2 puis i reçoit la valeur de j (2)*/
7
Algorithmes et langage C
Remarque :
C permet de faire des assignations entre des variables de types différents. Des
conversions de types sont alors automatiquement réalisées.
8
Algorithmes et langage C
Exemples :
1- main( )
{
int i; /*i entier*/
float j=3.5; i=j; /*j réel initialisé à 3.5*/
} /*i reçoit 3, le résultat est tronqué*/
2- main( )
{
int i; /*i entier*/
char c='A'; i=c; /*c caractère initialisé à A*/
} /*i reçoit 65 le code ASCII de A*/
6 LES ENTREES/SORTIES
6.1 L’AFFICHAGE
Syntaxe :
Fatima-Zahra BELOUADHA 9
Algorithmes et langage C
Exemples :
Affichage
main( )
{
Remarques :
Fatima-Zahra BELOUADHA 10
Algorithmes et langage C
Syntaxe :
Remarque :
Seules les variables scalaires (entiers, réels et caractères) doivent être précédées de &.
Exemples :
Lecture
Fatima-Zahra BELOUADHA 11
Algorithmes et langage C
Remarques :
7 LES OPERATEURS
+addition
-soustraction
*multiplication
/division
%reste de la division entière
Exemples :
Opérateurs arithmétiques
main( )
{
int i=9,j=4,k;/*i, j et k entiers*/
float x=9.0, y;/*x et y réel*/
Remarques :
l'opérateur / effectue, en fonction du type des opérandes, une division
entière (euclidienne) ou réelle.
L'ordre des priorités des opérateurs est important.
Il est possible de forcer la conversion du type d'une variable ou d'une
expression en les préfixant d'un type au choix.
Fatima-Zahra BELOUADHA 12
Algorithmes et langage C
Exemples :
Conversion de types
main( )
{
int i=9,j=4; float y; y=(float) i / j; y=(float) (i/j);
} /*i et j entiers*/
/*y réel*/
/*y reçoit 2.25 (i est converti d'abord en réel=9.0)*/
/*y reçoit 2.0 (l'entier 2 (i/j) est converti en réel)*/
Opérateurs signification
! Non logique
> >= < <= Test de supériorité et d'infériorité
== et != Test d'égalité et d'inégalité
&& et || ET et OU logique
Exemples :
Opérateurs logiques
#include <stdio.h> main( )
{
int a,b,c;
/*a,b et c entiers*/
printf ("Introduire a, b et c : "); scanf ("%d%d%d",&a,&b,&c);
Fatima-Zahra BELOUADHA 13
Algorithmes et langage C
Remarques :
Exemples :
Opérateur Traitement
& et binaire
| ou binaire
^ ou exclusif
<< décalage à gauche
>> décalage à droite
~ complément à 1
Fatima-Zahra BELOUADHA 14
Algorithmes et langage C
Exemples :
Opérateurs de traitement de bits
main( )
{
int i=597; int u=12;
/*i est 0000 0010 0101 0101 en binaire, 255 en hexadécimal*/
/*u est 0000 0000 0000 1100 en binaire*/
i= i & 0x FFFE; /*i reçoit 0000 0010 0101 0100 en binaire,254 en hexadécimal*/
v= u >> 2;/*v reçoit 0000 0000 0000 0011 en binaire, 3 en décimal (u est décalé de 2 bits à droite
v= ~u;/*v reçoit 1111 1111 1111 0011 (complément à 1 de u)*/
}
Syntaxe :
if (condition)
{
instruction1; instruction2;
… instructionn;
Traitement
}
Exemples :
Instruction if
#include <stdio.h> main( )
{
int a,b;
printf ("Introduire a et b : "); scanf ("%d%d",&a,&b);
/*a et b entiers*/
if (a==0)
{
printf("zéro\n"); printf("FIN\n");
/*si a=0 affiche les messages zéro puis FIN*/
}
if (a==1)
printf("un\n");
/*si a=1 affiche le message un*/
Fatima-Zahra BELOUADHA 15
Algorithmes et langage C
Remarque :
Lorsque if est utilisée avec else, elle indique également le traitement à faire si la condition
n'est pas vérifiée.
Syntaxe :
if (Condition)
{
instruction1;
instruction2;
Traitement1
… instructionn;
}
else
{
instruction1'; instruction2';
Traitement2
… instructionn';
Exemples :
Instruction if else
if (a==b)/*si a=b affiche a égale à b sinon affiche a différent de b */ printf("a égale à b\n");
else
printf("a différent de b\n");
}
Remarque :
Fatima-Zahra BELOUADHA 16
Algorithmes et langage C
Exemples :
Instructions if else imbriquées
#include <stdio.h>
main( )
{
int a,b,z,n; /*a, b,z et n entiers*/
if (n>0)
if (a>b) /*si n>0 et a>b*/
z=a;
else /*si n>0 et a<=b (else se rapporte à if (a>b))*/
z=b;
if (n>0)
{
if (a>b) /*si n>0 et a>b*/
z=a;
}
else /*si n<=0 (else se rapporte à if (n>0))*/
z=b;
}
Syntaxe :
Fatima-Zahra BELOUADHA 17
Algorithmes et langage C
Exemples :
Instruction switch
#include <stdio.h> main( )
{
int a; char c;
/*a entier*/
/*c char*/
printf ("Introduire un nombre et une lettre: "); scanf ("%d%c",&a,&c);
switch (a)/*le programme traite tous les cas de a (0,1 ou autres)*/
{
case 0 :
printf ("Le nombre introduit est zéro\n"); break;
case 1 : printf ("Le nombre introduit est 1\n"); break;
printf ("Le nombre introduit est différent de 0 et 1\n");
default :
}
switch (c)/*Ici, on traite uniquement les cas où c égale à x ou y*/
{
case 'x' : printf ("La lettre saisie est la lettre x\n"); break;
printf ("La lettre saisie est la lettre y\n"); break;
case 'y' :
}
}
Remarque :
Syntaxe :
while (Condition)
{
Traitement (bloc d'instructions qui se terminent par ;)
}
fonctionnement :
Le système teste d'abord si la condition est vraie; si oui, exécute le traitement et remonte automatiq
Fatima-Zahra BELOUADHA 18
Algorithmes et langage C
Exemples :
Instruction while
#include <stdio.h> main( )
{
int n,somme=0;
while (n>0) /*tant que n>0, le programme rajoute n à la somme obtenue puis décrémente n
{
s=s+n; n--;
}
printf ("%d",somme); /*le programme affiche la somme des nombres compris entre 0 et n*/
}
Remarque :
Syntaxe :
do
{
Traitement (bloc d'instructions qui se terminent par ;)
}
while (Condition) ;
fonctionnement :
Le système exécute d'abord le traitement puis teste si la condition est vraie; si oui, il remonte autom
Fatima-Zahra BELOUADHA 19
Algorithmes et langage C
Exemples:
Instruction do while
}
while (i<=n) ;
printf ("%d",somme); /*le programme affiche la somme des nombres compris entre 0 et n*/
}
Remarque :
Exemple:
Instructions while et do while
#include <stdio.h> main( )
{
int i=3;/*i entier initialisé à 3*/
do
{
printf ("%d",i); i++;
}
while (i<3) ; /*avec do while, i (3) sera affiché même si la condition i<3 est fausse au début*/
Fatima-Zahra BELOUADHA 20
Algorithmes et langage C
Syntaxe :
for (Initialisations;Condition;Instructions)
{
Traitement (bloc d'instructions qui se terminent par ;)
}
fonctionnement :
for commence au départ, par effectuer les initialisations (en premier argument), exécute le traiteme
Exemples:
Instruction for
for (i=2, j=4; i<5 && j>2; i++, j--) /*pour i allant de 2 à 4 et j de 4 à 3,
le programme affichera i et j si i<5 et j>2*/
printf ("i:%d et j:%d\n",i,j);
Break permet de sortir directement de la boucle (for, while ou do while) la plus interne.
Continue permet de passer directement à l'itération suivante de la boucle la plus interne.
Fatima-Zahra BELOUADHA 21
Algorithmes et langage C
Exemple:
Syntaxe :
goto Etiquette ;
fonctionnement :
Le système interrompt l'exécution séquentielle du programme, remonte ou déscend à la ligne appe
Exemple:
Instruction Goto
Remarque :
Goto a la réputation de rendre les programmes moins lisibles. Néanmoins,
son utilisation est importante dans des cas qui l'impose.
Fatima-Zahra BELOUADHA 22
Algorithmes et langage C
Fatima-Zahra BELOUADHA 23
Algorithmes et langage C
Un tableau est une collection homogène de données, ordonnée et de taille statique. Il fut un
ensemble d'octets permettant de représenter une liste d'éléments de même type. Chaque
élément est repéré par un indice (son rang dans le tableau).
Exemple :
Tableau t 0 1 2 3 4 5 6
15 20 25 30 100 200 150
1.1 DECLARATION
Syntaxe :
Type Identificateur [Taille constante] ;
La Taille du tableau est le nombre de ses éléments. Elle ne peut être une variable. Elle doit être u
exemples:
Déclaration de tableaux
#include <stdio.h>
Remarque :
Les indices d'un tableau sont des entiers commençant à 0.
Fatima-Zahra BELOUADHA 24
Algorithmes et langage C
Exemples:
Représentation physique d'un tableau
#define taille 3 /*taille: constante de valeur 3*/ main( )
{
Supposant que T a été mémorisé à l'adresse mémoire 100, un caractère étant codé sur un octet, le conten
T=&T[0]=100
1.3 INITIALISATION
Syntaxe :
Type Identificateur [Taille constante] = {Valeur1, Valeur2,…,Valeurn};
Exemples:
Initialisation de tableaux
Fatima-Zahra BELOUADHA 25
Algorithmes et langage C
Remarque :
Exemple:
Lecture et affichage de tableaux
Remarque :
1.5 AFFECTATION
L'affectation de valeurs aux éléments d'un tableau se fait également individuellement (comme
pour la lecture et l'affichage).
Exemple:
Affectation de valeurs à un tableau
#include <stdio.h>
#define taille 20 main( ) /*taille: constante de valeur 20*/
{
int i, t [taille];
for(i=0;i<taille;i++) t[i]=i; /*t: tableau de 20 entiers*/
} /*affecte i à chaque élément d'indice i*/
Remarques :
L'affectation d'un tableau B à un autre tableau A se fait élément par élément. Une
affectation "brutale" de B à A (A=B) n'est pas possible.
L'affectation élément par élément d'un tableau B à un autre tableau A (A[i]=B[i]) réalise
une copie de B dans A.
Fatima-Zahra BELOUADHA 26
Algorithmes et langage C
Exemple:
Affectation d'un tableau à un autre élément par élément
Contenu de la mémoire
Etat initial :
A B
adresse 100 adresse 200
7 4
8 5
9 6
A B
adresse 100 adresse 200
4 4
5 5
6 6
A B
adresse 100 adresse 200
0 4
1 5
2 6
Fatima-Zahra BELOUADHA 27
Algorithmes et langage C
Exemple:
Comparaison de deux tableaux
#include <stdio.h>
#define taille 20 /*taille: constante de valeur 20*/
main( )
{
char a [taille], b[taille]; /*a et b: tableaux de 20 caractères*/
int i, egaux; /*egaux entier utilisé comme variable logique égale à
vrai (1) ou faux (0)*/
for(i=0;i<taille;i++) /*lit les éléments de a et b*/
{
scanf ("%c",&a[i]);
scanf ("%c",&b[i]);
}
egaux=1; /*on suppose que a et b sont égaux*/
2 CHAINES DE CARACTERES
Une chaîne de caractères est un tableau de caractères. Elle représente un cas particulier des
tableaux qui bénéficie de certains traitements particuliers en plus de ceux réservés aux
tableaux en général. Une chaîne de caractères peut également être déclarée comme pointeur
sur char (voir le chapitre pointeurs).
2.1 INITIALISATION
Syntaxe :
char Identificateur[Taille constante] = "Texte\0" ;
Le caractère '\0' indique la fin de la chaîne de caractères. Il est conseillé de ne pas l'omettre.
Fatima-Zahra BELOUADHA 28
Algorithmes et langage C
Exemples:
main( )
{
char t [taille1]="ali"; /*t chaîne de caractères initialisée au mot ali*/
char a [taille2]="ali\0"; /*a chaîne de caractères initialisée au mot ali et terminée par le caractère '\
Une variable de type chaîne de caractères peut être lue et affichée caractère par caractère
au moyen de scanf et printf utilisant le format %c.
Elle peut également être lue (affichée) globalement (d'un seul coup) au moyen de la
fonction scanf (printf) utilisant cette fois-ci le format %s ou au moyen de la fonction gets
(puts).
Syntaxe :
scanf("%s", Chaîne de caractères); printf("%s", Chaîne de caractères); gets(Chaîne de caractère
Fatima-Zahra BELOUADHA 29
Algorithmes et langage C
Exemple:
/*Soit Turbo C la chaîne de caractères que l'on introduit lors de l'exécution de l'exemple suivant*/
#include <stdio.h>
#define taille 20 /*taille : constante de valeur 20*/ main( )
{
char t [taille];/*t : chaîne de caractères de taille 20*/ scanf ("%s",t);/*lit t (on ne met pas d'adresse &)*/ prin
gets (t);/*lit t (on ne met pas d'adresse &)*/
puts (t);/*affiche Turbo C*/
}
Des fonctions prédéfinies appliquées aux chaînes de caractères sont définies dans le fichier
"string.h". Nous en citons :
Exemples:
char a [taille], b[taille]="ali\0";/*a et b chaînes de caractères; b initialisée à "ali\0"*/ int n;/*n entier*/
n=strlen(b);/*n reçoit 3 (longueur du mot "ali")*/
strcpy(a,b);/*a reçoit la chaîne "ali\0"(copie de b)*/
n=strcmp(a,b);/*n reçoit 0 (résultat de la comparaison de a et b)*/
}
Fatima-Zahra BELOUADHA 30
Algorithmes et langage C
Remarque :
3.1 DECLARATION
Syntaxe :
Taillei est la taille de la dimension i. Elle doit être une constante définie avant ou au moment de la décla
Un élément d'un tableau t à n dimensions est repéré par ses indices, sous forme t[i1][i2]…[in].
Exemples:
/*Ce programme lit le nombre de buts marqués par chacun des 11 joueurs de 8 équipes*/
#include <stdio.h>
#define taille1 8 /*taille1: constante de valeur 8*/
#define taille2 11 /*taille2: constante de valeur 11*/
main( )
{
int t [taille1][taille2]; /*t : matrice de 8 lignes, 11 colonnes*/
int i, j;
Fatima-Zahra BELOUADHA 31
Algorithmes et langage C
#include <stdio.h>
#define taille1 5 /*taille1: constante de valeur 5 (5 étudiants)*/
#define taille2 2 /*taille2: constante de valeur 2 (2 matières)*/
#define taille3 4 /*taille2: constante de valeur 4 (4 notes)*/
main( )
{
float t [taille1][taille2][taille3];
int i,j,k;
for(i=0;i<taille1;i++) /*lit les quatre notes des étudiants étudiant par
étudiant, commençant par les notes d'informatique
puis celles des mathématiques*/
for (j=0; j<taille2;j++)
for (k=0; k<taille3;k++)
scanf ("%f",&t[i][j][k]);
}
3.2 INITIALISATION
Syntaxe :
TypeIdentificateur[m] … [p] = { Liste0, … , Listem-1} ;
Listei est l'initialisation de l'élément d'indice i et qui fut un sous tableau de dimension n-1 si n est la d
Exemple:
M
0 1
2 3
4 5
Fatima-Zahra BELOUADHA 32
Algorithmes et langage C
#define taille1 3 /*taille1: constante de valeur 3*/ #define taille2 2 /*taille2: constante de valeur 2*/ main( )
{
int M [taille1][taille2]={{0,1},{2,3},{4,5}};/*initialisation ligne par ligne*/
}/*M[0]={0,1}, M[1]={2,3} et M[2]={4,5}*/
Fatima-Zahra BELOUADHA 33
Algorithmes et langage C
Un pointeur sur une variable x est une variable qui contient l'adresse mémoire de la variable
x.
1 DECLARATION DE POINTEURS
Syntaxe :
Type_variable_pointée *Pointeur;
Exemples :
char *p; /*p peut contenir l'adresse d'une variable de type caractère ou chaîne de caractères*/
int *p; /*p peut contenir l'adresse d'une variable de type entier*/
Remarque :
Lorsqu'un pointeur ne contient aucune adresse valide, il est égal à NULL (Pour utiliser
cette valeur, il faut inclure le fichier stdio.h dans le programme).
2 OPERATEURS & ET *
Le langage C met en jeu deux opérateurs utilisés lors de l'usage de pointeurs. Il s'agit des
opérateurs & et *.
Exemples:
Opérateurs & et *
#include <stdio.h> main( )
{
int i,j; int *p; i=5;
p=&i; j=*p;
*p=j+2; /*i et j des entiers*/
} /*p pointeur sur un entier*/
/*i reçoit 5*/
/*p reçoit l'adresse de i*/
/*j reçoit 5 : contenu de l'adresse p*/
/* le contenu de l'adresse p devient 7 donc i aussi devient 7*/
/*Représentation mémoire(supposant que i, j et p se trouvent respectivement aux adresses 100, 102 et 104)*/
100i100i100i
5 5 5 100 7 i
102j102j102j 102 jp
104p104p104p 5 104 5
NULL 100 100 100
Fatima-Zahra BELOUADHA 34
Algorithmes et langage C
3 OPERATEURS ++ ET --
Un pointeur peut être déplacé d'une adresse à une autre au moyen des opérateurs ++ et --.
L'unité d'incrémentation (ou de décrémentation) d'un pointeur est toujours la taille de la
variable pointée.
Exemple:
incrémentation
4 ALLOCATION MEMOIRE
Pour éviter des erreurs fréquemment rencontrées lors de l'utilisation des pointeurs, le
programmeur doit, immédiatement après la déclaration d'un pointeur, l'initialiser à l'adresse
d'une variable donnée (par exemple, p=&i) ou lui allouer de la mémoire et l'initialiser au
choix.
Après la déclaration d'un pointeur, la zone mémoire réservée à la variable pointée se trouve
dans un espace dynamique (heap). Elle peut être allouée au moyen de la fonction malloc() du
fichier malloc.h.
Exemple:
Allocation mémoire
Fatima-Zahra BELOUADHA 35
Algorithmes et langage C
1 INTRODUCTION
Un programme en C peut être découpé en plusieurs morceaux (modules), chacun exécutant
une tâche précise. Ces modules sont appelés des fonctions dont l'une est principale et dite
programme principal (main).
Lors de l'exécution, le programme principal est exécuté en premier. Les autres fonctions sont
exécutées lorsqu'elles sont appelées.
La programmation modulaire est justifiée par :
La faculté de maintenance (détection facile des erreurs…).
L'absence de répétition de séquences d'instructions (paramétrage de fonctions).
Le partage et la réutilisation de modules (fonction).
Définition :
Une fonction est un ensemble d'instructions réalisant une tâche précise dans un programme.
Exemples:
Utilisation de fonctions
/*Ce programme utilise la fonction triple pour calculer le triple d'un entier*/ #include <stdio.h>
int triple (int);/*prototype de la fonction triple qui admet un
paramètre entier et retourne un résultat entier*/
main( )
{
int i,j; /*i et j variables entiers locales à main (appartiennent uniquement à main)*/
/*i reçoit 2*/
i=2; /*appel de la fonction triple : j reçoit 6 triple de 2*/
j=triple(i); printf ("%d",j); j=triple(4);
/*affiche 6*/ printf ("%d",j);
} /* appel de la fonction triple : j reçoit 12 triple de 4*/
int triple (int n) /*affiche 12*/
{
int r; r=n*3; return r;
} /*définition de la fonction triple*/
Fatima-Zahra BELOUADHA 36
Algorithmes et langage C
<Déclaration de la fonction>
{
<Déclaration des variables locales>
<Bloc d'instructions>
}
Syntaxe :
Void ou Type_Résultat Nom_Fonction (Void ou Type Param1,…,Type Paramn);
{
Corps de la fonction (instructions)
}
Exemple :
Type void
#include <stdio.h>
void afficher (void);/*La fonction afficher n'a ni paramètre ni résultat*/ main( )
{
afficher();
}
void afficher(void)/*affiche le message bonjour*/
{
printf("bonjour");
}
La déclaration de variables locales sert à déclarer les variables utilisées par la fonction et
dont la portée est uniquement cette fonction.
Le corps d'une fonction est constitué de différentes instructions de C exécutant la tâche
accomplie par la fonction, en plus de l'instruction return si la fonction retourne un résultat.
L'instruction Return indique le résultat retourné par la fonction s'il y en a et constitue un
point de sortie de la fonction.
Fatima-Zahra BELOUADHA 37
Algorithmes et langage C
Syntaxe :
Void ou Type_Résultat Nom_Fonction (Void ou Type1,…,Typen);
On peut insérer les noms de paramètres mais ils n'ont aucune signification.
3 APPEL DE FONCTIONS
Syntaxe :
Si la fonction retourne un résultat et admet des paramètres
Variable = Nom_Fonction (Paramètres effectifs);
Si la fonction retourne un résultat et n'admet pas de paramètres
Variable = Nom_Fonction ( );
Si la fonction ne retourne rien et admet des paramètres
Nom_Fonction (Paramètres effectifs);
Si la fonction ne retourne rien et n'admet pas de paramètres
Nom_Fonction ( );
5 PASSAGE DE PARAMETRES
Fatima-Zahra BELOUADHA 38
Algorithmes et langage C
Exemple:
Un paramètre qui passe par adresse doit être déclaré comme pointeur au moyen de *.
Exemple:
Passage par adresse
/*Ce programme utilise la fonction triple pour calculer le triple d'un entier*/ #include <stdio.h>
void triple (int , int *); /*prototype de la fonction triple qui admet deux paramètres entiers i et j (j étant le trip
main( )
{
int i,j=0;/*i et j variables entiers locales à main et j initialisé à 0*/ i=2;/*i reçoit 2*/
triple(i,&j);/*appel de la fonction qui affiche 6, résultat de triple de 2*/ printf ("%d",j);/*affiche 6 (nouvelle
}
Fatima-Zahra BELOUADHA 39
Algorithmes et langage C
Remarques :
Un tableau à une dimension qui passe comme paramètre d'une fonction peut
être déclaré comme un tableau dynamique (sans préciser sa taille).
Exemple:
#include <stdio.h>
#define taille 10
void somme_vecteurs (int [ ], int [ ], int [ ]); /*prototype de la fonction*/
main( )
{
6 FONCTION RECURSIVE
Une fonction récursive est une fonction calculable en un temps fini, qui dans sa définition
fait appel à elle-même. Cette fonction doit être sujet à une condition d'arrêt qui devient
fausse au bout d'un temps fini et assure ainsi l'arrêt de l'exécution.
Fatima-Zahra BELOUADHA 40
Algorithmes et langage C
Exemple:
Fonction récursive
/*Ce programme appelle la fonction récursive puissance pour calculer xy (x entier et y entier positif*/
#include <stdio.h>
int puissance (int, unsigned); /*prototype de la fonction puissance*/
main( )
{
int x; unsigned y; /*x entier*/
scanf ("%d%u",&x,&y); /*y entier positif*/
printf ("%d",puissance (x,y)); /*lit les valeurs de x et y*/
} /*affiche le résultat de xy*/
Fatima-Zahra BELOUADHA 41
Algorithmes et langage C
1 DEFINITION
Une structure en C est une collection de données de types différents regroupées sous une
entité logique dite structure.
Exemples:
- La structure adresse est composée des champs numéro (entier),rue et ville (chaînes
de caractères).
- La structure date est composée des champs jour, mois et année.
Syntaxe : Exemple:
struct Nom_Structure struct date
{ {
Type1 Champ1; int jour;
… int mois;
Typen Champn; int
}; }; annee;
Syntaxe : Exemple:
typedef struct typedef struct
{ {
Type1 Champ1; int jour;
… int mois;
Typen Champn; int annee;
} Nom_Type_Structure ; }date;
Fatima-Zahra BELOUADHA 42
Algorithmes et langage C
Syntaxe :
Au fur et à mesure de la définition du type structure moyennant struct
structNom_Structure
{
Type1 Champ1;
…
Typen Champn;
} Nom_Variable ;
Après la définition du type structure moyennant struct
structNom_StructureNom_Variable;
Après la définition du type structure moyennant typedef
Nom_du_Type_StructureNom_Variable;
Exemples :
Déclaration de variables structures
#include <stdio.h>
typedef struct /*définit le type structure date*/
{int jour; int mois; int annee;
}date;
main( )
{
struct
{int jour; int mois; int annee;
}d; struct date1 /*déclare une variable structure d composée de jour, mois et annee*/
{int jour; int mois; int annee;
}d1;
struct date1 d2; date d3;
} /*déclare une variable d1 de type structure date1*/
Syntaxe :
Nom_Variable_Structure.Nom_Champ
Fatima-Zahra BELOUADHA 43
Algorithmes et langage C
Remarque :
Lorsqu'on utilise un pointeur sur une structure. Ses champs seront référencés par le nom du
pointeur suivi d'une flèche puis le nom du champ en question.
Syntaxe :
Pointeur_de_Type_Structure->nom_Champ
Exemples :
Accès aux données d'une structure
#include <stdio.h>
typedef struct /*définit le type structure date*/
{int jour;
int mois;
int annee;
}date;
main( )
{
date d1; /*déclare une variable d1 du type défini date*/
date *d2; /*déclare une variable d2 pointeur sur le type défini date*/
/*affecte à d1 la date 01/03/2000*/
d1.jour=1;
d1.mois=3;
d1.annee=2000;
/*affecte à d2 la date 01/03/2000*/
d2->jour=1;
d2->mois=3;
d2->annee=2000;
}
Fatima-Zahra BELOUADHA 44
Algorithmes et langage C
1 INTRODUCTION
Un fichier est une collection homogène de données, ordonnée et de taille dynamique. Il fut
un document que l'on pourrait garder en mémoire secondaire (disque dur…).
Il existe, en général, deux types de fichiers :
Les fichiers textes : sont considérés comme une collection de lignes de texte.
Lorsqu'il s'agit de ce type de fichiers, le système réagit à certains caractères comme
le caractère de fin de ligne ou de fin de texte.
Les fichiers binaires : sont des suites d'octets qui peuvent faire l'objet, par exemple,
de collections d'entités constituées d'un nombre précis d'octets (enregistrements ou
structures). Dans ce cas, le système n'attribue aucune signification aux caractères
transférés depuis ou vers le périphérique.
Un fichier en C est en général considéré comme une suite d’octets qu’on peut gérer par un
ensemble de fonctions prédéfinies. Ces fonctions sont réparties en deux groupes :
Les fonctions de niveau 1 : les données manipulées par ces fonctions sont
mémorisées et transmises par le biais d'appels directs au système d'exploitation.
Les fonctions de niveau 2 : elles sont caractérisées par l'usage d'un tampon mémoire
propre au programme (à l'intérieur de son segment de données) pour le stockage
temporaire de données. Elles ne font appel au système que pour transmettre les
données en mémoire secondaire lorsque le tampon est totalement rempli. Ces
fonctions sont prédéfinies dans la bibliothèque stdio.h
Nous nous intéressons dans ce chapitre aux fonctions principales du niveau 2.
2 DECLARATION DE FICHIERS
Un fichier possède un nom logique (nom externe ou nom Dos de type chaîne de caractères)
et un nom physique (nom interne) de type pointeur sur FILE. Un fichier est déclaré par son
nom physique.
Syntaxe :
FILE*nom_interne ;
Exemple :
FILE *fiche; /*fiche est déclaré comme pointeur sur FILE. Il pourrait alors faire l'objet de
nom physique d'un document fichier.*/
3 FONCTIONS DE NIVEAU 2
Pour manipuler les données d'un fichier (en lecture ou en écriture), il convient toujours de
l'ouvrir au début de l'intervention et le fermer à sa fin.
Fatima-Zahra BELOUADHA 45
Algorithmes et langage C
Syntaxe :
fopen( nom_fichier_interne , modes d'ouverture et de fichier );
La fonction fopen ouvre le fichier physique (fichier Dos) et retourne un pointeur sur FILE ou
Null si erreur.
Exemple:
Ouverture de fichiers
#include <stdio.h> main( )
{
File *f; f=fopen("lettre.txt", "rt"); if f==Null
printf("Erreur");
else /*f pointeur sur FILE */
{ /*ouvre le fichier texte lettre.txt en lecture*/
… /*affiche un message s'il y a erreur*/
fclose (f);
}
f=fopen("document.bat", "wb");
if f==Null /*instructions de lecture*/
printf("Erreur"); /*ferme le fichier*/
else
/*crée le fichier binaire document.bat*/
fclose (f);
/*affiche un message s'il y a erreur*/
}
/*ferme le fichier*/
Remarque :
Lorsqu'on ouvre un fichier, son pointeur pointe sur son premier élément.
Fatima-Zahra BELOUADHA 46
Algorithmes et langage C
Syntaxe :
fclose(nom_fichier_interne);
La fonction fclose ferme le fichier dont le nom interne est indiqué en paramètre. Elle retourne
0 si l’opération s’est bien déroulée, -1 en cas d'erreurs.
Syntaxe :
fread (adresse, taille_d'un_bloc_en_octets, nombre_de blocs, nom_fichier_interne);
La fonction fread lit un ou plusieurs blocs (structures par exemple) à partir d’un fichier et les
copie à l’adresse indiquée (adresse d'une structure par exemple).
Elle retourne le nombre de blocs effectivement lus.
Exemple :
Lecture de fichiers
#include <stdio.h>
typedef struct /*définit le type personne*/
{char Nom [6];
char Prenom [6];
}personne;
main( )
{
File *f; /*f pointeur sur FILE */
personne p; /*p variable de type personne*/
int n;
f=fopen("personnes.bat", "rb"); /*ouvre le fichier personnes.bat en lecture*/
if f==Null /*affiche un message s'il y a erreur*/
printf("Erreur d'ouverture");
else
{
while (n=fread(&p,12,1,f)) /* lit un bloc de 12 octets à partir du fichier f et
le copie dans p. Tant qu'il y a de blocs lus
(n0), elle les affiche.
12 peut être remplacé par sizeof (personne)*/
printf("%s %s",p.nom,p.prenom);
Fatima-Zahra BELOUADHA 47
Algorithmes et langage C
Remarque :
Quand le résultat retourné par fread est inférieur au nombre de blocs à lire, cela signifie que :
soit la fin du fichier a été atteinte.
soit une erreur s'est produite.
Pour avoir plus de précision, le programmeur peut insérer des contrôles au moyen des
fonctions ferror ou feof (voir plus loin).
Syntaxe :
fwrite (adresse, taille_d'un_bloc_en_octets, nombre_de blocs, nom_fichier_interne);
La fonction fwrite copie un ou plusieurs blocs (structures par exemple) dans un fichier à partir
de l’adresse indiquée (adresse d'une structure par exemple).
Elle retourne le nombre de blocs effectivement copiés (écrits).
Exemple :
Ecriture dans un fichier
#include <stdio.h>
typedef struct /*définit le type personne*/
{char Nom [6];
char Prenom [6];
}personne;
main( )
{
File *f; /*f pointeur sur FILE */
personne p; /*p variable de type personne*/
int n;
f=fopen("personnes.bat", "wb"); /*ouvre le fichier personnes.bat en
écriture*/ if f==Null /*affiche un message s'il y a erreur*/
printf("Erreur d'ouverture");
else
{
scanf("%s%s",p.nom,p.prenom);
n=fwrite(&p,12,1,f) /* copie un bloc de 12 octets à partir de p dans
le fichier f */
if (n != 1)
printf(Erreur d'écriture");
fclose (f); /*ferme le fichier*/
}
}
Remarque :
Après une exécution des fonctions fread ou fwrite, le pointeur du fichier se déplace à
l'élément suivant.
Fatima-Zahra BELOUADHA 48
Algorithmes et langage C
Syntaxe:
feof (nom_fichier_interne)
La fonction feof retourne 0 si la fin de fichier n'a pas été détectée, une valeur différente de 0
sinon. En fait, elle n’indique la fin de fichier qu’après une lecture effective qui n’aboutit pas.
Syntaxe :
fseek ( nom_fichier_interne, position, mode );
La fonction fseek permet un accès direct à une position dans un fichier selon le mode
indiqué. Elle retourne 0 si l'opération s'est déroulée normalement, -1 sinon.
Le mode peut être égal à :
0 Position par rapport au début du fichier.
1 Position par rapport à la position courante.
2 Position par rapport à la fin de fichier.
Exemple :
Accès aux données dans un fichier
#include <stdio.h>
typedef struct /*définit le type personne*/
{char Nom [20];
char Prenom [20];
}personne;
main( )
{
File *f; /*f pointeur sur FILE */
personne p; /*p variable de type personne*/
int n;
f=fopen("personnes.bat", "rb"); /*ouvre le fichier personnes.bat en lécture*/
if f==Null /*affiche un message s'il y a erreur*/
printf("Erreur d'ouverture");
else
{
n=fseek (f,2*sizeof(personne),0) /*pointe sur le troisième élément du fichier f */
if (n==0) /*s'il n' y a pas d'erreur, il affichera l'élément*/
{
fread(&p, sizeof(personne),1,f);
printf("%s %s",p.nom,p.prenom);
}
else printf(Erreur d'accès");
fclose (f); /*ferme le fichier*/
}
}
Remarques :
Fatima-Zahra BELOUADHA 49
Algorithmes et langage C
La fonction ftell retourne la position actuelle de type long (exprimée en octets) par
rapport au début du fichier.
ftell (nom_fichier_interne)
Syntaxe :
ferror (nom_fichier_interne)
La fonction ferror retourne 0 s'il n'y a aucune erreur, une valeur différente de 0 en cas
d'erreurs.
Fatima-Zahra BELOUADHA 50