Mình tiếp tục với Bài 2 với một số hàm cơ bản nhé:
Xem lại bài 1: Các phép toán trong AutoLisp
1./ Hàm setq
Cú pháp: (setq b1 gt1 [b2 gt2] …)
Chức năng : Gán giá trị cho 1 biến
Gán gt1 cho biến b1, gt2 cho biến b2 … Mỗi biến nhận một giá trị viết sau nó
Giá trị có thể là dữ liệu, một biến khác hoặc một biểu thức đã xác định trước đó
Ví dụ :
(setq b 5.0) -> Gán giá trị 5.0 cho biến b (setq a b) -> gán biến b cho biến a, biến b =5.0, nghĩa là biến a cũng bằng b và a nhận giá trị 5.0 (setq c "Hoc Lisp") -> Gán giá trị chuỗi "Hoc Lisp" cho biến c (setq d (+ 1 2 3)) -> Gán giá trị 6 cho biến d (nghĩa là biến d nhận giá trị 1+2+3=6)
2./ Hàm princ
Cú pháp: (Princ [expr [file-desc]])
Trong đó :
+ expr : có thể là 1 chuỗi kí tự. Có thể là 1 biến, 1 biểu thức của AutoLisp
+ file-desc : Tính năng ghi ra file. Đến lúc sang bài tập về xuất dữ liệu ra file txt, mình sẽ trở lại chỗ này…
* Chức năng : In ra expr ra màn hình, dưới dòng command của CAD.
Ví dụ 1: (princ “a+b=”) -> In ra dưới dòng command của CAD chuỗi “a+b=”
Ví dụ 2 : (princ 5.0) -> In ra dưới dòng command của CAD giá trị 5.0
Ví dụ 3:
(setq a 6.0) -> gán giá trị 6.0 cho biến a
(princ a) -> In ra dưới dòng command của CAD giá trị 6.0 (tức là giá trị của biến a)
Ví dụ 4 : (princ (+ 5 6)) -> -> In ra dưới dòng command của CAD giá trị 11 (tức là giá trị 5+6)
3./ Các Hàm xử lý về số học :
3.1./ Hàm khai căn bậc 2 : sqrt
Cú pháp (sqrt number)
Giải thích : Tính căn bậc 2 của 1 number
Ví dụ : (sqrt 2.0) -> return 1.1421
3.2./ Hàm lũy thừa và khai căn bậc n : Expt
-.) Công thức tổng quát đã học hồi phổ thông:
– Cú pháp hàm Expt: (expt a b)
Hàm expt tính lũy thừa bậc b của a, số a gọi là cơ số, số b gọi là số mũ.
Ví dụ: (expt 2 3) -> trả về 8. Vì 2 mũ 3 bằng 8
Áp dụng hãy tính số sau bằng Lisp
4. Hàm lấy phần nguyên của một số : Hàm Fix
Cú pháp : (Fix number)
Giải thích : Lấy phần nguyên của số number
Ví dụ
[pre]
(fix 3.7) -> return 3
(fix 4.1)-> return 4
(fix 4) -> return 4
5. Hàm chuyển thành số thực : Hàm Float
Cú pháp : (Float number)
Giải thích : Chuyển 1 số number thành số thực
Có bạn thắc mắc đã là số thì cần gì hàm chuyển về số thực nữa
Mình nghĩ đôi khi rất cần thiết vì số thì có thể là số thực hoặc là số nguyên. Nếu như mà số nguyên thì như phép chia các bạn đã thấy, nếu các đối số của hàm chia (/) đều là số nguyên thì kết quả sẽ trả về số nguyên, có thể không như ý của bạn, vì kết quả bạn muốn trả về số thực (xem lại bài các phép toán trong lisp). Lúc đó nên sử dụng hàm Float
Ví dụ :
(setq a 5 b2) -> gán giá trị 5 cho biến a, gán giá trị 2 cho biến b
(/ a b) -> return 2 (vì a và b đều là số nguyên nên kết quả là số nguyên
(/ (float a) b) -> 2.5 (Vì bạn đã chuyển 1 số a thành số thực rồi nên kết quả là 1 số thực)
Bài tập áp dụng:
– Sử dụng Hàm Fix và các hàm + – * / hãy viết hàm làm tròn số :
nếu phần thập phân của số đó >0,5 thì làm tròn đến 1,0.
Nếu phần thập phân của số đó <=0,5 thì làm tròn đến 0,5.
Ví dụ :
15,1 -> làm tròn thành 15,5
15,6 -> làm tròn thành 16,0
……..
Hay quá anh ơi. Phải soạn vở ra chép cho nhớ
Update một số hàm khác đi bạn ơi
Em xin gửi bài tập ạ
Nếu bài này ko dùng if thì em chưa nghĩ ra ạ
(setq a (getreal “Nhap so can lam tron:”))
(float (+ (fix a) (if (> (- a (fix a)) 0.5) 1 0.5)))
Chào Ngọc Quyền Hàm này em viết tốt hơn code lúc trước em viết, tuy nhiên chưa thỏa mãn yêu cầu của đề bài. Hàm if và getreal thì mình xin thảo luận ở các bài viết sau. Mình set biến a một giá trị nào đó rồi dùng hàm đã học viết hàm làm tròn theo yêu cầu trên Ví dụ: (setq a 5.6) -> Yêu cầu : – Sử dụng Hàm Fix và các hàm + – * / hãy viết hàm làm tròn số : nếu phần thập phân của số đó >0,5 thì làm tròn đến… Read more »
Em xin thắc mắc đề làm tròn tý ạ:
nếu phép chia chia hết (phần thập phân của số đó = 0.0) thì làm tròn đến 0.5 luôn hả anh
Anh Tuệ ơi
cập nhật thêm bài tập hoặc bài mới đi anh
Vợ Tuệ mới sinh bé trai bạn à. Chắc cậu ấy đang bận mấy hôm, anh em gắng làm xong bài tập rồi đón đọc bài mới nhé
Nộp bài tập

Hàm lũy thừa và khai căn bậc n : Expt
Áp dụng hãy tính số sau bằng Lisp
$ (expt 5 3)
125
Thắc mắc 2 phép toán dưới nhờ tuệ giải thích khi dùng Float nhé
_$ (expt 6 (/ 2 3 ))
1
_$ (expt 6 (/ (float 2) 3))
3.30193
Em xin chúc mừng Anh Tuệ!!!! Em xin mạo muội góp ý kiến thắc mắc trên của anh lenhan (nếu có gì ko phải mong anh bỏ qua cho em nha): (expt 6 (/ 2 3 )) trả về 1 (expt 6 (/ (float 2) 3)) trả về 3.30193 Theo em vấn đề nằm ở phép chia chứ ko phải hàm expt đâu Vì khi một số nguyên chia 1 số nguyên thì trả về giá trị là 1 số nguyên khi một số thực chia 1 số nguyên thì trả về giá trị là 1 số thực Như trên… Read more »
Hì thật là cám ơn bạn 🙂
Lần đầu đụng đến ngôn ngữ lập trình Autolisp. trước đến giờ toàn dùng lisp có sẵn thôi
Anh Lenhan cứ hay đùa em rồi
Em cũng mới mò lisp thôi, có biết gì đâu anh
Bài tập áp dụng: Sử dụng Hàm Fix và các hàm + – * / hãy viết hàm làm tròn số : nếu phần thập phân của số đó >0,5 thì làm tròn đến 1,0. Nếu phần thập phân của số đó <=0,5 thì làm tròn đến 0,5. Bài tập này em chỉ làm được thế này mà nó sai khi sử dụng hàm FIX. mong anh Tuệ bổ sung _$ (setq a(+ 1 2.6)) 3.6 _$ (fix a) 3 _$ (setq b(* 2 2.6)) 5.2 _$ (fix b) 5 3.6 làm tròn về 3 chứ không tròn lên 4.0… Read more »
Mình gợi ý :
Bài tập về làm tròn:
Lấy số a chia cho 0,5 -> được kết quả b -> lấy phần nguyên của số b rồi đem +1. Được bao nhiêu đem nhân với 0,5 là được kết quả cần tìm
Thế mà em nghĩ theo chiều hướng khác
(setq a 8.9)
(* (+ 1 (FIX (/ A 0.5))) 0.5)
Vậy vấn đề đặt ra là nếu phép chia chia hết (phần thập phân của số đó = 0.0) thì làm tròn đến 0.5 luôn hả anh
@Ngọc Quyền: Đúng là nếu phép chia chia hết (phần thập phân của số đó = 0.0) thì làm tròn đến 0.5. theo y/c của đề bài và cũng đúng theo đoạn code mà em viết khi trước đó
Xin nộp bài tập Sử dụng hàm Fix và các hàm +, -, *, / để viết ghàm tròn số sau khi có gợi ý của bạn Võ Quang Tuệ
nếu phần thập phân của số đó >0,5 thì làm tròn đến 1,0
(* (+ (fix (/ 2.8 0.5)) 1) 0.5) return 3.0
nếu phần thập phân của số đó <=0,5 thì làm tròn đến 0,5 (* (+ (fix (/ 2.3 0.5)) 1) 0.5) return 2.5 Tuệ kiểm tra xem đúng không nhé. Các bạn có thể nhìn vào code của mình để tìm hiểu thêm
E xin mạo muội viết là:
_$ (setq a (/ (float 8) 3)
_$ (fix (* (+ (/ a 0.5) 1) 0.5))
Kết quả: 3.
Xin mọi người cho ý kiến.. ^^
HI. e bị nhầm tí, e xin sửa lại:
_$ (setq a (/ (float 8) 3)
_$ (* (+ (fix (/ a 0.5) 1) 0.5))
như vầy giống yeu cầu đề bài k nhỉ… mọi người xin cho ý kiến…. ^^!!