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

lấy số lẻ trong text

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

Hôm trước em có viết được cái lisp cộng các số lại vối nhau. khi viết ra kết quả thì có chút rắc rối.

Khi em dùng (setq KQ (rtos tong 2 3)) thì nó lấy 3 số lẽ sau dấu phẩy

còn (setq KQ (rtos (fix tong))) thì nó làm tròn số rồi. hix

em muốn KQ lấy tất cả số lẻ mà các số con có. VD như 1+3 -> KQ =4(ko cần ghi số lẻ).

còn 1.1+3.475 ->kq= 4.575 (lấy tất cả số lẻ)

các anh biết chỉ cho em nha!

 

với cho em hỏi cách lọc text chỉ toàn số thực thôi, loại bỏ các text có chứa chữ. tại vì khi em cộng dòng text 1A thì nó hiểu như là 1.

Thanks nhiều

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
Hôm trước em có viết được cái lisp cộng các số lại vối nhau. khi viết ra kết quả thì có chút rắc rối.

Khi em dùng (setq KQ (rtos tong 2 3)) thì nó lấy 3 số lẽ sau dấu phẩy

còn (setq KQ (rtos (fix tong))) thì nó làm tròn số rồi. hix

em muốn KQ lấy tất cả số lẻ mà các số con có. VD như 1+3 -> KQ =4(ko cần ghi số lẻ).

còn 1.1+3.475 ->kq= 4.575 (lấy tất cả số lẻ)

các anh biết chỉ cho em nha!

 

với cho em hỏi cách lọc text chỉ toàn số thực thôi, loại bỏ các text có chứa chữ. tại vì khi em cộng dòng text 1A thì nó hiểu như là 1.

Thanks nhiều

Bạn tham khảo cách lọc TEXT số :

- http://www.cadviet.com/forum/index.php?showtopic=5733&

- http://www.cadviet.com/forum/index.php?sho...ost&p=89961

 

Cú pháp hàm rtos : (rtos number [mode [precision]])

Trong đó :

- precision : An integer specifying the precision.

- mode : chúng ta thuờng dùng hệ thập phân, nên mode=2

vd :

- (rtos 1.2345 2 1) -> "1.2" : 1 số lẻ

- (rtos 1.2345 2 2) -> "1.23" : 2 số lẻ

- (rtos 1.2345 2 3) -> "1.234" : 3 số lẻ

 

Đây là đọan code lấy số số lẻ của 1 str có giá trị là số thực (REAL)

(defun prec (str)

(1- (strlen (vl-string-left-trim "+-1234567890" str))))

vd :

- (prec "1.234") --> 3

- (prec "1.23") --> 2

- (prec "1.2") --> 1

Để "KQ lấy tất cả số lẻ mà các số con có", bạn cần duyệt qua các số hạng, tìm số số lẻ của từng số hạng rồi so sánh các trị số này với nhau -> tìm trị lớn nhất chính là so_so_le cần tìm.

Gọi hàm rtos để lấy kết quả : (setq KQ (rtos tong 2 so_so_le))

Phần này dành cho bạn.

  • 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 tham khảo cách lọc TEXT số :

- http://www.cadviet.com/forum/index.php?showtopic=5733&

- http://www.cadviet.com/forum/index.php?sho...ost&p=89961

 

Cú pháp hàm rtos : (rtos number [mode [precision]])

Trong đó :

- precision : An integer specifying the precision.

- mode : chúng ta thuờng dùng hệ thập phân, nên mode=2

vd :

- (rtos 1.2345 2 1) -> "1.2" : 1 số lẻ

- (rtos 1.2345 2 2) -> "1.23" : 2 số lẻ

- (rtos 1.2345 2 3) -> "1.234" : 3 số lẻ

 

Đây là đọan code lấy số số lẻ của 1 str có giá trị là số thực (REAL)

(defun prec (str)

(1- (strlen (vl-string-left-trim "+-1234567890" str))))

vd :

- (prec "1.234") --> 3

- (prec "1.23") --> 2

- (prec "1.2") --> 1

Để "KQ lấy tất cả số lẻ mà các số con có", bạn cần duyệt qua các số hạng, tìm số số lẻ của từng số hạng rồi so sánh các trị số này với nhau -> tìm trị lớn nhất chính là so_so_le cần tìm.

Gọi hàm rtos để lấy kết quả : (setq KQ (rtos tong 2 so_so_le))

Phần này dành cho bạn.

thanks! để mình từ từ ngâm cú. hee vì cũng biết lisp ko nhiều lắm nên phải từ từ mình mới nghiệm ra dc.

khi nào bí thì bạn trả lời giúp mình nha :rolleyes:

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 tham khảo cách lọc TEXT số :

- http://www.cadviet.com/forum/index.php?showtopic=5733&

- http://www.cadviet.com/forum/index.php?sho...ost&p=89961

 

Cú pháp hàm rtos : (rtos number [mode [precision]])

Trong đó :

- precision : An integer specifying the precision.

- mode : chúng ta thuờng dùng hệ thập phân, nên mode=2

vd :

- (rtos 1.2345 2 1) -> "1.2" : 1 số lẻ

- (rtos 1.2345 2 2) -> "1.23" : 2 số lẻ

- (rtos 1.2345 2 3) -> "1.234" : 3 số lẻ

 

Đây là đọan code lấy số số lẻ của 1 str có giá trị là số thực (REAL)

(defun prec (str)

(1- (strlen (vl-string-left-trim "+-1234567890" str))))

vd :

- (prec "1.234") --> 3

- (prec "1.23") --> 2

- (prec "1.2") --> 1

Để "KQ lấy tất cả số lẻ mà các số con có", bạn cần duyệt qua các số hạng, tìm số số lẻ của từng số hạng rồi so sánh các trị số này với nhau -> tìm trị lớn nhất chính là so_so_le cần tìm.

Gọi hàm rtos để lấy kết quả : (setq KQ (rtos tong 2 so_so_le))

Phần này dành cho bạn.

khong xong rồi anh gia_bach ah! em ko hiểu hàm "prec" làm sao để lấy kết quả?

(defun c:prec ()

(setq sel (entsel "\nHay chon so: "))

(setq ent (car sel))

(setq sosole (1- (strlen (vl-string-left-trim "+-1234567890" (entget ent)))))

(setq AA (rtos sosole))

(princ AA)

(princ)

)

VD như ở trên em muốn in ra kết quả là số số lẻ của một số.

anh sửa lại jùm em

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
khong xong rồi anh gia_bach ah! em ko hiểu hàm "prec" làm sao để lấy kết quả?

(defun c:prec ()

(setq sel (entsel "\nHay chon so: "))

(setq ent (car sel))

(setq sosole (1- (strlen (vl-string-left-trim "+-1234567890" (entget ent)))))

(setq AA (rtos sosole))

(princ AA)

(princ)

)

VD như ở trên em muốn in ra kết quả là số số lẻ của một số.

anh sửa lại jùm em

Đã sửa lại cho bạn :

(defun prec (str)

(1- (strlen (vl-string-left-trim "+-1234567890" str))))

(defun c:prec ()

(setq sel (entsel "\nHay chon so: "))

(setq ent (car sel))

(setq sosole (prec (cdr(assoc 1 (entget ent)))))

(setq AA (rtos sosole))

(princ AA)

(princ)

)

Chú ý đối số của hàm prec là 1 String : chuỗi

 

Một cách khác để xây dựng hàm prec :

(defun prec(a) (1- (- (strlen a) (strlen (itoa(fix (atof a)))))))

vd :

- (prec "1.234") --> 3

- (prec "1.23") --> 2

- (prec "1.2") --> 1

Mình dịch định nghĩa hàm prec trên do mình viết như sau :

Ví dụ (setq a "12.2530")

Hàm sẽ lấy số kí tự của chuỗi a. Tức = 7 kí tự

Trừ đi số kí tự của chuỗi số nguyên của a. (itoa(fix (atof a))) = "12". Tức bằng 2 kí tự

Trừ đi 1 kí tự là dâu chấm "."

Kết quả : 7-2-1 = 4 số lẻ.

Vài dòng giải thích. Hy vọng bạn hiểu ra vấn đề

  • 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
Đã sửa lại cho bạn :

(defun prec (str)

(1- (strlen (vl-string-left-trim "+-1234567890" str))))

(defun c:prec ()

(setq sel (entsel "\nHay chon so: "))

(setq ent (car sel))

(setq sosole (prec (cdr(assoc 1 (entget ent)))))

(setq AA (rtos sosole))

(princ AA)

(princ)

)

Chú ý đối số của hàm prec là 1 String : chuỗi

 

Một cách khác để xây dựng hàm prec :

(defun prec(a) (1- (- (strlen a) (strlen (itoa(fix (atof a)))))))

vd :

- (prec "1.234") --> 3

- (prec "1.23") --> 2

- (prec "1.2") --> 1

Mình dịch định nghĩa hàm prec trên do mình viết như sau :

Ví dụ (setq a "12.2530")

Hàm sẽ lấy số kí tự của chuỗi a. Tức = 7 kí tự

Trừ đi số kí tự của chuỗi số nguyên của a. (itoa(fix (atof a))) = "12". Tức bằng 2 kí tự

Trừ đi 1 kí tự là dâu chấm "."

Kết quả : 7-2-1 = 4 số lẻ.

Vài dòng giải thích. Hy vọng bạn hiểu ra vấn đề

hee. bjo thi em hiểu cái vụ số lẻ rồi. Một vấn đề nữa. là khi kết quả so sánh các số lẻ của những số hạng thì líp sẽ lấy sosole nhiều nhất. nhưng tổng thì có sosole ít hơn. VD nhé:

1.12399 + 2.12301 = 3.24700 khi này kq là 5 số lẻ. trong khi đáng nhẽ tổng chỉ cần nghi 3 so lẻ thôi. máy làm thì phải chính xác phải ko anh. heee anh chỉ em luôn nha

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
hee. bjo thi em hiểu cái vụ số lẻ rồi. Một vấn đề nữa. là khi kết quả so sánh các số lẻ của những số hạng thì líp sẽ lấy sosole nhiều nhất. nhưng tổng thì có sosole ít hơn. VD nhé:

1.12399 + 2.12301 = 3.24700 khi này kq là 5 số lẻ. trong khi đáng nhẽ tổng chỉ cần nghi 3 so lẻ thôi. máy làm thì phải chính xác phải ko anh. heee anh chỉ em luôn nha

Bạn so sánh các sosole cua cac so với nhau rồi mới thực hiện việc tính tổng

Và nếu không muốn số 0 xuất hiện đằng sau nữa như ví dụ của bạn thì thiết lập Biến hệ thống DIMZIN = 8

(setvar "DIMZIN" 8)

 

Cái này Tue_NV để bạn tự làm

 

Dùng giải thuật "Lính canh" :

Cho 1 tập hợp số Q={a, b, c...., n}

Chọn 1 số bất kì trong tập hợp Q làm chuẩn, làm "lính canh". Gọi giá trị này là X

Duyệt qua từng phần tử của tập hợp Q.

- Nếu Phần tử nào nhỏ hơn X thì cho qua

- Nếu Phần tử nào lớn hơn X thì lấy phần tử này bằng giá trị của X (Và phần tử này làm "lính canh")

-> Kết quả cuối cùng chính là X. Không có phần tử nào có thể lớn hơn X được nữa.

 

Cụ thể thế này : Trong lớp có 50 học sinh. Tìm ra người cao nhất

-> Bạn phải chọn ra 1 người bất kì trong lớp làm tiêu chuẩn so sánh. Người nào thấp hơn người đó thì cho qua. Người nào cao hơn người đó thì giữ lại làm tiêu chuẩn so sánh. So sánh cho tới người cuối cùng trong lớp

Thì người được lấy ra làm tiêu chuẩn so sánh cuối cùng chính là người cao nhất

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 so sánh các sosole cua cac so với nhau rồi mới thực hiện việc tính tổng

Và nếu không muốn số 0 xuất hiện đằng sau nữa như ví dụ của bạn thì thiết lập Biến hệ thống DIMZIN = 8

(setvar "DIMZIN" 8)

 

Cái này Tue_NV để bạn tự làm

 

Dùng giải thuật "Lính canh" :

Cho 1 tập hợp số Q={a, b, c...., n}

Chọn 1 số bất kì trong tập hợp Q làm chuẩn, làm "lính canh". Gọi giá trị này là X

Duyệt qua từng phần tử của tập hợp Q.

- Nếu Phần tử nào nhỏ hơn X thì cho qua

- Nếu Phần tử nào lớn hơn X thì lấy phần tử này bằng giá trị của X (Và phần tử này làm "lính canh")

-> Kết quả cuối cùng chính là X. Không có phần tử nào có thể lớn hơn X được nữa.

 

Cụ thể thế này : Trong lớp có 50 học sinh. Tìm ra người cao nhất

-> Bạn phải chọn ra 1 người bất kì trong lớp làm tiêu chuẩn so sánh. Người nào thấp hơn người đó thì cho qua. Người nào cao hơn người đó thì giữ lại làm tiêu chuẩn so sánh. So sánh cho tới người cuối cùng trong lớp

Thì người được lấy ra làm tiêu chuẩn so sánh cuối cùng chính là người cao nhất

em làm cái lisp cộng số xong rồi. ra số lẻ cũng OK. nhưng sao cái kết quả ra số lẻ nhiều nhất thì nó chỉ báo đúng lần đầu tiên thôi ah. còn những lần sau nó cứ lấy kết quả của lần đầu. anh xem júp em cái lisp tìm số lẻ nhiều nhất này nhá!

 

(defun prec(a) (1- (- (strlen a) (strlen (itoa(fix (atof a)))))))

(defun c:lemax(/ sodoituong AA index)

(setq ssdt (ssget '((0 . "TEXT"))))

(defun tinhle(ent / sosole solemax ent_max)

(setq sosole (prec (cdr(assoc 1 (entget ent)))))

)

(setq

sodoituong (sslength ssdt)

index 0

)

(repeat sodoituong

(setq

ent_ht (ssname ssdt index)

index (1+ index)

sosole (tinhle ent_ht)

)

(if(or (= index 0) (> sosole solemax))

(setq solemax sosole

ent_max ent_ht)

)

)

(setq AA (rtos solemax))

(princ "\nso le max la:")

(princ AA)

(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
em làm cái lisp cộng số xong rồi. ra số lẻ cũng OK. nhưng sao cái kết quả ra số lẻ nhiều nhất thì nó chỉ báo đúng lần đầu tiên thôi ah. còn những lần sau nó cứ lấy kết quả của lần đầu. anh xem júp em cái lisp tìm số lẻ nhiều nhất này nhá!

 

(defun prec(a) (1- (- (strlen a) (strlen (itoa(fix (atof a)))))))

(defun c:lemax(/ sodoituong AA index)

(setq ssdt (ssget '((0 . "TEXT"))))

(defun tinhle(ent / sosole solemax ent_max)

(setq sosole (prec (cdr(assoc 1 (entget ent)))))

)

(setq

sodoituong (sslength ssdt)

index 0

)

(repeat sodoituong

(setq

ent_ht (ssname ssdt index)

index (1+ index)

sosole (tinhle ent_ht)

)

(if(or (= index 0) (> sosole solemax))

(setq solemax sosole

ent_max ent_ht)

)

)

(setq AA (rtos solemax))

(princ "\nso le max la:")

(princ AA)

(princ)

)

Nguyên nhân : Biến sosole và biến solemax kết thúc chương trình chưa được giải phóng.

Bạn tự nghiệm và suy luận sẽ ra liền à. Xem lại dòng màu đỏ mà Tue_NV đã dánh dấu trong bài viết này

  • 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
Nguyên nhân : Biến sosole và biến solemax kết thúc chương trình chưa được giải phóng.

Bạn tự nghiệm và suy luận sẽ ra liền à. Xem lại dòng màu đỏ mà Tue_NV đã dánh dấu trong bài viết này

cảm ơn Tue_NV nghe!

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 Tue_NV nghe!

@'lp_hai' : DĐ có nút tick Thanks . Bạn bấm vào đó là được.

Tue_NV quên nói thêm : để lấy số lớn nhất trong dãy số -> Bạn cũng có thể dùng hàm Max trong Lisp

Ví dụ : (max 1 2 5 4 7 6) -> Return 7

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ột cách khác để xây dựng hàm prec :

(defun prec(a) (1- (- (strlen a) (strlen (itoa(fix (atof a)))))))

vd :

- (prec "1.234") --> 3

- (prec "1.23") --> 2

- (prec "1.2") --> 1

Mình dịch định nghĩa hàm prec trên do mình viết như sau :

Bác Tuệ ơi vẫn còn lồi, nếu mình gõ: (prec "0") --> -1, thì sao bác, vẫn có những TEXT có giá trị 0. Bác xem lại 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
Bác Tuệ ơi vẫn còn lồi, nếu mình gõ: (prec "0") --> -1, thì sao bác, vẫn có những TEXT có giá trị 0. Bác xem lại nhé.

Cả Lisp của anh gia_bach và của Tue_NV đều bị "dính" lỗi này. (prec "2") -> -1

Sửa lại như sau :

(defun prec(a)

(if (vl-string-search "." a)

(1- (- (strlen a) (strlen (itoa(fix (atof a))))))

(- (strlen a) (strlen (itoa(fix (atof a)))))

)

)

 

xaakiii_mboet và lp_hai sử dụng thử 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
Bác Tuệ ơi vẫn còn lồi, nếu mình gõ: (prec "0") --> -1, thì sao bác, vẫn có những TEXT có giá trị 0. Bác xem lại nhé.

Hàm prec trả về -1 khi đối số là số nguyên.

 

Tuy nhiên với hàm : (defun prec(a) (1- (- (strlen a) (strlen (itoa(fix (atof a)))))))

khi đối số không chính tắc, kết quả sẽ không chính xác.

vd : (prec "000123.456")

 

........

VD nhé: 1.12399 + 2.12301 = 3.24700 khi này kq là 5 số lẻ. trong khi đáng nhẽ tổng chỉ cần nghi 3 so lẻ thôi. máy làm thì phải chính xác phải ko anh.

Đưong nhiên máy làm thì phải chính xác, chỉ có nguời cung cấp giải thuật là nhầm lẫn.

Bạn cần xem lại các quy tắc số học khi tính toán với số Thập phân.

 

........

(defun prec(a) (1- (- (strlen a) (strlen (itoa(fix (atof a)))))))

........

So sánh tốc độ giữa 2 hàm tính số chữ số thập phân :

- (defun prec1(a) (1- (- (strlen a) (strlen (itoa(fix (atof a)))))))

- (defun prec2(a) (1- (strlen (vl-string-left-trim "+-1234567890" a))))

 

(defun c:test(/ time1 time2)

(defun prec1(a) (1- (- (strlen a) (strlen (itoa(fix (atof a)))))))

(defun prec2(a) (1- (strlen (vl-string-left-trim "+-1234567890" a))))

 

(setq time1 (getvar "MILLISECS"))

(repeat 10000 (prec1 "123456.789") )

(princ (strcat "\nThoi gian thuc hien 10000 lan ham Prec1 : " (rtos(- (getvar "MILLISECS") time1)) " ms."))

 

(setq time2 (getvar "MILLISECS"))

(repeat 10000 (prec2 "123456.789") )

(princ (strcat "\nThoi gian thuc hien 10000 lan ham Prec2 : " (rtos(- (getvar "MILLISECS") time2)) " ms."))

 

(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
Bác Tuệ ơi vẫn còn lồi, nếu mình gõ: (prec "0") --> -1, thì sao bác, vẫn có những TEXT có giá trị 0. Bác xem lại nhé.

Hề hề hề,

Cái vụ này chơi thêm một hàm điều kiện khi chuỗi có số ký tự là 1, vì khi đó chắc chắn chả có thằng số lẻ thập phân nào, vậy nên so_so_le ắt nhận giá trị 0.

Hề hề hề.........

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
Hề hề hề,

Cái vụ này chơi thêm một hàm điều kiện khi chuỗi có số ký tự là 1, vì khi đó chắc chắn chả có thằng số lẻ thập phân nào, vậy nên so_so_le ắt nhận giá trị 0.

Hề hề hề.........

Bác phamthanhbinh chưa TỔNG QUÁT rồi :

(defun prec1(a) (1- (- (strlen a) (strlen (itoa(fix (atof a)))))))

(defun prec2(a) (1- (strlen (vl-string-left-trim "+-1234567890" a))))

 

-> Hai hàm này khi đối số là số nguyên thì hàm prec trả về kết quả là -1 .

Bác phát biểu là : "chơi thêm một hàm điều kiện khi chuỗi có số ký tự là 1," là không TỔNG QUÁT rồi.

Bác cũng hiểu là Tập số nguyên Z= {....-10;...,-3;-2;-1;0;1;2;3....;10;....}

 

Bác xem lại code mà Tue_NV đã sửa lại ở bài viết số 13

 

@ anh gia_bach : Cảm ơn anh đã chỉ ra nhược điểm và tốc độ của hàm prec1. Thank you very much :rolleyes:

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

TIện đây nhờ các bác xíu:

 

Các bác có biết làm cách nào để lấy phần thập phân của 1 số thực ko ạ?

 

Vd: lấy 254 trong số 3.254

 

 

Thank you!

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

(- real (fix real))

Ví dụ:

(- 3.254 (fix 3.254)) >> 0.254

Hay là muốn:

(atoi (vl-string-trim (strcat (itoa (fix real)) ".") (vl-princ-to-string real))) >> 254

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  

×