|
|
|
| Auteur : Christophe Darmangeat |
1. Sous-procédures
Une application, surtout si elle est longue, a toutes les chances de devoir procéder aux mêmes traitements, ou à des traitements similaires, à plusieurs endroits de son déroulement. Par exemple, la saisie (et le contrôle qu’elle implique) d’une réponse par oui ou par non, peuvent être répétés dix fois à des moments différents de la même application. La manière la plus immédiate – et la moins habile – de résoudre la question est bien entendu de répéter le code correspondant autant de fois que nécessaire. Ainsi, la structure peut paraître simple. Mais elle est inutilement lourdingue, et en réalité, pour peu que le programme soit joufflu, il peut devenir parfaitement illisible. Il faut donc opter pour une autre stratégie, qui consiste à séparer ce traitement du corps du programme et à appeler ces instructions (qui ne figurent donc plus qu’en un seul exemplaire) à chaque fois qu’on en a besoin. Le corps du programme s’appelle alors la procédure principale, et ces groupes d’instructions auxquels on a recours s’appellent des sous-procédures. Reprenons cet exemple de question à laquelle l’utilisateur doit répondre par oui ou par non.Mauvaise Structure
...
Ecrire "Etes-vous marié ?"
Rep = ""
TantQue Rep <> " Oui" et Rep <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep
FinTantQue
Ecrire "Avez-vous des enfants ?"
Rep = ""
TantQue Rep <> "Oui" et Rep <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep
FinTantQue
Bonne Structure
Ecrire "Etes-vous marié ?"
RéponseOuiNon()
...
Ecrire "Avez-vous des enfants ?"
RéponseOuiNon()
...
Procédure RéponseOuiNon()
Rep = ""
TantQue Rep <> " Oui" et Rep <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep
FinTantQue
Fin Procédure
Dans ce cas, on se contente donc d’appeler des lignes de codes qui se répètent à l’identique. Mais on peut avoir des cas beaucoup plus rigolos.
2. Passage de paramètres
Procédure RéponseOuiNon(Msg en Caractère)
...
Il y a donc dorénavant une variable, Msg, dont on précise le type, et qui signale à le procédure qu’un paramètre peut lui être envoyé. A présent, le corps de la procédure sera :
Procédure RéponseOuiNon(Msg en Caractère)
Ecrire Msg
Rep = ""
TantQue Rep <> " Oui" et Rep <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep
FinTantQue
Fin Procédure
La procédure principale devient alors :
RéponseOuiNon("Etes-vous marié ?")
...
RéponseOuiNon("Avez-vous des enfants ?")
...
Et voilà le travail. Là, on a passé qu’un seul paramètre en entrée, mais on peut en passer autant qu’on veut ; mais ne soyons pas gourmands, il suffit d’en passer autant qu’on en a besoin.
D’un autre côté, on ne s’est guère préoccupé jusque là de récupérer le résultat de notre sous-procédure, à savoir la réponse à la question posée. Examinons maintenant ce problème.
Une première solution serait la suivante : juste après l’appel de la procédure, on teste la variable Rep :
Si Rep = "Oui" alors …
L’inconvénient de cette technique, c’est que la variable Rep doit pouvoir conserver son contenu en voyageant d’une procédure à l’autre. On en reparlera plus loin mais ce genre de variable est extrêmement gourmand en mémoire vive. Donc, si on appelle comme cela plusieurs procédures, avec plein de variables qu’on veut récupérer, cela risque de coincer sérieusement à l’exécution.
La solution la plus économique en ressources consiste à transmettre la valeur de la variable Rep de la sous-procédure vers la procédure principale, exactement comme on transmettait jusque là la valeur de la variable Msg de la procédure principale vers la sous-procédure. On introduit donc un second paramètre, mais qui est maintenant un paramètre en sortie.
La déclaration de la procédure devient :
Procédure RéponseOuiNon(Msg en Caractère, Rep en Booléen)
L’appel devient quant à lui :
RéponseOuiNon("Etes-vous marié ?", toto)
si toto = "Oui" alors
...
RéponseOuiNon("Avez-vous des enfants ?", tata)
si tata = "Oui" alors
...
Là encore, rien n’empêche une sous-procédure de renvoyer plusieurs paramètres en sortie, vous avez toute liberté !
3. Fonctions personnalisées
Cela donnera, en pseudo-code, la chose suivante :
Fonction Moy(Tab en tableau numérique, n en entier)
Som = 0
Pour i = 1 à n
Som = Som + Tab(i)
i suivant
m = som / n
Renvoyer m
Fin Fonction
On remarque au passage l’apparition d’un nouveau mot-clé : Renvoyer, qui indique quelle valeur doit prendre la fonction.
Quant au programme principal, quelques lignes pourraient en être :
Tableau Notes en Numérique
....
moyenne = Moy(notes, nbnotes)
écrire "la moyenne est : ", moyenne
...
D’une manière générale, la création de fonctions est un puissant outil de programmation, qui ne possède que des avantages : on économise des lignes de programmation, on rend le déboguage plus facile, et on ne gaspille aucune ressource de la machine. Pensez-y donc sérieusement à chaque fois que vous devez créer une application un peu joufflue (un projet, par exemple).
4. Une logique vicelarde : la programmation récursive
Fonction Fact (N en Numérique)
Si N = 1 alors
Renvoyer 1
Sinon
Renvoyer Fact(N-1)
Finsi
Fin Fonction
Vous remarquerez que le processus récursif remplace en quelque sorte la boucle, c’est-à-dire un processus itératif. Et en plus, avec tous ces nouveaux mots qui riment, vous allez pouvoir écrire de très chouettes poèmes. Vous remarquerez aussi qu’on traite le problème à l’envers : on part du nombre, et on remonte à rebours jusqu’à 1 pour pouvoir calculer la factorielle. Cet effet de rebours est caractéristique de la programmation récursive.
Pour conclure sur la récursivité, trois remarques fondamentales.
5. Variables publiques et privées
L’existence de sous-procédures, de paramètres, pose le problème de la " durée de vie " des variables, ce qu’on appelle leur portée. Pour faire simple, une variable peut être déclarée :6. Algorithmes fonctionnels
Nous vous informons que ce cours constitue une œuvre protégée en France par le Code de la Propriété Intellectuelle, et à l’étranger par les conventions internationales en vigueur sur le droit d’auteur. La violation de l’un des droits d’auteur de l’œuvre est un délit de contrefaçon. Il est donc interdit, à titre privé ou public, de reproduire, copier, vendre, revendre ou exploiter, que ce soit dans un but commercial ou purement gratuit, ce cours, sauf accord exprès et préalable de son auteur.
| RESSOURCES GRATUITES |
| |
| |
| |
| |
| |
| |
| |
| PRATIQUE / OUTILS |
| |
| |
| |
| |
| TÉLÉCHARGEMENTS |
| |
| |
| |
| INFOS SITE |
| |
| |
| |
| |
| PARTENAIRES |
| |
| |
| |
| |
| |
| |
|
|