Fonction Procedures
Fonction Procedures
Fonction Procedures
1 Introduction
Imaginer les morceaux d’algorithmes suivants :
Début
Pour i= 1 à 20
Ecrire ("************") ;
Fait ;
Fin
Début
Pour i = 1 à 15
Ecrire (‘*’) ;
Fpr
Fin
Début
Pour i =1 à 20
Ecrire (‘+’) ;
Fpr
Fin
Il est clair que l’on veut à chaque fois écrire un certain nombre de lignes de
caractères. Il est plus astucieux d’écrire une procédure qui fait ce travail et
paramétrée par le nombre de lignes et le caractère à imprimer
Procédure imprimer ( n : entier, c : caractère)
Début
Variable i : entier ;
Pour i= 1 à n faire
Ecrire (c) ;
Fpr
Fin
* Réutilisation de modules déjà existants : Il est facile d'utiliser des modules qu'on
a écrits soi-même ou qui ont été développés par d'autres personnes. Le réusing est
un concept très important en programmation. Comme votre chemise, une fonction
n’est pratiquement jamais utilisée une seule fois.
Instructions ;
Corps de la fonction
Identificateur ←résultat ;
Fin
Syntaxe algorithmique 2 En C
Fonction identificateur Type retour identificateur
(p1:type1,…,pn:type n): Type
Retour (type1 : p1,..., type n :pn)
debut {
Instructions;
Instructions ;
return valeur de retour ;
Retourner valeur de retour ; }
Fin
Dans la syntaxe 1 (de type Pascal), le nom de la fonction sera considéré comme
variable qui contiendra le résultat. Dans la syntaxe 2 le mot réservé retourner (en
C « return ») sera utilisé dans le corps de la fonction (ou routine) pour retourner
le résultat au programme principal.
Remarque : Pour des raisons évidentes, nous préférons la syntaxe 2 qui est
proche du langage C (plus souple), et plus facile à retenir lorsqu’on passe au
codage. La syntaxe 1, l’identificateur de la fonction a plusieurs rôles (déclaration
de la fonction et retourner sa valeur).
Exemple 1 : Maximum de deux valeurs de type réel
Dans cet exemple, a et b représentent les paramètres de la fonction max qui est
prête à, l’emploi, telle quelle est, la fonction max attend que le programme
principal l’appelle et lui transmets des valeurs qui seront traitées à l’intérieur de
la fonction.
Une fonction est appelée par l’algorithme principal ou une autre fonction.
1. La fonction récupère en entrée des informations plus précisément des valeurs
par l’intermédiaire de ses paramètres.
2. Les valeurs récupérées par la fonction provenant du programme appelant sont
traitées à l’intérieur de la fonction.
3. Grace à l’instruction retourner ou return on revient à l’algorithme appelant
et on reprend l’exécution des instructions qui suivent l’instruction d’appel.
4. Si le nombre de paramètres ne correspond pas, on peut palier à ce problème en
forçant dans la déclaration de la fonction une affectation de valeur par défaut
du paramètre correspondant nom_fun (type var1, ..type varn = value, …)
Exemple 3 :
1.3 Procédures
Définition de la procédure
Le mot procédure est très courant aujourd’hui. En voici une série : Procédure
d’inscription : Procédure d’installation, Procédure de sauvegarde, Procédure de
tri, Procédure de découpage, Procédure administrative, Procédure judiciaire,
Procédure de sauvetage, Procédure d’intégration, Procédure de contrôle ou
d’Analyse, ……etc. Pour signifier d’abord que l’exécution d’une procédure
nécessite du temps, mais surtout que l’autorité qui l’exécute est indépendante.
Une procédure est similaire à une fonction, mais elle ne retourne aucune valeur,
elle aura la forme suivante. En fait, s’il y des valeurs à retourner, ce sera fait à
travers les paramètres.
si a <b ;
alors min←a ;
sinon min←b ;
fin si
retourner min ;
Fin
Programme principal
b :entier )
Variable min : entier ;
Debut
si a <b ;
alors min←a ;
sinon min←b ;
fin si
Ecrire ("le minimum des 2 valeurs est :", min) ;
Fin
Programme_principal
Variables x,y ;entier ;
Debut
Ecrire ("donnez 2 valeurs :") ;
Lire (x,y) ;
minimum (x,y) ; /* appel de procédure*/
Fin
Exemple 5 : Procédure qui affiche un article, les informations sur l’article sont le
nom de l’article, le code de l’article et le prix de l’article.
Type article =structure
{
nom[20] : caractère ;
code :entier ;
prix :réel ;
}
Programme_principal
début
A : article ;
Ecrire("Entrez le code, le nom et le prix :");
Lire (A.code, A.nom, A.prix);
Afficher(A); /*appel de la procédure */
Fin.
# include<stdio.h>
void puissance(int a)
{
int p;
p=a*a;
printf (" la puissance de %d est = %d\n", a,p);
}
int main() {
int a;
Printf("saisir le nombre: ");
scanf("%d", &a);
puissance( a); /* appel de la procédure*/
return 0;
}
Remarques
Exemple 7: programme qui affiche via une fonction le contenu d’une variable
globale.
#include<stdio.h>
int C=90; /* variable globale */
int nombre (int)
main()
{
float B=10;
int nombre(int)
{
int A=20; /* variable locale dans la fonction */
printf("%d",C);
}
}
Explication :
#include<stdio.h>
int C=90; /* variable globale*/
int nombre (int)
main()
{ float B=10;
int nombre (int)
{ int A=20; /* variable locale*/
}
printf("%d",A);
}
A l’exécution, nous aurons erreur de compilation parce que la variable A est une
variable locale, elle existe seulement dans le contexte de la fonction nombre(), à
la fin de l’exécution de la fonction, elle est détruite.
Le principe consiste d'une part, à écrire le code des sous-programmes dans des
fichiers .C séparés. Ainsi dans chaque fichier .C, nous retrouvons les codes des
fonctions/procédure de même catégorie.
D'autre part, nous associons à chaque fichier .C, un fichier d'entête (Header) .H.
Ce dernier, regroupe les entêtes (prototypes) des fonctions/procédures contenues
dans le fichier .C.
#include "NomFichier.h"
//Nous utilisons les guillemets pour les inclusions externes,
les //chevrons "<...>" étant utilisés pour les inclusions
internes (stdio.h, math.h,…etc)
}
void HashChaineMD5(…)
void HashChaineMD5(…)
{
void CrypteCesar(…)
//Code de la fonction/procédure
}
void CrypteCesar(…) void DecrypteCesar(…)
{
//Code de la fonction/procédure //… autres prototypes
}
void DecrypteCesar(…)
{
//Code de la fonction/procédure
{ void EcartType(…)
//Code de la fonction/procédure
} void Moyenne(…)
void Moyenne(…)
{ void MoyenneQuadratique(…)
//Code de la fonction/procédure
}
void Variance(…)
void MoyenneQuadratique(…)
//Code de la fonction/procédure
void Variance(…)
//Code de la fonction/procédure
Ainsi, nous aurons un programme principal (main.c) allégé sur lequel nous
pouvons appeler chacune des fonctions définies dans les fichiers .H et.C.
1.7. Allocation dynamique de la mémoire
1.7.1 Introduction
Toute déclaration signifie réservation ou allocation c'est-à-dire demander au
système d’exploitation la permission d'utiliser une taille donnée de mémoire.
C’est une réservation statique. Un des principaux intérêts de l'allocation
dynamique est de permettre à un programme de réserver la place nécessaire et
suffisante au stockage des données en mémoire selon le besoin, on peut ne pas
connaitre à l’avance, l’espace à réserver, c’est pour cela que dans une réservation
statique, on réserve plus qu’il n’en faut.
Rappelons que quand on déclare une variable, le système lui donne une adresse et
lui réserve une place. Celle-ci est automatiquement supprimée de la mémoire à la
fin de l’exécution (ou lorsque la fonction est dépilée).
b) La fonction free ()
La fonction free permet de libérer la mémoire, free(place ).
#include<stdio.h>
#include<stdlib.h>
int main(int)
{
int i, N;
int *tableau_etudiant;
tableau_etudiant=NULL;//initialisation d'un tableau
dynamique
N=0;
printf(" donnez le nombre d’étudiants : ");
scanf("%d",&N);
tableau_etudiant = (int*) malloc(sizeof(int) * N);
/* 4 octets multiplié par le nombre des étudiants
introduit par
l'utilisateur (400)*/
if (tableau_etudiant == NULL)
exit(1);
for (i=0;i<N;i++)
{
printf("l’étudiant %d a pour code %d
\n",i+1,i*10);
tableau_etudiant[i]=i*10;
}
for (i=0;i<N;i++)
{
printf(" [%d] ",tableau_etudiant[i]);
}
free(tableau_etudiant); /* l’espace est libéré*/
return 0;
}
Imaginons que nous voulions représenter les prénoms des enfants dans un
enregistrement relatif à une personne. Une réservation statique réservera disons
trois chaines de caractères, ce qui suppose que pour une personne donnée, nous
ne pouvons saisir que 3 prénoms. S’il a moins, c’est de l’espace perdu, et s’il a
plus on ne peut représenter que les trois premiers. Si le seul habitant du village a
cinq enfants, et qu’on veuille bien les mettre tous dans le fichier, on peut estimer
l’espace perdu d’une telle solution.