Đến nội dung


Hình ảnh
- - - - -

Thay thế phần tử thứ i của một list


  • Please log in to reply
10 replies to this topic

#1 concocnho

concocnho

    Chưa sử dụng CAD

  • Members
  • Pip
  • 4 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 09 February 2009 - 04:33 PM

Tôi muốn thay thế phần tử thứ 10 của list này thành (1000. “2”) thì làm thế nào nhỉ?
((1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")
(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")
(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")
(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")
)
  • 0

#2 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 09 February 2009 - 04:56 PM

Tôi muốn thay thế phần tử thứ 10 của list này thành (1000. “2”) thì làm thế nào nhỉ?
((1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")
(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")
(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")
(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")
)

- Cách 1: (subst (1000 . "2") (nth 9 "list bạn có") "list bạn có"). Cái này đúng với list được lấy ra bởi hàm entget . Cái list toàn (1000 . "1") tôi không biết bạn lấy đâu ra.
- Cách 2: cách này thì lại chỉ áp dụng đối với list của bạn.
_________(setq dem 0
______________Lst '()
__________)
_________(foreach e "list ban co"
___________(setq dem (1+ dem))
___________(if (/= dem 10)
______________(setq lst (append Lst '(1000 . "1")))
______________(setq lst (append Lst '(1000 . "2")))
___________)
_________)
  • 0

#3 concocnho

concocnho

    Chưa sử dụng CAD

  • Members
  • Pip
  • 4 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 09 February 2009 - 10:41 PM

list này đúng là được lấy ra bởi hàm entget
Sao mình làm theo cách 1 mà kết quả là tất cả các (1000 . "1") đều đổi thành (1000 . "2"). Mình chỉ muốn vị trí thứ 10 đổi thôi.
Cách 2 thì không được rồi. Vì list toàn (1000 . "1") chỉ là ví dụ thôi. chứ thực ra nó có nhiều cái khác.
  • 0

#4 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 09 February 2009 - 10:57 PM

list này đúng là được lấy ra bởi hàm entget
Sao mình làm theo cách 1 mà kết quả là tất cả các (1000 . "1") đều đổi thành (1000 . "2"). Mình chỉ muốn vị trí thứ 10 đổi thôi.
Cách 2 thì không được rồi. Vì list toàn (1000 . "1") chỉ là ví dụ thôi. chứ thực ra nó có nhiều cái khác.

Mình biết ngay mà. Bạn ví dụ 1 cái không có trong thực tế. Bởi chỉ số trước "1000" khi lấy ra bởi hàm entget chỉ có 1 mà thôi chứ không thể có đến 1 list gồm tới 6x4 phần tử. Bạn muốn có được câu trả lời đúng với ý bạn thì bạn phải cho người trả lời biết được câu hỏi đó nằm trong tình huống thực tế nào. Giải thích một điều mà sau đó bạn lại bảo thực tế "chỉ là ví dụ thôi. chứ thực ra nó có nhiều cái khác" thì mất thời gian cho người trả lời lắm. Bạn cho một ví dụ thực tế bạn làm đi. Hoặc có thể bạn lấy được list trên từ rất nhiều đối tượng bởi hàm mapcar thì bạn cũng phải nói rõ để người trả lời có hướng suy nghĩ đúng. Bạn đồng ý với mình không?
  • 0

#5 concocnho

concocnho

    Chưa sử dụng CAD

  • Members
  • Pip
  • 4 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 10 February 2009 - 07:24 AM

Mình lấy ví dụ cho dễ hình dung thôi chứ nó không khác gì so với thực tế đâu. Nó đây:
((1070 . -2000) (1070 . 1) (1070 . 2000) (1070 . 9) (1040 .
68.5891) (1040 . 0.0) (1000 . "TC2") (1040 . 0.0) (1040 . 0.0) (1040 .
9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .
9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .
9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .
9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .
9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .
468.906) (1040 . -30.0) (1070 . 0) (1000 . "0") (1040 . 468.906) (1040 . 0.0)
(1070 . 0) (1000 . "0") (1040 . 468.906) (1040 . 30.0) (1070 . 0) (1000 . "0"))
Đây là xdata của một cọc trên tuyến trong Nova TDN (phần mềm thiết kế đường).
Mình muốn đổi cao độ tự nhiên của nó (1040 . 0.0) (phần tử thứ 8) thành 1 số khác.
  • 0

#6 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 10 February 2009 - 07:29 AM

Mình biết ngay mà. Bạn ví dụ 1 cái không có trong thực tế. Bởi chỉ số trước "1000" khi lấy ra bởi hàm entget chỉ có 1 mà thôi chứ không thể có đến 1 list gồm tới 6x4 phần tử. Bạn muốn có được câu trả lời đúng với ý bạn thì bạn phải cho người trả lời biết được câu hỏi đó nằm trong tình huống thực tế nào. Giải thích một điều mà sau đó bạn lại bảo thực tế "chỉ là ví dụ thôi. chứ thực ra nó có nhiều cái khác" thì mất thời gian cho người trả lời lắm. Bạn cho một ví dụ thực tế bạn làm đi. Hoặc có thể bạn lấy được list trên từ rất nhiều đối tượng bởi hàm mapcar thì bạn cũng phải nói rõ để người trả lời có hướng suy nghĩ đúng. Bạn đồng ý với mình không?



Ông bạn Nataca này sai rồi. Đó là một yêu cầu cực kỳ rõ ràng. Dù cho có thực tế hay không thì số liệu đó cũng đầy đủ và trong sáng.

Cách đơn giản là copy sang một list mới từ phần tử thứ 1 (trong PC thì phần tử thứ nhất có index = 0) đến phần tử thứ i-1, thay phần tử thứ i bằng phần tử cần thay thế, copy các phần tử còn lại.
  • 0

#7 concocnho

concocnho

    Chưa sử dụng CAD

  • Members
  • Pip
  • 4 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 10 February 2009 - 08:44 AM

Đây rồi, đây rồi. Mừng quá :cheers: :cheers:
;; ----- nth-replace utility function
;;
;; Replace the II position in dList with the new value.
;;
(defun nth-replace (New II dList)
(cond
((null dList) nil)
((zerop II) (cons New (cdr dList)))
(T (cons (car dList)
(nth-replace New (1- II) (cdr dList))))))
;;
;; ----- nth-remove utility function
;;
;; Remove the II element in a data list.
;;
(defun nth-remove (II dList)
(cond
((null dList) nil)
((zerop II) (cdr dList))
(T (cons (car dList)
(nth-remove (1- II) (cdr dList))))))
;;
;; keep on programmin'
;;
  • 0

#8 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 10 February 2009 - 08:52 AM

Mình lấy ví dụ cho dễ hình dung thôi chứ nó không khác gì so với thực tế đâu. Nó đây:
((1070 . -2000) (1070 . 1) (1070 . 2000) (1070 . 9) (1040 .
68.5891) (1040 . 0.0) (1000 . "TC2") (1040 . 0.0) (1040 . 0.0) (1040 .
9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .
9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .
9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .
9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .
9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .
468.906) (1040 . -30.0) (1070 . 0) (1000 . "0") (1040 . 468.906) (1040 . 0.0)
(1070 . 0) (1000 . "0") (1040 . 468.906) (1040 . 30.0) (1070 . 0) (1000 . "0"))
Đây là xdata của một cọc trên tuyến trong Nova TDN (phần mềm thiết kế đường).
Mình muốn đổi cao độ tự nhiên của nó (1040 . 0.0) (phần tử thứ 8) thành 1 số khác.

Cái này đúng là mình không để ý thật :cheers: . Dùng Nova lâu ngày mà ít quan tâm đến nó. Bạn cũng thiết kế đường à. Có j cùng trao đổi trong box Giao Thông nữa nhé. :cheers:
  • 0

#9 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 10 February 2009 - 08:59 AM

Ông bạn Nataca này sai rồi. Đó là một yêu cầu cực kỳ rõ ràng. Dù cho có thực tế hay không thì số liệu đó cũng đầy đủ và trong sáng.

Cách đơn giản là copy sang một list mới từ phần tử thứ 1 (trong PC thì phần tử thứ nhất có index = 0) đến phần tử thứ i-1, thay phần tử thứ i bằng phần tử cần thay thế, copy các phần tử còn lại.

Mình đồng ý với bạn đây là một yêu cầu rõ ràng và dữ liệu đầu vào đầy đủ. Nhưng một bài toán có nhiều cách giải quyết. Cách của bạn cũng là tư duy lập trình của lập trình viên nói chung. Mình chỉ muốn nói rằng nếu bạn concocnho đưa ra cho mình dữ liệu xdata ngay từ đầu thì mình hiểu ngay ý nghĩa thực tế của bài toán là thay đổi cao độ tự nhiên của một cọc. Lúc đấy sẽ chọn cách giải quyết tối ưu cho trường hợp này. Còn vấn đề bạn nói "dù có thực tế hay không" thì trên quan điểm một người kỹ sư mình thích giải quyết bài toán thực tế hơn :cheers: . ok nhé.
  • 0

#10 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 10 February 2009 - 09:09 AM

Mình đồng ý với bạn đây là một yêu cầu rõ ràng và dữ liệu đầu vào đầy đủ. Nhưng một bài toán có nhiều cách giải quyết. Cách của bạn cũng là tư duy lập trình của lập trình viên nói chung. Mình chỉ muốn nói rằng nếu bạn concocnho đưa ra cho mình dữ liệu xdata ngay từ đầu thì mình hiểu ngay ý nghĩa thực tế của bài toán là thay đổi cao độ tự nhiên của một cọc. Lúc đấy sẽ chọn cách giải quyết tối ưu cho trường hợp này. Còn vấn đề bạn nói "dù có thực tế hay không" thì trên quan điểm một người kỹ sư mình thích giải quyết bài toán thực tế hơn :cheers: . ok nhé.


Tùy theo cách nghĩ của từng người, còn với mình nếu chưa giải quyết được thì đừng làm tối ưu.
  • 0

#11 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 10 February 2009 - 09:25 AM

Mình sửa cái này một chút như đúng với yêu cầu của bạn nhé:

- Cách 2: cách này thì lại chỉ áp dụng đối với list của bạn.
_________(setq dem 0
______________Lst '()
__________)
_________(foreach e "list ban co"
___________(setq dem (1+ dem))
___________(if (/= dem 10)
______________(setq lst (append Lst (nth (1- dem) "list ban co")))
____________(setq lst (append Lst '(1000 . "2")))

___________)
_________)

phần tử (1000 . 2) chính là phần tử mà bạn cần đưa vào, bạn có thể thay tùy thích. Xin lỗi vì không hiểu ý bạn ngay từ đầu :cheers:
  • 0