tranvanhung2009
Thành viên hoạt động
- Tham gia
- 1/3/11
- Bài viết
- 128
- Được thích
- 18
Thầy có thể giúp em viết 1 đoạn code về mảng tính bài toán này được không ạ. Vì em có đọc qua 1 số tài liệu về mảng thấy rất ưu việt, chỉ có điều kiến thức về ngôn ngữ lập trình không thực sự biết nhiều.
Mình không dám nói có giúp được bạn hay không, nhưng cũng thử xem. Có điều mình chưa hiểu đề bài . Vùng nào dữ liệu, vùng nào cần chạy ra kết quả chưa hiểu lắm. Vì nhìn code bạn đưa lên so với chỗ bạn gọi là "kết quả" nó không khớp nhauThầy có thể giúp em viết 1 đoạn code về mảng tính bài toán này được không ạ. Vì em có đọc qua 1 số tài liệu về mảng thấy rất ưu việt, chỉ có điều kiến thức về ngôn ngữ lập trình không thực sự biết nhiều.
Đề bài là mình có một móng cọc có dạng n hàng và m cột (trong ví dụ là n = 3 và m =3)Mình không dám nói có giúp được bạn hay không, nhưng cũng thử xem. Có điều mình chưa hiểu đề bài . Vùng nào dữ liệu, vùng nào cần chạy ra kết quả chưa hiểu lắm. Vì nhìn code bạn đưa lên so với chỗ bạn gọi là "kết quả" nó không khớp nhau
Code chả ăn nhằm gì hết bởi vì thớt không rành môn hình học lắm.Mình không dám nói có giúp được bạn hay không, nhưng cũng thử xem. Có điều mình chưa hiểu đề bài . Vùng nào dữ liệu, vùng nào cần chạy ra kết quả chưa hiểu lắm. Vì nhìn code bạn đưa lên so với chỗ bạn gọi là "kết quả" nó không khớp nhau
Sub BMatrix()
' builds a matrix NxN depicting distances between individual grid posts/pillars
Const SODNG = 3
Const SOCOT = 4
Dim a() As Variant, aSize As Long ' resultant array and its size
aSize = SODNG * SOCOT
ReDim a(0 To aSize, 0 To aSize)
' the matrix starts at 1, the row and column 0 are for grid positions
Dim i As Long, i2 As Long ' vars to traverse matrix, columnwise
Dim x As Long, y As Long ' corresponding coordinates of each element
For i = 1 To aSize
x = XCoord(i, SOCOT)
y = YCoord(i, SOCOT)
a(0, i) = CStr(x) & " " & CStr(y) ' the title (grid coordinates)
a(i, 0) = a(0, i)
a(i, i) = 0
For i2 = i - 1 To 1 Step -1 ' go backward from the diagonal
a(i, i2) = Sqr((x - XCoord(i2, SOCOT)) ^ 2 + (y - YCoord(i2, SOCOT)) ^ 2)
a(i2, i) = a(i, i2) ' the matrix is symmetrical
Next i2
x0 = x
y0 = y
Next i
Range("a1").Resize(aSize + 1, aSize + 1).Value = a
End Sub
Function XCoord(ByVal pos As Long, ByVal mxCol As Long)
' returns the row number of corresponding grid point
XCoord = ((pos - 1) \ mxCol) + 1
End Function
Function YCoord(ByVal pos As Long, ByVal mxCol As Long)
' returns the column number of corresponding grid point
YCoord = ((pos - 1) Mod mxCol) + 1
End Function
[/coce]
Em cám ơn Thầy nhiều, như này cũng đã đủ để người nông dân không phải đi cày rồi thầy ạ.Code đủ xài. Lưu ý đây là giải thuật lười biếng:
1. con toán tính chiều x, y (tôi nghĩ) có thể tính theo cách luỹ kế, hiệu quả hơn. Nhưng tôi chưa tìm ra quy luật.
2. nhiều trị số bị được tính lặp lại. Nhìn hình thì thấy rõ có thể dùng phép áp dịch theo đường chéo nào đó để biết phần tử nào tương đường phần tử nào. Nhưng tôi lười tính quy luật. Phép áp hiển nhiên nhất là dùng đường chéo chính thì tôi đã làm rồi.
(chịu khó đọc comments tiếng Anh. Bài này phức tạp, tôi vừa code vừa chú nên bắt buộc không thể dùng tiếng Việt)
Mã:Sub BMatrix() ' builds a matrix NxN depicting distances between individual grid posts/pillars Const SODNG = 3 Const SOCOT = 4 Dim a() As Variant, aSize As Long ' resultant array and its size aSize = SODNG * SOCOT ReDim a(0 To aSize, 0 To aSize) ' the matrix starts at 1, the row and column 0 are for grid positions Dim i As Long, i2 As Long ' vars to traverse matrix, columnwise Dim x As Long, y As Long ' corresponding coordinates of each element For i = 1 To aSize x = XCoord(i, SOCOT) y = YCoord(i, SOCOT) a(0, i) = CStr(x) & " " & CStr(y) ' the title (grid coordinates) a(i, 0) = a(0, i) a(i, i) = 0 For i2 = i - 1 To 1 Step -1 ' go backward from the diagonal a(i, i2) = Sqr((x - XCoord(i2, SOCOT)) ^ 2 + (y - YCoord(i2, SOCOT)) ^ 2) a(i2, i) = a(i, i2) ' the matrix is symmetrical Next i2 x0 = x y0 = y Next i Range("a1").Resize(aSize + 1, aSize + 1).Value = a End Sub Function XCoord(ByVal pos As Long, ByVal mxCol As Long) ' returns the row number of corresponding grid point XCoord = ((pos - 1) \ mxCol) + 1 End Function Function YCoord(ByVal pos As Long, ByVal mxCol As Long) ' returns the column number of corresponding grid point YCoord = ((pos - 1) Mod mxCol) + 1 End Function [/coce]
Thắc mắc: người nông dân không phải đi cày thì làm gì bi giờ?Em cám ơn Thầy nhiều, như này cũng đã đủ để người nông dân không phải đi cày rồi thầy ạ.
Không biết cám ơn thầy thế nào cho đủ, em chúc Thầy sức khỏe!
Thì do "nâng cao năng suất" nên làm 1 giờ bằng trước kia làm 8 giờ, đủ sở hụi, nên 7 giờ "nhàn nhã". Chứ làm thêm giờ thứ 2 trở về sau xã hội hay ai đó được lợi chứ cá nhân chả được gì.Thắc mắc: người nông dân không phải đi cày thì làm gì bi giờ?
Nào giờ tôi cứ ngỡ công nghệ cốt nâng cao năng suất, giúp người ta ổn định đời sống. Té ra mục đích của công nghệ là giảm công việc, giúp người ta có nhiều thì giờ nhàn nhã sao?
Chính thức câu hỏi của tôi nằm chỗ đó:Thì do "nâng cao năng suất" nên làm 1 giờ bằng trước kia làm 8 giờ, đủ sở hụi, nên 7 giờ "nhàn nhã". Chứ làm thêm giờ thứ 2 trở về sau xã hội hay ai đó được lợi chứ cá nhân chả được gì.
Thật ra chủ đề tài phát biểu không phải là do suy nghĩ tiêu cực như tôi nói, có lẽ chỉ là mừng quá do công việc được giảm tải mà thôi. Có điều cách dùng chữ (nông dân không phải đi cày) là không hay lắm. Nên dùng "nông dân đi cày đỡ nhọc"Chính thức câu hỏi của tôi nằm chỗ đó:
Thắc mắc: người nông dân không phải đi cày thì làm gì bi giờ?
Nào giờ tôi cứ ngỡ công nghệ cốt nâng cao năng suất, giúp người ta ổn định đời sống. Té ra mục đích của công nghệ là giảm công việc, giúp người ta có nhiều thì giờ nhàn nhã sao?
Thử cách khácXin chào các anh chị trong nhóm!
Mình cần sự giúp đỡ của mọi người tạo 1 code để tính khoảng cách các vị trí trong 1 đài cọc.
Ở trong file excell mình đính kèm có kết quả tính và sơ đồ tính.
Mong được mọi người giúp đỡ!
Sub XYZ()
Dim Arr(), N&, i&, j&, k&, q&
Const sRow = 3 'So Dong
Const sCol = 4 'So Cot
N = sRow * sCol 'So coc
ReDim Arr(0 To N, 0 To N + 2)
For i = 1 To sRow
For j = 1 To sCol
k = k + 1 'Thu tu dong và cot
Arr(k, 0) = i & " " & j 'Tieu de dong la Vi tri Coc
Arr(0, k) = Arr(k, 0) 'Tieu de cot la Vi tri Coc
Arr(k, N + 1) = i 'Vitri Coc theo dong
Arr(k, N + 2) = j 'Vitri Coc theo cot
Arr(k, k) = 0 ' Duong cheo
For q = 1 To k - 1
Arr(q, k) = Sqr((Arr(q, N + 1) - i) ^ 2 + (Arr(q, N + 2) - j) ^ 2)
Arr(k, q) = Arr(q, k)
Next q
Next j
Next i
Range("A2").CurrentRegion.ClearContents
Range("A1").Resize(N + 1, N + 1).Value = Arr
End Sub
Function MangKhoangCachCoc(iSoHang As Long, iSoCot As Long, iKhoangCachDonVi As Double)
Dim x&, y&, xy&
xy = iSoHang * iSoCot
ReDim aX(1 To xy) 'Mang aX chua toa do Cot cua coc
ReDim aY(1 To xy) 'Mang aY chua toa do Hang cua coc
ReDim aXY(0 To xy, 0 To xy) ' Mang aXY chua khoang cach giua cac coc
'Gan toa do coc
xy = 0
For y = 1 To iSoHang
For x = 1 To iSoCot
xy = xy + 1
aX(xy) = x
aY(xy) = y
Next x
Next y
'Tinh khoang cach cac coc
For x = 1 To xy
aXY(x, 0) = "C_" & aY(x) & "_" & aX(x) 'Gan vi tri Coc
aXY(0, x) = aXY(x, 0) 'Gan vi tri Coc
aXY(x, x) = 0 'Duong cheo = 0
For y = x + 1 To xy
aXY(x, y) = Sqr((aX(x) - aX(y)) ^ 2 + (aY(x) - aY(y)) ^ 2) * iKhoangCachDonVi
aXY(y, x) = aXY(x, y)
Next y
Next x
MangKhoangCachCoc = aXY
End Function
Sub Test()
Dim aXY
aXY = MangKhoangCachCoc(4, 4, 1.5)
Sheet1.Range("A2").CurrentRegion.ClearContents
Sheet1.Range("A1").Resize(UBound(aXY, 1) + 1, UBound(aXY, 2) + 1) = aXY
End Sub
Bài nầy dể nhất là dùng công thức dựa trên các hàm ExcelXin chào các anh chị trong nhóm!
Mình cần sự giúp đỡ của mọi người tạo 1 code để tính khoảng cách các vị trí trong 1 đài cọc.
Ở trong file excell mình đính kèm có kết quả tính và sơ đồ tính.
Mong được mọi người giúp đỡ!
Function MangKhoangCachCoc2(iSoHang As Long, iSoCot As Long, iKhoangCachDonVi As Double)
Dim x&, y&, xy&
xy = iSoHang * iSoCot
ReDim aX(1 To xy)
ReDim aY(1 To xy)
ReDim aXY1(0 To iSoHang - 1, 0 To iSoCot - 1)
ReDim aXY2(0 To xy, 0 To xy)
xy = 0
For y = 1 To iSoHang
For x = 1 To iSoCot
xy = xy + 1
aX(xy) = x 'Gan toa do X
aY(xy) = y 'Gan toa do Y
aXY1(y - 1, x - 1) = Sqr((y - 1) ^ 2 + (x - 1) ^ 2) * iKhoangCachDonVi 'Gan khoang cach
Next x
Next y
For x = 1 To xy
aXY2(x, 0) = "C_" & aY(x) & "_" & aX(x) 'Gan vi tri Coc
aXY2(0, x) = aXY2(x, 0) 'Gan vi tri Coc
For y = 1 To xy
aXY2(x, y) = aXY1(Abs(aY(x) - aY(y)), Abs(aX(x) - aX(y))) 'Gan khoang cach
Next y
Next x
MangKhoangCachCoc2 = aXY2
End Function
Dùng mảng chứa kết quả đã tính rồi để dò cho lần sau là giải thuật căn bản, gọi là phép áp m --> n với n nhỏ hơn m.Mình viết lại như vậy để giảm số lần thực hiện hàm Sqr, khi số Hàng và Cột lớn thì sẽ thấy sự khác biệt.
...
Thử cách khác
Mã:Sub XYZ() Dim Arr(), N&, i&, j&, k&, q& Const sRow = 3 'So Dong Const sCol = 4 'So Cot N = sRow * sCol 'So coc ReDim Arr(0 To N, 0 To N + 2) For i = 1 To sRow For j = 1 To sCol k = k + 1 'Thu tu dong và cot Arr(k, 0) = i & " " & j 'Tieu de dong la Vi tri Coc Arr(0, k) = Arr(k, 0) 'Tieu de cot la Vi tri Coc Arr(k, N + 1) = i 'Vitri Coc theo dong Arr(k, N + 2) = j 'Vitri Coc theo cot Arr(k, k) = 0 ' Duong cheo For q = 1 To k - 1 Arr(q, k) = Sqr((Arr(q, N + 1) - i) ^ 2 + (Arr(q, N + 2) - j) ^ 2) Arr(k, q) = Arr(q, k) Next q Next j Next i Range("A2").CurrentRegion.ClearContents Range("A1").Resize(N + 1, N + 1).Value = Arr End Sub