Anis Boubaker, Ph.D. Maître d’enseignement École de Technologie Supérieure § In

Anis Boubaker, Ph.D. Maître d’enseignement École de Technologie Supérieure § Introduction à la notion de sous-programme § Déclaration et définition de sous programmes § Appel de sous-programmes § Comment découper son programme en sous-programmes § Variables et sous-programmes: variables locales, globales et visibilité. 2 3 § Nous appelons sous-programme (ou routine, ou fonction) un ensemble d’instructions effectuant un traitement spécifique identifiables par un nom distinctif; § Un sous-programme permet: § De subdiviser un problème en plusieurs sous problèmes plus simples à résoudre; § De favoriser la réutilisation du code; § De faciliter la maintenance. 4 § Jusqu’ici, nous avons déjà utilisé plusieurs sous-programmes. § Lesquels? 5 6 main main ss-prog1 ss-prog2 ss-prog3 ss-prog4 Sans sous-programmes Avec sous-programmes § Un sous-programme qui : § Identifie le plus grand de deux nombres; § Calcule le nième terme de la suite de Fibonacci § Affiche la commande d’un client à l’écran § Affiche la liste des actions possibles et demande à l’usager de choisir une action. 7 8 main saisir_produit_qte calculer_tps(sous_total) calculer_tvq(sous_total, tps) afficher_facture Répéter jusqu’à qte==0 1 2 3 4 § Tout sous-programme doit soit: § Effectuer un calcul et fournir le résultat de ce calcul; § Effectuer un traitement qui a un effet sur l’environnement (ex.: afficher quelque chose, modifier une information en mémoire, envoyer une commande à un robot, une machine distante, etc) § Ou les deux (mais idéalement pas) § Un sous-programme qui n’effectue aucune de ces tâches est inutile! 9 § Historiquement, nous avons deux types de sous-programmes : § Une fonction: Un sous programme qui effectue un calcul et qui fournit, à celui qui l’a appelé, le résultat de ce traitement. è Semblable au concept de fonction mathématique. § Une procédure: Un sous programme qui effectue un traitement qui a un effet sur l’environnement du programme mais ne fournit aucun résultat à celui qui l’a appelé. § Par abus de langage, nous utiliserons le terme fonction pour faire référence à un sous-programme (peu importe le type) 10 11 § Pour écrire une fonction, nous avons besoin de spécifier deux choses: § Le prototype de la fonction: aussi appelé signature ou en-tête de la fonction: définit l’identifiant de la fonction, ses paramètres et le type de valeur que la fonction fournit comme résultat. § Le corps de la fonction: l’ensemble d’instructions qui définissent le traitement que la fonction doit effectuer. 12 13 Prototype Corps de la fonction 14 Fonction: type_retour identifiant_fonction( [type_p1 p1, type_p2 p2, … ] ) { //Instructions } Prototype § Le prototype comprend trois informations: § L’identifiant de la fonction § Le type de données retourné par la fonction § La liste de paramètres § Identifiant de la fonction: § Le nom qui sera utilisé pour “appeler” la fonction; § On doit respecter les même exigences et conventions de nommage que les variables; § Le nom doit être représentatif du traitement effectué par la variable. 15 type_retour identifiant_fonction( [type_p1 p1, type_p2 p2, … ] ) § Type de retour: § Définit le type de valeur qui sera retournée par la fonction à l’appellant. § Une fonction ne peut retourner qu’une seule valeur. § Dans le cas d’une fonction qui ne retourne par de valeur, nous devons spécifier le type void. void afficher_resultat(int resultat) 16 type_retour identifiant_fonction( [type_p1 p1, type_p2 p2, … ] ) § Les paramètres formels: § Définit l’ensemble des valeurs requises par la fonction, pour qu’elle soit en mesure d’effectuer son traitement. § Chaque paramètre sera utilisé, dans le corps de la fonction, comme une variable. § Si la fonction ne prend aucun paramètre, on doit mettre void. int afficher_menu(void) 17 type_retour identifiant_fonction( [type_p1 p1, type_p2 p2, … ] ) § Ensemble d’instructions qui effectuent le traitement prévu par la fonction. § La fonction utilise ses paramètres comme si ils étaient des variables déclarées dans la fonction. La valeur des paramètres est fournie par l’appelant. § Chaque fonction commence par une section de déclarations de variables. § Une fonction qui doit fournir un résultat (type de retour différent de void) doit fournir le résultat à l’appelant en utilisant la fonction return. 18 19 Valeur retournée par la fonction § Lorsque rencontrée dans une fonction, l’instruction return nous fait sortir de la fonction (comme si la fonction était terminée). § Ainsi, une fonction peut avoir plusieurs points de sortie. Par exemple: 20 § À moins que ça soit justifié, il est fortement déconseillé d’avoir plus d’un point de sortie d’une fonction car ça réduit la maintenabilité du code. § Si une fonction ne retourne pas de valeurs, il est possible de sortir de la fonction avec la fonction return sans valeur de retour: return ; 21 22 § En plus des commentaires du programme, les fonctions doivent être commentées (ce sont des sous-programmes!) § Le commentaire d’une fonction doit inclure les informations suivantes: § Nom et description de la fonction § Liste de paramètres et utilité de chaque paramètre § Valeur retournée par la fonction § Les effets de bord: spécifier quels paramètres changent de valeur suite à l’appel de la fonction (nous verrons ça au prochain cours!) 23 24 § Une fonction peut être appelée (invoquée) par n’importe quelle autre fonction (incluant elle-même, nous verrons ça en fin de session). § Le main est une fonction ! § Pour appeler une fonction, il suffit de spécifier son nom et ses paramètres. Par exemple: afficher_resultat(3, 5, 60); 25 § Lors d’un appel de fonction, les arguments sont copiés et fournis à la fonction. § Les paramètres formels auront donc comme valeur la valeur des arguments. § Par exemple, int k = 10; int j; j = factorielle(k); La valeur de k est passée en paramètre (donc 10), et non la variable k. 26 § Si la fonction retourne une valeur, cette valeur peut être utilisée comme toute expression. Par exemple: fact = factorielle(10); § Le résultat retourné par la fonction (ici, 10! = 3628800) sera affecté à la variable fact. 27 28 • Un programme est déclenché par le système d’exploitation. • Le point d’entrée du programme est toujours la fonction main. • Les instruction sont exécutées dans l’ordre séquentiel standard. 29 • Lorsqu’un appel de fonction est rencontré, le traitement passe au corps de la fonction. • Les instructions du corps de la fonction sont exécutées dans l’ordre séquentiel standard. 30 • Lorsqu’on arrive à la fin du corps de la fonction OU qu’une instruction return est rencontrée, le traitement revient à la fonction qui a fait l’appel. • Le traitement revient à la fonction qui a fait l’appel sur l’instruction qui suit l’appel 31 • Lorsqu’un appel de fonction est rencontré, le traitement passe au corps de la fonction. • Les instructions du corps de la fonction sont exécutées dans l’ordre séquentiel standard. 32 • Lorsqu’on arrive à la fin du corps de la fonction OU qu’une instruction return est rencontrée, le traitement revient à la fonction qui a fait l’appel. • Le traitement revient à la fonction qui a fait l’appel sur l’instruction qui suit l’appel 33 • La fonction appelante reprend son exécution. • Lorsuque la fonction main a terminé son exécution, elle retourne une valeur au système d’exploitation. • Le système d’exploitation reprend le contrôle de la machine. § Il est temps de revoir notre composition d’un programme § Jusqu’à présent, un programme se composant exclusivement de la fonction main(), qui contenait: § Les variables § Les instructions qui composent notre programme § Note: Les directives du pré-compilateur sont ignorées ici car, techniquement, elles ne font pas partie du programme (explications en cours) 34 35 Fonction main Autres fonctions § Pour qu’une fonction puisse être appelée depuis le main(), le compilateur doit disposer de sa définition avant le main (il doit la connaitre!) § Il faudrait ainsi que toutes les fonctions soient définies avant le main(), qui deviendrait la dernière fonction du programme. § Ceci n’est pas idéal pour la lisibilité du programme. § De plus, les fonctions peuvent s’appeler mutuellement è Quelle fonction doit être définie avant? § Solution: Déclarer les prototypes des fonctions en début de programme. 36 § La déclaration consiste à mettre seulement le prototype de la fonction en haut du programme, suivi du ;. § Déclarer un prototype: § Le programmeur informe le compilateur qu’une fonction va être définie en mentionnant son nom, type de retour et paramètres. § Le programmeur s’engage de fournir, à un moment donné, le code complet de la fonction. § Par convention, nous devons toujours déclarer nos prototypes de fonction avant le main, et fournir l’implémentation de la fonction après le main. 37 38 39 Fonction main Implémentation des fonctions Déclarations des prototypes de fonctions 40 § Éviter la redondance de code: § si on effectue un même traitement plusieurs fois (ou plusieurs fois un traitement assez semblable), il est préférable de créer une fonction. § Faciliter la conception de l’algorithme: § Il est plus simple traiter plusieurs problème simples, plutôt que de traiter un seul problème complexe. § Favorise l’abstraction (boite noire): Une fois que la fonction est uploads/Sante/ inf-155-cours-3.pdf

  • 6
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Jul 30, 2021
  • Catégorie Health / Santé
  • Langue French
  • Taille du fichier 7.0810MB