sous-programmes. b.shishedjiev -sous-programmes2 les sous-programmes définition – le...
Post on 05-Apr-2015
123 Views
Preview:
TRANSCRIPT
Sous-programmes
B.Shishedjiev -Sous-programmes 2
Les sous-programmes • Définition – Le sous-programme est une partie
de programme presque indépendante qui a un nom et peut être appelée d’un autre sous-programme ou du programme principal.▪ Définition – description de l’algorithme avec
paramètres formels (muets)▪ Appel – exécution avec les paramètres effectifs
• Types▪ Procédures – ne produit pas un résultat et son appel
est une instruction▪ Fonctions – produit une valeur comme résultat, donc
son appel est une expression.
B.Shishedjiev -Sous-programmes 3
Exemple début
x=1.5, a=4n=3, p=2
q=10
y = fex(x,a,n,p)
afficher y
z = fex(x+1,1,q,n-1)
afficher z
fin
val
float fex(x,a,b,c)
val = ax2+bx+c
return val
fin
Définition
Paramètres formels
Résultat
Appel
Paramètres effectifs
B.Shishedjiev -Sous-programmes 4
Exemple en C#include <stdio.h>float fex(float, int,int,int);
void main (void) {float x = 1.5;float y,z;int a=4, n=2, q = 7, p=3;
y = fex(x,a,n,p);
printf ("y = %8.3f\n",y); z = fex(x+1,1,q,n-1);
printf ("z = %8.3f\n",z);}float fex(float x, int a,int b,int c){
float val, val1=3.4; val = a*x*x+b*x+c;return val;
}
Définition
Paramètres formels
Appel
Paramètres effectifs
Déclaration
B.Shishedjiev -Sous-programmes 5
Syntaxe• Organigramme vg1,vg2.. vgn
vl1,vl2,,,,,vln
type nom_de_la_function (p1,p2,p3,..,pn)
Algorithme
fintype-de-retour nom-de-la-fonction ( type par1, type par 2, ..., type parn){ déclaration des variables locales ; instructions avec au moins une instruction return}
• C▪ Définition
▪ Appelnom-de-la-fonction ( par1, par 2, ..., parn)
B.Shishedjiev -Sous-programmes 6
Exécution du sous-programme• La pile du
programme• Enregistrement
d’activation• Exécution d’appel
▪ Créer l’EA▪ Passer les
paramètres▪ Exécution des
instructions▪ Retour du contrôle▪ Destruction de l’EA
L’enregistrement de la fonction précédente
paramètre n
...
paramètre 1
adresse de retour
variable locale 1
...
variable locale n
Enregistrement d’activation
pile
B.Shishedjiev -Sous-programmes 7
Passage des paramètres• Passage par valeur
...
y=3 ;p(y) ;afficher(y) ;
...
programme appelant
p(x)...
x=x+1 ;
...
Sous-programme
pile
y ?
x ?
3
3
AR
4
B.Shishedjiev -Sous-programmes 8
Passage des paramètres• Passage par adresse
...
y=3 ;p(y) ;afficher(y) ;
...
programme appelant
p(x)...
x=x+1 ;
...
Sous-programme
pile
y ?
x ?
3
AR
4
B.Shishedjiev -Sous-programmes 9
Les fonctions en C• Particularités
▪ le passage des paramètres est toujours par valeur▪ on peut les appeler comme une instruction – le
résultat n’est pas utilisé.
▪ on peut avoir une fonction sans résultat. L'appel est toujours une instruction
▪ on peut avoir une fonction sans paramètres
printf ("%d",a);
void nom(paramètres)
type nom(void)
B.Shishedjiev -Sous-programmes 10
t,da,dbint pgcd (a,b)
Fonctions en C• Exemple
Faire une fonction qui trouve le pgcd de deux nombres entiers positifs. Ecrire un programme qui lit une suite de nombres et calcule le pgcd de chaque 2 nombres voisins.
oui
Initalisationda=a, db =b
t= da%db
da = dbdb = t
t0
return da
fin
non
début
Lire x1
EOF
Lire x2
d = pgcd(x1,x2)
afficher d
fin
x1 = x2
oui
non
B.Shishedjiev -Sous-programmes 11
Fonctions en C• Exemple...
#include <stdio.h>int pgcd( int ,int );void main (void) { int x1, x2,r,d; do { printf ("tapez un nombre positif:");
scanf("%d", &x1); } while (x1 <= 0); while(1){ do { printf ("tapez un nombre positif:");
r = scanf("%d", &x2); } while (x2 <= 0);
if ( r<1) break; d = pgcd(x1,x2);
printf ("Le pgcd de %d et %d est %d\n", x1,x2,d);
x1 = x2;}
}
int pgcd( int a,int b){ int da, db, t; da = a; db = b; do{
t = da % db; da = db; db = t;
}while (t!=0);return da;
}
B.Shishedjiev -Sous-programmes 12
Les paramètres résultat• En utilisant les pointeurs
on obtient l'effet de passage par adresse
#include <stdio.h>void p(int *x){ *x+=1 ;} void(main(void){ int y=3 ; p(&y) ; printf(“%d\n”,y) ;}
pile
y ?
x ?
3
AR
4
@
B.Shishedjiev -Sous-programmes 13
??
Les paramètres résultat• Exemple
Faire une fonction qui échange les valeurs de ces deux paramètres entiers.
#include <stdio.h>void echange( int * ,int * );void main (void) { int x1, x2; printf ("tapez deux nombres entiers:"); scanf("%d%d", &x1, &x2); printf ("Avant l'echange x1= %d et x2 = %d \n",x1,x2); echange(&x1,&x2); printf ("Apres l'echange x1= %d et x2 = %d \n",x1,x2);}void echange( int *a,int *b){ int t; t = *a ; *a = *b; *b = t; return ;}
pile
x1 ?
a ?
3
AR
4
@
x2
?b @
?t 3
4
3
B.Shishedjiev -Sous-programmes 14
Les paramètres résultat• Exemple – remanier le programme pgcd pour que la saisie ce fait
par une fonction.
#include <stdio.h>int pgcd( int ,int );int lirepositif(int *);void main (void) { int x1, x2,r,d; lirepositif(&x1); while(1){ r=lirepositif(&x2); if ( r<1) break; d = pgcd(x1,x2); printf ("Le pgcd de %d et %d est %d\n", x1,x2,d); x1 = x2; }}
int lirepositif(int *x) { int r; do { printf ("tapez un nombre positif:"); r = scanf("%d", x); } while (*x <= 0); return r;}int pgcd( int a,int b){ int da, db, t; da = a; db = b; do{
t = da % db; da = db; db = t;
}while (t!=0);return da;
}
B.Shishedjiev -Sous-programmes 15
Les paramètres résultat• Exemple – remanier le programme pgcd pour que la saisie ce fait
par une fonction.
#include <stdio.h>int pgcd( int ,int );int lirepositif(void);void main (void) { int x1, x2,d; x1 = lirepositif(); while(1){ x2=lirepositif(); if ( x2<0) break; d = pgcd(x1,x2); printf ("Le pgcd de %d et %d est %d\n",x1,x2,d);
x1 = x2; }}
int lirepositif(void) { int r,x; do { printf ("tapez un nombre positif:"); r = scanf("%d", &x); } while (x <= 0); if (r>0) return x;
else return -1;}int pgcd( int a,int b){ int da, db, t; da = a; db = b; do{ t = da % db; da = db; db = t; }while (t!=0); return da;}
B.Shishedjiev -Sous-programmes 16
Classes d’allocation• Zones de mémoire
▪ la zone des variables statiques.
▪ la zone des variables automatiques – la pile;
▪ la zone des variables dynamiques – le tas.
Zone des variables statiques
Enregistrement d'activation de
main()
...
pile
Enregistrement d'activation de
func1()
Enregistrement d'activation de
funcn()
tas
B.Shishedjiev -Sous-programmes 17
Les blocs• Bloc• Déclaration des variables
▪ En dehors de toute fonction
▪ En l'intérieur d'un bloc▪ Des paramètres formels
• Variables par leur portée▪ globales▪ locales – ils peuvent
masquer les globales▪ paramètres
{ déclarations instructions exécutables}
B.Shishedjiev -Sous-programmes 18
Portée des variables
int globale ; //variable globalevoid main(void){ int local ; //variable locale
global = 1 ; //on peut utiliser globale ici local = 2 ; // et locale aussi ( // début d’un bloc nouveau int plus_locale ; //c’est locale de ce bloc plus_locale=globale+locale ; }
// le bloc interne est fermé //on ne peut plus utiliser plus_locale}
portée deplus_locale
portée delocale
portée deglobale
B.Shishedjiev -Sous-programmes 19
Masquer les variablesint totale ; // nombre totale d’entréesint compteur ; //le nombre d’entréesvoid (main(void){ totale = 0 ; //variable locale compteur = 0 ; { int compteur ; //compteur locale compteur = 0 ; while (1) { if (compteur > 10) break ; totale += compteur ; ++ compteur; } } ++ compteur;}
portée dela variable globale compteur
locale variable compteur cache la variable compteur globale
B.Shishedjiev -Sous-programmes 20
L'attribut static• L'attribut static a
différente action▪ variable locale – la
portée de cette variable est le bloc où elle est définie mais sa durée de vie et toute l’exécution.
▪ variable globale
• Syntaxe
static int k ;
static type nom ;
B.Shishedjiev -Sous-programmes 21
L'attribut static• Exemple
#include <stdio.h>int main() { int counter; /* compteur d'itérations */ for (counter = 0; counter < 3; ++counter) {
int temporary = 1; /* variable temporelle*/ static int permanent = 1; /* variable permanente */ printf("Temporelle %d Permanente %d\n", temporary, permanent); ++temporary; ++permanent;
} return (0);}
B.Shishedjiev -Sous-programmes 22
L'attribut static• Exemple – une fonction qui compte les appels
#include <stdio.h>int appels(void){ static int app; app++; return app; //rend le numéro d'appel}
int main(void) { int counter; /* compteur d'itérations */ for (counter = 0; counter < 3; ++counter) {
printf ("appel No %d \n", appels()); } printf("Quel est ce nombre ? %d\n", appels()-appels()); return (0);}
B.Shishedjiev -Sous-programmes 23
Intialisation• Variables globales
▪ 0 par défaut▪ expression constante
• Variables locales▪ par défaut – valeur indéfinie▪ expression ordinaire
• Variables statiques – comme les variables globales
B.Shishedjiev -Sous-programmes 24
Intialisation• Exemple
#include <stdio.h>#define N 5int appels(int p1){ static int app = 2; // expression constante; int loc = p1 +1; // initialisation d’une variable automatique static int st1 = loc-1; // erreur – l’expression n’est pas constante static int j = N; // expression constante; app++; return app;}
int main(void) { int counter ; /* compteur d'itérations ici sa valeur n’est pas définie*/ for (counter = 0; counter < 3; ++counter) {
printf ("appel No %d \n", appels(counter)); } printf("Quel est ce nombre ? %d\n", appels(3)-appels(4)); return (0);}
B.Shishedjiev -Sous-programmes 25
RécapitulationType de variable Déclaration Portée Classe de
mémoireInitialisation
Globale En dehors de toute fonction
la partie du fichier source suivant sa déclaration
n’importe quel fichier source avec extern
Statique
Implicite – 0Explicite –
expression constante
Globale cachée En dehors de toute fonction, avec attribut static
• la partie du fichier source suivant sa déclaration
Locale « remanente »
Au début d’un bloc avec attribut static
Le bloc
Locale à une fonction
Au début d’une fonction
La fonction
Automatique
Implicite – il n’y a pas
Explicite - ExpressionLocale à un bloc Au début d’un bloc Le bloc
B.Shishedjiev -Sous-programmes 26
L'attribut const
#include <stdio.h>const int N=19;
int appels(const int M){ static int app =M; //ici on peut initialiser – M est une constante int i; for (i=0; i<M; i++) printf("*"); M++; // erreur on ne peut pas modifier une constante printf("\n"); app++; return app;}
int main(void) { N++; // erreur on ne peut pas modifier une constante printf("Quel est ce nombre ? %d\n", appels(3)-appels(5)); return (0);}
Exemple
B.Shishedjiev -Sous-programmes 27
L'attribut const• L'attribut const dans la déclaration d'un pointeur
• La différence entre #define et const
int i;int * const p = &i;
p va toujours désigner i
int i=2;int const * p = &i;
La valeur désignée par p est constante
top related