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

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

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

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.

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

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 )

  • 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

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.

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

- 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

  • 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

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)

  • 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

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.

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

- 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é!

  • 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

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)
)

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 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 ))

)

;;;;

  • 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


×