CHAPITRE 6 NOTION DE PROGRAMME Comme nous l'avons vu dans les chapitres précédents, le rôle essentiel de l'ordinateur est de traiter l'information. Pour y parvenir, il faut se donner, dans un premier temps, une bonne représentation de celle-ci en mémoire et, dans un deuxième temps, une structuration convenable à des fins de manipulation. L'atteinte de ces deux objectifs conduit naturellement à la notion de programme, intimement liée au traitement automatique de l'information. Afin de mieux comprendre cette notion, nous allons étudier, dans ce chapitre, la résolution de problème et l'algorithme, le programme, les instructions et les opérateurs, les approches de programmation et, enfin, l'ingénierie des logiciels. 6.1 Résolution de problème et algorithme Résoudre un problème consiste à préciser une démarche systématique permettant, à partir d'un jeu de données disponibles, d'élaborer une réponse à la situation décrite par ce problème. Pour illustrer notre propos, considérons le problème de la détermination de la paye des employés d'une entreprise (situation décrite), qui correspond à la question suivante : Quel montant doit être versé directement à chaque employé, pour une période donnée de travail? La réponse à cette question (solution du problème) sera le résultat final de l'exécution d'une série d'étapes bien définies (démarche systématique), en considérant des données telles que le nombre d'heures de travail pour la période, le taux horaire, le taux d'imposition, entre autres. On appelle algorithme la démarche suivie pour résoudre un problème, qui consiste à obtenir un résultat certain en exécutant seulement les opérations indiquées dans la séquence d'énoncés définissant cette démarche. Nous pourrions être tentés de croire que, disposant d'un ordinateur d'une certaine puissance, nous serions capables de résoudre tous les problèmes : il n'en est rien. En effet, d'un point de vue informatique, il existe deux classes de problèmes : celle des «indécidables» et celle des «décidables». Un problème est dit indécidable lorsqu'il n'existe aucun algorithme pour le résoudre. Il s'ensuit que les seuls problèmes qu'on sait résoudre par ordinateur sont les décidables, c'est-à-dire ceux pour lesquels il existe au moins un algorithme permettant de les résoudre. Lorsqu'un problème est décidable, il est intéressant d'identifier et d'évaluer les ressources nécessaires à sa résolution. Dans un système informatique, le temps de calcul et l'espace de mémoire vive ou de masse sont considérés comme des ressources critiques dont il faut optimiser l'utilisation. Ceci nous amène à subdiviser la classe des problèmes décidables en problèmes faciles et problèmes difficiles, selon la quantité de ressources qu'ils requièrent pour leur résolution. La plupart des problèmes résolus par ordinateur sont décidables et faciles : leur algorithme de résolution fait appel à peu de ressources (temps de calcul et espace de mémoire) pour leur mise en œuvre. C'est le cas du problème de détermination de la paye des employés d'une entreprise, formulé précédemment. Cependant, on retrouve, de temps à autre, des problèmes décidables, mais difficiles; il importe de bien les identifier avant de choisir une stratégie de résolution.
CHAPITRE 6 : NOTION DE PROGRAMME 2 6.2 Programme La notion de programme est bien plus vieille que l'informatique. En effet, on utilise depuis longtemps déjà dans bien des domaines, entre autres en recherche opérationnelle, les termes programmation linéaire et non linéaire pour désigner la technique à utiliser pour résoudre certaines classes de problèmes d'optimisation, ce qui est quelque peu différent de la notion de programme en informatique. Un programme d'ordinateur, ou tout simplement programme, est une séquence d'énoncés ou d'instructions conformes à un langage de programmation donné, dont l'exécution conduit à la solution d'un problème. Ainsi, lorsqu'on veut résoudre un problème, la première démarche consiste à s'assurer de la décidabilité de ce dernier. S'il s'agit d'un problème décidable, il importe alors de se poser la question : Est-il facile ou difficile? C'est seulement après avoir obtenu la réponse à cette question que l'on pourra entreprendre la conception d un algorithme de résolution, puis le programme d'ordinateur correspondant. Considérons le problème suivant qui consiste à lire un tableau contenant un nombre N de valeurs et à les afficher à l'écran. Ce problème est évidemment décidable. De plus, il est facile, puisque sa résolution requiert peu d'espace de mémoire et peu d'opérations de base (lecture et affichage). L algorithme de résolution peut se définir par les étapes suivantes : 1. Lire la première valeur du tableau 2. Afficher la valeur lue 3. Si «le tableau n'est pas vide» Alors «lire la valeur suivante et retourner à l'étape 2» 4. Sinon «Arrêt» Notons ici que l'instruction Arrêt est nécessaire pour indiquer à la machine quand s'arrêter. Pour mieux visualiser une démarche algorithmique, on utilise souvent un organigramme (ou ordinogramme), sorte de représentation graphique de cette démarche. Un organigramme est construit à partir d'un formalisme comprenant les six éléments suivants : lndicateur de début et de fin Boîte de traitement Boîte de décision Boîte de jonction Interaction entrée-sortie Appel de procédure
CHAPITRE 6 : NOTION DE PROGRAMME 3 Voici l ordinogramme du problème précédent : Début Lire 1 re valeur Imprimer la valeur lue Tableau vide? Oui Fin Non Lire la valeur suivante FIGURE 1 Ordinogramme du problème de lecture et d impression des éléments d un tableau. 6.3 Instructions et opérateurs Quel que soit le langage informatique utilisé, un programme d'ordinateur se compose d'instructions et d'opérateurs. Il existe trois types d'instructions : Les instructions inconditionnelles indiquant une ou plusieurs opérations à effectuer à une étape donnée de la recherche de solution (exemple : Lire la première valeur du tableau). Dans cette catégorie, on retrouve les instructions d'affectation qui, comme leur nom l'indique, permettent d'affecter une valeur à une adresse de mémoire. Les instructions conditionnelles ou logiques dont le format est le suivant : Si «cela se produit» alors «fait telle chose» Sinon «fait autre chose» On les appelle aussi des sélections. Il existe deux types de sélection : la sélection simple et la sélection multiple. Contrairement à la sélection simple qui met en cause au plus deux possibilités, la sélection multiple met en jeu plus de deux possibilités. En voici un exemple sous la forme d'algorithme ou pseudo-code : Si Total supérieur à 90 alors Note = A Sinon si total supérieur à 80 alors Note = B Sinon si total supérieur à 70 alors Note = C Sinon si total supérieur à 60 alors Note = D Sinon Note = E
CHAPITRE 6 : NOTION DE PROGRAMME 4 Dans ce pseudo-code, «Note» est une variable. Une variable est un élément déclaré dont la valeur peut changer au cours de l exécution d un programme contrairement à une constante qui ne change pas de valeur. «Note = A» est appelée expression. Voici le même exemple sous la forme d'un ordinogramme. Total > 90 non oui Note = A Total > 80 non oui Note = B Total > 70 non oui Note = C Total > 60 non Note = E oui Note = D FIGURE 2 Ordinogramme du problème de traitement des notes. Les instructions itératives ou boucles, dont l'un des formats est le suivant : Tant que «telle condition n'est pas réalisée» Exécuter «telle action ou suite d'actions» Ces dernières peuvent être considérées comme une catégorie particulière d'instructions conditionnelles. Étant donné que la machine n'est dotée d'aucune intelligence, quand on veut l'instruire de la démarche à suivre pour résoudre un problème, il faut se demander à quel niveau de détails on doit se limiter. Cela dépend des données d entrée dont on dispose et de l information qu on désire obtenir à la sortie (affichage d impression). Il existe deux types d'opérations de base : Les opérations arithmétiques élémentaires telles que l'addition, la soustraction, la multiplication et la division. Les opérations logiques qui permettent d'exécuter les instructions conditionnelles impliquant des opérateurs de comparaison et des connecteurs logiques. Toute opération logique donne lieu à un résultat binaire (vrai ou faux).
CHAPITRE 6 : NOTION DE PROGRAMME 5 Les opérateurs de comparaison sont : égal à (A = B) inférieur à (A < B) inférieur ou égal à (A < B) supérieur à (A > B) supérieur ou égal à (A > B) Comme nous l'avons vu précédemment, le concept de programme est intimement lié à la notion de résolution de problème. En effet, pour résoudre un problème donné au moyen de l ordinateur, il importe préalablement de spécifier et d'analyser ce problème. Dans ce contexte, la programmation apparaît comme une étape d'un processus plus complexe débouchant sur la solution d'un problème. 6.4 Spécifications d'un problème On désigne par spécifications d'un problème un ensemble de données et de contraintes dont il faut tenir compte pour atteindre un objectif : la solution d un problème. Par exemple, si on désire préparer la paye des employés d'une entreprise, les spécifications de ce problème seront : les données nécessaires à la réalisation de cette tâche, soit, pour chaque employé, son nom, le nombre d'heures de travail fourni, le taux horaire, le nombre de personnes à sa charge; les contraintes, qui peuvent porter sur la présentation des résultats ou sur la façon de traiter les heures supplémentaires; l'objectif, qui est de pouvoir fournir dans un certain format les relevés de paye pour l'entreprise. D'une manière générale, on peut distinguer deux types de problèmes : ceux qui sont bien formalisés et qui proviennent généralement du champ des sciences exactes et appliquées, comme la résolution d'une équation du second degré ou la multiplication de deux matrices; ceux qui sont moins formalisés et qui prennent leur origine dans la gestion des organisations. C'est en se basant sur une telle classification que l'on en est venu à diviser l'informatique en informatique scientifique et en informatique de gestion. La première aborde généralement des problèmes bien formalisés, pour lesquels une démarche de spécification n'est pas toujours importante. La deuxième, par contre, aborde essentiellement des problèmes de gestion, qui sont pour la plupart peu formalisés et qui nécessitent par conséquent un effort considérable de spécification. Dans la vie d'une organisation, il peut surgir des anomalies de fonctionnement qui conduisent à l'identification de problèmes. Il convient alors de définir celles-ci dans les moindres détails, de manière à bien spécifier le problème. Car, si on ne connaît pas la nature exacte d'un problème, il sera impossible de le résoudre convenablement.
CHAPITRE 6 : NOTION DE PROGRAMME 6 6.5 Analyse d'un problème L'analyse est une étape importante dans le processus de résolution de problème. On distingue deux niveaux d'analyse : l'analyse fonctionnelle et l'analyse organique. L'analyse fonctionnelle consiste à décomposer un problème spécifié en différentes étapes qui conduisent à des résultats conformes à l'objectif fixé. Chaque étape peut constituer un module, d'où le concept de programmation modulaire. Comme son nom l'indique, l'analyse fonctionnelle est une démarche qui vise à déterminer l'enchaînement logique des modules dont l'exécution fournira la solution du problème. Elle répond à la question : Quoi faire pour résoudre le problème? L analyse organique consiste, de son coté, à organiser des données au moyen d algorithmes pour savoir comment réaliser telle tâche donnée. C est la décomposition d'un problème en ses différentes parties de manière à faciliter la réalisation d'un programme de traitement. La stratégie la plus répandue pour décomposer un problème demeure l'approche descendante. Elle consiste en la décomposition progressive du problème à traiter en sous-problèmes plus simples à résoudre. Ainsi, s'établit une hiérarchie entre les différents niveaux de sous-problèmes et le problème initial, d'où le concept de diagramme hiérarchique schématisant le processus de décomposition. 6.6 Module Selon le langage de programmation utilisé, un module peut prendre différents noms : sousprogramme, procédure ou sous-routine. Lorsque le programme fait appel à un module, il revient toujours à l instruction qui suit l appel, une fois le module exécuté. Pour programmer un ordinateur, il faut lui donner des ordres très précis afin que tout fonctionne bien. Nous parlons alors d algorithme qui est ni plus ni moins qu une série d étapes à dicter à l ordinateur, en utilisant pour ce faire un langage de programmation. Dans ce chapitre, nous utiliserons le langage C pour expliquer les différents processus de la programmation d un ordinateur. 6.7 Notion de hiérarchie Le diagramme hiérarchique, aussi appelé structurogramme, a pour but de définir les grandes étapes de l exécution d un programme. Avant même de commencer l élaboration d un diagramme hiérarchique (structurogramme), il est important de bien comprendre le problème à résoudre. Le but du structurogramme est de décomposer le problème en sous-parties et, par la suite, de placer ces sous-problèmes dans le diagramme hiérarchique, illustrant la façon dont le problème sera résolu en informatique. Le diagramme hiérarchique montre, de façon logique, les grandes étapes que le programme aura à franchir pour résoudre le problème. 6.8 Diagramme hiérarchique et algorithme Il y a une distinction à faire entre diagramme hiérarchique (structurogramme) et algorithme. Pour prendre un exemple simple, considérons l architecte qui dessine les plans d une maison; il existe un parallèle entre son travail et le diagramme hiérarchique. Le plan de l architecte décrit les
CHAPITRE 6 : NOTION DE PROGRAMME 7 grandes étapes de la construction, sans les détails. En effet, l architecte n indique pas dans son plan le nombre de matériaux à utiliser. Nous pouvons faire un lien entre algorithme et structurogramme en disant que chacune des grandes étapes indiquées dans le structurogramme aura son algorithme. En concevant un diagramme hiérarchique, il ne faut pas pousser trop loin la décomposition du problème. Le structurogramme doit présenter une vision globale du problème à résoudre et, de ce fait, il offre une possibilité intéressante pour des modifications futures. En effet, c est avec cet outil que l on peut identifier où une intervention nouvelle peut être insérée dans le programme, sans produire des effets non désirés. Le structurogramme est donc une vue d ensemble du problème avant de développer en détail chacune de ses composantes (algorithmes). Notons, et c est important, que la notion de hiérarchie doit être respectée dans la présentation du diagramme; le manque d espace sur une feuille ne doit pas être une excuse pour outrepasser cette règle. Souvent à cause de sa taille et du nombre élevé de modules qu il contient, il faut disposer le diagramme de façon transversale sur les feuilles, en mode «paysage» diraient certains. Précisons que le diagramme hiérarchique est un outil d analyse, tandis que l algorithme est un outil de programmation. Les étapes dans la construction d un programme sont donc : 1. la construction d un diagramme hiérarchique (analyse fonctionnelle); 2. l élaboration des algorithmes pour chacun des modules (analyse organique); 3. la programmation dans le langage désiré. Avant d aller plus loin, examinons la figure 3 pour nous familiariser avec certains concepts de base et le formalisme utilisé. DANS L'ANALYSE FONCTIONNELLE MODULE MODULE DÉJÀ...EXISTANT. DANS L'ANALYSE ORGANIQUE DÉBUT ET FIN CONDITION TRAITEMENT DE MODULE INTERACTION ENTRÉE-SORTIE APPEL DE PROCÉDURE FIGURE 3 Concepts de base utilisés dans la modélisation d'un problème.
CHAPITRE 6 : NOTION DE PROGRAMME 8 Le diagramme hiérarchique peut aussi être un outil intéressant dans le découpage du travail. Lors de la programmation, chaque équipe de travail se voit attribuer une ou plusieurs branches du structurogramme. 6.8.1 La construction d un diagramme hiérarchique (analyse fonctionnelle) Pour bien asseoir la notion d analyse fonctionnelle, utilisons un exemple. Supposons que l on veut concevoir un programme qui permettra d obtenir le montant à remettre à un client à partir du montant qu il verse pour payer un achat. Le programme doit d abord saisir le montant de l achat, puis le montant d argent reçu du client. Il est évident que le montant de l achat doit être égal ou inférieur au montant reçu du client. Le programme doit ensuite indiquer le nombre de pièces de monnaie à remettre au client. Par ailleurs, le programme doit pouvoir arrêter lorsque le commis (usager) entre le chiffre 0 comme montant des achats. Essayons d abord d identifier les grandes étapes du programme, sans nous préoccuper des cas d exception. 1. Saisir le montant des achats. 2. Saisir le montant reçu, versé par le client. 3. Calculer la remise, c'est-à-dire les pièces de monnaie à rendre. 4. Afficher les résultats à l écran. PROGRAMME PRINCIPAL A LIRE MONTANT DES ACHATS B LIRE MONTANT REÇU C CALCULER LES PIÈCES À DONNER D AFFICHER RÉSULTATS À L'ÉCRAN E FIGURE 4 Un exemple de diagramme hiérarchique à deux niveaux. Cette forme pourrait être correcte si nous ne voulions exécuter qu une seule fois le programme, mais tel n est pas le cas. Essayons maintenant d organiser les modules pour que l on puisse redemander le traitement, de façon à sortir du programme seulement si l usager entre «0» comme montant des achats.
CHAPITRE 6 : NOTION DE PROGRAMME 9 PROGRAMME PRINCIPAL A LIRE MONTANT DES ACHATS B TRAITER F LIRE MONTANT REÇU C CALCULER LES PIÈCES À DONNER D AFFICHER RÉSULTATS À L'ÉCRAN E LIRE MONTANT DES ACHATS B FIGURE 5 Représentation d'itérations dans un modèle hiérarchique. Dans le diagramme hiérarchique précédent, nous notons que le module B apparaît deux fois (niveaux 2 et 3). Toutefois, lors de la programmation, il ne sera développé qu une seule fois. La programmation structurée permet, en effet, la réutilisation de modules. Nous notons également l ajout d un module F, le module Traiter, qui fait appel aux modules C, D, E et B. Ce module sera appelé seulement si le montant des achats est différent de 0, mais ce n est pas à ce niveau que l on s occupe de cette situation. Il nous reste un autre problème à régler. L énoncé demande de faire une certaine validation des montants saisis par l usager et d émettre un message d erreur si le montant de l achat est supérieur au montant versé par le client. Voyons les modifications à apporter au diagramme. PROGRAMME PRINCIPAL A LIRE MONTANT DES ACHATS B TRAITER F LIRE MONTANT REÇU C VALIDER G LIRE MONTANT DES ACHATS B ERREUR CORRECT H I CALCULER LES PIÈCES À DONNER D AFFICHER RÉSULTATS À L'ÉCRAN E FIGURE 6 Diagramme hiérarchique du système de caisse après l ajout du module «Valider».
CHAPITRE 6 : NOTION DE PROGRAMME 10 Pour régler le problème, on ajoute un nouveau module G, le module Valider, qui fait appel soit au module H soit au module I, selon le résultat de la validation. Nous devons savoir qu une programmation modulaire n a pas comme but d être performante à l exécution, mais plutôt d être facilement modifiable, dans le futur, par l ajout de nouveaux modules. Il est certain que le problème à résoudre n'étant pas d une grande complexité, nous aurions pu l approcher sans modularité, soit avec un programme non modulaire. Toutefois, les modifications du programme par la suite seraient plus complexes à apporter. Par exemple, si on nous demande d ajouter les taxes sur le montant de l achat avant de faire le calcul de la remise, nous pouvons facilement apporter les modifications à notre programme pour tenir compte de cette nouvelle contrainte, comme le montre la figure 7 (ajout du module J). PROGRAMME PRINCIPAL A LIRE MONTANT DES ACHATS B TRAITER F LIRE MONTANT REÇU C VALIDER G LIRE MONTANT DES ACHATS B ERREUR CORRECT H I CALCULER LES TAXES J CALCULER LES PIÈCES À DONNER D AFFICHER RÉSULTATS À L'ÉCRAN E FIGURE 7 Diagramme du système de caisse modifié pour ajouter le traitement des taxes. Le diagramme hiérarchique offre une vision globale de notre programme. Il est intéressant de l utiliser pour identifier l endroit où il faut agir pour répondre à un nouveau problème, à une nouvelle contrainte. Mais quelles sont les étapes de développement d un diagramme hiérarchique? De façon générale, les étapes à suivre pour élaborer un diagramme hiérarchique sont les suivantes : 1. Identifier les étapes du problème, en laissant de côté les cas d exception (messages d erreur).
CHAPITRE 6 : NOTION DE PROGRAMME 11 2. Faire boucler l application, s il y a lieu. Dans l exemple précédent, cela pourrait se traduire par l exécution du programme jusqu à ce que les résultats s affichent à l écran. 3. S occuper des exceptions ou erreurs possibles. Pour terminer, il faut identifier les modules en leur attribuant des numéros, tout en prenant soin de garder une certaine représentativité de ce que le module doit faire. Cette façon de procéder permet de se retrouver plus facilement à l intérieur du diagramme hiérarchique. La figure 8 illustre une façon de faire. PROGRAMM EPRINCIPA L A1000LIR_ACH B2000_TRAITER B2100LIR_REC B2200_VALIDER A1000LIR_ACH B2210_ERR 2220_OK B2221_CALC B2222_AFFRES FIGURE 8 Identification des modules par des numéros dans un diagramme hiérarchique. 6.8.2 L élaboration des algorithmes pour chacun des modules (analyse organique) Algorithme Pour chaque module identifié dans le diagramme hiérarchique, il faudra monter un algorithme détaillé, de façon à faire ressortir tous les éléments du travail à faire dans chacun. Dans les pages qui suivent, nous vous présentons le développement algorithmique de chacun des modules du diagramme hiérarchique. Le plan de notre programme étant produit, il nous reste
CHAPITRE 6 : NOTION DE PROGRAMME 12 maintenant à élaborer le détail de chacune des fonctionnalités identifiées dans le programme. Notez que chacune des boîtes du diagramme hiérarchique a son algorithme. De plus, de façon à bien montrer le lien étroit qu'il y a entre l algorithme et le programme, nous présentons du coté droit de chaque algorithme sa traduction en langage Pascal. Module principal Le premier module à développer est le module principal. On doit s'occuper d'appeler le module responsable de lire le montant des achats et d'appeler le module Traiter jusqu'à ce que le montant des achats soit égal à zéro. Voyons maintenant la traduction de ces étapes dans notre algorithme. DÉBUT /*Traduction de cet algorithme en C*/ /*Programme principal*/ main() A1000LIR_A { A1000LIR_ACH(); while (mntach!= 0) MNTAC H <> 0? NON FIN } B2000_TRAITER(); OUI /* Fin du programme principal*/ B2000_TRAI TER FIGURE 9 Algorithme du programme principal. Le module A1000LIR_ACH Le module A1000LIR_ACH sert à écrire une question demandant le montant des achats et, par la suite, la réponse à cette question. On est donc en présence d'interactions en entrées-sorties. Lorsque la réponse à la question a été saisie, le programme remonte dans le module principal pour vérifier si le montant des achats est égal à 0. Chaque fois qu'un module est terminé, le programme revient au module qui a fait l'appel.
CHAPITRE 6 : NOTION DE PROGRAMME 13 DÉBUT /*Module pour lire le montant des achats à l écran*/ void A1000LIR_ACH() ÉCRIRE QUESTION { printf( MONTANT D\ ACHAT: n ); LIRE MNTACH scanf( %f, mntach); } FIN FIGURE 10 Algorithme du module de lecture des achats. Le module B2000_TRAITER Ce module a comme seule fonctionnalité l'appel d'autres modules. Nous pouvons le représenter comme suit : DÉBUT /*Prototype qui permet de faire exécuter les modules du troisième niveau*/ B2100LIR_REC void B2000_TRAITER() { B2100LIR_REC(); B2200_VALIDER B2200_VALIDER(); A1000LIR_ACH(); A1000LIR_ACH } FIN FIGURE 11 Algorithme du module de traitement des données.
CHAPITRE 6 : NOTION DE PROGRAMME 14 Le module B2100LIR_REC Ce module a pour but de demander le montant reçu du client et de saisir ce montant à l'écran. On remarquera que ce module ressemble grandement au module A1000LIR_ACH. DÉBUT /*Prototype pour lire le montant reçu du client*/ void B2100LIR_REC() ÉCRIRE QUESTION { LIRE MNTREC printf( MONTANT REÇU:\n ) ; scanf( %f, mntrec) ; FIN } FIGURE 12 Algorithme du module d affichage du montant reçu. Le module B2200_VALIDER Ce module sert à vérifier (après avoir saisi le montant reçu du client), si la valeur du montant reçu est plus petite que le montant des achats. Selon la réponse, nous avons un branchement soit vers le module pour envoyer un message d'erreur, soit vers le module qui s occupera de faire le traitement demandé. DÉBUT /*Prototype qui permet de valider les valeurs saisies*/ void B2200_VALIDER() { NO MNTREC<MNTACH OU if (mntrec < mntach) { B2020_OK B2210_E RR B2210_ERR() ; } FIN else B2220_OK() ; } FIGURE 13 Algorithme du module de validation des montants saisis.
CHAPITRE 6 : NOTION DE PROGRAMME 15 Le module B2220_OK Ce module s'occupe d'appeler les modules de calcul et d affichage des résultats. DÉBUT /* Module qui fait appel aux modules de calcul et d affichage du résultat*/ B2221_CALC void B2220_OK() { B2222AFF_RES B2221_CALC(); B2222AFF_RES(); FIN } FIGURE 14 Algorithme du module de traitement des calculs et de l affichage. Le module B2210_ERR Ce module s'occupe simplement de l'affichage d'un message d'erreur. DÉBUT /*Procédure qui affiche un message d erreur si l information saisie n est pas logique*/ ÉCRIRE MESSAGE void B2210_ERR() { FIN printf( La valeur des achats doit être inférieure à celle du montant reçu \n ); } FIGURE 15 Algorithme du module d affichage du message d erreur. Le module B2221_CALC C'est ce module qui sert à effectuer le plus de traitements dans cette application. En effet, il a une fonction de traitement. On s'aperçoit, à la lecture de cet algorithme, que la programmation modulaire a un avantage majeur : celui d'isoler le traitement d'une application. S il y a une différence dans le calcul, le programmeur n'a pas à chercher ailleurs dans le programme, car il sait que c'est sûrement à cet endroit que se trouve le problème.
CHAPITRE 6 : NOTION DE PROGRAMME 16 Rappelons que C1D, C25, C10, C5 et C1 sont les variables qui accumulent le nombre de pièces pour chaque achat; ces variables sont initialisées à zéro au début du programme. Remarquez, en outre, que certains traitements de ce module effectueront des boucles tant et aussi longtemps que la variable differ sera strictement supérieure ou égale à.01. DEBUT C1D=0 C25=0 C10=0 C5=0 C1=0 DIFFER=MNTREC-MNTACH FIN NON DIFFER>.001 OUI OUI DIFFER>1 NON DIFFER=DIFFER- 1 C1D=C1D+1 OUI DIFFER>=.25 NON DIFFER=DIFFER-.25 OUI DIFFER>=.10 NON C25=C25+1 DIFFER=DIFFER-.10 C10=C10+1 DIFFER>=.05 DIFFER=DIFFER-.05 C5=C5+1 DIFFER=DIFFER-.01 C1=C1+1 FIGURE 16 Algorithme du module de contrôle de la monnaie à remettre.
CHAPITRE 6 : NOTION DE PROGRAMME 17 Le module B2222AFF_RES Le but de ce module est de permettre l'impression des toutes les variables calculées dans le programme. DÉBUT /* Procédure qui affiche le résultat des calculs à l écran*/ ÉCRIRE NOMBRE $ void B2222AFF_RES() { LIRE MNTREC printf( Nombre de pièces de 1 dollar :,C1D); printf ( Nombre de pièces de 25 cents :,C25); ÉCRIRE QUESTION printf ( Nombre de pièces de 10 cents :,C10); printf ( Nombre de pièces de 5 cents :,C5); LIRE MNTREC printf ( Nombre de pièces de 1 cent :,C1); } LIRE MNTREC FIN FIGURE 17 Algorithme de la procédure d affichage des valeurs calculées. 6.9 Ingénierie des logiciels La démarche précédente nous a permis de comprendre les mécanismes de développement d un programme modulaire. Un tel processus facilite le développement des programmes et permet surtout de maximiser la réutilisation des codes. Voyons maintenant ce qu est un logiciel et ses caractéristiques. On appelle ingénierie des logiciels ou plus communément génie logiciel un ensemble de techniques qui permettent de concevoir des programmes de qualité et de gérer efficacement tout le cycle de vie des logiciels. Ce dernier regroupe l'ensemble des activités liées à la spécification, la conception, l'implantation, la mise au point et la maintenance des programmes ou logiciels. Dans le cadre de vastes projets, comme la conception d'un compilateur, de telles techniques se révèlent d'une grande utilité. 6.9.1 Caractéristiques d'un bon logiciel De nos jours, les logiciels d'une certaine taille ne sont plus conçus par un seul individu, mais plutôt par une équipe composée de programmeurs, d'analystes, de gestionnaires et de
CHAPITRE 6 : NOTION DE PROGRAMME 18 chercheurs travaillant tous en interaction. Leur souci commun est de produire de bons logiciels, ce qui nous amène à énoncer les qualités d'un bon logiciel : Satisfaire à toutes les spécifications, en accomplissant toutes les tâches auxquelles il est destiné et en donnant des résultats exacts. Être fiable et robuste, c'est-à-dire exempt d'erreurs. Utiliser efficacement les ressources de l'ordinateur en réduisant au minimum l'espace de mémoire et le temps de calcul. Pouvoir être modifié facilement pour répondre aux nouveaux besoins des utilisateurs ou pour s'adapter à un nouvel environnement. Être facile à entretenir, ce qui exige une approche de conception à la fois structurée et modulaire. Être conforme à l'échéancier et au budget fixés pour son développement. Les règles de conception des logiciels varient en fonction des applications visées. Il reste néanmoins un certain nombre de principes de base qui peuvent aider les concepteurs à développer un produit de qualité. 6.9.2 Modèles de développement Un modèle de développement sert en général à déterminer l ordre des étapes dans un projet de développement d un logiciel. Il s agit de préciser la nature du livrable et ses rapports avec la prochaine étape. De nos jours, les plus connus sont le modèle en cascade, le prototypage, le modèle en spirale, l approche en V et le modèle du cycle de vie par objets. Le modèle en cascade On doit à Royce les fondements du modèle en cascade, mais il fut popularisé par Boehm. Il repose sur une approche séquentielle du développement. Il commence par la spécification des besoins, pour ensuite déboucher sur l analyse, se poursuit par la programmation et les tests et se termine par l implantation. Étude de faisabilité Analyse des besoins Conception préliminaire Conception détaillée Codage Intégration Implantation Maintenance FIGURE 18 Le modèle en cascade.
CHAPITRE 6 : NOTION DE PROGRAMME 19 Le prototypage Le prototypage a vu le jour au cours des années 80 et s imposait comme réponse aux problèmes des développeurs qui n arrivaient pas à se retrouver dans les spécifications qui n étaient pas toujours claires. L idée était alors de construire un prototype et de le raffiner de manière itérative. On utilise soit la stratégie construire-jeter, soit la stratégie construire-raffiner. Fin Début Prototype opérationnel Spécification Amélioration du prototype Conception rapide Évaluation du prototype Construction d un prototype FIGURE 19 Le modèle par prototype. Le modèle en spirale En combinant les caractéristiques du modèle en cascade et celles du modèle par prototype, Boehm introduit en 1988 le modèle en spirale. À chaque itération, une version du logiciel est réalisée; on procède ensuite à une analyse de risques qui est sanctionnée par un «Go» pour continuer ou un «No-Go» pour indiquer la nécessité d une révision jusqu à la fin du développement. FIGURE 20 Le modèle en spirale.
CHAPITRE 6 : NOTION DE PROGRAMME 20 L approche en V Le modèle du cycle de vie en V introduit par l Association française de normalisation (AFNOR) se fonde sur la complémentarité qui existe entre les étapes de production et de tests pour adapter l idée linéaire du modèle en cascade par une validation explicite de chaque produit. Analyse Tests d installation Architecture Tests d intégration Conception Tests unitaires Mise en production FIGURE 21 Le modèle en V. Le modèle du cycle de vie par objet Dans la perspective d une approche de développement orientée objet, J. M. Nerson (1992) propose d organiser les projets de développement selon un cycle de réutilisation. L idée est de constituer, au sein des entreprises, une bibliothèque de composants réutilisables dont on pourra se servir pour monter les projets futurs. Un tel processus facilitera le développement par la diminution des coûts et la réduction des erreurs puisque les composants sont déjà testés. Besoin des utilisateurs Modèle descriptif Réseau de classes Bibliothèque de composants FIGURE 22 Le modèle du cycle de vie par objets.
CHAPITRE 6 : NOTION DE PROGRAMME 21 6.9.3 Cycle de vie des logiciels On vient de voir qu un logiciel dont le but est d'informatiser une tâche quelconque n'est pas une création spontanée : il se conçoit, se développe et se modifie. Pour illustrer la démarche, voyons un exemple. Supposons que Jacques, président directeur général d'une petite entreprise, désire informatiser sa section de comptabilité et désigne Pierre pour le faire. Pierre, le responsable du projet, et Jacques, le directeur de l'entreprise, voudraient définir ce projet d'informatisation de la section de comptabilité, en décrivant de façon plus précise les tâches qu'ils veulent informatiser. Pour ce faire, ils ont besoin du comptable en chef pour les aider à bien définir le projet. Spécification La définition d'un projet consiste à décrire globalement ce qu'on veut que l'ordinateur réalise. Elle ne requiert, en fait, aucune connaissance en informatique. Dans ce contexte, Jacques, Pierre et Luc, le comptable en chef, peuvent décider d'informatiser les comptes clients, les dépenses, les comptes à recevoir et les comptes à payer. Ils peuvent aussi désirer obtenir le bilan de l'entreprise pour l'année précédente, par exemple. Conception L étape de conception renvoie à l'analyse que nous avons définie antérieurement. Elle comprend une analyse fonctionnelle et une analyse organique. C'est à cette étape qu'on précise ce qu'on soumet à l'ordinateur comme information et ce que celui-ci doit transmettre comme résultat, ce qui amène souvent à : modifier ou limiter les tâches définies initialement; fixer un seuil d'erreur acceptable; déduire les contraintes et limites du projet; identifier les éléments dont on aurait besoin (type d'ordinateur utilisé, périphériques d'entrée-sortie nécessaires. Pour la toute petite entreprise de Jacques, un simple ordinateur muni d'un disque dur suffirait, avec comme entrée le clavier et comme sortie un écran et une imprimante. Comme limite du projet, Luc, le comptable en chef, peut accepter de ne pas demander à l'ordinateur le bilan de l'entreprise pour les dix dernières années, parce que conserver toutes les informations nécessaires prendrait trop de place sur le disque. C'est aussi pendant la période d'analyse que l'on évalue la portabilité du logiciel, c'est-à-dire la possibilité qu'il puisse être installé sur des systèmes informatiques différents, ainsi que le coût, la durée du projet et le personnel nécessaire. Le résultat à cette étape est un algorithme détaillé. L étape de conception d'un logiciel n'est jamais vraiment terminée. En effet, tout au long de son développement et pendant sa durée de vie, naissent de nouvelles contraintes ou de nouveaux besoins qui viennent modifier la structure des fonctions initialement décrites. Implantation Un ordinateur ne résout pas de problèmes, il exécute les opérations menant à la solution préalablement élaborée par une personne. Il revient donc à ceux qui sont en charge du projet de trouver la solution (algorithme) de chaque tâche que l'on veut informatiser et d'instruire la machine de la démarche à suivre : c'est ce qu'on appelle l implantation. Plus précisément, cette
CHAPITRE 6 : NOTION DE PROGRAMME 22 étape consiste à traduire dans un langage de programmation l'algorithme issu de l'analyse organique. L'implantation ne se résume pas à la seule opération de codification, souvent considérée comme fastidieuse par beaucoup de programmeurs. Il convient aussi d'ajouter aux lignes de code des commentaires appropriés et de faire des choix significatifs pour les noms des variables. C'est ce qu'on appelle la documentation d'un programme, laquelle accroît la lisibilité de ce dernier. Mise au point Une fois l'algorithme implanté, le produit devient un programme qui se doit d'être testé et validé. Le test consiste alors à s'assurer que le programme ne contient pas d'erreurs, tandis que la validation consiste à en vérifier le bon fonctionnement à partir des données soumises et des résultats obtenus. Ces deux opérations contribuent ensemble à la mise au point du logiciel. La mise au point est l étape la plus coûteuse et la plus fastidieuse du cycle de vie du logiciel. Sa réussite dépend à la fois de la qualité de l étape de conception et de l'habileté des programmeurs. De plus, elle détermine la qualité globale du logiciel, dans la mesure où elle sert à identifier et à corriger les erreurs que contient le programme en développement. Maintenance De nouvelles contraintes, des erreurs, de nouveaux besoins peuvent amener le programmeur ou quelqu'un d'autre le remplaçant dans le projet, à effectuer certains changements de la version actuelle du logiciel : c'est ce que l'on appelle la maintenance du logiciel. Pour que cette tâche soit faisable, le programme doit être lisible et compréhensible, donc bien documenté. Pour un programme bien documenté, découlant d'une approche de programmation modulaire, la maintenance est facile. 6.10 Les langages de programmation Pour qu un ordinateur puisse calculer ou exécuter des instructions, le système d exploitation le lui demande par un ensemble d instructions particulières dans un langage constitué de 0 et de 1; ce langage est appelé langage machine parce que c est le premier niveau de langage proche de la machine. Programmer en langage machine s est vite avéré être une tâche fastidieuse. On a donc vu naître successivement les langages assembleurs et, beaucoup plus tard, des langages dits de haut niveau. Pour pallier les difficultés de la programmation en langage machine, les informaticiens ont inventé une forme de langage dit symbolique qui se caractérise par l utilisation de mnémonique. Le langage correspondant est appelé langage assembleur; il représente malgré tout des difficultés quand il faut déceler les erreurs éventuelles qui s y glissent. Puis naquirent les langages de haut niveau. ces langages utilisent des mots en anglais et des opérations de base en mathématiques pour indiquer à l ordinateur quoi faire, comment et quand exécuter des tâches, ainsi que où chercher ou stocker les informations à traiter. Les langages de programmation de haut niveau sont soient interprétés ou compilés. Ils sont interprétés quand le langage traduit et exécute chaque instruction avant de passer à la suivante, ce qui permet de corriger des erreurs au fur et à mesure. Par contre, pour concevoir des programmes informatiques compilés, il faut d abord écrire le programme en utilisant un éditeur de texte. Ce dernier est appelé code source qui est traduit en langage machine par un programme appelé compilateur afin de produire un code objet. Pour produire un programme dit
CHAPITRE 6 : NOTION DE PROGRAMME 23 exécutable, le code objet est «relié» à la bibliothèque contenant, entre autres, les fonctions mathématiques ou aux fonctions du système d exploitation. Les langages de programmation de haut niveau interprétés ou compilés peuvent être soit procéduraux, déclaratifs ou orientés objets. Voyons maintenant certains langages de programmation de haut niveau. Le langage FORTRAN Le langage FORTRAN (FORmula TRANslator) a été introduit en 1957. Premier langage compilé de haut niveau, il a été spécialement conçu pour les applications scientifiques et d'ingénierie. FORTRAN répond bien aux exigences d'un langage évolué. En effet, il permet de coder de manière plus naturelle les opérations qui doivent être exécutées par l'ordinateur. Par exemple, l'addition de deux nombres peut être réalisée par l'instruction FORTRAN suivante : SOMME=X+Y Reçu avec méfiance par la communauté informatique, ce langage a rendu moins laborieuse la tâche de mise au point des programmes. Aussi, revient-il à FORTRAN le mérite d'avoir été le premier langage utilisé sur plusieurs ordinateurs de fabricants différents : c'est donc le premier langage indépendant de la machine. FORTRAN reste néanmoins un langage fort peu recommandé pour les ordinateurs personnels, car il est trop encombrant. Le langage COBOL COBOL (COmmon Business Oriented Language) est un langage structuré. Il est apparu en 1959, en réponse à des besoins de traitement de données commerciales : il est essentiellement un langage adapté aux applications de gestion. Par ailleurs, il a été conçu pour que son utilisation soit indépendante du type d'ordinateur. COBOL possède deux caractéristiques fondamentales : Il offre à ses utilisateurs la possibilité d'écrire des programmes en employant des expressions très proches des langages naturels; par exemple, l'addition de deux nombres en COBOL pourrait correspondre à l'instruction suivante : ADD X TO Y GIVING Z Il accorde à la description des données une place aussi grande que celle qui est réservée aux instructions exécutables du programme. Si le langage COBOL accuse un certain retard quant à sa concision, il se révèle par contre nettement intéressant pour ce qui est de la prise en compte des données. Cette attention portée aux données présageait déjà des préoccupations modernes : définir le mieux possible ce sur quoi va porter le traitement algorithmique. On trouve des versions de COBOL sur des ordinateurs personnels, mais on le trouve surtout de nos jours sur les minis et les gros ordinateurs. Le langage BASIC BASIC (Beginners All Purpose Symbolic Instruction Code) a été introduit en 1965. C'est un langage de haut niveau qui convient aussi bien aux applications de gestion qu'à celles d'ingénierie ou de type scientifique. Même si à l'origine il était conçu particulièrement pour les systèmes à temps partagé, il est devenu très populaire sur les ordinateurs personnels. Sur le plan syntaxique, il demeure assez proche du FORTRAN et procède du même souci de
CHAPITRE 6 : NOTION DE PROGRAMME 24 concision dans le codage des opérations. Par exemple, l'addition de deux nombres en BASIC donnerait lieu à l'instruction suivante : 250 Z = X + Y dans laquelle 250 n'est autre que le numéro de ligne où se trouve l'instruction. BASIC est un langage très populaire auprès des programmeurs débutants. Son utilisation s'est de beaucoup accrue avec l'avènement des ordinateurs personnels sur lesquels on prenait soin, dans les premiers temps, d'inclure une version. Une version, dérivée de ce langage, est grandement utilisée présentement dans le développement d'applications. On l'appelle Visual Basic, son nom étant tiré de son approche d'environnement visuel plutôt que terminal. Le langage PASCAL Le langage PASCAL, qui tient son nom de l'écrivain et philosophe français Blaise Pascal, a fait son apparition en 1972. C'est un langage évolué, conçu par N. Wirth, dont les domaines d'application sont la gestion, la science, l'ingénierie et l'éducation. Il s'est d'abord développé dans la communauté scientifique, particulièrement dans les universités. Il a été l'un des langages les plus utilisés en éducation, particulièrement sur les ordinateurs personnels. PASCAL est un langage structuré en blocs, relativement facile à apprendre et qui se prête bien à l'enseignement. Les déclarations sont faites d une manière séquentielle. Contrairement aux langages évolués des années 60, une instruction en PASCAL a un format très souple : il n'y a pas de zones prédéterminées ni de numéros de colonne pour la placer. Le langage C C est un langage de programmation déclaratif et procédural qui a fait son apparition en 1972. Ses concepteurs n'ont pas voulu, à proprement parler, en faire un langage de très haut niveau, encore moins un langage spécifique à un domaine d'application particulier. Toutefois, son absence de restrictions, alliée à sa généralité, lui donne toutes les propriétés d'un puissant langage de haut niveau. C'est donc un langage recommandé pour les applications scientifiques, d'ingénierie et de développement de logiciels. Aussi, est-il souvent utilisé pour la programmation de systèmes d'exploitation, de systèmes de base de données et de traitement de texte. Le langage C est un langage qui se prête à la programmation modulaire. C'est la raison pour laquelle les programmes écrits dans ce langage sont faciles à maintenir et transportables. Ainsi, deux programmes écrits en C, indépendamment des données soumises, fourniront des résultats identiques sur deux machines différentes. En outre, il existe des versions disponibles pour des ordinateurs de toute taille. Même si C est un langage évolué, certaines de ces instructions demeurent proches de la machine. Dans ce sens, il apparaît comme un compromis entre les langages d'assemblage et les langages de haut niveau. 6.11 La programmation orientée objet Dans cette section, nous abordons spécifiquement la programmation orientée objet parce que tous les nouveaux langages suivent cette tendance, incontournable de nos jours. La programmation structurée, très à la mode dans les années 80, a amélioré globalement la qualité des programmes, mais elle n a pas augmenté la réutilisation de ceux-ci. Depuis toujours, une part importante du coût de développement d un programme consiste à récrire des modules déjà
CHAPITRE 6 : NOTION DE PROGRAMME 25 pensés, mais non parfaitement adaptés à un problème semblable. Avec la programmation orientée objet, le développement de nouveaux programmes est maintenant axé principalement sur la réutilisation des modules déjà développés. Il est rare qu un programme n ait besoin que de données de types prédéfinis ou de structures de données homogènes de types prédéfinis. En pratique, pour mieux se coller à la réalité courante, les programmeurs ont plutôt tendance à regrouper les données au contenu d un sujet comme une personne, une facture, un rapport, etc. Pour définir des structures de données adaptées, il faut d abord définir de nouveaux types qu on appelle des types non scalaires. Mais, il ne faut pas perdre de vue que les entités effectivement traitées par un programme sont les données; les types non scalaires n existent que pour définir l organisation logique de ces données. En programmation structurée, il n y a pas de lien entre les données et les traitements. Chaque programme, tout comme chaque module d un programme, est de ce point de vue dépendant des données qu il traite. De ce fait, une même opération de tri ou de consultation dans des programmes qui ne travaillent pas sur le même type de données se fera différemment. Même si cela paraissait logique en programmation structurée, il en va tout autrement en programmation orientée objet. En pratique, la programmation orientée objet vise à rendre les deux entités, que sont les données et les modules de traitement, plus imbriquées les unes les autres, de façon à augmenter la réutilisation partielle ou globale des programmes. Alors qu en programmation structurée l objet est défini comme une donnée, en programmation orientée objet, la notion d objet est généralisée à l ensemble des données et des modules de traitement. 6.11.1 Concepts de base de la programmation orientée objet La classe À la base de la programmation orientée objet se trouve la notion de classe qui donne au programmeur la possibilité de définir de nouveaux types non scalaires à partir des types déjà définis; les membres d une classe n ont d existence que par un objet déclaré de cette classe. Une classe est une structure logique où sont définis et imbriqués des données et les modules de traitement qui les traitent, puisqu ils ne seraient d aucune utilité s ils étaient appliqués à d autres données. En programmation orientée objet, on ne met donc pas sur un même pied d égalité les modules d enchaînement des traitements et les modules de traitement des objets spécifiques. Une fonction membre d une classe s appelle une méthode. Elle connaît tous les membres donnés de cette classe. Cela diminue grandement l obligation de passer ces valeurs en paramètre. L encapsulation Le concept définissant la propriété de regrouper dans une même classe les données et les modules de traitement, qui leur sont associés, s appelle l encapsulation. Elle permet d interdire l accès extérieur direct aux données d un objet. En pratique, c est l objet lui-même qui est chargé de traiter ces données.
CHAPITRE 6 : NOTION DE PROGRAMME 26 L héritage Un autre concept de la programmation orientée objet est celui d héritage; il permet de réutiliser, lors de la définition d un objet, les propriétés d un objet déjà défini. On peut donc définir des classes dérivées à partir de classes existantes, même si certaines constituantes ne font plus notre affaire ou sont absentes. Le polymorphisme Le polymorphisme est un autre concept qui confère aux objets la propriété de pouvoir se modifier afin de s adapter à de nouveaux contextes. Avec l avènement de Windows, la communication avec le PC se fait par un «clic» de la souris. Un objet peut représenter tout ce qui est associé à un programme, autrement dit ce qui est visible et invisible et qui permet de faire exécuter des opérations par l ordinateur. Ce type de programmation consiste à définir des objets (boutons, icônes, fenêtres) et à leur attribuer des propriétés, des événements et des méthodes. Pour donner un exemple de programmation objet, considérons un bouton dans un environnement Windows, qui déclenche la lecture d un répertoire et l apparition de celui-ci à l écran. Il faudra d abord définir les propriétés du bouton (couleur, grosseur, positionnement à l écran); puis il faudra définir l événement qui déclenchera le travail à accomplir à la suite d un clic de la souris sur le bouton; enfin, on devra définir la méthode, c est-à-dire le travail que l ordinateur aura à accomplir pour répondre à cette action. 6.12 Les langages orientés objets Dans cette section, voyons les langages orientés objets Smalltalk, C++ Java et C#. Smalltalk Smalltalk ne ressemble guère aux langages de programmation conventionnels. Il permet de découper les problèmes en sous-problèmes plus facilement accessibles. Il peut être considéré comme l ancêtre des langages orientés objets. Son environnement est complet et fournit, aux programmeurs, des fenêtres, des éditeurs et des facilités de mise au point. C++ Le langage C++ a été développé dans les laboratoires de Bell AT&T à partir du langage de programmation C auquel on a ajouté des caractéristiques orientées objets. La sémantique et la syntaxe de base sont les mêmes pour les deux langages. Le C++ supporte les concepts de classe, d héritage, d encapsulation et de surcharge d opérateurs que nous avons vus précédemment. Voici une implémentation d une classe Temps. class Temps { public: Temps(); void AjusteTemps(int, int, int); void AfficheMil(); void AfficheStandard(); // Constructeur // Fixer heure, minute et seconde // Afficher l heure en format militaire // Afficher l heure en format standard
CHAPITRE 6 : NOTION DE PROGRAMME 27 private: int heure; // 0 23 int minute; // 0 59 int seconde; // 0 59 } FIGURE 23 Illustration d un programme écrit en C++. Java Le Java, qui doit son nom aux nombreuses tasses de café consommées par ses développeurs de la compagnie Sun Microsystems, est un langage orienté objet fiable, robuste et dynamique. Il n est pas lié à une plate-forme. On utilise de plus en plus Java pour créer des applications miniatures nommées «applets». Elles sont souvent utilisées dans la création de pages web pour fournir des fonctions d interactivité à ces pages. En guise d illustration, nous reproduisons un petit programme en Java qui crée un objet «Employe» et affiche les données qui le concernent. Import java.awt.* ; Import BreezyGUI.* ; Public class Employe extends GBFrame { //Initialise et place les objets dans une fenêtre TextArea outputarea = addtextarea(, 2,2,4,6); Button displaybtn = addbutton( display,3,1, 4, 1); Nous avons d abord importé les groupes java.awt et BreezyGUI pour pouvoir afficher plus tard du texte et manipuler les options graphiques. Nous avons ensuite créé une classe «Employe». Ensuite, nous avons construit la fenêtre d affichage. // Déclarations de données private Employe emp1; Ce fut ensuite la déclaration des données. // Initialisation des données et identification de la fenêtre public Employe () { int [] hres = {5,7,8, 5, 7}; emp1 = new Employe( Joe, 7.25, hres); settitle( Donnees Employe ); } Les données nécessaires pour définir un employé sont ensuite saisies. //Affichage des données à partir d un bouton public void buttonclicked(button buttonobj){ outputarea.settext()emp.tostring()); } La méthode button Clicked indique quel est le bouton activé et réalise les actions en rapport à ce bouton. Il n y a pas de structure de répétition, car Java gère automatique les boucles.
CHAPITRE 6 : NOTION DE PROGRAMME 28 // Affichage des informations public static void main(string[] args){ Frame frm = new Employe(); Frm.setSize(200, 200); Frm.setVisible(true); } } FIGURE 24 Une illustration d un programme écrit en Java. C# Le langage C# (prononcez C Sharp) est un langage orienté objet et composant conçu pour la programmation web. Il reprend la plupart des concepts de SmallTalk et de Java en les intégrant dans une syntaxe héritée du langage C++. Il a été conçu par Microsoft pour en faire le langage de prédilection de leur plate-forme.net (dot net). Microsoft souhaitait corriger les défauts du C++ tout en l étendant. Ce langage, annoncé au public au milieu de l'année 2000, peut être vu comme une réponse de Microsoft au langage Java de Sun. Le C# est un langage directement inspiré de C++, de Java et de Visual Basic. En particulier, le C#, comme le Java, possède un programme «ramasseur de miettes» (garbage collector) qui libère le programmeur de la fastidieuse tâche de la gestion de la mémoire qui alourdit le fonctionnement des programmes. Les variables sont ainsi automatiquement initialisées et les constructions qui peuvent introduire des erreurs lorsqu'elles sont mal utilisées sont défavorisées. Un programme écrit en C# sera converti d'abord en un langage intermédiaire, analogue à celui de la machine virtuelle de Java. Ce langage intermédiaire sera commun aux différents langages de la plate-forme.net composée d'autres langages de programmation tels que le VISUAL BASIC.NET, le ASP.NET (active server page), ainsi que le C++.NET. Résumé La transformation des économies et des sociétés industrielles en une économie de services axées sur le savoir et l information a modifié considérablement la portée de l informatique dans la société. Il devient un impératif d automatiser certaines tâches. Les ordinateurs sont appelés à rendre de plus en plus de services aux entreprises, mais il nous faut définir les problèmes à résoudre, les décomposer en modules et ensuite les codifier. Dans ce chapitre, nous avons présenté la notion de programme comme une séquence d instructions conformes à un langage. Après avoir défini les termes algorithme, organigramme, instructions et opérateurs, nous avons introduit les diverses approches de programmation. Ensuite, nous avons fait un survol de l'ingénierie des logiciels en mettant l'accent sur les caractéristiques d un bon logiciel, les modèles de développement et les diverses étapes qui constituent le cycle de vie de ces derniers. Pour terminer, nous avons traité des différents langages de programmation utilisés dans la codification des algorithmes. Sans avoir épuisé la matière, nous avons jeté une lumière suffisante sur la question pour susciter l intérêt vers les domaines plus spécifiques de la programmation.