Création de fonctions "Asymptex" pour l édition de tableaux. Chap.3 " Asymptex": (Raccourci de : Fonction Asymptote intégrant du code Latex.) Objectif: Construire une fonction Asymptote d édition de tableaux, avec ou sans grille, sans devoir distribuer ses données au milieu des esperluettes. Connaissances utiles: Avoir testé des programmes de la Galerie G.M et du poly. Ch.G Notions de programmation Asymptote. Pages 28..,76.. de la Doc.Officielle. Notions élémentaires sur la construction de fonctions Avoir lu le chapitre précédent où une fonction du même genre mais très simple est construite. Ces pages s adressent plus spécialement à des lecteurs qui débutent en Asymptote mais ayant un peu programmé.. "dans le temps!.." Contenu: Construction d une "Asymptex" simple à partir de l environnement array tests divers Edition "express" de tableaux de type real[][], string[][] Méthode: Comme dans le chapitre précédent,on commence par tester le code sous éditeur Latex! Si le résultat est correct on le recopie dans une fonction Asymptote qui le retournera dans variable de type string. Il sera ensuite aisé de récupérer le résultat dans une frame puis pour simplifier, de créer une fonction qui à partir du tableau comme paramètre, retounera la frame contenant son édition Latex. Le code Latex \begin{array}{ ccc } 1 & 2 & 3 4 & 5 & 6 7 & 8 & 9 10 & 11& 12 \end{array}
gedition d un tableau de réels sans grilleg Construction: Si on regarde ce code on constate qu il se compose: D écritures fixes : \begin{array}{, &, De données variables que l on mettra en paramètres de la fonction: le cadrage (l,c,r) les éléments du tableau. On rentre les écritures fixes dans des variables de type string string sdeb="\begin{array}{"; string samp=" & "; //ampersand string sep=""; //fin de ligne string sfin=" end{array}"; Ecrivons le début de la fonction avec les paramètres string tableau0( int nblig, int nbcol, string cadrage, real[][] tabinitial) { //Début du corps de la fonction Considérons l écriture des données: chaque valeur suivie d un & sauf pour la dernière de la ligne. en fin de ligne sauf sur la dernière. A priori aucune difficulté à reproduire. (Rappel: + pour la concaténation des variables de type string il va falloir transformer les données (des réels) en chaînes de caractères: rien de plus simple (Cf.Doc.Off.) Allons-y!.. //on rentrera le tableau dans s0 de type string string s0,s1;//on définit les variables utiles au départ s1=""; //On remplit la ligne i for (int j=0;j<nbcol-1;++j){s=(string)tab0[i][j]; s1=s1+s+samp; s1=s1+(string) tab0[i][nblig-1] ;//On ajoute la dernière colonne sans & à la fin if(i<nblig-1){s1=s1+sep;// pas de sur la dernière ligne du tableau s0=s0+s1; write(s0); //Les write(..) sont indispensables dans la mise au point des programmes //on ferme la boucle i On termine en concaténant toutes les variables de type string string s= sdeb+ cadrage + "}" ;//l accolade fermante du cadrage s=s+s0; //Le tableau avec les & et les s=s+sfin;//la dernière ligne return s;//on retourne de résultat La fonction retourne une variable de type string. (Ultérieurement ce sera dans une frame.) Si l édition du tableau est dans une variable de type string, on peut donc l éditer avec label(s,position, couleur). ==ZZZ== Si vous concaténez par exemple: "\bf" et "35" vous obtenez:"\bf35"! Erreur assurée! Il faut laisser un espace après bf.
\begin{array}{ ccc } 1 & 2 & 3 4 & 5 & 6 7 & 8 & 9 10 & 11& 12 \end{array} string tableau0( int nblig, int nbcol, string cadrage, real[][] tabinitial) { //Commencer par repérer les tableaux dans les paramètres et en faire des copies! real[][]tab0=copy(tabinitial); //On définit ce qui reste fixe string sdeb="\begin{array}{"; string samp="&"; //ampersand string sep=""; //fin de ligne string sfin="\end{array}"; Fonction tableau0(...) //on passe le tableau dans s0 de type string string s0,s1; s1=""; //réinitialise for (int j=0;j<nbcol-1;++j){s=(string)tab0[i][j]; s1=s1+s+samp; s1=s1+(string) tab0[i][nbcol-1] ; if(i<nblig-1){s1=s1+sep;// pas de sur la dernière ligne du tableau s0=s0+s1; write(s0); //on ferme la boucle i //On rassemble tout bout à bout.. string s= sdeb+ cadrage + "}" ;//l accolade fermante du cadrage s=s+s0; //Le tableau avec les & et les s=s+sfin;//la dernière ligne return s; Code d édition des tableaux. //le tableau initial real [][] tabinit={{1,2,3},{4,5,6},{7,8,9},{10,11,12} string s=tableau0(3,3,"ccc", tabinit); s=""+s+""; //Mode math. //Edition du tableau à l aide de la fonction label(s,position,pen); label(s,(5cm,-5cm));label(s,(10cm,-5cm),red);label(s,(15cm,-5cm),blue); 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
Code d édition des tableaux avec différents cadrages. //le tableau initial real [][] tabinit={{10,22,3},{40,550,6},{700,8000,9},{1000,0.152,12} string s=tableau0(4,3," ccc ", tabinit); s="" + s + "";label(s,(6.7cm,yy)); string s=tableau0(4,3," l c r ", tabinit); s="" + s + "";label(s,(11.7cm,yy),blue); string s=tableau0(4,3," l rr", tabinit); s="" + s + "";label(s,(16.7cm,yy),red); gedition d un tableau de réels avec grille.g. \begin {array}{ c c c } 1 & 2 & 3 4 & 5 & 6 7 & 8 & 9 10 & 11 & 12 \end{array} Fonction d édition avec grille. string tableau1(int nblig, int nbcol, string cadrage,real[][] tabinitial) {real[][]tab0=copy(tabinitial); string sder,s,s0,s1; //On définit ce qui reste fixe string sdeb="\begin{array}{";string samp="&"; //ampersand string sep=""; string shline=" "; string sfin="\end{array}"; s1=""; //réinitialise for (int j=0;j<nbcol-1;++j){ s=(string)tab0[i][j]; s1=s1+s+samp; //On ajoute le dernier sans à la fin s1=s1+(string) tab0[i][nbcol-1] ; s1=s1+sep; s0=s0+s1+shline;//on ferme la boucle i //On concatène les chaînes sder="";sder= sdeb+ cadrage + "}" ;//l accolade sder=sder+ shline ; //le 1er sder=sder+ s0; //Le tableau avec les & et les sder=sder+sfin;//la dernière ligne return sder; Code d édition des tableaux avec différents cadrages. //le tableau initial real [][] tabinit={{10,22,3},{40,550,6},{700,8000,9},{1000,0.152,12} string s=tableau1(4,3," ccc ", tabinit); s="" + s + "";label(s,(6.7cm,yy)); string s=tableau1(4,3," l c r ", tabinit); s="" + s + "";label(s,(11.7cm,yy),blue); string s=tableau1(4,3," l rr ", tabinit); s="" + s + "";label(s,(16.7cm,yy),red);
gedition d un tableau de réels avec grille ou sans grille.g Méthode: Il suffit d ajouter un paramètre booléen pour choisir directement avec grille ou sans grille. On initialisera avec l édition la plus fréquente, sans doute: Avec grille. Pour faire au plus simple!.. On recopie les fonctions précédentes et on ajoute un if du genre: if (avec grille){ version: tableau0} else {version: tableau 1} on termine la fonction par return sder. On nomme le programme: edittab0 (pour réels!) et on ajoute un paramètre pour le choix Exemple: string edittab0( int nblig, int nbcol, string cadrage, real[][] tabinitial, bool grille=true //On initialise ){... if (grille==true){ partie avec grille sdre= } else{ partie sans grille sder= return sder; Si intéressé c est inutile de le rédiger à votre place! Code d édition des tableaux avec grille ou sans grille. real [][] tabinit={{10,22,3},{40,550,6},{700,8000,9},{1000,0.152,12} real yy=-25cm; //Avec grille string cad=" c c c ";string s=edittab0(4,3,cad, tabinit); s=""+ s+ "";label(s,(5cm,yy)); string cad=" l r l ";string s=edittab0(4,3,cad, tabinit); s=""+ s+ "";label(s,(9cm,yy),red); //Sans grille string cad="rrr";string s=edittab0(4,3,cad, tabinit,hhline=false); s=""+ s+ "";label(s,(13cm,yy),blue); //Sans grille string cad=" l rr";string s=edittab0(4,3,cad, tabinit,hhline=false); s=""+ s+ "";label(s,(17cm,yy),fuchsia);
Finalement!.. On édite facilement les tableaux en une ou deux lignes de code. En pratique, on n utilise pas (ou très rarement) les labels pour positionner.toutes les fonctions crées retournant des frames. on applique un programme d édition de frames qui évitera à chaque fois d initialiser les ordonnées. C est peut-être aussi rapide sous éditeur Latex mais le but ici est de rester sous Notepad++! Et si on a des tableaux de type real[], string[],string[][]?.. C est simple, ce sera l objet du prochain chapitre. Mais si vous vouliez prendre les devant... Pour le tableau de type string[][] on effectue un "copier/coller" de la fonction précédente en remplaçant dans la récupération des données,(string)tab0[i][j] par tab0[i][j] Pour les tableaux de type string[] et real[] même procédure: Copier/coller et modification des fonctions. Vous disposerez donc de quatre fonctions auxquelles vous donnerez LE MEME NOM!!(Asymptote saura les différencier.) De la sorte, vous n utiliserez qu un seul nom de fonction pour éditer tous vos tableaux. Pratique?!.. Si c est compliqué.. on passe un peu de temps au départ à créer les fonctions mais ensuite.. c est pour l éternité!.. Une dernière application: L édition "express" d un tableau aléatoire. Code d édition du tableau (20x12). real[][] T=matRa(20,12,2,-100,100);//le tableau initial (aléatoire à 2 décimales.) string cad=" c c c c c c c c c c c c "; //le cadrage s=edittab0(10,20,cad,t);//l édition du tableau "passe" dans s (option avec grille) s=""+s+"";// Ne pas oublier les en mode math pour l édition. yy=-20cm;label(s,(12cm,yy);//edition avec label en (12cm,yy) 57.98 87.03 29.88 67.59 26.41 22.79 99.07 17.82 58.12 64.04 44.52 89.8 33.83 0.79 24.14 64.98 78.44 25.05 97.34 54.15 40.51 17.8 13.68 4.85 92.56 89.26 17.73 45.09 55.94 51.24 22.38 10.67 16.57 52.73 37.35 57.59 53 21.47 45.62 60.68 80.33 3.96 42.04 92.46 96.17 94.03 70.96 2.04 69.22 21.11 30.34 53.07 30.46 69.85 52.28 60.81 38.9 69.71 50.61 13.34 94.87 35.8 74.89 83.1 96.07 33.8 66.21 7.38 69.83 70.76 47.06 88.94 52.99 91.53 81.34 15.17 85.62 9.76 25.26 46.81 28.13 25.47 20.38 79.87 37.93 48.39 56.46 63.89 53.15 64.58 9.67 34.39 14.37 91.99 2.66 86.09 66.64 4 38.41 8.58 87.12 58.51 19.19 0.49 96.53 45.52 53.05 56.88 62.85 33.8 64.16 94.94 26.17 43.5 3.43 72.97 96.88 55.4 16.21 77.31 92.4 43.01 70.33 65.2 70.6 95.72 78.81 74.88 58.92 25.13 82.24 87.59 58.35 88.71 77.65 30.63 39.1 57.76 57.41 71.79 37.97 87.29 34.1 94.03 19.51 99.13 80.74 57.19 91.2 65.26 29.15 17.7 17.71 91.96 42.44 71.93 63.92 33.42 47.33 13.97 82.03 20.44 88.14 75.26 83.25 2.44 98.05 94.58 50.94 3.99 39.13 76.28 57.52 93.36 98.43 24.59 81.1 15.47 42.5 39.38 83.98 32.22 9.53 17.13 74.12 44.45 9.65 39.04 43.33 64.52 89.63 48.56 26.31 8.55 20.96 62.61 51.32 28.96 40.4 98.7 56.46 99.05 72.75 65.23 77.94 56.16 62.12 57.39 56.51 75.77 32.96 41.76 7.02 63.83 18.47 63.82 55.77 86.66 85.27 49.2 84.22 31.55 54.48 36.51 43.05 31.19 6.45 23.2 79.24 81.19 86.61 37.55 58.46 2.41 26.13 16.34 22.98 24.55 99.96 81.14 En définitive pas besoin d un chapitre supplémentaire pour les types string[][],string[],real[],car on n utilisera pas ces fonctions dans la suite!..ci-joint un code d édition pour les variables de type string[][]
Code d édition des tableaux de type string[][] avec grille ou sans grille. string edittab0( int nblig, int nbcol, string cadrage, string[][] tabinitial, bool hhline=true) { string[][]tab0=copy(tabinitial); string sder,s,s0,s1; //On définit ce qui reste fixe string sdeb="\begin{array}{"; string samp="&"; //ampersand string sep=""; //fin de ligne string shline=" "; string sfin="\end{array}"; if(hhline==true){//avec GRILLE s1=""; //réinitialise for (int j=0;j<nbcol-1;++j){ s=tab0[i][j]; s1=s1+s+samp; //On ajoute le dernier avec à la fin sa uf à la dernière ligne s1=s1+ tab0[i][nbcol-1] ; s1=s1+sep; s0=s0+s1+shline; write(s0); //on ferme la boucle i //On rassemble tout bout à bout.. sder=""; sder= sdeb+ cadrage + "}" ;//l accolade fermante du cadrage sder=sder+ shline ; //le 1er sder=sder+ s0; //Le tableau avec les & et les sder=sder+sfin;//la dernière ligne } else { //tableau SANS GRILLE write("sans grille"); s1=""; //réinitialise for (int j=0;j<nbcol-1;++j){ s=tab0[i][j]; s1=s1+s+samp; //On ajoute le dernier avec à la fin sauf à la dernière ligne s1=s1+ tab0[i][nbcol-1] ; if(i<nblig-1){s1=s1+sep;// pas de sur la dernière ligne du tableau s0=s0+s1; write(s0); //on ferme la boucle i //On rassemble tout bout à bout.. sder=""; sder= sdeb+ cadrage + "}" ;//l accolade fermante du cadrage sder=sder+ s0; //Le tableau avec les & et les sder=sder+sfin;//la dernière ligne return sder; Code d édition des tableaux. string [][] stabinit={{"a","b","c"},{"d","e","f"} string cad=" c c c c "; string s=edittab0(2,3,cad, stabinit); s=""+s+"";label(s,position); string cad="ccc"; s=edittab0(2,3,cad, stabinit,false); s=""+s+"";label(s,position,red); string s=edittab0(2,3,cad, tabinit,false); s=""+s+""; label(s,position,blue); string [][] stabinit; stabinit={{"\alpha","\beta","\gamma"}, {"\sqrtx","\frac{\int_{-n}^ne^x,\rm dx}{n+1}", "\widehat {PQR}"} cad=" l c c "; string s=edittab0(2,3,cad, stabinit); s=""+s+"";label(s,position,fuchsia); a b c d e f a b c d e f α β γ n x n ex,dx PQR n+1
gconclusion!.g Quelques remarques: Avec ce genre de fonction simple à réaliser, les tableaux de taille quelconque s éditent en une ligne de code! Par contre il n est pas très intéressant d effectuer l édition à l aide de: label(s,position) En effet, pour placer le tableau il faudra "viser juste:" le point d insertion du label est au centre du tableau! En pratique il sera plus simple de transférer le résultat dans une frame ayant un point d insertion en HG. (Haut-Gauche) On effectue la transformation en fin de fonction pour retourner une frame Ou bien à la suite de la récupération du tableau dans la variable de type string. Dans les deux cas, la méthode utilisée dans les chapitres précédents restera la même: fr=align(fr,se); ("CTRL F align" dans la Doc.Off. pour plus de renseignement!) (Pour vérifier, vous testez avec et sans align(..)); Application: Pour visualiser les points d insertion on utilise dot(position,pen); Rq.: Si les points d insertion n apparaissent pas sur ce.pdf du web, ils apparaîtront en compilant votre listing. Code d édition en utilisant les frames. Tableau 1. string [][] stabinit={{"a","b","c"},{"d","e","f"} cad="ccc"; //cadrage lcr s=edittab0(2,3,cad, tabinit); //Edition du tableau dans s s=""+s+"";//mode math. frame fr; //frame vide label(fr,s,(0,0),blue);//le tableau \"passe\" dans la frame fr=align(fr,se); //le point d insertion de la frame sera en HG add(fr, (xx,yy)); //Edition de la frame dot((xx,yy),5bp+red);//vérification de la position du point d insertion. Tableau 2. string [][] stabinit={{"\alpha","\beta","\gamma"},{"\sqrt{x}", "\frac{\int_{-n}^ne^x,\rm dx}{n+1}","\widehat {PQR}"} frame fr;//nouvelle initialisation (sinon, écriture dans la frame précédente!) cad=" l c c "; s=edittab0(2,3,cad, stabinit); //Edition du tableau dans s s=""+s+"";label(fr,s,(0,0),red); // Edition du tableau dans la frame fr fr=align(fr,se);//modification du point d insertion (de central devient HG) add(fr, (xx,yy)); //Edition de la frame dot((xx,yy),5bp+blue);//vérification de la position du point d insertion. α β γ n x n ex,dx PQR n+1
Code d édition: Pour obtenir rapidement une série de données.. //Arrondir real arrondi(real r,int decim) {real u=r; if(decim>-1) { u=(floor(u\10^decim+0.5)/10^decim); return u; //Une façon possible de créer rapidement un tableau de type real[][] real[][] matra( int nblig, int nbcol, int nbdecim, int min, int max) { real[][] matder=new real[nblig][nbcol];real r; srand(seconds());sleep(1); for(int i=0;i<nblig;++i){ for(int j=0;j<nbcol;++j){ r=rand()\star (max-min)/randmax+min; matder[i][j]=arrondi(r,nbdecim); } return matder; Il faut être patient entre les appels!.. (sleep(1mn)) La suite?..reprise avec création de fonctions: Chapitre 4. CHAPITRE 4 Page d accueil.