Vous êtes sur la page 1sur 78

I.U.T.

Aix Dpartement gnie informatique

Gnie logiciel
1er trimestre 2002/2003 (semaines 1 4)

Cours Ada

Polycopi tudiants pour le cours premire partie (cours 1 5B)

Daniel Feneuille

Nom tudiant :

Panorama complet des 14 premires semaines (numrotes) et, en gris, les modules o intervient le langage Ada
Voir page suivante le dtail du cours semaines 1 11 (4h/semaine). Cette grille sera commente en cours.
TD-TP 4 heures TD-TP 4 heures Ada Bases (4h) Cours Ada 2 heures Cours Ada 2 heures

14 13 12 11 10 9 8 7 6 5 4 3 2 1

TD-TP 18 Ada TD-TP 17 Ada TD-TP 15 Ada TD-TP 14 Ada TD et TP Shell TD et TP Shell TD-TP 12A Ada TD-TP 11 Ada TD-TP 10 Ada algo-ada 9 TD-TP algo-ada 6,7 TDs algo-ada 3,4 TDs TD et TP Shell diteur V.I.

TD-TP 19 Ada TD-TP 18 Ada TD-TP 16 Ada TD-TP 13B Ada TD-TP 13A Ada TD-TP 12B Ada Numriques TD Rcursivit 2 Rcursivit 1 Algorithmique numrique algo-ada 8 TD TP 6, 7, 8 algo-ada 5 TD TP 3, 4, 5 algo-ada 1 TD-TP diteur V.I.

Type Direct Type squentiel Type Perso Type Date2 Type Date1 Type Texte Type Matrice Type String Type Tableau Type Vecteur Type Discret Type Caractre algo-ada 2 TD-TP algo-ada 0 TD-TP Express
13

Interfaage 14 Numriques 2 Testabilit Numriques 1


Cours 10 suite

Access
12

Fichier 11 suite Fichier 11 Cours 10 Cours 8 Cours 6 Cours 5 Cours 3 Cours 1 (III) Cours 1 (I)

Cours 9 Cours 7 Cours 5 bis E/S Cours 4 Cours 2 Cours 1 (II)

Cours n1 Ada semaines 1 et 2 (gnralits) Objectifs des supports de cours du langage Ada :
Les cours Ada sont faits en demi promotion (suivant la planification dtaille ci-dessous). Ils sont accompagns de polycopis (dont celui-ci est le premier exemplaire). Il nest pas question, pour les tudiants, de se satisfaire des documents accompagnant le cours car, sils reprennent bien lessentiel de ce qui y sera dit, ils sont insuffisants pour bien connatre le langage. Les supports de cours nont pas, non plus, la prtention de se substituer aux bons livres dont vous trouverez la liste plus loin (notez que pour chacun des titres proposs, au moins un exemplaire est en bibliothque endroit que je vous invite connatre et frquenter). Enfin le cours est troitement en synergie ave c les TD et les TP qui sont faits pendant tout le premier trimestre (14 semaines). L encore des documents seront distribus. Nous 1 vous aiderons en faire la synthse mais rien ne sera assimil sans un travail rgulier et une pratique sur ordinateur, elle aussi, rgulire et soutenue2 ! De nombreux ajouts seront proposs (sur le CDRom) sous forme de rfrence des fichiers quils vous restera lire ! Voici le contenu du cours Ada au premier trimestre (un aperu de 11 semaines en 22 pavs de 2 heures repris du planning gnral de lenseignement de linformatique en premire anne page prcdente) : Semaine 1
Cours n1 Gnralits I Cours n1 Gnralits II

Semaine 2
Cours n1 Gnralits III Cours n2 Types scalaires et attributs

Semaine 3

Semaine 4

Semaine 5

Semaine 6

Semaine 7

Cours n3 Cours n 5 Cours n6 Les instructions Sous programmes Types Articles Complments Cours n4 Cours n5 bis Cours n7 Types tableaux E/S simples Paquetages Ada hirarchiques.

Cours n8 Cours n10 Les exceptions C.O.O et T.A.D. Cours n9 La gnricit Cours n10 (suite) objets et classes

Semaine 8

Semaine 9

Semaine 10

Semaine 11

Semaine 12

Semaine 13

Semaine 14

Cours n11 Testabilit Cours n12 . Cours n13 E/S Ada.Text_Io (Bote Noire et Type Access Les expressions Bote Claire) drcursivit Cours numrique Cours n11 Cours numrique Cours 14 1 E/S (suite) 2 Interfaage Types digits, fichiers Convergence, delta Squent. et direct troncature et dcimaux

La partie en gris nest videmment plus le cours Ada . Voir la grille gnrale affiche ou sur le CDRom Remarque : Nous avons t obligs de faire un dcoupage de la matire enseigner, comme cela est propos partout, avec des thmes comme les paquetages, la gnricit, les tableaux, les exceptions, les pointeurs, les objets etc. Mais cest bien l une des difficults du langage Ada o, en fait, tout se tient, et o il faudrait pouvoir enseigner tout en mme temps (impossible !). Cest dans cet esprit que nous serons souvent amener voquer un thme de faon un peu superficielle pour mieux y revenir plus tard : par exemple nous parlerons vite des paquetages et les sousprogrammes cours gnralits III (semaine 2) pour les tudier plus en dtail plus tard (semaines 4 et 5).

Langage (Quid ?)
Contrairement la notion de langue (o on sintresse au caractre vocal) la notion de langage fait rfrence la notion de signes. Pour le pilotage dun ordinateur par lhomme la communication passe aussi par un langage (dit artificiel) : le langage de programmation. Pour tre compris de lordinateur le pilotage utilise des instructions
1

Nous : sous ce pronom se cachent aussi les noms de quelques collgues (alias les TWO_BE_THREE de linfo) qui formeront lossature, au premier trimestre, de lencadrement et du dmarrage Ada TD et TP (ainsi quen Algorithmique). 2 avertissement que, certains ne prennent pas au srieux! Voyez les redoublants sincres pour en savoir plus! D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

3
codes : le programme. Avant dtre excutable le programme doit tre correct (comprhensible) cest lobjectif de la phase de compilation. Cette tape est en fait structure en tapes plus fines (souvent inaperues) : analyse lexicographique, analyse syntaxique et analyse smantique. Lordinateur nutilise en gnral pas le mme codage que celui du programmeur pour sexcuter (cela dpend du processeur) il est donc ncessaire de passer par une ultime phase de construction : ldition de liens (notez que ceci nest pas toujours vrai conne par exemple avec le langage Java). Pour plus de dtails voir la page 6 Langage informatique (complments lire). Ada est un des nombreux langages modernes de programmation et cest le premier que nous tudierons.

Un peu dhistoire (la petite !).


Ada vous connaissez ce nom ? Cherchez bien, la pub un peu partout ! mais oui : le loueur de voitures. Hlas vous ny tes pas ! Si je vous dis, pour vous mettre sur la voie, que cest lhistoire dune femme. Alors l, des cinphiles vont penser la belle hrone de La leon de piano mais cest encore rat ! Non il sagit de Adlade Augusta Byron, fille du coquin pote Lord Byron (seule enfant dailleurs quil reconnut !). Elle tait passionne de mathmatiques, elle travailla avec le gnial inventeur Charles Babbage dont elle fut lgrie. Elle est considre comme le premier programmeur de lhistoire. Elle mourut ruine et alcoolique. Cest pour lui rendre hommage que son diminutif Ada fut donn comme nom au langage dont vous allez dcouvrir le contenu en quelques semaines. Si vous tes intresss pour en savoir plus, dans les bons ouvrages (liste un peu plus loin) voyez les introductions 3. Elles voquent souvent un peu de lhistoire de cette femme exceptionnelle. Voir aussi les deux pages 7 et 8 (complments lire).

La vraie histoire du langage Ada (rsum succinct) :


Le concept de langage de programmation prsent rapidement ci dessus et aussi page 6 (dj signal) sera complt oralement en cours. Lhistoire du langage Ada remonte au milieu des annes 1970. Le puissant lobby amricain quest le DOD4 dcida de ne plus utiliser quun unique langage de programmation en lieu et place des centaines quutilisaient alors tous ses services. Les milieux bien informs saccordent en gnral sur le nombre de 400 500 langages ou dialectes informatiques utiliss cette poque par le DOD lui-mme ou par ses fournisseurs 5. De 1975 1983 se succdrent des runions de comit dexperts qui produisirent un cahier des charges (le gnie logiciel tait le principal objectif) suivi dun appel doffres en 19776. Les laurats proposrent en 1979 une premire bauche (avec une ossature de Pascal) puis de proche en proche on parvint la dfinition dune norme internationale en 1983 ! Norme que les vendeurs de compilateurs doivent respecter7. De ce fait les premiers compilateurs sortirent en 1985 et hlas cette inertie (de 10 ans !) entre les premires descriptions du langage et la possibilit de lutiliser joua des tours la promotion du langage. Aujourdhui, dans les milieux informatiques le langage Ada est incomparablement reconnu pour la production de logiciels trs haut niveau de fiabilit8 mais peu got des informaticiens qui programment dabord et rflchissent ensuite. En effet, cest bien contraignant Ada car il faut rflchir !9 et simposer des contraintes (en contradiction avec le narcissisme des tres humains). Mais quand on y souscrit on ne peut que sen fliciter : par exemple il nest pas rare de dcouvrir, avec ce langage, ds la phase de compilation, des erreurs conceptuelles que dhabitude avec un langage permissif on dcouvre trs tard dans la phase de tests 10. Ce plaidoyer, certainement inaccessible aux dbutants informaticiens, sera reformul et dmontr tout au long de ce premier trimestre 11. Pour conclure, un dernier regard sur le petit dernier il sagit de Ada95 (longtemps appel Ada9X) et qui est la rvision prvue du langage (ce processus prit plus de 5 annes : 90-95).
3 4

par exemple, la page 18 du livre de Rosen le DOD est dj le crateur dans les annes 1960 du langage COBOL (encore, hlas! utilis en gestion) 5 L encore voir les introductions des bons ouvrages sur Ada (pages 17-19 Rosen et 1-3 Barnes). 6 appel doffres qui sera remport par une quipe dirige par un franais! cocorico! . 7 On verra, tous ensembles, en TP, ce quest un compilateur Ada qui est dailleurs, beaucoup plus, quun traditionnel compilateur car cest tout un environnement de dveloppement de logiciels. 8 Avionique, fuse (Ariane), conduite ferroviaire (train, mtro) etc. (par exemple le tunnel sous la Manche). 9 plus prcisment il faut beaucoup spcifier cest--dire expliciter ce que lon veut faire ! 10 cest--dire trs loin dans le dveloppement du logiciel donc avec un cot prohibitif. 11 Celles et ceux qui le souhaitent pourront dores et dj parcourir le cahier pdagogique n2 propos de gnie logiciel jy explique le choix pdagogique du langage Ada ( Aix) dans les premires heures de lapprentissage en I.U.T. en option gnie informatique (car telle est notre dnomination). Voir fichier cahier2.doc. D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

4
Cette dernire version intgre et permet les objets (concept que lon verra en dtail plus tard) mais concept important et incontournable en informatique daujourdhui12. Je ferais, au cours n10 (semaine 7), une prsentation des concepts modernes de programmation avec Ada95 et la classification (les objets).

De bons livres rcents sur Ada13 :


La liste est videmment non exhaustive mais elle nomme les plus complets pour un bon dbut et .... que lon trouve en bibliothque (prt possible) ! Si vous avez quelques kopecks ce nest pas une dpense stupide. 1997 programmer en Ada 95 de BARNES. Cest lun des premiers livres (au propre comme au figur). Ce livre de lactuel prsident de Ada Europe a souvent t rdit. Louvrage est traduit en franais et prsente tout en plus de 700 pages ! Enorme mais trs trs bon bouquin ! Je ferai souvent rfrence mais la cinquime dition (attention) : cest la Bible (ou le Coran ! de tout Ada-tollah). 1995 Mthodes de gnie logiciel avec Ada 95 de Jean-Pierre Rosen. Excellente prsentation des concepts de composition (avec Ada 83) et de classification (avec Ada 95) par un excellent pdagogue. 1996 Vers Ada95 par lexemple de FAYARD et ROUSSEAU. Des exemples (sources sur Internet). 1999 Programmation squentielle avec Ada 95 de Brguet et Zaffalon aux Presses Polytechniques et Universitaires Romandes (Suisse).

Rappelons que ce cours polycopi est disponible sur le Net soit en ftp://paprika.iut.univ-aix.fr/pub/cours_ada_DF soit chez http://libre.act-europe.fe/french_courses (ACT est lorganisme permettant davoir le compilateur gnat.

Objectifs du langage Ada :


Comme on la pressenti ce langage avait une vocation dunicit et donc de langage gnraliste (il fallait pouvoir remplacer tous les langages et dialectes des annes 70 !). Mais il fallait en faire un langage durable et professionnel qui intgrait les besoins des annes venir, en clair qui permette de mettre en uvre les concepts de gnie logiciel : concevoir et raliser des composants logiciels . Bien sr, ce moment de la lecture, peu dentre vous peuvent imaginer ce que signifie ces concepts. Cest ce que nous dcouvrirons ensemble pendant tout ce cours associ des TD et TP. Les matres mots retenir sont ceux de modules, de rutilisabilit, de spcifications dclares et contrles, de portabilit, de gnricit, de scurit de fonctionnement, ... etc.

Le concept de norme (pourquoi normaliser ?) :


Un langage de programmation comme tout langage (au sens gnral du terme) sert dialoguer, se faire comprendre (non seulement par le biais dun ordinateur particulier mais aussi de tous les ordinateurs et ... de tous les programmeurs qui utilisent les ordinateurs !) Evident ? Pas sr ! Un langage est soumis des rgles de syntaxe (ah la grammaire franaise pour ne citer quelle !). Ces rgles sont dfinies et regroupes dans un manuel de rfrence14 (L.R.M. en anglais) dcrivant la norme 15. Eh bien, il existe trs peu de langages informatiques normaliss ! Et quand la norme existe, il y a peu de compilateurs (normes logiciels (hyper programmes) chargs de vrifier si un programme crit dans le langage en question respecte la norme) qui respectent eux-mmes la norme. Ceci signifie par exemple quun programme valable sur une machine A contrl avec un compilateur B peut ne plus ltre sur une machine C avec le compilateur D. Trs fcheux quand on veut faire du gnie logiciel cest--dire de la production industrielle de logiciels ! Ada est lun des rares langages qui oblige les vendeurs de compilateurs faire agrer chaque anne leur compilateur (par une srie de tests de validit). A titre danecdote sil est vrai que le langage C (le plus connu et utilis actuellement) est normalis il est aussi vrai que rien noblige les compilateurs respecter cette norme (ce qui hlas arrive trs souvent). Et lactualisation moderne du C (nomme C++) langage moderne dit objet que lon tudiera aprs Ada (au deuxime trimestre) et trs en vogue, nest normalis que depuis peu !

12

pour Ada95 lerreur de compilateurs tardifs na pas t reconduite. Il existe mme un compilateur totalement gratis free in english le GNAT copiable via internet (service ftp). Voir fichier Ada_Web.html sur le CDRom. 13 le premier vrai livre sur Ada remonte 1982 et cest : le manuel de rfrence en anglais (of course!) 14 disponible gratuitement en ftp (attention beaucoup de pages !). En ligne avec linterface AdaGide (gnat). 15 Voir, l encore, la page 6 sur la notion de langage informatique. D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

5 La notion de composants logiciels :


De plus en plus, on peut acqurir (gratuitement ou contre argent comptant) des logiciels ou des briques de logiciels quil suffit de savoir assembler entre eux (ou composer serait plus juste) de la mme faon que lon peut acheter des composants lectroniques assembler. Cette notion est assez nouvelle et promise un avenir vident mme si des informaticiens (trop conservateurs 16) accrochs leurs connaissances antrieures et pas actualises ne veulent rien savoir17. La diffusion (et linformation) de ces composants ont subi un norme coup dacclrateur grce aux services dInternet18 (ftp, Web et E -mail). Voir le fichier Ada_et_le_Web.html. Savoir construire et proposer des composants srieux et fiables est donc une des missions les plus importantes pour linformaticien de demain. Cest ce que nous emploierons montrer dans ce cours et raliser en TD-TP. Disons le tout net, Ada nous sera dune grande commodit pour cet objectif pdagogique19. Voir aussi les pages 5 9 de Barnes (5ime dition). Remarque : Ce support de cours gnralits I valable pour la premire semaine (2 heures) se prolonge (en premire semaine : 2 heures galement, et en deuxime semaine : 2 heures encore) avec les documents suivants gnralits II et III ( suivre dans cet ordre) et ci aprs : Diagrammes syntaxiques (D.S.) Les littraux numriques Ada pour illustrer les D.S. Des exemples de programmes (et de composants) comments, ils sont tirs, au dbut, des codages des algorithmes conus dans le cours dalgorithmique qui est enseign en parallle. Rsum : Planning des cours Ada Langage de programmation (notion) Historique de Ada Bibliographie Norme et gnie logiciel Composants logiciels Pages supplmentaires ( lire) : pour le CDRom commencez par la page Intro_cdrom.html Texte : Langage (page 6), Byron.et babbage. (pages 7 et 8) Fichier Ada_et_le_Web.html (2 pages) sur le CDRom. Fichier Cahier2.doc (8 pages) sur le CDRom. Fichier AdaFranceTAILL.doc sur le CDRom.

Daprs CABU !

16 17

et pas forcment vieux comme on le croit gnralement ! ah mon cher ! Le COBOL, il ny a que cela de vrai. Ils y reviendront, vous verrez, au COBOL ! 18 le rseau des rseaux. On verra cela plus tard (de faon thorique et pratique). Osez surfer! 19 cest lAda-tollah qui parle (oppos aux C-rtiques)! D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

6
LANGAGE (informatique) : complments de cours La notion de langage ne doit pas tre confondue avec celle de langue. Avec la notion de langue on doit tenir compte de la double articulation monme-phonme ainsi que du caractre vocal. Le concept de langage est, lui par contre, li la notion de signe. Un langage est communment dfini comme un systme de signes propre favoriser la communication entre les tres, quels quils soient, mmes les tres inanims qui ont peut-tre une me ! Mais on sgare du sujet ! Trois lments fondamentaux interviennent dans la dtermination du signe : le signifiant, le signifi et le rfrent. Do les trois aspects dun langage : laspect syntaxique (champ des signifiants), laspect smantique (relations signifiants-signifis) et laspect pragmatique, qui a pour mission de rendre compte du contexte de la communication (champ des rfrents). Les langages artificiels et, en particulier, les langages informatiques qui interviennent dans la communication homme-machine nchappent pas ces distinctions. Ainsi, en programmation, des considrations syntaxiques permettent de dfinir en quoi un programme est correct, cest--dire conforme aux rgles dcriture imposes par la norme du langage (mais ceci ne signifie pas quil marche ). La syntaxe est ici lensemble des rgles permettant la formation dexpressions valides partir dun alphabet (vocabulaire) qui varie selon le langage. Ces rgles sont elles-mmes prsentes dans un autre langage ! On parle alors de mtalangage ! Il doit tre le plus clair et le moins ambigu possible (voir ci dessous). On distingue trois grandes techniques dcriture de rgles : avec des phrases trs verbeuses expliquant en langage naturel (utilises avec le langage COBOL par exemple), des dessins ou diagrammes syntaxiques (souvent utiliss dans les manuels de PASCAL et parfois en Ada) et enfin la notation BNF (trs prise dans les descriptions des langages tels Algol, C, Ada etc.). En Ada, la grammaire du manuel de rfrence utilise la notation BNF (voir par exemple dans laide de lIDE AdaGide Language RM annexe P). Dans les langages de programmation, laspect smantique est mis en vidence par les performances du programme, cest--dire par les relations qui existent entre un ensemble dinstructions syntaxiquement correctes et un ensemble de rsultats. Laspect pragmatique des langages utiliss en informatique, moins net, trouve quant lui son illustration dans des situations spcifiques : relations programmes-machines, programmescompilateurs, machines virtuelles, etc. La communication entre lhomme et la machine ne se fait pas directement, mais par tapes qui impliquent les interventions successives du programmeur et de programmes spcifiques (assembleur, macro-assembleur, compilateur, diteur de liens, chargeur, interprteur) ; elle fait donc intervenir plusieurs niveaux de langages. Lintervention du programmeur, lors de la rdaction du programme, a pour objet de traduire le langage naturel (criture de spcifications) en un langage appel langage source, qui peut tre : un langage symbolique (langage assembleur ), le plus loign du langage naturel, caractris par une syntaxe rigide ; un macro-langage, utilisant des macro-instructions , aux fonctions plus complexes que celles des instructions proprement dites ; un langage volu (Fortran, Algol, APL, Cobol, Basic, PL/1, Pascal, Ada, Eiffel, C, C++, Prolog, Java, etc.), orient vers les problmes et dont la structure est la plus proche de celle du langage naturel, avec une syntaxe et un alphabet qui est une extension de lalphabet naturel (lettres, signes, chiffres, expressions). Tous ces langages forment ce quon appelle la classe des langages de programmation. On note aussi les langages dits de requte qui servent la consultation de bases de donnes (SQL, par exemple, pour Structure Query Language) et en micro-informatique, des langages spcifiques, comme Dbase (en baisse !), pour utiliser des gestionnaires de donnes et Microsoft Access plus rcent (membre de la trilogie Bilou). Enfin les langages dits de commande (SHELL) permettent un oprateur dchanger des informations et des rponses avec la machine permettant entre autres de piloter les diffrentes tapes de cration dun programme excutable voques plus haut. Ces commandes sont aujourdhui plus agrables utiliser grce aux interfaces graphiques (WINDOWS) utilisant en harmonie icnes, textes, clavier, cran et souris. En parallle aussi les langages de script qui fleurissent de faon continue (Javascript, PHP, Python etc.). Texte crit partir dune page modifie et complte de lencyclopdie Universalis . Pour en savoir plus il faut lire les deux pages suivantes sur Ada Byron et Babbage. Pour connatre lhistoire de linformatique voir le texte Une trs brve histoire de linformatique ladresse Internet http://dept-info.labri.u-bordeaux.fr/~dicky/HistInfo.html

D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

7
La petite histoire de linformatique I.

La famille de Ada Byron.


Et quelle famille mes aeux ! Les Byron descendaient dune trs ancienne famille de Vikings. Le premier baron Byron, gnral fidle aux Stuart, fut anobli en 1643. Le grand-pre de Ada tait un inconscient prodigue et sduisant. Il avait enlev, fait divorcer et pous en premires noces la marquise de Carmarthen, qui mourut en 1784, laissant une fille, Augusta Byron (1783-1851)21. Il se remarie avec Catherine Gordon de Gight, descendante de lancienne famille royale dcosse. Ce mariage fut malheureux ; les deux poux se sparrent bientt laissant un fils George Gordon Byron22. George navait pas trois ans quand son pre mourut, laissant sa femme dans la misre. Lenfant fut lev par cette mre instable, passionne, irascible, la tendresse tyrannique. Il tait pied-bot, soit de naissance, soit la suite dune paralysie infantile, et cette infirmit laffligea profondment. Ils vcurent dans la gne. A la mort de son grand-oncle, George devint le sixime baron Byron et hrita dun pauvre domaine. Le chteau, ancien prieur normand, tait en ruine, et les terres lourdement hypothques. Envoy en pension, George Byron y acquit une solide connaissance du latin et du grec, une grande admiration pour les lettres classiques et la littrature anglaise du XVIIIe sicle, un got trs vif pour la posie et lhistoire. Il y frquenta des jeunes gens de son rang et, malgr son infirmit, pratiqua avec brio la natation, le cricket et lquitation. Son dveloppement affectif fut prcoce ; len croire, il navait que dix ans lorsquil tomba amoureux dune cousine ! Plus tard il sprit plus srieusement dune autre cousine un peu plus ge que lui. Plus tard, aprs avoir pris possession de son sige la Chambre des lords (13 mars 1809), Byron, sembarque pour son grand tour , le 2 juillet 1809. Au plus fort des guerres napoloniennes, il traverse le Portugal et lEspagne, gagne Malte, puis lAlbanie. En dcembre 1809, il arrive Athnes do il repart pour lAsie Mineure. Le 3 mai 1810, il traverse, tel Landre, lHellespont la nage, exploit sportif dont il est trs fier. Il sjourne deux mois Constantinople et regagne Athnes en juillet 1810. Il demeure en Grce jusquen avril 1811, voyageant, tudiant, crivant. son retour Londres, en juin 1811, il rapportait plusieurs pomes et une sorte de journal de voyage quil publia. La russite, jointe la jeunesse du pote, la beaut, llgance et lexcentricit du dandy, fit de lui lidole du jour et lui valut de faciles succs fminins. Certaines admiratrices passionnes simposrent littralement lui ; matresses indiscrtes, elles entranrent le jeune auteur la mode, gris de sa popularit, dans des intrigues compliques. Ces aventures, colportes, embellies, avilies par des confidences indiscrtes, contriburent crer le personnage lgendaire de bourreau des curs. Au cours de lt 1813, il revit, aprs plusieurs annes de sparation, sa demisur Augusta. Quils aient eu lun pour lautre une affection passionne et trangement fraternelle ne fait pas de doute, comme en tmoignent ses pomes Augusta. Y eut-il inceste ? Medora Leigh, fille dAugusta, ne le 15 avril 1814, en fut-elle le fruit ? Il ny eut lpoque que de trs vagues soupons. La destruction de ses Mmoires, aussitt aprs sa mort, donna penser quil y avait un scandale cacher. En dpit du succs de ses ouvrages et en raison dun train de vie ruineux, le noble lord tait pauvre et cribl de dettes. Il chercha redorer son blason en pousant une riche hritire. Le mariage eut lieu le 2janvier 1815. Cette union fut malencontreuse : la msentente conjugale fut aggrave par des difficults financires. Le 10 dcembre 1815, lady Byron donnait naissance une fille, Ada23 ; le 15 janvier 1816, lord Byron chassait sa femme de chez lui. Puis, regrettant cette dcision, il tenta vainement dobtenir une rconciliation. Il dut se rsigner en avril signer un acte de sparation qui le dpouillait de sa femme, de sa fille 24 et de la moiti de sa fortune. Laffaire fit scandale, et la socit qui lavait adul se dchana contre lui.... On arrte l le rcit de cette saga ! On pourra en savoir plus dans les bonnes encyclopdies notamment Universalis dont sont extraites (aprs puration ou arrangements) ces quelques lignes. On verra avec le papier sur Babbage (page suivante) que la vie de notre Ada nest pas mal non plus ! Tel pre telle fille! Pour en savoir plus voir : http://www.mo5.com/MHI/HISTOIRE/lovelace.htm et aussi en http://www.mo5.com/MHI/HISTOIRE/babbage.htm .
20

20 21

On se contentera du grand-pre et du pre et cest dj pas si mal ! Elle ce nest pas notre Ada mais sa demi-tante comme on va le voir. 22 Pre de notre Ada ! Le plus connu de cette illustre famille (dandy et pote romantique). Coquin ses heures ! 23 L oui, cette Ada cest la ntre : Augusta Adelade Byron future comtesse de Lovelace. 24 La seule enfant, donc, quil reconnut. D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

8
La petite histoire de linformatique II.

Babbage : le gnial inventeur et Ada : la premire programmeuse.


Babbage, Charles (1791-1871), mathmaticien et thoricien de l'organisation industrielle britannique, dont les travaux sur la mcanisation du calcul sont l'origine de l'ordinateur. Dans les annes 1820, Babbage conut une machine diffrences, un appareil mcanique pouvant effectuer des calculs mathmatiques simples avec une prcision pouvant atteindre 31 chiffres. Cependant, il dut abandonner sa construction pour des raisons financires. Dans les annes 1830, il conut une machine analytique cartes perfores, afin d'effectuer des calculs plus compliqus, mais nouveau cet instrument ne vit jamais le jour. Cette rflexion sur la mcanisation du calcul annonce l'informatique. l'origine des thories de l'organisation industrielle, Babbage est l'auteur d'un Trait de l'conomie des machines et des manufactures (1832) analysant la production automatique des manufactures et la division du travail, ce qui lui vaut d'tre souvent cit par Karl Marx dans le Capital. Ses Reflections on the Decline of Science (1830) reprennent la

Extraits de lencyclopdie Encarta (texte ci-contre et image). tradition leibnizienne du calcul infinitsimal.

Fils de banquier, Charles Babbage ne suivra pas la carrire de son pre. Il tait trop pris de mathmatique, dastronomie et de mcanique. En 1814 il pouse une jeune brunette qui lui fera une grande famille 25. A lorigine cest pour palier les erreurs de calcul qui encombrent les tables astronomiques et nautiques quil envisage une machine calculer plus proche dune machine dhorlogerie que des calculateurs actuels ! Aprs de nombreux checs et beaucoup dargent perdu il fait une pause en 182726. Un an plus tard il reprend ses travaux. Malgr des aides ministrielles la machine diffrence sera condamne. Loin de se rsigner il prpare sur papier cette fois une autre machine plus simple la machine analytique . Elle ne fut jamais construite de son vivant mais sera fabriqu vers 1990 ! et expos au Science Museum de Londres. Les 300 plans et 7000 pages de notes laisss par Babbage permettent de classer cette machine parmi les anctres de lordinateur actuel. En 1833 il rencontre une brune aux yeux de jais : Ada Byron comtesse de Lovelace . Passionne de mathmatiques, elle aussi, elle devint sa collaboratrice27 en 1842. Elle crivit pour la machine analytique fictive de Babbage des programmes 28 destins tourner ds que lengin serait oprationnel. Il ne vit jamais le jour de son vivant comme on la signal. Des informaticiens samusrent, plus tard, coder les algorithmes de la comtesse29. Ils tournrent parait-il du premier coup ! On voit ainsi en Ada Lovelace le premier programmeur de lhistoire ! La comtesse mourut 36 ans dun cancer aprs stre beaucoup adonn lalcool, lopium et aux courses de chevaux ! Babbage lui mourut bien plus tard 80 ans en 1871. Pour la petite histoire soixante quinze ans plus tard (en 1946), en Pennsylvanie, naissait le premier vrai calculateur lectronique baptis ENIAC (Electronic Numerical Integrator And Calculator). Pour en savoir plus consulter http://dept-info.labri.u-bordeaux.fr/~dicky/HistInfo.html .

25 26

Un an avant la naissance de Ada Byron ne en 1815. Date laquelle il perd son pre et sa femme. 27 On dit aussi grie ou inspiratrice. En aucune faon elle ne fut sa matresse ni sa femme comme lcrivent, parfois, certains textes sensation sur le langage Ada. 28 pour calculer les nombres de Bernouilli notamment. 29 Cods en langage PL/1 (produit IBM destin remplacer FORTRAN et COBOL) et qui neut pas de succs. D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

DIAGRAMMES SYNTAXIQUES (D.S.) ou diagramme de CONWAY Ada est un langage de programmation (on vient de le voir dans les gnralits). Comme tous les langages, celui-ci obit des rgles grammaticales prcises (syntaxe) qui peuvent tre dcrites : soit par des phrases (elles sont souvent lourdes et difficiles comprendre) cest le cas des prsentations dun vieux langage : le COBOL (dfinitions verbeuses !). soit par des schmas, comme des Diagrammes Syntaxiques (en abrg D.S.). Cette description est trs utilise dans la prsentation du langage PASCAL (voir un livre correspondant). soit par une troisime description dite B.N.F. Utilise en Ada dans le manuel de rfrence (document accessible sur le Web ou dans AdaGide). B.N.F. est vu aprs les D.S. en page 3. I - Dfinition des symboles utiliss pour crire un D.S. (Diagrammes Syntaxiques) cartouche arrondie ou ronde : le symbole est prendre " la lettre". Symbole dit : terminal. cartouche rectangulaire : renvoie une syntaxe dfinie ailleurs (avant ou aprs). flche : dfinit le parcours du diagramme (aide sa lecture). II - Diagramme de base. a) schma squentiel : Dclaration d'une constante universelle en Ada (voir exemples page 4 en bas)

exemple :

liste didentificateurs

constant

:=

expression statique universelle

b)

schma alternatif : Dfinition de type tableau en Ada (vue au cours Ada n3)

exemple :

dfinition de tableau contraint

dfinition de tableau non contraint

exemple : oprateur de relation Ada :

= /= < > <= >=

Cours n1 (Gnralits II) fichier Cours1_B.DOC 30/06/02

Exercice 1 : Etablir les trois D.S. correspondant aux dfinitions (seul le 2ime est corrig !) : lettre : toutes les lettres de 'A' 'Z' puis les lettres de 'a' 'z' (idem pour les chiffres). oprateur multiplicatif : un oprateur multiplicatif est un des 4 symboles suivants : *, /, mod, rem type prdfini : les 6 types suivants sont prdfinis (c'est--dire connus sans qu'il soit besoin d'en donner la dfinition) : INTEGER, FLOAT, CHARACTER, STRING, BOOLEAN, DURATION.

mod

rem

c)

schma rptitif : exemple : dfinition d'un littral chane :

C'est une suite (ventuellement vide) de caractres encadrs de guillemets. Le diagramme syntaxique est le suivant : Littral-chane

"
caractre

"

Observez bien le sens des flches ! La notion de caractre sera vue plus loin. Le problme du caractre guillemet dans un littral chane est rsolu part et nest pas dcrit dans ce D.S. Exercice 2 : (aprs la pause dintercours !) Donner le D.S. correspondant la dfinition suivante : suite de lettres, de chiffres ou de _ (soulign), le premier caractre tant une lettre, le _ ne finissant pas la suite de symboles et napparat pas deux fois conscutivement (c'est la dfinition d'un identificateur da il faudra s'en souvenir !). Voir corrig page 4. Exercice 3 : Ecrire le D.S. correspondant la dfinition suivante : Un commentaire Ada est une squence (ventuellement vide) de n'importe quel caractre prcd par les deux caractres -Exemples : --ceci est un commentaire ceci est un commentre

le deuxime commentaire est galement correct (les accents sont accepts et lorthographe nest pas contrle !)

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

III - Notations B.N.F. Une reprsentation trs utilise en thorie des langages (voir cours correspondant niveau BAC + 3) est la notation dite B.N.F. (Backus-Naur-Form). Outre son aspect purement descriptif d'une grammaire, elle est sous-tendue par une thorie mathmatique qui la rend indispensable. De plus elle peut tre directement utilise par un traitement de texte sans graphisme ou un analyseur syntaxique. Malgr cela nous ne l'utiliserons pas dans ce cours car elle est moins lisible que les diagrammes syntaxiques. Cependant elle est utilise dans le manuel de rfrence Ada (voir par exemple Barnes pages 595 609) et de ce fait doit tre connue. Sept symboles particuliers (mta-symboles) sont utiliss : ::= | [ ] { } ' ' qui signifie "est dfini comme" qui signifie ou bien , ce symbole marque donc lalternative. qui signifie que les lments entre les crochets peuvent tre prsents 0 ou 1 fois, qui signifie que les lments entre les accolades peuvent tre prsents 0, 1 ou plusieurs fois, qui encadrent des lments terminaux, (correspondant aux cartouches arrondis des diagrammes syntaxiques), < > qui encadrent des lments non terminaux (correspondant aux cartouches rectangulaires des diagrammes syntaxiques), ( ) qui permettent de regrouper des parties de dfinition, ces parenthses sont utilises chaque fois qu'il y a ambigut.

Par exemple, les 4 diagrammes syntaxiques ci-dessous : diag1: ident1 Diagrammes voqus au tableau

ident2

ident3 diag2 : ident1 ident3

ident2 diag3 : ident1 ident2

ident3 diag4 : ident1

ident2

ident3

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

s'crivent, respectivement en notation B.N.F : observez bien le rle des parenthses! Et .... la compacit de la prsentation! <diag1> ::= <ident1> <ident2> <ident3> <diag2> ::= (<ident1> <ident2>) <ident3> <diag3> ::= <ident1> (<ident2> <ident3>) <diag4> ::= <ident1> (<ident2> <ident3>) Exemples : (retrouvez ou donnez les D.S. quivalents) <constante universelle> ::= <liste d'identificateurs> ' : ' 'constant' ':=' <expression statique universelle> <entier> ::= <chiffre> { [ ' _ ' ] <chiffre> }

Exercice 4 : Donner la reprsentation BNF d'un oprateur multiplicatif dfini dans l'exercice 1(Cf. le D.S.). Exercice 5 : Construire les diagrammes syntaxiques correspondant aux dfinitions BNF suivantes : <instruction if> ::= 'if' <expression> 'then' <suite d'instructions> {'elsif'<expression>'then'<suite d'instructions> } ['else' <suite d'instructions>] 'end if' ';' <instruction loop> ::= [<nom simple de boucle> ' : '] [<schma d'itration>] 'loop' <suite d'instructions> 'end loop' [ <nom simple de boucle> ] ';'

Exemples de constante universelle Ada ( revoir !) : MAX : constant := 30 -- la valeur est un littral numrique

PI_3 : constant := abs (PI ** 3); -- la valeur est une expression statique JOUR : constant := LUNDI; -- la valeur est un littral numratif

corrigs exercice 2 de la page 2 en DS puis en BNF ( retenir) :

lettre

lettre

_ chiffre

exercice : mettre ce diagramme en B.N.F. (corrig page suivante)

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

corrigs exercice 5 (voir cours n 3 des exemples de codage Ada utilisant if et loop) :

instruction if :

if

expression

then

suite dinstructions

elsif

expression

then

suite dinstructions

else

suite dinstructions

end if

instruction loop :

nom simple de boucle

schma ditration

loop

suite dinstructions

end loop

nom simple de boucle

remarques : on verra des applications des D.S. dans le fascicule de cours : les littraux numriques Ada page suivante. Nous utiliserons souvent les D.S. pour illustrer des concepts Ada. Barnes utilise, par contre, la notation BNF dans son livre (dj cit pages 595 609) Le manuel de rfrence utilise lui aussi la notation BNF (dj dit)

Corrig de lexercice bas de page 4 : <identificateur Ada> ::= <lettre> { [_] (<lettre> <chiffre>) }

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

LES LITTERAUX NUMERIQUES Ada

Avertissement : Ce module de cours fait suite celui des Diagrammes Syntaxiques (D.S.) quil enrichit en lillustrant. Cest loccasion aussi de faire de lAda sans en avoir lair. Il sinscrit donc bien dans le dbut du cours sur le langage Ada (gnralits II). Le concept de littral numrique Ada. Pour dfinir ce concept on pourrait dire qu'il s'agit de la faon de dnoter (ou reprsenter) en Ada une valeur numrique. Cette dnotation est bien sr assujettie des rgles strictes que l'on peut noncer sous forme explicite ou ... sous forme de D.S. ou en BNF (et nous voil revenus au module de cours prcdent!). Exemples d'criture : a) les littraux entiers : (criture o il ny a pas de point dcimal) 13 est un littral numrique entier (c'est vident). Mais 1_993 est aussi un entier (plus tonnant ! non ? mais ceci est vu en BNF pages 4 et 5!) Et que dire galement des quatre suivants : 7 # 123 # E2 2 # 01_0010 # 16# 2A3C # 12E+8 Les trois premiers sont dits entiers bass et le quatrime dnote un grand entier ( revoir). b) les littraux rels : (on note la prsence d'un point dcimal) 3.14159_2653 est un littral numrique rel (facile ?) mais aussi les deux suivants : 6.02E-24 et 2 # 101.01 #E1 tout ceci mrite des explications et donc ... des rgles! Remarques : (avant de se lancer dans les diagrammes de CONWAY ou D.S.) 1_993 vaut 1993 et 3.14159_2653 vaut 3.141592653. Ceci signifie que le trait bas (dit aussi le soulign) est uniquement un instrument de lisibilit de la valeur numrique (entire ou relle). A utiliser donc sans restriction si cela doit rendre le nombre plus lisible. On distingue deux classes de littraux (et ceci na rien voir avec la classification en entier ou en rel) : les littraux dits bass et les autres. Les littraux bass se caractrisent par une valeur (dite base) encadre par deux dises (#), la valeur de la base prcde le premier dise, le deuxime dise tant ventuellement suivi d'une valeur "exposant". Nous allons y revenir. Ainsi : (voici une bonne rvision sur la numration !) valeur de lexposant (ici 2) . 7 # 123 # E2 valeur du littral en criture base (123 mais en base 7, attention !) (les dises annoncent une valeur base) valeur de la base (ici 7) do : 7 # 123 # E2 = (1*72 + 2* 71 + 3 * 70) * 72 = 3234 (mais cette fois en base 10)

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

Dautres exemples : 2 # 01_0010 # entier bas, de base 2, valeur 010010 dans la base, pas dexposant soit : 1 * 24 + 1 * 21 = 16 + 2 = 18 en dcimal 16 # 2A3C # = 2 * 163 + 10 * 162 + 3 * 161 + 12 * 160 = 10812 12 E8 = 12 * 108 En labsence de base (donc de dise) la base est 10 implicitement ! 6.02E-24 = 6.02 * 10-24 2 # 101.01 #E1= (1*22 + 1 * 20 + 1*2-2) * 21 = (5 + 0.25) * 21 = 10.5 autre remarque : la valeur de la base (devant le premier dise) est toujours en criture entire dcimale (mais pas forcment la valeur base) et l'exposant (repr par le E ou un e) est toujours associ la base (mais la valeur de lexposant s'exprime, comme pour la valeur de la base, en dcimal !). Comment formaliser ces rgles ? (les corrigs sont la fin du document page 11) a) on distingue d'abord les 2 classes (bases ou non) d'o la premire rgle : un littral numrique est : soit un littral bas ou soit un littral dcimal. exercice : crire le D.S. correspondant. Voir corrig page 11. b) un littral bas est form : d'une base, suivie d'un dise, suivi d'un entier bas (ventuellement suivi d'un point et d'un autre entier bas) suivi d'un deuxime dise (ventuellement suivi d'un exposant). exercice : crire le D.S. correspondant. c) un entier bas est une suite de chiffres gnraliss et de souligns (le soulign _ ne pouvant ni commencer ni finir l'entier bas, ni tre 2 fois conscutivement). exercice : crire le D.S. correspondant. d) un chiffre gnralis est soit un chiffre soit une lettre. exercice : crire le D.S. correspondant. e) un exposant est form d'un E (minuscule ou majuscule) suivi d'un entier dcimal (l'entier tant ventuellement prcd d'un + ou d'un -) exercice : crire le D.S. correspondant. f) un entier la mme dfinition qu'un entier bas (o l'on remplace chiffre gnralis par chiffre tout simplement). g) un littral dcimal est un entier (suivi ventuellement d'un . et d'un entier) ventuellement suivi(s) d'un exposant (voir le BNF dun entier pages 4 et 5). Exercice : crire le D.S. correspondant. Fin semaine 1 ! (4 heures de cours)

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

Exercice n 1 (dbut semaine 2) Dans la liste ci-dessous dterminez tous les littraux illgaux et dites pourquoi ? Pour tous les littraux lgaux distinguez les entiers et les rels. Voir corrig page 10. a) e) h) k) 25.7 2#1101 e+7 b) .7 f) 3.14167_345678 g) i) 16#FFf# 2#111#e-1 c) 16E2 d) 16 e-2

13#ABCD# j) 1_0#1_0#e1_0

23.7e_7 l)

Exercice n 2 (tir de Barnes voir pages 79 83) : Quelle est la valeur dcimale des littraux numriques suivants (corrig page 10) : a) c) 16#E#E1 2#1.1111_1111_111#e11 b) d) 2#11#e11 16#F.FF#E+2

Les oprateurs Ada sur les numriques (littraux ou variables ; entiers ou rels)

Prliminaires Les oprations prdfinies applicables aux types entiers et/ou rels sont : + et * / + et rem mod abs ** oprateurs binaires (deux oprandes entiers ou deux oprandes rels) deux oprandes entiers ou deux oprandes rels division (idem *) oprateurs unaires (un seul oprande entier ou rel) reste de la division entire (oprandes entiers uniquement) le modulo (oprandes entiers) valeur absolue (oprateur unaire et oprande entier ou rel) exponentiation (le premier oprande est entier ou rel et le deuxime est entier)

Ces oprateurs sont donns ci-dessous par ordre de priorit croissante.

+ -

* /

+ - (unaires)

mod rem

abs **

Les quotients entiers : (exemples expliqus page suivante) 7 / 3 donne 2 (-7) / 3 donne -2 7 / (-3) donne -2 (-7) / (-3) donne 2

A = B * Q + R soit : A rem B A/B = Q

Car si on note : Q le quotient entier de A/B, on peut crire A = B*Q + Reste. (Reste se note rem en Ada) avec : A et B*Q sont de mme signe et abs (A) abs (B*Q)

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

Les restes : (nots rem) consquence de la dfinition du quotient ci-dessus 7 rem 3 = 1 c'est vident mais les autres ? (-7) rem 3 = -1 car (-7 / 3) * 3 + R = -7 = (-2) * 3 + R 7 rem (-3) = 1 (-7) rem (-3) = -1 Remarques : Le signe du reste est toujours le mme que celui du premier oprande A (le dividende) Mettez les parenthses car rem est prioritaire sur loprateur unaire (page prcdente). car (7 / (-3)) * (-3) + R = 7 = (-2) * (-3) + R car ((-7) / (-3)) * (-3) + R = -7 = 2 * (-3) + R

Modulo : not mod (dfinition voir mathmatique notion de classes dquivalence !) n mod p (n + i * p) mod p (o i est un nombre relatif) exemple : 7 mod 3 10 mod 3 13 mod 3 etc..... 4 mod 3 1 mod 3 -2 mod 3 etc.....

Pour choisir LE reprsentant de la classe on arrte quand (n+ip) est inclus dans [0;p[ (si p>0) ou ]p;0] (si p<0) donc dans lexemple 7 mod 3 1 mod 3 7 mod 3 = 1 car 1 est compris entre 0 et 3 ([0;3[)

(-7) mod 3 = 2

car (-7) mod 3 (-4) mod 3 (-1) mod 3 2 mod 3 car 7 mod (-3) 4 mod (-3) 1 mod (-3) -2 mod (-3) car (-7) mod (-3) (-4) mod (-3) (-1) mod (-3)

0 <= 2 < 3

7 mod (-3) = -2

-3 < -2 <= 0

(-7) mod (-3) = -1

-3 < -1 <= 0

Remarques : mettez bien les parenthses ncessaires (mod est prioritaire sur loprateur - unaire) le signe du mod est celui du 2me oprande mod est diffrent de rem (sauf quand les oprandes ont le mme signe) Habitus du Pascal, attention : mod (en Ada) nest pas loprateur du reste !

Exercice n 3 Compte tenu des dclarations suivantes valuer les expressions ci dessous (il y a des piges !) I J K a) d) g) : constant := 7 ; : constant := -5 ; : constant := 3 ; b) I/K*K e) -J mod 3 h) K**K**K c) I/J/K f) -J rem 3

I*J*K J+2 mod I J+2 rem I

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

10

Corrigs des exercices Exercice n 1 : 25.7 .7 16 E2 16 e-2 2 # 1101 3.14157_345678 oui 13 # ABCD # e+7 16 #FFf # 1_0 # 1_0 # e 1_0 23.7 E_7 2 # 111 # e-1 Exercice n 2 : 16 #E#E1 = 14 * 161 = 14*16 = 224 2 #11#e11 = 3 * 211 = 3 * 2048 = 6144 2 #1.1111_1111_111# e11 = 111111111111 (base 2) = 1000000000000 (2) - 1 = 212 - 1 = 4096 - 1 = 4095.0 16 #F.FF# E+2 = FFF (base 16) = 1000 (16) - 1 = 163 - 1 = 4095.0 Exercice n 3 : I*J*K = 7*(-5)*3 = -105 I/K*K = 7/3 * 3 = 2 * 3 = 6 I! I/J/K = 7/(-5)/3 = (-1)/3 = 0 J+2 mod I = -5 + 2 mod 7 = -5 + 2 = -3 -J mod 3 = -(J mod 3) = -(-5 mod 3) = -(+1) = -1 -J rem 3 = -(J rem 3) = -(-5 rem 3) = -(-2) = 2 comparer avec -J mod 3 !!! J + 2 rem I = -5 + 2 rem 7 = -3 comparer avec J + 2 mod I !!! K**K**K est ..... illgal !!! (lexplication sera donne au cours n13 !). (K**K)**K est correct ! Remarques : On trouvera en page 12 le source dun programme qui peut permettre de tester les rsultats des 3 exercices cidessus. Ce programme peut tre lu afin de se mettre dans le bain dun programme simple Ada. A revoir ! Importante : Le caractre _ est non significatif dans un littral nombre (1998 et 1_998 sont quivalents) mais il nen est pas de mme dans un identificateur Ada ainsi NB_DE_L et NBDE_L sont diffrents ! oui et cest un rel non (il manque lentier avant le point) oui et cest un entier non (pas dexposant ngatif pour un entier!). Ce nest pas non plus un rel! non (il manque le # de la fin) et cest un rel non (pas de chiffre D en base 13!) non (il y a lexposant mais pas la mantisse ) oui et cest un entier oui cest un entier peu lisible! Qui vaut 10#10#E10 = 1011 non (il ne faut pas de _ au dbut dun entier dcimal) non (comme pour 16 e-2)

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

11

Corrig des D.S.

Littral numrique Ada : littral dcimal

littral bas

Littral bas : base # entier bas #

entier bas

exposant

entier bas : chiffre gnralis _

chiffre gnralis : chiffre

lettre

exposant : E e + entier

littral dcimal : entier . entier exposant

Exercice : rcrire ces D.S. en BNF.

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

12

Exemple de programme simple Ada permettent de tester les trois exercices de la page 8 -- fichier LITTERAU.ADB -- pour tester le cours sur littraux (exercice pages 8 et 9) -- D. Feneuille septembre 98 with P_E_SORTIE; procedure LITTERAU is use P_E_SORTIE; Source disponible dans le rpertoire fendan/corrige I : constant := 7; J : constant := -5; K : constant := 3; ENTIER : INTEGER; REEL : FLOAT; begin -- la squence de deux lignes suivante : -- ECRIRE (ENTIER); ou ECRIRE (REEL); -- A_LA_LIGNE; -- est ajouter aprs chaque instruction valide! -- en tant les deux (marque de commentaire!) -- on retrouvera les valeurs ajoutes ENTIER := 7#123#E2; -- 3234 ENTIER := 2#01_0010#; -- 18 ENTIER := 16#2A3C#; --10812 --ENTIER := 16E-2; erreur syntaxe --ENTIER := 13#ABCD#; erreur D --ENTIER := E+7; erreur ENTIER := 16#E#E1;--224 ENTIER := 2#11#e11;--6144 REEL := 6.02E-24; --0.0 REEL := 2#101.01#E1; --10.5 --REEL := .7; erreur syntaxe --REEL := 16E-2; erreur --REEL := 23.7E_7; erreur REEL := 2#1.1111_1111_111#E11; -- 4095.0 REEL := 16#F.FF#E+2; -- 4095.0 ECRIRE (I*J*K); -- -105 A_LA_LIGNE; ECRIRE (I/K*K); -- 6 A_LA_LIGNE; ECRIRE (I/J/K); -- 0 A_LA_LIGNE; ECRIRE (J+2 mod I); -- -3 A_LA_LIGNE; ECRIRE (-J mod 3); -- -1 A_LA_LIGNE; ECRIRE (-J rem 3); -- 2 A_LA_LIGNE; ECRIRE (J+2 rem I); -- -3 A_LA_LIGNE; end LITTERAU; Le cours n1 (gnralits II) se termine encore avec quelques pages dexemples de programmes Ada (en relation avec les TD TP sur lalgorithmique).

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

Complments cours n 1 (Gnralits III)


Pour terminer ces six heures de cours nous allons commenter quelques codages Ada dalgorithmes connus (puisque dcouverts au cours des premiers TD de la semaine passe). Il sagit videmment dun survol assez informel et bien sr tous les concepts, vus rapidement, seront repris en dtail dans les cours venir. Evoque la ressource (composant logiciel) nomme Exemple n 1 ( tir du polycopi algorithmique TD n0) with P_MOUCHERON.IMP; P_MOUCHERON.IMP qui propose des services procedure TS_MOUCHERON0 is ou outils tels que : ECRIRE, RESET, ..... etc. On use P_MOUCHERON.IMP; parle avec with de clause de contexte begin ECRIRE (Essai de MOUCHERON); A_LA_LIGNE; Traduction de A_LA_LIGNE; lalgorithme rsolvant le MONTRER_RUBAN; problme A_LA_LIGNE; RESET; MONTRER_RUBAN; Nom du programme A_LA_LIGNE; TS_MOUCHERON0 AUTRE_RUBAN; MONTRER_RUBAN; end TS_MOUCHERON0; On remarque un ensemble de mots : soit des mots rservs (ici en minuscule gras) et des identificateurs choisis parmi les spcifications de la ressource P_MOUCHERON.IMP. Les points virgules terminent chaque action. Les mots rservs begin et end encadrent lensemble des actions mises en vre. Cette procdure se suffit elle u mme elle peut devenir un programme excutable. Le use vite le prfixage ( revoir). Exemple n 2 ( tir du polycopi algorithmique TD n1) procedure NB_CAR (...) is structure begin itrative COMPTEUR := 0; loop exit when FIN_RUBAN; LIRE; COMPTEUR := COMPTEUR + 1; -- incrmentation du compteur end loop; . ECRIRE_COMPTEUR; -- pour voir lcran le contenu du compteur end NB_CAR; Cest toujours la traduction Ada de lalgorithme vu en TD. On remarque dautres mots rservs loop, exit when. Ici, cette brique (elle aussi une procdure) nest pas indpendante ; cest un composant de P_MOUCHERON.EVE.MOUCHERON1 qui accde aux entits : Compteur, Fin_Ruban, Lire et Ecrire_Compteur. Exemple n 3 ( tir du polycopi algorithmique TD n1). Mme remarques que lexemple 2. procedure NB_DE_L(....) is structure begin alternative COMPTEUR := 0; loop exit when FIN_RUBAN; LIRE; if (CARCOU = 'L') or (CARCOU = 'l') then COMPTEUR := COMPTEUR + 1; end if; end loop;. ECRIRE_COMPTEUR; end NB_DE_L; Cours Ada n1 (Gnralit III) fichier Cours1_C.doc 30/06/02

Exemple n 4 ( tir du polycopi algorithmique TD n1) with P_MOUCHERON.IMP.MOUCHERON1; procedure TS_MOUCHERON1 is use P_MOUCHERON.IMP, P_MOUCHERON.IMP.MOUCHERON1; begin ECRIRE("test de NB_CAR, NB_DE_L :"); A_LA_LIGNE; loop . ECRIRE("dition du ruban :"); A_LA_LIGNE; MONTRER_RUBAN; A_LA_LIGNE; RESET; ECRIRE("nombre de caractres : "); NB_CAR; A_LA_LIGNE; RESET; ECRIRE("nombre de L : "); NB_DE_L; A_LA_LIGNE; AUTRE_RUBAN; end loop; end TS_ MOUCHERON1; on sappuie sur la ressource MOUCHERON1 petite-fille de P_MOUCHERON

pour tester en boucle le programme. Larrt se fait sur labsence de nom de ruban dans le fichier testtp1.txt

Cette procdure (indpendante) identifie TS_MOUCHERON1 utilise le composant logiciel MOUCHERON1 (luimme compos entres autres des nouvelles briques NB_CAR et NB_DE_L quutilise TS_MOUCHERON1). Exemple n 5 ( tir du polycopi algorithmique TD n2). procedure Nb_De_Carac (Car : in Character) is begin Compteur := 0; loop exit when Fin_Ruban; Lire; if Carcou = Car then Compteur := Compteur + 1; end if; end loop; Ecrire_Compteur; end Nb_De_Carac;

Paramtre formel

Il sagit dune brique rutilisable dun composant logiciel. Mais, comme on la vu en algorithmique, la procdure est formelle on dira paramtre . Le paramtre (entre parenthses nest pas concret il ne correspond aucun identificateur vrai). A revoir en semaine 4 (cours n 5 sous-programme ). Exemple n 6. Notion de paquetage (composant Ada privilgi). Il sagit de survoler la partie spcifications dun composant logiciel que nous utiliserons pendant quelques semaines. En Ada on peut agrablement modliser un composant avec ce que lon appelle un paquetage (cette notion sera bien approfondie plus tard semaine 5). Pour aujourdhui nous allons uniquement nous intresser la partie contrat ou spcifications. En effet un utilisateur potentiel dune ressource na besoin de connatre que le mode demploi et, en aucune faon, sa ralisation (le : comment cest fait na pas dintrt). Ici on va dcouvrir des outils dentres-sorties (Lire et Ecrire surchargs) des types prdfinis Ada (Character, Integer, Float, String). Il sagit dun extrait dun document plus consquent lequel sera disponible dans son intgralit en TD Ada ( copier). On en fait une lecture commente seulement.

D. Feneuille I.U.T. 2001 (cours n1 Gnralits III fichier COURS1_C.DOC) 30/06/02

with Ada.Text_io, Ada.Strings.Unbounded; package P_E_Sortie is use Ada.Text_Io, Ada.Strings.Unbounded; --============================================== -- Procdures d'entres/sorties sur les entiers prdfinis --============================================== procedure Ecrire ( L_Entier : in Integer ); -- permet de visualiser un INTEGER partir de la position -- initiale du curseur. Si l'on souhaite aller la ligne ensuite -- il faut utiliser en plus la procdure A_LA_LIGNE procedure Lire ( L_Entier : out Integer ); -- permet d'acqurir un INTEGER en base quelconque (2 16) avec -- validation (fait recommencer jusqu' ce la valeur soit valable) --=============================================== -- Procdures d'entres/sorties sur les flottants prdfinis --=============================================== procedure Ecrire ( Le_Reel : in Float ); -- permet de visualiser un FLOAT sur la ligne partir de la position -- initiale du curseur. Si l'on souhaite aller la ligne ensuite -- il faut utiliser en plus la procdure A_LA_LIGNE. -- Le rel est crit sous la forme: -- signe, partie entire, point dcimal et partie dcimale -- le point dcimal est toujours prsent, -- le signe + est remplac par un espace. -- Quant aux deux champs numriques ils suppriment les -- zros non significatifs. procedure Lire ( Le_Reel : out Float ); -- permet d'acqurir un FLOAT dans une base quelconque (2 16) avec -- validation (on recommence jusqu' ce que la valeur soit valable). -- Le point dcimal est obligatoire la saisie. --================================================= -- Procdures d'entres/sorties sur les caractres --================================================= procedure Ecrire ( Carac : Character ) ; -- permet de visualiser un caractre partir de la position -- initiale du curseur. Si l'on souhaite aller la ligne ensuite -- utiliser en plus la procdure A_LA_LIGNE procedure Lire ( Carac : out Character ); -- permet d'acqurir un caractre unique. Lecture tamponne c'est-- -dire que l'on peut effacer le caractre saisi d'o ncessit de -- terminer la saisie par un RC (appui sur la touche entre). Le -- tampon est purg aprs la prise en compte de ce caractre. D. Feneuille I.U.T. 2001 (cours n1 Gnralits III fichier COURS1_C.DOC) 30/06/02

--============================================================ -- Procdures d'entres/sorties sur les chanes de caractres -- On pourra lui prfrer plus tard les paquetages prdfinis --============================================================ procedure Ecrire ( La_Chaine : String ); -- permet de visualiser une chane de caractres partir -- de la position initiale du curseur. procedure Lire ( La_Chaine : out String ); -- permet de saisir une frappe de caractres termine par entre -- si le nombre de caractres est infrieur la dimension du STRING -- pass en paramtre le complment est initialis espace. -- Le tampon est purg. procedure Lire ( La_Chaine : out Unbounded_String ); -- permet de saisir une frappe de caractres termine par entre -- il n'y a pas de limite, ni problme de remplissage --========================================================= -- Procdures vider clavier et saut la ligne sur l'cran --========================================================= procedure Vider_Tampon; -- peu utile dans le contexte propos ici puisque toutes les saisies -- sont purges. Permet cependant d'attendre la frappe de la touche -- entre. C'est une pause (voir ci-dessous) sans message. procedure A_La_Ligne ( Nombre : Positive_Count := 1 ) renames New_Line; -- sans commentaire procedure Pause; -- affiche le message: "appuyez sur Entre pour continuer" -- et attend la frappe sur la touche entre. --============================================================== -- Transformation de FLOAT ou d'INTEGER en Chane de caractres --============================================================== function Image ( L_Entier : in Integer ) return String; -- c'est une "redfinition" de l'attribut c'est--dire INTEGER'IMAGE function Image ( Le_Reel : in Float ) return String; -- permet une amlioration de l'attribut FLOAT'IMAGE -- l'image est celle dfinie dans la procdure ECRIRE avec FLOAT. -- permet des critures d'images d'objets de type diffrent ainsi: -- ECRIRE(IMAGE(...)&"...."&IMAGE(...)&"..." etc.);

D. Feneuille I.U.T. 2001 (cours n1 Gnralits III fichier COURS1_C.DOC) 30/06/02

--========================= -- Spcial type discrets (pour les types numratifs et entiers) --========================= -- Pour viter d'avoir instancier (trop tt!) les sous-paquetages -- ADA.TEXT_IO.ENUMERATION_IO ou ADA.TEXT_IO.INTEGER_IO -- (l'exercice n'est pas difficile mais mythique !) -- on copiera la squence suivante en adaptant les identificateurs -- T_DISCRET et DISCRET au type discret et la variable de ce type --- loop -declare -CHAI : UNBOUNDED_STRING ; -begin -LIRE(CHAI); -DISCRET := T_DISCRET'VALUE(TO_STRING(CHAIN)); -exit; -exception when others => -null; -- ou message ECRIRE("xxxxx"); -end; -- end loop; end P_E_Sortie;

D. Feneuille I.U.T. 2001 (cours n1 Gnralits III fichier COURS1_C.DOC) 30/06/02

Mots rservs Ada


declare delay delta digits do generic goto if in is of or others out package pragma private procedure protected* raise range record rem renames requeue* return reverse select separate subtype tagged* task terminate then type use until* when while with xor

abort abs abstract* accept access aliased* all and array at begin body case constant

else elsif end entry exception exit

limited loop

mod new not null

for function

Nous allons essayer dans tous nos exemples Ada de reprsenter ces mots rservs en minuscules et en gras ; suivant en cela le manuel de rfrence. Les autres identificateurs seront proposs soit en MAJUSCULES soit en notation mixte premire lettre (ou lettre suivant un _) en majuscule (le reformateur fait cela). Remarque : Il se trouve que les 3 mots : delta, digits et range sont aussi des attributs (concepts revoir) et devraient quand ils sont attributs 1 (et leur place) tre crits : Delta, Digits et Range cest--dire en notation mixte (subtilit dominer plus tard !). En fait, ceci a lieu quand ils sont prcds d'une apostrophe. Exemples : pour Range et range .T_IND'Range .Integer range 1..10; Remarques : La nouvelle norme Ada (Ada 95) ajoute les 6 mots rservs (marqus dune *) : abstract, aliased, protected, requeue, tagged, until et au moins un attribut important connatre: Class (nous y reviendrons semaine 7)

A lire (et relire) : Rosen (dans son livre pages 22 39 livre signal au cours n1) russit le tour de force, en trs peu de pages, faire un joli survol du langage Ada (prsentation voir absolument !). Voir aussi son site : http://perso.wanadoo.fr/adalog/ visiter de haut en bas !

La notion dattributs Ada est vue au cours n 2 (2 heures) qui suit immdiatement cette sance de 2 heures aussi. D. Feneuille I.U.T. 2001 (cours n1 Gnralits III fichier COURS1_C.DOC) 30/06/02

Cours Ada n1 (6 heures) testez vos connaissances


Utile pour bien raliser les QCM Machine et les QCM papier (partiels !) Quest-ce quun langage de programmation ? Citez en quelques uns. Quest-ce quun programme ? Quest-ce que la compilation ? Quest-ce que ldition de liens ? Qui tait Ada comtesse de Lovelace ? A quel organisme doit-on la cration du langage Ada ? Quelles sont les appellations des deux versions du langage Ada ? Dans quelles types dapplications Ada est-il beaucoup employ ? Pourquoi doit-on normaliser un langage ? Quel nom donne-t-on au document qui prsente le langage normalis ? Ada : vecteur du gnie logiciel a veut dire quoi ? Quest-ce quun composant logiciel ? Un littral chane de caractres peut-il tre vide ? Un littral caractre peut-il tre vide ? Comment dnote-t-on un guillemet dans un littral chane de caractres ? Sachez crire (en BNF et en DS) la dfinition dun identificateur Ada. Citez les 6 oprateurs de relation Ada Citez les 4 oprateurs multiplicatifs Ada Citez les 6 types prdfinis Ada. Comment crit-on un commentaire en Ada ? Quest-ce quun littral numrique ? Quest-ce qui diffrencie un littral entier dun littral rel ? Quest-ce quun littral numrique bas ? Quelle est la base implicite dun littral non bas ? Quest-ce quun oprateur binaire (et un oprateur unaire) ? Citez les oprateurs unaires agissant sur les numriques Et les oprateurs binaires. Dans les deux questions prcdentes prcisez sur quels sortes de numriques ils agissent et quel est le type du rsultat. Priorits des oprateurs numriques ? rem et mod donnent des rsultats diffrents (sauf ?) A quoi servent les paquetages P_E_Sortie.ads et P_E_Sortie.adb Fichiers diter : Ceux des paquetages qui servent raliser les exercices dalgorithmique. Les paquetages P_E_Sortie.ads et P_E_Sortie.adb (pour voir la ralisation) Les fichiers annoncs page 5 cours n1 (gnralits I). Visitez les sites suggrs dans le fichier Ada_et_le_Web.html.

D. Feneuille I.U.T. 2001 (cours n1 Gnralits III fichier COURS1_C.DOC) 30/06/02

Cours n 2 Ada type scalaire (2 bonnes heures !)

Thme : le typage Ada et quelques types (prdfinis ou construits). Le typage et pourquoi typer?
Typer les objets que va utiliser un algorithme cest regrouper dans une mme enveloppe ou dans un mme ensemble (bien identifi) les objets ayant un lien conceptuel entre eux. Il sagit dune partition au sens mathmatique du terme (i.e. pas de mlange). Ainsi les objets de ce type auront les mmes proprits, les mmes oprateurs, la mme plage de valeur etc. Ce faisant, cest--dire en typant le plus possible, on vitera des erreurs dites conceptuelles (que vrifiera dailleurs la phase de compilation) et ces erreurs seront dcouvertes trs tt dans le processus de mise au point. Ada (comme tout langage) propose des types prdfinis mais Ada offre aussi des possibilits pour construire (soit mme) ses propres types (types construits) opration privilgier le plus possible. Cette technique, sans tre imprative, est une composante dun travail bien fait et rigoureux et participe aux techniques du gnie logiciel. On privilgiera donc cette approche du typage systmatique le plus souvent possible (mais Ada, en fait, comme on le verra, nous y contraint souvent !). Ada est un langage dit fortement typ. Ce qui veut dire que : Une variable, une constante ou un littral appartiennent un type et un seul (c'est le principe mme de l'instanciation). Toute opration sur une instance dun type (cest--dire une variable, une constante ou un littral de ce type) doit appartenir l'ensemble des oprations connues pour les instances de ce type. Aucune conversion implicite de type n'est effectue sur une valeur. Mme les oprations arithmtiques ne sont dfinies qu'entre entiers de mme type, ou qu'entre rels de mme type (except **).

Par exemple avec les dclarations suivantes : IND : INTEGER; -- IND est de type entier prdfini REL : FLOAT; -- REL est de type rel prdfini On ne peut en aucune manire effectuer directement l'opration REL + IND ou crire REL := IND ; Si on le souhaite vraiment il faut lexprimer haut et clair et faire une conversion explicite du type INTEGER(REL) + IND ou IND := INTEGER(REL); -- attention arrondi ! ou REL + FLOAT(IND) ou REL := FLOAT(IND); De mme avec la variable COMPTEUR dclare (dans la ressource P_MOUCHERON) cf. Algo ainsi : COMPTEUR : T_COMPTEUR; -- valeur entre 0 et 3000 On ne peut pas mler COMPTEUR et IND (pourtant tout deux de type entier (mais ce nest pas le mme !)). La conversion dun rel en entier avec lcriture INTEGER(REL) procde par arrondi et non par troncature. Larrondi se fait vers lentier le plus proche. Pour les valeurs exactement au milieu (cest--dire ayant une dcimale .5 exacte) larrondi se fait vers lentier en sloignant de zro. Ainsi 1.5 est converti en 2 et 1.5 est converti en 2. En rsum, on retiendra quun type est caractris par : Un ensemble de valeurs que peut prendre toute instance du type (cest--dire tout objet dclar de ce type). Un ensemble doprations (dcrites laide doprateurs) applicables aux instances du type. Eventuellement un ensemble de caractristiques appeles attributs 1. Ces attributs sont en gnral des oprations qui portent sur les proprits du type lui-mme et non pas, comme les oprateurs, sur les instances du type. Cette notion dattribut nest pas vidente ! (nous y reviendrons).

Les lecteurs avertis de la programmation moderne auront garde de ne pas confondre ce terme attribut Ada avec celui dattribut (homonyme !) utilis en programmation objet (avec C++ ou Eiffel par exemple).

Les types prdfinis puis les types construits :


Les types prdfinis : Nous avons vu au cours n1 (gnralits II) avec les D.S. les identificateurs de 6 types prdfinis. Integer, Float, Boolean, Character, String et Duration. Ces 6 types prdfinis existent respectivement pour instancier : des entiers, des rels (nombre virgule), des boolens (deux valeurs!), des caractres, des chanes de caractres et enfin des dures. Ces types sont dfinis dans la ressource (ou paquetage) STANDARD (quil est inutile dvoquer avec with). Pour des raisons largement discutes et dmontres plus tard il est trs prudent de refuser dutiliser (le plus souvent possible) les 3 types suivants : Integer, Float et String. Nous essaierons de nous y tenir. Le type CHARACTER : (nomm aussi LATIN_1) Lensemble des valeurs associes ce type est dfini dans le paquetage STANDARD voir dans le polycopi paquetages officiels Ada . Ces valeurs sont ordonnes donc possdent un rang (de 0 255). Les valeurs ditables ou graphiques (du n 32 au n 126 et du n 160 255) sont dnotes entre apostrophes (ex : a, P, , , = etc.). Les valeurs non ditables ou de contrle (du n 0 au n 31 et du n 127 au n 159) sont dnotes avec leur identificateur spcifique (en gnral deux trois lettres sans les apostrophes videmment !) par exemple bel le caractre de rang 7 qui met un bip sonore quand on ldite lcran. Les identificateurs des caractres (notamment ceux dits de contrle) sont hlas peu mnmoniques ; aussi, le paquetage Ada.Characters.Latin_1 ( consulter dans le polycopi) dclare un ensemble de constantes permettant de nommer autrement tous les caractres (seuls les chiffres et les lettres majuscules nont pas de nom). Par exemple dans Ada.Characters.Latin_1 le caractre guillemet est nomm Quotation sinon il se dnote ainsi dans STANDARD. En corollaire de la relation dordre il existe des oprations clairement comprises grce aux 6 oprateurs : =, /=, >, <, >=, <= auxquels on ajoutera les oprateurs dappartenance un intervalle ou un sous type : in et not in. Exemples : if if if if (Carcou (Carcou (Carcou (Carcou in A..K) then . = L) then . in T_Majuscules) then . /= ) then .

Les attributs les plus courants sont : PRED, SUCC, VAL et POS. Auxquels on peut ajouter : FIRST, LAST, IMAGE, VALUE, MAX, MIN, WIDTH,.. Les attributs font dabord rfrence au type concern (ici Character) grce une apostrophe puis, ventuellement, ils utilisent un ou des paramtres. Exemples : Carcou Carcou Carcou Carcou := := := := CharacterSucc (o) ; -- Carcou vaut p CharacterPred(Carcou) ; -- dpend de la valeur de Carcou CharacterVal(32) ; -- Carcou vaut le caractre espace CharacterFirst ; -- Carcou vaut le caractre de rang zro

On verra dautres exemples dapplication en TD (tude du paquetage Ada.Characters.Handling). A noter quil existe aussi le type Wide_Character sur ensemble du type Character (mais il est ordonn de 0000 FFFF 16 au lieu de 0 255 ou 00 FF 16).

D. Feneuille I.U.T 2001 (cours n2 fichier COURS2.DOC) 30/06/02

Le type BOOLEAN : Lensemble des valeurs associes ce type contient seulement deux valeurs dnotes FALSE et TRUE (dans cet ordre !). On verra que cest finalement un exemple le plus lmentaire dun type numratif. Les 6 oprateurs et les attributs sont les mmes que pour le type CHARACTER avec en plus les oprateurs logiques : not, and, or et xor. Attention, les trois derniers ont mme priorit ! Le premier not a une priorit suprieure aux autres. On verra aussi and then et or else (amliorations de and et or). Lutilisation de ce type tant trs voqu en TD dalgorithmique donc nous ny reviendrons pas.

Les types INTEGER et FLOAT : A retenir pour le moment : les valeurs possibles de ces deux types numriques dpendent de lordinateur et du compilateur sur lequel vous travaillez (donc ils ne sont pas portables donc dangereux utiliser). Heureusement Ada permet de construire ses propres types numriques (les entiers vus plus loin et les rels vus plus tard). On retiendra pour limmdiat de ne pas utiliser le type INTEGER et, en attendant mieux, dutiliser, quand mme, FLOAT!

Les types STRING et DURATION : Vus plus tard ! Ainsi que Wide_String. Remarque : Ada propose dans des paquetages complmentaires deux types de chanes de caractres (donc autre que String) trs intressants (les Unbounded_String et les Bounded_String) retenez ces identificateurs. Ils nappartiennent pas aux types prdfinis mais font partie du langage Ada95. De conception et surtout dutilisation sures : nous les utiliserons souvent.

Les types construits et les constructeurs de types :


Il existe en Ada des constructeurs syntaxiques permettant de fabriquer ses propres types. On parle alors de types construits en opposition avec les 6 types prdfinis. Il existe des constructeurs de : types numratifs. types tableaux. types articles. types accs. types privs. types drivs. types entiers types rels. types tches. Cours 2 (ce cours ci : voir pages plus loin) Cours 4 Cours 6 Cours 12 Cours 7 Cours 10 et numrique 1 Cours 2 (ce cours ci : voir pages plus loin) Cours numrique 1 et 2 Cours tches (dbut trimestre 2 voir planning) et aussi le type protg

Construction dun type entier sign : La rgle de construction dun type entier sign est dfinie par le D.S. suivant : type identificateur is range intervalle ;

Exemples (remarquez lutilisation des trois mots rservs Ada : type, is et range) : type type type type T_TEMPERATURE T_ETAGE T_MONTANT T_COMPTEUR is is is is range range range range -78..123; -5..12; 0..2_000_000; 0..3000; -- utilis en TD-TP Algo !

D. Feneuille I.U.T 2001 (cours n2 fichier COURS2.DOC) 30/06/02

4
On rappelle que ces 4 types dentiers construits sont incompatibles entre eux ! Et cest heureux ! Les oprateurs ont t vus dans le cours prcdent (D.S. et littraux numriques): +, -, *, /, mod, rem, abs, ** Les attributs des types entiers sont les mmes que ceux du type Character et plus gnralement sont ceux des types discrets (voir plus loin) mot gnrique qui regroupe des types ayant des proprits identiques. Nous ne nous tendrons pas sur les oprateurs connus ! Seuls mod et rem mritaient un bon dveloppement et ceci a dj t fait dans le cours prcdent. Enfin, abs dsigne, videmment, la valeur absolue (bien connue !).

Construction dun type entier modulaire : La rgle de construction dun type entier modulaire est dfinie par le D.S. suivant : type identificateur is mod entier positif ;

Exemples (remarquez lutilisation des trois mots rservs Ada : type, is et mod) : type T_Heure type T_Octet is is mod 24; -- valeurs entre 0 et 23 mod 256; -- valeurs entre 0 et 255

La diffrence essentielle par rapport au type entier sign est larithmtique (modulo) ainsi si on a : L_Heure : T_Heure := 23 ; Puis L_Heure := L_Heure + 1 ; Quelques problmes dominer : L_Heure := 25 ; L_Heure := 24 ; sont des critures incorrectes ( not in range dit le compilateur !) car les valeurs littrales admises vont de 0 23 daprs la dfinition ci dessus (mod 24). Donc 24 et 25 ne sont pas dans lintervalle. Mais : L_Heure := -2 ; est une criture correcte car le ne fait pas partie de la dfinition cest un oprateur unaire ! Cest quivalent : L_Heure := 0 - 2 ; Lcriture est aussi quivalente L_Heure := 22 ; il faut revoir les exercices du cours prcdent !

-- L_Heure vaut alors 0

Les types numratifs construits : La rgle de construction dun type numratif est rgit par le D.S. : type identificateur is ( numration ) ;

Exemples : type T_COCORICO is (BLEU, BLANC, ROUGE) ; type T_COULEUR is (VIOLET, INDIGO, BLEU, VERT, JAUNE, ORANGE, ROUGE) ; type T_FEUX is (VERT, ORANGE, ROUGE); type T_JOUR is (LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE); type T_MOIS is (JANVIER, FEVRIER, MARS, AVRIL, MAI, JUIN, JUILLET, AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE, DECEMBRE) ; D. Feneuille I.U.T 2001 (cours n2 fichier COURS2.DOC) 30/06/02

5
Les types numratifs sont construits en indiquant (en numrant !) simplement les valeurs symboliques (spares par des virgules) que peuvent prendre leurs instances ( ne pas confondre avec les littraux chanes de caractres : le symbole ou identificateur BLEU est diffrent du littral chane BLEU). On remarque (dans les exemples) la prsence du symbole numratif (ou littral numratif) ROUGE trois endroits. On parle de surcharge. (Mme remarque pour ORANGE, BLEU et VERT il y a encore surcharge). Comme pour les types construits ou prdfinis vus prcdemment, le type numratif possde des attributs. T_COCORICOPRED(ROUGE) vaut BLANC T_COULEURPRED(ROUGE) vaut ORANGE sans ambigut! Lattribut PRED, qui opre bien sur la valeur ROUGE, doit tre qualifi par le type (ceci est vrai quelle que soit lutilisation et pas seulement comme ici en cas de surcharge). Attention T_COCORICOPRED(BLEU)entrane une erreur dexcution dite CONSTRAINT_ERROR. (A revoir en TD mais on comprend pourquoi !). T_JOURFIRST vaut LUNDI T_FEUXLAST vaut ROUGE Sil existe une procdure ECRIRE elle mme surcharge (pour les trois types) il y a ambigut crire : ECRIRE (ROUGE); Il faut qualifier par exemple ainsi : ECRIRE (T_COULEUR(ROUGE)); Les dclarations des variables (ou instanciation des types) sont semblables celles dj tudies : DEBUT_SEMAINE, DEBUT_WEEK_END PEINTURE : T_COULEUR; : T_JOUR;

Une variable pourra prendre une quelconque des valeurs du type. Par exemple : DEBUT_SEMAINE := LUNDI;

Les symboles qui dnotent les littraux des types numratifs sont des identificateurs comme les autres. On peut aussi, dans u n type numratif, mler les caractres (et seulement cela) et les symboles type T_REPONSE is (OUI, NON, 1, A, AUTRE); -- pas facile! revoir

Un type numratif est ordonn, par exemple pour le type T_COULEUR on aura les relations VERT < JAUNE < ORANGE < ROUGE

Lordre est induit par celui de lnumration. Parmi les attributs dfinis sur ces types, IMAGE permet de convertir un symbole de type numratif en la chane de caractres associe et VALUE est lopration rciproque. T_COULEUR'VALUE("ROUGE")sera l'identificateur ROUGE T_COULEUR'IMAGE(ROUGE) sera la chane de caractres "ROUGE" Autres exemples d'attributs : T_COULEUR'FIRST sera le symbole VIOLET T_COULEUR'SUCC (ORANGE) sera le symbole ROUGE T_COULEUR'PRED (ORANGE) sera le symbole JAUNE T_FEUX'PRED (ORANGE) sera le symbole VERT T_COULEUR'POS (BLEU) sera la valeur entire 2 T_COULEUR'VAL (0) sera le symbole VIOLET D. Feneuille I.U.T 2001 (cours n2 fichier COURS2.DOC) 30/06/02

6
Attention le rang (POS) du premier lment dun numratif est gal 0. Par contre l'attribut POS sur un type (ou un sous type) entier est l'oprateur identit INTEGER'POS (L_ENTIER) est gale la valeur de la variable L_ENTIER. Exemple : INTEGERPOS(-5) vaut -5. A retenir! Rappel : les types prdfinis CHARACTER et BOOLEAN sont en fait des types numratifs. Ainsi : CHARACTER'POS('A') CHARACTER'VAL(65) = 65 et = 'A'

Les types discrets : (il sagit de la runion des types entiers et numratifs) les types entiers les types numratifs (type prdfini (INTEGER par exemple) et les types entiers construits) (type prdfini (comme BOOLEAN ou CHARACTER) et construits)

Les types scalaires : Il sagit de la runion des types discrets et des types rels. Ce type scalaire est caractris par les 4 proprits suivantes (notez donc que ces 4 proprits sappliquent tous les types discrets vus prcdemment) : Pour ce type sont dfinies l'affectation et les oprations d'galit et d'ingalit (= et /= ). Ce sont les proprits communes de tout type dit affectation . Une relation d'ordre est dfinie entre les diverses valeurs possibles. On dispose donc en plus : des 4 oprateurs de relation : <, >, <=, >= des tests d'appartenance un intervalle ou un sous type : in et not in Les types scalaires possdent une borne infrieure et une borne suprieure que l'on peut connatre par les attributs FIRST et LAST. Exemples : INTEGER'FIRST et INTEGER'LAST ou FLOATFIRST et FLOATLAST (dans ce cas ces valeurs dpendent de limplmentation numrique). Des contraintes d'intervalle (avec range) peuvent tre appliques sur les types scalaires.

Diffrence : les attributs vus avec les types discrets (ci dessous) sappliquent aussi aux types scalaires sauf deux : VAL et POS. En effet avec les types discrets chaque valeur possde un rang, avec les types rels, la notion de rang n'existe pas. Donc ni VAL ni POS avec les rels (seule diffrence retenir). Les types scalaires donc aussi les types discrets ont (entre autres) les proprits suivantes : toute valeur d'un type scalaire ou discret, sauf la dernire, possde un successeur, SUCC toute valeur d'un type scalaire ou discret, sauf la premire, possde un prdcesseur, PRED toute valeur (VAL) d'un type discret possde un rang (POS). Spcifique aux types discrets (rappel).

Rsum : Les attributs Ada associs aux types scalaires et discrets sont (vus en TD semaines 3 et 4): WIDTH PRED FIRST POS(*) IMAGE LAST VAL(*) VALUE ADDRESS SUCC BASE SIZE MAX MIN

(*) discrets seulement rappel!

D. Feneuille I.U.T 2001 (cours n2 fichier COURS2.DOC) 30/06/02

Les sous -types :


Certaines instances d'un type donn pourraient ne prendre qu'une partie des valeurs appartenant l'ensemble du type donn (limit par un intervalle de contrainte). Mais par contre elles utiliseraient l'ensemble des oprations dfinies pour ce type. Pour ralis er cela, Ada offre la notion de sous-type. Un sous-type caractrise un sous-ensemble de valeurs d'un type donn lui-mme appel type de base du sous-type. Le type de base dun type est le type lui-mme! Exemples : (notez bien la diffrence avec les types entiers construits plus haut : prsence du mot subtype) subtype subtype subtype subtype subtype subtype T_PETIT_ENTIERS is INTEGER range -128..+127; T_ANNEE is POSITIVE range 1_582..9_999;-- grgorien ! T_NUM_MOIS is INTEGER range 1..12; T_NUM_JOUR is INTEGER range 1..31; T_MAJUSCULES is CHARACTER range 'A' .. 'Z' ; T_MINUSCULES is CHARACTER range 'a' .. 'z' ;

Ada prdfinit deux sous types d'entiers signs. Les sous types NATURAL et POSITIVE. Ils sont dfinis ainsi dans le paquetage STANDARD (retrouvez les dans le polycopi paquetages ) : subtype NATURAL is INTEGER range 0..INTEGER'LAST; subtype POSITIVE is INTEGER range 1..INTEGER'LAST; A noter que : la dclaration d'un sous-type ne dfinit pas un nouveau type. si lindication de sous type ne comprend pas de contrainte (rare mais possible) alors le sous-type est identique au type. Cette particularit est parfois intressante on en verra des exemples plus tard. Classification des types de donnes. ( passer en premire lecture mais revoir souvent bien sr) Les types de donnes sont classs de la faon suivante (une prsentation arborescente serait plus lisible) : Type affectation. type de donnes accs sur sous-programmes sur objets (statiques ou dynamiques) type de donnes scalaires types discrets types numratifs. types entiers signs modulaires types rels types flottants types fixes binaires dcimaux types de donnes composites type tableaux types articles types tiquets Types sans affectation types tches, types protgs types privs limits types fichiers.

D. Feneuille I.U.T 2001 (cours n2 fichier COURS2.DOC) 30/06/02

A retenir
Oprations (attributs) sur les types discrets (CHARACTER, entiers et numratifs) et parfois sur les rels. T est un type ou un sous type (mais attention dans le cas dun sous type il y aura des surprises!) et OBJET est une instance ou un littral du type T. fonctions sans paramtre : TWIDTH rend la longueur maximale des images des valeurs du type T (scalaire) ou du sous type T. Exemple : T_JOURWIDTH vaut 8 cause de MERCREDI, VENDREDI ou DIMANCHE TFIRST rend la borne infrieure du type T (scalaire) ou du sous-type T. Exemples : INTEGERFIRST vaut -231 sur nos PC avec le compilateur GNAT; NATURALFIRST vaut 0 TLAST rend la borne suprieure du type T (scalaire) ou du sous-type T. Exemple : T_MAJUSCULESLAST vaut Z ; INTEGERLAST vaut 231 1 = 2_147_483_647 avec le GNAT OBJETSize renvoie le nombre de bits dimplmentation de OBJET. Ne sapplique pas sur un type mais sur une instance de type.

fonctions avec paramtre(s) : TPOS(OBJET) OBJET est considr comme instance du type de base de T (discret). Rend la valeur numro de position de OBJET (dans le type T ou le type de base du sous type T).

Exemple : T_MAJUSCULESPOS(A) vaut 65 et pas 0 ! On ne relativise pas par rapport au sous type ! TVAL(X) : X est valeur entire. Rend la valeur dans le type T (discret) ou le type de base du sous type T dont le numro est la valeur entire X. TSUCC(OBJET) : OBJET est considr comme instance du type de base de T (scalaire). Rend la valeur dans le type de base de T immdiatement suprieure celui de OBJET. TPRED(OBJET) : OBJET est considr comme instance du type de base de T (scalaire). Rend la valeur dans le type de base de T immdiatement infrieure celui de OBJET.

Exemple : CHARACTERPOS(CHARACTERPRED(CHARACTERLAST)) vaut 254. TIMAGE(OBJET) : OBJET est considr comme instance du type de base de T (scalaire). Rend la chane de caractres identique la valeur de OBJET. TVALUE(CHAIN) : CHAIN est de type STRING, le rsultat est du type de base de T (scalaire) cest la valeur associe correspondante. TMAX (OBJET1,OBJET2) est une fonction qui rend la valeur maximale des valeurs de OBJET1 et de OBJET2. TMIN (OBJET1,OBJET2) est une fonction qui rend la valeur minimale des valeurs de OBJET1 et de OBJET2.

Remarques : On doit se souvenir que VAL et POS dune part, et dautre part que IMAGE et VALUE sont des fonctions rciproques. MAX et MIN oprent sur tout type scalaire donc aussi sur les rels. IMAGE, VALUE, SUCC, PRED et WIDTH aussi dailleurs. Seuls VAL et POS sont rservs aux types discrets ! Rappel ! On consultera souvent le document attributs prdfinis I (dans le fichier attribut1.doc sur le CDROM). Des questions sur la connaissance des attributs tombent souvent aux partiels ! Quon se le dise !

D. Feneuille I.U.T 2001 (cours n2 fichier COURS2.DOC) 30/06/02

Dclaration de type (DS) :

type

identificateur

is

dfinition de type

discriminant

dclaration de type priv

Conversion de type (DS) :

nom du type

expression

nom du sous-type

Notez cet apostrophe Expression qualifie (DS) :


nom du type ( expression )

nom du sous-type

agrgat

Dclaration de sous type (DS) :


subtype identificateur is nom de type

contrainte

D. Feneuille I.U.T 2001 (cours n2 fichier COURS2.DOC) 30/06/02

10

Exercices sur le cours n2 (ada)

Thme : Prparer sur papier des algorithmes Ada puis les saisir en temps diffr, les faire tourner, en cas de problme venez aux ateliers du jeudi aprs midi. La notion de date sous la forme labore (exercice 3) : jour, n du jour, mois et anne est le centre de l'tude raliser (difficile!). Lecture conseille : cahier pdagogique n1 (fichier cahier1.doc). Travaillez prenez de la peine! Ces exercices sont des dfis qui vous sont lancs, relevez les. Il serait dommage que vous ne vous y atteliez pas, car seul le travail sur machine paiera! Nattendez pas les corrigs (ils seront mis votre disposition), les lire sera bien mais condition de les comparer votre solution. Concepts : Les attributs lmentaires, l'utilisation de la ressource P_E_SORTIE, les types numratifs et les sous types, modle de saisie d'un type numratif. Travail raliser : (il y a deux exercices faciles mais le troisime est ardu !) On considre les dclarations suivantes (extraites d'un programme simple) : type T_JOUR is (LUNDI,MARDI,MERCREDI,JEUDI,VENDREDI,SAMEDI,DIMANCHE); type T_FRUIT is (ORANGE,POMME,POIRE); subtype T_JOUR_OUVRABLE is T_JOUR range LUNDI..VENDREDI; subtype T_FIN_SEMAINE is T_JOUR range SAMEDI..DIMANCHE; type T_ENTIER is range 8..23000; LE_JOUR ENTIER NATUREL L_ENTIER : T_FIN_SEMAINE : INTEGER : NATURAL : T_ENTIER := DIMANCHE; := -6; -- entier prdfini := 6; := 10;

On remarque deux types numratifs dclars avec deux sous types et la dclaration d'un type entier contraint entre 8 et 23000. Quatre variables sont dclares ensuite et initialises. Exercice n 1: Evaluer les expressions (consultez "attributs prdfinis ...." fichier attribut1.doc) : Question_1 : T_JOUR'SUCC(T_JOUR_OUVRABLE'LAST) Question_2 : T_JOUR_OUVRABLE'SUCC(T_JOUR_OUVRABLE'LAST) Question_3 : T_FRUIT'POS (POIRE) Question_4 : INTEGER'POS(ENTIER) Question_5 : NATURAL'POS(NATUREL) Question_6 : T_FIN_SEMAINE'POS(LE_JOUR) Question_7 : T_ENTIER'POS(L_ENTIER) Aide : On trouvera en partie commune sur machine le programme dont est extrait cet exercice. On copiera le fichier associ (EXO1_SUP.ADB) dans sa partition et on lui fera subir le cycle classique : compilation, dition de liens puis excution pour vrifier les questions poses (ceci constituera le corrig).

D. Feneuille I.U.T 2001 (cours n2 fichier COURS2.DOC) 30/06/02

11
Exercice n 2 ( faire aprs le cours n3): Il s'agit de donner le nombre de jours d'un mois donn. On rappelle que les mois de AVRIL, JUIN, SEPTEMBRE et NOVEMBRE font 30 jours, le mois de FEVRIER fait 28 ou 29 jours et tous les autres 31! Vous partirez des dclarations suivantes : with P_E_SORTIE; procedure EXO2_SUP is type T_MOIS is (JANVIER,FEVRIER,MARS,AVRIL,MAI,JUIN,JUILLET, AOUT,SEPTEMBRE,OCTOBRE,NOVEMBRE,DECEMBRE); subtype T_ANNEE is POSITIVE range 1582..9999; MOIS : T_MOIS; ANNEE : T_ANNEE; Aide : l'algorithme est simple raliser (en trois parties) dans lordre suivant : saisie du mois MOIS on utilisera le modle de sais ie d'un numratif (cf. paquetage P_E_SORTIE) avec un bloc. test de la rponse : si c'est avril, juin, septembre ou novembre alors 30 sinon si c'est fvrier alors demande de l'anne (utiliser LIRE de P_E_SORTIE c'est valid) et on dcide si c'est 28 ou 29 (voir cahier pdagogique n1) et enfin si ce n'est pas fvrier le mois fait 31 jours. On ditera l'cran "ce mois fait x jours". Ce petit programme fait une bonne page de listing et fait bien le tour des if imbriqus et d'autres simples lments algorithmiques.

Cet algorithme sera ensuite propos en corrig (partie commune) mais il est recommand de sy frotter avant ! Ne vous contentez pas de prendre et lire les corrigs ! Ceci dit cest dj bien car certains ne le feront pas (attention!). Exercice n 3 : Attention cet exercice n'est pas du gteau car c'est plutt long. On commencera l'analyse de ce travail qui sera mettre au point progressivement. Bel investissement. Connaissant une date sous la forme jour, numro du jour, mois et anne il faut diter la date complte du lendemain (voyez l'excutable EXO3_SUP sur machine). Exemple : DIMANCHE 28 FEVRIER 1900 LUNDI 1 MARS 1900 Conseils : Partagez votre travail en deux parties : 1. prise en compte de la date initiale. Au dbut, vitez cette partie en faisant une initialisation la dclaration (version statique). Plus tard (quand la partie 2 sera crite) faites une saisie des 4 composants d'une date dans l'ordre suivant : (anne, mois, n puis jour) pour faire des tests dynamiques. 2. dcision sur le lendemain (c'est la partie finalement la plus courte). Pour viter des saisies fastidieuses on peut crer un fichier textes une fois pour toute contenant ( raison dune par ligne) la saisie dune date. Puis lexcution on redirige les entres dans le fichier textes. A voir en TP. Bon courage ! Lenfer commence ! Fin semaine 2 !

D. Feneuille I.U.T 2001 (cours n2 fichier COURS2.DOC) 30/06/02

Cours n 3 Ada : les instructions (2 heures) semaine 3

Thme : les instructions de base (rptitive, alternative, bloc, dclarations)


Certains des concepts, lists ci-dessus, ont dj t vus ou voqus prcdemment mais succinctement. Cest le moment de concrtiser avec rigueur ces instructions fondamentales qui composent statistiquement la moiti dun codage Ada. Malheureusement ce nest pas pour autant que nous sommes la moiti de notre effort!

Les instructions rptitives


Le schma algorithmique rpter est, en Ada, cod laide de la structure loop . Le D.S. a dj t propos dans la partie correspondante du cours n1. Etudions-le en dtail aprs lavoir rappel. instruction loop :

nom simple de boucle

schma ditration

loop

suite dinstructions

end loop

nom simple de boucle Pour tre complet il faut finir les 3 parties en attente dont la dfinition est retarde, savoir : nom simple de boucle, schma ditration et suite dinstructions. Nom simple de boucle est tout simplement un identificateur Ada qui permet de nommer ou caractriser la boucle. Cette technique permettra de sortir de boucles imbriques ( revoir dans Barnes page 110). La notion de suite dinstructions est lmentaire. Soit le D.S. : suite dinstructions : instruction ;

La seule remarque importante est quil faut au moins une instruction, mais exit en est une ( la rigueur linstruction vide null qui ne fait rien !). Exemple simple mais formel : BOUCLE_1 : -- cest le nom de la boucle loop ........ exit when (condition); ........ end loop BOUCLE_1; Il ny a rien de bien nouveau si ce nest ltiquetage de la boucle avec BOUCLE_1.

2
Schma ditration : En plus du codage de la condition de sortie, avec exit when, on peut utiliser le trs traditionnel tant que ( outil que possde tous les langages). Cette technique napporte rien de plus puisquelle nest que la contrapose de la condition de sortie (le tant que exprimant la condition pour rester dans la boucle ). Mais, le tant que (while) ne peut sinscrire quen tte du loop (et une seule fois) perdant ainsi la belle proprit du exit qui pouvait tre partout dans la boucle (et mme de multiples endroits). Voyons un exemple (bien connu cf. Algorithmique!) : loop exit when (FIN_RUBAN); LIRE; ....... end loop; se code autrement avec le tant que ainsi : while not (FIN_RUBAN) loop LIRE; ....... end loop; tant que (non fin de ruban) rpter LIRE ....... fin rpter Jusqu (fin de ruban) rpter LIRE ....... fin rpter

Les concepteurs du langage Ada ont propos le tant que (le while) pour sduire les programmeurs qui auraient t fchs de ne pas retrouver leur bon vieil outil ! Ceci permet ainsi de traduire facilement en Ada des algorithmes crits dans un autre langage acceptant le while. Le while et le exit when qui permettent de traduire respectivement le tant que et le jusqu sont compatibles dans un loop : on peut prfixer la boucle avec un while et en plus ajouter des exit when partout ! Ces deux outils permettent de coder des structures rptitives conditionnelles. Il s'agit dans ce cas d'une itration indtermine d'un nonc. Il en va autrement si lon connat a priori le nombre de rptitions effectuer ; par exemple diter les lettres majuscules. On peut bien sr toujours crire : CAR := A; -- CAR est dclarer ainsi CAR : CHARACTER; loop ECRIRE (CAR); exit when (CAR = Z); CAR := CHARACTERSUCC(CAR); end loop; Mais Ada permet (comme les autres bons langages) une commodit : la boucle for. Par exemple (traduisons le mme algorithme) : for CAR in CHARACTER range A..Z loop ECRIRE (CAR); end loop; et cest fini. Ada soccupe de tout : la dclaration de CAR nest plus faire (alors quelle devait ltre avec le exit), linitialisation avec A est faite implicitement, lvolution de la valeur et larrt sont grs automatiquement. On met en garde contre la tentation de ne pas typer lintervalle. Par exemple si on crit : for CAR in A..Z loop ECRIRE (CAR); end loop; D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

3
la place de : for CAR in CHARACTER range A..Z loop ECRIRE (CAR); end loop; le compilateur ne peut dterminer le type de CAR ! En effet noublions pas que sil existe bien un type CHARACTER il existe aussi le type Wide_Character sur-ensemble de Character. Lintervalle A..Z appartient aux deux ensembles ! Dans le mme ordre dide voyons un exemple (cf. Barnes pages 108-109) avec surcharge didentificateurs : type T_Plantes is (Mercure, Vnus, Terre, Mars, Jupiter, Saturne, Uranus, Neptune, Pluton) ; type T_Dieux is (Janus, Mars, Junon, Vestales, Vulcain, Saturne, Mercure, Minerve) ; Remarquez que Ada permet les accents mme dans les identificateurs ! (Vnus, T_Plantes) Si lon crit : for IND in Mars..Saturne loop .. end loop ; Problme !

lintervalle Mars..Saturne est ambigu le compilateur ne sait pas dcider dans quel type il faut raliser IND (en Ada rien nest implicite) il faut aider le compilateur. Par exemple en qualifiant une des bornes : for IND in T_Plantes( Mars)..Saturne loop .. end loop ; il ny a plus ambigu t . Mais le plus lisible est encore de typer lintervalle ainsi : for IND in T_Plantes range Mars..Saturne loop .. end loop ; Si un sous type existe dj par exemple : subtype T_Explorer is T_Plantes range Mars..Saturne ; alors lcriture peut se restreindre : for IND in T_Explorer loop .. end loop ; Variante !

Qualification !

Mieux !

Cette structure for est trs pratique (elle existe aussi dans de nombreux langages). Elle trouve sa pleine utilisation dans les parcours de tableaux notamment (nous reverrons cela ds le cours suivant et plus tard).

D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

4
Le while et le for sont rgis syntaxiquement par la dfinition schma ditration (retarde dans le D.S. gnral plus haut). Do : schma ditration : for while spcification du paramtre boucle condition

spcification du paramtre boucle : identificateur in reverse intervalle discret

intervalle discret : indication de sous type discret

intervalle Exemple (notez ici le reverse) : for CAR in reverse CHARACTER range a..r loop ECRIRE (CAR); end loop; dite la ligne suivante : rqponmlkjihgfedcba cest--dire lenvers (et cause du reverse) ou autrement (codage plus traditionnel) sans le for qui tait pourtant bien pratique : CAR := r; -- ici CAR doit tre dclar en plus et au dessus ! loop ECRIRE (CAR); exit when (CAR = a); CAR := CHARACTERPRED(CAR); end loop; Attention (pige) : ne pas crire ( la place du reverse) : for CAR in CHARACTER range r..a ...... cette criture nest pas fausse (syntaxiquement!) elle na que linconvnient de prsenter un intervalle vide (r..a) et alors la boucle ne se fait pas puisque le test darrt est vrai tout de suite ! Remarques : Le paramtre de boucle nomm par l'identificateur ( CAR dans notre exemple) est une variable locale l'instruction de boucle for. Son type (en labsence de typage explicite) est celui de l'intervalle discret. Ce paramtre ne sera pas dclar dans le module dans lequel il est utilis. Ce paramtre ne peut tre modifi mais il peut tre utilis. Sa valeur n'est plus accessible aprs la sortie de boucle car l'objet n'existe plus. Sa dure de vie se rduit la porte de la boucle (loop...end loop). Entre chaque itration le paramtre prend pour valeur le successeur dans l'ensemble auquel il appartient ou le prdcesseur si on utilise l'option reverse. Il vaut mieux parler du successeur, que du "pas de variation", qui fait trop rfrence aux entiers. On peut toujours sortir au milieu dune boucle for avec des exit (sortie imprative) ou des exit when (sortie conditionnelle). D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

5 Les instructions alternatives

L'instruction de choix : if
Nous avons vu en Algorithmique (et en codage Ada associ) l'instruction de choix if dans sa forme simple (if then .. end if) et dans sa forme double (if then .. else .. end if). En Ada l'instruction if peut grer bien plus que ces deux cas. La syntaxe est la suivante (D.S. dj propos dans le cours n1!) : instruction if :

if

expression

then

suite dinstructions

elsif

expression

then

suite dinstructions

else

suite dinstructions

end if

Ce qui nous intresse ici cest, au milieu, la cascade de elsif que lon peut intercaler entre le then et le else. Le elsif signifie else if mais nimplique pas de end if. Cette forme permet de grer efficacement la succession de plusieurs if avec un seul end if. Lexpression est boolenne videmment. Exemple : type ( voir dans l'exercice : nombre de jours dun mois exercice n2 du cours n2 !) T_MOIS is (JANVIER, FEVRIER, MARS, AVRIL, MAI, JUIN, JUILLET, AOUT, SEPTEMBRE, NOVEMBRE, DECEMBRE);

MOIS : T_MOIS; if MOIS = FEVRIER then .....- le mois fait 28 ou 29 jours elsif (MOIS = AVRIL) or (MOIS = JUIN) or (MOIS = SEPTEMBRE) or (MOIS = NOVEMBRE) then ....- le mois fait 30 jours else -- ce sont les autres mois restants : MARS, MAI,.... .....- le mois fait 31 jours end if; Rappel : plusieurs branches elsif peuvent tre prsentes (ce nest pas le cas ici). Nous verrons de nombreuses applications dans les TD et TP Ada.

D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

6 L'instruction de choix multiple (sur valeur discrte) : case


Voyons le D.S. : instruction case : case expression discrte is

alternative de case

end

case

alternative de case : when choix => suite dinstructions

| choix :

nom simple de composant

intervalle discret

expression simple

others

Cette structure permet de choisir entre plusieurs squences d'instructions pour plusieurs valeurs d'une expression discrte. C'est la valeur de l'expression discrte qui fixe la squence choisie. Une instruction choix multiple a la forme gnrale suivante (toutes les possibilits sont prsentes) : case expression is when valeur_1 => .......... when valeur_2 | ........... | valeurs_n => ........... when valeur_dbut..valeur_fin => ............ when others => ............. end case; Lexpression et les choix ou cas (conditions du when) doivent tre d'un mme type discret. Toutes les valeurs possibles de l'expression doivent figurer une fois et une seule. Le choix others doit tre utilis dans la dernire branche pour couvrir toutes les valeurs qui n'ont pas t donnes dans les alternatives prcdentes. Si toutes les valeurs ont t examins le choix others nest pas obligatoire. Si certains choix ne ncessitent aucune instruction, l'instruction null doit tre utilise. Rappelons que le type discret exclut les rels; ne pas confondre le type discret avec le type scalaire (qui regroupe type rels et type discret). D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

7
Exemple : type T_MENTION is (MAUVAIS, PASSABLE, ASSEZ_BIEN, BIEN, TRES_BIEN);

NOTE LA_MENTION case

: INTEGER; -- dclaration pas terrible. : T_MENTION;

NOTE is when 0 | 1 | 2 | 3 | 4 when 5 | 6 | 7 | 8 when 9..12 when 13 | 14 | 15 when 16..20 when others

=> => => => => =>

LA_MENTION := MAUVAIS; LA_MENTION := PASSABLE; LA_MENTION := ASSEZ_BIEN; LA_MENTION := BIEN; LA_MENTION := TRES_BIEN; null; -- obligatoire car NOTE est -- dclare INTEGER!

end case; Autre exemple (plus intelligent !) : subtype T_UNE NOTE is INTEGER range 0..20; -- c'est mieux LA_NOTE LA_MENTION : T_UNE NOTE; : T_MENTION;

case LA_NOTE is when 0..4 when 5..8 when 9..12 when 13..15 when 16..20 end case;

=> => => => =>

LA_MENTION LA_MENTION LA_MENTION LA_MENTION LA_MENTION

:= := := := :=

MAUVAIS; PASSABLE; ASSEZ_BIEN; BIEN; TRES_BIEN;

La branche others n'est maintenant pas utilise, car toutes les valeurs du type numratif T_UNE_NOTE sont envisages. Ce ne serait pas une faute de laisser le others (mais il ne sert rien !).

Linstruction bloc :
Voyons un bon exemple connu (lecture valide dun type discret cf. Paquetage P_E_SORTIE) : loop declare CHAI : UNBOUNDED_STRING; begin LIRE (CHAI); VAR_DISCRET := T_DISCRET'VALUE(TO_STRING(CHAI)); exit; exception when others => null; -- ou message ECRIRE("xxxxx"); end; end loop; Linstruction bloc est, ici, encapsule dans une structure rptitive loop.

D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

8
Le D.S. : instruction bloc :

nom simple de bloc

declare

partie dclarative

begin

suite dinstructions

exception

traite exception

end

nom simple de bloc

Le chemin minimum (obligatoire) est en trait plus gras! On remarque que lon peut nommer un bloc (comme pour une boucle loop ), que lon peut dclarer des objets momentanment (cest--dire dans la porte du bloc entre les begin et end). Le traitement dexception (compliqu) sera tudi en dtail dans le cours n8.

Dclarations des objets (pour aujourdhui : types, variables et constantes).


Un des endroits privilgis pour dclarer ces objets est la partie dite dclarative dun bloc (voir ci-dessus) mais aussi dans la partie dclarative dune procdure ou dune fonction entre le profil et le begin (dbut du corps). On verra le D.S. de ces deux concepts au cours n5 voyons schmatiquement lendroit : procedure NOM_DE_LA_PROCEDURE is partie dclarative begin ........ end NOM_DE_LA_PROCEDURE; profil

corps de la procdure

Les dclarations de types (ou de sous types) sont prcds du mot cl type (ou subtype!). Les dclarations de variables commencent par lcriture de lidentificateur suivi de : , quant la dclaration dune constante elle a t vue en D.S. (constante universelle). Voyons dautres exemples : dclarations de constantes types : DIX_MILLE RACINE_2 DEPART VRAIE : : : : constant constant constant constant INTEGER FLOAT CHARACTER BOOLEAN := := := := 10_000; 1.414; A; TRUE;

les constantes universelles (absence de type) ont t vues : en illustration des DS au cours n1! D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

9
dclarations de variables : CLASSE TAUX_TVA CARCOU NB_DE_LE : : : : BOOLEAN; FLOAT CHARACTER; T_COMPTEUR

:= 20.5; := 0;

On peut initialiser a priori la variable avec une valeur particulire (bonne habitude).

Quelques exercices faciles : (travaillez, prenez de la peine!)


Exercice n 1 : Montrez que la squence suivante : for IND in 1..5 loop ..... traitement utilisant IND end loop; ne peut pas toujours se traduire par : IND := 1; while IND <= 5 loop ..... traitement utilisant IND IND := IND + 1; end loop; Rflchissez !

Aide : imaginez ce qui se passe avec IND (dans le deuxime schma) typ et dclar par : subtype T_INDICE is INTEGER range 1..5; IND : T_INDICE; Exercice n 2 (EXO2_C3.ADB) : Ecrire un petit programme qui : dite lcran les 10 premiers nombres entiers dite lcran les lettres minuscules dans lordre normal dite lcran les lettres majuscules dans lordre inverse

Exercice n 3 (EXO3_C3.ADB) : Ecrire un programme qui lit (un un) une suite de nombres entiers non nuls. La fin de la saisie est marque par la saisie du nombre nul. Calculez et ditez la moyenne arithmtique des nombres. Rappel : Il y avait des exercices (plus difficiles !) en annexe du cours n2. A faire (pour progresser !)

BON courage!

D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

10 Je retiens n1
Quelques termes, informations ou conseils retenir aprs deux bonnes semaines de cours Ada. Le terme statique sapplique aux informations dterminables la compilation. Le terme dynamique sapplique aux informations dterminables lexcution. La typographie dune lettre (majuscule ou minuscule) est sans importance sauf dans les littraux chanes (STRING) et dans les littraux caractres (CHARACTER). Les littraux chanes sont dlimits par des guillemets () et les littraux caractres par des apostrophes (). Un littral chane peut tre vide , un littral caractre ne peut ltre (LATIN_1.NUL nest pas vide!). Les espaces ne sont pas permis dans les identificateurs, les mots rservs, les littraux numriques etc. Les espaces sont permis dans les chanes et les commentaires. La prsence dun point permet de distinguer les littraux numriques rels des littraux numriques entiers. Le trait bas (_) est significatif dans les identificateurs mais pas dans les littraux numriques. Un littral numrique entier ne peut pas avoir dexposant ngatif. Le signe - (et ventuellement +) ne fait pas partie de la dfinition syntaxique dun littral numrique cest un oprateur unaire. Compiler cest laction (ou la commande) qui prsente au compilateur un fichier (source) contenant du codage Ada dont on souhaite contrler la syntaxe. En cas de succs, le gestionnaire de bibliothque (library) le rpertorie laide de son identificateur de procdure ou de paquetage. Faire ldition de liens cest laction qui demande lditeur de liens (link) de construire un programme excutable. Seuls les procdures peuvent tre linkes et non les paquetages (qui sont des ressources). Lidentificateur fournir est celui figurant da ns la bibliothque il est rpertori aprs la compilation (et non celui du fichier compil). Avec gnat il est recommand de prendre le mme ! Les dclarations et les instructions sont termines par un point virgule. Laffectation est symbolise par := Une valeur peut tre affecte un objet ds sa dclaration (initialisation). Chaque dfinition de type introduit un type distinct. Attention aux types muets (dits aussi anonymes). Un sous type nest pas un nouveau type. Cest le type de base mais avec un contrainte ventuelle. Un type est statique. Un sous type peut ne pas ltre. Les types numriques (entiers et rels) ne se mlangent pas. Pas darithmtique mixte (sauf **). mod et rem sont seulement quivalents pour des oprandes de mme signe (positives ou ngatives). Les oprateurs arithmtiques ont des priorits diffrentes ( connatre). Un type scalaire nest jamais vide, son sous type peut ltre. POS, VAL, SUCC, PRED agissant sur un sous type agissent en fait sur le type de base. Mais FIRST et LAST par contre font bien rfrence au sous type. La quAlification utilise un Apostrophe. Signe J. Barnes ! Lordre dvaluation des oprateurs logiques binaires nest pas dfini dans la norme sauf pour or else et and then. Les terminaisons dinstructions structures (loop, if, case etc.) doivent se correspondre. Labus de elsif nest pas interdit ! Les alternatives de choix dans un case sont statiques. Toutes les possibilits du case doivent tre couvertes (daprs le type de lexpression slecte). Dans le case si others est utilis il doit tre lunique choix de la dernire alternative . On peut qualifier lexpression slecte dun case pour diminuer le nombre des alternatives. Un paramtre de boucle for se comporte comme une variable locale du loop. Un loop nomm (ou un bloc nomm) doit comporter un nom ses deux extrmits. Pour avoir des listing propres utilisez un reformateur (sous Linux cest un script identifi par gnatform sur notre systme; sous NT il est inclus dans lenvironnement AdaGide). Utilisez la commande dimpression I. Voir aussi le questionnaire fin du cours n1 !

Editer encore un fichier intressant (sur le CDRom : cahier1.doc). Visitez les sites de Ada_et_le_Web.html.

D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

1 Cours n 4 Ada les tableaux (2 heures)

Thme : Le type tableau.


Le type tableau est un type composite (revoir la classification des types cours n2 page 7). Un type composite permet de regrouper plusieurs lments dans une mme structure. On verra dans une semaine lautre type composite cest--dire le type article (record) cours n6. Lintrt de regrouper, sous une mme entit, des lments que lon appelle des composants est fort utile en informatique. Lintrt des tableaux (on parle aussi de vecteurs quand ils sont mono-indics) est reconnu depuis lavnement des premiers langages (le FORTRAN par exemple). On va voir cette semaine (n3) en Algorithmique la manipulation des entits MOTS que lon pourra, en Ada, raliser (on dit aussi implmenter) avec des tableaux. Un objet tableau est un objet compos d'lments qui sont tous du mme type. Les lments sont accessibles (et reprs) au moyen d'indices (on parle aussi dindex). Il y a donc deux concepts dans un type tableau Ada : le ou les indices du tableau dune part et les composants du tableau dautre part. La dfinition d'un tableau comportera : dune part la dfinition du type des indices (type discret seulement) donc : type numratif ou type entier et dautre part la dfinition du type des lments (ou composants) du tableau (tout type sans limite).

En Ada (gros apport) nous pourrons dfinir (voir le D.S. dans le cours n1) des modles de type tableau dans lesquels les domaines des indices sont incompltement spcifis (on parle de tableaux non contraints car la plage dindices est imprcise ). Mais, de faon effective, on travaillera, finalement ( lexcution), sur des tableaux contraints cest--dire dont lintervalle est connu et born. Cette notion l nest pas facile. De faon gnrale on a le D.S. dfinition dun type tableau (et pour faire court !) :

type

identificateur

is

array

Contrainte indice

Sous type indice

of

Sous type composant

Exemples (attention ici : type tableaux non contraints ou modle de tableaux) : type type type type type T_VECTEUR1 is array (POSITIVE range <>) of FLOAT; T_VECTEUR2 is array (NATURAL range <>) of INTEGER; T_VECTEUR_DE_B is array (CHARACTER range <>) of BOOLEAN; T_MAT is array (T_ENTIER range <>,T_ENTIER range <>) of FLOAT; T_NOM is array (INTEGER range <>) of STRING (1..30);

La notation <> s'appelle bote (box en anglais) elle indique que lintervalle des indices est retarde (avec range). A partir de ces types de base il est possible de dclarer des objets l'aide de contraintes d'indice. Exemples (dinstanciation i.e. de dclaration dobjets de type tableau): VECT_N VECT_B : T_VECTEUR1 (1..10); -- 10 composants rels : T_VECTEUR_DE_B (A..T); -- 20 composants boolens D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

2
A cette faon de procder, on prfrera la squence suivante : 1) Donner la dfinition d'indice mais contrainte par un intervalle : subtype subtype T_INDICE_N T_INDICE_B is POSITIVE range 1..10; is CHARACTER range A..T;

2) Instancier les objets de la faon suivante : VECT_N VECT_B : T_VECTEUR1 (T_INDICE_N); : T_VECTEUR_DE_B (T_INDICE_B); Cest plus long mais cest une bonne mthode !

ou mieux encore aprs ltape 1: 2) dclarer un sous type tableau subtype T_VECT1_10 is T_VECTEUR1 (T_INDICE_N); (Le sous type tableau T_VECT1_10 devient alors contraint) 3) et instancier des objets de la faon suivante : VECT_N : T_VECT1_10;

La plupart des oprations sur les objets tableaux cest--dire sur les instances de type tableaux portent presque toujours sur les composants du tableau. On nomme (ou on distingue) le ou les composants : soit individuellement (on cite la valeur de lindice associ lidentificateur de linstance). Par exemple VECT_N(2) := 1.5; on travaille avec le composant dindice repr par le numro 2. Ou encore VECT_B(G) := TRUE ; lindice est de type caractre et le composant est de type boolen ! soit par paquet (on cite lintervalle ou tranche dindice). Par exemple avec la notation VECT_N(4..8) on travaille avec 5 composants la fois (joli mais revoir !). ou encore globalement (il suffit de citer seulement lidentificateur de linstance sans indice). Par exemple avec VECT_N (qui signifie VECT_N(1..10)) on travaille alors avec tous les composants ensembles.

Mais on verra que lon peut mettre en vre des oprations sur les indices dun tableau grce aux attributs. u

Gnralits sur les types tableaux (tranche ou global).


Quelques prcisions (pour les objets tableaux manipuls en tranche ou globalement). Les tableaux appartiennent aux types affectation si le type des composants permet laffectation. Les oprations d'affectation et de test d'galit et d'ingalit sont donc autorises sur tous les tableaux de mme type (de composants et dindices) et de mmes dimensions. Ces oprations portent sur les composants videmment. Pour les tableaux unidimensionnels les oprations supplmentaires comprennent les oprateurs relationnels ( , >, <= et >=) si le type des < composants des tableaux est un type discret (ce qui exclut les rels ) et on a aussi loprateur de concatnation (&) voir exemple plus loin. De plus si le type des composants est un type boolen, alors les oprations comprennent aussi l'oprateur logique (unaire) not et les oprateurs logiques and, or, et xor. Oprateur d'galit (rgle) : Pour deux valeurs tableaux l'oprande de gauche est gal l'oprande de droite si pour chaque composant de l'oprande de gauche il existe un composant homologue de l'oprande de droite qui est identique. Oprateur de relation (rgles) : Un tableau vide sera toujours infrieur un tableau contenant au moins un composant. Pour des t ableaux non vides l'oprande de gauche est infrieur celui de droite ds que le premier composant de l'oprande de gauche est infrieur son homologue de loprande de droite. On peut donc comparer des tableaux unidimensionnels de tailles diffrentes mais de composants discrets (rappel !). D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

3
Par exemple (les littraux chanes caractres tant aussi des tableaux !) : Anticonstitutionnellement est infrieur Zoulou ! cf. le dictionnaire ! de mme (et cest a priori plus surprenant) : 320 est suprieur 2999. Attention ne pas confondre avec les valeurs numriques 320 et 2999 ! Exemples (dclarations et utilisations) : type T_VECT_CAR subtype T_INDICE subtype T_MOTS PREMOT, MOTCOU : is array is is (POSITIVE range <>) of CHARACTER;

POSITIVE range 1..20; T_VECT_CAR (T_INDICE);

T_MOTS;

PREMOT et MOTCOU sont alors des objets tableaux de 20 caractres indics de 1 20. Quelques exemples (ici 4 exemples) doprations possibles : PREMOT (11..13):= PREMOT (14) & MOTCOU (18..19); PREMOT(8) := PREMOT (2); if PREMOT (2..4) /= MOTCOU (4..6) Tranches diffrentes ! then ..... exit when MOTCOU (1..8) > MOTCOU (3..6);

Tableaux de tableaux.
Exemples : type T_LIGNE is array (POSITIVE range <>) of CHARACTER; subtype T_INDICE_COLONNE is POSITIVE range 1..80; type T_ECRAN is array (POSITIVE range <>) of T_LIGNE (T_INDICE_COLONNE); subtype T_INDICE_LIGNE is POSITIVE range 1..24; ECRAN LIGNE On peut crire : : T_ECRAN (T_INDICE_LIGNE); T_LIGNE (T_INDICE_COLONNE); Notez bien : (3) (2) diffrent du multiindiage ( suivre)

ECRAN(2) ECRAN(3) (2)

:= LIGNE; -- 2ime ligne := 'A'; -- 3ime ligne et

2ime caractre

Remarque : le composant (dans un tableau de tableaux) est donc lui mme un tableau ! A la dclaration du tableau de tableaux le composant doit tre un tableau contraint.

Multi-indice.
Une dclaration de type tableau peut faire intervenir plusieurs indices ( ne pas confondre avec le tableau de tableaux vu prcdemment). Notez la virgule entre les indices dans la parenthse. Cest traditionnellement en mathmatiques (ou analyse numrique) limplmentation idale pour travailler avec des matrices . Exemple : type T_MAT subtype subtype is array (INTEGER range <>, INTEGER range <>) of FLOAT; is POSITIVE is POSITIVE : range range 1..20; 1..10; Notation MATRICE(3,2) pour utiliser la troisime ligne et deuxime colonne

T_COL T_LIG

MATRICE, MAT1, MAT2

T_MAT (T_LIG, T_COL);

D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

4 Attributs portant sur les tableaux :


Les attributs sont intressants pour travailler, a priori, avec des variables tableaux dont le type dindice est retard, plus prcisment pour travailler avec des paramtres tableaux non contraints. On verra cela ds le cours n5 avec les sous-programmes. Pour le moment on admettra que lon peut faire rfrence des travaux portant sur des objets tableaux non contraints cest--dire des tableaux dont la plage dindices nest p as encore fixe compltement. Cette plage sera fixe plus tard et on va, avec les attributs faire rfrence cette situation par anticipation ! Les attributs sont cependant aussi utilisables systmatiquement avec des objets (ou instances) de tableaux contraints. Mais ils perdent de leur puissance puisque la contrainte est connue. Liste des attributs permettant les oprations sur les tableaux (mais en fait ils portent sur les indices) : FIRST LAST FIRST(N) LAST(N) RANGE LENGTH RANGE(N) LENGTH(N) VECT_B et VECT_N sont dfinis et dclars page 2 !

FIRST rend la valeur de l'indice du premier composant. Exemple : VECT_BFIRST vaut A LAST rend la valeur de l'indice du dernier composant. Exemple : VECT_NLAST vaut 10 RANGE rend lintervalle des indices du tableau. Utile pour une boucle for. A voir plus bas. LENGTH rend le nombre d'lments du tableau (nombre effectif de composants). Exemple : VECT_BLENGTH vaut 20 (nombre dindices dans lintervalle A..T) Remarque importante : Les attributs portent sur les (ou font rfrence aux) instances de type tableau (c'est nouveau !1) mais ils agissent en fait sur le type des indices du tableau en question mais ... quand lindice sera contraint. On note toujours lopration avec lapostrophe mais le prfixe nest plus un type (comme au cours n2) cest (le plus souvent) lidentificateur du tableau. Dur, dur ! Voyons cela. Exemples : PREMOT'RANGE est l'intervalle entier 1..20 (type T_MOTS page prcdente) mais n'est pas identique T_INDICE car ce nest ni un type ni un sous type. De mme : PREMOT'FIRST vaut 1 et PREMOT'LAST vaut 20. Avec ces notations il n'est pas ncessaire de connatre ou de se rappeler l'identificateur (ici T_INDICE) du sous type intervalle d'indice contraint ! Si lon change la ligne suivante telle que : subtype T_INDICE is POSITIVE range 4..19;

sans modifier les autres dclarations on a alors respectivement les nouvelles valeurs 4..19, 4, 19 pour les trois attributs prcdents et 16 pour lexpression : PREMOTLENGTH. Attention : 'RANGE ne donne pas un type mais un intervalle (dj dit). Cest une erreur courante des tudiants. On ne peut pas par exemple crire PREMOT'RANGE'SUCC(IND) ni IND : PREMOT'RANGE; Si un tableau possde plusieurs indices (par exemple les objets prcdemment dclars MAT1 ou MAT2), il faut indiquer le numro de la dimension pour les 3 attributs FIRST, LAST et RANGE. Exemples : MAT1'FIRST(1) vaut MAT1'RANGE(2) vaut ou encore MAT1'LAST(1) MAT2'LAST(2)
1

1 1..20

vaut vaut

10 20

Jusqu maintenant les attributs tait dnots sur des types (exemple : CHARACTERRANGE) D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

5 L'agrgation et les agrgats.


C'est une opration spcifique aux types composites (ici donc sur les types tableaux). Elle est souvent utilise pour donner des valeurs initiales aux objets composs. On peut aussi lutiliser, dans lalgorithme, pour modifier des valeurs dun objet tableau. Il sagit, en fait, avec lagrgat, de littraux (comme on a pu le voir avec les autres types scalaires) mais cette fois ce sont des littraux tableaux (voir exemples plus bas). On travaille, avec lagrgation, sur le tableau en entier ou sur la tranche. Il est inutile de recourir aux agrgats pour initialiser un ou quelques composants isols car lagrgation oblige tous les citer. Lcriture dun agrgat ressemble celle dun numratif. Cest normal, car il faut numrer toutes les valeurs attendues. L'association (cest--dire la correspondance entre une valeur et un composant) ne doit tre faite quune seule fois dans lnumration. L'association se fait (il y a deux cas sexcluant) : 1) par position (dans lordre) TABLE(1..6):=(0,-2,7,4,5,-9); -- lordre est respect TABLE (3..5):=(5,8,12); 2) par nomination (on cite lindice puis la valeur associe aprs le symbole =>) TABLE(4..6):=(5..6 => 0,4 => 1); -- il ny a plus dordre TABLE(1..6):=(1..3 => 0,4..6 => 1); ou en ajoutant others (avec position ou avec nomination) mais une seule fois et la fin (voire seul !). TABLE TABLE TABLE TABLE TABLE : : : : : = = = = = (-2,4,9, others => 0); (others => 1);-- quivaut : (T_TABLE'FIRST..T_TABLE'LAST => 1); (1|3 => 0,2 => 1, others => 0); (1..3 => 1, others =>0);

On utilise le caractre | pour indiquer des positions non contigus. Attention dans les agrgats de tableaux on ne peut pas mlanger position et nomination. Les rgles de comportement ne sont pas simples. On va voir des exemples mais pour en savoir plus voyez une bonne rfrence : Barnes pages 123 128. Exemples quand le type tableau a plusieurs indices. type T_MATRICE(POSITIVE range <>, POSITIVE range <>) of INTEGER; ici un double indice : MATRI : T_MATRICE(1..3,1..4); -- matrice de 3 lignes et 4 colonnes MATRI := (others => (others => 0));-- tout est mis zro ou autre initialisation (diffrente de la mise zro totale) : MATRI : = ((1,2,3), (4,0,0), (5,0,0), (6,0,0));

D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

6
ou initialisation quivalente : MATRI : = ((1,2,3), (4,others => 0), (5,others => 0), (6,others => 0));

ou, toujours identique : MATRI := ((1,2,3), (1 = > 4,2..3 =>0), (1 = > 5,2..3 =>0), (1 = > 6,2..3 =>0));

Les STRING (chanes de caractres) type prdfini


L'utilisation des types non contraints est une activit assez frquente, en particulier lorsque l'on manipule des chanes de caractres. Jusqu' maintenant nous avons vit de manipuler le type prdfini STRING et mme aprs lavoir dcouvert nous lui prfrerons le plus souvent le type Unbounded_String. Nous en reparlerons. Il est temps d'examiner ce fameux type chane de caractres prdfini Ada, c'est--dire le type STRING pour une critique srieuse on peut consulter le cahier pdagogique n 4 (fichier cahier4.doc dans le CDRom) mais la lecture pour un dbutant nest pas vidente ! Le type STRING est prdfini par les dclarations suivantes (qu'il ne faut pas crire ! Puisque prdfini ). Cette dclaration (prdfinie) est faite, comme toujours, dans le paquetage STANDARD (on est pri de consulter le polycopi paquetages . !) : subtype type POSITIVE is STRING is INTEGER range 1..INTEGER'LAST; array (POSITIVE range <>) of CHARACTER;

On remarque ainsi que STRING est un type tableau de caractres non contraint ( cause du range <>). Pour manipuler des variables du type STRING il faut tout d'abord contraindre les indices. Par exemple : subtype T_STR is STRING(1..80);

puis instancier les objets : A, B : T_STR; ou directement instancier avec un type muet A, B : STRING(1..80); -sous-type anonyme

ou ventuellement avec initialisation (rappel des agrgats!) : A, B : STRING(1..80) := (others => ' ' ); -- mis blanc !

On peut galement crire des constantes STRING donc types : E : constant STRING := ""; -- vide! F : constant STRING := (1..0 => 'a'); -- vide aussi! HELLO : constant STRING := "Bonjour"; Lintervalle dindice pour les constantes STRING est dduit de laffectation ! pour HELLO cest 1..7. Pour les deux autres cest 1..0 (intervalle vide) ! Les valeurs extrmes des indices sont rarement utiles retenir (pour les utiliser), car les attributs FIRST et LAST suffisent les nommer. Il est possible de ne pas commencer le premier indice d'un STRING par 1 (il suffit dimaginer la manipulation dune tranche !) mais cest une utilisation rare car peu pratique.

D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

7
Remarque : Les oprateurs associs au type STRING sont ceux permis pour les types tableaux composants discrets (ce qui est bien le cas du type CHARACTER !) donc on a les 7 oprateurs =, /=, <, >, <=, >= et & (concatnation de caractres). Premiers problmes (on verra plus tard cours n5 ceux des paramtres STRING) 1) La saisie dun STRING nest pas vidente. Il existe dans le paquetage Ada.Text_Io deux procdures : GET ( rejeter) et GET_LINE (plus pratique). On en reparlera dans le cours 5 bis sur les entres-sorties. Utilisez pour le moment le LIRE de P_E_SORTIE mais sachez quil y a un ajout despaces si la saisie ne sature pas la variable (cest--dire si lon na pas tap autant de caractres que linstanciation en a dclars). Il reste un problme si on a tap exactement le nombre de caractres dclars mais ceci est une autre histoire ! 2) Les oprations traditionnelles sur les chanes de caractres reviennent souvent manipuler des tranches de tableaux de caractres. Il est possible d'affecter une tranche de tableau une autre tranche de tableau mais il faut (affectation oblige !) des tranches de mme taille (pas forcment de mme plage dindices). Il faut donc connatre les intervalles de ces tranches. Ce n'est pas toujours le cas, de faon simple. Voyons un exemple : Comment affecter une chane une autre chane si on ne connat pas, a priori, sa longueur ? Soit lexpression trs utilise : T_JOUR'IMAGE (JOUR)vue au cours 2. Cette criture donne un STRING puisque cest le rsultat de lattribut IMAGE (voir aussi le document attributs prdfinis I : fichier attribut1.doc). Ce rsultat ne porte pas en lui sa longueur ! Et cest bien le problme ! Comment affecter cette chane une variable CHAINE_80 de type T_STR sans savoir le nombre de caractres ? En deux instructions : LONG_CHAINE := T_JOUR'IMAGE(JOUR)'LENGTH;-- rcupre la taille du STRING CHAINE_80 (1..LONG_CHAINE) := T_JOUR'IMAGE (JOUR); -- vraie affectation La premire calcule la longueur de la chane image , la deuxime fait laffectation dans une tranche. On utilise, hlas, deux fois lopration T_JOUR'IMAGE(JOUR). C'est peut-tre lourd mais fort puissant et ... dynamique (c'est dire non fig et s'adaptant toute variable !). Cependant CHAINE_80 nest pas sature despaces la fin et il faut retenir (mmoriser) la valeur LONG_CHAINE pour travailler plus tard avec la longueur utile ! Dur ! Pour aider les programmeurs susceptibles dutiliser les chanes de caractres STRING Ada met leur disposition des paquetages (ressources) trs utiles : Ada.Strings et Ada.Strings.Fixed (une trentaine de sous programmes connatre et voir dans le polycopi paquetages ). Il existe aussi un paquetage trs simple mais tout aussi utile pour le traitement des caractres : Ada.Characters.Handling ( voir aussi). Recommandation : On essaiera rapidement (surtout quand on utilisera des variables de type chanes de caractres) de se servir du type Unbounded_String (qui transporte la longueur utile avec la variable et qui est extensible sans limite) voir la ressource (paquetage) Ada.Strings.Unbounded (analogue au paquetage Ada.Strings.Fixed cit ci-dessus). Le type Unbounded_String est identique dans son comportement au STRING du langage PASCAL (o la longueur utile est transporte dans le STRING lui-mme et non limit 255 caractres !) Si, par exemple, on a dclar une variable : CHAINE : Unbounded_String; en lieu et place d'un STRING comme CHAINE_80, il suffit d'crire en une instruction seulement : CHAINE := To_Unbounded_String (T_JOUR'IMAGE(JOUR)); La longueur est gre implicitement ! Plus souple non ? De mme la saisie dun Unbounded_String est extrmement facile utiliser : CHAINE := Get_Line ; -- cest tout ! Avec cette instruction le systme attend la frappe dautant de caractres que vous voulez jusqu la frappe de la touche Entre (synonyme de fin de saisie). Le nombre de caractres transports par CHAINE peut tre connu tout moment grce la fonction LENGTH (sorte dattribut !) avec lexpression LENGTH(CHAINE). D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

8
Exercice n2 du cours 2 (corrig) :
with Ada.Strings.Unbounded_String, P_E_Sortie; procedure EXO2_TD2 is type T_MOIS is (JANVIER,FEVRIER,MARS,AVRIL,MAI,JUIN,JUILLET, AOUT,SEPTEMBRE,OCTOBRE,NOVEMBRE,DECEMBRE); subtype T_ANNEE is POSITIVE range 1582..9999; MOIS : T_MOIS; ANNEE : T_ANNEE; begin P_E_SORTIE.ECRIRE ("entrez le mois s.v.p.:"); -- modle de saisie d'un numratif (cf. paquetage P_E_SORTIE) loop declare use Ada.Strings.Unbounded_String; REPONSE : Unbounded_STRING ; begin LIRE(REPONSE) ; MOIS := T_MOIS'VALUE(To_String(REPONSE)); -- ici exception possible exit; -- ici tout va bien exception when others => ECRIRE("pas valable recommencez:"); A_LA_LIGNE; end; end loop; -- fin du modle de saisie d'un numratif -- test de la rponse if (MOIS = AVRIL) or (MOIS = JUIN) or (MOIS = SEPTEMBRE) or (MOIS = NOVEMBRE) then P_E_SORTIE.ECRIRE("ce mois a 30 jours"); elsif MOIS = FEVRIER then loop declare use P_E_SORTIE; begin -- pour l'exception ECRIRE(" entrez l'anne : "); LIRE(ANNEE);-- ici tout va bien exit;-- sortie de boucle exception when others => ECRIRE("non conforme entre 1582 et 9999"); A_LA_LIGNE; end; -- ici reprise de boucle end loop; if ((ANNEE rem 4 = 0) and then (ANNEE rem 100 /= 0)) or else (ANNEE rem 400 = 0) then Voir le fichier P_E_SORTIE.ECRIRE ("ce mois a 29 jours"); cahier1.doc else P_E_SORTIE.ECRIRE ("ce mois a 28 jours"); end if; else -- tous les autres mois P_E_SORTIE.ECRIRE ("ce mois a 31 jours"); end if; P_E_SORTIE.A_LA_LIGNE; end EXO2_SUP; -- tester srieusement (prparer un jeu de test dans un fichier)

Exercice sur cet exercice remplacer le if par un case (facile). Remarques : Notez les portes du use limite au bloc dans lequel il est dclar (il sagit dun effet de style pour dmonstration). Une anne bissextile est multiple de 4 sans tre multiple de 100 moins dtre multiple de 400. Ainsi 1900 nest pas bissextile tandis que 2000 lest. 2004 est bissextile (voir cahier n1.doc). Cet exercice est intressant car il propose et prsente un grand nombre de concepts et dcriture dinstructions et de dclarations Ada. A comprendre et consulter sans modration ! D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

1 Cours 5 Ada sous programmes (3 heures) semaine 4


"La programmation est la branche la plus difficile des mathmatiques appliques". DIJKSTRA.

Thme : les sous programmes.


Avec le concept de sous programmes nous allons largir nos connaissances en outils de gnie logiciel. Nous avons dj voqu le fort typage Ada comme composante de lart de produire du logiciel fiable. La structuration en sous programmes renforcera cette technique en llargissant considrablement. Les notions que nous allons voir sont en interaction forte avec le cours dalgorithmique puisque nous allons facilement implmenter les modules si chers la structuration modulaire dun algorithme. Ce faisant nous allons aussi commencer comprendre le concept de rutilisation mais partiellement cependant car il sera largement complt avec les paquetages et surtout avec la gnricit. Vus plus tard (cours n9), un peu de patience donc !

Lapproche modulaire (rappel ?)


Nous en sommes, dans le module denseignement dalgorithmique vers la fin des exercices avec la machine Moucheron. Nous avons donc dj, de faon implicite mais aussi explicite, montr combien il tait commode de dcomposer un problme en sous-problmes allant du gnral au particulier. La lecture des fiches (notamment celle de WIRTH le pre du langage Pascal) nous y invite. Le principe est de concevoir son algorithme laide de structures de contrle rptitives, alternatives, de schmas squentiels dactions et de bloc de programmes (appels procdures, modules ou actions complexes). Sil est possible de glisser des assertions bien spcifiques aux endroits stratgiques on tend vers une conception de programmes optimum qui dans les annes 70-80 a t dnomme la programmation structure . Au dbut (en 1970) cette approche a t dune grande porte car auparavant on programmait de faon sauvage avec des outils tels que lorganigramme qui obligeait le langage dimplmentation utiliser le goto1, perfide instruction permettant de faire presque nimporte quoi. Vers les annes 1980 la programmation structure a montr ses limites cause surtout de la dimension impressionnante de certains logiciels (centaines de milliers dinstructions voire des millions !). La rutilisation grande chelle simposait et la modularit ntait plus suffisante, on allait vers la gnricit, la drivation de classes donc vers les objets . En 1983 Ada proposera avec les paquetages et la gnricit une premire tape : lapproche objet (par composition) nous nous y entranerons bientt. Puis autour de 1990 arrivent les langages objets tels Eiffel et C++2. Depuis 1995, et pour rester au top, Ada (renomm Ada95) permet les objets ainsi que de bien belles autres choses 3 (notamment pour la gestion et le temps rel) nous y reviendrons. Pour le moment restons modestes et voyons les lments de programmation modulaire.

Dune squence dactions au sous programme non paramtr.


En nous appuyant sur une squence dj vue nous allons introduire simplement le concept de procdure qui sera approfondi ensuite. Soit le module de lecture dun objet LA_VALEUR dun type discret (schma bien connu prsent dans P_E_SORTIE) form dun loop engobant un bloc. loop declare CHAI : UNBOUNDED_STRING; begin LIRE (CHAI); LA_VALEUR := T_DISCRET'VALUE(TO_STRING(CHAI)); exit; exception when others => null ou message !; end; end loop;

Les concepteurs de Ada, la mort dans lme (mais pour des raisons de conversion de programmes) ont, eux aussi, conserv lhorrible goto! 2 Respectivement : srement le meilleur (Eiffel) et videmment le plus utilis (C++) 3 Cest toujours lAda-tollah qui parle! D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

2
On a une structure rptitive ( cause des erreurs ventuelles) qui permet de recommencer la saisie et un bloc interne qui dclare chaque fois une variable UNBOUNDED_STRING qui est transforme aprs lecture en la valeur discrte quivalente (cette notion a t explique dans un cours prcdent). On dsire deux ou plusieurs endroits dun algorithme mettre en vre cette squence . Voyons le programme utilisateur EXEMPLE : u procedure EXEMPLE is Dclarations des ....... objets locaux la begin procdure EXEMPLE ...... loop declare Code ou begin instructions ....... dupliqus end; end loop; ...... ...... loop declare begin ....... end; end loop; ...... end EXEMPLE; On remarque bien les deux squences identiques qui gonflent anormalement lalgorithme. On va crire une fois pour toute la squence (mais ailleurs), lidentifier puis lutiliser en la nommant autant de fois que ncessaire sans la rcrire. Les .... marquent un peu partout dautres instructions possibles ou manquantes. Schmatiquement il vient : procedure EXEMPLE is ....... begin ...... ...... LIRE; ...... utilisation ...... ...... LIRE; ...... ...... end EXEMPLE; LIRE est dfinie quelque part (o ? A voir !) : procedure LIRE is begin loop declare begin ........ end; end loop; end LIRE

procedure LIRE is begin loop declare CHAI : UNBOUNDED_STRING; begin LIRE (CHAI); LA_VALEUR := ; exit; exception when others => null; end; end loop; end LIRE;

Amlioration de la procdure (ou module) LIRE qui scrit de faon plus dtaille a priori

D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

3
Aprs amlioration (explique plus loin) la procdure devient : On remarque la procedure LIRE is dclaration qui a CHAI : UNBOUNDED_STRING; chang de place begin loop begin surcharge de LIRE (CHAI); lidentificateur LA_VALEUR := T_DISCRETVALUE(TO_STRING(CHAI)); LIRE ( revoir) exit; ce nest pas le exception when others => null ou message ; mme ! end; end loop; end LIRE; La dclaration de la variable chane de caractres CHAI qui avait lieu chaque reprise de boucle peut tre faite une seule fois (partie dclarative de la procdure) nous y reviendrons. On verra aussi la notion trs importante en Ada de surcharge qui permet didentifier sans ambigut plusieurs objets avec le mme nom.

Quest-ce quun module (premire approche simple) ?


Cest une entit de programme, en gnral simple (au sens o elle est susceptible dtre analyse isolment) que lon peut utiliser dans un programme (et mme plusieurs fois) voire rutilisable dans un autre programme. Par exemple dans les exercices dalgorithmique lincontournable SAUTER_LES_BLANCS. Mthodes et principes (comment faire et que faire?) Pour tre efficace la dcomposition en modules doit simplifier la conception et la ralisation de lalgorithme (vident !) mais aussi sa lisibilit (donc sa validation mme partielle) et enfin sa maintenance cest--dire son volution et son adaptabilit au cours du temps (vaste projet !). Pour parvenir toutes ces qualits il faut que chaque module soit sous -tendu par une ide claire (on parle dabstraction), ide elle-mme sous-jacente au problme initial. Il convient aussi que la prsentation du module ( lutilisateur potentiel) cest--dire sa dnomination soit explicite et associe des commentaires dcrivant la fonction interne (spcifications). La ralisation du module peut aussi parfaitement rester cache lutilisateur qui sintresse au pourquoi et pas au comment (notion de masquage et dencapsulation). Enfin le nombre de modules structurant un module plus gnral (voire lalgorithme lui-mme) doit tre raisonnable . Le nombre de 7 modules maximum est le plus souvent cit par les bons manuels ; cette valeur 7 ne vient pas dune quelconque croyance en la magie de ce nombre mais tout simplement dtudes faites par les cogniticiens sur les capacits de la mmoire grer efficacement des tches (tant sur le plan mnsique que cognitif). En terme de volume dinstructions par module on saccorde aussi ne pas dpasser (si possible) une page de listing (une cinquantaine de lignes) ou parfois une page dcran (un peu juste !). Un autre problme (plus ardu encore) est le critre de faible couplage. Quid ? On a vu que deux modules qui se suivent dans un algorithme taient en gnral dpendants lun de lautre (principe mme de la squentialit). Le faible couplage consiste minimiser le plus possible la dpendance entre les modules. Lidal serait quils soient totalement indpendants et alors ils pourraient mme sexcuter en parallle ! Voici en gros et en bref la technique de conception modulaire appliquer : Tenter disoler, de reconnatre les grandes ides . Prciser leur nature, leur rle. Les identifier pour les reprer et les retenir (faire un choix mnmonique). Soigner linterface entre les modules. Dcrire avec clart leur fonction ce qui permettra une meilleure comprhension. Enfin, et seulement aprs, analyser de faon plus fine le module en ritrant la mthode ou en recourant une dcomposition en squences de contrles lmentaires.

Ces choses l sont rudes, il faut pour les comprendre avoir fait des tudes. Victor Hugo.

D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

4
Droulement et enchanement des modules (utilisateurs et utiliss). Schmatiquement on a remarquables : procedure UTILISATRICE is .......(1) begin .... .... UTILISEE;(2) ...... (5) ..... end UTILISATRICE;(6) 6 points

procedure UTILISEE is ......(3) begin .... .....(4) end UTILISEE;

Les points importants ont t numrots soit : en (1) les variables dclares dans le module utilisateur (dites locales) sont cres (laboration) lexcution de la procdure UTILISATRICE. Les instructions sexcutent jusqu linstruction nomme UTILISEE (2), cet endroit logiquement on quitte la procdure UTILISATRICE (momentanment) pour excuter la procdure UTILISEE avec, de nouveau, laboration de variables locales (3) puis excution des actions jusquen (4), au retour vers la procdure UTILISATRICE il y a disparition des variables locales cres en (3)4; enfin on retourne excuter les instructions qui suivent lidentificateur UTILISEE de (5) jusqu (6) : fin de la procdure et fin des variables locales dclares en (1). Gnralisation et complexit : comme un bon dessin vaut mieux quun long discours voyons un exemple simple ? : procedure PRINCIPALE is ..... SPROG1; ... SPROG2; ... SPROG1; ... SPROG4; ... end PRINCIPALE; procedure SPROG1 is ... SPROG3; ... SPROG4; .. end SPROG1; procedure SPROG2 is ... SPROG4; ... end SPROG2;

procedure SPROG3 is ... ... end SPROG3; procedure SPROG4 is ... .... end SPROG4;

Lexcution de ces utilisations (ou appels) est dans lordre :


PRINCIPALE, SPROG1, SPROG3, SPROG4, SPROG2, SPROG4, SPROG1, SPROG3, SPROG4, SPROG4.

Je vous laisse imaginer la complexit quil y a suivre donc comprendre lorganisation dutilisations plus professionnelles ce qui est le cas de tous les algorithmes vrais dignes de ce nom !

Le paramtrage.
Introduction. Revenons notre problme simple du dbut savoir : lecture dun objet LA_VALEUR de type T_DISCRET. Compliquons : il ne sagit plus de lire 2 fois le mme objet LA_VALEUR mais de lire une fois cet objet et une autre fois un autre objet L_AUTRE_VALEUR mais tout deux de mme type T_DISCRET. En reprenant notre programme EXEMPLE on aurait deux fois la (presque) mme squence cest--dire la squence dite de lecture o changerait seulement la ligne daffectation de la chane lue CHAI la variable en question respectivement LA_VALEUR et L_AUTRE_VALEUR. Schmatiquement :

Cest la mme ide que pour le paramtre dune boucle for qui nexistait plus la sortie : end loop! D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

5
procedure EXEMPLE is ....... begin ...... loop declare begin ....... LA_VALEUR := ..... end; end loop; ...... ...... loop declare begin ....... L_AUTRE_VALEUR := .... end; end loop; ...... end EXEMPLE;

code presque identique

Lide (pour factoriser) reste la mme : crire une seule fois la procdure LIRE et lutiliser souvent. Le problme cest de ne plus nommer la variable ( lire) de son vrai nom (impossible puisquil change !) mais dutiliser un nom formel (cest--dire abstrait sans signification particulire) et de lui substituer au moment de lutilisation le nom effectif qui doit remplacer le nom formel. Cest la notion de procdure paramtre. On parle alors de paramtre formel et de paramtre effectif (on verra comment seffectue lassociation). Schmatiquement (mais on reviendra l dessus) : procedure EXEMPLE is ....... begin ...... ...... LIRE(LA_VALEUR); ...... ...... ...... LIRE (L_AUTRE_VALEUR); ...... ...... end EXEMPLE;

procedure LIRE (V_Formel : ...) is CHAI : UNBOUNDED_STRING; begin loop begin .... V_FORMEL := ... ; ... end; end loop; end LIRE;

La procdure LIRE est dfinie ( droite) avec un paramtre formel nomm ici V_FORMEL et elle est utilise ( gauche) avec des paramtres effectifs (respectivement LA_VALEUR et L_AUTRE_VALEUR). On dit que lon a rendu paramtrable lobjet sur lequel portait lalgorithme (il nest pas fig mais dynamique). Attention cette faon de procder convient pour des objets de mme type (ici discret). La question (la bonne question !) est : ne pourrait-on pas faire la mme chose avec des objets diffrents et de type diffrent ? La rponse (la bonne rponse Ada !) est oui (mais cest la gnricit) patience a viendra !

Caractristiques dun objet par rapport un module.


En algorithmique on a observ que des assertions bien places aux endroits stratgiques permettaient de mieux comprendre leffet (la fonction) du module. Les bons endroits se situent au dbut (antcdent) du module et la fin (consquent). En effet si lon ramne la description du module (au moment de lutilisation) son identificateur on peut lire la squence suivante : D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

6
assertions avant NOM_DU_MODULE assertions aprs traduit en Ada : -- commentaires sur lantcdent NOM_DU_MODULE; -- commentaires sur le consquent Les assertions (ou leur traduction en commentaires programme) doivent porter sur les objets intressants au dbut : sur les objets utiles, ncessaires au module pour sa mise en vre (on parle dobjet donne) cest u lantcdent. la fin : sur les objets que le module a modifis ou initialiss (on parle dobjet rsultat) cest le consquent. Quand un objet se trouve tre, la fois, un objet donne et un objet rsultat on parle dobjet donne-rsultat tout simplement. Lobjet apparat dans lantcdent et le consquent. la lecture compare des assertions autour de lutilisation du module aide comprendre son effet

La grande scurit (le meilleur contrle) pour une programmation optimale est de transmettre systmatiquement les objets donnes et les objets rsultats en paramtre du module (sous-programme). Donc en Ada, les objets intressants seront mis entre parenthses : soit de faon formelle dans la dfinition de la procdure soit de faon effective dans lutilisation de la procdure. Ainsi la lisibilit et le contrle se trouvent facilits. Mais comme cest une activit trs contraignante alors beaucoup de programmeurs la transgressent un peu 5. Dailleurs on pourra remarquer que dans les exercices dalgorithmique nous avons trop nglig cette systmatisation (faute de pratique et faute de connaissance sur le sujet il est vrai !). On peut remarquer que les objets donnes (exclusivement donnes) ne sont pas modifis par le module (ou plutt ne devraient pas ltre). De mme les objets rsultats (exclusivement rsultats) ne sont que modifis on ne sintresse pas leur valeur lentre du module. En Ada le programmeur est oblig de marquer la caractristique (appel mode dutilisation) du paramtre : donne avec in, rsultat avec out ou donne-rsultat avec in out et ceci dans la dfinition du module cest--dire dans la liste des paramtres formels. Cette contrainte permet au compilateur de vrifier quaucun paramtre formel annonc in (donc donne) ne se trouve gauche du signe := cette vrification est, notez le, dune grande scurit. En effet, dans la conception de lalgorithme vous postulez quun objet est donne et vous le signalez en mettant in puis vous transgressez cette hypothse dans la programmation en mettant cet objet gauche dun signe daffectation par exemple. Donc de deux choses lune : ou vous avez mal programm ou bien votre hypothse est fausse : Ada vous le signale dans la phase de contrle syntaxique (cest--dire ds la premire tentative dimplmentation). On a l une erreur de type conceptuel signale la compilation 6. De mme aucun paramtre formel out (donc rsultat) ne devrait se trouver droite du signe := cette proprit tait contrle avec la version 83 de Ada elle ne lest plus (hlas) avec la nouvelle norme : une variable rsultat peut donc tre consulte ! Si elle nest pas initialise cest la catastrophe ! Il ny a aucun contrle syntaxique sur les objets de caractristique in out ce qui est normal.

Variables globales, variables locales dun module.


Notez, avant tout, que la proprit nomme globale ou locale pour une variable est une notion relative et sapplique par rapport un module particulier ; par exemple un objet peut tre local un module et peut tre global par rapport un autre module comme on va le voir dans des exemples. Variable locale : Une variable est locale un module lorsquelle nexiste pas avant la mise en vre du module (donc avant u son utilisation) et quelle est utile au module. La variable locale est solidaire de son module. On dit que sa porte est circonscrite au module, dailleurs la variable locale est dclare dans le module, elle prend naissance (laboration voir ce terme dans le glossaire : fichier glossaire.doc) avec lutilisation du module et elle disparat avec le module quand celui-ci est achev.
5 6

et pour dautres cest beaucoup, voire passionnment! Alors quil faudrait : pas du tout! cest beau Ada! D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

7
Une variable est dite globale un module quand elle nest ni locale, ni paramtre du module. Elle existe avant la mise en vr e du module, elle est utilise et/ou modifie dans le corps du module et elle existera encore u aprs lutilisation du module. Ce sont en fait des donnes-rsultats non signales. Ce sont des variables extrmement dangereuses pour la qualit du logiciel. On contrle trs mal leur effet puisquelles sont modifiables tout moment. On parle deffet de bord devant une modification intempestive et mal contrle dune variable globale. La qualit dun logiciel pourrait se mesurer (entre autres choses) son nombre minimum de variables globales. En algorithmique CARCOU tait (hlas !) un objet global ! On a lallure gnrale suivante (dclaration et dfinition dune procdure) : panorama et explication des paramtres

procedure S_P (liste des paramtres formels) is .... dclaration des variables .... locales la procdure begin ...... ...... end S_P; Exemple simple :

porte des variables locales; les variables qui ne sont ni locales ni paramtres et utilises ici sont globales DANGER!

On dsire crire un module COMPTER qui, dans un objet chane de caractres (STRING), va compter le nombre doccurrences dun caractre particulier. En Ada on crirait les spcifications de la procdure ainsi (on est toujours du ct formel) : procedure COMPTER (CAR : in CHARACTER; VEC : in STRING; NB : out NATURAL); Il est clair que : seule est intressante la valeur du caractre CAR chercher donc cest une donne in de mme le vecteur VEC nest pas modifi et seul son contenu nous intresse in enfin le nombre de caractres NB trouv est typiquement un rsultat out Pour lutilisation on pourrait mettre en vre la procdure avec des objets vrais ou effectifs qui u remplaceront les objets fictifs ou formels ainsi : COMPTER (L,PREMOT(1..12),NB_DE_L); COMPTER (A,MOTCOU(4..10),NB_DE_A); Paramtres effectifs

Notez : les points virgules sparent les paramtres formels, les virgules sparent les paramtres effectifs, le point virgule aprs la dclaration de COMPTER (ici ce nest pas une dfinition). Il annonce seulement le profil de la procdure. La dfinition, qui reste faire, est caractrise par le remplacement du point virgule par un is suivi du bloc comme on va le voir plus loin sur les diagrammes syntaxiques (corps ). La taille des tranches de PREMOT et de MOTCOU sont diffrentes. Voir la ralisation (page 15) de COMPTER Autre exemple de procdure paramtre bien connue (TD n2 page 4 algorithmique) : procedure NB_DE_CARAC (CAR : in CHARACTER) is begin COMPTEUR := 0; loop exit when FIN_RUBAN; LIRE; if CARCOU = CAR then COMPTEUR := COMPTEUR + 1; end if; end loop; ECRIRE_COMPTEUR; end NB_DE_CARAC; CARCOU et COMPTEUR sont hlas globales, il ny a pas de variables locales, CAR est paramtre donne. D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

8 Les sous -programmes Ada (dtails).


On vient de voir quun sous programme est crit afin de rsoudre un sous-problme apparu lors de l'analyse dun problme plus gnral. Il peut donc tre mis au point sparment et, au besoin, se diviser lui-mme en sous-programmes. Un sous-programme est appel une unit de programme donc peut tre rutilis dans d'autres programmes. Les sous-programmes peuvent tre regroups de manire logique avec d'autres sousprogrammes ou d'autres entits dans un paquetage (exemple : P_E_SORTIE) voir dtails au cours n 7. Il existe deux sortes de sous-programmes : les procdures. les fonctions. Un sous programme, comme toute entit du langage : constantes, type, variables ... etc. (on verra dautres entits), est introduit par une dclaration. Cette dclaration de sous programme apparat, en gnral, dans une partie dclarative soit dun autre sous-programme soit dun paquetage soit dune autre unit. L'criture d'un sous-programme se fait (devrait se faire) en deux tapes spares : dclaration du sous-programme c'est--dire son en-tte (profil ou spcification). dfinition du sous-programme avec prsentation de son corps (ou ralisation).

Spcification de sous-programme. Une spcification de sous-programme constitue l'interface entre le sous-programme et les units utilisatrices de ce sous-programme. La spcification prcise ce qu'il est ncessaire de savoir pour utiliser le sousprogramme. Son nom, la liste de ses paramtres (paramtres formels), plus prcisment : leur identificateur, leur mode dutilisation (caractristique) et leur type, enfin le type de lobjet retourn dans le cas d'une fonction. Cet ensemble d'informations est unique et s'appelle le profil du sous-programme. Mais la spcification ne dit rien sur ce que fait le sous-programme. Un commentaire srieux permettra de complter la spcification. La spcification est llment essentiel de la dclaration du sous programme cest un contrat. Exemples de spcifications : procedure PLACER (LIGNE, COLONNE : in T_COORDONNEE); -- positionne le curseur sur un cran procedure TRIER (A,B : in FLOAT; MIN,MAX : out FLOAT); -- trie deux nombres A et B: MIN le plus petit, MAX le plus grand function "*" (X,Y : in MATRICE ) return MATRICE; -- effectue le produit de deux matrices (hard !) function LE_PLUS_GRAND (A,B : in FLOAT) return FLOAT; -- MAX ! -- action identique lattribut MAX ! spcification de sous programme :

procedure

dsignateur

partie formelle

function

dsignateur

return

marque de type

partie formelle

D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

9
dclaration de sous programme : spcification de sous programme partie formelle : ( spcifications de paramtre ; spcifications de paramtre : ) ;

liste didentificateurs

mode

marque de type := expression

mode :

in out Remarques : les spcifications de paramtre (formel !) sont spares par un point virgule, les identificateurs de paramtres peuvent tre regroups (liste didentificateurs) et spars par une virgule, on peut initialiser un paramtre formel (de mode in seulement ; ( revoir), le mode peut tre absent (implicitement cest alors de mode in). La ralisation du sous-programme. Le corps constitue la partie ralisation du sous-programme. Il va indiquer comment sont ralises les oprations que la spcification laisse esprer. Corps de sous programme : spcification de sous programme is partie dclarative begin

suite dinstruction(s)

end

exception

traite exception

dsignateur

Remarques : On retrouve au dbut du corps la partie spcification (reprise intgrale de la dclaration) la partie aprs le is est presque une instruction bloc (mais pas de declare) La partie dclarative "locale" peut ne pas exister lorsque aucune dclaration n'est ncessaire. La partie bloc qui suit le begin contient la description d'une squence d'instruction(s) (au moins une). Cette description est ralise l'aide des entits connues en utilisant les structures de contrle du langage. La partie traite exception sera vue au cours n8. Elle est (notez le) toujours situe en fin de bloc

D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

10
La partie dclarative dfinit les entits ncessaires la mise en vre. Les entits sont : u les types. les constantes. les variables. les exceptions. les sous-programmes. les paquetages. les tches et les objets protgs. les clauses.

Exemples de corps de sous-programme ; on les a choisis courts et connus (mais savoir !) : procedure TRIER (A,B : in FLOAT; MIN,MAX : out FLOAT) is -- pas de dclarations locales begin if A <B then MIN := A; MAX := B; else MIN := B; MAX := A; end if; end TRIER; function LE_PLUS_GRAND (A,B : in FLOAT) return FLOAT is begin if B < A then return A; else return B; end if; -- ou tout simplement en une ligne : return FLOATMAX(A,B) ; end LE_PLUS_GRAND;

A retenir : la prsentation complte d'un sous-programme se fait traditionnellement en deux temps (dabord dclaration avec spcification puis plus tard dfinition ou corps avec spcification et bloc). Cependant Ada tolre l'absence de dclaration distincte de la dfinition du sous-programme (car cette dernire reprend les spcifications). La prsentation en deux temps n'est donc pas obligatoire on peut lomettre quand les algorithmes sont simples et compacts. On verra que cette prsentation en deux parties est automatiquement demande quand le sous programme est issu dun paquetage (cours n 7).

Elaboration, porte, visibilit et surcharge.


Llaboration dune dfinition (cf. le glossaire fichier dans le CDRom) est le processus par lequel la dclaration produit ses effets. Ainsi une variable locale un sous -programme nest vritablement cre quau moment o le sous-programme est mis en uvre donc au moment o le sous programme sexcute. On gardera lesprit cette notion qui permet dimaginer un certain dynamisme dans la dfinition dune variable locale dun sous-programme. Se souvenir que lon labore une dclaration et que lon excute une instruction. La porte d'un objet local un sous programme (cest dire un objet dclar dans la partie dclarative), s'tend depuis la dclaration de lobjet jusqu la fin du corps du sous programme. Hors de cette zone lobjet (donc son identificateur) est inaccessible, la porte ne s'tend pas l'extrieur du sous-programme. Remarquons que si le sous programme dclare aussi dans sa partie dclarative des sous programmes alors ces sous programmes appartiennent la porte de lobjet local du sous programme initial; cet objet local au sous programme initial peut tre utilis par les sous programmes secondaires dont il est alors .... objet global ! Hard !

D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

11
Unit de compilation englobante (paquetage ou autre sous-programme) objets globaux sous programme A aux objets locaux au sous-programme A sous-programmes sous-programme B mais locaux objets locaux au sous-programme B l'unit de compilation

Visibilit : Dans la figure ci-dessus, le sous-programme B connat ses objets locaux ainsi que les objets locaux du sous-programme A (l'un de ces objets tant le sous-programme B), il connat aussi les objets locaux de l'unit englobante. Le sous-programme A ne connat pas les objets locaux du sous-programme B. L'unit de compilation englobante ignore tout des objets locaux des sous-programmes A et B. Les objets locaux une unit suprieure, et donc accessibles un sous -programme interne, sont dits globaux pour ce sous-programme. Rgles sur la porte et la visibilit : Une entit n'est pas accessible (donc pas rfrenable) tant qu'elle n'a pas t dclare. Elle na pas besoin dtre ralise pour quon y fasse rfrence (cas dun sous programme prsent en deux temps). Dans un sous-programme, les entits accessibles sont les entits dclares dans ce sous-programme (en fonction de la rgle d'ordonnancement), et les entits dclares dans le corps des sous-programmes qui lenglobent. La porte d'une entit dclare dans un sous-programme s'tend ce sous -programme et tous les sous programmes qu'il dclare. Masquage de visibilit : Une entit peut ne pas tre directement visible si une autre entit, dsigne par un mme identificateur, a t dclare dans un sous-programme plus interne. Cette nouvelle entit masque la premire. Exemple : (masquage de visibilit ici dun identificateur de variable) procedure PREMIERE is COMPTEUR : FLOAT; -- variable relle procedure SECONDE is COMPTEUR : T_COMPTEUR; -- variable entire begin .... COMPTEUR:= .... end SECONDE; begin .... COMPTEUR := .... end PREMIERE; expression entire correct. Faux sinon expression relle correct. Faux sinon

A cet endroit la variable COMPTEUR relle est masque par la variable COMPTEUR entire. Toutefois il est possible d'accder la premire entit dans la procdure SECONDE ainsi : PREMIERE.COMPTEUR en utilisant la notation pointe et prfixe par PREMIERE. D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

12
Surcharge. Le langage Ada permet, en gnral, plusieurs dclarations de possder le mme identificateur. C'est le phnomne de surcharge. Quand un identificateur surcharg est utilis (deux sous-programmes par exemple) le compilateur les distingue par leurs profils condition qu'ils soient diffrents, sinon il signale lambigut. Cette diffrence peut se matrialiser par : le nombre de paramtres effectifs, le type et l'ordre des paramtres effectifs, le type du rsultat (pour les fonctions), le nom des paramtres formels dans le cas d'une notation nominale (voir plus loin).

Exemples connus : Les procdures ECRIRE ou LIRE dans le paquetage P_E_SORTIE. Lorsque le compilateur rencontre : ECRIRE (RESULTAT); il dcide en fonction du type de RESULTAT (paramtre effectif) lequel des sous-programmes ECRIRE doit tre activ. On peut surcharger AUSSI tous les oprateurs suivants (cest trs pratique) : + - / * mod rem ** abs not and or xor (attention on ne peut surcharger in !)

Fonctions.
Une fonction est un sous-programme qui retourne une valeur et une seule. Tous les paramtres d'une fonction sont obligatoirement des paramtres "donne". Il est recommand dindiquer ce mode par le mot cl in (mme si c'est implicite et non obligatoire). Exemple (surcharge et masquage) avec le quotient rel de deux entiers : function "/" (I, J : in T_ENTIER) return FLOAT; On pourra crire par exemple Y K1,K2 : FLOAT; : T_ENTIER; -ou mieux Y := K1 / K2 ;

Y := "/"(K1,K2);

La notation curieuse "/" (K1,K2)est parfaitement correcte. C'est mme la seule forme autorise si la fonction "/" appele est prsente dans un paquetage voque avec la clause with seule (sans use). A revoir ! Normalement loprateur / (qui est prdfini sur les entiers) donne un quotient entier (voir cours sur les littraux numriques) il est ici surcharg. Le compilateur choisit : soit loprateur entier prdfini quand laffectation est entire : K1 := K1 / K2; il choisit loprateur redfini ci-dessus si le type de la variable affecte est FLOAT comme dans Y := K1 / K2 ; Il est possible en Ada de dclarer des fonctions qui renvoient des variables de type composite (tableau ou article). A revoir page 15 plus loin et cours n6. Exemple : function "+" (C1, C2 : in T_COMPLEXE) return T_COMPLEXE;

Le type T_COMPLEXE est un type form de deux composants (connu ?). On dfinit ainsi laddition de deux complexes, il suffit de dfinir tous les autres oprateurs (-, *, /) pour fabriquer un vrai type T_COMPLEXE cest--dire une structure de donnes mais avec ses oprateurs (voir plus tard la notion de type abstrait de donnes). On ralisera le type T_COMPLEXE au cours n 7. En TP on verra le type T_Rationnel.

D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

13
Les procdures (rappel ?). Une procdure est un sous programme qui utilise et/ou modifie un certain nombre de paramtres (ventuellement ne fait aucune modification comme la procdure ECRIRE de P_E_SORTIE). Comme pour les fonctions, les paramtres donnes sont dclars en faisant prcder leur type du mode in. De plus, les paramtres rsultats sont dclars en faisant prcder leur type par le mode out dans la spcification du sous-programme. Les paramtres donnes rsultats seront dclars en faisant prcder leur type par le mode in out dans la spcification du sous-programme. Lors de l'utilisation d'une procdure (on parle parfois dappel de la procdure) les paramtres effectifs correspondant des paramtres formels rsultats out (ou donnes -rsultats in out) doivent tre des variables obligatoirement (pas de littraux). Mais les paramtres effectifs correspondant des paramtres formels donnes in peuvent tre soit des variables soit des littraux (plus largement ce sont des expressions mais ce concept nest pas si simple et sera vu plus tard !). Remarques (rappels !) : Si un paramtre est dfini uniquement par son type (sans le mode) c'est le mode in qui est retenu par dfaut ( viter). Lutilisation de paramtres dans le mode in interdit au sous-programme de modifier leurs valeurs. Cela est vrifi la compilation. Lutilisation en mode out ninterdit pas la lecture de ce paramtre attention ! Le mode in out est interdit pour les paramtres de fonctions (out aussi dailleurs). Linstruction return. L'instruction return peut tre mise partout et jusqu' plusieurs fois dans une fonction (et mme dans une procdure). On utilise l'instruction return seule dans une procdure et return valeur du rsultat dans une fonction. L'oubli de l'instruction return dans une fonction est signal la compilation ( Warning). Remarque : l'instruction return est videmment optionnelle dans une procdure, quand elle est utilise elle permet de quitter la procdure avant son achvement en fin de bloc (peu conseille goto). Exemple de fonction : function OUI (TEXTE : in STRING) return BOOLEAN; -- et commentaires ....... ....... function OUI (TEXTE : in STRING) return BOOLEAN is REPONSE : CHARACTER := 'a'; -- mais pas de O ou de 'N' begin while (REPONSE /= 'O') and (REPONSE /= 'N' ) loop ECRIRE (TEXTE); LIRE (REPONSE); REPONSE := To_Upper(REPONSE); -- mise en majuscules end loop; return REPONSE = 'O'; end OUI; Autre forme : (bien plus lgante notez le) function OUI (TEXTE : in STRING) return BOOLEAN is REPONSE : CHARACTER; begin loop ECRIRE (TEXTE); LIRE (REPONSE); REPONSE := To_Upper(REPONSE); -- en majuscules exit when (REPONSE = 'O') or (REPONSE ='N'); end loop; return REPONSE = 'O'; end OUI; La sortie d'une fonction autrement quavec return provoque l'exception PROGRAM_ERROR. D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

14 Appel de sous -programmes.


L'appel (c'est--dire l'utilisation effective ) d'un sous-programme est possible dans la porte de sa dclaration. L'appel entrane dabord le passage (ou transmission ) des paramtres (cest lassociation formel effectif) ensuite vient l'laboration de la partie dclarative du sous-programme, puis enfin l'excution de la squence d'instructions de la partie instructions du bloc. L'criture d'une utilisation de sous-programme est compose du nom du sous-programme appel suivi ventuellement d'une liste de paramtres effectifs. La correspondance entre paramtres effectifs et paramtres formels peut tre faite de trois manires diffrentes : La notation positionnelle. Le rappel du nom du paramtre formel est absent de la liste des paramtres effectifs. C'est l'ordre des paramtres qui permet d'effectuer la correspondance. (Voir exemple 1) La notation nominative . Le nom du paramtre formel est rappel avec son homologue effectif. Les paramtres formels peuvent tre donns dans n'importe quel ordre. (Voir exemple 2) La notation mixte. Il est permis d'utiliser la fois la notation positionnelle et la notation nominative, la premire doit toutefois prcder la seconde. (Voir exemple 3)

Exemple : procedure L'appel s'crira : 1. 2. 3. BORNES (1.0,3.4,2.8,Z1,Z2); -- pas d'apparition de nom formel BORNES (B => 3.4,A => 1.0,C => 2.8,X1 => Z1,X2 => Z2); BORNES (1.0,3.4,X1 => Z1,C => 2.8,X2 => Z2); -- mlange ! BORNES (A, B, C : in FLOAT; X1, X2 : out FLOAT) ;

Valeurs par dfaut. Il est possible d'associer aux paramtres formels (de mode in seulement) des valeurs par dfaut. Ces valeurs sont attribues aux paramtres formels lorsque leurs homologues effectifs ne sont pas prsents dans la liste lors de lutilisation du sous-programme. Exemple : procedure PLACER(LIGNE : in T_COORDONNEE; COLONNE : in T_COORDONNEE := 1); en cas dabsence de paramtre effectif n2 alors la valeur de la colonne est force 1. Les appels suivants sont autoriss : PLACER PLACER PLACER PLACER (20); -- quivaut PLACER (20,1); (10,5); (12,COLONNE => 11); (COLONNE => 11, LIGNE => 12);

Les paramtres formels (de mode in) qui n'ont pas de valeur par dfaut, doivent avoir, l'appel, un paramtre effectif correspondant (littral ou variable). Les autres paramtres ( ut ou in out) doivent, o rappelons le, avoir comme paramtre effectif correspondant un identificateur de variable (pas de littral).

Types non contraints comme paramtres de sous -programme.


La rfrence des tableaux non contraints comme paramtres formels de sous-programmes permet la transmission de paramtres effectifs de mme type tableau, mais ayant, au choix, des domaines d'indices diffrents. Le tableau "effectif" est, lui, contraint obligatoirement lutilisation.

D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

15
Exemple : type T_TABLE is array (T_ENTIER range <>) of FLOAT;-- non contraint subtype T_TABLE10 is T_TABLE(15..24); -- contraint T1 : T_TABLE10; -T2 : T_TABLE(100..200); -T3 : T_TABLE(-50..50); -10 valeurs 101 valeurs 101 valeurs

Paramtre formel de type non contraint !

procedure TRI (T : in out T_TABLE) is AUX : FLOAT; begin for IND in T'FIRST..T_ENTIER'PRED(T'LAST) loop for J in T_ENTIER'SUCC(IND)..T'LAST loop if T(J) < T(IND) then AUX := T(IND); T(IND):= T(J); T(J) := AUX; end if; end loop; end loop; end TRI;

Utilisation dattribut pour accder aux valeurs inconnues

Seule l'utilisation des attributs (ici FIRST, LAST) permet de saffranchir de la taille mais aussi du type discret de lindice de l'objet tableau pass en paramtre effectif qui, lui, est forcment contraint. Cependant on est oblig avec lutilisation de PRED et SUCC de revenir au type dindice (ici T_ENTIER) car ces deux attributs oprent sur un type et non sur un intervalle. Simulez cet algorithme (trace !). On peut maintenant crire dans le corps de la procdure englobante les utilisations : TRI(T1); ou TRI(T2); ou TRI(T3);.On a des appels (ou utilisations) du mme sous-programme avec des tableaux de tailles diffrentes. Cette utilisation de tableau non contraint va tre constamment prise dans les TD-TP.

Le type STRING. (approfondissement et ... problmes !)


Nous avons vu au cours n4 que le type STRING est un type tableau non contraint. Il peut donc servir de type pour les paramtres formels d'un sous-programme comme on vient de le voir ci-dessus. Un exemple simple est celui de la ralisation de la procdure COMPTER vue page 7. On a remarqu cette occasion que lon pouvait utiliser un vecteur de caractres (sous forme dune tranche). Ce vecteur a une taille variable et ne commence pas (ni ne finit) par les bornes extrmes du vecteur initial. Pour prendre en compte cet aspect dynamique il suffit de travailler avec un vecteur non contraint en paramtre formel ici le type STRING. procedure COMPTER (CAR:in CHARACTER;VEC:in STRING;NB:out NATURAL) is COMPT : NATURAL := 0; begin for IND in VECFIRST..VECLAST -- ou encore for IND in VECRANGE loop if CAR = VEC (IND) then COMPT := COMPT + 1; end if; end loop; NB := COMPT; end COMPTER; Voyez comment lalgorithme reste valable mme avec un vecteur VEC vide (ou tout au moins le paramtre effectif associ). Voyez comment avec VECFIRST..VECLAST ou VECRANGE (ce qui est pareil) on saffranchit de lintervalle effectif que lon ne connat pas encore. Ada cest le pied ! D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

16
Le type STRING permet de raliser beaucoup d'oprations. On peut crire des sous-programmes permettant par exemple d'extraire une sous-chane, de rechercher une sous-chane, de passer en majuscules ou minuscules une chane etc. bref, tout ce qu'il faut pour rgler le traitement des chanes ! A voir dans ltude des paquetages Ada.Strings.Maps et Ada.Strings.Fixed. Ceci est vu en TD. Exemple de fonction capable de remplacer partout dans une chane OU une sous chane QUOI par la sous chane PARQUOI avec des STRING. Essayez de comprendre ; Pas facile ! on reverra cela avec la rcursivit. function REMPLACER (OU, QUOI, PARQUOI : in STRING) return STRING is DEBUT : constant NATURAL := OU'FIRST; FIN : constant NATURAL := OU'LAST; begin if OU'LENGTH < QUOI'LENGTH then return OU; -- trop court elsif OU(DEBUT..DEBUT + QUOI'LENGTH - 1) = QUOI then -- le dbut de OU contient QUOI return PARQUOI & REMPLACER (OU(DEBUT + QUOI'LENGTH..FIN), QUOI, PARQUOI); else -- on n'a pas trouv, on avance d'un caractre dans OU return OU(DEBUT) & REMPLACER(OU(DEBUT + 1..FIN), QUOI, PARQUOI); end if; end REMPLACER; Acceptons cette fonction sans en comprendre le corps mais bien sa spcification (pourtant cest beau la rcursivit !). Supposons dclares les variables MOT1 et MOT2 de type STRING. On veut mettre dans MOT2 le rsultat du remplacement de "CECI" par "CELUI-CI" dans MOT1. Si on crit : MOT2 := REMPLACER (MOT1, "CECI", "CELUI-CI"); Problme !

la notation MOT2 := .... stipule laffectation globale tout lobjet MOT2. Si MOT2 a t dclar contraint (par exemple MOT2 : STRING(1..MAXI)) avec une taille maximale suffisamment grande pour tout accepter, alors MOT2 := ... quivaut MOT2 (1..MAXI) := ..... En gnral MOT2 est utilis avec des lments en nombre plus rduit que cette taille maximum. Cest le cas ici ; il est rare que REMPLACER renvoie exactement un objet de taille MAXI. Il manque, pour l'affectation MOT2, la connaissance de la "taille". L'affectation ncessite une tranche, lcriture correcte est : MOT2(1..?) := ...... Il faut alors procder en 2 temps : 1) LONG := REMPLACER (MOT1,"CECI","CELUI-CI")LENGTH; pour connatre la longueur de la chane rendue par REMPLACER et laffecter LONG puis enfin : 2) MOT2(1..LONG):= REMPLACER (MOT1, "CECI","CELUI-CI"); soit 2 appels (ou utilisation) de REMPLACER. affreux, affreux comme disait la marionnette J.P.P.! On comprend qu'il serait commode d'avoir un type chane de caractres qui "porte" avec lui sa longueur et que celle ci soit variable (avec le temps) ce sont les fameux Unbounded_String. On les tudiera en TD-TP Si on a dclar : CHAINE : Unbounded_String ; Alors on ralise le mme exercice en une instruction : CHAINE := To_Unbounded_String(REMPLACER (MOT1, "CECI","CELUI-CI"));. D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02 Cest une fonction qui transforme un String en Unbounded_String

Cours 5 bis Ada Entres-Sorties simples (1 heure : fin semaine 4)

Avertissement : On entend ici, par les termes Entre et Sortie, les notions de lecture (clavier) et dcriture
(cran) do le qualificatif de simples pour ces entres sorties. Le contexte dEntre et Sortie sur fichiers sera voqu dans un autre document (cours n11). De plus nous nous contenterons de mettre en uvre des lectures et des critures de type prdfini ne demandant pas dinstanciation gnriques puisque cette notion est vue plus tard (cours 8). Le terme de lecture est-il dailleurs bien compris des tudiants ? Pas toujours ! En effet il y a ambigut si lon oublie que ces fonctionnalits sadressent au programme et non lutilisateur. Une lecture pour le programme consiste demander lutilisateur dcrire avec le clavier ! Une criture du programme demandera une lecture sur lcran lutilisateur ! Attention au quiproquo. SAISIR la place de LIRE et AFFICHER la place de ECRIRE seraient plus mnmoniques ! Introduction. On rappelle que, pour faire, jusqu aujourdhui, des lectures et des critures de type prdfinis : caractre ( CHARACTER), chanes de caractres ( STRING), variables de type INTEGER ou type FLOAT, on utilisait les ressources du paquetage P_E_SORTIE. Toutes ces ressources possdaient les identificateurs surchargs (bien commodes) de LIRE et de ECRIRE. Voir les pages du cours n1 (gnralits III) o lon avait montr les spcifications de ce paquetage. Aujourdhui on va sintresser un peu leur ralisation et peut-tre songer remplacer ces LIRE ou ECRIRE par des outils vrais de Ada. On pourra possder (et voir) aussi les ralisations (body) du paquetage P_E_SORTIE (diter un listing).

Lecture et criture de variables de type CHARACTER.


La ressource vraie Ada ( voquer avec with pour raliser ces fonctionnalits sur le type Character) est le paquetage ADA.TEXT_IO. Pour lire on utilise GET et pour crire on utilise PUT. Pour aller la ligne on utilise NEW_LINE et pour vider le tampon du clavier on utilise SKIP_LINE. Quand on observe le contenu du paquetage ADA.TEXT_IO (voyez le polycopi paquetages en annexe A.10.1) on dcouvre aprs le commentaire - Character Input-Output les deux procdures : procedure GET (ITEM : out CHARACTER); procedure PUT (ITEM : in CHARACTER); La procdure PUT est exactement la procdure ECRIRE de P_E_SORTIE. Dailleurs pour sen convaincre on peut voir dans les spcifications le renommage (renames). Donc PUT dite sur lcran la position courante du curseur le caractre en question. Puis le curseur progresse dune position (colonne) dans la ligne courante. La procdure GET nest pas identique la procdure LIRE de P_E_SORTIE! La ralisation de LIRE est : procedure LIRE (CARAC : out CHARACTER) is begin TEXT_IO.GET(CARAC); TEXT_IO.SKIP_LINE; end LIRE;

Le SKIP_LINE est en plus !

Avec LIRE(CARCOU) si on tape au clavier successivement A puis B puis C et que lon appuie ensuite sur la touche ENTREE alors CARCOU reoit le caractre A et les autres frappes sont annules (elles sont purges cause du SKIP_LINE qui revient au dbut du tampon). Avec GET(CARCOU) si on effectue les mmes saisies (A puis B puis C puis Entre) alors CARCOU reoit bien A mais les autres frappes restent dans le tampon de lecture elles rempliront automatiquement le prochain GET venir (sans frappe au clavier) mme si le GET est situ de nombreuses instructions plus loin. Notez que lutilisateur na plus taper de caractres (ni appuyer sur ENTREE). Intressant mais videmment connatre. Notez encore que, aprs un troisime GET, le caractre C serait lu mais pas la marque correspondant Entre (le tampon nest pas purg) ce qui peut poser un problme si la prochaine instruction dentre est la saisie dun String (qui sera alors vide ; 0 caractre !). Comment en cours ! Difficile !

En rsum : linstruction SKIP_LINE permet de vider le tampon sil nest pas vide (y compris la marque modlisant la touche ENTREE). Mais un SKIP_LINE quand le tampon est dj purg attend des frappes quelconques termines par la touche ENTREE et ..... nettoie tout ! Voyez, pour comprendre, dans P_E_SORTIE les ralisations des procdures VIDER_TAMPON et PAUSE. D. Feneuille IUT Cours Ada 5 bis (E/S simples) 2002 (fichier cours5_B.DOC) 30/06/02

Lecture et criture de variables de type STRING.


On rappelle quune variable de type STRING est un tableau de caractres contraint par un nombre maximum de caractres (et ceci linstanciation de la variable). Quand on observe le contenu du paquetage ADA.TEXT_IO on dcouvre aprs le commentaire - String Input-Output les quatre procdures : procedure GET (ITEM : out STRING); procedure PUT (ITEM : in STRING); procedure GET_LINE (ITEM : out STRING; LAST : out NATURAL); procedure PUT_LINE (ITEM : in STRING); La procdure PUT est exactement la procdure ECRIRE de P_E_SORTIE. Dailleurs pour sen convaincre on peut voir dans les spcifications du paquetage le renommage ( renames). Donc PUT dite sur lcran la position courante du curseur la chane de caractres en question. Le curseur progresse dautant de positions (colonnes) que le STRING contient de caractres instancis. Exemples : PUT (MESSAGE(5..8)); crit les 4 caractres de la tranche depuis la position du curseur puis se place au bout en attente dautres ditions. Tandis que PUT (MESSAGE); dite tout le STRING avec le nombre de caractres dont il a t contraint. Si les caractres lextrmit nont pas reu de valeur il y aura dition de caractres parasites tels que la mmoire est cense les reprsenter cet instant l. Nimaginez pas que des caractres espaces sont placs a priori au bout du STRING (ce que faisait la procdure LIRE !). La procdure GET nest pas identique la procdure LIRE de P_E_SORTIE ! En effet la procdure GET demandera autant de caractres saisir quil y en a eu de dclars dans la contrainte dinstanciation ! Il ny a pas de dynamisme ! Si on appuie quand mme sur ENTREE avant davoir tap les quelques caractres attendus lalgorithme ne progresse pas et attend le reste ! Instruction proscrire sauf sur fichier ventuellement (nous y reviendrons). Si vous tapez plus de caractres et appuyez sur ENTREE le surplus restera dans le tampon et sera utilis par le GET suivant (ventuel !) moins quun SKIP_LINE ne vide tout cela ! PUT_LINE est simple comprendre cest un PUT termin par un NEW_LINE ! Attention cette instruction est rserve aux STRING. Pas de PUT_LINE avec une variable de type CHARACTER, INTEGER, FLOAT etc. Donc PUT_LINE (MESSAGE) affiche sur cran la position initiale du curseur la totalit du STRING (ici MESSAGE) qui sera pass en paramtre puis place le curseur au dbut de la ligne suivante. GET_LINE est la solution au manque de dynamisme critique plus haut propos du GET (qui est proscrire). Attention comme pour le PUT_LINE cette instruction est rserve aux STRING. Notez aussi (cest important) le deuxime paramtre formel LAST (rsultat out). Quand on utilise GET_LINE pour saisir (lire) un STRING par exemple avec linstruction GET_LINE (MESSAGE, NB_CAR_SAISIS) on nest plus oblig de taper autant de caractres que linstanciation en a dclars. Ouf ! Le dynamisme est revenu. Le deuxime paramtre est le nombre de caractres saisis (ici NB_CAR_SAISIS). A charge ensuite pour lalgorithme de ne mettre en uvre que la tranche valide (cest--dire MESSAGE(1..NB_CAR_SAISIS)) cest important noter. On doit instancier une variable STRING dune capacit suffisante pour grer des saisies de taille diffrentes. On peut imaginer par exemple des demandes de C.V. o les utilisateurs doivent donner leur nom. En prenant un STRING grand on peut esprer des saisies de noms plus modestes. Sinon si lon saisit plus de caractres que linstanciation nen a prvus le surplus ne reste pas dans le tampon comme prcdemment et le nombre de caractres en rsultat est satur la taille du STRING. Mais il y a un problme quand on saisit exactement (pile poil !) le nombre de caractres maximum instancis. En effet, dans ce cas, la marque de fin de saisie (cest--dire la touche ENTREE) reste dans le tampon et le prochain GET ou GET_LINE dun autre STRING na pas le temps de seffectuer; lutilisateur ne peut prendre la main et la saisie est vide ! Cest bien regrettable ! Il faut absolument quand on utilise un GET_LINE contrler si le nombre de caractres saisis est gal la taille maximum instancie (NB_CAR_SAISIS = MESSAGELENGTH) et dans ce cas l il faut purger la marque de fin de saisie restante ! Dur ! On peut prvoir un STRING plus grand mais ce nest pas toujours raliste. On verra la ralisation du LIRE dun STRING dans P_E_SORTIE. On peut refaire la procdure GET_LINE ainsi (surcharge) : D. Feneuille IUT Cours Ada 5 bis (E/S simples) 2002 (fichier cours5_B.DOC) 30/06/02

procedure GET_LINE (S : out STRING; L : out NATURAL) is S_BIS : STRING (SRANGE); S_BIS est un clone de S L_BIS : NATURAL; begin TEXT_IO.GET_LINE(S_BIS,L_BIS); if L_BIS = SLENGTH on travaille sur S_BIS, avec le then TEXT_IO.SKIP_LINE; GET_LINE de TEXT_IO end if; S := S_BIS; on recopie S_BIS sur S L := L_BIS; end GET_LINE; surcharge nickel !

En conclusion : les saisies de caractres et de chane de caractres ne sont pas triviales. Le point crucial reste le tampon qui nest pas toujours purg ! (et un skip_line systmatique ne rgle rien !). Une solution originale existe elle utilise linstruction Set_Col ( voir prochainement cours fichier).

Lecture et criture de variables de type ENTIER (sign ou modulaire).


Il existe une solution ces objectifs dans la paquetage TEXT_IO (plus prcisment dans son paquetage interne INTEGER_IO). Mais elle ncessite les concepts de gnricit (cours n9). De plus pour la lecture elle demandera un contrle de validation supplmentaire. Pour ces raisons il est recommand de plagier ce qui est fait dans le paquetage P_E_SORTIE propos du type INTEGER en ladaptant au type ENTIER souhait. Par exemple : Type ENTIER construit

type T_ENTIER is range -6..40009; ......... procedure GET(L_ENTIER : out T_ENTIER) is REPONSE : UNBOUNDED_STRING; LONG : NATURAL; begin Contrle validit loop begin REPONSE := Get_Line; L_ENTIER := T_ENTIER'VALUE(To_String(REPONSE)); exit; exception when others => TEXT_IO.PUT_LINE("saisie non valable recommencez"); end; end loop; end GET; Cette lecture est valide elle utilise les notions vues prcdemment Elle lit une chane puis la convertie dans le numrique souhait. Elle sadapte tout type ENTIER. Elle pourra tre reprise quand nous ferons la gnricit. Le concept de gnricit consistera tout simplement rendre paramtrable le type T_ENTIER. Cest tout. En ce qui concerne lcriture dun type ENTIER on peut l encore en attendant la gnricit plagier ce qui est fait dans le paquetage P_E_SORTIE. procedure PUT (L_ENTIER : in T_ENTIER) is begin TEXT_IO.PUT(T_ENTIER'IMAGE(L_ENTIER)); end PUT;

D. Feneuille IUT Cours Ada 5 bis (E/S simples) 2002 (fichier cours5_B.DOC) 30/06/02

Lecture et criture de variables de type FLOAT.


On utilisera encore P_E_SORTIE jusqu la connaissance de la gnricit et celle du paquetage interne (FLOAT_IO) de TEXT_IO.

Lecture et criture de variables de type numratif.


L encore, jusqu la matrise de la gnricit et du paquetage interne (ENUMERATION_IO) de TEXT_IO on plagiera, pour lire un numratif le bloc de lecture propos dans P_E_SORTIE en fin de spcifications. Soit : loop declare Lecture dune chane CHAI : UNBOUNDED_STRING; LONG : NATURAL; begin CHAI := Get_Line; Conversion ENUM := T_ENUM'VALUE(To_String(CHAI)); avec validation exit; exception when others => null; -- ou message ECRIRE("xxxxx"); end; end loop; Cette lecture est valide et nickel ! En ce qui concerne lcriture merci lattribut IMAGE ! Soit PUT ou PUT_LINE : PUT (T_ENUMIMAGE(ENUM)); PUT_LINE (T_ENUMIMAGE(ENUM)); Cette partie de cours se poursuivra, avec le temps, en fonction des questions qui nous seront poses. Remarque : Toutes les possibilits de TEXT_IO nont pas t voques ! On verra en TD-TP quelques fonctionnalits supplmentaires telle par exemple la procdure Get_Immediate (lecture non tamponne dun caractre).

Quelques interrogations
Dans un littral chane comment reprsente-t-on les guillemets (puis quils sont dlimiteurs de chane) ? Deux solutions : On double le guillemet pour le reprsenter. On utilise la compatibilit du type caractre et de la chane avec loprateur &

Exemples respectifs : Crer la chane de 3 caractres : AB. Il est clair que AB est incorrect car avec A le compilateur considre une chane de un seul caractre le A. Puis trouvant B il pte les plombs (avec message dinjure en anglais!). Do la bonne criture : AB. Le doublon vaut un seul . De mme pour fabriquer la chane dun caractre contenant lunique caractre il faut crire . Cqfd ! Avec lautre approche on a : A & & B. Tordu non! Mais de toute faon il est incontournable quil nest pas facile de reprsenter un symbole quand il est, lui mme, dlimiteur. Remarque : Une solution (plus lgante dj voque page 3) la surcharge du Get_Line (page 3 en haut) sera vue dans le cours 11 (cours fichier) cependant dores et dj il est bien plus sr et performant de passer par les Unbounded_String ! D. Feneuille IUT Cours Ada 5 bis (E/S simples) 2002 (fichier cours5_B.DOC) 30/06/02

Je retiens n2
Quelques termes, informations ou conseils retenir aprs le cours n 5 bis Ada (semaines 3 et 4). Cette fiche fait suite la fiche je retiens n1 aprs les semaines 1 et 2.

Rendez (ou conserver) des listings formats (rappel de la fiche je retiens n1 ). Le type tableau non contraint est dclar avec range <>. Une variable de type tableau doit tre contrainte. Un paramtre formel de type tableau peut tre non contraint (cest le paramtre effectif associ qui sera contraint!). Evitez de dclarer des variables tableaux de type anonyme (ou muet). Un agrgat avec others doit possder un contexte permettant dvaluer ses bornes. Les attributs FIRST, LAST, RANGE et LENGTH sappliquent des types ou sous types contraints. Ils sappliquent aussi des variables de type tableaux (mais toujours contraints!). Enfin ils peuvent sappliquer des paramtres formels tableaux non contraints (mais en fait rfrencent le paramtre effectif associ!). Dans une affectation de tableaux le nombre de composants doit tre le mme mais les bornes peuvent tre diffrentes. Dans une comparaison de tableaux (mono dimension) les tailles peuvent tre diffrentes. Un agrgat un seul composant doit utiliser la notation nominative. Une fonction ne peut atteindre son end final (il faut quitter avec un return). Lordre des valuations des paramtres dun sous programme nest pas dfini par la norme. Lexpression par dfaut dun paramtre formel donne in nest value que lors de lutilisation du sous programme son appel et aussi si le paramtre effectif est omis. Si un paramtre formel tableau est contraint son paramtre effectif doit avoir les mmes bornes! Le mcanisme du passage des paramtres pour les tableaux nest pas dfini par la norme. Les dclarations des paramtres formels sont spars par des points-virgules. La liste des paramtres effectifs utilise naturellement la virgule. La notation nominative pour le passage des paramtres est trs prise pour une bonne lisibilit. Ne pas confondre dclaration et dfinition (notamment pour les sous-programmes). Un sous programme dclar dans la partie dclarative dun autre sous-programme appartient uniquement ce dernier. On retrouve lesprit des objets locaux. Les qualificatifs de local et de global sont des notions relatives (elle font rfrences un sous-programme particulier). Un pragma est une information fournie accessoirement au compilateur. Par exemples : pragma OPTIMIZE (SPACE) et pragma OPTIMIZE (TIME) demandent un code excutable optimis (en place mmoire ou en temps dexcution). Voir quelques pragmas dans le fichier pragma.doc. On nvoque pas le paquetage STANDARD (avec with). On ne le redfinit pas non plus! Le paquetage ADA.TEXT_IO est le paquetage officiel pour les entres-sorties textes. Le type STRING est un type tableau de caractres non contraint. Il est prdfini car dclar est dfini dans le paquetage STANDARD. Ne pas confondre SKIP_LINE et NEW_LINE. SKIP_LINE est une instruction dentre tandis que NEW_LINE est une instruction de sortie . Les lectures clavier doivent tre toujours valides. Voyez bien tous les fichiers et les paquetages suggrs : Standard, attribut1.doc, Ada.Strings, Ada.Strings.Fixed, Ada.Characters.Handling, Ada.Strings.Unbounded, glossaire.doc, Ada.Text_Io, body de P_E_SORTIE, Ada.Characters.Latin_1. Et tudiez les ! On ne peut comparer des objets tableau de taille diffrente que si leurs composants sont de type discret (i.e. pas de rels !).

D. Feneuille IUT Cours Ada 5 bis (E/S simples) 2002 (fichier cours5_B.DOC) 30/06/02