Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
lp_hai

chỉ giùm cách cộng các chuổi string

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

các pác chỉ giúp em. VD em có str1 là abc và str2 là xyz bằng cách nhập vào:

(setq str1 (getstring "str1:"))

(setq str2 (getstring "str2:"))

bây giờ em muốn có kq là str3 là abcxyz thì phải làm sao.

(setq str3 (???))

mong các pá giúp cho 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
các pác chỉ giúp em. VD em có str1 là abc và str2 là xyz bằng cách nhập vào:

(setq str1 (getstring "str1:"))

(setq str2 (getstring "str2:"))

bây giờ em muốn có kq là str3 là abcxyz thì phải làm sao.

(setq str3 (???))

mong các pá giúp cho em.

thanks!

(setq str3 (strcat str1 str2))

  • 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
(setq str3 (strcat str1 str2))

bác Hoành coi giùm em cái này nhé:

(defun c:ga()

(setq dtc (entsel))

(setq dau (getstring "gach le 1:"))

(setq CHAN (getstring "gach 600:"))

(setq str3 (strcat dau chan))

(setq t2 (entget (car dtc)))

(setq t2 (subst (str3)))

(entmod t2)

(princ str3)

()

)

đoạn lisp này em muốn ghi lại chuỗi string vừa rồi nhưng ko dược bác ạh. xem giúp em nha bác!

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ác Hoành coi giùm em cái này nhé:

(defun c:ga()

(setq dtc (entsel))

(setq dau (getstring "gach le 1:"))

(setq CHAN (getstring "gach 600:"))

(setq str3 (strcat dau chan))

(setq t2 (entget (car dtc)))

(setq t2 (subst (str3)))

(entmod t2)

(princ str3)

()

)

đoạn lisp này em muốn ghi lại chuỗi string vừa rồi nhưng ko dược bác ạh. xem giúp em nha bác!

Bạn sai ở chỗ màu đỏ. Xem lại cách dùng subst.

 

Góp ý thêm:

Đừng vội vàng, nên thực hành từng bước, cẩn trọng với từng cái dấu ngoặc!

Chúc bạn nhanh chóng vượt qua được giai đoạn này.

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 sai ở chỗ màu đỏ. Xem lại cách dùng subst.

 

Góp ý thêm:

Đừng vội vàng, nên thực hành từng bước, cẩn trọng với từng cái dấu ngoặc!

Chúc bạn nhanh chóng vượt qua được giai đoạn này.

em viết cái lisp ghi công thức gạch nhưng nó bị lỗi chỗ nào ở hàm if. khi bỏ wa gạch lẻ đầu thì kết quả nó vẫn còn dấu cộng

http://www.cadviet.com/upfiles/3/tg.lsp

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
em viết cái lisp ghi công thức gạch nhưng nó bị lỗi chỗ nào ở hàm if. khi bỏ wa gạch lẻ đầu thì kết quả nó vẫn còn dấu cộng

http://www.cadviet.com/upfiles/3/tg.lsp

Chào bạn lp_hai,

Cái lisp bạn post này không down về được nên chẳng thể trả lời bạn đúng sai ra sao. Tuy nhiên nhìn vào cái lisp bạn gửi lần trước mình thấy có một số vấn đề như sau:

1/- Có phải bạn muốn thay thế một chuỗi cho trước (là chuỗi mà bạn gọi là dtc) bằng một chuỗi mới (là chuỗi mà bạn có được sau khi ghep hai chuỗi dau va chan với nhau str3) hay không?

2/- Nếu đúng như mình hiểu vậy bạn phải lưu ý như sau:

- Các chuỗi trong hàm (getstring ".......") không phải là chuỗi mà bạn muốn ghép đâu nhé. Đó chỉ là các chuỗi xuất hiện trên dòng command để nhắc bạn việc cần làm. Còn chuỗi mà bạn muốn ghép phải được nhập vào từ bàn phím sau khi xuất hiện các dòng nhắc này. Do vậy nếu bạn không nhập gì thì hàm (getstring "...." ) sẽ trả về một chuỗi trống lốc và đó có thể là cái nguyên nhân mà bạn không thấy kết quả gì xuất hiện.

- Đúng như bác SSG đã nói cú pháp của hàm (subst .......) bạn viết sai rồi, hàm (subst new old list) là hàm dùng để thay thế một phần tử mới vào đúng vị trí của một phần tử cũ trong một danh sách (list) cho trước và nó trả về một danh sách (list) mới tương tự như danh sách (list) cũ nhưng tại vị trí của phần tử bị thay thế (old) là phần tử thay thế (new).

Do vậy kết quả trả về của hàm (subst .....) là một danh sách (list) chứ không phải một chuỗi (string).

- Việc bạn muốn thay thế cái chuỗi str3 vào cái chuỗi dtc phải được hiểu là bạn thay thế giá trị của đối tượng chuỗi dtc bằng giá trị chuỗi mới str3 chứ không phải thay thế hoàn toàn bằng đối tượng mới. Do vậy bạn phải tìm trong danh sách (list) các mã dxf của đối tượng dtc cái mã thể hiện giá trị của đối tượng và thay thế mã này bằng mã mang giá trị mới là str3.

Cụ thể công việc này được diễn tả như sau:

- với dòng code (setq t2 (entget (car dtc))) bạn đã có được biến t2 là một danh sách chứa các mã dxf của đối tượng chuỗi được chọn là dtc.

- Bạn dùng đoạn code (setq old (assoc 1 t2)) để bạn có được mã dxf về giá trị chuỗi cũ (hiện có) của đối tượng dtc này.

- Bạn hãy dùng đoạn code (setq new (cons 1 str3)) để bạn có được mã dxf về giá trị mới của đối tượng dtc. Trong đó str3 là cái chuỗi mà bạn đã tạo ra ở trên.

- Bây giờ bạn mới dùng hàm (setq t2 (subst new old t2)) để thay thế giá trị mới của đối tượng dtc vào danh sách (list) các mã dxf của đối tượng dtc này.

- Và cuối cùng bạn dùng code (entmod t2) để hiển thị giá trị mới của đối tượng dtc trên màn hình.

3/- Cái cụm code () mà bác SSG đánh dấu đỏ đó bạn nên thay nó thành (princ) để chương trình lẳng lặng thoát êm mà không gây bất cứ phiền hà gì nữa.

 

Qua đoạn lisp trên bạn hãy cố gắng tìm hiểu thật kỹ về các hàm được sử dụng trong lisp bao gồm cả cú pháp, mục tiêu và cách áp dụng các hàm này. Mong rằng bạn sẽ nhanh chóng trở thành một cây lisp có hạng trong cộng đồng Cadviet.

Chúc bạn thành công.

  • 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
Chào bạn lp_hai,

Cái lisp bạn post này không down về được nên chẳng thể trả lời bạn đúng sai ra sao. Tuy nhiên nhìn vào cái lisp bạn gửi lần trước mình thấy có một số vấn đề như sau:

1/- Có phải bạn muốn thay thế một chuỗi cho trước (là chuỗi mà bạn gọi là dtc) bằng một chuỗi mới (là chuỗi mà bạn có được sau khi ghep hai chuỗi dau va chan với nhau str3) hay không?

2/- Nếu đúng như mình hiểu vậy bạn phải lưu ý như sau:

- Các chuỗi trong hàm (getstring ".......") không phải là chuỗi mà bạn muốn ghép đâu nhé. Đó chỉ là các chuỗi xuất hiện trên dòng command để nhắc bạn việc cần làm. Còn chuỗi mà bạn muốn ghép phải được nhập vào từ bàn phím sau khi xuất hiện các dòng nhắc này. Do vậy nếu bạn không nhập gì thì hàm (getstring "...." ) sẽ trả về một chuỗi trống lốc và đó có thể là cái nguyên nhân mà bạn không thấy kết quả gì xuất hiện.

- Đúng như bác SSG đã nói cú pháp của hàm (subst .......) bạn viết sai rồi, hàm (subst new old list) là hàm dùng để thay thế một phần tử mới vào đúng vị trí của một phần tử cũ trong một danh sách (list) cho trước và nó trả về một danh sách (list) mới tương tự như danh sách (list) cũ nhưng tại vị trí của phần tử bị thay thế (old) là phần tử thay thế (new).

Do vậy kết quả trả về của hàm (subst .....) là một danh sách (list) chứ không phải một chuỗi (string).

- Việc bạn muốn thay thế cái chuỗi str3 vào cái chuỗi dtc phải được hiểu là bạn thay thế giá trị của đối tượng chuỗi dtc bằng giá trị chuỗi mới str3 chứ không phải thay thế hoàn toàn bằng đối tượng mới. Do vậy bạn phải tìm trong danh sách (list) các mã dxf của đối tượng dtc cái mã thể hiện giá trị của đối tượng và thay thế mã này bằng mã mang giá trị mới là str3.

Cụ thể công việc này được diễn tả như sau:

- với dòng code (setq t2 (entget (car dtc))) bạn đã có được biến t2 là một danh sách chứa các mã dxf của đối tượng chuỗi được chọn là dtc.

- Bạn dùng đoạn code (setq old (assoc 1 t2)) để bạn có được mã dxf về giá trị chuỗi cũ (hiện có) của đối tượng dtc này.

- Bạn hãy dùng đoạn code (setq new (cons 1 str3)) để bạn có được mã dxf về giá trị mới của đối tượng dtc. Trong đó str3 là cái chuỗi mà bạn đã tạo ra ở trên.

- Bây giờ bạn mới dùng hàm (setq t2 (subst new old t2)) để thay thế giá trị mới của đối tượng dtc vào danh sách (list) các mã dxf của đối tượng dtc này.

- Và cuối cùng bạn dùng code (entmod t2) để hiển thị giá trị mới của đối tượng dtc trên màn hình.

3/- Cái cụm code () mà bác SSG đánh dấu đỏ đó bạn nên thay nó thành (princ) để chương trình lẳng lặng thoát êm mà không gây bất cứ phiền hà gì nữa.

 

Qua đoạn lisp trên bạn hãy cố gắng tìm hiểu thật kỹ về các hàm được sử dụng trong lisp bao gồm cả cú pháp, mục tiêu và cách áp dụng các hàm này. Mong rằng bạn sẽ nhanh chóng trở thành một cây lisp có hạng trong cộng đồng Cadviet.

Chúc bạn thành công.

chào bác!

bác thử mở lisp này xem giùm mình nha.

http://www.cadviet.com/upfiles/3/tg_1.lsp

đoạn code là thế này:

(defun c:tg( / dtc tong dau cuoi chan AA BB CC str3 t2)

 

(setq dt (entsel))

(setq tong (getdist "tong chieudai:"))

(setq dau (getstring "gach le dau:"))

(setq BB (atof dau))

(setq cuoi (getstring "gach le cuoi:"))

(setq CC (atof cuoi))

(setq AA (/ (- tong (+ BB CC))600))

(setq chan (rtos AA))

(if (= dau nil)

(progn

(setq str3 (strcat "(600x" chan ")+" cuoi))

)

)

(setq str3 (strcat dau "+(600x" chan ")+" cuoi))

(setq t2 (entget (car dtc)))

(setq t2 (subst (cons 1 str3) (assoc 1 t2) t2))

(entmod t2)

(princ)

)

 

mục đích của mình là muốn viết lisp để ghi công thức gạch lót sàn. vd như 350+(600x5)+200

có nghĩa là sàn ốp gạch kt 600, gạch cắt ở 2 đầu là 350 và 200 như vậy tổng chiều dài là 3550

cái lisp mình viết nó đúng với công thức khi có gạch lẻ ở cả 2 đầu. còn khi chỉ có gạch lẽ 1 đầu thì nó ko được như ý bác ah. vd mình muốn nhập cthức có gạch lẻ đầu là 0 (bỏ wa gạch lẻ đầu), tổng chiều dài là 3200 gạch lẻ cuối là 200. kết quả hải là (600x5)+200 nhưng lisp nó ghi là +(600x5)+200 (dư dấu +). do hàm if em xài chưa đúng. mong bác chỉ giúp

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 thử dùng đoạn lisp này thử xem nhé

Và đọc thêm về cách chỉnh sửa líp và bắt lỗi Autolisp luôn nhé

http://www.cadviet.com/forum/index.php?showtopic=22105

 

(defun c:tg (/ dtc tong dau cuoi chan AA BB CC str3 t2)
 (command ".undo" "begin")
 (setvar "CMDECHO" 0)
 (setq osmode (getvar "osmode"))
 (setvar "osmode" 0)
 (setvar "unitmode" 0)
 (setvar "dimzin" 0)

 (setq cuoi nil)
 (if (= kc_gach nil)
   (setq kc_gach1 600.00)
   (setq kc_gach1 kc_gach)
 )
 (setq	kc_gach	(GETREAL (strcat "\nKich thuoc gach chuan : <"
			 (rtos kc_gach1 2 2)
			 "(mm)>"
		 )
	)
 )
 (if (= kc_gach nil)
   (setq kc_gach kc_gach1)
 )

 (setq tong (GETREAL "\nTong chieu dai lot gach (mm) : "))
 (setq dau (GETREAL "\nChieu dai gach le dau (mm) : "))
 (if (= dau nil)
   (setq dau 0.00)
 )

 (if (/= tong nil)
   (progn
     (setq tong1 (- tong dau))
     (setq chan (fix (/ tong1 kc_gach)))
     (setq cuoi (rem tong1 kc_gach))
     (setq txt1 (rtos dau 2 0))
     (setq txt2 (rtos kc_gach 2 0))
     (setq txt3 (rtos chan 2 0))
     (setq txt4 (rtos cuoi 2 0))
     (cond
((= dau 0.00)
 (setq text (strcat "(" txt2 "x" txt3 ")+" txt4))
)
((= cuoi 0.00)
 (setq text (strcat txt1 "+" "(" txt2 "x" txt3 ")"))
)
((and (/= dau 0.00)
      (/= cuoi 0.00)
 )
 (setq text (strcat txt1 "+" "(" txt2 "x" txt3 ")+" txt4))
)
     )
   )
 )

 (setq dtc (entsel "\nChon TEXT de thay the : "))
 (setq t2 (entget (car dtc)))
 (if (= (cdr (assoc 0 t2)) "TEXT")
   (progn
     (setq t2 (subst (cons 1 text) (assoc 1 t2) t2))
     (entmod t2)
   )
   (princ (strcat "\n" text))
 )
 (princ "\n")
 (setvar "osmode" osmode)
 (command ".undo" "end")
)
)

  • 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
..........................

mục đích của mình là muốn viết lisp để ghi công thức gạch lót sàn. vd như 350+(600x5)+200

có nghĩa là sàn ốp gạch kt 600, gạch cắt ở 2 đầu là 350 và 200 như vậy tổng chiều dài là 3550

cái lisp mình viết nó đúng với công thức khi có gạch lẻ ở cả 2 đầu. còn khi chỉ có gạch lẽ 1 đầu thì nó ko được như ý bác ah. vd mình muốn nhập cthức có gạch lẻ đầu là 0 (bỏ wa gạch lẻ đầu), tổng chiều dài là 3200 gạch lẻ cuối là 200. kết quả hải là (600x5)+200 nhưng lisp nó ghi là +(600x5)+200 (dư dấu +). do hàm if em xài chưa đúng. mong bác chỉ giúp

Góp ý với bạn trong phạm vi bài toán chia gạch.

Về dữ liệu đầu vào :

- Nếu bạn nhập : Tổng chiều dài ,Phần dư đầu, phần dư cuối -> có khả năng số luợng viên gạch là số thập phân.(vì kích thuớc viên gạch là cố định)

VD : tổng = 3200, dư đầu = 300, dư cuối = 200 -> 300+(600*4.5)+200

đó là kết quả ta không mong muốn. <_<

 

Do đó phần nhập data chỉ gồm : Tổng chiều dài và (Phần dư đầu hoặc Phần dư cuối), phần dư còn lại LISP sẽ tự tính.

 

Đây là ví dụ minh họa về bài toán chia gạch (để đơn giản tui cho Phần dư đầu có kiểu nguyên INT)

Phần cập nhật vào Text của CAD bạn tự nghiên cứu tiếp.

(defun c:cg(/ chan cuoi dau str3 tmp tong);chia gach
 (setq tong (getdist "\nTong chieu dai:"))
 (setq dau (getint "\nPhan du dau:"))
 (if (= dau nil)
   (setq dau 0))
 (setq tmp (/ (- tong dau) 600))
 ;lấy phần nguyên
 (setq chan (fix tmp))
 (setq cuoi (- tong (+ dau (* chan 600))))
 (if (= dau 0)
   (setq str3 (strcat "(600x" (itoa chan) ")+" (rtos cuoi)))
   (setq str3 (strcat (itoa dau) "+(600x" (itoa chan) ")+" (rtos cuoi))) )
 (princ str3)
(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
chào bác!

bác thử mở lisp này xem giùm mình nha.

http://www.cadviet.com/upfiles/3/tg_1.lsp

đoạn code là thế này:

mục đích của mình là muốn viết lisp để ghi công thức gạch lót sàn. vd như 350+(600x5)+200

có nghĩa là sàn ốp gạch kt 600, gạch cắt ở 2 đầu là 350 và 200 như vậy tổng chiều dài là 3550

cái lisp mình viết nó đúng với công thức khi có gạch lẻ ở cả 2 đầu. còn khi chỉ có gạch lẽ 1 đầu thì nó ko được như ý bác ah. vd mình muốn nhập cthức có gạch lẻ đầu là 0 (bỏ wa gạch lẻ đầu), tổng chiều dài là 3200 gạch lẻ cuối là 200. kết quả hải là (600x5)+200 nhưng lisp nó ghi là +(600x5)+200 (dư dấu +). do hàm if em xài chưa đúng. mong bác chỉ giúp

Chào bạn lp_hai,

Rất mừng là bạn đã viết được đoạn lisp trên để phục vụ cho công việc của bạn. Đoạn lisp của bạn về cơ bản đã đúng với cú pháp của lisp và chạy ngon lành tuy nhiên nó chưa đúng với cái bạn muốn là do cú pháp của hàm lisp bạn dùng chưa hoàn toàn thích hợp.

Bạn chú ý rằng hàm lisp (if ....) có một số cú pháp như sau:

(if ........(progn ....) (progn .....)): Nếu ..... thì ..... khác thì .....

(if ....... (progn ....)) ; Nếu ..... thì .... và kết thúc hàm if luôn mà không xét trường hợp khác.

Bạn đã sử dụng cú pháp thứ hai nên trong cả hai trường hợp có và không có giá trị của biến dau, chương trình sẽ luôn lấy giá trị của biến str3 là: (setq str3 (strcat dau "+(600x" chan ")+" cuoi)) . Do đó khi biến dau = nil thì biến str3 vẫn còn cái dấu + bạn ạ. Và như vậy vô hình trung cái đoạn hàm (if ......) của bạn trở thành vô giá trị trong đoạn lisp trên vì trong lisp giá trị của biến luôn được lấy từ hàm xác định biến sau cùng.

Bạn chỉ cần sửa đoạn lisp trên một chút xíu như sau để sử dụng cú pháp theo dạng thứ nhất là OK ngay:

Mang cái dấu ngoặc đóng kết thúc hàm (if ..... ) đặt ra phía sau đoạn code (setq str3 (strcat dau "+(600x" chan ")+" cuoi)) . Nghĩa là từ đoạn code:

(if (= dau nil)
   (progn
   (setq str3 (strcat "(600x" chan ")+" cuoi))
   )
)
 (setq str3 (strcat dau "+(600x" chan ")+" cuoi))

trở thành:

(if (= dau nil)
   (progn
   (setq str3 (strcat "(600x" chan ")+" cuoi))
   )
   (setq str3 (strcat dau "+(600x" chan ")+" cuoi))
)

Bạn chúy ý thêm rằng hàm (progn .......) chỉ nên dùng khi phải thực hiện nhiều nhiệm vụ với cùng một điều kiện thôi. Đó chính là lý do mà trong đoạn code mình sửa không thấy xuất hiện hàm progn khi điều kiện giá trị của biến dau khác nil. Và cũng có nghĩa là có thể bỏ hàm (progn ...) của bạn khi giá trị biến dau bằng nil. Khi đó đoạn code trên sẽ là:

(if (= dau nil)
   (setq str3 (strcat "(600x" chan ")+" cuoi))
   (setq str3 (strcat dau "+(600x" chan ")+" cuoi))
)

Bạn hãy thử xem nhé. Chúc bạn thành công

TB: Bạn nên tham khảo thêm ý kiến của bác Giabach và VUVUZELA ở trên để hoàn thiện đoạn lisp của bạn nhé. Mình thấy chúng cũng khá xác đáng đó.

  • 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

xin cảm ơn tất cả các bác. em làm được rồi. Bây em biêt rõ thêm về cái hàm if.

nếu được bác bày cho em cái hàm WHILE luôn đi. chứ em thấy khi thì if lúc thì While. chẵn hiểu mô tê gì cả! hic. ()

và khi em muốn Dùng hàm if trong hàm if nữa thi có dc ko hả bác. VD như

(if(...)

(progn

(..)

(if (...) ...)

)

)

Mong tin các bác

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

Này thì WHILE nè. Nhập mệt nghỉ luôn

(defun c:tg (/ dtc tong dau cuoi chan AA BB CC str3 t2)
 (command ".undo" "begin")
 (setvar "CMDECHO" 0)
 (setq osmode (getvar "osmode"))
 (setvar "osmode" 0)
 (setvar "unitmode" 0)
 (setvar "dimzin" 0)

 (setq cuoi nil)
 (if (= kc_gach nil)
   (setq kc_gach1 600.00)
   (setq kc_gach1 kc_gach)
 )
 (setq	kc_gach	(GETREAL (strcat "\nKich thuoc gach chuan : <"
			 (rtos kc_gach1 2 2)
			 "(mm)>"
		 )
	)
 )
 (if (= kc_gach nil)
   (setq kc_gach kc_gach1)
 )
;;;WHILE
 (while (/= (setq tong (GETREAL "\nTong chieu dai lot gach (mm) : "))
     nil
 )

   (setq dau (GETREAL "\nChieu dai gach le dau (mm) : "))
   (if	(= dau nil)
     (setq dau 0.00)
   )

   (if	(/= tong nil)
     (progn
(setq tong1 (- tong dau))
(setq chan (fix (/ tong1 kc_gach)))
(setq cuoi (rem tong1 kc_gach))
(setq txt1 (rtos dau 2 0))
(setq txt2 (rtos kc_gach 2 0))
(setq txt3 (rtos chan 2 0))
(setq txt4 (rtos cuoi 2 0))
(cond
  ((= dau 0.00)
   (setq text (strcat "(" txt2 "x" txt3 ")+" txt4))
  )
  ((= cuoi 0.00)
   (setq text (strcat txt1 "+" "(" txt2 "x" txt3 ")"))
  )
  ((and	(/= dau 0.00)
	(/= cuoi 0.00)
   )
   (setq text (strcat txt1 "+" "(" txt2 "x" txt3 ")+" txt4))
  )
)
     )
   )

   (setq dtc (entsel "\nChon TEXT de thay the : "))
   (setq t2 (entget (car dtc)))
   (if	(= (cdr (assoc 0 t2)) "TEXT")
     (progn
(setq t2 (subst (cons 1 text) (assoc 1 t2) t2))
(entmod t2)
     )
     (princ (strcat "\n" text))
   )
   (princ "\n")
 )
 ;;;het WHILE
 (setvar "osmode" osmode)
 (command ".undo" "end")
)

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

sau khi được các bác chỉ dẫn. em viết dc cái líp ghi ct gạch như thế này

 

(DEFUN INIT()
(if (= kt1 Nil)
(setq kt1 600)
)
)

(defun c:gach( / dtc tong dau cuoi chan AA BB CC str3 t2 kt ktg)
 (INIT)
 (setq dtc (entsel))
 (setq tong (getdist "tong chieudai:"))  
 (setq kt (getreal(strcat "\nKich thuoc gach: <"(rtos kt1 2 0)">")))
 (if (/= kt Nil)
   (setq kt1 kt)
   )
 (if (= kt Nil)
   (setq kt kt1)
   )
 (setq dau (getstring "gach le dau:"))
 (setq BB (atof dau))  
 (setq CC (rem (- tong BB) kt))
 (setq cuoi (rtos CC 2 0))
 (if
     (= dau nil)
     (setq BB 0.00)
   )
 (if (/= tong nil)
   (progn
     (setq AA (/ (- tong (+ BB CC))kt))
     (setq chan (rtos AA 2 0))
     (setq ktg (rtos kt 2 0))
     (cond ((and (= BB 0.00) (/= CC 0.00))
     (setq str3 (strcat "("ktg"x" chan ")+" cuoi))
     )
    )
     (cond ((and (= BB 0.00) (= CC 0.00))
     (setq str3 (strcat "("ktg"x" chan ")"))
     )
    )
     (cond ((and (/= BB 0.00) (= CC 0.00))
     (setq str3 (strcat dau "+("ktg"x" chan ")"))
     )
    )
     (cond ((and (/= BB 0.00) (/= CC 0.00))
     (setq str3 (strcat dau "+("ktg"x" chan ")+" cuoi))
     )	          
    )  
     )
   )
 (setq t2 (entget (car dtc)))
 (setq t2 (subst (cons 1 str3) (assoc 1 t2) t2))
 (entmod t2)
 (princ)
 )

em có thêm cái hàm INIT để gọi lại kt1 đã nhập lần trước.

nói chung thì nó chạy đúng yêu cầu rồi. nhưng e thấy nó hơi lủng lủng ở cái chổ

(if (/= kt Nil)

(setq kt1 kt)

)

(if (= kt Nil)

(setq kt kt1)

)

với lại trong lisp này có quá nhiều dòng (cond((...)))

mới vào nghề nên chưa chuyên nghiệp lắm. mong các bác chỉ giùm cách làm gọn lại (nhưng vẫn giữ nội dung chính của em nha!)

vì nhờ các bác viết hộ cái lisp thì đơn giản rồi, nhưng xài đô do mình tạo ra vẫn thấy phê hơn dúng ko các bác.

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

Vì khi viết chương trình bạn phải tính đến các yếu tố sau :

1. Người sử dụng sẽ nhập nhiều kiểu khác nhau nên phải tính đến mọi tình huống có thể xảy ra

2. Phải hiểu rõ đúng bản chất của câu lệnh là gì

VD :

(if (= a Nil)

(Nếu đúng sẽ thực hiện công việc B )

(Nếu sai sẽ thực hiện công việc C)

)

3. Phải viết câu lệnh càng đơn giản càng tốt để dễ chỉnh sửa và bắt lỗi

4. Về vấn đề sử dụng hàm COND là do tình huống chia gạch của bạn có nhiều tình huống có thể xảy ra nên trong tình huống này sử dụng hàm COND là hay nhất. Do cách viết của hàm COND dễ kiểm soát và có thể sử dụng tới hàng chục hàng trăm tình huống có thể xảy ra.

Nếu bạn viết hàm IF thì cũng được nhưng khó kiểm soát, Các hàm IF lồng vào nhau rất nhiều. Khi viết bạn chỉ cần đánh sai vị trí của dấu ( và ) là chương trình chạy sai ngay.

  • 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
sau khi được các bác chỉ dẫn. em viết dc cái líp ghi ct gạch như thế này

em có thêm cái hàm INIT để gọi lại kt1 đã nhập lần trước.

nói chung thì nó chạy đúng yêu cầu rồi. nhưng e thấy nó hơi lủng lủng ở cái chổ

(if (/= kt Nil)

(setq kt1 kt)

)

(if (= kt Nil)

(setq kt kt1)

)

với lại trong lisp này có quá nhiều dòng (cond((...)))

mới vào nghề nên chưa chuyên nghiệp lắm. mong các bác chỉ giùm cách làm gọn lại (nhưng vẫn giữ nội dung chính của em nha!)

vì nhờ các bác viết hộ cái lisp thì đơn giản rồi, nhưng xài đô do mình tạo ra vẫn thấy phê hơn dúng ko các bác.

thanks!

Chào bạn lp_hai,

Bạn nói "nhưng xài đô do mình tạo ra vẫn thấy phê hơn dúng ko các bác" chí phải, chí chí phải.... Chả thế mà "Tăm ta tốt bằng ba tăm ngoại" hề hề hề....

Cái vụ hàm (cond ....) thì bác VUVUZELA đã giải thích quá rõ rồi.

Còn cái vụ:

(if (/= kt Nil)

(setq kt1 kt)

)

(if (= kt Nil)

(setq kt kt1)

)

Chẳng qua là do sự quá cẩn thận mà ra. Thường thường đối với các lisper hay programer chuyên nghiệp thì ấy là sự thường. Còn cái loại amateur như mình rất hay bỏ qua cái sự cẩn trọng này. Nguyên nhân của nó là ở chỗ, cái mình làm ra chỉ để cho mình dùng nên thay vì cẩn thận khi viết lisp (vụ này khó vì nó đòi hỏi tư duy của một programer) mình chọn kiểu cẩn thận khi xài. Hề hề hề.....

Còn các lisper hay programer chuyên nghiệp thì viết cho quần chúng xài nên họ phải cẩn thận để duy trì cái thương hiệu của họ. Hề hề hề.....

Việc chọn hàm nào để sử dụng trong quá trình viết lisp là tùy theo cách tư duy của người làm lisp. Anh chàng Amateur sẽ cố chọn các hàm mà mình hiểu rõ và hay dùng để xài. còn các lisper và programer thì sẽ cẩn trọng tìm xem hàm nào là tối ưu khi xài. Cách hiểu về tối ưu này cũng rất khác nhau tùy theo các lisper hay programer. Thế nên mới có chuyện cãi nhau như mổ bò khi làm lisp.

Cái thắc mắc của bạn ở bài post trước là khi nào thì dùng While và khi nào dùng if cũng rưa rứa. Theo ngu ý của mình thì if thường dùng cho những trường hợp kiểm tra điều kiện tương đối đơn giản và khi thỏa mãn sẽ thực hiện hay không thực hiện một số lượng không quá lớn các hành động kèm theo.

Còn While thường dùng cho việc kiểm tra các điều kiện có tính chất lặp đi lặp lại và khi thỏa mãn sẽ thực hiện một số các hành động cũng có tính chất lặp đi lặp lại như vậy.

Túm lại là khi bạn làm lisp, bạn khoái dùng thằng nào thì bạn phải cố gắng hiểu rõ về các cú pháp của hàm đó, hiểu rõ các biến cũng như các tham số mà hàm sử dụng, đồng thời hiểu rõ tính năng cũng như các giá trị trả về của hàm.

Mong rằng bạn sẽ sớm trở thành một super lisper của diễn đàn....

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  

×