C-SHARP - 4.10 Programmation Procédurale
Bonjour à tous et bienvenue dans cette nouvelle vidéo. Dans cette vidéo, nous allons aborder une notion très importante qui la programmation procédurale. Mais qu’est-ce que la programmation procédurale ? La programmation procédurale est un paradigme de programmation basé sur des appels de procédure, dis comme ça c’est peut-être un peu flou. En vérité, la programmation procédurale, c'est divisé notre programme en petites parties appelées procédures ou fonctions ou encore méthode c'est pareil. Comme son nom l’indique, la programmation procédurale contient une procédure étape par étape à exécuter. Ici, les problèmes sont décomposés en petites parties et ensuite, pour résoudre chaque partie, une ou plusieurs fonctions sont utilisées. Jusqu'à présent, tout le code qu’on a écrit dans nos exercices était dans la méthode principale, la méthode main. Cependant, ce n'est pas ainsi que nous construisons des applications de n’importe quel type, car une application en général comprend un grand nombre de fonctionnalités et écrire tout notre code dans la méthode principale est une catastrophe. Nous devons donc décomposer notre code en plusieurs méthodes ou fonctions, chacune étant responsable d’une chose. Et c'est ce que nous appelons la programmation procédurale. Nous avons également une programmation orientée objet qui est un autre paradigme de programmation basé sur des objets. Ainsi, au lieu de penser aux méthodes et aux fonctions, nous pensons aux objets. Ça sera un sujet qu’on abordera dans la 2ème partie de notre cours. Mais pour le moment, concentrons-nous sur cette notion de programmation procédurale car il faut tout d’abord comprendre et maitriser cette notion avant de passer à une autre. Autre chose, on parlait de procédure, de méthode, de fonctions, je sais que ça fait beaucoup de mots, retenez simplement que tous ces mots veulent dire exactement la même chose. En réalité, il désigne un sous-programme permettant d’effectuer des opérations répétitives. Au lieu d’écrire le code complet dans notre méthode main, on va diviser notre programme et on appellera ces fonctions que lorsqu’on en aura besoin. Mais aussi, elles permettent d'effectuer des tâches répétitives, pas besoin de réécrire le même programme à chaque fois par exemple pour calculer la moyenne de chaque classe. Ici on va créer une fonction réutilisable et s’adaptera automatiquement. On aura juste à appeler cette fonction et lui donner les valeurs qu’elle doit gérer. Donc maintenant, je vais vous montrer comment appliquer cette notion de programmation procédurale en C# avec un exemple simple et clair. Passons sur Visual Studio. Jusqu’à maintenant, si on avait envie de concevoir un programme qui va calculer la moyenne d’un élève, on va procéder comme ceci. On va créer un tableau qui contient plusieurs notes. On tape var, on lui donne le nom notes ensuite = new int crochets accolades et on va mettre plusieurs notes. 10 virgule 12 virugle 20 virgule 6 Ici petit rappel, si on met nos valeurs directement dans les accolades, on n’a pas besoin de préciser le nombre d’élément que je souhaite stocker dans mon tableau c’est fait automatiquement. En revanche, si on veut les affecter par la suite alors on doit préciser la taille de notre tableau. Maintenant qu’on a notre tableau, on sait que la moyenne, c’est la somme de toutes les notes divisées par le nombre de note total. Soit ici, on va devoir parcourir notre tableau, additionné chaque note et ensuite / par le nombre de notes qu’il y a dans notre tableau. Donc pour parcourir nos notes, je dois faire une boucle. Je fais un for int i = 0 point virugle tant que i est inférieur au nombre de notes qu’il y a dans mon tableau alors tu boucles soit notes.Length et i++ ; Ensuite dans les accolades, je dois additionner à chaque tour mes notes donc je vais créer une variable moyenne juste ici que je vais initialiser à 0. Et à chaque tour de boucle, on va additionner ce que contient moyenne avec la note se trouvant à l’index de i. On fait moyenne = moyenne + notes de i. Soit au premier tour moyenne est = à 0, i est = à zero donc on va récupérer la note se trouvant à l’index 0 soit 10 et on va l’additionner avec moyenne. 0 + 10 = 10. Donc moyenne contient maintenant 10. Ensuite au 2ème tour, i équivaut à 1 vu qu’on l’a incrémenté on récupère la note se trouvant à l’index 1, soit 12 et on l’additionne avec moyenne. Soit maintenant on à 22 ainsi de suite jusqu’à la fin du tableau. Et à la fin, moyenne équivaut à la somme de toutes les notes du tableau, soit c’est combien si vous êtes fort en calcul mental ? Haha exactement 48 c’est bien ça. Maintenant pour avoir notre moyenne, il faut divisé par le nombre de notes qu’il y a dans notre tableau. Donc ici je fais moyenne = moyenne divisé par notes.Length pour avoir le nombre de notes qu’il y a dans le tableau. Ce qui donne 48 divisé par 4 Et je fais un Console.WriteLine() pour afficher la moyenne dans les parenthèses guillemets La moyenne est de et je concatène avec la variable moyenne. Je lance le programme et vous voyez ? On a bien notre moyenne qui s’est affiché « La moyenne est de 12 » Très bien, ici le code est encore lisible, court etc… Mais le problème, imaginons maintenant notre programme doit calculer la moyenne de 28 élèves d’une classe, on va donc copier-coller ce programme 28 fois ? Impossible, notre programme sera premièrement très long, lent et on perdra énormément de temps à tout écrire. Et si notre programme doit être utilisé dans un collège entier soit le nombre d’élève peut monter très facilement à 1000 2000. Allez-vous écrire 2000 fois ce code ? Je ne pense pas. Bah voilà l’utilité de la programmation procédurale. On va prendre ce programme et on va l’adapter pour qu’il puisse gérer peu importe le nombre d’élève qu’il y a dans un collège. Donc comment faire ça en C#. Ici comme on peut le voir dans notre programme il y a 2 choses. On a les notes d’un élève et ici toute la logique permettant de calculer la moyenne et de l’afficher. Bah ce que va contenir notre fonction c'est vraiment toute la logique car elle ne change pas, la façon dont nous calculons la moyenne ne changera jamais, ce sont simplement les valeurs qui changeront. Donc on n’a pas besoin d’initialiser de tableau dans notre fonction. C’est comme pour les fonctions qu’on a vue dans les vidéos précédentes. Par exemple ToUpper ToLower, on appliquait ces méthodes sur une chaine qu'on avait créé nous mais la logique qui permet de transformer les caractères en majuscule ou en minuscule est contenu dans la méthode/fonction ToLower ou ToUpper. J’espère que c’est un peu plus clair pour vous. Pour créer une méthode/fonction en C#, vous voyez ici on a la méthode principal Main qui est notre point d’entrée. C’est une méthode un peu spéciale car elle est appelée directement lorsqu’on lance notre programme. Quand on clique sur play, on tombe directement sur cette méthode. Nous, on va créer une nouvelle méthode, et cette méthode on va devoir l’appeler depuis le programme principal. Cette méthode, on va lui donner un nom explicite qui va nous permettre de savoir ce qu'elle fait, soit ici on va l'appeler CalculerMoyenne et cette méthode, elle va retourner un résultat. Le résultat qu’elle va nous retourner c’est la moyenne d’un élève soit un int donc la valeur de retour de la méthode c’est un int. Et cette méthode prend en entrée un tableau de notes. Lorsqu’on rajoute quelque chose dans les parenthèses d’un méthode/fonction, c’est un moyen d’envoyer de l’information à notre méthode pour que la méthode puisse l’utiliser. Et dans cette méthode, on doit envoyer notre tableau de notes dans la méthode afin de calculer la moyenne. Soit la méthode va prendre ne paramètre un tableau de int donc int crochets de notes. Ok, donc à partir de là j’ai maintenant l’information et je pourrais la réutiliser dans notre logique, on pourra mettre n’importe quel tableau. Le programme s’en chargera. Et là je vais ajouter des accolades pour pouvoir rajouter le code de ma fonction. Très bien, juste pour l’instant, nous allons rajouter le mot clé static. Pour le moment, volontairement je ne vous explique pas mais ça sera un sujet qu’on abordera notamment lorsqu’on parlera plus en détail de la programmation orientée objet. Donc CalculerMoyenne qu’est-ce qu’on va faire ? Bah je vais reprendre le programme qu’on a fait juste avant, je fais un contrôle x et je le colle entre les accolades. Ok, qu’est-ce qu’on fait à l’intérieur de cette fonction. Eh bien on a une variable moyenne qui est locale à la fonction. C’est-à-dire qu’elle ne sera accessible que dans cette fonction. Et puis au cours de notre programme, elle va calculer la moyenne et la stocker. Et à la fin de notre code ici, on va supprimer notre Console.WriteLine et on va retourner notre moyenne. Jusqu’ici ce qu’on a fait se nomme la définition de notre méthode. Maintenant, on va faire ce qu’on appelle l’appel de la fonction. On va venir appeler cette fonction depuis notre programme principal. Et on va stocker la moyenne que la fonction va retourner dans une variable moyenne. La variable moyenne n'est plus déclarée dans le main parce qu'on a déplacer le code et la déclaration de cette variable est ici. J’ai le droit de recréer une variable int moyenne qui a le même nom que la variable qu’on a utilisé dans la méthode CalculerMoyenne() parce qu’ici elle est juste déclaré dans la cadre de la fonction. Ça veut dire que la méthode à sa propre variable moyenne et la méthode main, à elle aussi la sienne. Après on aura pu l’appeler autrement. Mais c’est pour ça qu’on n’a pas eu d’erreur, de conflit parce que chaque fonction à ses propres variables locales. Et après dans les parenthèses, je dois donner le tableau sur lequel je veux calculer la moyenne. Je vais en faire plusieurs afin que vous voyiez comment ça va se passer si on doit faire la moyenne de plusieurs élèves. Je vais faire var eleveUn = new int crochets accolades et je lui donne des notes Je fais un copier-coller et je change ici eleveDeux et eleveTrois et là les notes je change aussi. Maintenant que j’ai mes 3 tableaux de notes, je vais insérer un tableau dans les parenthèses de ma fonction calculermoyenne. Donc quand je retourne ma moyenne ici, je retourne la valeur. Le nom de la variable n’a aucun impact. Par exemple le résultat de ma moyenne sera 12 alors la valeur qui sera retourné sera 12. Et ici, quand je fais moyenne = CalculerMoyenne du tableau de notes que j’ai mis entre les parenthèses c’est comme si je faisais moyenne est = à 12. Je récupère la valeur du résultat. Au niveau de l’exécution du programme, comment ça va se passer ? En gros ici on va exécuter ces lignes. Et quand nous allons arriver sur la fonction, on va rentrer à l’intérieur de la fonction en haut. Et la suite de l’exécution va se faire ici, il va exécuter ligne par ligne. Et lorsqu’on va faire return il va sortir de la fonction. Ainsi il va retourner à la méthode principale et va exécuter le reste des instructions s’il y en a. Je vais juste faire un Console.WriteLine() pour afficher la moyenne et si je lance le programme, vous voyez on a bien notre moyenne du premier tableau. Et là si on veut la moyenne des autres tableaux, on peut copier-coller ces deux lignes, je change les noms des variables et je change tout simplement le paramètre de notre fonction pour quel traite un autre tableau. Et si je lance le programme, on a bien nos 3 moyennes qui sont affiché. Ici qu'est ce qui s'est passer concrètement. On a fait la première moyenne de l'élèveUn, qu'on a passé en paramètre et on l'a affiché. Ensuite on a de nouveau calculer une moyenne en changeant le paramètre de notre fonction en mettant cette fois-ci un autre élève, la fonction nous a retourné la moyenne qu’on stocke dans la variable moyenne, et enfin on l’a affiché. Pareil pour le dernier. Dernière chose, je vais vous montrer une nouvelle chose, les variables globales. Au lieu ici de récupérer un résultat. J'aurai pu me débrouiller pour partager cette variable moyenne. Entre les deux fonctions CalculerMoyenne() et main. Tout à l’heure, je vous ai dit que la variable moyenne est une variable locale à la fonction CalculerMoyenne(). Je ne peux pas y accéder ailleurs qu’à l’intérieur de cette fonction. Mais il est possible en C#, de créer une variable dit globale. Par exemple ici, si je fais static int moyenne = 0 ; Cette fois-ci, la variable est déclarée au niveau de la classe program. Elle est déclarée dans le bloc du dessus. Donc ça veut dire que cette variable est accessible à partir des deux fonctions. CalculerMoyenne et Main. Ça veut dire que je peux très bien commenter ça. Et utiliser cette variable-là dans la fonction CalculerMoyenne(). Donc ici ce qui veut dire que je n’ai pas besoin de retourné un résultat. Quand une fonction ne retourne pas de résultat, le type de sortie ne sera plus ici int mais void. Void veut dire vide et signifie que cette fonction ne retourne rien. On peut l'appeler, exécuter les instructions de la fonction mais il n'y aura pas de résultat de sortie. Et regardez, au niveau de l’appel de ma fonction, je peux très bien appeler CalculerMoyenne et dans mes Console.WriteLine appeler la variable globale moyenne. Moyenne est la variable globale qui est définie pour tout le monde. Si je relance, eh bien on a exactement le même résultat que tout à l’heure. Alors quel est l’avantage et l’inconvénient d’utiliser une variable globale. Est-ce qu’il vaut mieux de faire une variable globale parce que ça évite de retourner des résultats et ça évite de redéfinir des variables. Ou bien est-ce que c’est mieux d’avoir juste des variables locales et que la fonction retourne des résultats ? Eh bien en programmation, c’est très important d’avoir de bonnes pratiques. C’est beaucoup mieux d’avoir une fonction qui retourne un résultat. Et donc ce que je viens de vous montrer là, on va le supprimer parce que c’est moins bien. Parce que du coup, la fonction CalculerMoyenne() elle dépend de la déclaration de cette variable globale. Ici lorsqu’on duplique la fonction, on va écraser l’ancienne valeur que contient moyenne ça veut dire que si on veut réutiliser la moyenne du premier élève, on ne peut plus car c’est la dernière moyenne qui sera contenu dans moyenne. Donc la fonction est dépendante. Et en programmation c’est une notion importante, on essaye de faire au plus ce qu’on appelle réduire les dépendances. Soit si votre fonction est indépendante, son rôle c’est de calculer une moyenne et de vous retourner le résultat, eh bien c’est beaucoup mieux qu’une fonction qui vient altérer les variables de notre programme principal. Retenez bien ça. On va donc corriger tout ce qu’on a modifier, on va retourner la valeur de la moyenne qu’on a défini ici, on va supprimer la variable globale. Alors pourquoi je vous ai montrer ça, parfois c’est très pratique d’avoir une variable globale, en revanche ici ce n’est pas intéressant. Donc je vais la supprimer. Et je vais bien remettre mon return. Et là je vais remettre les déclarations de mes variables moyennes. Donc voilà, c’est tout pour cette vidéo. N’hésitez pas à la re visionner si certains points reste encore un peu flou, de toute manière on s’entrainera dessus au fur et à mesure du cours. En tout cas j’espère que cette vidéo vous a plu et que tout a été clair pour vous. Je vous dis à la prochaine dans une nouvelle vidéo