Đổi mảng thành mảng? (1 người xem)

Người dùng đang xem chủ đề này

emgaingayngo

Thành viên hoạt động
Tham gia
9/2/07
Bài viết
141
Được thích
5
Chào các anh chị trên GPE!
Có một bài toán như sau :
Từ mảng 1 chiều Arr(123, 456, 789), bây giờ mình muốn tạo ra mảng một chiều khác cũng có đọ dài như vậy nhưng các giá trị lấy theo các vị trí tương ứng với các giá trị ở mảng đầu_newArr(147,258,369).
Điều kiện của bài toán là độ dài của mảng luôn bằng số ký tự trong một phần tử của mảng.
Mong các anh chị chỉ giúp. Cảm ơn.
 
Chào các anh chị trên GPE!
Có một bài toán như sau :
Từ mảng 1 chiều Arr(123, 456, 789), bây giờ mình muốn tạo ra mảng một chiều khác cũng có đọ dài như vậy nhưng các giá trị lấy theo các vị trí tương ứng với các giá trị ở mảng đầu_newArr(147,258,369).
Điều kiện của bài toán là độ dài của mảng luôn bằng số ký tự trong một phần tử của mảng.
Mong các anh chị chỉ giúp. Cảm ơn.
Nếu các phần tử của mảng Arr có độ dài bằng nhau thì dùng thử code này xem sao
PHP:
Public Sub NewArr()
Dim Arr(1 To 3), NewArr(), i As Long, k As Long
Arr(1) = 123
Arr(2) = 456
Arr(3) = 789
ReDim NewArr(1 To Len(Arr(1)))
For i = 1 To UBound(NewArr)
For k = 1 To UBound(Arr)
NewArr(i) = NewArr(i) & Mid(Arr(k), i, 1)
Next k
Next i
Sheet1.Range("A1").Resize(1, UBound(NewArr)).Value = NewArr
End Sub
 
Upvote 0
Nếu không có độ dài bằng nhau thì code này cần thay đổi nhiều:

1. Hoặc là tính từ phần tử cuối đến đầu, và đọc ngược số đầu vào từ phải sang trái

2. Hoặc là tìm số lớn nhất rồi chèn thêm khoảng trống cho các số kia

tb. Đây là bài toán số. Lợi dụng con toán chuỗi để tách từng ký tự tuy trông gọn nhưng không phải là hiệu quả.
 
Upvote 0
Chưa hiểu hết ý đồ của chủ topic nhưng mình xem trông giống như việc thao tác với ma trận.
 
Upvote 0
Sai rồi, bài này chỉ là mảng 1 chiều, không phải ma trận.
Vâng, chắc chắn là mảng 1 chiều rồi, nhưng nhìn vào số liệu
1 2 3
4 5 6
7 8 9
có ma trận chuyển vị là
1 4 7
2 5 8
3 6 9
thêm điều kiện độ dài của mảng luôn bằng số ký tự lại cho càng tưởng tượng về ma trận vuông.
Do vậy có khi hiểu rõ nhu cầu thực chất của chủ topic có khi giải quyết vấn đề đơn giản hơn chăng, mà không phải làm lại nhiều lần ^^.
 
Upvote 0
Nếu không có độ dài bằng nhau thì code này cần thay đổi nhiều:
1. Hoặc là tính từ phần tử cuối đến đầu, và đọc ngược số đầu vào từ phải sang trái
2. Hoặc là tìm số lớn nhất rồi chèn thêm khoảng trống cho các số kia
Hai ý trên thì hiểu

tb. Đây là bài toán số. Lợi dụng con toán chuỗi để tách từng ký tự tuy trông gọn nhưng không phải là hiệu quả.
Còn ý này chắc nhờ bạn cho một ví dụ để làm rõ hơn+-+-+-+
 
Upvote 0
Nghĩ cũng thương cho mấy anh em nghiện ngập. Người ta quăng lên 1 câu lưng chừng rồi đi ngủ ngon lành, trong khi đó thì các con nghiện lại xoay quanh nàng tiên nâu.
 
Upvote 0
Vâng, chắc chắn là mảng 1 chiều rồi, nhưng nhìn vào số liệu
1 2 3
4 5 6
7 8 9
có ma trận chuyển vị là
1 4 7
2 5 8
3 6 9
thêm điều kiện độ dài của mảng luôn bằng số ký tự lại cho càng tưởng tượng về ma trận vuông.
Do vậy có khi hiểu rõ nhu cầu thực chất của chủ topic có khi giải quyết vấn đề đơn giản hơn chăng, mà không phải làm lại nhiều lần ^^.

Đầu vào Array( 1234, 4567, 7890 ) ==> Đầu ra Array( 147, 258, 369, 470 )
Chắc chắn không thể diễn ra từ ma trận vuông

Hai ý trên thì hiểu

Còn ý này chắc nhờ bạn cho một ví dụ để làm rõ hơn+-+-+-+

Mã:
[COLOR=#008000]' bài toán tách mảng[/COLOR]
Function BaiToanDom(ByVal a As Variant) As Variant
Dim i As Integer, j As Integer[COLOR=#008000] ' chỉ số đếm mảng đầu vào và đầu ra[/COLOR]
Dim aub As Integer, alb As Integer [COLOR=#008000]' chận trên và chận dưới của mảng đầu vào[/COLOR]
Dim mx As Integer [COLOR=#008000]' trị lớn nhất trong mảng đầu vào[/COLOR]
Dim a2() As Integer [COLOR=#008000]' mảng đầu ra[/COLOR]
aub = UBound(a)
alb = LBound(a)
mx = a(alb)
For i = alb + 1 To aub
    If mx < a(i) Then mx = a(i)
Next i
mx = Len(CStr(mx)) [COLOR=#008000]' dộ lớn của trị trong mảng đầu vào[/COLOR]
ReDim a2(0 To mx - 1)
For j = mx - 1 To 0 Step -1
  For i = alb To aub[COLOR=#008000] ' tách chữ số cuối cùng (hàng đơn vị trong phần tử đầu vào[/COLOR]
    a2(j) = a2(j) * 10 + (a(i) Mod 10)[COLOR=#008000] ' và đôn vào hàng đơn vị cho phần tử chuỗi đầu ra[/COLOR]
    a(i) = a(i) \ 10 [COLOR=#008000]' hàng đơn vị kế tiếp của chuỗi đầu vào[/COLOR]
  Next i
Next j
BaiToanDom = a2
End Function

Code để thử:
Mã:
Sub t()
Dim s, e
s = ""
For Each e In BaiToanDom(Array(1234, 4567, 789))
s = s & ", " & e
Next e
MsgBox Mid(s, 3, Len(s)) [COLOR=#008000]' kết quả là (140, 257, 368, 479)[/COLOR]
[COLOR=#008000]' trị đầu tiên là 140 (thêm chữ số 0) bởi vì phần tử đầu vào thứ 3 kém hơn các phần tử khác 1 hàng đơn vị
[/COLOR]End Sub

@quanghai1969: tôi biết chủ thớt chỉ cốt hỏi lấy bài tập thôi. Cho nên hầu hết các truờng hợp tôi chỉ cốt trả lời chỉ dẫn cách làm thay vì làm giùm từ a đến z. Ở đây, có người khác thắc mắc muốn thấy ví dụ. Code của tôi chỉ dùng chứng minh đây là bài toán số.
 
Lần chỉnh sửa cuối:
Upvote 0
Đầu vào Array( 1234, 4567, 7890 ) ==> Đầu ra Array( 147, 258, 369, 470 )
Chắc chắn không thể diễn ra từ ma trận vuông
emgaingayngo đã viết:
Điều kiện của bài toán là độ dài của mảng luôn bằng số ký tự trong một phần tử của mảng
Do vậy đâu có Array(1234,4567,7890) vì mảng 3 phần tử, còn độ dài mỗi phần tử là 4 (ở đây có lẽ "độ dài của mảng" tác giả đề cập đến số phần tử trong mảng)
như vậy với điều kiện của tác giả thì phải là mảng Array(123,456,789).
Nhìn chung thì có nhiều phương án để giải quyết bài toán này, nhưng tốt hơn là chờ "em gái ngây ngô" kia, hehe...
 
Upvote 0
Nghĩ cũng thương cho mấy anh em nghiện ngập. Người ta quăng lên 1 câu lưng chừng rồi đi ngủ ngon lành, trong khi đó thì các con nghiện lại xoay quanh nàng tiên nâu.

Dạ em đây mà anh , sao ngủ được, sáng giờ chưa lên mạng được thôi.

Vâng, chắc chắn là mảng 1 chiều rồi, nhưng nhìn vào số liệu
1 2 3
4 5 6
7 8 9
có ma trận chuyển vị là
1 4 7
2 5 8
3 6 9
thêm điều kiện độ dài của mảng luôn bằng số ký tự lại cho càng tưởng tượng về ma trận vuông.
Do vậy có khi hiểu rõ nhu cầu thực chất của chủ topic có khi giải quyết vấn đề đơn giản hơn chăng, mà không phải làm lại nhiều lần ^^.

Em không hiểu chổ màu đỏ.

Do vậy đâu có Array(1234,4567,7890) vì mảng 3 phần tử, còn độ dài mỗi phần tử là 4 (ở đây có lẽ "độ dài của mảng" tác giả đề cập đến số phần tử trong mảng)
như vậy với điều kiện của tác giả thì phải là mảng Array(123,456,789).
Nhìn chung thì có nhiều phương án để giải quyết bài toán này, nhưng tốt hơn là chờ "em gái ngây ngô" kia, hehe...

Anh hiểu đúng ý em, nhu cầu hiện tại em chỉ dùng mảng mới có số phần tử bằng với số lượng ký tự có trong mỗi phần tử.

@ndu: Sao anh lại trách em???
 
Upvote 0
Nếu số phần tử ít thì dùng công thức cũng được.
 

File đính kèm

Upvote 0
Mình nói rồi mà quý vị không tin. Emgaingayngo ló ra nói vài câu vu vơ rồi lại tiếp tục lên... giường nữa rồi đó.
 
Upvote 0
Vậy để hiểu chỗ màu đỏ thì bạn nên xem các bài tại #2#9 đã đáp ứng nhu cầu bạn chưa?

Bài #2 và #9 đã đúng với nhu cầu của em. Em không thắc mắc về giải thuật, chỉ thắc mắc về nhiều lần thôi. Chẳng lẽ không dùng For...next vẫn ra được cái mảng đó trong trường hợp tổng quát.

quanghai1969 đã viết:
Mình nói rồi mà quý vị không tin. Emgaingayngo ló ra nói vài câu vu vơ rồi lại tiếp tục lên... giường nữa rồi đó.

Haizzz! Ló ra... rồi lại lên giường...-\\/.
 
Upvote 0
Bài #2 và #9 đã đúng với nhu cầu của em.
"nhiều lần" là tôi lo xa ấy mà, lo em gái ngây ngô đã "thỏa mãn" nhưng lại chưa muốn dừng lại, trên gpe rất nhiều anh sẵn lòng làm lại nhiều lần, nhưng vốn liếng cũng hạn chế nên cũng có giới hạn, ^ ^
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom