Aller au contenu

[Résolu] Comparaison de valeurs réelles


Messages recommandés

Posté(e)

Bonjour à tous,

 

Voilà je vous expose mon problème.

 

Je souhaite comparer une valeur rentrée par l'utilisateur avec d'autres valeurs (réelles) que j'ai préalablement rentrer dans des variables.

 

Je souhaite en récupérer la valeur la plus proche.

 

Ex :

 

l'utilisateur rentre 100

Mes variables sont 1000, 200 , 120

L'outil me sort le 120.

 

Je vous remercie par avance

  • Upvote 1
Posté(e)

Coucou

 

voici une petit chose tapée à la va-vite (c'est dimanche soir je suis fourbu de la semaine)

je te le donne pour piste de recherche car ça ne doit pas fonctionner dans tons les cas, par exemple en cas d'égalité de différence dans la liste !

 

amicalement :

(setq valeur 1020)
(setq liste '( 1040 110 109 95 212 99 1019 ))

(setq n 0)
(setq listetempo
  	(mapcar '(lambda (x)
      	       	(abs (- valeur x))
	       	)
  			liste)
 	)
(setq valeur_proche (- valeur (nth 0 (vl-sort listetempo '<))))

Posté(e)

Bonsoir,

 

Très rapidement une autre façon de faire et un prétexte pour venir vous faire un petit coucou,

 

(defun proche (val l)
 
 (defun reduce	(fun lst)
   (if	(cdr lst)
     (reduce fun (cons ((eval fun) (car lst) (cadr lst)) (cddr lst)))
     (car lst)
   )
 )

 (reduce '(lambda (x y)
     (if (< (abs (- val x)) (abs (- val y)))
       x
       y
     )
   )
  l
 )
)

 

_$ (proche 1020 '(1040 110 109 95 212 99 1019))
1019

 

Voir cette discussion pour plus d'explication sur le procédé http://cadxp.com/topic/34706-trier-une-liste-de-dates/page__view__findpost__p__188141

 

Bonne continuation à tous

Bruno

  • Upvote 1

Apprendre => Prendre => Rendre

Posté(e)

Coucou

 

S'il te plaît, fais attention aux titres des messages :

 

C'est une coïncidence mais deux messages sortent en même temps

L'un portant sur les comparaisons d'entiers mais intitulé : Comparaison de valeurs réelles

Et l'autre : Comparaison de valeurs

Ce dernier portant sur les réels ...

 

Bel imbroglio...

 

Amicalement

  • Upvote 1
Posté(e)

Bonjour à tous et désolé de ne répondre que maintenant. Je vous remercie Didier et VDH-BRUNO pour vos réponses ! Je me rappelle que j'allais sur ce site, il y a maintenant deux ans car je devais faire un petit outil pour mon école. Aujourd'hui en revenant ça fait plaisir de voir que vous êtes toujours abonné à la chaine ! <img src='http://cadxp.com/public/style_emoticons/<#EMO_DIR#>/laugh.gif' class='bbc_emoticon' alt=':(rires forts):' />

 

J'ai vraiment perdu le peu je connaissais en AUTOLISP donc j'essaie de m'y remettre petit à petit, simplement par plaisir et envie.

 

Didier : Ma question est : est ce qu'il existe une autre fonction que Vl-sort qui puisse faire le même travail sur des versions d'Autocad plus anciennes?

 

 

Bruno : Honnêtement je penche un peu sur ton bout de code ainsi que la réponse élémentaire de notre fameux Gilles ! Je sèche un peu, mais c'est bon :)

 

Je ne comprends pas le programme donc j'essaie de revoir avant toutes les petites sous fonctions qu'il y a à l'intérieur pour me réaménager le cerveau :unsure:

 

J'essaie de faire un test et ma question comment utiliser une fonction dans une autre fonction, monde code d'essai :

 

(defun c:multip(mavar)


	(* mavar mavar)

)

(defun c:addi(multip val1)


	 (setq val1 2)
 (setq ValeurMultiplie  (addi(multip(val1))))
 	 (setq result (+ ValeurMultiplie val1))
 	 (princ result)
  


)

 

A bientôt et merci encore !

  • Downvote 1
Posté(e)

Bonjour à tous et désolé de ne répondre que maintenant. Je vous remercie Didier et VDH-BRUNO pour vos réponses ! Je me rappelle que j'allais sur ce site, il y a maintenant deux ans car je devais faire un petit outil pour mon école. Aujourd'hui en revenant ça fait plaisir de voir que vous êtes toujours abonné à la chaine ! <img src='http://cadxp.com/public/style_emoticons/<#EMO_DIR#>/laugh.gif' class='bbc_emoticon' alt=':(rires forts):' />

 

J'ai vraiment perdu le peu je connaissais en AUTOLISP donc j'essaie de m'y remettre petit à petit, simplement par plaisir et envie.

 

Didier : Ma question est : est ce qu'il existe une autre fonction que Vl-sort qui puisse faire le même travail sur des versions d'Autocad plus anciennes?

 

 

Bruno : Honnêtement je penche un peu sur ton bout de code ainsi que la réponse élémentaire de notre fameux Gilles ! Je sèche un peu, mais c'est bon :)

 

Je ne comprends pas le programme donc j'essaie de revoir avant toutes les petites sous fonctions qu'il y a à l'intérieur pour me réaménager le cerveau :unsure:

 

J'essaie de faire un test et ma question comment utiliser une fonction dans une autre fonction, mon code d'essai :

 

(defun c:multip(mavar)


	(* mavar mavar)

)

(defun c:addi(multip val1)


	 (setq val1 2)
 (setq ValeurMultiplie  (addi(multip(val1))))
 	 (setq result (+ ValeurMultiplie val1))
 	 (princ result)
  


)

 

A bientôt et merci encore !

  • Upvote 1
Posté(e)

Salut,

 

Ci-dessous, une fonction qui implémente un algorithme simple :

pour un nombre donné et une liste de nombres (arguments), on cherche la plus petite différence entre ce nombre et chacun des termes de la liste.

 

pseudo code

arguments :

input = le nombre dont on cherche le plus proche dans une liste

lst = la liste dans laquelle on cherche le nombre le plus proche

procédure :

result = premier terme de lst

delta = valeur absolue de input - result

Pour chaque n, terme suivant de la liste

si valeur absolue de input - n est inférieur à delta

alors result = n et delta = valeur absolue de input - n

 

(defun nearest (;; arguments
	input  ;; le nombre dont on cherche le plus proche
	lst    ;; la liste des nombres à comparer
	/ ;; variables
	delta  ;; la valeur absolue de la plus petite différence
	result ;; la nombre de la liste le plus proche du  nombre en argument
	)
 
 ;; initialisation des variables avec le premier terme de la liste
 (setq	result (car lst)
delta  (abs (- input result))
 )
 
 ;; pour chaque terme suivant dans la liste...
 (foreach n (cdr lst)
   ;; ...si la différence entre ce terme et le nombre en argument est inférieure à delta...
   (if	(< (abs (- input n)) delta)
     ;; ... on affecte à result ce terme et à delta la différence
     (setq result n
    delta  (abs (- input n))
     )
   )
 )

  • Upvote 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci Gilles c'est exactement ce qu'il me fallait, en plus très claire à la compréhension ! parfait. Merci pour les commentaires qui m'ont bien été utiles.

 

J'ai une petite question

 

comment créer une liste qui serait formée depuis des variables exemple :

 

(setq mavar1 50.00 
mavar2 70.00 
lst'(mavar1 mavar2))

 

J'essai de faire celà sur un bout de code et une erreur apparaît du type "bad function 50.00"

 

Merci et bonne soirée.

 

Mathieu

Posté(e) (modifié)

Salut

 

(setq mavar1 50.00 
     mavar2 70.00
     lst (mapcar 'eval '(mavar1 mavar2))
)

 

@+

 

Slt,

Pour le jeu ma variante..

_$ (vl-list* mavar1 mavar2 nil)

(50.0 70.0)

 

Edit

Oupss mal lu désolé, ma réponse est hors sujet, décidément ça va de mal en pis…

Modifié par VDH-Bruno

Apprendre => Prendre => Rendre

Posté(e)

Slt,

Pour le jeu ma variante..

_$ (vl-list* mavar1 mavar2 nil)

(50.0 70.0)

 

Edit

Oupss mal lu désolé, ma réponse est hors sujet, décidément ça va de mal en pis…

Salut

 

Un coup de fatigue ;)

Vivement les vacances :D

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut

 

Un coup de fatigue ;)

Vivement les vacances :D

 

@+

Merci Patrick_35 j'aurais aimé mais non, c'est disons un peu compliqué pour moi professionnellement en ce moment...

A+

Apprendre => Prendre => Rendre

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité