Documente Academic
Documente Profesional
Documente Cultură
Le langage C
Le langage C est un langage dingnieur destin la cration dapplications informatiques. Un programme en C est constitu dun (ou plusieurs) fichiers sources organiss dune faon conventionnelle.
NOTIONS DE BASE
#include <stdio.h> #include <conio.h> main() /* Notre premier programme en C */ { printf("hello, world\n"); getch(); }
Club Tutoriel Informatique
La pratique en C exige l'utilisation de bibliothques de fonctions. Pour pouvoir les utiliser, il faut inclure des fichiers en-tte (header files - extension .H) dans nos programmes. L'instruction #include insre les fichiers entte indiqus comme arguments dans le texte du programme au moment de la compilation.
Club Tutoriel Informatique
Nous avons crit un programme qui fait appel des fonctions mathmatiques et des fonctions graphiques prdfinies. Pour pouvoir utiliser ces fonctions, le programme a besoin des bibliothques:
MATHS.LIB GRAPHICS.LIB
Nous devons donc inclure les fichiers en-tte correspondants dans le code source de notre programme l'aide des instructions:
Les Fonctions
En C, le programme principal et les sous-programmes sont dfinis comme fonctions. Il n'existe pas de structures spciales pour le programme principal ni les procdures Le programme principal tant aussi une 'fonction'. La fonction main().
Les Fonctions
Dfinition d'une fonction en C :
<TypeRs> <NomFonct> (<TypePar1> <NomPar1>, <TypePar2> <NomPar2>, ...) { <dclarations locales> <instructions> } En C, une fonction est dfinie par: * une ligne dclarative qui contient: <TypeRs> - le type du rsultat de la fonction <NomFonct> - le nom de la fonction <TypePar1> <NomPar1>, <TypePar2> <NomPar2>, ... * les types et les noms des paramtres de la fonction * un bloc d'instructions dlimit par des accolades { }, contenant:
<dclarations locales> - les dclarations des donnes locales (c.--d.: des donnes qui sont uniquement connues l'intrieur de la fonction) <instructions> - la liste des instructions qui dfinit l'action qui doit tre excute
Club Tutoriel Informatique
Les Fonctions
Rsultat d'une fonction :
Par dfinition, toute fonction en C fournit un rsultat dont le type doit tre dfini. Si aucun type n'est dfini explicitement, C suppose par dfaut que le type du rsultat est int (integer). Le retour du rsultat se fait en gnral la fin de la fonction par l'instruction return. Le type d'une fonction qui ne fournit pas de rsultat (comme les procdures en langage algorithmique ou en Pascal), est dclar comme void (vide).
10
Les Fonctions
Paramtres d'une fonction
La dfinition des paramtres (arguments) d'une fonction est place entre parenthses ( ) derrire le nom de la fonction. Si une fonction n'a pas besoin de paramtres, les parenthses restent vides ou contiennent le mot void. La fonction minimale qui ne fait rien et qui ne fournit aucun rsultat est alors: void Afficher () {}
Instructions
En C, toute instruction simple est termine par un point-virgule ; (mme si elle se trouve en dernire position dans un bloc d'instructions). Par exemple: printf("hello, world\n");
11
La Fonction main()
La fonction main est la fonction principale des programmes en C: Elle se trouve obligatoirement dans tous les programmes. L'excution d'un programme entrane automatiquement l'appel de la fonction main.
main() { <dclarations> <instructions> return 0; } le type rsultat de main est toujours int, puisque c'est le type par dfaut. Nous allons terminer nos programmes par l'instruction: return 0; Si nous utilisons des fonctions prdfinies (par exemple: printf), il faut faire prcder la dfinition de main par les instructions #include correspondantes
Club Tutoriel Informatique
12
Les commentaires
Un commentaire commence toujours par les deux symboles '/*' et se termine par les symboles '*/'. Il est interdit d'utiliser des commentaires imbriqus.
Exemples
/* Ceci est un commentaire correct */ /* Ceci est /* videmment */ dfendu */ // Ceci est un commentaire correct
13
Squence d'chappement
sq. d'chapp. descr. anglaise descr. franaise
\n \t \b
\r \" \\ \0 \a
14
* l'ensemble des entiers naturels IN, * l'ensemble des entiers relatifs ZZ, * l'ensemble des rationnels Q, * l'ensemble des rels IR
16
Avant de pouvoir utiliser une variable, nous devons nous intresser deux caractristiques de son type numrique:
(1) le domaine des valeurs admissibles (2) le nombre d'octets qui est rserv pour une variable
17
1 2 2 4
Si on ajoute le prfixe unsigned la dfinition d'un type de variables entires, les domaines des variables sont dplacs comme suit:
dfinition description min max nombre d'octets
0 0 0 0
1 2 2 4
18
En informatique, les rationnels sont souvent appels des 'flottants'. Ce terme vient de 'en virgule flottante' et trouve sa racine dans la notation traditionnelle des rationnels.
19
En C, nous avons le choix entre trois types de rationnels: float, double et long double. Dans le tableau ci-dessous, vous trouverez leurs caractristiques:
min et max : reprsentent les valeurs minimales et maximales positives. Les valeurs ngatives peuvent varier dans les mmes domaines.
20
6 15 19
4 8 10
21
Exercice
Quel(s) type(s) numrique(s) pouvez-vous utiliser pour les groupes de nombres suivants? Dressez un tableau et marquez le choix le plus conomique:
(1) : (2) : (3) : (4) : (5) : (6) : (7) : (8) : (9) : (10) : (11) : (12) : (13) :
1 12 1 12 1 12 1 12 -220 32000 -3000005.000000001 410 50000 410 50000 3.14159265 2*107 10000001 2*10 -7 -1.05*1050 305.122212
4 -4 4 -4 0 2 -2 1015
0 0 0 0.5
22
Maintenant que nous connaissons les principaux types de variables, il nous faut encore la syntaxe pour leur dclaration:
<Type> <NomVar1>,<NomVar2>,...,<NomVarN>;
Exemple :
int compteur,X,Y; float hauteur,largeur; double masse_atomique; char touche; int t_pressee;
boolen : En C il n'existe pas de type spcial pour variables boolennes. Si l'utilisation d'une variable boolenne est indispensable, le plus naturel sera d'utiliser une variable du type int. (0 pour faux et 1 pour vrai)
Club Tutoriel Informatique
23
Exercice
Traduisez les dclarations suivantes en C, sachant que vous travaillerez dans les ensembles de nombres indiqus. Choisissez les types les plus conomiques, sans perdre en prcision.
(1) entier COMPTEUR {0 ,..., 300}
(2)
(3) (4) (5)
entier
entier rel rel
X,Y
MESURE SURFACE1 SURFACE2
(6)
(7) (8) (9) (10)
entier
entier entier entier boolen
N1
N2 N3 N4 TROUVE
{0 ,..., 210}
{-47 ,..., 47} {0 ,..., 326} {-1280 ,..., 1285} {vrai, faux}
24
const En utilisant l'attribut const, nous pouvons indiquer que la valeur d'une variable ne change pas au cours d'un programme:
const int MAX = 767; const double e = 2.71828182845905; const char NEWLINE = '\n';
25
Spcificateurs de format
SYMBOLE TYPE DE VARIABLE
%d ou %i %u %o %b
entier relatif entier naturel (unsigned) entier exprim en octal entier exprim en hexadcimal
%c %s
%f ou %e
26
Oprateurs logiques
&&
|| !
et logique (and)
ou logique (or) ngation logique (not)
Oprateurs de comparaison
== gal
!=
<, <=, >, >=
diffrent de
plus petit que, ...
27
En C, nous utiliserons plutt la formulation plus compacte: i += 2 L'oprateur += est un oprateur d'affectation.
il existe une formulation quivalente qui utilise un oprateur d'affectation: expr1 op= expr2
28
-=
*= /= %=
diminuer de
multiplier par diviser par modulo
29
I++ ou ++I
pour l'incrmentation
I-- ou --I
pour la dcrmentation
incrmenter/dcrmenter une variable (p.ex: dans une boucle). incrmenter/dcrmenter une variable et en mme temps affecter sa valeur une autre variable.
30
passe d'abord la valeur de i X et incrmente aprs passe d'abord la valeur de i X et dcrmente aprs incrmente d'abord et passe la valeur incrmente X dcrmente d'abord et passe la valeur dcrmente X
Exemple :
Supposons que la valeur de N est gal 5: Incrm. postfixe: X = N++; Rsultat: N=6 et X=5 Incrm. prfixe:
31
Pour pouvoir tre multipli avec X, la valeur de I est convertie en float (le type le plus large des deux). Le rsultat de la multiplication est du type float, mais avant d'tre affect a Y, il est converti en double. Nous obtenons comme rsultat: Y = 100.00
Club Tutoriel Informatique
32
(1) deux entiers: D'abord, les types char et short sont convertis en int. Ensuite, l'ordinateur choisit le plus large des deux types dans l'chelle suivante: int, unsigned int, long, unsigned long (2) un entier et un rationnel: Le type entier est converti dans le type du rationnel. (3) deux rationnels: L'ordinateur choisit le plus large des deux types selon l'chelle suivante: float, double, long double
(4) affectations et oprateurs d'affectation: Lors d'une affectation, le rsultat est toujours converti dans le type de la destination. Si ce type est plus faible, il peut y avoir une perte de prcision.
Club Tutoriel Informatique
33
B est converti en float (rgle 2). Le rsultat de la division est du type float (valeur 3.12) et sera converti en int avant d'tre affect X (rgle 4), ce qui conduit au rsultat X=3 .
Club Tutoriel Informatique
34
Exercice
Soient les dclarations: long A = 15; char B = 'A'; /* code ASCII : 65 */ short C = 10; Quels sont le type et la valeur de chacune des expressions:
35
Il est possible de convertir explicitement une valeur en un type quelconque en forant la transformation. Exemple :
char A=3; int B=4; float C; C = (float)A/B;
La valeur de A est explicitement convertie en float. La valeur de B est automatiquement convertie en float (rgle 2). Le rsultat de la division (type rationnel, valeur 0.75) est affect C. Rsultat: C=0.75
36
Exercices
crire un programme qui affiche le quotient et le reste de la division entire de deux nombres entiers entrs au clavier ainsi que le quotient rationnel de ces nombres .
crire un programme qui affiche la rsistance quivalente trois rsistances R1, R2, R3 (type entier) :
37
Exercices
a) Ecrire un programme qui calcule le prix TTC (type float) d'un article partir du prix net (type int) et du pourcentage de TVA (type int) ajouter. Utilisez la formule suivante en faisant attention aux priorits et aux conversions automatiques de type:
b) Ecrire un programme qui calcule le prix net d'un article (type int) partir du prix TTC (type float) et du pourcentage de TVA (type int) qui a t ajoute.
(Dduisez la formule du calcul de celle indique ci-dessus)
Club Tutoriel Informatique
38
crire un programme qui calcule la moyenne des notes dun tudiant. Les matires exiges lexamen et leurs coefficients sont : Math (2), Franais (1), Informatique (3) Le programme doit afficher lcran suivant :
Exercices
39
LA STRUCTURE ALTERNATIVE
if - else
La structure alternative en C
if ( <expression> ) <bloc d'instructions 1> else <bloc d'instructions 2>
Exemple 1
if ( A == B ) printf("A est gal B\n"); else printf("A est diffrent de B\n");
41
if sans else
La partie else est facultative. On peut donc utiliser if de la faon suivante: L'expression suivante peut tre interprte de deux faons:
if (N>0) if (A>B) MAX=A; else MAX=B;
Ou bien :
if (N>0) if (A>B) MAX=A; else printf("N est infrieur a 0");
Club Tutoriel Informatique
42
if sans else
Convention En C une partie else est toujours lie au dernier if qui ne possde pas de partie else. Dans notre exemple, C utiliserait donc la premire interprtation. Solution Pour viter des confusions et pour forcer une certaine interprtation d'une expression, il est recommand d'utiliser des accolades { } .
Club Tutoriel Informatique
43
if sans else
Exemple
Pour forcer la deuxime interprtation de l'expression ci-dessus, nous pouvons crire:
if (N>0) { if (A>B) MAX=A; } else printf("N est infrieur a 0");
Club Tutoriel Informatique
44
Exercice
Ecrivez un programme qui lit trois valeurs entires (A, B et C) au clavier et qui affiche la plus grande des trois valeurs crivez un programme qui lit deux valeurs entires (A et B) au clavier et qui affiche le signe du produit de A et B sans faire la multiplication.
Club Tutoriel Informatique
45
Exercice
Considrez la squence d'instructions suivante:
if (A>B) printf ("premier choix \n"); else if (A>10) printf ("deuxime choix \n"); if (B<10) printf ("troisime choix \n"); else printf ("quatrime choix \n");
a) Copiez la squence d'instructions en utilisant des tabulateurs pour marquer les blocs if - else appartenant ensemble. b) Dterminez les rponses du programme pour chacun des couples de nombres suivants et vrifiez l'aide de l'ordinateur.
- A=10 et B=5 - A=5 et B=10 - A=20 et B=10 - A=5 et B=5 - A=10 et B=10 - A=20 et B=20
46
En combinant plusieurs structures if - else en une expression nous obtenons une structure qui est trs courante pour prendre des dcisions entre plusieurs alternatives:
if - else - ... - else if ( <expr1> ) <bloc1> else if (<expr2>) <bloc2> else if (<expr3>) <bloc3> else if (<exprN>) <blocN> else <blocN+1>
Club Tutoriel Informatique
47
Exercices
Soit N un nombre entier, proposer une opration avec laquelle nous pourrons conclure si le nombre N est pair ou impair. crire un programme permettant de rsoudre une quation du premire degr (ax + b = c). crire un programme C qui permet de :
lire 3 nombre entier. les tris dans un ordre croisant. les tris dans un ordre dcroisant
48
Soit le programme suivant : #include<stdio.h> #include<conio.h> main() { int a,b,c; if(a==b || a==c) a+=++b-=c--;if(a<0) a=--b; else if(b==c && b!=0) b=a++;if(c>=0) a-=--c+b++; else b=c++; printf("a=%d, b=%d, c=%d",a,b,c); getch(); } Dduire le rsultat du programme dans les cas suivant : a=c=b=3 ; a= -3 , b= 0, c= -3 ; a= 0 , b= -1, c= 0 ; a= 7, b= 5, c= 5 ; a= -9 , b= -7, c= 0 ; a=1 , b=1 , c=7;
49
Le langage C possde une paire d'oprateurs un peu exotiques qui peut tre utilise comme alternative if - else :
Exemple :
La suite d'instructions
if (A>B) MAX=A; else MAX=B;
50
Exercice
Si N suprieur 1 alors :
51
Slection (switch)
L'instruction switch est une sorte d'aiguillage. Elle permet de remplacer plusieurs instructions imbriques. La variable de contrle est compare la valeur des constantes de chaque cas (case). Si la comparaison russit, l'instruction du case est excute jusqu' la premire instruction break rencontre. If (a==1)
<instruction 1>; If (a==2) <instruction 2>; If (a==3) Switch (a) { Case 1 : Case 2 : Case 3 : Case 4 : }
Ou bien
<instruction 3>;
If (a==4) <instruction 4>;
<instruction 1>; break; <instruction 2>; break; <instruction 3>; break; <instruction 4>; break;
52
Exercices
On dispose de 3 nombres rels saisis au clavier. selon un choix effectu partie dun menu affich lcran, on dsire calculer la somme ou le produit ou la moyenne ou chercher le minimum ou le maximum de ces 3 nombres. Exemple : 1) somme des 3 nombres 2) produit des 3 nombres 3) moyenne des 3 nombres 4) minimum des 3 nombres 5) maximum des 3 nombres
crire un programme permettant de rsoudre une quation du deuxime degr (ax2 + bx = c).
Club Tutoriel Informatique
53
Exercices
Dans une entreprise, le salaire brut dun employ est calcul en fonction du nombre dheures travailles dans le mois et de son taux horaire. A ce salaire on ajoute une prime danciennet en fonction du nombre dannes travailles, cette prime est gale 7% du salaire brut par anne, (il est impossible davoir une anciennet >20ans). Pour chaque employ en doit retirer une somme de 200DH pour IGR, ainsi que la participation dans une des assurances suivante :
Assurance maladie (250 DH) Assurance logement (470 DH) Assurance dcs (180 DH)
Calculer le salaire net de lemploy. Le programme devra afficher 4 information, Salaire brut, Prime, Retenue et le salaire net.
Club Tutoriel Informatique
54
LA STRUCTURE REPETITIVE
LA STRUCTURE REPETITIVE
En C, nous disposons de trois structures qui nous permettent la dfinition de boucles conditionnelles:
il est possible de programmer toutes sortes de boucles conditionnelles en n'utilisant qu'une seule des trois structures. il est donc, absolument recommand de choisir toujours la structure la mieux adapte au cas actuel 56
while
La structure while correspond tout fait la structure tant que du langage algorithmique.
La structure while en C :
while ( <expression> ) { <bloc d'instructions> }
57
Exemple 1
/* Afficher les nombres de 0 9 */ int I = 0; while (I<10) { printf("%i \n", I); I++; }
58
Exemple 2
/* Afficher les nombres de 9 0 */
int I = 10; while (I>0) { printf("%i \n", I); I-- ; }
59
do - while
La structure do - while est semblable la structure while, avec la diffrence suivante :
* while value la condition avant d'excuter le bloc d'instructions, * do - while value la condition aprs avoir excut le bloc d'instructions. Ainsi le bloc d'instructions est excut au moins une fois.
60
do - while
La structure do - while en C :
do {
Exemple 1
int N ; do { printf("Introduisez un nombre entre 1 et 10 :") ; scanf("%f", &N) ; } while (N<1 || N>10) ;
62
Exemple 2
63
for
La structure for en Pascal et la structure pour en langage algorithmique sont utilises pour faciliter la programmation de boucles de comptage. La structure for en C est plus gnrale et beaucoup plus puissante.
La structure for en C :
for ( <init.> ; <cond. rptition> ; <compteur> ) <bloc d'instructions>
64
for
<expr1>; while ( <expr2> ) { <bloc d'instructions> <expr3>; }
est quivalent :
for ( <expr1> ; <expr2> ; <expr3> ) <bloc d'instructions>
65
Exemple 1
Int i=0; while ( i<10 ) { <bloc d'instructions> i++; }
est quivalent :
for ( int i=0 ; i<10 ; i++ ) { <bloc d'instructions> }
Club Tutoriel Informatique
66
Exemple 2
int n, tot; for (tot=0, n=1 ; n<101 ; n++) { tot+=n; } printf("La somme des nombres de 1 100 est %d\n", tot);
67
Si le bloc d'instructions ne doit pas tre excut si la condition est fausse, alors utilisez while ou for. Si le bloc d'instructions doit tre excut au moins une fois, alors utilisez do - while. Si le nombre d'excutions du bloc d'instructions dpend d'une ou de plusieurs variables qui sont modifies la fin de chaque rptition, alors utilisez for. Si le bloc d'instructions doit tre excut aussi longtemps qu'une condition extrieure est vraie (p.ex aussi longtemps qu'il y a des donnes dans le fichier d'entre), alors utilisez while.
Le choix entre for et while n'est souvent qu'une question de prfrence ou d'habitudes:
Club Tutoriel Informatique
68
Exercice d'application 1
On se propose dcrire un programme qui dtecte si un nombre entr au clavier est positif ou ngatif. La condition darrt de la saisie est lentre dun zro. crire un programme permettant dafficher la table de multiplication de 5.
69
Exercice d'application 2
crivez un programme qui affiche, pour chaque entier de 1 20, sa valeur, un espace, le texte "au carr vaut", un espace, la valeur de son carr et un retour la ligne :
1 au carr vaut 1 2 au carr vaut 4 3 au carr vaut 9 ...
70
Exercice d'application 3
crivez un programme qui lit deux nombres au clavier et qui affiche dans l'ordre, un par ligne, tous les entiers compris entre ces deux nombres. On suppose que l'utilisateur entre le plus petit des deux nombres en premier.
Par exemple si l'utilisateur entre 21 puis 24, le programme devra afficher :
21 22 23 24
71
Exercice d'application 4
crivez un programme qui lit deux nombres au clavier et qui affiche dans l'ordre inverse, spars par des virgules, les entiers compris entre ces deux valeurs, en en sautant un sur deux. On suppose que l'utilisateur entre le plus petit des deux nombres en premier. Par exemple, si l'utilisateur tape 11 puis 20, votre programme doit afficher :
20,18,16,14,12
Club Tutoriel Informatique
72
Exercice d'application 5
Ecrivez un programme qui lit N nombres entiers au clavier et qui affiche leur somme, leur produit et leur moyenne. Choisissez un type appropri pour les valeurs afficher. Le nombre N est entrer au clavier. Rsolvez ce problme,
Exercice d'application 6
74
Exercice d'application 7
crire un programme permettant dafficher les formes suivants (1<N<10) : tape 1 : ***
N=3
tape 2 :
N=3
tape 3 :
N=3
tape 4 :
N=3
75
Exercice d'application 8
crire un programme qui affiche tous les diviseur dun nombre N (1<N<50). Exemple :
N= 33 les diviseurs de 33 sont : 1 3 11 33
crire un programme qui affiche le P.G.C.D. de deux entiers naturels entrs au clavier en utilisant (l'algorithme d'Euclide).
Club Tutoriel Informatique
76
Exercice d'application 9
crivez un programme qui lit deux nombres au clavier et qui affiche dans l'ordre, tous les entiers premier compris entre ces deux nombres.
On veut trouver le plus petit entier N (sil existe) tel que 1+1/2+.+1/N >1000. crire la boucle qui permet de dterminer n.
77
Exercice d'application 10
Lire la suite des prix (en Dirham entiers) des achats dun client. Calculer la somme quil doit, lire la somme quil paye, et simuler la remise de la monnaie en affichant le nombre de pices de : "10 DH", "5 DH" , "2 DH" et "1 DH" autant de fois quil y a de pices de chaque sorte rendre.
78
Exercice d'application 11
crire un algorithme qui permette de connatre ses chances de gagner au tierc. On demande lutilisateur le nombre de chevaux partants, et le nombre de chevaux jous. Les deux messages affichs par le programme sont :
Dans lordre : une chance sur X de gagner Dans le dsordre : une chance sur Y de gagner
X et Y nous sont donns par la formule suivante, si n est le nombre de chevaux partants et k le nombre de chevaux jous : X= Y=
Club Tutoriel Informatique
79
LES TABLEAUX
Les Tableaux
Les tableaux sont certainement les variables structures les plus populaires. Ils sont disponibles dans tous les langages de programmation et servent rsoudre une multitude de problmes.
Les chanes de caractres sont dclares en C comme tableaux de caractres et permettent l'utilisation d'un certain nombre de notations et de fonctions spciales.
81
Un tableau (uni-dimensionnel) A est une variable structure forme d'un nombre entier N de variables simples du mme type, qui sont appeles les composantes du tableau. Le nombre de composantes N est alors la dimension du tableau.
82
Exemple
La dclaration
int JOURS[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
dfinit un tableau du type int de dimension 12. Les 12 composantes sont initialises par les valeurs respectives 31, 28, 31, ... , 31. On peut accder la premire composante du tableau par JOURS[0], la deuxime composante par JOURS[1], . . . , la dernire composante par JOURS[11].
Club Tutoriel Informatique
83
Dclaration
Dclaration de tableaux en C
<TypeSimple> <NomTableau> [<Dimension>];
Exemples :
int A[25]; float B[100]; int C[10]; long A[25]; double B[100]; char D[30];
84
Mmorisation
En C, le nom d'un tableau est le reprsentant de l'adresse du premier lment du tableau. Les adresses des autres composantes sont calcules (automatiquement) relativement cette adresse.
short A[5] = {1200, 2300, 3400, 4500, 5600};
Exemple:
85
Initialisation
Lors de la dclaration d'un tableau, on peut initialiser les composantes du tableau, en indiquant la liste des valeurs respectives entre accolades.
Exemples :
int A[5] = {10, 20, 30, 40, 50}; float B[4] = {-1.05, 3.33, 87e-5, -12.3E4}; int C[10] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1};
Il faut videmment veiller ce que le nombre de valeurs dans la liste corresponde la dimension du tableau. Si la liste ne contient pas assez de valeurs pour toutes les composantes, les composantes restantes sont initialises par zro.
86
Rservation automatique
Si la dimension n'est pas indique explicitement lors de l'initialisation, alors l'ordinateur rserve automatiquement le nombre d'octets ncessaires.
Exemples :
87
Exemple :
Exemples :
MAX = (A[0]>A[1]) ? A[0] : A[1]; A[4] *= 2; /* A[4]= A[4] * 2 = 6800 */
Club Tutoriel Informatique
88
En C,
- l'accs au premier lment du tableau se fait par T[0] - l'accs au dernier lment du tableau se fait par T[N-1]
En langage algorithmique,
- l'accs au premier lment du tableau se fait par T[1] - l'accs au dernier lment du tableau se fait par T[N]
89
Exemple :
main() { int A[5]; int I; for (I=0; I<5; I++) scanf("%d", &A[I]); return 0; } La commande de lecture scanf doit tre informe du type exact des donnes lire. (Ici: %d ou %i pour lire des valeurs du type int)
Club Tutoriel Informatique
90
Exemple :
main() { int A[5]; int I; /* Compteur */ for (I=0; I<5; I++) printf("%d ", A[I]); return 0; }
Club Tutoriel Informatique
91
Exercice 1
Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Calculer et afficher ensuite la somme des lments du tableau.
92
Exercice 2
crire un programme qui lit la dimension N d'un tableau NOTE (dimension maximale: 50 composantes), remplit le tableau par les notes d'une classe, afficher ensuite le tableau. Calculer et afficher ensuite la moyenne des tudiants de la classe. Afficher par la suit le nombre dtudiants admis pour la prochaine anne (avec une notes suprieures la
moyenne de la classe )
93
Exercice 3
Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Le programme affichera le nombre de valeurs ngatives, le nombre de valeurs positives et le nombre de valeur nulle.
94
Exercice 4
Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Ranger ensuite les lments du tableau T dans l'ordre inverse sans utiliser de tableau d'aide. Afficher le tableau rsultant.
Ide: changer les lments du tableau l'aide de deux indices qui parcourent le tableau en commenant respectivement au dbut et la fin du tableau et qui se rencontrent en son milieu.
95
Exercice 5
Ecrivez un algorithme constituant un tableau, partir de deux tableaux de mme longueur pralablement saisis. Le nouveau tableau sera la somme des lments des deux tableaux de dpart.
96
Exercice 6
Toujours partir de deux tableaux prcdemment saisis, crivez un algorithme qui calcule le schtroumpf des deux tableaux. Pour calculer le schtroumpf, il faut multiplier chaque lment du tableau 1 par chaque lment du tableau 2, et additionner le tout. Par exemple si l'on a :
97
Exercice 7
Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Copiez ensuite toutes les composantes strictement positives dans un deuxime tableau TPOS et toutes les valeurs strictement ngatives dans un troisime tableau TNEG. Afficher les tableaux TPOS et TNEG.
Club Tutoriel Informatique
98
En C, un tableau deux dimensions A est interprter comme un tableau (uni-dimensionnel) de dimension L dont chaque composante est un tableau (uni-dimensionnel) de dimension C. On appelle L le nombre de lignes du tableau et C le nombre de colonnes du tableau. L et C sont alors les deux dimensions du tableau. Un tableau deux dimensions contient donc L*C composantes.
99
Exemple
Considrons un tableau NOTES une dimension pour mmoriser les notes de 20 lves d'une classe dans un devoir:
int NOTE[20] = {45, 34, ... , 50, 48};
Pour mmoriser les notes des lves dans les 10 devoirs d'un trimestre, nous pouvons rassembler plusieurs de ces tableaux uni-dimensionnels dans un tableau NOTES deux dimensions :
int NOTE[10][20] = {{45, 34, ... , 50, 48}, {39, 24, ... , 49, 45}, ... ... ... {40, 40, ... , 54, 44}};
Dans une ligne nous retrouvons les notes de tous les lves dans un devoir. Dans une colonne, nous retrouvons toutes les notes d'un lve.
Club Tutoriel Informatique
100
Dclaration
Dclaration de tableaux deux dimensions en C :
<TypeSimple> <NomTabl> [<DimLigne>][<DimCol>];
Exemples :
int A[10][10]; float B[2][20]; double C[3][3]; char D[15][40];
101
Mmorisation
Comme pour les tableaux une dimension, le nom d'un tableau est le reprsentant de l'adresse du premier lment du tableau (c.--d. l'adresse de la premire ligne du tableau). Les composantes d'un tableau deux dimensions sont stockes ligne par ligne dans la mmoire.
short A[3][2] = {{1, 2 }, {10, 20 }, {100, 200}}; Un tableau de dimensions L et C, form de composantes dont chacune a besoin de M octets, occupera L*C*M octets en mmoire.
102
Exemples :
int A[3][10] ={{ 0,10,20,30,40,50,60,70,80,90}, {10,11,12,13,14,15,16,17,18,19}, {11,12,23,34,45,56,67,78,89,90}}; Lors de l'initialisation, les valeurs sont affectes ligne par ligne en passant de gauche droite. Nous ne devons pas ncessairement indiquer toutes les valeurs: Les valeurs manquantes seront initialises par zro. Il est cependant dfendu d'indiquer trop de valeurs pour un tableau.
Club Tutoriel Informatique
103
Exemple
104
105
Attention !
Considrons un tableau A de dimensions L et C. En C,
- les indices du tableau varient de 0 L-1, respectivement de 0 C-1. - la composante de la Nime ligne et Mime colonne est note:
A[N-1][M-1]
106
Affichage
Lors du travail avec les tableaux deux dimensions, nous utiliserons deux indices (p.ex: I et J), et la structure for, souvent imbrique, pour parcourir les lignes et les colonnes des tableaux.
main() { int A[5][10]; int I,J; /* Pour chaque ligne ... */ for (I=0; I<5; I++) { /* ... considrer chaque composante */ for (J=0; J<10; J++) printf("%7d", A[I][J]); /* Retour la ligne */ printf("\n"); } return 0; }
Club Tutoriel Informatique
107
108
Exercice
Ecrire un programme qui lit les dimensions L et C d'un tableau T deux dimensions du type int (dimensions maximales: 50 lignes et 50 colonnes). Remplir le tableau par des valeurs entres au clavier et afficher le tableau ainsi que la somme de tous ses lments.
Ecrire un programme qui transfre un tableau M deux dimensions L et C (dimensions maximales: 10 lignes et 10 colonnes) dans un tableau V une dimension L*C.
Exemple :
109
Dclaration
Dclaration de chanes de caractres en C :
char <NomVariable> [<Longueur>];
Exemples :
char NOM [20]; char PRENOM [20]; char PHRASE [300];
Lors de la dclaration, nous devons indiquer l'espace rserver en mmoire pour le stockage de la chane. La reprsentation interne d'une chane de caractres est termine par le symbole '\0' (NUL). Ainsi, pour un texte de n caractres, nous devons prvoir n+1 octets.
111
Mmorisation
Le nom d'une chane est le reprsentant de l'adresse du premier caractre de la chane. Pour mmoriser une variable qui doit tre capable de contenir un texte de N caractres, nous avons besoin de N+1 octets en mmoire.
Exemple:
char TXT[10] = "BONJOUR !";
112
113
Fonctions pour le traitement de chanes de caractres Dans le tableau suivant, <n> reprsente un nombre du type int. Les symboles <s> et <t> peuvent tre remplacs par le nom d'une variable dclare comme tableau de char
114
Exercice
crire un programme qui lit deux chanes de caractres CH1 et CH2, les compare lexico graphiquement et affiche le rsultat.
Exemple:
Introduisez la premire chane: ABC Introduisez la deuxime chane: abc "ABC" prcde "abc"
115
Exercice
crire un programme qui lit un verbe rgulier en "er" au clavier et qui en affiche la conjugaison au prsent de l'indicatif de ce verbe. Contrlez s'il s'agit bien d'un verbe en "er" avant de conjuguer. Utiliser les fonctions strcat et strlen.
Exemple:
Verbe : fter
je fte tu ftes il fte nous ftons vous ftez ils ftent
116
LES STRUCTURES
Un tableau permet de regrouper des lments de mme type, c'est--dire cods sur le mme nombre de bit et de la mme faon. Toutefois, il est gnralement utile de pouvoir rassembler des lments de type diffrents tels que des entiers et des chanes de caractres. Les structures permettent de remdier cette lacune des tableaux, en regroupant des objets (des variables) au sein d'une entit repre par un seul nom de variable. Les objets contenus dans la structure sont appels champs de la structure.
Club Tutoriel Informatique
118
Les Structures
Entit regroupant plusieurs variable de type divers : Exemple :
Description du type :
119
120
Initialisation
#include <stdio.h>
121
122
123
Exercice
crire un programme qui lit un enregistrement dtudiant, identifi par (nom, prenom, classe, sexe, note_fr, note_algo, note_ang), le programme doit afficher cette enregistrement et calculer la moyenne de ltudiant.
Ide:
124
Tableau de structure
il est possible de crer un tableau ne contenant que des lments du type d'une structure donne. Il suffit de crer un tableau dont le type est celui de la structure et de le reprer par un nom de variable :
125
Exemple
void main() { personne pers[30]; for(int i=0 ; i<30 ; i++) { printf(" \n Entrez SVP le nom : "); scanf(" %s ", pers[i].nom); printf(" \n Entrez SVP le salaire : "); scanf(" %d ", &pers[i].salaire); } }
Chaque lment du tableau reprsente alors une structure du type que l'on a dfini...
126
Exercice
Refaire le dernier exercice en supposant que vous avez une classe de 10 tudiants. Calculer la moyenne gnrale de la classe.
127
LES POINTEURS
Introduction
La plupart des langages de programmation offrent la possibilit d'accder aux donnes dans la mmoire de l'ordinateur l'aide de pointeurs, c.--d. l'aide de variables auxquelles on peut attribuer les adresses d'autres variables.
Avant de parler de pointeurs, il est indiqu de brivement passer en revue les deux modes d'adressage principaux, qui vont d'ailleurs nous accompagner tout au long des chapitres suivants.
129
Adressage direct
Dans la programmation, nous utilisons des variables pour stocker des informations. La valeur d'une variable se trouve un endroit spcifique dans la mmoire interne de l'ordinateur. Le nom de la variable nous permet alors d'accder directement cette valeur.
Adressage direct: Accs au contenu d'une variable par le nom de la variable.
Exemple :
130
Adressage indirect
Si nous ne voulons ou ne pouvons pas utiliser le nom d'une variable A, nous pouvons copier l'adresse de cette variable dans une variable spciale P, appele pointeur. Ensuite, nous pouvons retrouver l'information de la variable A en passant par le pointeur P.
Adressage indirect: Accs au contenu d'une variable, en passant par un pointeur qui contient l'adresse de la variable.
Exemple :
131
Dfinition
Un pointeur est une variable spciale qui peut contenir l'adresse d'une autre variable. Si un pointeur P contient l'adresse d'une variable A, on dit que :
132
Remarque
Les pointeurs et les noms de variables ont le mme rle: Ils donnent accs un emplacement dans la mmoire interne de l'ordinateur. Il faut quand mme bien faire la diffrence :
* Un pointeur est une variable qui peut 'pointer' sur diffrentes adresses. * Le nom d'une variable reste toujours li la mme adresse.
133
d'un oprateur 'adresse de' : & pour obtenir l'adresse d'une variable. d'un oprateur 'contenu de' : * pour accder au contenu d'une adresse.
Exemple :
& <NomVariable> : fournit l'adresse de la variable <NomVariable> * <NomPointeur> : dsigne le contenu de l'adresse rfrence par le pointeur <NomPointeur>
134
Reprsentation schmatique
Soit P un pointeur non initialis :
et A une variable (du mme type) contenant la valeur 10 : Alors l'instruction : P = &A; affecte l'adresse de la variable A la variable P. En mmoire, A et P se prsentent comme dans le graphique en haut. Dans notre reprsentation schmatique, nous pouvons illustrer le fait que 'P pointe sur A' par une flche:
Club Tutoriel Informatique
135
Exemple
Soit A une variable contenant la valeur 10, B une variable contenant la valeur 50 et P un pointeur non initialis: Aprs les instructions, P = &A; B = *P; *P = 20;
- P pointe sur A, - le contenu de A (rfrenc par *P) est affect B, et - le contenu de A (rfrenc par *P) est mis 20.
136
ou
"PNUM est un pointeur sur int"
ou
"PNUM peut contenir l'adresse d'une variable du type int"
137
Exemple
void main() { /* dclarations */ short A = 10; short B = 50; short *P; /* traitement */ P = &A; B = *P; *P = 20; }
138
P = &X;
les expressions suivantes, sont quivalentes :
Y = *P + 1 *P = *P + 10 *P += 2 ++*P (*P)++ Y=X+1 X = X + 10 X += 2 /*X = X + 2*/ ++X X++
139
Exercice
Copiez le tableau suivant et compltez-le pour chaque instruction du programme ci-dessus.
140
Exercice
Copiez le tableau suivant et compltez-le pour chaque instruction du programme cidessus.
P1 &A
P2 &B
P3 &C
P2=P1;
P1=*P3+=3; P1=&B; *P3=++(*P1) **P2; P1=P3; P3=&C; *P2=&B; *P1/=(*P2)++;
Club Tutoriel Informatique
141
Pointeurs et tableaux
En C, il existe une relation trs troite entre tableaux et pointeurs. Ainsi, chaque opration avec des indices de tableaux peut aussi tre exprime l'aide de pointeurs.
142
&tableau[0] et tableau
En simplifiant, nous pouvons retenir que le nom d'un tableau est un pointeur constant sur le premier lment du tableau.
143
Exemple
En dclarant un tableau A de type int et un pointeur P sur int, int A[10]; int *P; l'instruction: P = A; est quivalente P = &A[0];
Si P pointe sur une composante quelconque d'un tableau, alors P+1 pointe sur la composante suivante. Plus gnralement,
P + i : pointe sur la i-ime composante devant P P - i : pointe sur la i-ime composante derrire P.
144
Exemple
Ainsi, aprs l'instruction, P = A; le pointeur P pointe sur A[0], et
*(P+1) : dsigne le contenu de A[1] *(P+2) : dsigne le contenu de A[2] ... : ... *(P+i) : dsigne le contenu de A[i]
Club Tutoriel Informatique
145
Exemple
Soit A un tableau contenant des lments du type float et P un pointeur sur float:
float A[20], X; float *P; Aprs les instructions, P = A; X = *(P+9); X contient la valeur du 10-ime lment de A, (c.--d. celle de A[9]). Une donne du type float ayant besoin de 4 octets, le compilateur obtient l'adresse P+9 en ajoutant 9 * 4 = 36 octets l'adresse dans P.
146
Exemple
Comme A reprsente l'adresse de A[0] :
Attention ! : Il existe toujours une diffrence essentielle entre un pointeur et le nom d'un tableau. 147
Diffrence
- Un pointeur est une variable,
donc des oprations comme P = A ou P++ sont permises.
148
Rsumons
Soit un tableau A d'un type quelconque et i un indice pour les composantes de A, alors :
A A+i *(A+i) Si P = A, alors P P+i *(P+i) pointe sur l'lment A[0] pointe sur l'lment A[i] dsigne le contenu de A[i]
Club Tutoriel Informatique
149
Exercice 1
crire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Utiliser le formalisme pointeur chaque fois que cela est possible. Calculer et afficher ensuite la somme des lments du tableau.
Club Tutoriel Informatique
150
151
152
Exemple
/* rservation de 12 octets */ float A, B, C; /* rservation de 400 octets */ short D[10][20]; /* rservation de 10 octets */ char E[] = {"Bonjour !"};
153
154
Allocation dynamique
Souvent, nous devons travailler avec des donnes dont nous ne pouvons pas prvoir le nombre et la grandeur lors de la programmation. Ce serait alors un gaspillage de rserver toujours l'espace maximal prvisible. Il nous faut donc un moyen de grer la mmoire lors de l'excution du programme.
155
Exemple
Nous voulons lire 10 phrases au clavier et mmoriser les phrases en utilisant un tableau de pointeurs sur char. Nous dclarons ce tableau de pointeurs par :
char *TEXTE[10];
Pour les 10 pointeurs, nous avons besoin de 10*p octets. Ce nombre est connu ds le dpart et les octets sont rservs automatiquement. Il nous est cependant impossible de prvoir l'avance le nombre d'octets rserver pour les phrases elles-mmes qui seront introduites lors de l'excution du programme ... La rservation de la mmoire pour les 10 phrases peut donc seulement se faire pendant l'excution du programme. Nous parlons dans ce cas de l'allocation dynamique de la mmoire.
Club Tutoriel Informatique
156
La fonction malloc
La fonction malloc de la bibliothque <stdlib> nous aide localiser et rserver de la mmoire au cours d'un programme. Elle nous donne de l'espace en mmoire laiss libre une fois mis en place le DOS.
malloc( <N> ) fournit l'adresse d'un bloc en mmoire de <N> octets libres ou la valeur zro s'il n'y a pas assez de mmoire.
157
Exemple
Supposons que nous ayons besoin d'un bloc en mmoire pour un texte de 4000 caractres. Nous disposons d'un pointeur T sur char (char *T). Alors l'instruction: T = malloc(4000); fournit l'adresse d'un bloc de 4000 octets libres et l'affecte T. S'il n'y a plus assez de mmoire, T obtient la valeur zro. Si nous voulons rserver de la mmoire pour des donnes d'un type dont la grandeur varie d'une machine l'autre, nous avons besoin de la grandeur effective d'une donne de ce type. L'oprateur sizeof nous aide alors prserver la portabilit du programme.
Club Tutoriel Informatique
158
159
Exemple
Aprs la dclaration, short A[10];
nous obtenons les rsultats suivants sur un IBM-PC (ou compatible) :
160
Exemple
Nous voulons rserver de la mmoire pour X valeurs du type int; la valeur de X est lue au clavier:
int X; int *PNum; printf("Introduire le nombre de valeurs :"); scanf("%d", &X); PNum = malloc(X*sizeof(int));
161
La fonction free
Si nous n'avons plus besoin d'un bloc de mmoire que nous avons rserv l'aide de malloc, alors nous pouvons le librer l'aide de la fonction free de la bibliothque <stdlib>.
free( <Pointeur> ) libre le bloc de mmoire dsign par le <Pointeur>; n'a pas d'effet si le pointeur a la valeur zro.
162
LES FONCTIONS
La notion de blocs
Les fonctions en C sont dfinies l'aide de blocs d'instructions. Un bloc d'instructions est encadr d'accolades et compos de deux parties:
Blocs d'instructions en C { <dclarations locales> <instructions> }
164
Exemple
La variable d'aide I est dclare l'intrieur d'un bloc conditionnel. Si la condition (N>0) n'est pas remplie, I n'est pas dfini. A la fin du bloc conditionnel, I disparat. if (N>0) { int I; for (I=0; I<N; I++) ... }
165
Variables locales
Les variables dclares dans un bloc d'instructions sont uniquement visibles l'intrieur de ce bloc. On dit que ce sont des variables locales ce bloc.
Exemple :
La variable NOM est dfinie localement dans le bloc extrieur de la fonction HELLO. Ainsi, aucune autre fonction n'a accs la variable NOM:
void HELLO(void) { char NOM[20]; printf("Introduisez votre nom : "); scanf("%s",NOM); printf("Bonjour %s !\n", NOM); }
Club Tutoriel Informatique
166
Variables locales
Attention ! Une variable dclare l'intrieur d'un bloc cache toutes les variables du mme nom des blocs qui l'entourent.
Exemple : Dans la fonction suivante,
167
Variables locales
la premire instruction X=100 se rapporte la variable du type int dclare dans le bloc extrieur de la fonction; l'instruction X*=A agit sur la variable du type double dclare dans la boucle while. A l'intrieur de la boucle, il est impossible d'accder la variable X du bloc extrieur.
168
Variables globales
Les variables dclares au dbut du fichier, l'extrieur de toutes les fonctions sont disponibles toutes les fonctions du programme. Ce sont alors des variables globales. En gnral, les variables globales sont dclares immdiatement derrire les instructions #include au dbut du programme. Attention !
Les variables dclares au dbut de la fonction principale main ne sont pas des variables globales, mais elles sont locales main !
169
Exemple
La variable STATUS est dclare globalement pour pouvoir tre utilise dans les procdures A et B.
170
le type du rsultat fourni par la fonction le nom de la fonction le type, le nombre et les noms des paramtres de la fonction les donnes locales la fonction les instructions excuter
Remarquez qu'il n'y a pas de point-virgule derrire la dfinition des paramtres de la fonction.
Club Tutoriel Informatique
171
Renvoyer un rsultat
Par dfinition, toutes les fonctions fournissent un rsultat d'un type que nous devons dclarer. Une fonction peut renvoyer une valeur d'un type simple ou l'adresse d'une variable ou d'un tableau. Pour fournir un rsultat en quittant une fonction, nous disposons de la commande return:
return <expression>;
172
Exemple
La fonction CARRE du type double calcule et fournit comme rsultat le carr d'un rel fourni comme paramtre.
double CARRE(double X) { return X*X; } void main() { double car , var = 12; car = CARRE(var); printf(" le carr de %f est %f ",var,car ); }
Club Tutoriel Informatique
173
Le type void
En C, il n'existe pas de structure spciale pour la dfinition de procdures comme en Pascal et en langage algorithmique. Nous pouvons cependant employer une fonction du type void partout o nous utiliserions une procdure en langage algorithmique ou en Pascal.
174
Exemple
175
Exemple
176
177
Gnralits
Lors d'un appel, le nombre et l'ordre des paramtres doivent ncessairement correspondre aux indications de la dclaration de la fonction. Les paramtres sont automatiquement convertis dans les types de la dclaration avant d'tre passs la fonction.
Exemple :
double pow (double, double); A = pow (B, 2);
Club Tutoriel Informatique
178
Les paramtres d'une fonction sont considrer comme des variables locales qui sont initialises automatiquement par les valeurs indiques lors d'un appel.
A l'intrieur de la fonction, nous pouvons donc changer les valeurs des paramtres sans influencer les valeurs originales dans les fonctions appelantes. 179
Exemple
La fonction ETOILES dessine une ligne de N toiles. Le paramtre N est modifi l'intrieur de la fonction. En utilisant N comme compteur, nous n'avons pas besoin de l'indice d'aide I La fonction TRIANGLE, appelle la fonction ETOILES en utilisant la variable L comme paramtre Au moment de l'appel, la valeur de L est copie dans N. La variable N peut donc tre dcrmente l'intrieur de ETOILES, sans influencer la valeur originale de L.
180
Schmatiquement, le passage des paramtres peut tre reprsent dans une 'grille' des valeurs:
181
Avantages
Le passage par valeur a l'avantage que nous pouvons utiliser les paramtres comme des variables locales bien initialises. De cette faon, nous avons besoin de moins de variables d'aide.
182
- la fonction appelante doit fournir l'adresse de la variable et - la fonction appele doit dclarer le paramtre comme pointeur.
183
184
Explication
Lors de l'appel, les valeurs de X et de Y sont copies dans les paramtres A et B. PERMUTER change bien contenu des variables locales A et B, mais les valeurs de X et Y restent les mmes.
185
Solution
Pour pouvoir modifier le contenu de X et de Y, la fonction PERMUTER a besoin des adresses de X et Y. En utilisant des pointeurs, nous crivons une deuxime fonction:
Nous appelons la fonction par:
PERMUTER(&X, &Y);
Explication
Lors de l'appel, les adresses de X et de Y sont copies dans les pointeurs A et B. PERMUTER change ensuite le contenu des adresses indiques par les pointeurs A et B.
187
Exercices
Exercice 1 : crire un programme se servant d'une fonction MOYENNE du type float pour afficher la moyenne arithmtique de deux nombres rels entrs au clavier. Exercice 2 : crire une fonction MIN et une fonction MAX qui dterminent le minimum et le maximum de deux nombres rels. Ecrire un programme se servant des fonctions MIN et MAX pour dterminer le minimum et le maximum dun tableau de nombres rels entrs au clavier.
Club Tutoriel Informatique
188
Exercices
Exercice 3 :
La fonction LIRE_TAB trois paramtres TAB, N et NMAX lit la dimension N et les composantes d'un tableau TAB du type int. La dimension N doit tre infrieure NMAX.
189
Exercices
Exercice 4 :
Ecrire la fonction LONG_CH qui retourne la longueur d'une chane de caractres CH comme rsultat. Implmentez LONG_CH sans utiliser de variable d'aide numrique.
190