Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Vướng mắc hàm danh sách list.


  • Please log in to reply
9 replies to this topic

#1 superman2012

superman2012

    Edu level: li4

  • Members
  • PipPip
  • 22 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 24 June 2012 - 03:28 PM

Hiện tại em đang vướng về phần cơ bản của lisp:
Em có một bài toán đơn giản về hàm danh sách list mong mọi người giúp đỡ:
- Cho Danh sách A: (1 2 3 4 5 6 7 8 9 10)
Danh sách B (2 4 6 8 10 12 14 16 18 20); một phần tử A tương ứng với một phần tử B.
- Nhập số x
Kiểm tra số x nếu x = một phần tử trong danh sách A thì in ra phần tử tương ứng trong danh sách B.
VD: Nhập x =2
Kq: In kq= 4
Cám ơn mọi người.
  • 0

#2 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 24 June 2012 - 03:46 PM

(if (setq pos (vl-position (setq x (getint "\nNhap x:")) A))(princ (itoa (nth pos B)))) (princ)


  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 24 June 2012 - 04:38 PM

Hiện tại em đang vướng về phần cơ bản của lisp:
Em có một bài toán đơn giản về hàm danh sách list mong mọi người giúp đỡ:
- Cho Danh sách A: (1 2 3 4 5 6 7 8 9 10)
Danh sách B (2 4 6 8 10 12 14 16 18 20); một phần tử A tương ứng với một phần tử B.
- Nhập số x
Kiểm tra số x nếu x = một phần tử trong danh sách A thì in ra phần tử tương ứng trong danh sách B.
VD: Nhập x =2
Kq: In kq= 4
Cám ơn mọi người.

Cách viết khác nữa :
(cdr(assoc (getint "\nNhap x:") (mapcar '(lambda(x y) (cons x y)) a b )))

Hoặc là :
(nth (- (length a) (length (member (getint "Nhap x:") a))) b )
  • 2

#4 superman2012

superman2012

    Edu level: li4

  • Members
  • PipPip
  • 22 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 24 June 2012 - 09:59 PM

Cho e hỏi nếu danh sách kia là số thực thì kết quả trả về lại sai:
Đây là lisp em viết thử:


(defun c:lp (/)
(vl-load-com)
(setvar "CMDECHO" 0)
(setq A (list 1.5 2.5 4 6 10 16 25 35 50 70 95 120 150 185 240 300);
B (list 3.4 3.8 4.8 5.3 6.3 7.3 9 10 12 14 16 18 20 22 25 28)
);
(if (setq pos (vl-position (setq x (getreal "\nNhap tiet dien cap can tinh:")) A))
(alert (strcat "Duong kinh cua soi cap: " (itoa (nth pos )));
(princ)
)
(setq sl(getreal "\nCho so luong cap can tinh toan: ")
kq (nth pos
tdtt (/ (* 3.14 kq kq sl) 4)
)
(princ (strcat "\nTiet dien tinh toan" " "(rtos tdtt 2 2) "mm2" ))
(setvar "CMDECHO" 1)
(princ)
)
Khi nhập x=300 thì đúng
Nhưng nhập x=6 thì lại sai?
Mọi người sửa và gt dùm em. Thanks.
  • 0

#5 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 24 June 2012 - 10:11 PM

- 1 : 6 <> 6.0 . Trong trường hợp này bạn hãy dùng cách member mà bác Tuệ gợi ý. (vl-position 6.0 a) => nil nhưng (member 6.0 a) không nil
- 2 : Bạn hãy cho code vào thẻ code
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#6 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 24 June 2012 - 10:16 PM

Bạn hỏi 2 list toàn số nguyên, bây giờ test trên 2 list số thực thì phải vậy thôi.
Nếu vậy thì sửa lại:
(if (setq pos (vl-position (setq x (getint "\nNhap x:")) A))(princ (rtos (nth pos B) 2)) (princ)
  • 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.


#7 superman2012

superman2012

    Edu level: li4

  • Members
  • PipPip
  • 22 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 24 June 2012 - 10:25 PM

Oki thanks ketxu

(defun c:lp (/)
(setvar "CMDECHO" 0)
(setq A (list 1.5 2.5 4 6 10 16 25 35 50 70 95 120 150 185 240 300);
B (list 3.4 3.8 4.8 5.3 6.3 7.3 9 10 12 14 16 18 20 22 25 28)
kq (nth (- (length a) (length (member (getreal "Nhap x:") a))) b )
)
(setq sl(getreal "\nCho so luong cap can tinh toan: ")
tdtt (/ (* 3.14 kq kq sl) 4)
)
(princ (strcat "\nTiet dien tinh toan" " "(rtos tdtt 2 2) "mm2" ))
(setvar "CMDECHO" 1)
(princ)
)
Còn đoạn mã của DVH để mình xem chút rồi sửa coi. Thanks.
  • 0

#8 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 25 June 2012 - 06:30 AM

- 1 : 6 <> 6.0 . Trong trường hợp này bạn hãy dùng cách member mà bác Tuệ gợi ý. (vl-position 6.0 a) => nil nhưng (member 6.0 a) không nil
......

Với List có số ở trong (vừa số thực, vừa số nguyên) thì không nên sử dụng hàm Vl-position
Thường sử dụng member để tìm vị trí trong trường hợp này
(member 6 a) -> khác nil
(member 6.0 a) -> khác nil

@ superman2012:
Bạn có thể sử dụng hàm while để duyệt qua từng phần tử của a.
Khi thấy phần tử nào bằng x thì dừng vòng lặp lại và lấy số thứ tự của x trong a -> Lấy phần tử tương ứng với số thứ tự đó trong b
Mình để cái này cho bạn tự giải nhé!
  • 1

#9 superman2012

superman2012

    Edu level: li4

  • Members
  • PipPip
  • 22 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 25 June 2012 - 03:46 PM

Cám ơn a Tue_NV
Sau một hồi mò mẫm đủ mọi cách thì vòng lặp nó mới chạy.
Cho e hỏi cách dùng hàm member trên vẫn chạy đúng nhưng e ko thấy đoạn nào nó lấy số thứ tự của B để lấy kq ra cả, giống như dùng vòng lặp để xđ j nó vị trí thứ mấy trong B để lấy ra.

(nth (- (length a) (length (member (getint "Nhap x:") a))) b ) 

(defun c:lp ()
(setvar "CMDECHO" 0)
(setq A (list 1.5 2.5 4 6 10 16 25 35 50 70 95 120 150 185 240 300)
B (list 3.4 3.8 4.8 5.3 6.3 7.3 9 10 12 14 16 18 20 22 25 28)
j 0
x (getreal "x:") )
(while (setq i (nth j A))
(if (= i x)
(setq kq j )
)
(setq j (1+ j))
)
(princ (nth kq B))
(setvar "CMDECHO" 1)
(princ)
)

  • 0

#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 25 June 2012 - 04:02 PM

Cám ơn a Tue_NV
Sau một hồi mò mẫm đủ mọi cách thì vòng lặp nó mới chạy.
Cho e hỏi cách dùng hàm member trên vẫn chạy đúng nhưng e ko thấy đoạn nào nó lấy số thứ tự của B để lấy kq ra cả, giống như dùng vòng lặp để xđ j nó vị trí thứ mấy trong B để lấy ra.

(nth (- (length a) (length (member (getint "Nhap x:") a))) b ) 

(defun c:lp ()
(setvar "CMDECHO" 0)
(setq A (list 1.5 2.5 4 6 10 16 25 35 50 70 95 120 150 185 240 300)
B (list 3.4 3.8 4.8 5.3 6.3 7.3 9 10 12 14 16 18 20 22 25 28)
j 0
x (getreal "x:") )
(while (setq i (nth j A))
(if (= i x)
(setq kq j )
)
(setq j (1+ j))
)
(princ (nth kq B))
(setvar "CMDECHO" 1)
(princ)
)

1. Đoạn này để lấy số thứ tự của x trong b
(- (length a) (length (member (getint "Nhap x:") a)))

2. Khi tìm được (= i x). Bạn nên cho dừng vòng lặp luôn
;;;;;
(if (= i x)
(setq kq j j (length a ))
)
;;;;
  • 1