Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
duyhung

Hỏi về giải thuật

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

duyhung    9

Em có một bài toán như thế này: Nhập các số làm cơ sở để so sánh vd: 5 10 15 20 25 ....

Nhập biến a so sánh với lần lượt các biến trên nếu abs(a-B )>c c có thể mặc định or mình nhập với b là các giá trị trong bảng có sẵn trên thì trả về một kết quả là b or các giá trị khác.

Cái khó của em là chưa biết tạo một dãy số và lưu trữ để so sánh. Mới tập tọe học lisp nên e chưa biết mấy mong chỉ giáo.

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
phamthanhbinh    3.123
Em có một bài toán như thế này: Nhập các số làm cơ sở để so sánh vd: 5 10 15 20 25 ....

Nhập biến a so sánh với lần lượt các biến trên nếu abs(a-:leluoi:>c c có thể mặc định or mình nhập với b là các giá trị trong bảng có sẵn trên thì trả về một kết quả là b or các giá trị khác.

Cái khó của em là chưa biết tạo một dãy số và lưu trữ để so sánh. Mới tập tọe học lisp nên e chưa biết mấy mong chỉ giáo.

Hề hề hề,

Chưa hiểu ý bạn hỏi. Bạn có thể cho một ví dụ cụ thể hay khô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
duyhung    9
Hề hề hề,

Chưa hiểu ý bạn hỏi. Bạn có thể cho một ví dụ cụ thể hay không???

Ý của e là giống như mình dùng hàm vlookup của excel ấy vlookup thì tìm và trả về các giá trị cần tìm, còn ở đây mình có một bảng sẵn là cơ sở dữ liệu từ trước or mình nhập vào, sau đó mình nhập một số vào từ bàn phím số này được so sánh với lần lượt các giá trị trong bảng rồi trả về một giá trị or string.

Em hỏi là cad có hiểu được nó giống như excel không, mình nên dùng autolisp or vba !

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
npham    75
Em có một bài toán như thế này: Nhập các số làm cơ sở để so sánh vd: 5 10 15 20 25 ....

Nhập biến a so sánh với lần lượt các biến trên nếu abs(a-:leluoi:>c c có thể mặc định or mình nhập với b là các giá trị trong bảng có sẵn trên thì trả về một kết quả là b or các giá trị khác.

Cái khó của em là chưa biết tạo một dãy số và lưu trữ để so sánh. Mới tập tọe học lisp nên e chưa biết mấy mong chỉ giáo.

 

Nếu nhiều b thoả mãn thì lấy b ở đầu hay ở cuối ?

Các số cơ sở bạn tạo thành 1 list là giải quyết được vấn đề thôi mà.

 

Cũng có nhiều bác thức khuya ghê nhỉ?

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
duyhung    9
Nếu nhiều b thoả mãn thì lấy b ở đầu hay ở cuối ?

Các số cơ sở bạn tạo thành 1 list là giải quyết được vấn đề thôi mà.

 

Cũng có nhiều bác thức khuya ghê nhỉ?

Cái b chỉ lấy 1 giá trị thôi chứ bác

ý bác bảo dùng hàm list ấy ah, liệu hàm này có lưu các biến nhập vào để sử dụng vào các lần sau không.

Em đặt bài toán đơn giản như thế náy vd

cơ sở dữ liệu là 5 10 15 20

Nhạp a = 7, so sánh với điều kiện abs(a-:leluoi:>c=3 thì 10 thỏa mãn

Kết quả là cho ra số 10.

Nhưng cơ sở dữ liệu có thể lưu 1 file or tạo thành một bài toán chung được không bác npham/

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
npham    75
Cái b chỉ lấy 1 giá trị thôi chứ bác

ý bác bảo dùng hàm list ấy ah, liệu hàm này có lưu các biến nhập vào để sử dụng vào các lần sau không.

Em đặt bài toán đơn giản như thế náy vd

cơ sở dữ liệu là 5 10 15 20

Nhạp a = 7, so sánh với điều kiện abs(a-:leluoi:>c=3 thì 10 thỏa mãn

Kết quả là cho ra số 10.

Nhưng cơ sở dữ liệu có thể lưu 1 file or tạo thành một bài toán chung được không bác npham/

 

Bạn tham khảo đoạn code dưới đây:

 

(setq csdl (list 5 10 15 20 50 1000))
(setq a 7 c 3)

(mapcar '(lambda (x) (if (= (abs (- a x)) c) (setq value x))) csdl)

 

Đoạn code trên trả ra giá trị value là x, mà ở đó x làm thoả mãn biểu thức. x là 1 phần tử của csdl

csdl có thể ghi dưới file và được load lên thành list.

  • 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
duyhung    9
Bạn tham khảo đoạn code dưới đây:

 

(setq csdl (list 5 10 15 20 50 1000))
(setq a 7 c 3)

(mapcar '(lambda (x) (if (= (abs (- a x)) c) (setq value x))) csdl)

 

Đoạn code trên trả ra giá trị value là x, mà ở đó x làm thoả mãn biểu thức. x là 1 phần tử của csdl

csdl có thể ghi dưới file và được load lên thành list.

Cám ơn bác, cho em hỏi một chút hàm trên em cũng hiểu chút chút nhưng hàm lambda(x) và hàm mapcar bác có thể giải thích một chút cho e được không. VD diễn giải hàm ở dướ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
npham    75
Cám ơn bác, cho em hỏi một chút hàm trên em cũng hiểu chút chút nhưng hàm lambda(x) và hàm mapcar bác có thể giải thích một chút cho e được không. VD diễn giải hàm ở dưới.

 

Cách viết đó tương đương cách viết này. Tôi chỉ lợi dụng cái hàm mapcar để làm vòng lặp thôi. hehe.

Bạn nên dùng cách viết sau

 

(setq csdl (list 5 10 15 20 50 1000))
(setq a 7 c 3)

(setq i 0)
(while (setq x (nth i csdl))
   (if
 (= (abs (- a x)) c)
 (setq value x)		 
 )
 (setq i (1+ i))
 )

  • 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
duyhung    9

Hj em tra hàm thì thấy 2 hàm đều hay, có lẽ phải học nhiều để tùy biến các hàm hơn, cám ơn bác npham đã cho bài toán 2 đáp án nhe ! 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
duyhung    9

Ah cho e hỏi chút nữa là khi so sánh vd cơ sở có 30 50 100 150 250.....

nhập số liệu 40 với điều kiện kiểm tra là /a-b/<=10 thì có 2 kết quả

Điều kiện trả về dùng số sát và lớn hơn đó là 50 thì dùng hàm j vậy các a.

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
nataca    553
Ah cho e hỏi chút nữa là khi so sánh vd cơ sở có 30 50 100 150 250.....

nhập số liệu 40 với điều kiện kiểm tra là /a-b/<=10 thì có 2 kết quả

Điều kiện trả về dùng số sát và lớn hơn đó là 50 thì dùng hàm j vậy các a.

+ Trả về số sát với kết quả nhất có thể dùng điều kiện lọc > hoặc < ta được 1 list giá trị, tiếp đó dùng hàm Min hoặc Max để lấy giá trị cần tìm trong list trả về.

+ Nếu muốn chỉ lấy giá trị >40 thì kiểm tra list trả về phải > 40 trước khi dùng điều kiên /a-b/<=10

  • 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
npham    75
Ah cho e hỏi chút nữa là khi so sánh vd cơ sở có 30 50 100 150 250.....

nhập số liệu 40 với điều kiện kiểm tra là /a-b/<=10 thì có 2 kết quả

Điều kiện trả về dùng số sát và lớn hơn đó là 50 thì dùng hàm j vậy các a.

 

(setq csdl (list 5 10 6 70 7 15 20 6 7 8))
(setq a 7 c 3)
(setq tap_nghiem (mapcar '(lambda (x) (if (> (abs (- a x)) c) x)) csdl))
(setq tap_nghiem (vl-remove nil tap_nghiem))
(apply 'max tap_nghiem)

Bạn có thể tham khảo đoạn code này.

Hàm mapcar trả ra 1 danh sách chứa các nghiệm thỏa mãn và giá trị nil nếu không thỏa mãn.

Sau khi remove giá trị nil bạn được 1 danh sách chứa nghiệm. Bạn có thể xử lý danh sách này.

hàm apply là 1 ví dụ.

 

bạn có thể dùng 1 cách viết khác theo vòng lặp và dùng điều kiện lọc để lấy kết quả theo hướng dẫn của bạn natca

  • 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

Đăng nhập để thực hiện theo  

×