Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

Các bài được khuyến nghị

Hề hề hề,

Xin hỏi các bác một vấn đề như sau.

Trong quá trình sử dụng lisp, tôi có gặp một vấn đề là tìm số lần đệ quy để thực hiện được nhiệm vụ yêu cầu. Vì vậy tôi có dùng biến đếm số lần đệ quy, Tuy nhiên kết quả ra rất không đúng. Mày mò mãi mới phát hiện ra rằng cứ mỗi lần thực hiện đệ quy thì cái biến đếm này tăng lên với giá trị 2^n (với n là số lần thực hiện đệ quy).

Thực lòng tôi không hiểu sao lại như vậy nên rất mong các bác có thể giải đáp vì sao lại như vậy.

Bác cho em xem tí ... ti code.

Em chưa thấy là em chưa tin ạ,

cái zụ này người trong cuộc thường không tĩnh táo cho lắm, lúc nào cũng nói là "em chả làm gì cả mà nó cứ ...gây hậu quả nghiêm trọng".

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bác cho em xem tí ... ti code.

Em chưa thấy là em chưa tin ạ,

cái zụ này người trong cuộc thường không tĩnh táo cho lắm, lúc nào cũng nói là "em chả làm gì cả mà nó cứ ...gây hậu quả nghiêm trọng".

Hề hề hề,

Muốn code thì có code đây:

 

Lưu ý rằng trong hàm (alert ....) nếu thay (itoa (loga2 (1+ i))) bằng hàm (itoa i) sẽ thấy sự khác nhau giữa giá trị của i và số bước đệ quy thực tế.

(defun chua ( a / b b1 b2 b3 b4  )
;;;;;(setq i 0)
(while (not (equal a 6174 0.1))
(setq  ;;;;;a (getint "\n Nhap so co 4 chu so: ")
          b (itoa a)
          b1 (+ (atoi (substr b 1 1)) 0.1)
          b2 (+ (atoi (substr b 2 1)) 0.2)
          b3 (+ (atoi (substr b 3 1)) 0.3)
          b4 (+ (atoi (substr b 4 1)) 0.4)
          bls1 (vl-sort (list b1 b2 b3 b4) '(lambda (x y) (>= x y)))
          bls2 (vl-sort (list b1 b2 b3 b4) '(lambda (x y) (<= x y)))
          bmax (atoi (strcat (itoa (fix (nth 0 bls1))) (itoa (fix (nth 1 bls1))) (itoa (fix (nth 2 bls1))) (itoa (fix (nth 3 bls1)))))
          bmin (atoi (strcat (itoa (fix (nth 0 bls2))) (itoa (fix (nth 1 bls2))) (itoa (fix (nth 2 bls2))) (itoa (fix (nth 3 bls2)))))
          a (- bmax bmin)   )
(setq i (1+ i))
(if (>= a 1000)
    (progn
           (chua a)
          
    )
    (progn
          (if (>= a 100)
              (setq a (* a 10))
              (setq a (* a 100))
          )
          (chua a)
          
    )
)
 
)
a
 
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:test (/ a i)
(setq i 0)
(setq a (getint "\n Nhap so tu nhien co 4 chu so: "))
(chua a)
(alert (strcat "\n So " (itoa a) " tro thanh So cua chua 6174 sau " (itoa (loga2 (1+ i))) " buoc lap"))
)
;;;;;;;;;;;;;;;;;
(defun loga2 ( a / )
(setq i 0)
(while (/= a  1)
(setq  a (/ a 2)
           i (1+ i)  )
)
i
)  
 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Đây là bài toán về số Kaprekar

Bạn tham khảo:

(defun chua ( a / b b1 b2 b3 b4  )
;;;;;(setq i 0)
(if (not (equal a 6174 0.1))
  (progn
  (setq  ;;;;;a (getint "\n Nhap so co 4 chu so: ")
            b (itoa a)
            b1 (+ (atoi (substr b 1 1)) 0.1)
            b2 (+ (atoi (substr b 2 1)) 0.2)
            b3 (+ (atoi (substr b 3 1)) 0.3)
            b4 (+ (atoi (substr b 4 1)) 0.4)
            bls1 (vl-sort (list b1 b2 b3 b4) '(lambda (x y) (>= x y)))
            bls2 (vl-sort (list b1 b2 b3 b4) '(lambda (x y) (<= x y)))
            bmax (atoi (strcat (itoa (fix (nth 0 bls1))) (itoa (fix (nth 1 bls1))) (itoa (fix (nth 2 bls1))) (itoa (fix (nth 3 bls1)))))
            bmin (atoi (strcat (itoa (fix (nth 0 bls2))) (itoa (fix (nth 1 bls2))) (itoa (fix (nth 2 bls2))) (itoa (fix (nth 3 bls2)))))
            a (- bmax bmin)   )
  (setq i (1+ i))
  
  (if (>= a 1000)
      (progn
            (setq a (chua a))
           
      )
      (progn
            (if (>= a 100)
                (setq a (* a 10))
                (setq a (* a 100))
            )
            (setq a (chua a))
           
      )
  )
  ;)
 
))
a
)

Code còn dài dòng nhiều chỗ VD:

- Đổi số <-> string chậm hơn dùng rem nhiều lần

- b1, b2, b3, b4 không cần thiết phải là số thực

- bls2 là reverse của bls1 nên không cần tính

- bmax = 1000*(nth 0 bls1) + 100*(nth 1 bls1) +.....

  có thể dùng mapcar cho gọn hơn

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em chào các bác!

Em đang tìm phương thức để lấy được danh sách tọa độ của điểm chèn (list Coordinates ..) khi mình thực hiện ArrayRectang khi có điểm Pick, có khoảng cách hàng, cột…. mà em chưa biết để tìm ra cách. Cái khó của em là em chỉ cần lấy tọa độ của các điểm dạng ArrayRectang mà không phải chèn bLock. Nếu chèn rồi lại mất công xóa đi thì mất thời gian quá.

(vlax-invoke

    Object  'ArrayRectangular KCH KCC….)

Em nhờ các bác tư vấn cho em với ạ!

Em xin chân thành cảm ơn nhiều!

Ps: Đã Modify.

Em đã tóm được các điểm chèn rùi. Nhưng phải thêm công đoạn xóa Block đi. 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Sao bạn không làm hàm con tính ra tọa độ từ điểm cơ sở từ , hàng ngang, hàng dọc, khoảng cách cho nó khỏe bạn. Hay mình hiểu sai ý.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Đây là bài toán về số Kaprekar

Bạn tham khảo:

(defun chua ( a / b b1 b2 b3 b4  )
;;;;;(setq i 0)
(if (not (equal a 6174 0.1))
  (progn
  (setq  ;;;;;a (getint "\n Nhap so co 4 chu so: ")
            b (itoa a)
            b1 (+ (atoi (substr b 1 1)) 0.1)
            b2 (+ (atoi (substr b 2 1)) 0.2)
            b3 (+ (atoi (substr b 3 1)) 0.3)
            b4 (+ (atoi (substr b 4 1)) 0.4)
            bls1 (vl-sort (list b1 b2 b3 b4) '(lambda (x y) (>= x y)))
            bls2 (vl-sort (list b1 b2 b3 b4) '(lambda (x y) (<= x y)))
            bmax (atoi (strcat (itoa (fix (nth 0 bls1))) (itoa (fix (nth 1 bls1))) (itoa (fix (nth 2 bls1))) (itoa (fix (nth 3 bls1)))))
            bmin (atoi (strcat (itoa (fix (nth 0 bls2))) (itoa (fix (nth 1 bls2))) (itoa (fix (nth 2 bls2))) (itoa (fix (nth 3 bls2)))))
            a (- bmax bmin)   )
  (setq i (1+ i))
  
  (if (>= a 1000)
      (progn
            (setq a (chua a))
           
      )
      (progn
            (if (>= a 100)
                (setq a (* a 10))
                (setq a (* a 100))
            )
            (setq a (chua a))
           
      )
  )
  ;)
 
))
a
)

Code còn dài dòng nhiều chỗ VD:

- Đổi số <-> string chậm hơn dùng rem nhiều lần

- b1, b2, b3, b4 không cần thiết phải là số thực

- bls2 là reverse của bls1 nên không cần tính

- bmax = 1000*(nth 0 bls1) + 100*(nth 1 bls1) +.....

  có thể dùng mapcar cho gọn hơn

Hề hề hề,

Cảm ơn sự chỉ dẫn của bác ndtnv.

1/- Về việc tách các chữ số, mình quên cái hàm (rem ....) nên mới dùng cái cách lẩm cẩm như vậy.

2/- Về các biến b1 b2 b3 b4 sở dĩ mình cho nó thành các số thực như vậy để tránh trường hợp có các giá trị nguyên trùng nhau. (Khi đó hàm (vl-sort ...) sẽ luôn trả về đủ 4 giá trị )

3/- Đúng là không cần tới biến bls2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em chào anh Hoành và mọi người yêu cad!

Em có bộ lisp rất hay, của một ông anh trai làm cho công ty chuyên về thiết kế xây dựng nổi tiếng số một trong miền nam Việt Nam,nhưng không hề biết cài toàn bộ các lisp này để sử dụng, trong khi công ty yêu cầu phải thành thạo các lisp này để thiết kế. Có thể các lisp này đã có trên cad việt rồi, nhưng em cứ up lên cho mọi người tham khảo và giúp đỡ, em đã mò nhiều giờ , làm mọi cách nhưng không load toàn bộ lisp này được, mong anh Hoành và mọi người chỉ điểm!

Tiện thể, anh nào có sap 2000 v14.2.2 cho win 8, thì up lên, xin được cảm ơn và không biết hậu tạ như thế nào !

Chân thành!

 

https://www.dropbox.com/s/p3w7g35kbfug4tg/lisp%20dinh%20cao.rar?dl=0

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em chào anh Hoành và mọi người yêu cad!

Em có bộ lisp rất hay, của một ông anh trai làm cho công ty chuyên về thiết kế xây dựng nổi tiếng số một trong miền nam Việt Nam,nhưng không hề biết cài toàn bộ các lisp này để sử dụng, trong khi công ty yêu cầu phải thành thạo các lisp này để thiết kế. Có thể các lisp này đã có trên cad việt rồi, nhưng em cứ up lên cho mọi người tham khảo và giúp đỡ, em đã mò nhiều giờ , làm mọi cách nhưng không load toàn bộ lisp này được, mong anh Hoành và mọi người chỉ điểm!

Tiện thể, anh nào có sap 2000 v14.2.2 cho win 8, thì up lên, xin được cảm ơn và không biết hậu tạ như thế nào !

Chân thành!

 

https://www.dropbox.com/s/p3w7g35kbfug4tg/lisp%20dinh%20cao.rar?dl=0

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Sao bạn không làm hàm con tính ra tọa độ từ điểm cơ sở từ , hàng ngang, hàng dọc, khoảng cách cho nó khỏe bạn. Hay mình hiểu sai ý.

 Như thế mất rất nhiều thời gian và phải lập công thức. Em đã làm đc rồi ạ! Tuy nhiên hơi mất công đoạn trải mảng block xong lấy ra tọa độ rồi lại xóa đi.

Chương trình của em đây!

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 Như thế mất rất nhiều thời gian và phải lập công thức. Em đã làm đc rồi ạ! Tuy nhiên hơi mất công đoạn trải mảng block xong lấy ra tọa độ rồi lại xóa đi.

Chương trình của em đây!

hề hề hề,

Chương trình của em ....... ĐÂU ??????

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chương trình của bạn nội suy 3 số lẽ. bạn chỉnh giúp 2 số lẽ thôi.

 

Các điểm cấy vào quá hoàn hảo : nằm ngay trên mp của tam giác thì khó mà qua mắt người có kinh nghiệm

 

Hề hề hề,

file .vlx thì chịu rồi, chả thể nhòm ngó hay phê phán điều gì ?????

Hì hì. Em viết chơi ấy mà. Nó phục vụ cho chuyên ngành của em tương đối tốt. 

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 Như thế mất rất nhiều thời gian và phải lập công thức. Em đã làm đc rồi ạ! Tuy nhiên hơi mất công đoạn trải mảng block xong lấy ra tọa độ rồi lại xóa đi.

Chương trình của em đây!

Bạn có những tiện ích hay quá. giới thiệu cho mình xem các tiện ích 1,2,3,4 xem tham khảo với bạn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Có người nhờ mình yêu cầu như sau
Có 3 điểm trong không gian, tìm góc nằm và góc đứng tạo bởi 3 điểm đó. Nói thật cái thuật ngữ này mình không hiểu, mà cái bạn nhờ mình thì giải thích không ra. Bác nào biết lisp mà rành bên khảo sát chắc biết vụ này. Cho mình xin cái hàm này được không? cám ơn!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cám ơn bác Hà. Duy cũng đoán thế nên cũng viết ra rồi nhưng bố cứ bảo chưa đúng.

Do không biết xét góc trên mặt phẳng khác XOY nên Duy tráo tọa độ Z thành Y và giữ nguyên X rồi xét trên mặt phẳng XOY.

Bác có cách trực tiếp xét góc trên mặt phẳng khác XOY thì chỉ Duy phát. cám ơn!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cho mình hỏi hàm chuyển giá trị góc từ radian sang độ phút giây với ạ!

Hàm đổi từ decimal => dms

(list (fix d) (fix (rem (* d 60) 60)) (rem (* d 3600) 60))

Bạn tự chuyển qua dạng string, nếu d<0 dùng abs cho m & s

Nếu làm tròn s thêm if

 

 

Cám ơn bác Hà. Duy cũng đoán thế nên cũng viết ra rồi nhưng bố cứ bảo chưa đúng.

Chắc bố muốn nói về góc bằng và góc đứng trong trắc địa

http://muce.edu.vn/fckeditor/editor/filemanager/connectors/asp/image/chuong3.pdf

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Nhờ các bác tư vấn em với ạ!

Em có một đường Pline khép kín và em muốn sử dụng lisp Etrim (lệnh Extrim) để cắt bỏ các đối tượng cùng một Layer bên ngoài Polyline thì nên làm như nào vậy ạ? Liệu có phải Lock các layer lại, chỉ để lại Layer cần cắt rồi sau đó lại Unlock?

Em cảm ơn các bác nhiều!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em có thể viết 1 lisp có sử dụng lệnh EXTRIM bằng cách:

- Nhập tên Layer muốn Trim.

- Lock tất cả Layer còn lại.

- EXTRIM.

- Unlock..

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hàm đổi từ decimal => dms

(list (fix d) (fix (rem (* d 60) 60)) (rem (* d 3600) 60))

Bạn tự chuyển qua dạng string, nếu d<0 dùng abs cho m & s

Nếu làm tròn s thêm if

 

 

Chắc bố muốn nói về góc bằng và góc đứng trong trắc địa

http://muce.edu.vn/fckeditor/editor/filemanager/connectors/asp/image/chuong3.pdf

Hề hề hề,

Cứ theo cái định nghĩa này thì muốn xác định góc bằng và góc đứng, còn phải xét điểm nào là diểm gốc trong 3 điểm đã cho mới ổn......

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Có người nhờ mình yêu cầu như sau

Có 3 điểm trong không gian, tìm góc nằm và góc đứng tạo bởi 3 điểm đó. Nói thật cái thuật ngữ này mình không hiểu, mà cái bạn nhờ mình thì giải thích không ra. Bác nào biết lisp mà rành bên khảo sát chắc biết vụ này. Cho mình xin cái hàm này được không? cám ơn!

Hề hề hề,

Đầu xuân , rách việc, ngồi đọc thậy yêu cầu của bác và dựa trên cái định nghĩa mà bác ndtnv cung cấp, mình việt đại cái lisp như sau để bác check lại xem bố cháu đã đồng ý chưa nhé. Trúng thì tốt mà không trúng lại càng tốt hơn. Mong phản hồi từ các bác.

 

http://www.cadviet.com/upfiles/5/5194_timgoctracdia.lsp

 

Kính chúc toàn thể anh em trên diễn đàn một năm mới phát triển và thành công.

 

 

(defun  c:gtrd (/ p1 p2 p3 d1 d2 h1 h2 a1 a2 gb gd1 gd2)
(setq p1 (getpoint "\n Chon diem 3D goc")
          p2 (getpoint  p1 "\n Chon diem 3D thu hai")
          p3 (getpoint p1 "\n Chon diem 3D thu ba")
          d1 (distance p1 p2)
          d2 (distance p1 p3)
          h1 (- (caddr p2) (caddr p1))
          h2 (- (caddr p3) (caddr p1))
          a1 (angle (list (car p1) (cadr p1)) (list (car p2) (cadr p2)) )
          a2 (angle (list (car p1) (cadr p1)) (list (car p3) (cadr p3)) )
          gb (- a2 a1)
          gd1 (atan (/ (/ h1 d1) (sqrt (- 1 (/ (* h1 h1) (* d1 d1))))))
          gd2 (atan (/ (/ h2 d2) (sqrt (- 1 (/ (* h2 h2) (* d2 d2))))))
          kq (list gb gd1 gd2)
)
kq
)
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×