Escolar Documentos
Profissional Documentos
Cultura Documentos
Dfinitions (1)
Algorithmique:
Conception de mthodes pour la rsolution de problmes: Description des donnes dun problme (spcification des entres du problme). Description des mthodes pour rsoudre le problme (spcification des sorties partir des entres). Test des mthodes proposes.
Dfinitions (2)
Algorithme:
Suite finie dtapes vrifiant: Chaque tape est dcrite de faon prcise. Chaque tape est dterministe (produit des rsultats uniques). Lalgorithme sarrte aprs un nombre fini dinstructions. Reoit des donnes en entre. Produit des donnes en sortie. Applicable des ensembles diffrents de donnes dentre.
Dfinitions (3)
Efficacit:
Minimisation du temps de calcul. Optimisation de lespace mmoire utilis. Organisation des donnes: Choix des structures de donnes. Implmentation: Choix dun langage de programmation. Traduction de lalgorithme en un programme informatique.
Ralisation:
Intrt de lalgorithmique
Sparation analyse/codage (pas de proccupation de syntaxe). Lalgorithmique exprime les instructions rsolvant un problme donn indpendamment des particularits de tel ou tel langage.
Tri dun ensemble dlments: Entre: suite de n lments A1, A2,, An. Sortie: la suite ordonne. Suite de nombres: 475, 787, 34, 245, 56, 350. Suite de noms: Pierre, Christine, Sylvie, Samuel, Fabien.
Instances du problme:
Enonc du problme Spcification Cahier des charges Analyse Algorithme Traduction en langage Programme source Compilation Programme excutable Tests et modifications Version finale et rsultats
Reprsentation graphique avec des symboles (carrs, losanges,). Vue densemble de lalgorithme. Reprsentation quasiment abandonne aujourdhui. Reprsentation textuelle avec une srie de conventions ressemblant un langage de programmation (sans les problmes de syntaxe). Plus pratique pour crire un algorithme. Reprsentation largement utilise.
Le pseudo-code:
Notion de variable
Dans les langages de programmation, une variable sert stocker la valeur dune donne. Une variable dsigne en fait un emplacement mmoire dont le contenu peut changer au cours dun programme (do le nom variable). Les variables doivent tre dclares avant dtre utilises, elles doivent tre caractrises par:
10
De prfrence, un nom doit tre constitu uniquement de lettres non accentues, de chiffres et du soulignement _ (Eviter les caractres de ponctuation et les espaces).
11
Choisir des noms significatifs pour dsigner les donnes manipules. Exemples: prix_HT, prix_TTC.
12
Type numrique (entier ou rel): Byte (cod sur 1octet): de 0 255. Entier court (cod sur 2 octets). Entier long (cod sur 4 ou 8 octets). Rel simple prcision (cod sur 4 octets). Rel double prcision (cod sur 8 octets).
13
Type logique ou boolen: Deux valeurs: VRAI ou FAUX (1 ou 0 dans certains langages). Type caractre: Lettres majuscules, minuscules, chiffres, symboles, Type chane de caractres: Toute suite de caractres.
14
Variables identificateur1 : type1 identificateur2 : type2 Variables i, j, k : Entier x, y : Rel nom : Chane de caractres
Exemple:
15
Var e : attribue la valeur de e la variable Var. e peut tre une valeur, une autre variable ou une expression. Var et e doivent tre de mme type ou de types compatibles.
16
17
18
20
Le programme s'arrte lorsqu'il rencontre une instruction Lire et ne se poursuit qu'aprs la frappe dune valeur au clavier et de la touche Entre.
21
Avant de lire une variable, il est fortement conseill dcrire des messages lcran, afin de prvenir lutilisateur de ce quil doit frapper.
22
23
24
25
Expressions et affectation :
26
27
28
29
Exemple (SiAlorsSinon)
Algorithme AffichageValeurAbsolue (version 1) Variable x : rel Dbut Ecrire " Entrez un rel : " Lire (x) Si (x < 0) alors Ecrire ("la valeur absolue de ", x, "est:",-x) Sinon Ecrire ("la valeur absolue de ", x, "est:",x) Finsi Fin
30
Exemple (SiAlors)
Algorithme AffichageValeurAbsolue (version 2) Variable x,y : rel Dbut Ecrire " Entrez un rel : " Lire (x) y x Si (x < 0) alors y -x Finsi Ecrire ("la valeur absolue de ", x, "est:",y) Fin
31
Conditions composes
Une condition compose est une condition forme de plusieurs conditions simples relies par des oprateurs logiques:
ET, OU, OU exclusif (XOR) et NON. x compris entre 2 et 6 : (x > 2) ET (x < 6). n divisible par 3 ou par 2 : (n%3 = 0) OU (n%2 = 0). deux valeurs et deux seulement sont identiques parmi a, b et c : (a = b) XOR (a = c) XOR (b = c).
Exemples :
32
Tables de vrit
C1 VRAI VRAI FAUX FAUX C2 VRAI FAUX VRAI FAUX C1 ET C2 VRAI FAUX FAUX FAUX C1 VRAI VRAI FAUX FAUX C2 VRAI FAUX VRAI FAUX C1 OU C2 VRAI VRAI VRAI FAUX
C1 VRAI FAUX
33
34
35
36
37
38
39
40
41
TANT QUE
le test est vrai rpter lnonc
42
Lalgorithme suivant permet de calculer la fonction factorielle dun nombre N saisi au clavier. Pour ce faire, il utilise la boucle Tant que.
43
44
nonc
rpter lnonc
JUSQU ce que
la condition soit vraie
faux
test
vrai
45
Cet exemple reprend lalgorithme de lexemple prcdent (calcul de la factorielle) mais en utilisant, cette fois-ci, la boucle FaireJusqu.
46
47
48
Il sagit encore une fois de calculer la fonction factorielle mais en utilisant, cette fois-ci, la boucle Pour.
49
50
Pointeurs
1 octet
Une variable est stocke sur une ou plusieurs cases en fonction de son type et de la machine. En gnral :
Entiers courts (short int): 2 octets. Entiers (int) et rels en simple prcision (float): 4 octets. Rels en double prcision (double): 8 octets.
52
Entier ladresse 103 est en fait stock dans les cases 103, 104, 105 et 106.
0 103 104 105 106 107
Espace de stockage
Le nombre de cases disponibles dpend de la taille de la mmoire (ex. 109 octets Des milliards de cases).
Pr. Mohamed NAIMI | Cours_algo_sd | ESTB 53
Exemple: Si tb1 est un tableau dentiers, alors &(tb1[i]) correspond ladresse en mmoire de tb1[i].
&(tb1[0]) &(tb1[1]) &(tb1[2])
tb1[0]
tb1[1]
54
Le nom dun tableau correspond ladresse mmoire de son premier lment. Dans lexemple prcdent, tb1 est identique &(tb1[0]).
Les adresses mmoire dun tableau sont contigus et toutes les valeurs sont stockes sur le mme nombre de cases:
55
tb1 + i correspond ladresse de llment i du tableau tb1: &(tb1[i]). &(tb1[5]) 2 correspond ladresse de tb1[5] laquelle on soustrait 2 adresses: &(tb1[3]). &(tb1[7]) &(tb1[3]) correspond au nombre dadresses entre tb1[7] et tb1[3]: 4.
56
Exemple:
57
Accs au contenu d'une variable, en passant par une autre variable, appel pointeur, contenant l'adresse de la variable. Soit A une variable contenant la valeur 10 et P un pointeur qui contient l'adresse de A.
Exemple:
58
Pointeurs (1)
Un pointeur est une variable permettant de stocker ladresse mmoire dune autre variable. Syntaxe de dclaration:
Type *pointeur; /* Type est le type des variables auxquelles permet daccder le pointeur */ int *pt_int ; /* Pointeur sur des er */ char *pt_char; /* Pointeur sur un caractre */
Exemples:
59
Pointeurs (2)
Remarques:
Les pointeurs et les noms de variables ont le mme rle: Ils donnent accs un emplacement dans la mmoire interne de l'ordinateur. Un pointeur est une variable qui peut 'pointer' sur diffrentes adresses. Le nom d'une variable reste toujours li la mme adresse.
60
Pointeurs (3)
Affectation de ladresse dune variable:
Type x; x = Valeur; Type *px; /* Le pointeur px pointe vers des variables ayant le mme type que la variable x */ px = &x; /* Le pointeur px contient maintenant ladresse de la variable x */
Remarques:
*px dsigne le contenu de l'adresse rfrence par le pointeur px. Aprs linstruction px = &x, *px contiendra Valeur.
61
Pointeurs (4)
Exemple:
main( ) { short A = 10, B = 50; short *P; P = &A; B = *P; *P = 20; }
62
Pointeurs (5)
Exemple Suite:
63
Pointeurs (6)
Exemple Fin:
64
Pointeurs (7)
Les seules valeurs quon peut affecter un pointeur sont les adresses mmoire de variables. Toutefois, la valeur numrique 0 (zro) est utilise pour indiquer qu'un pointeur ne pointe 'nulle part'. Exemple:
int *P; P = 0;
65
Pointeurs (8)
Remarques:
Si un pointeur P pointe sur une variable X, alors *P peut tre utilis partout o on peut crire X. Dans ce cas, toute modification de *P modifie la valeur de X. Aprs linstruction P = &X; , on a les quivalences suivantes: Y = *P+1 *P = *P+10 *P += 2 ++*P (*P)++ Y = X+1 X = X+10
Illustration:
X += 2 ++X X++
66
Pointeurs (9)
Exercice:
main( ) { int A = 1, B = 2, C = 3; int *P1, *P2; P1 = &A; P2 = &C; *P1 = (*P2)++; P1 = P2; P2 = &B; *P1 -= *P2; ++*P2; (*P1) *= (*P2); A = ++ (*P2)*(*P1); P1 = &A; *P2 = (*P1) /= (*P2); }
67
Pointeurs (10)
Exercice Suite:
Dterminer les valeurs des variables A, B, C, P1 et P2 aprs lexcution de chaque instruction du programme prcdent.
68
69
En C, le compilateur peut calculer automatiquement l'adresse de l'lment P+i en ajoutant P la grandeur d'une composante multiplie par i.
70
Un pointeur est une variable, donc des oprations comme P = A ou P++ sont permises. Le nom d'un tableau est une constante, donc des oprations comme A = P ou A++ sont impossibles.
Soit A un tableau d'un type quelconque et i un indice pour les composantes de A, alors:
71
Possibilit de traduire un programme crit laide du formalisme tableaux en un programme crit laide du formalisme pointeurs . Les deux programmes suivants copient les lments positifs d'un tableau T dans un deuxime tableau POS.
Exemple:
72
73
74
En C, toutes les oprations avec les pointeurs tiennent compte automatiquement du type et de la grandeur des objets points. Soient P1 et P2 deux pointeurs sur le mme type de donnes, alors l'instruction: P1 = P2; fait pointer P1 sur le mme objet que P2.
75
Si P pointe sur l'lment A[i] d'un tableau, alors: P + n pointe sur A[i+n]. P - n pointe sur A[i-n]. Si P pointe sur l'lment A[i] d'un tableau, alors: P++; /* P pointe sur A[i+1] */ P+=n; /* P pointe sur A[i+n] */ P--; /* P pointe sur A[i-1] */ P-=n; /* P pointe sur A[i-n] */
76
L'addition, la soustraction, l'incrmentation et la dcrmentation sur les pointeurs sont seulement dfinies l'intrieur d'un tableau.
Exemples:
int int P = P = A[10]; *P; A+9; /* dernier lment -> lgal */ A+10; /* dernier lment + 1 -> lgal ou illgal! A viter en gnral! */ P = A+11; /* dernier lment + 2 -> illgal */ P = A-1; /* premier lment - 1 -> illgal */
77
Soient P1 et P2 deux pointeurs qui pointent dans le mme tableau, alors: P1 - P2 est gal la diffrence entre lindice de la composante pointe par P1 et lindice de la composante pointe par P2. Le rsultat de la soustraction P1-P2 est:
Ngatif, si P1 prcde P2. 0, si P1 = P2. Positif, si P2 prcde P1.
Remarque:
La soustraction de deux pointeurs qui pointent dans le mme tableau est quivalente la soustraction des indices correspondants.
Pr. Mohamed NAIMI | Cours_algo_sd | ESTB 78
Deux pointeurs peuvent tre compars laide des oprateurs de comparaison: <, >, <=, >=, = = et !=. La comparaison de deux pointeurs qui pointent dans le mme tableau est quivalente la comparaison des indices correspondants. Si les pointeurs ne pointent pas dans le mme tableau, alors le rsultat est donn par leurs positions relatives dans la mmoire.
79
80
Les consquences de larithmtique des pointeurs se gnralisent sur les tableaux bidimensionnels. Soit M le tableau bidimensionnel suivant: int M[4][10] = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {10,11,12,13,14,15,16,17,18,19}, {20,21,22,23,24,25,26,27,28,29}, {30,31,32,33,34,35,36,37,38,39}};
Illustration:
81
Le nom du tableau M pointe sur le tableau M[0]. Lexpression (M + 1) pointe sur le tableau M[1]. Explication: Un tableau bidimensionnel est un tableau monodimensionnel dont chaque lment est un tableau monodimensionnel. Ainsi, le premier lment de la matrice M est le vecteur M[0], le deuxime lment est le vecteur M[1] et ainsi de suite. Larithmtique des pointeurs, qui respecte la dimension des objets points, conclut logiquement que: M+I dsigne l'adresse du tableau M[I].
82
Problme: Comment peut-on accder, l'aide de pointeurs, aux lments de chaque composante du tableau, cest--dire aux lments M[0][0], M[0][1],, M[3][9] ? Solution: Une solution consiste convertir la valeur de M (qui est un pointeur sur un tableau du type int) en un pointeur sur int:
int *P; P = (int *)M; /* conversion force */
Cette affectation entrane une conversion de ladresse &M[0] dans ladresse &M[0][0].
83
Solution Suite: Ensuite, grce la mmorisation ligne par ligne des tableaux bidimensionnels, nous pouvons maintenant traiter la matrice M laide du pointeur P comme sil sagit dun tableau monodimensionnel de dimension 4*10.
84
85
Lors de l'interprtation d'un tableau bidimensionnel comme tableau monodimensionnel, il faut calculer avec le nombre de colonnes indiqu dans la dclaration du tableau. Soit A la matrice suivante:
int A[3][4]; A[0][0]=1; A[0][1]=2; A[1][0]=10; A[1][1]=20;
Exemple:
86
Pour la matrice A, nous rservons de la mmoire pour 3 lignes et 4 colonnes, mais nous utilisons seulement 2 lignes et 2 colonnes. Dans la mmoire, les composantes de la matrice A sont stockes comme suit:
87
Chanes de caractres
89
90
"";
/* Chane vide */
91
Exemples:
char ch[20] = {'b', 'o', 'n', 'j', 'o', 'u', 'r', '\0'}; char ch[20] = "bonjour"; char ch[ ] = "bonjour";
92
93
94
95
96
97
Exemple (strlen):
98
99
100
strcpy(ch1,ch2);
Copie des n premiers caractres dune chane ch2 dans une chane ch1:
strncpy(ch1,ch2,n);
101
102
103
strcmp(ch1,ch2); strcmp("bonjour", "monsieur"); Ngatif. strcmp("paris2", "paris10"); Positif. strcmp("salut", "salut"); 0. strcmp("salut", "Salut"); Positif.
Exemples (strcmp):
104
Exemples (strncmp):
105
char *strchr(const char *ch, int c); strchr("bonjour",'o'); /* donne ladresse du premier 'o' */
Exemple (strchr):
char *strrchr(const char *ch, int c); strrchr("bonjour",'o'); /* donne ladresse du dernier 'o' */
Exemple (strrchr):
106
char *strstr(const char *ch, const char *sch); strstr("bonjour","jour"); sous-chane "jour" */ /* renvoie ladresse du dbut de la
Exemple (strchr):
107
Conversion de chanes
Les fonctions de conversion de chanes en types numriques se trouvent dans la bibliothque <stdlib.h>. Conversion dune chane ch en type int:
108
109
110
111
Allocation statique
Lallocation statique de la mmoire se fait lors de la dclaration de variables. Exemples:
Remarques:
113
Allocation dynamique
Lallocation dynamique de la mmoire se fait lors de lexcution du programme:
La rservation est faite au fur et mesure de lexcution du programme. Gestion optimale de la mmoire.
114
117
118
La fonction malloc( ) initialise alatoirement les cases mmoire alloues. La fonction calloc( ) initialise les cases mmoire alloues 0.
119
120
121
122
123
124
Rcapitulatif (1)
int * t = malloc(3*sizeof(int));
126
Rcapitulatif (2)
free(t);
t
*t
t = NULL;
t = realloc(4*sizeof(int));
127
Introduction (1)
Une liste est un ensemble fini dlments de mme type. Un lment dune liste est parfois appel nud. Les lments dune liste sont ordonns selon leur place (leur rang dans la liste). En C, chaque lment de la liste (sauf le dernier) correspond une structure contenant deux champs:
129
Introduction (2)
Le deuxime champ du dernier lment de la liste contient la valeur NULL. La liste est dtermine par un pointeur sur son premier lment. La liste vide est reprsente par le pointeur constant NULL. Le nombre total dlments est appel longueur de la liste. La longueur dune liste vide est 0.
130
131
132
prem est un pointeur, de type adr_comp, contenant ladresse du premier lment de la liste: adr_comp *prem; Le champ suiv du dernier lment de la liste contient la valeur NULL.
133
Passage par tous les lments qui prcdent llment auquel on souhaite accder. Laccs aux lments dun tableau est direct.
Remarque:
134
135
136
137
Lappel inserer_premier(&prem,5.0) permet dinsrer la valeur 5.0 au dbut de la liste reprsente dans lexemple prcdent.
138
139
140
Soit X une variable de type adr_comp, pointant sur llment de valeur 10.0 de lexemple prcdent. L'appel de inserer_apres(X,15.0) donnera le rsultat suivant:
141
142
143
144
147
148