• 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

Moderator: tungblt

kaka02
Thành viên chính thức
Thành viên chính thức
Posts: 13
Joined: Mon 28/02/2011 10:35 am

Đổi cơ số..

Postby kaka02 » Mon 28/02/2011 12:03 pm

Code: Select all

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



User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: Đổi cơ số..

Postby truongphu » Mon 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
Posts: 13
Joined: Mon 28/02/2011 10:35 am

Re: Đổi cơ số..

Postby kaka02 » Thu 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:

Code: Select all

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

User avatar
alexanderdna
Guru
Guru
Posts: 214
Joined: Tue 14/07/2009 11:13 am
Location: Sài Gòn
Has thanked: 3 times
Been thanked: 15 times

Re: Đổi cơ số..

Postby alexanderdna » Thu 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:
[vb]For i = 0 To m - 1
txtKq.Text = Chr$(kq(i)) & txtKq.Text
Next i[/vb]

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 \.
[vb]n = n \ k[/vb]

---
EDIT: ghi thêm As Byte sau ReDim kq(m - 1)
Last edited by alexanderdna on Thu 03/03/2011 10:06 am, edited 1 time in total.

User avatar
gtdcomputer
Thành viên danh dự
Thành viên danh dự
Posts: 1296
Joined: Fri 18/07/2008 12:08 pm
Location: Kiên Giang
Has thanked: 8 times
Been thanked: 117 times
Contact:

Re: Đổi cơ số..

Postby gtdcomputer » Thu 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

User avatar
alexanderdna
Guru
Guru
Posts: 214
Joined: Tue 14/07/2009 11:13 am
Location: Sài Gòn
Has thanked: 3 times
Been thanked: 15 times

Re: Đổi cơ số..

Postby alexanderdna » Thu 03/03/2011 10:11 am

gtdcomputer wrote: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
Posts: 13
Joined: Mon 28/02/2011 10:35 am

Re: Đổi cơ số..

Postby kaka02 » Thu 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
Posts: 13
Joined: Mon 28/02/2011 10:35 am

Re: Đổi cơ số..

Postby kaka02 » Thu 03/03/2011 10:14 pm

gtdcomputer wrote: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?

User avatar
gtdcomputer
Thành viên danh dự
Thành viên danh dự
Posts: 1296
Joined: Fri 18/07/2008 12:08 pm
Location: Kiên Giang
Has thanked: 8 times
Been thanked: 117 times
Contact:

Re: Đổi cơ số..

Postby gtdcomputer » Fri 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

User avatar
alexanderdna
Guru
Guru
Posts: 214
Joined: Tue 14/07/2009 11:13 am
Location: Sài Gòn
Has thanked: 3 times
Been thanked: 15 times

Re: Đổi cơ số..

Postby alexanderdna » Fri 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:
[vb]Dim mang(5) As Integer
'...
ReDim Preserve mang(10) As Integer[/vb]

User avatar
ThanhLe993
Posts: 4
Joined: Fri 11/09/2015 3:37 pm
Location: Tiền Giang
Contact:

Re: Đổi cơ số..

Postby ThanhLe993 » Sat 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

User avatar
tungblt
Điều hành viên
Điều hành viên
Posts: 550
Joined: Mon 22/12/2008 5:22 pm
Location: quy nhơn
Has thanked: 8 times
Been thanked: 77 times
Contact:

Re: Đổi cơ số..

Postby tungblt » Sun 20/09/2015 12:09 pm

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

User avatar
xuanha
Guru
Guru
Posts: 1230
Joined: Thu 19/08/2010 4:25 pm
Location: Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên
Has thanked: 13 times
Been thanked: 380 times
Contact:

Re: Đổi cơ số..

Postby xuanha » Mon 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


Return to “Visual Basic 6 và Visual Basic Script (VB & VBS)”

Who is online

Users browsing this forum: No registered users and 2 guests