Aller au contenu

comment faire une fonction si?


Messages recommandés

Posté(e)

Salut! J'espère que le week end a été bon!

 

Je commence a comprendre plein de choses, c'est cool de se faire aider! Merci infiniment! c'est super dur la programmation,surtout quand on débute, mais c'est aussi très interessant! je fais ça avec beaucoup de plaisir et j'aime arriver à bout de mes projets! C'est la raison pour laquelle je ne baisse jamais les bras.

 

Je voudrais savoir si je suis sur la bonne voie. Alors voilà en quoi consiste précisément ma programmation :

 

Actuellement, j'ai une boite DCL qui renseigne le nombre de banches disponible sur chantier en 250, 125, 62.5, 50, 40, 30 et 20. C'est par là que débute mon projet. Cette boite DCL me renvoie mon fameux N250. Une fois ces valeurs rentrées, un programme que j'ai nommé (longvoile) se lance. Et c'est sur ce programme que porte toutes mes questions.

 

Ce programme commence par me demander de sélectionner (sur le plan) le voile que je voudrais bancher. Il me renvoie une longueur , le fameux L1.

Ensuite, il me demande si j'ai 0, 1 ou 2 arrêts (soit mon fameux A); autrement dit, si ce voile est tout seul isolé (d'où A=2), s'il continue un voile en cours (A=1)ou bien s'il est compris entre 2 autres voiles (A=0, pas besoin d'arrêt dans ce cas).

 

Suite à ça, pour calculer le nombre de banches nécessaire de manière à coffrer le plus possible mon voile, je veux que mon programme fasse en premier :

 

 

L1/2.50 = N1 (avec N1 le nombre de banche nécessaires)

 Si (N1<= N250 et A=0) ; si j.ai assez de banche 2.50 et que je n.ai pas d.arrêt
    Alors : Si (L1< 2.50m) ; si la longueur de mon voile est plus petite que 2.50m
              Alors "on passe au test suivant" ; alors il me faut une banche plus petite que 2.50m
              Sinon "on met N1 banche de 250 en place" ; sinon mon voile est plus grand, alors on met N1 banche de 250 (N1 doit être un entier! :) )et on coffre le restant du voile avec des banches plus petite si possible.
    Sinon : Si N1 est un entier ; sinon,si j.ai assez de banche 2.50 mais que j.ai au moin un arrêt  
              Alors "on met N1 banche de 250 + 1 banche de 62.5" ; Soit je trouve N1= à un entier et je met N1 banche de 250 + juste une banche de 62.5
              Sinon : (N1+1) "banches de 250" ; soit je trouve N1= à un réel alors je prend N1 entier et je lui rajoute une banche de 2.50

 Si (N1> N250) ; pour finir, si j.ai besoin de plus de banche de 250 que ce que je dispose,
     Alors "on met N250 banches de 2.50m" ; alors je met toute mes banches de 2.50m disponible sur chantier, et je passe au programme suivant.


 

Comme tu peux le voir, il y a beaucoup de condition et de si, mais c'est la "clé" de mon programme. Est-ce que je me complique la vie? ça semble être correct? Merci d'avance, et je te souhaite une exéllente journée! @++

Posté(e)

Bonjour. J'ai quasiment tout réussi, mais un problème se pose :

 

si j'ai N1 = 5.0

 

on est d'accord que 5-5 = 0.

donc N1-N1=0

en lisp : (- N1 N1) = 0.... c'est juste?

 

que je fasse (- N1 N1)

ou que je fasse (- N1 (atof (rtos N1 2 0)) ca fait toujours 0 non?

 

Enfin en tout cas, dans ma barre de commande ca marche... mais en programmation, quand je met un espion ca me renvoi ceci :

 

N1 = 5.0

(atof (rtos N1 2 0)) = 5.0

(- N1 (atof (rtos N1 2 0))) = -1.86517e-0.14

 

on voit bien que les deux premières lignes font 5 et la différence de 5 par 5 fait pas 0... pourquoi?

Posté(e)

Bonjour,

 

...que je fasse (- N1 (atof (rtos N1 2 0)) ca fait toujours 0 non?

Non pas forcément, cela dépend du nombre de décimal et comme rtos opère un arrondi, dans ce type d’opération il n’est pas étonnant que le résultat soit différent de 0 (résultat à l’arrondi près).

Je t’invite à lire ce sujet Éléments de syntaxe AutoLISP plus particulièrement l'article sur les type de données

 

N1 = 5.0

(atof (rtos N1 2 0)) = 5.0

(- N1 (atof (rtos N1 2 0))) = -1.86517e-0.14

on voit bien que les deux premières lignes font 5 et la différence de 5 par 5 fait pas 0... pourquoi?

A bon les deux premières lignes font 5 ???????

Ce que tu dis car écris comme cela rien ne le prouve et surtout pas le résultat que tu renvoi, pour illustrer ce que je veux expliquer tape ce qui suit dans ta console Visual Lisp :

_$ (setq val 1.000000000333333)
1.0
_$ val
1.0
_$ (= 1 val)
nil

J’ai affecté la valeur 1.000000000333333 à la variable val, la valeur étant supérieur à la précision d’affichage de ma console quand j’interroge val la valeur 1.0 m’est retourné (cela ne veut pas dire que val vaut 1.0). Donc logiquement le teste (= 1 val) retourne nil (faux).

 

C’est sans doute le cas dans l’exemple que tu donnes suites à différentes affectations mais si tu écris :

_$ (setq N1 5.0)
5.0

Maintenant je veux bien croire que N1 vaut 5 et que:

_$ (zerop (- N1 (atof (rtos N1 2 0))))
T

Donc zero.. Sinon je ne vois pas trop l’intérêt de faire des (- N1 N1) et des (- N1 (atof (rtos N1 2 0)) à part se prendre les pieds dans le tapis.. ;)

 

A+

Apprendre => Prendre => Rendre

Posté(e)

Bonjour!

 

Donc zero.. Sinon je ne vois pas trop l’intérêt de faire des (- N1 N1) et des (- N1 (atof (rtos N1 2 0)) à part se prendre les pieds dans le tapis.. ;)

 

En fait, je me prends toujours la tête sur mes réel et mes entiers. Je pensais que rtos arrondissait en supprimant tous les autres chiffres après la virgule. Par exemple si j'ai 3.235489 je pensais qu'en utilisant rtos j'obtiendrai 3.230000

 

comme j'ai dis précédemment :

 

Si N1 est un entier 
  Alors "on met N1 banche de 250 + 1 banche de 62.5" ; Soit je trouve N1= à un entier et je met N1 banche de 250 + juste une banche de 62.5               
  Sinon : (N1+1) "banches de 250" ; soit je trouve N1= à un réel alors je prend N1 entier et je lui rajoute une banche de 2.50

 

 

Et voici comment moi j'ai codé ça :

(if (= 0 (- N1 (atof (rtos N1 2 2)))); si N1 est un entier	 
 			(setq reponse (strcat (rtos N1 2 0) " banches de 250+ 1 banche de 62.5")) ; Je met une banche de 250 + 1 banche de 62.5
 			(setq reponse (strcat (rtos N1 2 0) " banches de 250 + 1 de 250")) ; si N1 est un réel, je prend N1 entier et je lui rajoute une 2.50	

 

Autrement dit:

 

Si N1 est un entier : (if (= 0 (- N1 (atof (rtos N1 2 2))))

ex : si N1=5; 5-5=0; c'est vérifié (action si vrai...)

 

Si N1 est un réel : Sinon, (action si faux...)

ex : si N1=5.2; 5-5.2=-0.2 et ce n'est pas vérifié

 

A vrai dire tout fonctionnait très bien jusqu'à que je rajoute ceci :

(cond        
   ((= A 0)(setq L1 L1))        
   ((= A 1)(setq L1 (+ L1 0.20)))        
   ((= A 2)(setq L1 (+ L1 0.40)))
); Fin cond

 

Et je m'en suis rendu compte en prenant pour exemple ceci :

Longueur du voile L1= 12.30m

Nombre d'arrêt A=1

 

donc A=1, alors L1=12.30+0.20=12.50

12.50/2.50=5 donc N1=5

 

d'après mon programme, j'aurai du avoir la condition si vrai, et ce n'est pas le cas...

Posté(e)

Re,

 

En fait, je me prends toujours la tête sur mes réel et mes entiers.

Regarde du côté de la fonction fix et les réponses précédentes

 

A vrai dire tout fonctionnait très bien jusqu'à que je rajoute ceci :

(cond

((= A 0)(setq L1 L1))

((= A 1)(setq L1 (+ L1 0.20)))

((= A 2)(setq L1 (+ L1 0.40)))

); Fin cond

 

Tu le rajoute ou dans ton code? Relis ce qui t’a été expliqué sur le if, cond et essai de reformuler clairement ce que tu cherches à faire, tu devrais trouver la solution, si tu n’y arrive toujours pas poste un code plus complet qui peut être testé car comme cela difficile de voir ou ça coince problème d’algorithme, syntaxe, les deux ???

 

A+

Apprendre => Prendre => Rendre

Posté(e)

Bonjour!

 

Je l'ai déjà utilisé en cours la fonction fix. Mais à vrai dire, je n'ai pas compris pourquoi on l'utilisait...

 

Tu le rajoute ou dans ton code? Relis ce qui t’a été expliqué sur le if, cond et essai de reformuler clairement ce que tu cherches à faire, tu devrais trouver la solution, si tu n’y arrive toujours pas poste un code plus complet qui peut être testé car comme cela difficile de voir ou ça coince problème d’algorithme, syntaxe, les deux ???

 

Tout d'abord, j'ai essayé le programme sans passer par la boite dcl. voici mon programme :

 

(defun c:test4 ()

	(setq LI (entsel "\n Sélectionner les voiles du jour en cours" ))
 	(setq NomEntité (car LI))
 	(setq LISTE (entget NomEntité))
 	(setq P1 (cdr (assoc 10 liste)))
	(setq P2 (cdr (assoc 11 liste)))
 	(setq L1 (distance P1 P2))
  (setq A (getint "\n Combien y'a t-il d'arrêt?"))
  (setq N1 (/ L1 2.50)) ; nombre de banche nécessaire
  (setq N250 (getint "\n Combien y'a t-il de 250")); nombre de banche dispo
 	 '; (setq N11 (rtos N1 2 0))'
	(command dimzin 0)

';   (cond
;       ( (= A 0) (setq L1 L1) )
;      ( (= A 1) (setq L1 (+ L1 0.20)) )
;      ( (= A 2) (setq L1 (+ L1 0.40))  )
;   ); Fin cond'
 
 (if (and (< N1 N250) (= A 0)) ; si j.ai assez de banche et que je n.ai pas d.arrêt
(if (< L1 2.50) ; et si la longueur de mon voile et plus petit que 2.50m
	(setq reponse (strcat  "On passe au test suivant il faut une banche plus petite" )); alors il faut une banche plus petite que 2.50m
	(setq reponse (strcat "on met " (rtos (atoi (rtos N1)) 2 0) " banche de 250 en place et reste à coffrer ce qui manque" )); sinon on met une banche de 250 et faire un autre programme
  		
); fin du 1er if

   	(if (< L1 2.50)
  	(setq reponse (strcat  "autre test et mettre une banche plus petite" )); alors il faut une banche plus petite que 2.50m
   		(if (= 0 (- N1 (atof (rtos N1 2 0)))); si N1 est un enier	 
 			(setq reponse (strcat (rtos N1 2 0) " banches de 250+ 1 banche de 62.5")) ; Je met une banche de 250 + 1 banche de 62.5
 			(setq reponse (strcat (rtos (atoi (rtos N1)) 2 0) " banches de 250 + 1 de 250")) ; si N1 est un réel, je prend N1 entier et je lui rajoute une 2.50	
	); fin du 3ème if
); fin du 2ème if
 ); fin du if
 ); fin du programme

 

Ceci fonctionne très bien sans la fonction COND , enfin il me semble... Pour le tester j'ai pris ces valeurs là :

 

Essai n°1 :

N250=6

L1=2

A=0

tu obtiens : "On passe au test suivant il faut une banche plus petite"

 

Essai n°2 :

N250=6

L1=2

A=1 (ou 2..)

tu obtiens : "autre test et mettre une banche plus petite"

 

Essai n°3 :

N250=6

L1=13

A=0

tu obtiens : "on met...banche de 250 en place et reste à coffrer ce qui manque"

 

Essai n°4 :

N250=6

L1=13

A=1 (ou 2...)

tu obtiens : " ... banches de 250 + 1 de 250" (Parce que N1 fait 5.2, c'est donc un réel)

 

Essai n°5 :

N250=6

L1=12.5

A=1 (ou 2...)

tu obtiens : "... banches de 250+ 1 banche de 62.5" ¨(Parce que N1 fait 5 c'est donc un entier)

 

Lorsque je met la fonction cond, ca ne fonctionne plus pour l'essai n°5. Bien sur, j'ai changé les valeurs de cet essai. L'essai n°5 est devenu :

 

Essai n°5 bis :

N250=6

L1=12.3

A=1

tu obtiens : "... banches de 250+ 1 de 250"

alors que tu devrais obtenir : "... banches de 250+ 1 banche de 62.5"

 

En effet, dans ma condition COND, il est bien écrit que si A=1, L1= L1+0.20

d'où : L1 = 12.3+0.20 = 12.5

Au final, l'essai n°5 est identique à l'essai n°5 bis , et pourtant il ne renvoie pas la même chose.

 

Et c'est la que dans mon dernier if (if (= 0 (- N1 (atof (rtos N1 2 0)))) je n'obtiens pas 0 mais cette fameuse valeur -1.86517e-0.14

 

Amicalement,

Posté(e)

Bonjour,

Tout d’abord à te lire je ne suis pas certain que tu es bien pris la peine de relire ce qui t’a été expliqué sur le if, cond et que tu ais clairement reformuler ce que tu cherchais à faire… Bon dans le doute..

 

 

Je l'ai déjà utilisé en cours la fonction fix. Mais à vrai dire, je n'ai pas compris pourquoi on l'utilisait...

Pourtant dans l’aide d’AutoCAD, elle est bien expliquée.. elle retourne la partie entière d’un nombre..

Command: (fix 3)

3

Command: (fix 3.7)

3

(fix N1) c’est un peu plus simple à contrôler que (atof (rtos N1 2 0))

 

 

 

dans mon dernier if (if (= 0 (- N1 (atof (rtos N1 2 0)))) je n'obtiens pas 0 mais cette fameuse valeur -1.86517e-0.14

Normal car N1 est le résultat de L1/2.50, L1 étant la distance entre 2 points tu peux très bien avoir un nombre avec beaucoup plus de décimal que ce que peut afficher ta ligne de commande revoir à ce sujet ma réponse n°29

La fonction ROUND de (gile) doit pouvoir t’aider

;;; ROUND (gile)
;;; Arrondit à la valeur la plus proche en fonction de prec
;;; (round pi 0.01) -> 3.14
;;; (round pi 1e-5) -> 3.14159
;;; (round 5456.50 1) -> 5457
;;; (round 5456.50 100.0) -> 5500.0

(defun round (num prec)
 (if (zerop (setq prec (abs prec)))
   num
   (* prec (fix ((if (minusp num) - +) (/ num prec) 0.5)))
 )
)

 

 

Un peu de relecture serait pas mal ..

(cond

((= A 0)(setq L1 L1))

((= A 1)(setq L1 (+ L1 0.20)))

((= A 2)(setq L1 (+ L1 0.40)))

); Fin cond

S’écrit comme cela

(setq L1 (+ L1 (* A 0.2)))

C’est la réponse 8 de Carboleum même si il y avait une petite coquille.

 

Ton code corrigé (mais non optimisé)

;;  SWITCH (fonction d'AIGUILLAGE corp du programme)
(defun switch (N250 L1 A)
 
 (setq
   L1 (round (+ L1 (* A 0.2)) 0.01)
   N1 (round (/ L1 2.50) 0.01)
 )

 (if
   (and (< N1 N250) (= A 0))		; si j.ai assez de banche et que je n.ai pas d.arrêt
    (if
      (< L1 2.50)			; et si la longueur de mon voile et plus petit que 2.50m
(setq
  reponse
   (strcat
     "On passe au test suivant il faut une banche plus petite"
   )
)				; alors il faut une banche plus petite que 2.50m
(setq
  reponse
   (strcat
     "on met "
     (rtos (atoi (rtos N1)) 2 0)
     " banche de 250 en place et reste à coffrer ce qui manque"
   )
)				; sinon on met une banche de 250 et faire un autre programme

    )					; fin du 1er if

    (if
      (< L1 2.50)
(setq
  reponse
   (strcat "autre test et mettre une banche plus petite")
)				; alors il faut une banche plus petite que 2.50m
(if
  (= 0 (- N1 (atof (rtos N1 2 0))))
				; si N1 est un enier        
   (setq
     reponse
      (strcat (rtos N1 2 0) " banches de 250+ 1 banche de 62.5")
   )				; Je met une banche de 250 + 1 banche de 62.5
   (setq
     reponse
      (strcat
	(rtos (atoi (rtos N1)) 2 0)
	" banches de 250 + 1 de 250"
      )
   )				; si N1 est un réel, je prend N1 entier et je lui rajoute une 2.50     
)				; fin du 3ème if
    )					; fin du 2ème if
 )
)

 

Essai n°5 bis :

N250=6

L1=12.3

A=1

tu obtiens : "... banches de 250+ 1 de 250"

alors que tu devrais obtenir : "... banches de 250+ 1 banche de 62.5"

 

Teste n°5 bis

_$ (switch 6 12.3 1)
"5 banches de 250+ 1 banche de 62.5"

C'est Ok!

 

Attention ce n’est pas parce qu’un code fonctionne qu’il est forcément bien écrit, je t’invite grandement à reformuler tes cas avec la l’expression cond tu y gagneras en clartés, et peut être trouvera tu des optimisations à faire dans certaines clauses.

 

Cordialement

Apprendre => Prendre => Rendre

Posté(e)

Bonjour,

Je complète ma réponse précédente car avec un peu de recul, je m’aperçois que n’ai pas forcément donné la méthode la plus simple en suggérant d’arrondir tes données à la précision souhaité.

 

Et c'est la que dans mon dernier if (if (= 0 (- N1 (atof (rtos N1 2 0)))) je n'obtiens pas 0 mais cette fameuse valeur -1.86517e-0.14

Pour comparer l’égalité de 2 réels dont on ne maitrise pas la précision, il est plus simple d’utiliser la fonction equal qui permet de préciser une tolérance. Dans ton cas une tolérance à 0.001 devrait suffire.

 

Exemple :

_$ (setq N1 (+ 5 1.86517e-014))
5.0
_$ (= 0 (- N1 (fix N1)))
nil
_$ (equal 0.0 (- N1 (fix N1)) 0.001)
T
_$

Apprendre => Prendre => Rendre

Posté(e)

Bonjour,

 

Désolé de ne pas avoir répondu avant mais le concours de l'entreprise était prioritaire. me voilà à pour 2 semaines, et je suis en projet, donc j'ai toute la matinée pour m'en occupé. Merci de m'offrir un peu de ton temps pour mener à bien mon programme.

 

La fonction round fonctionnait quand j'étais à l'entreprise, mais ce matin, elle ne fonctionne plus et je ne sais pas pourquoi. je vais essayer ce que tu m'as indiqué dans ton dernier message.Bien entendu, je te tiens au courant.

 

je te souhaite une exéllente journée.

 

Cordialement, Lucie.

Posté(e)

bon, cela ne marche pas.

 

J'ai utilisé ces valeurs :

N250 = 6

L1 = 12.3

A = 1

 

par calcul j'ai :

 

L1= 12.3+0.2 = 12.5

N1= 12.5/2.5 = 5.0

 

Donc ma réponse devrait être 250+62.5, et j'obtiens 250+250

 

Si je met un espion sur N1, ça me renvoie : N1=5.0; jusque là tout va bien

si je met un espion sur (fix N1), ça me renvoie : (fix N1)= 4....ben pourquoi??

 

donc forcément ca ne fait pas 0 donc "action si faux" alors que je devrais avoir "action si vrai"

Posté(e)

Bonjour,

 

Si je met un espion sur N1, ça me renvoie : N1=5.0; jusque là tout va bien

si je met un espion sur (fix N1), ça me renvoie : (fix N1)= 4....ben pourquoi??

 

Oui, attention à fix car il n’arrondi pas à la partie entière la plus proche, en fait la fonction fix tronque la partie décimal d'un reel (c’est une troncature de la partie décimal).

 

Exemple :

$ (+ 5 -1.86517e-014)
5.0
_$ (fix (+ 5 -1.86517e-014))
4

(+ 5 -1.86517e-014) est une valeur approchée par défaut de 5 donc la troncature renvoie 4

 

_$ (+ 5 1.86517e-014)
5.0
_$ (fix (+ 5 1.86517e-014))
5

Et (+ 5 1.86517e-014) est une valeur approchée par excès de 5 donc la troncature renvoie 5.

 

 

(Ps: Finalement la solution avec la fonction round du message précédent est peut être plus sécurisante dans ton cas)

 

Bon courage

Apprendre => Prendre => Rendre

Posté(e)

ha oui d'accord, je comprend mieux.

 

J'ai réussi à faire fonctionner la fonction round, je l'avais mal placée dans mon programme, ce qui fait qu'il ne faisait pas appel à cette fonction.

 

Dans VBA, l'emplacement d'une fonction n'a pas d'importance. Par exemple on peut créer un programme à part, (par exemple le programme "pi" qui renvoit à la valeur exact de 3.14), et quand on utilise un autre programme et qu'on écrit "pi", il fait appel à la fonction "pi" enregister précédemment. Et apparemment ce n'est pas le cas dans AUTOLISP...

 

Si je précise ceci, c'est parce que dans mon projet actuel, quand je dis "on passe au test suivant" ou bien "on doit mettre une banche plus petite" ça sous entend qu'il faut faire tourner un autre programme. il va donc falloir que je fasse appel à un autre programme... son emplacement au sein de mon projet va donc avoir beaucoup d'importance?

Posté(e)

Bonjour!

 

je replonge dans mon fameux programme et je me pose une grosse question...

 

Tout d'abord, voici le programme en question

 

; === programme principal

(defun C:banche1 ()

;     Pour commencer le programme, il faut d'abord renseigner le nombre de banche par l'intérmédiaire d'une boite de dialogue.
;     Cette boite dcl lancera un programme en fonction du choix.                                                              
;                                                                                                                             

 ; 1) Lancement de la boite de dialogue :
 
  (setq dcl_id (load_dialog "banche1dcl.DCL")) ;charge la boite de dialogue
  (if (not (new_dialog "banche1" dcl_id) ;si il ne la trouve pas il sort "exit"
      ) ; fin du not
    (exit)
  ) ; fin du if


 (action_tile "Na" "(setq Na1 $value)") 
 (action_tile "Nb" "(setq Nb1 $value)")
 (action_tile "Nc" "(setq Nc1 $value)")
 (action_tile "Nd" "(setq Nd1 $value)")

 

 (action_tile "accept" "(done_dialog 1)") 
 (action_tile "cancel" "(done_dialog 0)")


(setq ok  (start_dialog)) ;test pour savoir si tout a ete entré
(unload_dialog dcl_id)

;(if (and (= ok 1) (/= Na nil) (/= Nb nil) (/= Nc nil) (/= Nd nil)) ; si toutes les données sont rentrées

 (longvoile); on lance la fonction longvoile
) ; fin du programme (c: banche1)

  (princ)



;                                             
; Programme pour voile linéaire sans angles   
; Fichier Voiles linéaires sans angles.LSP                                            

;Programme donnant la somme des longueurs des voiles

(defun longvoile()
 ;(vl-load-com)

 ; LI : voile sélectionné
 
 ; L1 : Longueur totale des voiles
 ; P1 : origine du voile
 ; P2 : extrémité du voile

 
 ; A : nombre d'arrêt
 
 (setq L1 0) ; on met le compteur à 0


 	(while
  	(setq LI (entsel "\n Sélectionner les voiles du jour en cours" ))
  	(setq NomEntité (car LI))
  	(setq LISTE (entget NomEntité))
  	(setq P1 (cdr (assoc 10 liste)))
 	(setq P2 (cdr (assoc 11 liste)))
  	(setq LONG (distance P1 P2))
  	(setq L1 (round (+ LONG (* A 0.2)) 0.01)) ; on additione la longueur de tous les voiles sélectionés
 ) ; fin de while

     (defun round (num prec)
 (if (zerop (setq prec (abs prec)))
   num
   (* prec (fix ((if (minusp num) - +) (/ num prec) 0.5)))
 )
)
 	(setq A (getint "\n Combien y'a t-il d'arrêt?"))
(setq N1 (round (/ L1 2.50) 0.01)) ; nombre de banche nécessaire
 	(setq N250 (atoi Na1))
 	(setq N125 (atoi Nb1))
 	(setq N62.5 (atoi Nc1))
 	(setq N50 (atoi Nd1))
(command dimzin 0); c'est pour les arrondi

   
 
(if (and (< N1 N250) (= A 0)) ; si j'ai assez de banche et que je n'ai pas d'arrêts
(if (< L1 2.50) ; et si la longueur de mon voile et plus petit que 2.50m
	(setq reponse (strcat  "On passe au test suivant il faut une banche plus petite" )); alors il faut une banche plus petite que 2.50m
	(setq reponse (strcat "on met " (rtos N1 2 0) " banche de 250 en place et reste à coffrer ce qui manque" )); sinon on met N1 banche de 250 et faire un autre programmee")))
  
); fin du 1er if

   	(if (< L1 2.50)
  	(setq reponse (strcat  "autre test et mettre une banche plus petite" )); alors il faut une banche plus petite que 2.50m
   		(if (= 0 (- N1 (atof (rtos N1 2 0)))); si N1 est un entier	 
 			(setq reponse (strcat (rtos N1 2 0) " banches de 250+ 1 banche de 62.5")) ; Je met une banche de 250 + 1 banche de 62.5
 			(setq reponse (strcat (rtos N1 2 0) " banches de 250 + 1 de 250")) ; si N1 est un réel, je prend N1 entier et je lui rajoute une 2.50	
	); fin du 3ème if
); fin du 2ème if
); fin du if général
); fin du programme (longvoile)

 

Ainsi que sa boite dcl :

 

banche1:dialog {label="Renseigner les banches";
:row {

:boxed_column {label="renseigner le nombre de banche";
		
   	       	           
		:edit_box {label="&Nombre de banche 250:";/*edit_width=6;fixed_width=true;*/key=Na;}
		:edit_box {label="&Nombre de banche 125:";/*edit_width=6;fixed_width=true;*/key=Nb;}
		:edit_box {label="&Nombre de banche 62.5:";/*edit_width=6;fixed_width=true;*/key=Nc;} 
		:edit_box {label="&Nombre de banche 50:";/*edit_width=6;fixed_width=true;*/key=Nd;}

		}
    

    }
:row {ok_cancel;}
:row {errtile;}
    }

 

dans mon programme, j'ai x paramètres qui rentrent en compte :

 

Le nombre de banches que je dispose: N250, N125, N62.5, N50

La longueur de mon voile: L1

La longueur de ma banche : 2.50m, 1.25m, 0.625m et 0.5m.

 

Pour tester mon programme (longvoile) et apprendre comment celui-ci réfléchit, j'ai rentré au départ :

 

(setq N1 (round (/ L1 2.50) 0.01)) ; nombre de banche nécessaire

 

Autrement dit, je divise L1 par le nombre 2.50, ce qui me renvoit N1. ceci fonctionne bien évidemment que pour mes banches de 2.50m.

Ensuite, dans ma fonction "if", lorsque j'écris :

(setq reponse (strcat "On passe au test suivant il faut une banche plus petite" )); alors il faut une banche plus petite que 2.50m

cela signifie qu'il faut refaire exactement le même test que précédemment, mais au lieu de faire :

L1/2.50, il faut faire L1/1.25

et au lieu de faire : (if (and (< N1 N250) (= A 0) il faut faire (if (and (< N1 N125) (= A 0)...

et ainsi de suite...

 

inversement, si j'ai épuisée mes banches en 2.50, et qu'il me reste encore du voile à coffrer, il faut que je refasse tourner mon programme avec les autres banches en 1.25, puis quand il y en a plus, en 0.625, puis en 0.50...ect ect...

 

en fait ma question est la suivante : n'y a t-il pas un moyen de programmer ce programme en fonction de ma longueur de voile, de mon nombre de banches sans que j'ai besoin de le réécrire plusieur fois?

  • 2 semaines après...

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é