Tester si une valeur est comprise entre deux autres

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
itoine59
Utilisateur débutant
Utilisateur débutant
Messages : 5
Inscription : dimanche 03 octobre 2021, 10:50
Statut actuel : Enseignant

Tester si une valeur est comprise entre deux autres

Message non lu par itoine59 »

Hello,

Je cherche comment écrire la condition suivante:

Code : Tout sélectionner

Si #1 supérieur à 7 ET #1 inférieur à 12
\bonne{\num{#1}}
\else
\mauvaise{\num{#1}}
J'ai un début avec ça, mais je n'arrive pas à ajouter la condition pour inférieur à 12.
Une idée?
Merci!

Code : Tout sélectionner

\def\reponse#1{ 
  \FPifgt{#1}{7}\bonne{\num{#1}}\else\mauvaise{\num{#1}}\fi
}
marco56
Utilisateur chevronné
Utilisateur chevronné
Messages : 1136
Inscription : jeudi 25 novembre 2010, 22:10

Re: if gt and lt

Message non lu par marco56 »

Avec le package ifthen ?
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: if gt and lt

Message non lu par un bon petit »

marco56 a écrit : vendredi 24 février 2023, 16:32 Avec le package ifthen ?
C'est la pire chose qui soit. J'ai toujours considéré que les utilisateurs de ce package ne savent pas programmer en TeX et devraient se renseigner sur les primitives de test de TeX.

Un simple test \ifnum combiné à 2 tests \ifdim suffit ici, mais on peut utiliser aussi la syntaxe de \fpeval (mais ça sera plus lent) :

Code : Tout sélectionner

\def\mytest#1{% #1 = nombre décimal
	\ifnum0\ifdim#1pt > 7pt 1\fi \ifdim#1pt < 12pt 1\fi = 11
		\expandafter\bonne
	\else
		\expandafter\mauvaise
	\fi{\num{#1}}%
}
Programmer en TeX, TeXpérimental
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2270
Inscription : samedi 29 décembre 2007, 00:58

Re: Tester si une valeur est comprise entre deux autres

Message non lu par projetmbc »

Dans un style plus moderne, on peut aussi faire comme suit. Sans définition des commandes \bonne et \mauvaise , et aussi sans le type de données entrées, je propose le premier code suivant.

Code : Tout sélectionner

\documentclass{article}

\NewDocumentCommand\bonne{m}{Bonne #1}

\NewDocumentCommand\mauvaise{m}{Mauvaise #1}

\ExplSyntaxOn

\NewDocumentCommand\mytest{ m }{
    \itoine_test:n { #1 }
}

\cs_new:Nn \itoine_test:n {
    \int_set:Nn \l_tmpa_int { \int_eval:n { #1 } }
    
    \int_compare:nTF { 7 < \l_tmpa_int < 12 }{
    	\bonne{ \int_use:N \l_tmpa_int }
    } {
    	\mauvaise{ \int_use:N \l_tmpa_int }
    }    
}

\ExplSyntaxOff


\begin{document}

5 : \mytest{5}

8 : \mytest{8}

13 : \mytest{13}

\verb#1 - 3*2 + 2*4# : \mytest{1 - 3*2 + 2*4}

\end{document}
Pièces jointes
Capture d’écran 2023-02-25 à 00.26.18.png
itoine59
Utilisateur débutant
Utilisateur débutant
Messages : 5
Inscription : dimanche 03 octobre 2021, 10:50
Statut actuel : Enseignant

Re: Tester si une valeur est comprise entre deux autres

Message non lu par itoine59 »

Merci pour vos réponses!
Il me faut les commandes /bonne et /mauvaise car c'est pour mettre dans un fichier AMC ensuite!
un bon petit a écrit : vendredi 24 février 2023, 17:02
marco56 a écrit : vendredi 24 février 2023, 16:32 Avec le package ifthen ?
C'est la pire chose qui soit. J'ai toujours considéré que les utilisateurs de ce package ne savent pas programmer en TeX et devraient se renseigner sur les primitives de test de TeX.

Un simple test \ifnum combiné à 2 tests \ifdim suffit ici, mais on peut utiliser aussi la syntaxe de \fpeval (mais ça sera plus lent) :

Code : Tout sélectionner

\def\mytest#1{% #1 = nombre décimal
	\ifnum0\ifdim#1pt > 7pt 1\fi \ifdim#1pt < 12pt 1\fi = 11
		\expandafter\bonne
	\else
		\expandafter\mauvaise
	\fi{\num{#1}}%
}
J'ai adapté le code pour mon exemple AMC et ça semble fonctionner.
Merci infiniment!

Code : Tout sélectionner


\FPeval\pHBasiqueQO{round(9+4.9*random,2)}  %pH de la solution mère entre 9 et 13,9
\def\reponsephbasique#1{% #1 = nombre décimal
	\ifnum0\ifdim#1pt < \pHBasiqueQO pt 1\fi \ifdim#1pt > 7.1 pt 1\fi = 11	
		\expandafter\bonne
	\else
		\expandafter\mauvaise
	\fi{\num{#1}}%
}

un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: Tester si une valeur est comprise entre deux autres

Message non lu par un bon petit »

projetmbc a écrit : samedi 25 février 2023, 00:07 Dans un style plus moderne, on peut aussi faire comme suit. Sans définition des commandes \bonne et \mauvaise , et aussi sans le type de données entrées, je propose le premier code suivant.

Code : Tout sélectionner

\cs_new:Nn \itoine_test:n {
    \int_set:Nn \l_tmpa_int { \int_eval:n { #1 } }
    
    \int_compare:nTF { 7 < \l_tmpa_int < 12 }{
    	\bonne{ \int_use:N \l_tmpa_int }
    } {
    	\mauvaise{ \int_use:N \l_tmpa_int }
    }    
}
Mouais :mrgreen: . Ça ne serait pas plutôt :

Code : Tout sélectionner

\cs_new:Nn \itoine_test:n {
    \fp_compare:nTF { 7 < #1 < 12 }
    	\bonne
    	\mauvaise
    { #1 }
}
Ceci dit effectuer un test aussi simple que tester si un décimal est dans un intervalle, par rapport aux primitives de TeX (que décidément vous ne voulez pas voir) la syntaxe si « moderne » de LaTeX3 est :
  • limitée, car TeX admet le point ou la virgule comme séparateur décimal. Dans la macro définie ci-dessus, si vous testez 18,4 la macro \bonne va être exécutée au lieu de la macro \mauvaise ce qui est réellement gênant pour nous français.
  • compliquée, car il faut comprendre cette fumeuse (heu pardon, c'est « fameuse ») syntaxe.
  • impossible à retenir, vu le nombre totalement ahurissant de macros mises à disposition pour les seules expressions en virgule flottante. Alors que les primitives de TeX sont très peu nombreuses, je dirais environ 50 pour celles que l'on utilise couramment ; il est donc très facile d'en retenir le fonctionnement et la syntaxe. En LaTeX3, il faut toujours aller lire fouiller l'énorme doc de interfaces3.
  • très lente (voir code de benchmark ci-dessous) ; en effet, LaTeX3 est environ 60 fois plus lent que TeX ce qui montre que sortir une telle artillerie pour un truc aussi simple est totalement inapproprié, même si la syntaxe est « moderne ».

Code : Tout sélectionner

\documentclass{article}
\def\fairecent#1{%
	#1#1#1#1#1#1#1#1#1#1%
	#1#1#1#1#1#1#1#1#1#1%
	#1#1#1#1#1#1#1#1#1#1%
	#1#1#1#1#1#1#1#1#1#1%
	#1#1#1#1#1#1#1#1#1#1%
	#1#1#1#1#1#1#1#1#1#1%
	#1#1#1#1#1#1#1#1#1#1%
	#1#1#1#1#1#1#1#1#1#1%
	#1#1#1#1#1#1#1#1#1#1%
	#1#1#1#1#1#1#1#1#1#1%
}
\def\fairemillion#1{%
	\expandafter\expandafter\expandafter\fairecent\expandafter\expandafter\expandafter
		{\expandafter\fairecent\expandafter{\fairecent{#1}}}%
}
\def\mytestA#1{% #1 = nombre décimal
	\ifnum0\ifdim#1pt > 7pt 1\fi \ifdim#1pt < 12pt 1\fi = 11
		\expandafter\bonne
	\else
		\expandafter\mauvaise
	\fi{\num{#1}}%
}
\ExplSyntaxOn

\NewDocumentCommand\mytestB{ m }{
    \itoine_test:n { #1 }
}

\cs_new:Nn \itoine_test:n {
    \fp_compare:nTF { 7 < #1 < 12 }
    	\bonne
    	\mauvaise
    { #1 }
}

\ExplSyntaxOff
\def\bonne#1{}\def\mauvaise#1{}
\begin{document}
\pdfresettimer
\fairemillion{\mytestA{9,7}}
\verb|\mytestA| : \the\pdfelapsedtime
\medbreak

\pdfresettimer
\verb|\mytestB| : \fairemillion{\mytestB{9.7}}
\the\pdfelapsedtime
\end{document}
Programmer en TeX, TeXpérimental
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2270
Inscription : samedi 29 décembre 2007, 00:58

Re: Tester si une valeur est comprise entre deux autres

Message non lu par projetmbc »

un bon petit a écrit : samedi 25 février 2023, 09:16 Ça ne serait pas plutôt :

Code : Tout sélectionner

\cs_new:Nn \itoine_test:n {
    \fp_compare:nTF { 7 < #1 < 12 }
    	\bonne
    	\mauvaise
    { #1 }
}
Affaire de goût, ou presque...

De plus, la proposition que j'avais faite indiquait bien que je considérais des entiers faute d'infos suffisantes.

Spécifications floues $\Longrightarrow$ Différentes réponses automatiquement

Enfin, il ne faut pas oublier le \fp_use pour récupérer la valeur, sauf à vouloir afficher le calcul donné à la macro \my_test.

un bon petit a écrit : samedi 25 février 2023, 09:16 Ceci dit effectuer un test aussi simple que tester si un décimal est dans un intervalle, par rapport aux primitives de TeX (que décidément vous ne voulez pas voir)
Choix de style de programmation, donc je ne me lance plus là-dedans, car je ne vais coder qu'en LaTeX3 dorénavant.

un bon petit a écrit : samedi 25 février 2023, 09:16 limitée, car TeX admet le point ou la virgule comme séparateur décimal.
Facile à gérer. On a une primitive LaTeX3 de remplacement d'un token par à un autre... D'un autre côté, TeX manque ici de rigueur, je trouve. Un seul séparateur devrait être accepté.

un bon petit a écrit : samedi 25 février 2023, 09:16 compliquée, car il faut comprendre cette fumeuse (heu pardon, c'est « fameuse ») syntaxe.
Ah bon ! Quelle mauvaise foi. La diversité, cela a du bon. On te propose du Lua, tu râles, on te propose du LaTex3, tu râles, on te propose un code TeX, tu râles en nous faisant sentir à quel point on est mauvais. Mais bon, cela me passe bien au-dessus de la tête maintenant.
un bon petit a écrit : samedi 25 février 2023, 09:16 impossible à retenir, vu le nombre totalement ahurissant de macros mises à disposition pour les seules expressions en virgule flottante.
Vrai de prime abord, mais tout est organisé en espace de noms comme le sont des langages tels que Python et Java via leur système de modules et de bibliothèques. J'imagine que c'est aussi le cas pour Rust... Tout est dans le document interface3 qui est efficace à l'usage, bien qu'inadapté pour apprendre LaTeX3.
un bon petit a écrit : samedi 25 février 2023, 09:16 Alors que les primitives de TeX sont très peu nombreuses, je dirais environ 50 pour celles que l'on utilise couramment...
C'est bien le problème. J'ai besoin de faire de l'analyse de texte, et bien avec LaTeX3, j'ai droit à des primitives pour utiliser des expressions rationnelles, les fameuses regexs.

De plus, avec les flottants de LaTeX3, on dispose directement de fonctions mathématiques standards.
un bon petit a écrit : samedi 25 février 2023, 09:16 très lente
Peut-être, mais je verrais à l'usage. Je ne sais plus qui disait : "Premature optimization is the root of all evil".

un bon petit a écrit : samedi 25 février 2023, 09:16 LaTeX3 est environ 60 fois plus lent que TeX
Et alors... Le projet reste jeune, et rien n'empêche qu'à l'avenir ceci soit amélioré. La lenteur a été reprochée à Python, et les choses évoluent bien de ce point de vue. De plus, je préfère les benchmarks réalistes, donc de nouveau l'usage me dira si....

Sur ce, je suis impatient de retrouver mon VTT...

PS: LaTeX3 a permis au passage la naissance de l3build qui fait du bon boulot pour le test de package, même s'il va devoir être amélioré.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: Tester si une valeur est comprise entre deux autres

Message non lu par un bon petit »

projetmbc a écrit : samedi 25 février 2023, 10:53
un bon petit a écrit : samedi 25 février 2023, 09:16 compliquée, car il faut comprendre cette fumeuse (heu pardon, c'est « fameuse ») syntaxe.
Ah bon ! Quelle mauvaise foi. La diversité, cela a du bon. On te propose du Lua, tu râles, on te propose du LaTex3, tu râles, on te propose un code TeX, tu râles en nous faisant sentir à quel point on est mauvais. Mais bon, cela me passe bien au-dessus de la tête maintenant.
J'ai beau relire votre message, je n'en reviens pas.

Autant d'agressivité alors que j'émets des critiques à l'encontre de LaTeX3 -- pleinement justifiées dans ce cas -- et que vous prenez pour vous. C'est effarant.
Je ne fais que défendre le simple bon sens que tout programmeur fait sien, qui est d'utiliser un outil (très) simple pour un problème (très) simple. Et ce tutoiement...

Mais vous avez des raisons de vous réjouir, car vous avez gagné par KO.
Je vais demander la suppression de mon compte.
Vous n'aurez plus le désagrément de me lire.
Je pense sincèrement que cela vous aidera à vous épanouir ici, tout en résolvant ce complexe d'infériorité qui fait peur à voir.

Bonne continuation.
Programmer en TeX, TeXpérimental
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2270
Inscription : samedi 29 décembre 2007, 00:58

Re: Tester si une valeur est comprise entre deux autres

Message non lu par projetmbc »

Ne pas confondre agacement et agressivité... Quant au tutoiement, je ne voulais pas vous choquer... De plus, ce tutoiement ne concerne que deux lignes marquant une forme d'agacement quant à la méthode employée, et non sur le fond du propos. Tout le reste du message argumente sur une position divergente de la vôtre...

Ne partez pas à cause de moi, cela n'en vaut pas la peine.