Đến nội dung


Hình ảnh
- - - - -

Xin Mã Lisp: Tìm Vị Trí Liền Trước Và Liền Sau Giá Trị Được Nhập Vào


  • Please log in to reply
7 replies to this topic

#1 kstdkhang

kstdkhang

    biết vẽ line

  • Members
  • PipPip
  • 24 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 03 August 2016 - 10:13 AM

Thân chào diễn đàn Cadviet 
Bạn nào có đoạn  mã code lisp trả về vị trí liền trước và liền sau giá trị  được nhập vào không, cho mình xin đoạn đó nhé
ví dụ: mình có danh sách
ds '(1 2 3 4 5)
Nhập vào giá trị 2.5 
Đoạn mã sẽ trả về vị trí của giá trị liền kề trước và liền kề sau , ở ví dụ trên là 2 (vị trí thứ 1) và 3(vị trí thứ 2)
Cám ơn các bạn nhiều nhiều

  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 03 August 2016 - 10:21 AM

 

Thân chào diễn đàn Cadviet 
Bạn nào có đoạn  mã code lisp trả về vị trí liền trước và liền sau giá trị  được nhập vào không, cho mình xin đoạn đó nhé
ví dụ: mình có danh sách
ds '(1 2 3 4 5)
Nhập vào giá trị 2.5 
Đoạn mã sẽ trả về vị trí của giá trị liền kề trước và liền kề sau , ở ví dụ trên là 2 (vị trí thứ 1) và 3(vị trí thứ 2)
Cám ơn các bạn nhiều nhiều

 

Bạn muốn trả về VỊ TRÍ hay GIÁ TRỊ? Nếu giá trị nhập vào là bằng 1 element thì sao? List của bạn có trùng nhau không? List gồm các số tăng dần hay sao?...

Trả về cặp vị trí, trong đó lst là danh sách; a là giá trị nhập vào:

(list (setq c (1- (vl-position a (vl-sort (cons a lst) '<)))) (1+ c))

Trả về cặp giá trị:

(list (nth (setq c (1- (vl-position a (vl-sort (cons a lst) '<)))) lst) (nth (1+ c) lst))


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 kstdkhang

kstdkhang

    biết vẽ line

  • Members
  • PipPip
  • 24 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 03 August 2016 - 11:32 AM

cám ơn bạn Hà quan tâm.
xl mình không nói rõ
lisp sẽ trả về vị trí
* danh sách lst là danh sách có length bất kỳ, nhưng qui luật là giá trị thứ (i+1) lớn hơn giá trị thứ i
* nếu giá trị a nhập vào nằm ngoài chương trình sẽ báo lỗi và yêu cầu nhập lại
* nếu giá trị a bằng với giá trị bất kỳ trong bảng sẽ trả về vị trí tương ứng giá bằng a nằm trong list
* nếu không bằng giá trị nào trong list sẽ trả về 2 vị trí gần nó nhất
  • 0

#4 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 03 August 2016 - 03:51 PM

* nếu giá trị a nhập vào nằm ngoài chương trình:

-  phần tử đầu: (car lst), cuối (last lst)

Bạn tự viết được

* nếu giá trị a bằng với giá trị bất kỳ trong bảng sẽ trả về vị trí tương ứng giá bằng a nằm trong list

(setq c (vl-position a lst))

* nếu không bằng giá trị nào trong list sẽ trả về 2 vị trí gần nó nhất

 c = nil khi thực hiện dòng lệnh trên: bạn Hạ đã viết ở #2

Bạn dùng các hàm if hoặc cond để tự hoàn thiện


  • 1

#5 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 03 August 2016 - 04:03 PM

Cũng nên chú ý là (vl-position 3.0 '(1 2 3 4 5)) sẽ trả về nil, cho nên nhiều khi (setq c (vl-position a lst)) không cho kết quả đúng.


  • 1

#6 kstdkhang

kstdkhang

    biết vẽ line

  • Members
  • PipPip
  • 24 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 03 August 2016 - 06:20 PM

*cám ơn các lisp thủ đã giúp đỡ.
*vậy làm thế nào để giải quyết được lỗi trên vậy Tot77
*các hàm vl- ... hay nhỉ. bạn nào có tài liệu tiếng việt nói về các hàm đó giới thiệu cho mình đk.
  • 0

#7 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 04 August 2016 - 07:37 AM

Bạn làm như sau:

(defun tra (a lst)
(while (or (< a (car lst)) (> a (last lst)))
(setq a (getreal (strcat "\nNhap gia tri trong khoang " (rtos (car lst)) "->" (rtos (last lst)) " :"))))
(if (member a lst)
(vl-position (car (vl-remove-if-not '(lambda(x) (= x a)) lst)) lst)
(list (setq c (1- (vl-position a (vl-sort (cons a lst) '<)))) (1+ c)))
)
;;; test
(tra 0 '(1 2 3 4 5.2 6.3))
(tra 7.2 '(1 2 3 4 5.2 6.3))
(tra 4.0 '(1 2 3 4 5.2 6.3))
(tra 4.5 '(1 2 3 4 5.2 6.3))

Tuy vl-position phân biệt real và int nhưng hàm member lại không phân biệt.

Các hàm vl- khá nhiều, chắc chẳng ai rảnh mà dịch hết ra tiếng Việt, nếu có thì chắc là viết sách bán thôi.

Tuy vậy bạn cũng chẳng cần biết tiếng anh làm gì, đọc help chỉ cần chú ý mấy cái ví dụ để biết cách sử dụng là được rồi.


  • 1

#8 kstdkhang

kstdkhang

    biết vẽ line

  • Members
  • PipPip
  • 24 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 05 August 2016 - 08:07 AM

cám ơn tot77 đã giúp giải quyết vấn đề nhé.
  • 0