IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation (La)TeX avancée Discussion :

code et string


Sujet :

Programmation (La)TeX avancée

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 39
    Points
    39
    Par défaut code et string
    Bonjour à tous.

    J'ai créé des exercices de trigonométrie faisant appel à des valeurs aléatoires. Voici par exemple celui sur le cosinus, on demande de calculer la longueur du côté adjacent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    \FPeval{\lettrea}{trunc(24*random+1,0)}
    \FPeval{\lettreaa}{clip(\lettrea+1)}
    \FPeval{\lettreaaa}{clip(\lettrea+2)}
    %
    \StrChar{\Alphabet{}}{\lettrea}[\A]
    \StrChar{\Alphabet{}}{\lettreaa}[\B]
    \StrChar{\Alphabet{}}{\lettreaaa}[\C]
    %
    \FPeval{\triglongueuraI}{trunc(70*random+10,0)}% angle
    \FPeval{\triglongueurbI}{clip(trunc(15*random+5,1))}% CB ou AB
    %
    \exo{}
    On considère le triangle $\A\B\C$ rectangle en $\A$ tel que : $\C\B=\num{\triglongueurbI}$~cm et $\widehat{\A\B\C}=\num{\triglongueuraI}$\degre{}.
     
    Calcule la longueur $\A\B$, tu donneras une valeur approchée au millimètre près.
    %
    \begin{correction}
    \FPeval{\reponseI}{clip(round(\triglongueurbI*cos(\triglongueuraI*\FPpi/180),1))}
    Dans le triangle $\A\B\C$ rectangle en $\A$, on a :
    \begin{align*}
    	\cos\widehat{\A\B\C} & = \frac{\A\B}{\B\C}\\
    	\cos\num{\triglongueuraI} & = \frac{\A\B}{\num{\triglongueurbI}}\\
    	\frac{\cos\num{\triglongueuraI}}{1} & = \frac{\A\B}{\num{\triglongueurbI}}\\
    	\intertext{On utilise le produit en croix}
    	\A\B & = \frac{\num{\triglongueurbI} \times \cos\num{\triglongueuraI}}{1}\\
    	\A\B & \approx \num{\reponseI}
    \end{align*}
    Le côté $\A\B$ mesure environ~$\num{\reponseI}$~cm.
    \end{correction}
    \finexo
    J'ai créé le même type d'exercice avec le sinus et la tangente et pour calculer chacun des côtés. Soit 6 exercices au total.

    Je souhaiterai les inclure dans une liste afin de sélectionner aléatoirement trois exercices de la liste et de les compiler. Mais lorsque je sors un élément d'une liste, c'est devenu une chaine qui ne se compile pas. Quelqu'un aurait-il une solution pour compiler un programme sorti d'une chaîne ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu as essayé un \expandafter lorsque tu ajoutes l'élément à la liste ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Afin de travailler avec un exemple plus simple, voici ce que j'ai fait en ajoutant la commande \expandafter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    \documentclass{book}
    %
    \usepackage{ae, lmodern}
    \usepackage{fontspec}
    \usepackage[frenchb]{babel}
    \usepackage{fontspec}
    \usepackage{xstring}
    \usepackage{amsmath, amssymb,mathrsfs}
    \usepackage[thmmarks,amsmath]{ntheorem}
    \usepackage{answers}
    %
    %
    %  Definition des exercices
    %
    \theoremstyle{break}
    \newtheorem{Exc}{Exercice}
     
    \Newassociation{correction}{Soln}{mycor}
    \Newassociation{indication}{Indi}{myind}
     
    \renewcommand{\Solnlabel}[1]{\bf \emph{Corrigé exercice #1}}
    \renewcommand{\Indilabel}[1]{\bf \emph{Indication exercice #1:}}
    %
    \def\exo#1{\futurelet\testchar\MaybeOptArgmyexoo}
    \def\MaybeOptArgmyexoo{\ifx[\testchar \let\next\OptArgmyexoo
                            \else \let\next\NoOptArgmyexoo \fi \next}
    \def\OptArgmyexoo[#1]{\begin{Exc}[#1]\normalfont}
    \def\NoOptArgmyexoo{\begin{Exc}\normalfont}
    %
    \newcommand{\finexo}{\end{Exc}}
    %\newif\ifcor
    \newcommand{\flag}[1]{}
    %
    %
     
     
    \begin{document}
    \Opensolutionfile{mycor}[ficcorex]
    \Opensolutionfile{myind}[ficind]
     
    \StrChar{%
    \expandafter{%
    \exo{}%
    Calcule $2+3$%
    \begin{correction}%
    $2+3=5$%
    \end{correction}%
    \finexo%
    }%
    %
    \expandafter{%
    \exo{}%
    Calcule $8+2$%
    \begin{correction}%
    $8+2=10$%
    \end{correction}%
    \finexo%
    }}{1}
    %
    \newpage
    	\begin{center}
    	{\Large \textsc{Corrigés}}
    	\end{center}
    	\rule{\textwidth}{1pt}
    		\vskip 0.5cm%
    \Closesolutionfile{mycor}
    \Readsolutionfile{mycor}
    %
    \end{document}
    j'ai du créer une boucle infinie car après un quart d'heure la compilation n'était pas terminée...

  4. #4
    Expert éminent sénior

    Avatar de -Nikopol-
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    2 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 174
    Points : 11 289
    Points
    11 289
    Billets dans le blog
    5
    Par défaut
    Je ne pense pas que ce soit une boucle infinie, j'ai souvent le cas avec XeTeX quand une compilation plante, elle ne s’arrête pas. Si tu forces l’arrêt tu obtiens tout de même un fichier log qui peut te permettre de résoudre ton soucis.
    ! Undefined control sequence.
    \exo #1->\futurelet \testchar
    \MaybeOptArgmyexoo
    l.59 }}{1}
    The control sequence at the end of the top line
    of your error message was never \def'ed. If you have
    misspelled it (e.g., `\hobx'), type `I' and the correct
    spelling (e.g., `I\hbox'). Otherwise just continue,
    and I'll forget about whatever was undefined.
    ! Argument of \define@filename has an extra }.
    <inserted text>
    \par
    l.59 }}{1}
    I've run across a `}' that doesn't seem to match anything.
    For example, `\def\a#1{...}' and `\a}' would produce
    this error. If you simply proceed now, the `\par' that
    I've just inserted will cause me to report a runaway
    argument that might be the root of the problem. But if
    your `}' was spurious, just type `2' and it will go away.
    Runaway argument?
    {myind}{\def \@currenvir {Exc}\edef \@currenvline {\on@line }\csname \ETC.
    ! Paragraph ended before \define@filename was complete.
    <to be read again>
    \par
    l.59 }}{1}
    I suspect you've forgotten a `}', causing me to apply this
    control sequence to too much text. How can we recover?
    My plan is to forget the whole thing and hope for the best.
    ! Undefined control sequence.
    \exo #1->\futurelet \testchar
    \MaybeOptArgmyexo
    Process exited with error(s)
    Sinon, je n'ai pas bien compris ton problème. Tu as une liste d'exercices et tu veux pouvoir les sélectionner de façon aléatoire? c'est bien ça?

  5. #5
    Expert éminent sénior

    Avatar de -Nikopol-
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    2 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 174
    Points : 11 289
    Points
    11 289
    Billets dans le blog
    5
    Par défaut
    J'ai créé le même type d'exercice avec le sinus et la tangente et pour calculer chacun des côtés. Soit 6 exercices au total.
    sin, cos et tan et trois côtés ça fait 9 non?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Les données sont toujours un angle et une longueur.

    Donc avec le cos je donne l'angle et le côté adjacent et je demande l'hypoténuse ou je donne l'angle et l'hypoténuse et je demande le côté adjacent. Donc deux possibilités pour chacune des 3 fonctions trigo soit 6 possibilités. Et en effet le but est de générer des fiches d'exercices sélectionnant 3 exercices parmi les 6 possibilités de façon aléatoire.

    J'ai programmé chacun des 6 types d'exercices avec des valeurs aléatoires et les corrigés comme je l'ai déjà mis en exemple concernant le cosinus. Maintenant je bloque sur : comment faire pour sélectionner seulement 3 exercices parmi les 6 de façon aléatoires ?

    Merci beaucoup pour l'aide

  7. #7
    Expert éminent sénior

    Avatar de -Nikopol-
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    2 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 174
    Points : 11 289
    Points
    11 289
    Billets dans le blog
    5
    Par défaut
    Les données sont toujours un angle et une longueur.

    Donc avec le cos je donne l'angle et le côté adjacent et je demande l'hypoténuse ou je donne l'angle et l'hypoténuse et je demande le côté adjacent. Donc deux possibilités pour chacune des 3 fonctions trigo soit 6 possibilités. Et en effet le but est de générer des fiches d'exercices sélectionnant 3 exercices parmi les 6 possibilités de façon aléatoire.
    J'avoue le pas trop avoir réfléchi avant de balancer cette réponse

    Que penses-tu de ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    \documentclass{minimal}
    \usepackage{xstring,fp}
    \expandafter\FPseed\expandafter=\pdfuniformdeviate 1000000\relax
    \def\nbalea#1{%   
        \FPrandom{\result}%
        \FPeval{\result}{\result*#1}%
        \FPround\result{\result}{0}%
        \edef\result{\number\numexpr\result+1}%
        }
    \catcode`@=11
    \def\ex@un{1\par}
    \def\ex@de{2\par}
    \def\ex@tr{3\par}
    \def\ex@qu{4\par}
    \def\ex@ci{5\par}
    \def\ex@si{6\par}
    \def\exoalea{%
    	\def\listexo{{\ex@un}{\ex@de}{\ex@tr}{\ex@qu}{\ex@ci}{\ex@si}}%
    			\nbalea{6}%
    	\StrChar{\listexo}{\result}[\exo]%
    		\StrDel{\listexo}{\exo}[\listexo]\exo%
    			\nbalea{5}%
    	\StrChar{\listexo}{\result}[\exo]\exo%
    		\StrDel{\listexo}{\exo}[\listexo]%
    		\nbalea{4}%
    	\StrChar{\listexo}{\result}[\exo]\exo%
    		\StrDel{\listexo}{\exo}[\listexo]%
    		\nbalea{3}%
    	\StrChar{\listexo}{\result}[\exo]\exo%
    		\StrDel{\listexo}{\exo}[\listexo]%
    			\nbalea{2}%
    	\StrChar{\listexo}{\result}[\exo]\exo%
    	\StrDel{\listexo}{\exo}}
    \catcode`@=12
    \begin{document}
    \exoalea
    \end{document}
    J'ai eu besoin d'un générateur de nombres aléatoires, ensuite tu définis tes six exercices individuellement et la macro \exoalea ce charge de les mettre dans un ordre aléatoire.
    je l'ai faite pour six exo mais tu devrais pouvoir adapter sans soucis.

  8. #8
    Expert éminent sénior

    Avatar de -Nikopol-
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    2 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 174
    Points : 11 289
    Points
    11 289
    Billets dans le blog
    5
    Par défaut
    Et bien non, ça ne parait pas si simple à adapter, j'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    \documentclass{minimal}
    \usepackage{xstring,fp}
    \expandafter\FPseed\expandafter=\pdfuniformdeviate 1000000\relax
    \def\nbalea#1{%   
        \FPrandom{\result}%
        \FPeval{\result}{\result*#1}%
        \FPround\result{\result}{0}%
        \edef\result{\number\numexpr\result+1}%
        }
    \catcode`@=11
    \def\ex@un{1\par}
    \def\ex@de{2\par}
    \def\ex@tr{3\par}
    \def\ex@qu{4\par}
    \def\ex@ci{5\par}
    \def\ex@si{6\par}
    \def\exoalea{%
    	\def\listexo{{\ex@un}{\ex@de}{\ex@tr}{\ex@qu}{\ex@ci}{\ex@si}}%
    			\nbalea{6}%
    	\StrChar{\listexo}{\result}[\exo]%
    		\StrDel{\listexo}{\exo}[\listexo]\exo%
    			\nbalea{5}%
    	\StrChar{\listexo}{\result}[\exo]\exo%
    		\StrDel{\listexo}{\exo}[\listexo]%
    		\nbalea{4}%
    	\StrChar{\listexo}{\result}[\exo]\exo%
    		\StrDel{\listexo}{\exo}}
    \catcode`@=12
    \begin{document}
    \exoalea
    \end{document}
    mais cela m'imprime quand même les 6 exercices, si quelqu'un comprend je veux bien une explication, car je pensais n'imprimer que trois \exo.


    Le problème peut être réglé à coup de \csname, je posterai une solution demain, mais pour ce soir ce soucis m'intrigue fortement.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Alors moi j'ai aussi travaillé sur une solution en croisant les tests conditionnels \FPifeq \else \fi.

    Je générais deux valeurs aléatoires choixI et choixII aléatoires, la première prenant des valeurs entre 1 et 6 et la seconde prenant les valeurs 1 et 2.

    En faisant des copier-coller (je sais c'est nul) j'ai pu mettre mes exercices dans les 6 ordres possibles cosinus - sinus - tangente, cosinus tangente sinus etc.
    Donc la première variable choixI indiquait quel ordre on choisit et la seconde quel type d'exo appliquer à la fonction trigo.

    Mais là aussi, j'ai systématiquement les 6 exercices.

    Alors que ça fonctionne bien dans le cas du calcul de l'angle, mais comme il n'y a qu'une possibilité pour chaque fonction trigo, je n'ai pas croisé les tests.

    Moi aussi je laisse tomber pour ce soir mais je reprendrai ce problème demain et j'étudierai vos solutions.
    Encore merci.

  10. #10
    Expert éminent sénior

    Avatar de -Nikopol-
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    2 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 174
    Points : 11 289
    Points
    11 289
    Billets dans le blog
    5
    Par défaut
    Je pense que ceci pourrait convenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    \documentclass{minimal}
    \usepackage{xstring,fp}
    \expandafter\FPseed\expandafter=\pdfuniformdeviate 1000000\relax
    \def\nbalea#1{%   
        \FPrandom{\result}%
        \FPeval{\result}{\result*#1}%
        \FPround\result{\result}{0}%
        \edef\result{\number\numexpr\result+1}%
        }
    \catcode`@=11
    \def\ex@un{1\par}
    \def\ex@de{2\par}
    \def\ex@tr{3\par}
    \def\ex@qu{4\par}
    \def\ex@ci{5\par}
    \def\ex@si{6\par}
    \def\exoalea{%
    	\def\listexo{{\ex@un}{\ex@de}{\ex@tr}{\ex@qu}{\ex@ci}{\ex@si}}%
    			\nbalea{6}%
    	\StrChar{\listexo}{\result}[\exo]\exo%
    		\StrDel{\listexo}{\exo}[\listexo]%
    			\nbalea{5}%
    	\StrChar{\listexo}{\result}[\exo]\exo%
    		\StrDel{\listexo}{\exo}[\listexo]%
    		\nbalea{4}%
    	\StrChar{\listexo}{\result}[\exo]\exo%
    		}
    \catcode`@=12
    \begin{document}
    \exoalea
    \end{document}

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Lorsque je compile votre code j'obtiens des erreurs que je n'arrive pas à corriger malgré plusieurs jours de recherches (par tâtonnement je l'avoue).

    Je n'ai pas compris les lignes 10 et 28 : et Par contre j'ai bien compris que vous créez une macro \nbalea#1 qui prends comme valeur un nombre entier aléatoire entre 1 et #1
    Vous créez la \listexo{} qui contient les 6 exercices précédemment définis (\exo@un, \exo@de etc)

    Ensuite la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \StrChar{\listexo}{\result}[\exo]\exo
    permet de sélectionner l'exercice n° \nbalea{6} de la liste, de le ranger dans la variable \exo et d'afficher cette variable \exo (est-ce que l'exo va être compilé ou est-ce que je vais avoir une longue chaîne avec tout mon code de l'exercice ?)

    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \StrDel{\listexo}{\exo}[\listexo]
    permet de supprimer l'exo précédemment affiché puis de renommer \listexo la liste des 5 exercices restants.

    On répète l'opération pour avoir 3 exercices.

    Donc mises à part les lignes 10 et 28 cela me semble clair... mais pas pour mon ordinateur qui me renvoie des messages d'erreurs. Et lorsque je force la création du pdf j'obtiens une série de 58 nombres entiers entre 1 et 6 et à certains endroits une paire de crochets ou certains des nombres sont eux entre crochets.

    Je suis désolé de vous solliciter de nouveau mais ce problème est insoluble pour moi.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Il y a une méthode plus efficace de faire : avec ce code,on peut définir autant d'exercices qu'on veut et leur donner le nom que l'on veut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    \documentclass{article}
    \usepackage{xstring}
    \makeatletter
    \newcount\exo@count\newcommand\initexo{\exo@count=0 \def\liste@exos{,}}
    \newcommand\definirexo[2]{\advance\exo@count1 \edef\liste@exos{\liste@exos#1,}%
    	\expandafter\def\csname exo.#1\endcsname{#2}}
    \newcommand\aleaexo{\edef\ran@item{\the\numexpr\pdfuniformdeviate\exo@count+1}%
    	\StrBetween[\ran@item,\the\numexpr\ran@item+1]{\liste@exos}{,}{,}[\exo@courant]%
    	\csname exo.\exo@courant\endcsname\par% <-- affichage de l'exo tiré au hasard
    	\StrDel\liste@exos{\exo@courant,}[\liste@exos]%
    	\advance\exo@count-1 \ifnum\exo@count>0 \expandafter\aleaexo\fi}
    \makeatother
    \begin{document}
    \initexo
    \definirexo {1} {Mon exercice 1}
    \definirexo {2} {Essai pour l'ex 2}
    \definirexo {3} {L'exercice 3}
    \definirexo {4} {l'avant dernier exercice !!!}
    \definirexo {bonus} {Le bonus qui rapporte plein de point}
    \definirexo {5} {Le dernier exo}
    \aleaexo
    \end{document}

  13. #13
    Invité
    Invité(e)
    Par défaut
    Pouvez-vous commenter le code des commandes que vous avez écrites afin de rendre votre code lisible par tous ?
    Merci.
    Dernière modification par LittleWhite ; 23/07/2017 à 16h23. Motif: Pas besoin de citer l'intégralité du message précédent

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par AndréC Voir le message
    Pouvez-vous commenter le code des commandes que vous avez écrites afin de rendre votre code lisible par tous ?
    Ligne 4 : initialisation nombre d'exos et liste
    Ligne 5 : incrémentation nb exo et mise à jour liste
    Ligne 6 : stockage du texte de l'exo
    Ligne 7 : tirage d'une nombre au hasard
    Ligne 8 : sélection de nom de l'exo correpondant
    Ligne 10 : suppression de l'exo dans la liste
    Ligne 11 : s'il reste des exo, recommencer

  15. #15
    Invité
    Invité(e)
    Par défaut
    Merci.

  16. #16
    Expert éminent sénior

    Avatar de -Nikopol-
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    2 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 174
    Points : 11 289
    Points
    11 289
    Billets dans le blog
    5
    Par défaut
    Il y a une méthode plus efficace de faire :
    il a surtout l'avantage d'accepter des macros dans le texte des exercices. En revanche Dexter80, ne voulait n'imprimer que trois exercices parmi les 6 définis au préalable. Il faudrait faire un mix de nos deux solutions. Et effectivement comme je l'avais indiqué dans un message précédant, avec \csname la solution est meilleure.

    Lorsque je compile votre code j'obtiens des erreurs que je n'arrive pas à corriger malgré plusieurs jours de recherches (par tâtonnement je l'avoue).
    Poste le message log, mais à mon avis c'est dû au fait que mon code n'accepte que du texte. Donc ma solution n'est pas satisfaisante, je ne l'ai pas testé suffisamment. Désolé

    Pour les lignes 10 et 28, c'est juste de la frime :
    \catcode`@=11 change le code de catégorie de @ pour en faire une lettre : \makeatletter.
    \catcode`@=12 change le code de catégorie de @ pour en faire autre chose : \makeatother
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    \catcode`@=11
    et
    \catcode`@=12
    proviennent de TeX, alors que \makeatletter et \makeatother sont des macros définies par LaTeX:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    \def\makeatletter{\catcode`\@11\relax}
    \def\makeatother{\catcode`\@12\relax}
    Confère le fichier latex.ltx dans la distribution.


    PS: je n'ai pas le temps de me pencher d'avantage sur le code, je suis en vacances.

  17. #17
    Expert éminent sénior

    Avatar de -Nikopol-
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    2 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 174
    Points : 11 289
    Points
    11 289
    Billets dans le blog
    5
    Par défaut
    En revanche Dexter80, ne voulait n'imprimer que trois exercices parmi les 6 définis au préalable. Il faudrait faire un mix de nos deux solutions.
    Suis-je bête , j'avais pas étudié le code de ano_bg du tout, en faite il est facile d'adapter ce code afin de n'avoir que trois exercices. Il suffit de changer cette ligne de code \ifnum\exo@count>0 en mettant 3 (à condition de ne définir que six exercices comme le souhaite Dexter80) Si on définit plus d'exercices il faudra juste inverser le décompte du compteur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    \documentclass{article}
    \usepackage{xstring}
    \makeatletter
    \newcount\exo@count
    \newcommand\initexo{\exo@count=0 \def\liste@exos{,}}
    \newcommand\definirexo[2]{\advance\exo@count1%
    	\edef\liste@exos{\liste@exos#1,}%
    	\expandafter\def\csname exo.#1\endcsname{#2}}
    \newcommand\aleaexo{\edef\ran@item{\the\numexpr\pdfuniformdeviate\exo@count+1}%
    	\StrBetween[\ran@item,\the\numexpr\ran@item+1]{\liste@exos}{,}{,}[\exo@courant]%
    	\csname exo.\exo@courant\endcsname\par
    	\StrDel\liste@exos{\exo@courant,}[\liste@exos]%
    	\advance\exo@count-1 \ifnum\exo@count>3\expandafter\aleaexo\fi}
    \makeatother
    \begin{document}
    \initexo
    \definirexo {1} {Mon exercice 1}
    \definirexo {2} {Essai pour l'ex 2}
    \definirexo {3} {L'exercice 3}
    \definirexo {4} {l'avant dernier exercice !!!}
    \definirexo {bonus} {Le bonus qui rapporte plein de point}
    \definirexo {5} {Le dernier exo}
    \aleaexo
    \end{document}
    Je pense donc qu'on a une repose satisfaisante, merci à ano_bg.

  18. #18
    Expert éminent sénior

    Avatar de -Nikopol-
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    2 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 174
    Points : 11 289
    Points
    11 289
    Billets dans le blog
    5
    Par défaut
    J'ai une autre solution, (cette question m'a beaucoup amusée, ça faisait longtemps que je n'avais pas du réfléchir autant pour faire un code)
    On peut définir autant d'exercices que l'on veut, seul trois seront imprimés, le développement des macros semble fonctionner (du moins pour les tests que j'ai fait).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    \documentclass{article}
    \usepackage{fp}
    \usepackage{mwe}
    \expandafter\FPseed\expandafter=\pdfuniformdeviate 1000000\relax
     
    \catcode`@=11
    \def\nbalea#1{%   
        \FPrandom{\result}%
        \FPeval{\result}{\result*#1}%
        \FPround\result{\result}{0}%
        \edef\result{\number\numexpr\result+1}%
        }
     
    \newcount\c@unt@ne
    \newcount\c@unttw@
     
    \def\defexo{\advance\c@unt@ne\@ne%
      			\expandafter\def\csname\number\c@unt@ne\endcsname}
     
    \def\printexo#1{\csname\number#1\endcsname}
     
    \def\exoalea{%
      \c@unttw@=\c@unt@ne%
      \loop%
        	\expandafter\let\csname temp\number\c@unttw@\endcsname d%
        	\advance\c@unttw@-\@ne%
        	\ifnum\c@unttw@>0%
      \repeat%
      \c@unttw@=\c@unt@ne%
      \loop%
            \nbalea{\number\c@unt@ne}
            \expandafter\ifx\csname temp\number\result\endcsname d%
          				\expandafter\let\csname temp\number\result\endcsname t% 
          				\printexo\result%
          				\advance\c@unttw@-\@ne%
          				\fi%
        	\ifnum\c@unttw@>\number\numexpr\c@unt@ne-3%
      \repeat}
     
     
    \defexo{\section{exercice 1:}\textbf{exo 1}\par}% 
    \defexo{\section{exercice 2:}\includegraphics[scale=1]{image-a}\par}%
    \defexo{\section{exercice 3:}\begin{enumerate}
    \item avec une liste
    \item bis
    \end{enumerate}\par}%
    \defexo{\section{exercice 4:}\[\sqrt{\frac{_{x}}{2}}\]\par}%
    \defexo{\section{exercice 5:} normalement cela fonctionne }%
    \defexo{\section{exercice 6:} \def\mamacro{test d'une macro}\mamacro}%
    \defexo{\section{exercice 7:}on peut d\'efinir autant d'exercices que l'on veut}%
    \defexo{\section{exercice 8:} seul 3 vont \^etre imprim\'es}%
    \catcode`@=12
    \begin{document}
    \exoalea
    \end{document}

    PS: Il serait bien que Dexter80 vienne indiquer si les solutions lui conviennent.

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Bonjour, désolé j'étais resté sur le message des vacances avant de moi-même partir.

    De retour j'ai pu me plonger dans vos solutions, la dernière fonctionne très bien dés l'instant où les exercices sont définis sans correction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
    \documentclass{book}
    \usepackage[frenchb]{babel}
    \usepackage{amsmath}
    \usepackage{xstring}
    \usepackage{fp}
    \usepackage{answers}
    \usepackage[thmmarks, amsmath]{ntheorem}
    \usepackage{mwe}
    \expandafter\FPseed\expandafter=\pdfuniformdeviate 1000000\relax
    %
    %
    \theoremstyle{break}
    \newtheorem{Exc}{Exercice}
     
    \Newassociation{correction}{Soln}{mycor}
    \Newassociation{indication}{Indi}{myind}
     
    \renewcommand{\Solnlabel}[1]{\bf \emph{Corrigé exercice #1}}
    \renewcommand{\Indilabel}[1]{\bf \emph{Indication exercice #1:}}
    %
    \def\exo#1{\futurelet\testchar\MaybeOptArgmyexoo}
    \def\MaybeOptArgmyexoo{\ifx[\testchar \let\next\OptArgmyexoo
                            \else \let\next\NoOptArgmyexoo \fi \next}
    \def\OptArgmyexoo[#1]{\begin{Exc}[#1]\normalfont}
    \def\NoOptArgmyexoo{\begin{Exc}\normalfont}
    %
    \newcommand{\finexo}{\end{Exc}}
    \newcommand{\flag}[1]{}
     
     
    \catcode`@=11
    \def\nbalea#1{%   
        \FPrandom{\result}%
        \FPeval{\result}{\result*#1}%
        \FPround\result{\result}{0}%
        \edef\result{\number\numexpr\result+1}%
        }
     
    \newcount\c@unt@ne
    \newcount\c@unttw@
     
    \def\defexo{\advance\c@unt@ne\@ne%
      			\expandafter\def\csname\number\c@unt@ne\endcsname}
     
    \def\printexo#1{\csname\number#1\endcsname}
     
    \def\exoalea{%
      \c@unttw@=\c@unt@ne%
      \loop%
        	\expandafter\let\csname temp\number\c@unttw@\endcsname d%
        	\advance\c@unttw@-\@ne%
        	\ifnum\c@unttw@>0%
      \repeat%
      \c@unttw@=\c@unt@ne%
      \loop%
            \nbalea{\number\c@unt@ne}
            \expandafter\ifx\csname temp\number\result\endcsname d%
          				\expandafter\let\csname temp\number\result\endcsname t% 
          				\printexo\result%
          				\advance\c@unttw@-\@ne%
          				\fi%
        	\ifnum\c@unttw@>\number\numexpr\c@unt@ne-3%
      \repeat}
     
     
    \defexo{
    \exo{}
    	Calcule 1+2
    	\begin{correction}
    	1+2=3
    	\end{correction}
    \finexo}% 
    \defexo{\exo{}
    	Calcule 2+2
    	\begin{correction}
    	2+2=4
    	\end{correction}
    \finexo}% 
    %
    \defexo{\exo{}
    	Calcule 3+2
    	\begin{correction}
    	3+2=5
    	\end{correction}
    \finexo}% 
    %
    \defexo{\exo{}
    	Calcule 4+2
    	\begin{correction}
    	4+2=6
    	\end{correction}
    \finexo}% 
    %
    \defexo{\exo{}
    	Calcule 5+2
    	\begin{correction}
    	5+2=7
    	\end{correction}
    \finexo}% 
    %
    \defexo{\exo{}
    	Calcule 6+2
    	\begin{correction}
    	6+2=8
    	\end{correction}
    \finexo}% 
    %
    \defexo{\exo{}
    	Calcule 7+2
    	\begin{correction}
    	7+2=9
    	\end{correction}
    \finexo}% 
    %
    \defexo{\exo{}
    	Calcule 8+2
    	\begin{correction}
    	8+2=10
    	\end{correction}
    \finexo}% 
    %
    \catcode`@=12
    \begin{document}
    \Opensolutionfile{mycor}[ficcorex]
    \Opensolutionfile{myind}[ficind]
    %
    \exoalea
    %%%%%%%%%%%%%%%%%%%%
    \newpage
    	\begin{center}
    	{\Large \textsc{Corrigés}}
    	\end{center}
    	\rule{\textwidth}{1pt}
    		\vskip 0.5cm%
    \Closesolutionfile{mycor}
    \Readsolutionfile{mycor}
    \end{document}
    J'avoue avoir testé sans essayer de comprendre, mais je vais m'y pencher cet aprem.
    Merci pour votre travail.

Discussions similaires

  1. conversion escape code en string
    Par awalter1 dans le forum Général Python
    Réponses: 2
    Dernier message: 29/07/2011, 13h59
  2. supprimer le code html d'une chaîne String
    Par adrien.nicolet dans le forum Langage
    Réponses: 3
    Dernier message: 04/06/2006, 18h08
  3. [Excel] Intreprêter du string en code
    Par Rakham dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/01/2006, 10h05
  4. [String]Comment etendre le mon Code ASCII??
    Par lanfeustdetroll dans le forum API standards et tierces
    Réponses: 24
    Dernier message: 25/07/2005, 14h42
  5. [C#]Comment executer du code qui se trouve dans une string ?
    Par freddyboy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 28/02/2005, 16h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo