Page 1 sur 1

tableau ascii

Posté : jeu. 4 déc. 2014, 02:31
par maurice
Bonjour, j'ai voulu faire une table des caractère ASCII.
Je me suis confronté aux caractères spéciaux \LaTeX.
Du coup, le programme, simple au départ, est devenu complexe avec plein de tests.

Figure asymptote 9c5b6ec0e69510a5366ddf464ce7302f
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. unitsize(1.1cm);
  2.  
  3. defaultpen(fontsize(10pt));
  4.  
  5. int[] speciaux={35, 36, 37, 38, 92, 94, 95, 123, 125, 126};
  6.  
  7. string table(int n, int p) {
  8. string l1, l2;
  9. for(int i=n; i<p; ++i) {
  10. if(i==34) {l1 = l1 + '"'; l1 += " &"; l2 += format("%i", i) + " &";}
  11. else {
  12. if(i==92) {l1 = l1 + "\textbackslash"; l1 += " &"; l2 += format("%i", i) + " &";}
  13. else {
  14. if(i==94) {l1 = l1 + "\textasciicircum"; l1 += " &"; l2 += format("%i", i) + " &";}
  15. else {
  16. if(i==35 | i ==36 | p==37 | i==38 | i==92 | i==95 | i==123 | i==125 | i==126) {
  17. l1 = l1 + '\\' + format("%c", i); l1 += " &";
  18. l2 += format("%i", i) + " &";
  19. } else {
  20. l1 += format("%c", i); l1 += " &";
  21. l2 += format("%i", i) + " &";
  22. }
  23. }
  24. }
  25. }
  26. }
  27. if(p==35 | p ==36 | p==37 | p==38 | p==92 | p==95 | p==123 | p==125) {
  28. l1 = l1 + '\\' + format("%c", p); l1 += " \\";
  29. l2 += format("%i", p) + " \\";
  30. } else {
  31. if (p==126) {
  32. l1 += " \textasciitilde \\";
  33. l2 += format("%i", p) + " \\";
  34. } else {
  35. l1 += format("%c", p) + " \\";
  36. l2 += format("%i", p) + " \\";
  37. }
  38. }
  39. write(l1);
  40. write(l2);
  41. return "\begin{tabular}{|l|*{18}{c|}} \hline Caract\`ere &" + l1 + "\hline Code &" + l2 + " \hline \end{tabular}";
  42. }
  43.  
  44. label(table(51,68), (0,0));
  45. label(table(69,86), (0,-1));
  46. label(table(87, 103), (0,-2));
  47. label(table(104,118), (0,-3));
  48. label(table(119,126), (-3,-4));


Euh, Y'a pas plus simple ?...

Il reste le problème de l'alignement et des lignes de même longueur (usepackage("tabularx")) ?

Merci

Bruno

Re: tableau ascii

Posté : jeu. 4 déc. 2014, 08:24
par GM
Bonjour,
maurice a écrit :Euh, Y'a pas plus simple ?...
J'ai envie de répondre que ouiiii... en regardant la longueur du script :-) mais sans avoir le temps de chercher maintenant (période de copies et conseils de classes).

Quelques commentaires après une lecture rapide et un seul essai du code proposé :
  • "speciaux" est défini et non utilisé ;
  • dans ta logique de la gestion des cas spéciaux, tu n'as pas songé à interdire de passer en paramètre un n inférieur à 32 ? J'imagine que tu t'es dit que c'est pour toi et que tu sais que les caractères imprimables commencent à 32 mais puisque l'on en est à mettre le code sur le net... peut-être faudra t-il ajouter un warning (et un remplacement par n=32) pour toute tentative de n<32 ;
  • Je crois que tu as un problème avec la valeur 37.

Re: tableau ascii

Posté : jeu. 4 déc. 2014, 09:56
par GM
Manque de temps mais j'apporte tout de même une source d'inspiration... pour ce qui a été apparemment l'une de tes pistes de recherche (je fais allusion à ta variable inutilisée : speciaux) :

Code : Tout sélectionner

int[]    CODspeciaux={35, 36, 37, 38};
string[] CARspeciaux={"c1", // Chaine de substitution pour 35
                      "c2", //                             36
                      "c3", //                             37
                      "c4"  //                             38
                      }; 
int  rang;                      
bool isSPECpossible=true;
for(int i=32; i<42; ++i) {
   rang = search(CODspeciaux,i);
   ((rang==-1)||(!isSPECpossible)) ? write(format("%c",i)) : write(CARspeciaux[rang]);
   if(rang==CODspeciaux.length-1) isSPECpossible = false;
}
Une obligation : les entiers de CODspeciaux doivent être rangés dans l'ordre !
Image

Re: tableau ascii

Posté : jeu. 4 déc. 2014, 17:45
par GM
ATTENTION !

Un gros bémol à mon exemple ci-dessus : "search" fonctionne dans mon exemple... mais je viens de songer à d'autres cas où cela n'irait pas en l'état.
Pour le comprendre :

Code : Tout sélectionner

int[] CODspeciaux={35, 36, 37, 38, 92, 94, 95, 123, 125, 126};
write(search(CODspeciaux,33));
write(search(CODspeciaux,34));
write(search(CODspeciaux,35));
write(search(CODspeciaux,37));
write(search(CODspeciaux,38));
write(search(CODspeciaux,39));
write(search(CODspeciaux,91));
write(search(CODspeciaux,92));
write(search(CODspeciaux,126));
write(search(CODspeciaux,127));
write(search(CODspeciaux,1270));

Code : Tout sélectionner

Process started >>>
-1
-1
0
2
3
3
3
4
9
9
9
<<< Process finished.
La fonction de recherche dans la liste sera à revoir !

Re: tableau ascii

Posté : ven. 5 déc. 2014, 00:28
par maurice
Bonjour, merci pour toutes ces précisons. J'avis bien pensé à utuliser search mais ne voyais pas commengt m'en servir.
GM a écrit :La fonction de recherche dans la liste sera à revoir !
Problème contourné grace à

Code : Tout sélectionner

if(search(ord_speciaux, i-1)==search(ord_speciaux, i))
Voici une proposition.

Figure asymptote 8feaa220b1ed49f3b3fa8a2809e44acf
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. unitsize(1.1cm);
  2.  
  3. defaultpen(fontsize(10pt));
  4.  
  5. int[] ord_speciaux={34, 35, 36, 37, 38, 92, 94, 95, 123, 125, 126};
  6. string[] car_speciaux={'"', "\#", "\$", "\%", "\&", "\textbackslash", "\textasciicircum", "\textunderscore", "\{", "\}", "\textasciitilde"};
  7.  
  8.  
  9. string table(int n, int p) {
  10. string l1, l2;
  11. if(n<32) {write("indice minimum 32"); return table(32,p);}
  12. if(p>126) {write("indice maximum 126"); return table(n,126);}
  13. for(int i=n; i<p; ++i) {
  14. if(search(ord_speciaux, i-1)==search(ord_speciaux, i)) {
  15. l1 += format("%c", i) + " & ";
  16. l2 += format("%i", i) + " & ";
  17. } else {
  18. l1 += car_speciaux[search(ord_speciaux, i)] + " & ";
  19. l2 += format("%i", i) + " & ";
  20. }
  21. }
  22. if(search(ord_speciaux, p-1)==search(ord_speciaux, p)) {
  23. l1 += format("%c", p) + " \\";
  24. l2 += format("%i", p) + " \\";
  25. } else {
  26. l1 += car_speciaux[search(ord_speciaux, p)] + " \\ ";
  27. l2 += format("%i", p) + " \\";
  28. }
  29. return "\begin{tabular}{|l|*{"+format("%i", p-n+1)+"}{p{.35cm}|}} \hline" +
  30. " Caract\`eres & " + l1 + " \hline " +
  31. "Code & " + l2 + " \hline \end{tabular}";
  32. }
  33.  
  34.  
  35. label(table(30,50), (0,0), E);
  36. label(table(51,69), (0,-1), E);
  37. label(table(70,88), (0,-2), E);
  38. label(table(89,107), (0,-3), E);
  39. label(table(108,126), (0,-4), E);
  40. // label(table(121,150), (0,-5), E);


Reste la largeur des colonnes. Ça serait mieux si elles avaient même largeur et de n'avoir que 4 lignes !

Bruno

Edit : les avertissements marchent bien !

Edit2 : avec un p{.4cm} c'est ok sauf que les éléments du tableau ne sont plus centés (sur le formum .35cm à cause de la taille de l'image) !

Re: tableau ascii

Posté : ven. 5 déc. 2014, 20:35
par GM
Quelques suggestions :
  1. utilisation de tabularx ;
  2. inutile de refaire un appel de la fonction pour n<32 et p>126 ;
  3. le choix entre " & " et " \\ " ne nécessite pas de doubler le code ;
  4. un placement correct de l'affectation de l2 évite de la dupliquer ;
  5. définition d'un nouveau type de colonne pour le centrage ;
  6. recours à @{} pour un padding à 0 ;
  7. utilisation de string(...) quand il ne s'agit que de convertir un nombre en chaine.

Figure asymptote b718795663a70f08ff632d80bbd3eae8
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. unitsize(1cm);
  2. usepackage("tabularx");
  3. defaultpen(fontsize(10pt));
  4. int[] ord_speciaux={34, 35, 36, 37, 38, 92, 94, 95, 123, 125, 126};
  5. string[] car_speciaux={'"', "\#", "\$", "\%", "\&", "\textbackslash", "\textasciicircum", "\textunderscore", "\{", "\}", "\textasciitilde"};
  6.  
  7. string table(int n, int p) {
  8. string l1, l2, etnl;
  9. if(n<32) {write("indice minimum 32"); n=32;}
  10. if(p>126) {write("indice maximum 126"); p=126;}
  11. for(int i=n; i<=p; ++i) {
  12. etnl = (i!=p) ? " & " : " \\ ";
  13. if(search(ord_speciaux, i-1)==search(ord_speciaux, i)) {
  14. l1 += format("%c", i) + etnl;
  15. } else {
  16. l1 += car_speciaux[search(ord_speciaux, i)] + etnl;
  17. }
  18. l2 += format("%i", i) + etnl;
  19. }
  20. return "\newcolumntype{M}{>{\centering\arraybackslash}X}" +
  21. "\begin{tabularx}{15cm}{|l|*{"+string(p-n+1)+"}{@{}M@{}|}} \hline " +
  22. "Caract\`ere & " + l1 + " \hline " +
  23. "Code & " + l2 + " \hline \end{tabularx}";
  24. }
  25. label(table(30,50), (0,0), E);
  26. label(table(51,69), (0,-1), E);
  27. label(table(70,88), (0,-2), E);
  28. label(table(89,107), (0,-3), E);
  29. label(table(108,126), (0,-4), E);

Re: tableau ascii

Posté : mar. 9 déc. 2014, 01:45
par maurice
Merci pour les conseils ; ils sont tous recevables et il y en a quelques uns auxquels j'avais pensé.
C'est vrai qu'on s'attache peut être trop facilement au résultat visuel sans forcément essayer d'optimiser le code.
Après, dans le quotidien du cours de maths au lycée, on ne rencontre pas fréquemment d'illustrations qui demandent beaucoup de reflexion. Je reste quand même satisfait de mon

Code : Tout sélectionner

if(search(ord_speciaux, i-1)==search(ord_speciaux, i))
merci encore.

Bruno