Académique Documents
Professionnel Documents
Culture Documents
1.1 Introduction
L‟informatique (information-Automatique) est le traitement automatique des
données en vue d‟obtenir des Tra
D Ré
o ite sul
Résultats
n me tat
L‟automatisation d‟un traitement
n consiste à ntle scinder en une ssuite d‟actions
élémentaires suivant un ordre séquentiel
é aut et formant ainsi un programme.
et logique
e om
Programme :-Action ati 1
s
qu
-Action 2
e
-Action n
Langage machine
Comme son nom l‟indique, il est le seul langage directement compréhensible par
l‟ordinateur; Il est constitué de deux caractères seulement qui sont : 0 et 1 où 1
indique la présence du courant et 0 indique son absence.
Ainsi toute instruction écrite dans ce langage est une suite de 0 et de 1, ce qui
demanderait un temps considérable pour écrire tout un programme.
Dans le but de s‟affranchir de cette étape extrêmement difficile, les langages évolués
ont pris naissance.
Parmi les langages évolués, nous citons entre autres : Le pascal, le C, le VB, le JAVA,
le VC, le Clipper, le C++, etc
1.2 Rappel
1.3 Programmer en C
1.3.1 Introduction
RMQ :
Exemple de programmation en C :
#include<stdio.h>
printf(“Hello World.\n “) ;
RMQ:Printf est une fonction prédéfinie du langage C.Il est defini dans un fichier
particulier qu‟on appelle Bibliotheque standard d‟E/S (ou Librairie Standard d‟E/S) du
langage C.Ce fichier est appelé <stdio.h>
include: est une instruction prédéfinie (directive) qui permet d‟incorporer la copie d‟une
bibliothèque dans un programme de l‟utilisateur.
(prépocesseur: est un petit programme qui est concu pour éliminer tous ceux qui ne
sont pas utiles au compilateur ,par exemple les commentaires.
Définition: un identificateur est un nom que l‟on attribue à toute entitée manipulée dans
un programme (une étiquette ,une constante ,un type,une variable,un sous-programme)
2.Tout identificateur doit être déclaré (défini) avant son utilisation et dans la partie
déclaration des variables.
Définition :un type de données est l‟ensemble des valeurs que la variable peut prendre
Ce type peut être standard (prédéfini) par le compilateur C ou bien défini par le
programmeur lui-meme.
Les flottants (réels) dont les spécificateurs sont : float, double, longdouble;
longint - 4 octets
2.147.483.648.....+2.147.483.647
Rmq: A partir de ces différents types de base ,sont concus les types composés et les
types structurés:
le type énuméré;
le type fichier;
le type tableau;
type enregistrement.
Une variable est une donnée dont la valeur est modifiable,qui possède un type ,un
nom et une adresse.
float pi=3.14,moyenne;
Définition: Les constantes sont des données dont la valeur ne peut être modifiée
Une bibliothèque standard appelée aussi librairie standard est un fichier particulier du
compilateur C,livrable avec le même compilateur et contenant des fonctions prédéfinies
du même compilateur.
8
Une bibliothèque standard est incorporée dans un programme en utilisant une directive
appelée “include” .
Ex: #include<stdio.h>
void main()
printf (“rien.”);
Symbole Opérateur
+ Addition
- Soustraction
* Multiplication
/ Division entière
% Reste de la division
→ y=(float) 10/3
Ces opérateurs sont appliqués à des données de type booléen et renvoient un résultat
de type booléen.
9
Valeurs booléennes.
!(non)
C'est un opérateur unaire. Il réalise une
négation d‟une valeur booléenne.
Symbole Relation
< inférieur
> Supérieur
== égalité
!= Différence
10
-Le caractère « espace »qui permet de séparer 2 entités lexicales dans une même ligne
20 Les commentaires
Il est parfois utile d‟insérer dans un même programme des remarques permettant de
rappeler la signification de certaines variables ou les faits d‟une instruction.
Ces remarques appelées commentaires peuvent être placés en importe quel endroit du
programme et s‟étendre sur plusieurs lignes.
Pour insérer un commentaire sur une seule ligne, on utilise les caractères;//
Pour insérer un commentaire se trouvant sur plusieurs lignes, on utilise les caractères
/*……….
………….
………….*/
Pour initialiser une variable ou une valeur a une variable, on utilise le symbole=.on peut
initialiser une variable dès la déclaration. Ex :
HOMME ORDINATEUR
Un texte
RMQ :
Pour afficher un texte, la partie contrôle est optionnaire tandis que pour afficher une
valeur contenue dans une variable, la partie contrôle s‟avère obligatoire.la partie
contrôle précise le format d‟affichage c.-à-d. le type de donnée à éditer ou à afficher
{printf (« Bonjour » );
100
200
Tableau de formatage
int,shortint, longint D
char C
chaîne de caractères S
float,double F
EXERCICES
RESOLUTION
#include< stdio.h>
void main()¨
{int x=100;flooty =400.85;char v=c;
printf (« les données fournies sont:\n ») ;
printf(« x=%d \n »;x);
14
void main ()
//Traitement
res=a-b ;
//Edition du résultat
getch();
Pour le printf,l‟ écriture suivante :printf (« x=%d »,x) est permise tandis que pour le
scanf,la même écriture,(« %d »,x),n‟est pas permise mais ça s‟écrit de la forme
suivante :(« %d »,&x)
3 #include< stdio.h>
void main ()
//Traitement
per=a;
a=b;
}
16
3.1.1.L‟instruction conditionnelle
a) if(condition) instruction;
Ex:
if(i!=j) printf(“ i et j ne sont pas égaux.”);
b) if(condition) { instruction1;
instruction2;
instruction n;
printf(“i=%d”,i);
c) if(condition) A;
else B
i=j-1;
où Aet B représentent soit une instuction, soit un block d‟instuctions entre accolades.
Ex : if(a>b) if(a>b){if(n>0)z=a;
else z=b; }
Dans une imbrication des if,le else qui suit immédiatement appartient au dernier if.
Cette instruction permet de faire un choix parmi plusieurs possibilités suivant la valeur
d‟une expression de choix appelée ”selecteur”
Switch(variable_controle)
instruction 2;
Instruction n;
Break;
instruction 2;
Break;
Sélecteurs
switch instruction 2;
Break;
Default instruction;
18
Ex :int i;char x;
i=10;
Switch(i)
{ case 1:x=”A”;break;
case 2:x=”B”;break;
case 3:x=”C”;break;
defaut:x=”∆”;
2)La variable de contrôle peut être soit une simple variable,soit une expression,soit une
fonction qui retourne une valeur.
3)L‟instruction break permet de sortir du bloc switch une fois terminée l‟exécution d‟un
sélecteur quelconque, sinon les instructions qui suivent le sélecteur choisi seront
exécutées automatiquement (de suite).
Exercices
Résolution
1.#include<stdio.h>
Void main(void)
{ int A,B,min,max;
printf(“\n A=”);scanf(“%d”,&A);
printf(“\n B=”);scanf(“%d”,&B);
//traitement
if(A<B){min=A;max=B;}
else {min=B;max=A;}
2. #include<stdio.h >
{ int A, B, C, Max ;
//Traitement
if ( A>=B ) Max=A ;
20
else Max =B ;
else Max =C ;
//Affichage
4) #include<stdio.h>
// Traitement
}
21
Dans une boucle, le nombre de répétitions peut être connu, fixé à l‟avance comme il
peut dépendre d‟une condition permettant l‟arrêt et la sortie de cette boucle.
Cette boucle est utilisée au cas où le nombre de répétitions est connu ou inconnu
instruction 2 ;
instruction k ;
Ex : int i =5 ;
while(i !=0)
i=i/2 ;
printf(« fini.»)
Déroulement :
i=
5
i=
2
i=
1
Fi
ni
.
22
Ou
do{ instruction1 ;
instruction 2 ;
instruction k ;
while( condition ) ;
i=i/2 ;
while ( i==0) ;
printf(« fini. ») ;
Déroulement : i
=
5
i
=
2
i
=
1
f
i
n
i
.
23
Cette boucle est utilisée dans le cas où le nombre de répétitions est connu.
Syntaxe : for ( exp1 ; exp2 ; exp3)instruction ; ou for (exp1 ;exp2 ;exp3) { instruction1 ;
instruction 2 ;
instruction k ;
Exemple : int i ;
Déroulement : i
=
2
i
0
RMQ : 1 / L‟expression exp1 peut comporter plusieurs initiations =
3
20/ L‟expression exp3 peut comporter plusieurs actions de fin de la
boucle for séparées par des virgules(,). Cela est aussi valable ipour
=
l‟expression exp2 qui peut comporter plusieurs conditions d‟arrêt reliées
entre elles par des expressions logiques. 4
I
=
24
3) De la même manière que l‟instruction if, l‟imbrication des boucles est possible et
toujours fréquente dans la programmation.
EXERCICES
#include<stdio.h>
#include<ctype.h>
void main(void)
int i,j ;
getch() ;
Résolution
#include<stdio.h>
void main(void)
{
25
int i,n,fact ;
scanf("%d",&n) ;
else
{fact=1 ;i=1 ;
while (i<=n){fact=fact*i ;
i=i+1;
scanf("%d",&n) ; scanf("%d",&n) ;
som=0 ; while(i<n){som=som+i;
i=0 ; i++ ;
}
26
4. Le déroulement du programme
i=0 et j=1 i j i
i=0 et j=2
i=0 et j=3 0 1
i=o et j=4 2
i=1 et j=2 3
i=1 et j=3 4
i=2 et j=3 1 2
i=2 et j=4 3
5sortie
2 3
5sortie
3sortie
pas vérifiée
27
0 1 2 3 4 5 6 7 8 9
34 8 96 12 31 0 18 9 58 20
T[9]=20;
X=T [7];
Ex : T [2*i+1]=100;
a)Déclaration
0 1 2 3 4
Ex : M [0][1]=150;
Ex : int M[2][5]={
{-2, 0, 4, 10,50}
int T[10]={5,-2,-4,9,15,25,48,21,60,100}
Ecrire un programme qui recopie toutes les valeurs positives de T2 dans T1 et qui
complète T1 par des 0.
Ecrire un programme qui réalise la somme des éléments des 2 tableaux dans un 3ème
tableau T3 de même dimension.
3) Ecrire un programme qui réalise l‟entrée des données dans une matrice de M
et N et procède ainsi à leur affichage.
Résolution
1. #include<stdio.h>
void main()
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%d",&T2[i]);
//Traitement
j=0;
for(i=0;i<N;i++)
if(T2[i]>=0){T1[j]=T2[i];
j=j+1;
while(j<N)
{T1[j]=0;j++;}
}
30
Raisonnement
T2
10 -2 0 -8 11 12 15
T1
10 0 11 12 15 0 0
2 # include<stdio.h>
void main()
{ int t1[10],t2[10],t3[10],i,n;
scanf("%d",&n);
3 # include<stdio.h>
void main()
scanf("%d %d ",N,M);
printf("\n");
4 # include<stdio.h>
void main()
scanf("%d ",&N);
som=0
//Affichage du résultat
5 # include<stdio.h>
void main()
Scanf("%d ",&n);
//traitement
else
P[i] [j]=0;
//Affichage
33
Déclaration
chaîne <NomVariable>
Exemples
RMQ : Lors de la déclaration, nous devons indiquer l'espace à réserver en mémoire pour le stockage de
la chaîne.
La représentation interne d'une chaîne de caractères est terminée par le symbole '\0' (NUL). Ainsi, pour
un texte de n caractères, nous devons prévoir n+1 octets.
Malheureusement, le compilateur C ne contrôle pas si nous avons réservé un octet pour le symbole de
fin de chaîne; l'erreur se fera seulement remarquer lors de l'exécution du programme ...
4.3.2 Mémorisation
Le nom d'une chaîne est le représentant de l'adresse du premier caractère de la chaîne. Pour
mémoriser une variable qui doit être capable de contenir un texte de N caractères, nous avons besoin de
N+1 octets en mémoire:
* Les chaînes de caractères constantes sont indiquées entre guillemets. La chaîne de caractères vide est
alors: ""
* Dans les chaînes de caractères, nous pouvons utiliser toutes les séquences d'échappement définies
comme caractères constants:
Ex : {'L','\'','a','s','t','u','c','e','\0'}
* Plusieurs chaînes de caractères constantes qui sont séparées par des signes d'espacement (espaces,
tabulateurs ou interlignes) dans le texte du programme seront réunies en une seule chaîne constante lors
de la compilation:
Observation
En général, les tableaux sont initialisés par l'indication de la liste des éléments du tableau entre
accolades:
35
Pour le cas spécial des tableaux de caractères, nous pouvons utiliser une initialisation plus confortable en
indiquant simplement une chaîne de caractère constante:
Lors de l'initialisation par l‟appel de [] vide, l'ordinateur réserve automatiquement le nombre d'octets
nécessaires pour la chaîne, c.-à-d.: le nombre de caractères + 1 (ici: 6 octets). Nous pouvons aussi
indiquer explicitement le nombre d'octets à réserver, si celui-ci est supérieur ou égal à la longueur de la
chaîne d'initialisation.
Exemples
Exercice 4.1
Lesquelles des chaînes suivantes sont initialisées correctement ? Corrigez les déclarations fausses et
indiquez pour chaque chaîne de caractères le nombre d'octets qui sera réservé en mémoire.
L'accès à un élément d'une chaîne de caractères peut se faire de la même façon que l'accès à un
élément d'un tableau. En déclarant une chaîne par:
char A[6];
nous avons défini un tableau A avec six éléments, auxquels on peut accéder par:
Exemple
Les bibliothèques de fonctions de C contiennent une série de fonctions spéciales pour le traitement de
chaînes de caractères. Sauf indication contraire, les fonctions décrites dans ce chapitre sont portables
conformément au standard ANSI-C.
A côté des fonctions printf et scanf que nous connaissons déjà, nous y trouvons les deux
fonctions puts et gets, spécialement conçues pour l'écriture et la lecture de chaînes de caractères.
La fonction puts est équivalente a la fonction printf tandisque la fonction gets est équivalente a la fonction
scanf.
Exemples
Exercices
Ecrire un programme qui lit 5 mots, séparés par des espaces et qui les affiche ensuite dans une ligne,
mais dans l'ordre inverse. Les mots sont mémorisés dans 5 variables M1, ..., M5.
Exemple
#include <stdio.h>
main()
{
char M1[30], M2[30], M3[30], M4[30], M5[30];
printf("Entrez 5 mots, séparés par des espaces :\n");
scanf ("%s %s %s %s %s", M1, M2, M3, M4, M5);
printf("%s %s %s %s %s\n",M5, M4, M3, M2, M1);
return 0;
}
Exercice 2
Ecrire un programme qui lit une ligne de texte (ne dépassant pas 200 caractères) la mémorise dans une
variable TXT et affiche ensuite:
a) la longueur L de la chaîne.
RESOLUTION
#include <stdio.h>
38
main()
{
/* Déclarations */
char TXT[201]; /* chaîne donnée */
int I,J; /* indices courants */
int L; /* longueur de la chaîne */
int C; /* compteur des lettres 'e' */
int AIDE; /* pour l'échange des caractères */
Exercice 3
Ecrire un programme qui lit un texte TXT (de moins de 200 caractères) et qui enlève toutes les
apparitions du caractère 'e' en tassant les éléments restants. Les modifications se feront dans la même
variable TXT.
Exemple:
RESOLUTION
#include <stdio.h>
main()
{
/* Déclarations */
char TXT[201]; /* chaîne donnée */
int I,J; /* indices courants */
La bibliothèque <string> fournit une multitude de fonctions pratiques pour le traitement de chaînes de
caractères. Voici une brève description des fonctions les plus fréquemment utilisées.
Dans le tableau suivant, <n> représente un nombre du type int. Les symboles <s> et <t> peuvent être
remplacés par :
40
Remarques
- Comme le nom d'une chaîne de caractères représente une adresse fixe en mémoire, on ne peut pas
'affecter' une autre chaîne au nom d'un tableau:
Il faut bien copier la chaîne caractère par caractère ou utiliser la fonction strcpy respectivement strncpy:
strcpy(A, "Hello");
- La concaténation de chaînes de caractères en C ne se fait pas par le symbole '+' comme en langage
algorithmique ou en Pascal. Il faut ou bien copier la deuxième chaîne caractère par caractère ou bien
utiliser la fonction strcat ou strncat.
- La fonction strcmp est dépendante du code de caractères et peut fournir différents résultats sur
différentes machines (voir 8.5.).
41
Exercice 4
Ecrire un programme qui demande l'introduction du nom et du prénom de l'utilisateur et qui affiche alors
la longueur totale du nom sans compter les espaces. Employer la fonction strlen.
Exemple:
RESOLUTION
#include <stdio.h>
#include <string.h>
main()
{
char NOM[40], PRENOM[40];
printf("Introduisez votre nom et votre prénom: \n");
scanf("%s %s", NOM, PRENOM);
printf("\nBonjour %s %s !\n", NOM, PRENOM);
printf("Votre nom est composé de %d lettres.\n",
strlen(NOM) + strlen(PRENOM));
/* ou bien
printf("Votre nom est composé de %d lettres.\n",
strlen(strcat(NOM,PRENOM)));
*/
return 0;
}
Exercice 5
Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2, les compare lexicographiquement
et affiche le résultat:
Exemple:
Exercice 6
Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2 et qui copie la première moitié de
CH1 et la première moitié de CH2 dans une troisième chaîne CH3. Afficher le résultat.
Exercice 7
Ecrire un programme qui lit un verbe régulier en "er" au clavier et qui en affiche la conjugaison au présent
de l'indicatif de ce verbe. Contrôlez s'il s'agit bien d'un verbe en "er" avant de conjuguer. Utiliser les
fonctions gets, puts, strcat et strlen.
Exemple:
Verbe : fêter
je fête
tu fêtes
il fête
nous fêtons
vous fêtez
ils fêtent
La bibliothèque <stdlib> contient des déclarations de fonctions pour la conversion de nombres en chaînes
de caractères et vice-versa.
Les trois fonctions définies ci-dessous correspondent au standard ANSI-C et sont portables. Le symbole
<s> peut être remplacé par :
atof(<s>) retourne la valeur numérique représentée par <s> comme double (!)
Le standard ANSI-C ne contient pas de fonctions pour convertir des nombres en chaînes de caractères.
Si on se limite aux systèmes fonctionnant sous DOS, on peut quand même utiliser les
fonctions itoa, ltoa et ultoa qui convertissent des entiers en chaînes de caractères.
Chacune de ces trois procédures convertit son premier argument en une chaîne de caractères qui sera
ensuite attribuée à <s>. La conversion se fait dans la base <b>.
Exercice 9
Ecrivez un petit programme utilisant la fonction ltoa qui sert à contrôler les résultats de l'exercice
3.3.
Les fonctions de <ctype> servent à classifier et à convertir des caractères. Les symboles nationaux (é, è,
ä, ü, ß, ç, ...) ne sont pas considérés. Les fonctions de <ctype> sont indépendantes du code de
caractères de la machine et favorisent la portabilité des programmes. Dans la suite, <c> représente une
valeur du type int qui peut être représentée comme caractère.
Les fonctions de classification suivantes fournissent un résultat du type int différent de zéro, si la
condition respective est remplie, sinon zéro.
La fonction:
retourne une valeur différente de zéro,
Les fonctions de conversion suivantes fournissent une valeur du type int qui peut être représentée
comme caractère; la valeur originale de <c> reste inchangée:
5.1. Définition
a)Un module est une fonction (petit programme) spécialisée dans une tâche
quelconque.
b) Un sous- programme est une fonction .Tous sous-programme retourne une valeur.
Cette valeur peut être définie (type +valeur) ou indéfinie c- à-d qu‟il n‟y a pas réellement
de valeur.
Une procédure Pascal est une fonction c qui retourne une valeur indéfinie.
Fonction main
Programme C Fonction X
Fonction Y
- Variables locales
e)*Une variable locale est une variable déclarée et utilisée dans une fonction.
46
Une variable locale n‟est visible (accessible) que dans la fonction dans laquelle elle a
été déclarée.
*contrairement à la variable locale, une variable globale est visible dans tout le
programme dans lequel elle a été déclarée.
Par conséquent, elle est accessible dans toutes les fonctions qui composent ce
programme
*Une variable globale se déclare soit dans la fonction main, soit avant la fonction main
<instructions>
N.B : <Type-valeur-Retournée> représente le type de résultat qui doit être retournée par
la fonction.
Ce type peut être soit standard (int float ,char) soit personnalise(étudiant ,livre , etc)
.La partie <liste des paramètres formels> doit comporter les types des paramètres
formels.
Ces paramètres doivent être sépares par des virgules (,) s‟ils sont plusieurs.
{int max ;
If (X>Y) max=X
else max=Y ;
L‟instruction‟‟ return „‟peut se trouver à n‟importe quel niveau dans la partie instruction
de la fonction.
b) En C, toute fonction non définie préalablement dans un fichier source où elle est
utilisée doit faire l‟objet d‟une déclaration sous -forme d‟un prototype.
Autrement dit, une fonction A qui appelle une fonction B doit l‟annoncer en précisant
dans la partie déclaration l‟entête B (avant la fonction A). On précise toujours le
prototype de la fonction appelée dans la partie déclaration de la fonction appelante.
#include<stdio.h>
#include<ctype.h>
void main ()
48
{int a, b ;
scanf(„‟%d „‟ ,&a),
scanf( „‟%d‟‟,&b) ;
Max (a , b) ;
} getch ( ) ;
//définition de la fonction
……….
100 a (2 octets)
200 b (2 octets)
………
100 x Max
200 y
……..
49
c)En langage c, il existe un seul mode de la transmission par valeur c.-à-d. qu‟au
moment de l‟appel de la fonction, le paramètre effectif est recopié sur le paramètre
formel.
Les paramètres effectifs sont ces paramètres passés à la fonction au moment de son
appel tandis que les paramètres formels sont ces paramètres passés à la fonction au
moment de sa définition.
100
Formels
200
100
Effectifs
200
- Si une fonction doit retourner plus d‟une valeur, on doit utiliser le mode de
Dans le cas de transmission par adresse, le contenu des paramètres effectifs est
modifié car on travaille directement avec les paramètres effectifs et non avec les
paramètres formels.
On rappelle que dans le cas de transmission par valeur, le contenu des
paramètres effectifs n‟est pas modifiable car on travaille avec les paramètres
formels et non avec les paramètres effectifs.
d) Comment une fonction retourne-t-elle une valeur ?
50
Syntaxe : return(<expression>) ;
(i*4-5)
Ou return (<variable>) ;
(a)
Ou return (<valeur>) ;
(100)
# include <stdio.h>
# include <ctype.h>
void main ( )
int a ,b ,max ;
max=Max (a,b) ;
getch( ) ;
// Définition de la fonction
51
int m ;
Dans le cas de transmission des arguments par adresse à une fonction, l‟adresse est
un argument de cette fonction.
Si on veut changer un argument x par une fonction après son appel, la solution est de
transmettre l‟adresse de x. En c, l‟instruction du genre : int *a ; signifie qu‟on a déclaré
une variable entière *a et que l‟adresse de cette variable se trouve contenu dans a .
1002
adresse
Lorsqu‟on écrit *a : on dit que l‟on accède à la case mémoire dont l‟adresse est dans a.
Exemple : Ecrire une fonction qui réalise une permutation de deux nombres donnés.
# include <stdio.h>
# include <ctype.h>
int a ,b ;
getch( ) ;
// Définition de la fonction
int temp ;
temp=*x ;
*x=*y ;
*y=temp ;
Ceci permet d‟économiser l‟espace mémoire car le passage de l‟adresse nous évite de
recopier tout le tableau.
&T [0] ≡T
53
Exemple: Ecrire une fonction qui calcule la somme des éléments d‟un tableau T donné.
# include <stdio.h>
# include <ctype.h>
void main ()
&T[i]
getch();
i ++ ;
return (som);
5.7 Récapitulation
Pour écrire correctement une fontion c, il faut toujours se poser des questions
suivantes :
Si aucun paramètre d‟entrée , fournir une « liste vide “ d‟argument comme dans float
fact ()
{….
Sinon, Lister tous les arguments de la fonction entre parenthèses comme dans float
fact(int x, char m, float y) ;
Sinon , listé les argument de la fonction entre parenthèses comme dans :float fact (int
x , char m,float)
Exercices
Réécrire tous les programmes déjà faits jusqu‟à présent en utilisant des fonctions
56
Les structures sont généralement utilisées pour définir des types personnalisés de
l’utilisateur.
Exemple : Livre
Auteur
Année d’édition
Editeur
côte
6.1 Définition
Une structure est une collection de données qui ne sont pas forcément tous de même type.
6.2 Déclaration
En C, la déclaration d’une structure se fait en utilisant le mot clé « struct »et en énumérant tous
les champs composant la structure ainsi que leur type.
Les types simples jusqu’alors vus (int, float, char) nous permettent de définir les types
composés tels que les structures, etc.
int Année ;
!)Pour déclarer une variable de type « structure livre », on procède comme suit :
Livre1 et livre 2.
6.3 Initialisation
L’initialisation d’une structure se fait champ par champ en utilisant l’opérateur d’accès à un
champ d’une structure «.».
printf (« livre1:\n ») ;
gets (livre1.titre) ;
gets (livre1.auteur) ;
gets (livre1.editeur) ;
gets (livre1.côte) ;
RMQ : 1) L’accès à un champ d’une structure se fait par : <idf variable.idf champ>
T o i
3) Le champ d’une structure peut être de type simple ou composé (un tableau ou
une structure)
Dans le cas d’un tableau, l’accès se fait par : T[i].notes[j]=10.75 ; //Jième note de
l’étudiant (élément) i du tableau T
int mois ;
int année ;
Livre3.dateEdition .jour=14 ;
59
Livre.dateEdition.mois=07 ;
Livre.dateEdition.année=2000 ;
monType X, Y ;
monType x,y ;
Pour définir un type structuré (ex : type livre, type employé, type étudiant), On procède de la
même manière en ajoutant le mot-clé struct pour signifier qu’il s’agit d’un type structuré.
Char année ;
Char éditeur ;
Livre ;
Livre livre1, P ;
7.Les Fichiers
7.1. Définition
Un fichier est un ensemble des données structurées(type structuré)et qui sont stockées l’une
après l’autre sur une mémoire secondaire.
C’est ce nom externe qui est utilisé pour stocker dans la mémoire secondaire .
De plus,un fichier a un nom dit nom interne.C’est ce nom interne qui est utilisé pour manipuler le fichier
en mémoire centrale.
*A un instant donné un seul élément du fichier est accessible ,soit en lécture ,soit en écriture .
Fichier
Début fin
*Fichier avant
‘x’
‘a’
Lecture
‘a’ ‘x’
*Fichier après
61
Ecriture de ‘y’
Ecriture
*Fichier après
‘a’ ‘b’ ‘y’
REMARQUE :
* Après chaque opération de Lecture/Ecriture, la tête de L/E avance automatiquement vers la position
suivante.
*Dans un programme C, on n’utilise pas le nom physique (non externe) pour manipuler le fichier, mais à
chaque fois qu’on veut faire une opération sur le fichier, on va utiliser une variable adresse de type
fichier. C’est cette même variable qui est appelée non interne du fichier.
* En mode lecture, les données sont lues séquentiellement dans l’ordre du stockage à partir du début
du fichier.
* En mode écriture, les données sont lues séquentiellement à partir de la fin actuelle du fichier.
Ex : FILE *f ;
62
C’est ce nom interne qui est utilisé dans toutes les opérations de manipulation
d’un fichier.
REMARQUE :
Add
63
« wb » : écriture seule
Write
La fonction fopen retourne une adresse de type « FILE *».c’est de cet adresse,
appelée nom interne du fichier, qui permet l’accès au fichier.
EX : void main( )
Nom externe
{ exist(0) ;
Ex : fclose(g) ;
64
ʺfreadʺ est une fonction qui permet le transfert (la lecture) de 1ou
plusieurs objets d‟un fichier vers une case mémoire centrale. La
fonction fread retourne un entier qui représente le nombre d‟objets
lus à partir du fichier.
Exercices
RMQ: pour détecter la fin d‟un fichier, il existe une fonction prédéfinie
appelée feof c.-à-d. file end of file qui retourne la valeur 1 lorsqu‟on a
rencontré la fin du fichier et 0 sinon.
65
# include<stdlib.h>
# include< conio.h>
# include<string.h>
} Étudiant ;
// Fonction main
void main ( )
. CreerFichier (nomFichier) ;
66
. EditerFichier (nomFichier) ;
} getch ( ) ;
for ( i=0 ; i < 10 ; i++ ) { printf (ʺ\n Matricule:ʺ); scanf (ʺ%dʺ ,&mat );
E. matricule = mat ;
// Rupture de la connexion
Fclose (f);
} i ++ ;
Fclose (f) ;
au début du fichier
à la fin du fichier
à la position courante
La flèche qui nous permet l‟accès direct à un élément du fichier est la fonction: fseek
Ex :
Sens+f sens-f
Fseek(f,2*3,0) ;
Fseek (f,-6,1) ;
Fseek(f,-12,2) ;
Cette fonction fseek retourne une valeur :soit 0 si l‟opération est faite
correctement soit -1 s‟il ya une erreur
La fonction fseek est une fonction qui permet le positionnement (le déplacement de la
tête de lecture/écriture)
La lecture et l‟écriture doivent toujours être faites respectivement avec les fonctions
fread et fwrite .
Ex :
En considérant le fichier des étudiants créé précédemment, proposer une fonction qui
affiche les informations du 7éme enregistrement du fichier .
if (fseek(f,depla,0)==0)
}
69
fclose(f) ;
cette fonction donne (retourne) la positon courante de la tête de lecture /écriture dans le
fichier cette position est donnée en nombres d‟octets par rapport au début du fichier
ex :
long depla
depla=ftell(f)
ex: rewind(f) ;
cette fonction retourne le numéro d‟un fichier ouvert .ce numéro est appélé handle et
est utulisé par le système d‟exploitation (S.E) pour identifier tout fichier ouvert.
ex ;long taille
Num=fileno(f) ;
cette fonction retourne un résultat de type long qui donne la taille d‟un fichier.
ex : long taille ;
Num=fileno(f) ;
taille=filelength(num) ;
NB :La fonction chsize est généralement utilisée quand on veut réaliser les opérations
d‟insertion et de suppression dans un fichier .
EXERCICES
2. Proposer une fonction qui permet d‟insérer un nouvel étudiant à une position donné
du fichier
Un fichier peut être ouvert soit en mode binaire soit en mode texte.
Les fichiers utilisés jusqu‟à maintenant ont été ouvert en mode binaire.
Un fichier binaire est un fichier contenant des données informatiques et ne pouvant être
ouvert que par le système d‟exploitation.
Pour ouvrir un fichier en mode texte, nous devons remplacer le caractère ‟b‟ par le
caractère ‟t‟ dans tous les modes d‟ouverture qu‟on a déjà vu c.à.d
« t », « rt », « rt+ », « wt », « at »….
71
Pour lire et écrire dans un fichier texte, nous avons 2 fonctions intéressantes.‟‟fputc‟‟ et
„‟fgetc‟‟
a. La fonction ‘’fgetc’’
Cette fonction permet de repérer un caractère à partir d‟une fichier texte. Ce caractère
est retourné par la fonction elle-même.
Exemple : char c ;
FILE*f ;
C=fgetc(f) ;
RMQ : S‟il y a une erreur ou une fin de fichier, le caractère retourné sera EOF(End of
file)
b. La fonction ‘’fputc’’
Cette fonction permet d‟écrire un caractère dans un fichier texte. Elle retourne le
caractère écrit s‟il n‟y a pas d‟‟erreur et le caractère EOF en cas d‟erreur.
FILE*f ;
fputc (c, f) ;
Exercices
2. Soit un fichier texte. Proposer un programme qui compte le nombre de lignes dans ce
fichier.
4.Proposer une fonction qui nous donne le nombre de mots dans un fichier.
5.Proposer une fonction qui compte le nombre d‟occurrence de mot ‟‟informatique‟‟ dans
un fichier texte
6.Proposer une fonction qui calcule le nombre de tous les mots miroirs ‟‟nos‟‟ dans un
fichier texte.
. Résolution
Void main ( )
f=fopen(nom fichier,‟‟Wt‟‟) ;
nbligne=0 ;
Scanf
Fclose (f) ;
73
F=fopen (nomFicher,‟‟rt‟‟) ;
C=fgetc ( f ) ;
While (feof ( f )==0 ) // While ( c =‟EOF‟ ) // dépasser les espaces blancs
C= fgetc ( f ) ;
While ( c == „ „ ) { c = fgetc ( f ) ;
While ( c == „ „ ) { c = fgetc ( f ) ; }
fclose ( f ) ;
} return ( n ) ;
Void main ( )
gets ( nomFichier ) ;
f = fopen ( nomFichier,‟‟rb+ „‟ )
} exit ( 8 ) ;
While ( feof ( f ) = =0 )
{ pos = ftell ( f ) ;
n = fileno ( f ) ;
Taille = filelength ( n ) ;
fseek ( f,i, 0 ) ;
fWrite ( f E, etu, 1 , f ) ;
Chsize ( f, taille-etu ) ;
}
75
fclose ( f ) ;
Void main ( )
Int nb char c
gets (nomfichier) ;
C= fgetc (g); nb =0 ;
Printf ("\n le nombre de caractères est :%d ", nb) fclose (g) ;