Sous Programmes - Chap5
Sous Programmes - Chap5
Sous Programmes - Chap5
Programme fonction ;
Variables x, f1, f2, f : réels
i : entier ;
Début
ecrire(‘donnez x’);
lire (x);
f1 ← 1;
pour i ← 1 à 5 faire
f1 ← f1 * x;
f2 ← 1;
pour i ← 1 à 3 faire
f2 ← f2 * x;
f ← 2*f1 + 4*f2 + 1;
ecrire (‘f(‘,x,’) = ‘, f);
fin
1 : Notions de procédure et fonction
On remarque que l’on utilise deux fois la même chose pour calculer les puissances
de x (x5 et x3) et on pourrait paramétrer cela. Il suffira d’écrire un programme qui
calcule la puissance d’un nombre et l’utiliser dans le programme précédent.
Programme puissance ;
Variables p, a : réels
i, b : entier ;
début
lire (a, b);
p ← 1;
pour i ← 1 à b faire
p ← p * a;
ecrire (a, ‘ puissance ‘,b ‘ = ‘, p);
fin
1 : Notions de procédure et fonction
Pour calculer la valeur de f1, il suffit d’utiliser ce programme en donnant à a et b les
valeurs de x et 5 à partir du premier programme (fonction). Cela signifie que les
valeurs de a et b sont fournies non plus par saisie mais par le programme
«utilisateur » c’est-à-dire fonction. Il nous faut donc réécrire le programme
puissance sous la forme:
Un sous programme est rédigé de façon telle que son exécution puisse être
commandée par un programme.
• L’exécution d’un sous programme est donc déclenchée par un programme.
• Celui-ci est appelé programme appelant (ou programme principal).
• Il fournit des données au sous-programme et récupère les résultats de ce dernier.
Remarque :Dans certains langages, le terme Programme est remplacé par le terme
function s’il s’agit d’une fonction et procedure s’il s’agit d’une procédure.
Généralement, les sous-programmes seront écrits à l’intérieur des programmes qui
les utilisent, juste après la déclaration des variables.
Sous programme en C
• En C, il n’existe qu’une seule sorte de module, nommé fonction (il
en ira de même en C++ et en Java, langage dont la syntaxe est
proche de celle de C).
• Ainsi, donc, malgré son nom, en C, la fonction pourra jouer un rôle aussi
général que la procédure ou le sous-programme des autres langages.
• Une fonction pourra ne fournir aucune valeur.
• La définition d’une fonction est la donnée du texte de son algorithme,
qu’on appelle corps de la fonction. Elle est de la forme
type nom-fonction ( type-1 arg-1,..., type-n arg-n)
Exemple:
int produit (int a, int b)
{
return(a*b);
}
Exemple de fonction C
Le programme C complet de l’exemple est :
#include<stdio.h>
float x, f1, f2, f ;
On veut écrire un programme C qui saisit une heure et affiche «Bonjour» si on est
avant 19h et «Bonsoir» sinon en utilisant deux procédures SalutationsJour et
SalutationsSoir qui affichent respectivement «Bonjour» et «Bonsoir ».
Program salutations
variable heure : entier ;
procedure SalutationsJour ;
debut
ecrire(‘Bonjour’);
Fin
1.3 : Exemple 2
procedure SalutationsSoir
debut
ecrire(‘Bonsoir’);
Fin
debut
lire(heure);
si heure < 19 alors
SalutationsJour;
sinon
SalutationsSoir;
fin
#include<stdion.h>
int heure;
%--------------------------------------------------------------
Void SalutationJour()
{
printf(‘’ Bonjour’’);
}
%--------------------------------------------------------------
%--------------------------------------------------------------
Main()
{
printf(« Donnez le nombre d’heure»);
Scanf( ’’ ‰d’’, &heure);
if (heure<19)
salutationSoir()
else
Salutation Jour()
}
1.4 : Remarque
void f1 () {
i = i+1;
}
void main(){
i=0;
f1();
printf("%d\n",i) -> 1
}
2.1. Les variables globales et les
variables locales
• Règle 2 : variables locales
Les variables déclarées dans une fonction ne peuvent être
utilisées que dans cette fonction. Ces variables sont dites
locales.
void f1 () {
int i;
i = i+1;
}
void main(){
i=0; -> ERREUR : i n'existe pas pour main
...
}
Visibilité des variables
• Règle 3 : arguments = variables locales
Les arguments d'une fonction sont des variables locales de la fonction.
void f1 (int i) {
i = i+1; /* i est une variable locale de la fonction */
}
void main(){
int j=1;
f1(j);
printf("%d\n",j)
}
• Règle 4 : Au sein d'une fonction, toutes les variables doivent avoir des noms
distincts
void f1 () {
int i;
char i; -> ERREUR : i existe déjà
i = i+1;
}
Visibilité des variables
• Règle 5 : Des variables déclarées dans des fonctions différentes
peuvent porter le même nom sans ambiguïté.
void f1 () {
int i; sous-entendu i_f1
...
}
void f2 () {
char i; sous-entendu i_f2
...
}
void main(){
int i; sous-entendu i_main
....
}
Ces 3 variables n'ont rien de commun
Visibilité des variables
• Règle 6 : Si une variable globale et une variable locale ont le même
nom, on accède à la variable locale dans la fonction où elle est déclarée
int i;
void f1 () {
int i;
i=2; /* i de f1 */
}
void main(){
i=0; /* i global */
f1();
printf (%"d\n",i); -> 0
}
Conseils
• Evitez autant que possible l'usage des variables globales =>
limitation des effets de bord indésirables
int i;
void f1 () {
...
i=i+1;
}
void main(){
i=0;
f1();
printf (%"d\n",i); -> 1
}
• Dans f1, on travaille sur i global :
• Par exemple :
si l'initiale de la variable est une majuscule -> globale : Vglob
minuscule -> locale : vloc
ou bien
le nom de chaque variable globale commence par G_ : G_variable
etc...
• Pas de confusion entre variables locales et globales.
• Mêmes règles pour les déclarations de type que pour les variabes
2.2 Les paramètres
2.2.1 Définition
Les paramètres permettent à un programme appelant de transmettre à
un sous programme des données lors de l’appel de ce dernier.
void main () {
float z,t;
z = puiss(10.7,2);
t = puiss (z, -6);
...
}
Appel des fonctions
• Un appel de fonction peut se faire comme opérande d'une expression, soit comme
paramètre d'un autre appel de fonction.
• Exemple
int maximum (int x, int y) {
return((x>y)?x,y));
}
void main () {
int v1,v2,v3,m1;
scanf("%d %d %d , &v1,&v2,&v3);
m1 = maximum(v1,v2);
m1 = maximum(m1,v3);
printf("valeur maximale %d\n", m1);
}
ou bien
m1 =maximum(v1,v2);
printf("valeur maximale %d\n", maximum(m1,v3));
ou bien
printf("valeur maximale %d\n", maximum(maximum(v1,v2),v3));
Le passage des paramètres
b 0 b 0 b 0 b 0 Inchangé
Copie
a 0 a 1
• Rappels :
opérateur & : & variable -> adresse de la variable
opérateur * : * adresse -> valeur qui se trouve à cette adresse
int i;
int * adresse_i; /* déclaration d'une adresse d'entier */
i=0;
adresse_i=&i;
printf("%d\n",i); -> 0;
...
Modification des paramètres
void f2 (int * a){ // a est l'adresse, *a est l'entier
*a=*a+1; /*t3 on incrémente le mot d'adresse a*/
}
void main(){
int b;
b=0; /*t1*/
f(&b); /*t2 &b est l'adresse de b */
printf("%d\n",b); /*t4*/ -> 1
}
b 0 728 b 0 b 1 *a b 1
void main () {
int t[50],t2[100];
...
printtab(t,50); /*affiche toutes les cases de t de 0 à 49*/
printtab(t2,100); /*affiche toutes les cases de t2 de 0 à 99*/
printtab(t+20,30);/*affiche toutes les cases de t de 20 à 49*/
printtab(t+20,10);/*affiche toutes les cases de t de 20 à 30*/
}
Passage d'un tableau à une dimension en paramètre
Conséquence :
Si un argument est de type tableau (càd une adresse), la fonction peut
modifier les cases du tableau
void main () {
int t[10]={1,2,3,4,5,6,7,8,9,10};
printtab(t,10); -> 1 2 3 4 5 6 7 8 9 10
misea0(t,10);
printtab(t,10); -> 0 0 0 0 0 0 0 0 0 0
}