Tìm trong mảng là số nguyên thấp nhất và cao nhất và sắp xếp tăng dần và giảm dần (1 người xem)

Liên hệ QC

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

huonglien1901

GPE là ngôi nhà thứ 2 của tôi!!!
Tham gia
17/4/16
Bài viết
2,701
Được thích
2,434
Giới tính
Nam
Nghề nghiệp
Nhân viên kỹ thuật in ấn
Chào mọi người!

Em có vấn đề nhờ mọi người hỗ trợ!

Em muốn nhập vào 6 số nguyên bất kỳ và in ra số nguyên nhỏ nhất và số nguyên lớn nhất.

Sắp xếp mảng đó theo thứ tự tăng dần và giảm dần.

Ví dụ. Nhập vào 1 2 3 4 5 6 khi in ra
Số nhỏ nhất: 1
Số lớn nhất: 6
Mảng tăng dần 123456
Mảng giảm dần: 654321

Em cảm ơn mọi người nhiều!
 
Lần chỉnh sửa cuối:
bài này áp dụng thuật toán tìm kiếm đó bạn !
bài này có 1 ví dụ cơ bản trong việc sử dụng cờ , giống như mình đi tìm số nhà ,
tìm hết các nhà trong 1 khu phố , vừa đi vừa ghi vào sổ , cuối cùng kiếm tra trong sổ tay sẽ tìm đc số nhà lớn nhất
code minh họa sử dụng hàm cắt chuỗi Mid để cắt 1 số nguyên trong chuỗi , hàm Len để lấy chiều dài chuỗi, và hàm Range để lấy giá trị trong lưới , còn lại là cấu trúc điều khiển
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Vấn đề nào là vấn đề chính?
Nếu sắp xếp là vấn đề chính thì chỉ cần sắp xếp mảng tăng dần thôi.
Phần tử nhỏ nhất lfa phân ftuwr đứng đầu, lớn nhất là phần tử cuối
Mảng giảm dần là đọc ngược mảng tăng dần.
 
Upvote 0
Vấn đề nào là vấn đề chính?
Nếu sắp xếp là vấn đề chính thì chỉ cần sắp xếp mảng tăng dần thôi.
Phần tử nhỏ nhất lfa phân ftuwr đứng đầu, lớn nhất là phần tử cuối
Mảng giảm dần là đọc ngược mảng tăng dần.
Vấn đề chính ở đây là: Tìm số lớn nhất và nhỏ nhất là thứ 1.
Còn vấn đề sắp xếp mảng tăng dần và giảm dần cũng chính nhưng là thứ 2.
Ví dụ trên em ví dụ như vậy thôi Bác. Làm thế nào khi nhập vào 6 số nguyên bất kỳ và không biết số lớn nhất và nhỏ nhất nằm ở vị trí nào. Nhưng khi in ra biết số nào lớn nhất và nhỏ nhất.
Và mảng tăng dần và giảm dần sẽ sắp xếp lại.
 
Upvote 0
Đó là bài căn bản mà lập trình nào cũng học qua.
Thuật toán là thuật toán bắt gà. Bắt con gà đầu tiên ra tạm xem là con lớn/bé nhất. Sau đó cứ lần lượt bắt các con còn lại, so với con trên tay. Nếu nặng cân hơn thì bỏ con trên tay xuống và giữ con này.

nhatTo = mang(dauMang)
nhatBe = mang(dauMang)
For i = dauMang To cuoiMang
if nhatTo < mang(i) Then nhatTo = mang(i)
if nhatBe > mang(i) Then nhatBe = mang(i)
Next i
 
Upvote 0
Số nguyên nhưng lớn quá thì máy nào chịu xiết!
Ta giới hạn số nguyên dương & bé hơn 65535 mà thôi, cho dễ cái đã;

& đây là cách cù lần nhất có thể:

Khai báo cỡ 5 biến kiểu Long, trong đó có CucDai & CucTieu
Khai thêm 1 biên mảng 6 fần tử để lưu những số sẽ được chọn nhập

Ấn định CucTieu = 10^6
Tạo vòng lặp để lần lượt nhận 6 kết quả do người nhập nhập vô
Trong vòng lặp:
Nhắc nhỡ nếu người nhập nạp tầm bậy
Nếu số nhập> CucDai thì hoán đổi trị trong CucDai
Nếu số nhập < CucTieu thì cũng hoán đổi trị trong CucTieu

Như vậy sau vòng lặp ta có mảng chứa 6 số đã nhập, trong đó biết luôn số lớn nhất & số bé nhất (đã nhập vô)
Tiếp theo là quá trình sắp xếp: . . . . .
 
Upvote 0
Nếu thật sự chỉ có 6 số thì dùng luôn phương pháp nhét chỗ (nổi bọt) trong lúc nhập để sắp xếp.

Dim mang(1 to 6) as Long
For i = 1 to 6 ' nhập từng số và sắp xếp
mang(i) = NhapSoMoi()
For j = i to 2 step -1 ' duyệt các số đã có và nhét số mới vào đúng chỗ
If mang(j) < mang(j-1) Then ' cần đổi chỗ
tmp = mang(j)
mang(j) = mang(j-1)
mang(j-1) = tmp
Else ' đúng chỗ rồi, khong cần duyệt tiếp
Exit For
End If
Next j
Next i
' đã sắp xếp rồi thì không cần thuật toán tìm lớn nhỏ.

Lưu ý cái hàm NhapSoMoi() tách biệt thuật toán ra khỏi cách thức nhập số. Tôi đâu có biết bạn lấy số ở đâu?
 
Upvote 0
Chào mọi người!

Em có vấn đề nhờ mọi người hỗ trợ!

Em muốn nhập vào 6 số nguyên bất kỳ và in ra số nguyên nhỏ nhất và số nguyên lớn nhất.

Sắp xếp mảng đó theo thứ tự tăng dần và giảm dần.

Ví dụ. Nhập vào 1 2 3 4 5 6 khi in ra
Số nhỏ nhất: 1
Số lớn nhất: 6
Mảng tăng dần 123456
Mảng giảm dần: 654321

Em cảm ơn mọi người nhiều!
Hỏi lại: Là 6 con số nguyên hay 6 ký tự số
(vì theo ví dụ của bạn thì đó là 6 ký tự số)
 
Upvote 0
Dạ là 6 ký tự số đó Thầy!
Ký tự thì quá dễ!
Vòng lập từ 0 đến 9 (For n = 0 to 9). Kiểm tra xem n có trong chuỗi không, nếu có, lấy ra và đó là số nhỏ nhất
Nếu vòng lập từ 9 đến 0 và kiểm tra tương tự như trên, ta nhận được số lớn nhất
 
Upvote 0
Vụ sort có thể làm vầy:
Mã:
Function NCSort(ByVal NumText As String, Optional ByVal SortOrder As Boolean = True) As String
  Dim n As Long, aRes(9), sNum As String
  For n = 1 To Len(NumText)
    sNum = Mid(NumText, n, 1)
    aRes(sNum) = aRes(sNum) & sNum
  Next
  NCSort = IIf(SortOrder, Join(aRes, ""), StrReverse(Join(aRes, "")))
End Function
- Tạo 1 mảng 10 phần tử (aRes(9) )
- Duyệt từ 1 đến cuối chuỗi
- Dùng Mid lấy ra từng ký tự số. Xác định số ấy bằng bao nhiêu thì cho vào vị trí tương ứng của mảng (ví dụ dùng mid lấy ra được số 6 thì ta cho aRes(6) bằng chính số 6 đó)
- Cuối cùng Join mảng aRes lại, ta được chuỗi sắp xếp tăng dần
- Muốn có chuỗi giảm dần, ta dùng StrReverse để đảo lại
 
Upvote 0
Xin góp vui 1 cách để được các bạn góp thêm í kiến:
PHP:
Sub Nhap6ConSoVaSapXep()
 Const XC As String = "GPE.COM Xin Chào!"
 Dim Num As Integer, CucDai As Long, CucTieu As Long, J As Long, Wm As Byte, Zm As Integer, Lp As Byte
 ReDim Arr(1 To 6, 1 To 1) As Integer

 CucTieu = 10 ^ 6
 For J = 1 To 6
    Num = InputBox("Hay Nhap 1 Con Só < 65535", XC)
    If Num <> Num \ 1 Then
        MsgBox "Cút Ngay!", , XC:           Exit Sub
    Else
        If Num < CucTieu Then CucTieu = Num
        If Num > CucDai Then CucDai = Num
        Arr(J, 1) = Num
    End If
 Next J
 ReDim MTang(1 To 6, 1 To 1) As Long:       ReDim MGiam(1 To 6, 1 To 1) As Long
 Zm = 6
 For J = CucTieu To CucDai
    For Lp = 1 To UBound(Arr())
        If J = Arr(Lp, 1) Then
            Wm = Wm + 1:                    MTang(Wm, 1) = J
            MGiam(Zm, 1) = J:               Zm = Zm - 1
        End If
    Next Lp
 Next J
 [B2].Resize(6).Value = MTang():            [D2].Resize(6).Value = MGiam()
End Sub
 
Upvote 0
Thuật toán sắp xếp theo chỉ số mảng:

Nếu là chữ số không lặp lại thì:
lặp một chuỗi: a = space(10)
Xét chuỗi nhập vào, lấy giá trị của mỗi ký tự và set chuỗi trên: mid(a, val(kyTu)+1, 1) = kyTu
Loại hết dấu cách thì ta được chuỗi sắp xếp: a = replace(a, " ", "")

a = space(10)
For i = 1 To Len(chuoi)
kyTu = mid(chuoi, 1, 1)
If IsNumeric(kyTu) Then mid(a, Val(kyTu)+1, 1) = kyTu
Next i
a = Replace(a, " " , "") ' là là chuỗi đã sắp xếp

Nếu có lặp lại thì:
lập một mảng 256 phần tử: Dim a(0 to 255) As Integer
Xét chuỗi nhập vào, lấy giá trị để cộng 1 thêm vào đúng phần tử: a(asc(kyTu)) = a(asc(kyTu)) + 1
Đọc mảng a từ phần tử 48 (ký tự 0) đến 57 (ký tự 9). Cứ giá trị bao nhiêu là ta có bấy ký tự đó.

Dim x(0 To 255) As Integer
For i = 1 To Len(chuoi)
tri = asc(mid(chuoi, i, 1))
x(tri) = x(tri) + 1
Next i
a = ""
For i = 48 to 57
For j = 1 to x(i)
a = a & chr(i)
Next j
Next i
' a là chuỗi đã sắp xếp, với khả năng có ký tự lặp lại
 
Lần chỉnh sửa cuối:
Upvote 0
Thuật toán sắp xếp theo chỉ số mảng:

Nếu là chữ số không lặp lại thì:
lặp một chuỗi: a = space(10)
Xét chuỗi nhập vào, lấy giá trị của mỗi ký tự và set chuỗi trên: mid(a, val(kyTu)+1, 1) = kyTu
Loại hết dấu cách thì ta được chuỗi sắp xếp: a = replace(a, " ", "")

a = space(10)
For i = 1 To Len(chuoi)
kyTu = mid(chuoi, 1, 1)
If IsNumeric(kyTu) Then mid(a, Val(kyTu)+1, 1) = kyTu
Next i
a = Replace(a, " " , "") ' là là chuỗi đã sắp xếp

Nếu có lặp lại thì:
lập một mảng 256 phần tử: Dim a(0 to 255) As Integer
Xét chuỗi nhập vào, lấy giá trị để cộng 1 thêm vào đúng phần tử: a(asc(kyTu)) = a(asc(kyTu)) + 1
Đọc mảng a từ phần tử 48 (ký tự 0) đến 57 (ký tự 9). Cứ giá trị bao nhiêu là ta có bấy ký tự đó.

Dim x(0 To 255) As Integer
For i = 1 To Len(chuoi)
tri = asc(mid(chuoi, i, 1))
x(tri) = x(tri) + 1
Next i
a = ""
For i = 48 to 57
For j = 1 to x(i)
a = a & chr(i)
Next j
Next i
' a là chuỗi đã sắp xếp, với khả năng có ký tự lặp lại
Lúc đầu cũng định dùng cách này nhưng do ký tự số có khả năng trùng nên cách này xem ra là quá rắc rối.
 
Upvote 0
Chào mọi người!

Em có vấn đề nhờ mọi người hỗ trợ!

Em muốn nhập vào 6 số nguyên bất kỳ và in ra số nguyên nhỏ nhất và số nguyên lớn nhất.

Sắp xếp mảng đó theo thứ tự tăng dần và giảm dần.

Ví dụ. Nhập vào 1 2 3 4 5 6 khi in ra
Số nhỏ nhất: 1
Số lớn nhất: 6
Mảng tăng dần 123456
Mảng giảm dần: 654321

Em cảm ơn mọi người nhiều!
Bạn thử cách này xem.
PHP:
Function SapXep(Str As String, Optional AZ As Boolean = True) As String
Dim i As Long, So As Long
SapXep = Space(66)
For i = 1 To Len(Str)
    So = CLng(Mid(Str, i, 1))
    Mid(SapXep, So * 6 + i, 1) = So
Next
SapXep = Replace(SapXep, " ", "")
SapXep = Left(SapXep, 1) & "-" & SapXep & "-" & Right(SapXep, 1)
If Not AZ Then Mid(SapXep, 3, 6) = StrReverse(Mid(SapXep, 3, 6))
End Function
Mã:
=SapXep("101017")
=SapXep("101017",0)
 
Upvote 0
Cái cô/cậu bé này đang học lập trình.
Tôi chỉ dẫn cho biết có hai thuật toán chính để sắp xếp mảng số nguyên là cách nổi bọt cổ điển (bài #7) và cách đặt chỉ số (bài #13).
Phần thực hiện như thế nào cho nhanh cho gọn thì tuỳ theo trường hợp thực tế.
 
Upvote 0
Cái cô/cậu bé này đang học lập trình.
Tôi chỉ dẫn cho biết có hai thuật toán chính để sắp xếp mảng số nguyên là cách nổi bọt cổ điển (bài #7) và cách đặt chỉ số (bài #13).
Phần thực hiện như thế nào cho nhanh cho gọn thì tuỳ theo trường hợp thực tế.
Cách hướng dẫn chi tiết cụ thể như Anh rất phù hợp cho nhiều người muốn tìm hiểu lập trình là như em.Còn cách của Anh NDU phù hợp cho người đã nắmđược cơ bản.Cám ơn những người như các Anh,đã chia sẽ kiến thức của mình cho người khác.
Chúc các Anh vui khỏe.Thân ái
 
Upvote 0
-----------------------------------
code bị sai.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom