fiesta13310 Posté(e) le 9 février 2012 Posté(e) le 9 février 2012 Bonjour tous le monde! Je débute en lisp, je dois créer un programme, mais je ne comprend pas la fonction "si" , je m'explique :J'ai compris qu'il s'agit de la condition alternative qui retourne une valeur en LISP et qui s'écrit sous la forme : (if <condition> alors <faire si vrai> sinon <faire si faux>) moi ce que je veux veux écrie comme forme ressemble à ceci : (si <condition> alors <faire si vrai> ou bien si <condition> alors <faire si vrai> ou bien si <condition> alors <faire si vrai>) J'ai bien compris qu'il me manque le "sinon <faire si faux>, et justement, c'est là que j'ai besoin d'aide.Il est évident qu' il y a quelque chose que je n'ai pas compri. Pour être plus précise, voici ce que je veux programmer : soit: L1 la longueur d'un voile et A le nombre d'arrêt (Si A=0 alors L1 = L1 Si A=1 alors L1 = L1+0.20 Si A=2 alors L1 = L1+0.40) Ce n'est pas très compliqué, mais moi ca m'échape!Merci de bien vouloir me répondre, et bonne journée à tus!
fabcad Posté(e) le 9 février 2012 Posté(e) le 9 février 2012 Bonjour, Si tu as plusieurs conditions avec résultat la fonction cond est plus appropriée : (cond ( (= A 0) (setq L1 L1) ) ( (= A 1) (setq L1 (+ L1 0.20)) ) ( (= A 2) (setq L1 (+ L1 0.40)) ) ); Fin cond Bonne journée
fiesta13310 Posté(e) le 9 février 2012 Auteur Posté(e) le 9 février 2012 ok, merci beaucoup! j'avais pas compris non plus à quoi servait la fonction cond. Bon maintenant, à chaque fois que je rentre une valeur A=n, je veux que L1=L1+(n*0.20).comment dois-je faire à partir de là? (setq A (getint "\n Combien y'a t-il d'arrêt?")) (cond ((= A 0) (setq L1 L1)) ((= A 1) (setq L1 (+ L1 0.20))) ((= A 2) (setq L1 (+ L1 0.40))) ); Fin cond(setq reponse (strcat " la longueur totale est " (rtos L1 ) " mètres"))
fiesta13310 Posté(e) le 9 février 2012 Auteur Posté(e) le 9 février 2012 Non en fait c'est bon, j'ai trouvé... en tout cas merci beaucoup. Ha oui, j'ai une question qui n'a rien à voir, à quoi ca sert d'écrire "progn" dans des programme ? Par exemple : (setq n (fix nbre))(set q (+ 1 n)) (repeat n (progn (setq p3... (command ... (setq p1... ) )
Tramber Posté(e) le 9 février 2012 Posté(e) le 9 février 2012 Dans REPEAT, PROGN ne sert à rien.Il sert justement dans un IF... et guère ailleurs. Même pas non plus dans un COND ou un WHILE. IF n'a que 1 ou 2 sorties. COmme tu le sais. (IF Test(PROGN; si TEST = T(setq p '(0 0))(COMMAND "truc")etc...); si TEST = nil(PROGNencore plusieurs instructions)) PROGN dans les IF qui nécessitent d'envoyer plusieurs instructions. C'est tout. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Tramber Posté(e) le 9 février 2012 Posté(e) le 9 février 2012 Une autre remarque toute bête et FONDAMENTALE : n'oublie jamais que (/ 5 2) renvoie 2alors que(/ 5.0 2) ou (/ 5 2.) renvoient 2.5 ...comme je vois que tu vas faire du calepinage ou de la répartition... bon amusement. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
fiesta13310 Posté(e) le 9 février 2012 Auteur Posté(e) le 9 février 2012 je créé un programme pour faire de la rotation de banche, c'est mon projet de fin d'étude. donc en fait, si j'avais utilisé la fonction "si" a la place de "cond", progn j'aurai du l'insérer dans ma fonction "si" c'est ça? Et si je veux faire : si (N1< N2 ET A=0) alors ... ou bien, si (N1< N2 et A=n) alors... sinon, si (N1> N2) alors "faire le programme suivant"
Carboleum Posté(e) le 9 février 2012 Posté(e) le 9 février 2012 Bon maintenant, à chaque fois que je rentre une valeur A=n, je veux que L1=L1+(n*0.20).comment dois-je faire à partir de là? Pas besoin de cond ni de if pour celà:(setq L1 (+ (* A 0.2))) Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
Carboleum Posté(e) le 9 février 2012 Posté(e) le 9 février 2012 Et si je veux faire :si (N1< N2 ET A=0) alors ...ou bien, si (N1< N2 et A=n) alors...sinon, si (N1> N2) alors "faire le programme suivant" tu peux imbriquer les if: (if (< n1 n2) ; alors: (if (= 0 a) ; alors: (progn ...) ; sinon: (progn ...) ) ; end if ; sinon: (progn ...) ); end if Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
fiesta13310 Posté(e) le 9 février 2012 Auteur Posté(e) le 9 février 2012 ha non justement, c'est là que je dois utiliser progn parce que j'ai plusieurs informations quand je dis N1<N2 et A=0... c'est ca?
fiesta13310 Posté(e) le 9 février 2012 Auteur Posté(e) le 9 février 2012 oui voila ok, merci beaucoup, je vais essayé de faire tout ça! :)
Carboleum Posté(e) le 9 février 2012 Posté(e) le 9 février 2012 ha non justement, c'est là que je dois utiliser progn parce que j'ai plusieurs informations quand je dis N1<N2 et A=0... c'est ca? non! progn permet juste de rassembler plusieurs expressions lisp en une seule.Tu l'utiliseras quand tu veux exécuter plusieurs actions dans un if.En effet la fonction if a 3 arguments:(if <condition> <action si ok> <action sinon>)si tu veux exécuter plusieurs action si ok, tu les regroupe dans un progn. Par contre si tu as plusieurs condition en même temps; tu dois utiliser la fonction and dans les conditions. ce qui donne: (if (and <condition 1> <condition 2>) (progn <action si ok 1> <action si ok 2> ...) (progn <action sinon 1> <action sinon 2> ...)) Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
fiesta13310 Posté(e) le 9 février 2012 Auteur Posté(e) le 9 février 2012 haaaa!! ok, c'est bon, j'ai compris!Merci pour les info, on nous dis rien nous à l'école, la seule fonction "si" qu'on a vu, c'est la fameuse fonction récursive factorielle N! alors je vais pas loin avec ça... en tout cas merci beaucoup!
VDH-Bruno Posté(e) le 9 février 2012 Posté(e) le 9 février 2012 Bonjour, Je te souhaite la bienvenu fiesta13310 sur ce forum, car c’est ta première intervention il me semble. Et si je veux faire :si (N1< N2 ET A=0) alors ...ou bien, si (N1< N2 et A=n) alors...sinon, si (N1> N2) alors "faire le programme suivant" Alors avec cond:(cond ((> N1 N2) "(N1> N2) alors faire le programme suivant") ((= A 0) "si (N1< N2 ET A=0) alors ...") ((= A n) "si (N1< N2 et A=n) alors...") (T "Ne rien faire ou faire autre chose à définir..") )Note: Remplace les expressions entre guillemets par les actions que tu désires entreprendre. la fameuse fonction récursive factorielle N! alors je vais pas loin avec ça...Plus que tu ne le crois, mais pour cela il faut encore creuser un peu ;) Cordialement Apprendre => Prendre => Rendre
fiesta13310 Posté(e) le 9 février 2012 Auteur Posté(e) le 9 février 2012 Bonjour, oui c'est la première fois que je discute sur le forum. Merci pour ton aide, mais dans ton programme quelque chose me chagrine : Alors avec cond:(cond ((> N1 N2) "(N1> N2) alors faire le programme suivant") ((= A 0) "si (N1< N2 ET A=0) alors ...") ((= A n) "si (N1< N2 et A=n) alors...") (T "Ne rien faire ou faire autre chose à définir..") )Note: Remplace les expressions entre guillemets par les actions que tu désires entreprendre. Quand N1>N2, on passe au programme suivant, on est d'accord.Mais pour le reste, comment il sait que c'est quand N1<N2?
Patrick_35 Posté(e) le 9 février 2012 Posté(e) le 9 février 2012 Quand N1>N2, on passe au programme suivant, on est d'accord.Mais pour le reste, comment il sait que c'est quand N1<N2?Salut Logiquement si N1>N2, cela ne peut pas être l'autre (N1<N2)Donc, on test la première condition et si c'est ok, on fait notre routine.Si la condition ne répond pas, donc N1<N2, on fait la suite. (if (condition (si vrai...) (si faux ...))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
fiesta13310 Posté(e) le 9 février 2012 Auteur Posté(e) le 9 février 2012 ha oui, c'est exact, j'arrive pas à me dire que "cond" raisone pareil que "si" ...mais ca commence à rentrer tout ça, merci!
fiesta13310 Posté(e) le 9 février 2012 Auteur Posté(e) le 9 février 2012 Encore une question : Voici mon programme : (defun c:test2 () ; on définit les variables (setq L1 (getint "\n Combien y'a t-il de mètre?")) (setq n (getint "\n Combien y'a t-il d'arrêt?")) (setq A n) (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 (cond ((> N1 N250) (setq reponse (strcat " test3 "))) ((= A 0) (setq reponse (strcat " impossible "))); si pas d arrêt, alors une banche plus petite ((= A n) (setq reponse (strcat(rtos N1) "banche de 250? "))); on met N1 banche de 250 en place ((setq reponse (strcat " ne rien faire pour l'instant "))) );fin cond ); fin test2 mes conditions marchent très bien, c'est ce que je voulais faire. Mais j'ai un autre soucis:pour le cas ou A=n, mon résultat m'affiche N1 banche de 250.Si N1 est un entier, pas de problème!Mais si N1 est un réel, je voudrais qu'il m'affiche: N1 banche de 250 + 1 banche de 125. Par exemple, supposons que N1= 4.8 je voudrais comme réponse : 4 banche de 250 + 1 banche de 125. je dois utiliser Atoi et Atof? mais comment?
VDH-Bruno Posté(e) le 9 février 2012 Posté(e) le 9 février 2012 RE et rapidement, Par exemple, supposons que N1= 4.8je voudrais comme réponse : 4 banche de 250 + 1 banche de 125. Si je ne me trompe dans ce cas pour que N1=4.8 tu as 4.8x2.5= 12 m de murs banchés, tes 11.25m (c.a.d 4 banche de 250 + 1 banche de 125) de banches ne suffisent pas, il te faudra 5 banches . En fait, ce que tu cherches à savoir c’est si la partie décimal de N1 est >0.5 (tu comptes N1+1 banches) ou <0.5 (tu comptes N1 banche + 1/2 banche), ce qui peut se coder comme ceci :(if (> 0.5 (- N1 (fix N1))) (strcat (rtos (fix N1)) " banches de 250 + 1 banche de 125") (strcat (rtos (1+ (fix N1))) " banches de 250") ) Sinon une réflexion d’ordre plus général comme tu débute en Lisp, tu peux factoriser tes appels à setq en l'appliquant à ton code précédent.Là :(setq L1 (getint "\n Combien y'a t-il de mètre?") n (getint "\n Combien y'a t-il d'arrêt?") A n N1 (/ L1 2.50) N250 (getint "\n Combien y'a t-il de 250") )Et là :(setq reponse (cond ((> N1 N250) (strcat " test3 ")) ((= A 0) (strcat " impossible ")) ((= A n) (strcat (rtos N1) "banche de 250? ")) (T " ne rien faire pour l'instant ") ) ) De plus dans les lignes qui suivent il y a un problème de logique entre les affectations aux variables et les conditions d’exécution du code.. …(setq n (getint "\n Combien y'a t-il d'arrêt?")) (setq A n)……((= A 0) (setq reponse (strcat " impossible "))); si pas d arrêt, alors une banche plus petite((= A n) (setq reponse (strcat(rtos N1) "banche de 250? "))); on met N1 banche de 250 en place((setq reponse (strcat " ne rien faire pour l'instant ")))…En toutes logiques l’affectation à A ne sert à rien, et la dernière clause également si tu écris tes conditions comme ceci :(setq reponse (cond ((> N1 N250) (strcat " test3 ")) ((= n 0) (strcat " impossible ")) (T (strcat (rtos N1) "banche de 250? ")) ) ) De plus en appelant astucieusement (initget (+ 1 2)) avant de renseigner n, tu peux encore simplifier ton code..D’ailleurs à la réflexion je me demande bien ce que signifie pour toi le nombre d’arrêt, et si cela ne peut pas être automatiquement calculé.. Cordialement Apprendre => Prendre => Rendre
fiesta13310 Posté(e) le 10 février 2012 Auteur Posté(e) le 10 février 2012 Bonjour! tout d'abord merci de m'avoir répondu! Si je ne me trompe dans ce cas pour que N1=4.8 tu as 4.8x2.5= 12 m de murs banchés, tes 11.25m (c.a.d 4 banche de 250 + 1 banche de 125) de banches ne suffisent pas, il te faudra 5 banches . En fait, 4.8 j'ai pris au hasard, je n'ai pas fait de calcul ou quoi que ce soit, c'était juste pour donner un nombre réel. En fait, ce que tu cherches à savoir c’est si la partie décimal de N1 est >0.5 (tu comptes N1+1 banches) ou <0.5 (tu comptes N1 banche + 1/2 banche), ce qui peut se coder comme ceci :(if (> 0.5 (- N1 (fix N1))) (strcat (rtos (fix N1)) " banches de 250 + 1 banche de 125") (strcat (rtos (1+ (fix N1))) " banches de 250") ) Ce n'est pas exactement ça. ce que je cherche à savoir c'est que si mon N1 est un nombre décimal, j'arrondi en dessous , que j'obtienne 4.1 ou 4.9, je veux toujours arrondir à 4. Et si je suis obligé d'arrondir , alors je dois ajouter une demi banche. Sinon une réflexion d’ordre plus général comme tu débute en Lisp, tu peux factoriser tes appels à setq en l'appliquant à ton code précédent.Là :(setq L1 (getint "\n Combien y'a t-il de mètre?") n (getint "\n Combien y'a t-il d'arrêt?") A n N1 (/ L1 2.50) N250 (getint "\n Combien y'a t-il de 250") )Et là :(setq reponse (cond ((> N1 N250) (strcat " test3 ")) ((= A 0) (strcat " impossible ")) ((= A n) (strcat (rtos N1) "banche de 250? ")) (T " ne rien faire pour l'instant ") ) ) Les réponses qui suivent dans mes conditions comme "test 3" "impossible"... sont là juste pour essayer de me faire comprendre par vous. En réalité, elles renvoient toute à une autre fonction. Mais avant de l'inclure dans mon programme, je fais des essais pour voir si j'obtiens ce que je veux. De plus en appelant astucieusement (initget (+ 1 2)) avant de renseigner n, tu peux encore simplifier ton code..D’ailleurs à la réflexion je me demande bien ce que signifie pour toi le nombre d’arrêt, et si cela ne peut pas être automatiquement calculé.. En réalité, mon programme commence par une boite dcl ou dedans, je renseigne directement le nombre de banche et le nombre d'arrêt. pour répondre à ta question les arrêts sont des arrêts de bétonnage.quand on installe une banche, c'est pour couler du béton, et si les banches ne sont pas posionnées contre un mur,il faudra mettre des arrêts d'épaisseur 20 cm au minimum à l'intérieur des banches pour arrêter le béton...Donc en fait, si une banche ne vient pas reprendre la continuité d'un mur, il faut mettre 2 arrêts.Si elle vient continuer un mur, il faut mettre qu'un arrêt, et si elle se postionne entre 2 murs, on ne met pas d'arrêt. Je ne sais pas si tu comprend tout, mais c'est ça que j'essai de faire. Bonne journéeCordialement
Tramber Posté(e) le 10 février 2012 Posté(e) le 10 février 2012 Salut c'est Tramber ! J'ai mis la discussion dans le bon forum B) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Tramber Posté(e) le 10 février 2012 Posté(e) le 10 février 2012 T'inquiètes, tu avais commencé ta discussion dans le forum avncé, je l'ai juste glissée dans le forum débutant. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
VDH-Bruno Posté(e) le 10 février 2012 Posté(e) le 10 février 2012 Bonjour, Les réponses qui suivent dans mes conditions comme "test 3" "impossible"... sont là juste pour essayer de me faire comprendre par vous. En réalité, elles renvoient toute à une autre fonction. Mais avant de l'inclure dans mon programme, je fais des essais pour voir si j'obtiens ce que je veux. Ce n’est pas tellement sur les valeurs de retours que portait mon propos mais plutôt sur ce qui se passait à l’intérieur du cond, si je développe un peu en commentant les lignes de codes : Par exemple si j’ai préalablement affecté la valeur de n à A , j’ai écris A=n alors écrire :((= A 0) (strcat " impossible "))Revient à écrire((= n 0) (strcat " impossible ")) De plus comme A=n, la condition du if (= A n) est toujours "vrai" (le vrai est symbolisé par T) donc:((= A n) (strcat (rtos N1) "banche de 250? "))Revient à dire : (T (strcat (rtos N1) "banche de 250? ")) ; ou ((strcat (rtos N1) "banche de 250? ")) Comme cette condition sera toujours vrai la suivante :(T " ne rien faire pour l'instant ")Ne sera jamais atteinte, on peut donc la supprimer. Et comme j’ai supprimé toutes les références à A dans le code, je peux également supprimer la ligne d'affectation (setq n A). Pour un début en lisp, tu sembles t’accrocher et tu insistes avant de passer à un autre sujet c’est bien. Bonne continuation,A+ Apprendre => Prendre => Rendre
VDH-Bruno Posté(e) le 10 février 2012 Posté(e) le 10 février 2012 Re,Ce n'est pas exactement ça. ce que je cherche à savoir c'est que si mon N1 est un nombre décimal, j'arrondi en dessous , que j'obtienne 4.1 ou 4.9, je veux toujours arrondir à 4. Et si je suis obligé d'arrondir , alors je dois ajouter une demi banche.Dans ce cas(strcat (itoa (fix N1)) (if (= N1 (fix N1)) " banches de 250" " banches de 250 + 1 banche de 125" ) ) A+ Apprendre => Prendre => Rendre
Messages recommandé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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant