• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Đổi cơ số..

Góc trao đổi, hỏi đáp của ngôn ngữ Visual Basic 6 và Visual Basic Script

Điều hành viên: tungblt

kaka02
Thành viên chính thức
Thành viên chính thức
Bài viết: 13
Ngày tham gia: T.Hai 28/02/2011 10:35 am

Đổi cơ số..

Gửi bàigửi bởi kaka02 » T.Hai 28/02/2011 12:03 pm

Mã: Chọn hết

Private Sub cmdDoi_Click()
Dim i%, m%, n%, k%
i = 0
Dim mang() As Double
    n = Val(txtNhap)
    If optNhiphan.Value = True Then
        k = 2
    End If
    If optHexa.Value = True Then
        k = 16
    End If
    If optThapphan.Value = True Then
        k = 10
    End If
    Do While n > 0
        mang(i) = n Mod k
        n = n / k
        i = i + 1
    Loop
    m = i - 1
    For i = m To i >= 0 Step -1
        If mang(i) < 10 Then
            txtKq.Text = mang(i)
        Else
            Select Case mang(i)
                Case 10
                txtKq.Text = "A"
                Case 11
                txtKq.Text = "B"
                Case 12
                txtKq.Text = "C"
                Case 13
                txtKq.Text = "D"
                Case 14
                txtKq.Text = "E"
                Case 15
                txtKq.Text = "F"
            End Select
    Next
End Sub

Mình đang viết tạm như thế này theo thuật toán cổ điển,nhưng mà không được,ai giúp mình giải bài này với.Thanks



Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4758
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 510 time

Re: Đổi cơ số..

Gửi bàigửi bởi truongphu » T.Hai 28/02/2011 4:09 pm

Bạn vào Box thủ thuật
hay vào VBLib online ở trên
nhiều bài viết về chuyển qua lại các cơ số
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

kaka02
Thành viên chính thức
Thành viên chính thức
Bài viết: 13
Ngày tham gia: T.Hai 28/02/2011 10:35 am

Re: Đổi cơ số..

Gửi bàigửi bởi kaka02 » T.Năm 03/03/2011 12:39 am

Sau khi nghiên cứu ở VBLib mình viết đoạn code giống như thế này:

Mã: Chọn hết

Private Sub cmdDoi_Click()
Dim i%, m%, n%, k%
i = 0
Dim mang(32) As Byte, kq() As Byte
    n = Val(txtNhap)
    k = Val(txtHs)
    Do While (n <> 0)
        mang(i) = n Mod k
        n = n / k
        i = i + 1
    Loop
    m = i
    For i = m - 1 To 0 Step -1
        If mang(i) < 10 Then
            kq(i) = mang(i) + 48
        Else
            kq(i) = mang(i) + 55
        End If
    Next i
    txtKq.Text = kq(i)
    End Sub

Nhưng mục đích của mình là lấy kết quả đó ra 1 textBox nhưng bị báo lỗi Runtime error 9,Subscrip out of range,bạn có thể giải thích lỗi của mình được không?mình thiết kế giao diện có 3 textBox như trong code đó...Thanks

Hình đại diện của người dùng
alexanderdna
Guru
Guru
Bài viết: 214
Ngày tham gia: T.Ba 14/07/2009 11:13 am
Đến từ: Sài Gòn
Has thanked: 3 time
Been thanked: 15 time

Re: Đổi cơ số..

Gửi bàigửi bởi alexanderdna » T.Năm 03/03/2011 9:49 am

Subscript out of range là lỗi nảy sinh khi số chỉ mục vượt quá phạm vi của mảng.
Ở đây, mảng kq được khai báo nhưng chưa khởi tạo nên theo mặc định nó là mảng rỗng.
Vậy làm sao có cái gọi là kq(i) được?

Thế nên, việc sửa lỗi trước hết là:
  1. '...
  2. m = i
  3. ReDim kq(m - 1) As Byte 'Thêm dòng này
  4. '...


Còn dòng cuối, sao lại cho kết quả là kq(i)? Ngộ!
Sửa lại như sau:
  1. For i = 0 To m - 1
  2.     txtKq.Text = Chr$(kq(i)) & txtKq.Text
  3. Next i


Nhưng cũng chưa xong chuyện. [-(
Toán tử / là chia số thực. Với n / k, giả dụ n = 11, k = 2, thì ra 5.5, làm tròn thành 6. Sai kết quả!
Phải dùng toán tử chia số nguyên \.


---
EDIT: ghi thêm As Byte sau ReDim kq(m - 1)
Sửa lần cuối bởi alexanderdna vào ngày T.Năm 03/03/2011 10:06 am với 1 lần sửa.

Hình đại diện của người dùng
gtdcomputer
Thành viên danh dự
Thành viên danh dự
Bài viết: 1296
Ngày tham gia: T.Sáu 18/07/2008 12:08 pm
Đến từ: Kiên Giang
Has thanked: 8 time
Been thanked: 117 time
Liên hệ:

Re: Đổi cơ số..

Gửi bàigửi bởi gtdcomputer » T.Năm 03/03/2011 9:58 am

Bạn chưa Redim lại KQ. Bạn khai báo KQ là biến mảng không có chỉ số cố định. Để sử dụng phải Redim nó trước (Chỉ cần Redim một lần)
  1. Private Sub cmdDoi_Click()
  2. Dim i%, m%, n%, k%
  3. i = 0
  4. Dim mang(32) As Byte, kq() As Byte
  5.     n = Val(txtNHAP)
  6.     k = Val(txtHs)
  7.     txtKq = ""
  8.     Do While (n <> 0)
  9.         mang(i) = n Mod k
  10.         n = n / k
  11.         i = i + 1
  12.     Loop
  13.     m = i
  14.     ReDim kq(m - 1) As Byte
  15.     For i = m - 1 To 0 Step -1
  16.         If mang(i) < 10 Then
  17.             kq(i) = mang(i) + 48
  18.         Else
  19.             kq(i) = mang(i) + 55
  20.         End If
  21.         txtKq = Chr(kq(i)) & txtKq
  22.     Next i
  23. End Sub
Thêm nữa trong vb mãng không thể lấy -1 để nó gộp lun nguyên mảng như lập trình hướng đối tượng đâu.
Con người không quan tâm đến sự thật. Họ tin cái họ muốn, và về sau, cái đó sẽ trở thành sự thật

Hình đại diện của người dùng
alexanderdna
Guru
Guru
Bài viết: 214
Ngày tham gia: T.Ba 14/07/2009 11:13 am
Đến từ: Sài Gòn
Has thanked: 3 time
Been thanked: 15 time

Re: Đổi cơ số..

Gửi bàigửi bởi alexanderdna » T.Năm 03/03/2011 10:11 am

gtdcomputer đã viết:Thêm nữa trong vb mãng không thể lấy -1 để nó gộp lun nguyên mảng như lập trình hướng đối tượng đâu.


Xin anh giải thích rõ hơn về câu này, đặc biệt là chỗ lấy -1 để gộp luôn nguyên mảng.

kaka02
Thành viên chính thức
Thành viên chính thức
Bài viết: 13
Ngày tham gia: T.Hai 28/02/2011 10:35 am

Re: Đổi cơ số..

Gửi bàigửi bởi kaka02 » T.Năm 03/03/2011 10:12 pm

Thanks các bạn rất nhiều.mình mới bước vào Vb nên chưa biết lắm xin mọi người chỉ giáo nhiều hơn nữa.Thanks.

kaka02
Thành viên chính thức
Thành viên chính thức
Bài viết: 13
Ngày tham gia: T.Hai 28/02/2011 10:35 am

Re: Đổi cơ số..

Gửi bàigửi bởi kaka02 » T.Năm 03/03/2011 10:14 pm

gtdcomputer đã viết:Bạn chưa Redim lại KQ. Bạn khai báo KQ là biến mảng không có chỉ số cố định. Để sử dụng phải Redim nó trước (Chỉ cần Redim một lần)

Redim là gì bạn?có phải nó giống như trong C,C++ là tạo chỉ số của mảng không vậy?

Hình đại diện của người dùng
gtdcomputer
Thành viên danh dự
Thành viên danh dự
Bài viết: 1296
Ngày tham gia: T.Sáu 18/07/2008 12:08 pm
Đến từ: Kiên Giang
Has thanked: 8 time
Been thanked: 117 time
Liên hệ:

Re: Đổi cơ số..

Gửi bàigửi bởi gtdcomputer » T.Sáu 04/03/2011 8:07 am

@alexanderdna: Em cũng ko nhớ rõ lắm. Nhưng hình như đã từng thấy có một số ngôn ngữ lập trình chỉ cần gán giá trị đầu của mảng vào một biến lớn thì nó sẽ tự lắp đầy biến đó bằng các giá trị còn lại của mãng.

@kaka02:Tớ không nhớ rõ là có hàm nào tương tự như Redim trong C không. Nhưng nói cho rõ ra là mảng khai báo kq() là chưa có chỉ số xác định cần Redim lại (chắc là khai báo lại) có số cố định để sử dụng. Nếu thích bạn có thể redim nhiều lần mỗi lần Redim đều mất giá trị của mảng. Nếu muốn thay đổi số phần tử mà vẫn giữ giá trị thì thêm vào Reserve gì đấy (Hok nhớ rõ)
Con người không quan tâm đến sự thật. Họ tin cái họ muốn, và về sau, cái đó sẽ trở thành sự thật

Hình đại diện của người dùng
alexanderdna
Guru
Guru
Bài viết: 214
Ngày tham gia: T.Ba 14/07/2009 11:13 am
Đến từ: Sài Gòn
Has thanked: 3 time
Been thanked: 15 time

Re: Đổi cơ số..

Gửi bàigửi bởi alexanderdna » T.Sáu 04/03/2011 8:47 am

@gtdcomputer: Nếu có ngôn ngữ nào cung cấp công năng đó thì quả thực khủng khiếp! Nhưng tôi nghĩ chắc là có cái tương tự (một phần thôi) ở C/C++. Đó là mảng ký tự:
  1. char str[4];
  2. str[0] = 'a';
  3. str[1] = 'b';
  4. str[2] = 'c';
  5. str[3] = 0;
  6.  
  7. /* Và dưới đây: */
  8. const char *msg = &str[0];
  9.  
  10. /* Tất nhiên trên thực tế người ta không chuộng cách đó. */
  11.  
  12. printf("str = %s\n", str);
  13. printf("msg = %s\n", msg);


@kaka02: ReDim từa tựa như realloc. Nếu ReDim mà muốn giữ nguyên các phần tử đã có trước đó, thì dùng thêm từ khóa Preserve. Xem:
  1. Dim mang(5) As Integer
  2. '...
  3. ReDim Preserve mang(10) As Integer

Hình đại diện của người dùng
ThanhLe993
Bài viết: 4
Ngày tham gia: T.Sáu 11/09/2015 3:37 pm
Đến từ: Tiền Giang
Liên hệ:

Re: Đổi cơ số..

Gửi bàigửi bởi ThanhLe993 » T.Bảy 19/09/2015 9:09 pm

Mình đã viết xong nhưng không biết nó bị lỗi hoài, ngay chỗ (chuoi(i)), mong các anh em giúp đỡ
Private Function Doi_Co_So_10_Ra_2(ByVal n As Integer) As String
' khai bao bien
Dim chuoi As String
' gan gia tri cho bien
chuoi = ""
Do While n <> 0
chuoi = chuoi + Str(n Mod 2)
n = n / 2
Loop
' khai bao bien
Dim kq As String
' gan gia tri
kq = ""
For i = Len(chuoi) - 1 To 0
kq = kq + Str(chuoi(i))
Next

Doi_Co_So_10_Ra_2 = kq

End Function

Hình đại diện của người dùng
tungblt
Điều hành viên
Điều hành viên
Bài viết: 549
Ngày tham gia: T.Hai 22/12/2008 5:22 pm
Đến từ: quy nhơn
Has thanked: 6 time
Been thanked: 76 time
Liên hệ:

Re: Đổi cơ số..

Gửi bàigửi bởi tungblt » CN 20/09/2015 12:09 pm

chuoi(i) này là mảng mà? bạn khai báo string
love

Hình đại diện của người dùng
xuanha
Guru
Guru
Bài viết: 1230
Ngày tham gia: T.Năm 19/08/2010 4:25 pm
Đến từ: Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên
Has thanked: 13 time
Been thanked: 380 time
Liên hệ:

Re: Đổi cơ số..

Gửi bàigửi bởi xuanha » T.Hai 21/09/2015 2:42 pm

Bạn sửa lại như sau:
  1. Private Function Doi_Co_So_10_Ra_2(ByVal n As Integer) As String
  2. ' khai bao bien
  3. Dim chuoi As String
  4. ' gan gia tri cho bien
  5. chuoi = ""
  6. Do While n <> 0
  7. chuoi = chuoi & (n Mod 2)
  8. n = n / 2
  9. Loop
  10. ' khai bao bien
  11. Dim kq As String
  12. 'gan gia tri
  13. kq = ""
  14. For i = Len(chuoi) To 1 Step -1
  15. kq = kq & Mid(chuoi, i, 1)
  16. Next
  17. Doi_Co_So_10_Ra_2 = kq
  18. End Function
Kiểm phiếu Đại hội Đoàn, Đại hội Đảng
http://caulacbovb.com/forum/viewtopic.php?t=23599


Quay về “Visual Basic 6 và Visual Basic Script (VB & VBS)”

Đang trực tuyến

Đang xem chuyên mục này: Google [Bot]2 khách