Bài tập về Lập trình Visual basic

Chia sẻ: Xuan Khuong | Ngày: | Loại File: PDF | Số trang:0

0
1.106
lượt xem
563
download

Bài tập về Lập trình Visual basic

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài tập lập trình hướng sự kiện - Bài tập chuơng 1: Bài tập lập trình Visual basic

Chủ đề:
Lưu

Nội dung Text: Bài tập về Lập trình Visual basic

  1. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Bμi tËp ch−¬ng 1 NG¤N NG÷ LËP TR×NH VISUAL BASIC MỤC TIÊU: SAU KHI HOÀN THÀNH CÁC BÀI TẬP, NGƯỜI HỌC CÓ THỂ Khai báo các biến thuộc các kiểu dữ liệu cơ bản (byte, integer, long, string, boolean, single) và kiểu mảng, kiểu bản ghi trong Visual Basic. Sử dụng các hàm nhập xuất dữ liệu (MsgBox và InputBox) của VB. Sử dụng và vận dụng được các cấu trúc rẽ nhánh (If...Then và If...Then...Else), cấu trúc đa rẽ nhánh (Select Case) và các loại vòng lặp : For; Do While...Loop; Do...Loop để viết chương trình. Sử dụng được một số hàm xử lý xâu thường dùng. A - ĐỀ BÀI TẬP Bài tập 1: Sử dụng hàm MsgBox và InputBox Viết chương trình giải phương trình bậc 2. Hệ số a, b, c nhập từ bàn phím bằng hàm InputBox (Giải sử a ≠ 0). Bài tập 2: Minh hoạ cấu trúc If … Then. Viết chương trình tính lương như sau: Cho người dùng nhập vào lương cơ bản LCB, Hệ số lương HSL và chức vụ CV. Nếu chức vụ là "giam doc" thì cộng thêm 500000 vào lương thực lĩnh (LTL), nếu là "truong phong" thì cộng thêm 300000, nếu là "to truong" thì cộng thêm 200000, nếu là "nhan vien" thì không cộng. Sau đó hiển thị tổng số lương thực lĩnh. Bài tập 3-Select Case: Yêu cầu như bài 2, nhưng sử dụng cấu trúc Select Case Bài tập 4: Hiển thị các loại thông báo sử dụng hàm MsgBox. Viết chương trình hiển thị 4 loại hộp thoại MsgBox như mô tả dưới đây khi người dùng nhập vào các số tương ứng 1,2,3,4 bằng hàm InputBox: 1 3 2 4 Bài tập 5: Sử dụng cấu trúc Select Case. Viết chương trình cho phép người dùng nhập vào 2 số thực a và b và một trong các phép toán gồm +, -, *, /, \ (Chia lấy phần nguyên), mod (chia lấy phần dư) hoặc ^ (Luỹ thừa). Sau đó hiển thị kết quả tương ứng. Ví dụ nếu nhập 2 số 10, 20 và phép toán là + thì thông báo "Kết quả là 30" v.v. Trang 1
  2. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Bài tập 6: Sử dụng vòng lặp FOR. Viết chương trình tính tổng của dãy số sau và hiển thị kết quả ra màn hình: S = 1 + 2 + 3 + ... + N , Với N nhập từ bàn phím. Bài tập 7: Sử dụng vòng lặp For với điều khoản Step. Hãy viết chương trình tính tổng các số chẵn từ 1 đến 100. Bài tập 8: Sử dụng vòng lặp For đếm ngược “FOR … DOWNTO…”. Hãy sử dụng vòng lặp For in ra các số từ 100 đến 1 bằng lệnh Debug.Print. Bài tập 9: Sử dụng vòng lặp Do…Loop Until Cho người dùng nhập vào một dãy các số nguyên (âm và dương) và tính tổng các số âm, tổng các số dương. Việc nhập kết thúc nếu số nhập vào là 0. Bài tập 10: Sử dụng cấu trúc Do While … Loop. Hãy cho biết cần gửi số tiền tiết kiệm 1 triệu đồng vào ngân hàng trong thời gian mấy năm để có 2 triệu đồng. Biết rằng lãi suất hàng năm là 8%. Bài tập 11: Thoát khỏi vòng lặp với Exit For, Exit Do. Viết chương trình nhập số nguyên n và kiểm tra xem có phải là số nguyên tố hay không ?. Bài tập 12: Sự tương đương giữa các cấu trúc lặp. Tính n! sử dụng các cấu trúc lặp khác nhau. Bài tập 13: Sử dụng vòng lặp FOR Lập trình tính tổng của dãy số sau và hiển thị kết quả ra màn hình : 8 200 310 ∑ n2 + ∑ n2 + ∑n S= 2 n =1 n =100 n =300 Bài tập 14 – Tính N !: Viết chương trình nhập số nguyên N (0
  3. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Bài tập 19- Tìm số nguyên tố: Nhập vào một dãy số nguyên dương bằng hàm InputBox. Sau đó in ra các giá trị là số nguyên tố. Bài tập 20-Đếm ký tự: Lập trình cho người dùng nhập vào một xâu ký tự S. Sau đó đếm xem trong xâu nhập vào có bao nhiêu ký tự là a và A. Biết rằng : - Hàm Mid(S, i, 1) cho ta ký tự thứ i trong xâu S - Hàm Len(S) cho ta độ dài của xâu S Bài tập 21-Tính tổng dãy số: Viết chương trình nhập x và n rồi tính tổng x x2 x3 xn S = 1+ + + + ... + n +1 23 4 x 0 x1 x 2 x 3 xn ) ++ + + ... + (Hay có thể viết dưới dạng S = n +1 1 2 3 4 Bài tập 22 : Bài toán tìm phần tử lớn nhất (nhỏ nhất) trong một danh sách Viết chương trình nhập n số nguyên vào một mảng nguyên A, sau đó tìm số lớn nhất trong mảng nguyên đó. Bài tập 23: Liệt kê các phần tử lớn nhất (nhỏ nhất) trong danh sách. Nhập danh sách gồm n số nguyên, sau đó hiển thị các phần tử có giá trị lớn nhất. Bài tập 24: Sắp xếp một dãy số nguyên. Viết chương trình cho phép nhập vào N số nguyên. Sau đó sắp xếp dãy số này theo chiều tăng dần và hiển thị dãy đã sắp xếp ra màn hình bằng lệnh Debug.Print. Bài tập 25 – Quick Sort: Nhập vào một dãy N số nguyên dương, sau đó sắp xếp dãy này tăng dần theo giải thuật Quick-Sort. Kết quả in ra bằng hàm Debug.Print. Bài tập 26- Heap Sort: Nhập vào một dãy N số nguyên dương, sau đó sắp xếp dãy này tăng dần theo giải thuật Heap-Sort. Kết quả in ra bằng hàm Debug.Print. Bài tập 27: Sắp xếp một dãy các phần tử, trong đó mỗi phần tử là một xâu ký tự theo vần Alphabet (Theo thứ tự từ điển) bằng thuật toán sắp xếp đơn giản. Viết chương trình nhập vào danh sách tên của một lớp, sau đó sắp xếp theo vần Alphabet và hiển thị kết quả sắp xếp ra màn hình bằng hàm Debug.Print Bài tập 28-Chuẩn hoá xâu: Nhập vào một xâu ký tự bất kỳ sau đó chuẩn hoá và in ra màn hình. Xâu chuẩn hoá ở đây là xâu không có 2 dấu trắng liền nhau, không có dấu trắng ở hai đầu và sau dấu chấm hoặc dấu phảy phải có một dấu trắng. Bài tập 29-Chuẩn hoá xâu: Yêu cầu như bài 28 và mỗi ký tự đầu câu là chữ HOA. Bài tập 30-Tách số khỏi xâu: Nhập vào một xâu ký tự có chứa cả chữ số và chữ cái ví dụ: “Ngày mồng 2 tháng 9 năm 1945 Bác Hồ đã đọc tuyên ngôn độc lập tại Quảng trường Ba Đình lịch sử !”. Giả sử các số là nguyên dương. Hãy tách các số đó ra khỏi xâu và in ra màn hình (Ở đây sẽ tách được 3 số là 2, 9 và 1945). Trang 3
  4. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Bài tập 31-Tách Câu: Nhập vào một xâu ký tự bất kỳ, kết thúc mỗi câu là một dấu chấm. Hãy in mỗi câu trong xâu đó trên một dòng bằng hàm Debug.print. Bài tập 32-Chuyển đổi Font chữ: Giả sử một tệp văn bản có nội dung được định dạng với font chữ .vntime, Hãy chuyển nội dung của tệp này sang font chữ VIQR và lưu vào một tệp khác. Tên tệp nguồn và tệp đích tương ứng là : c:\FontVNTime.txt và c:\FontVIQR.txt. Bài tập 33-Thống kê ký tự trong xâu: Nhập một xâu ký tự bất kỳ, sau đó in ra màn hình số lượng từng loại ký tự đã nhập. Bài tập 34-Thay thế ký tự: Nhập vào một xâu, sau đó thay thế tất cả các ký tự trắng (chr(32)) bằng ký tự “_”. Kết quả in ra màn hình bằng hàm MsgBox. Bài tập 35-Cộng số nguyên lớn: Viết chương trình cộng 2 số nguyên dương lớn bất kỳ và in kết quả ra màn hình. Bài tập 36-Ma trận số: Viết chương trình nhập vào một ma trận gồm m hàng và n cột. Sau đó tính tổng các phần tử dương, tổng các phần tử trên 2 đường chéo chính. Bài tập 37- Kiểm tra "đường thẳng" trong ma trận: Nhập một ma trận vuông kích thước N x N. Ma trận này chỉ chứa các số 0 và 1. Hãy lập trình để cho biết ma trận đó có ít nhất 5 phần tử thẳng hàng (ngang, dọc, chéo xuôi, chéo ngược) có cùng giá trị là 1 hay không ? Bài tập 38- Mảng bản ghi: Viết chương trình nhập vào một danh sách cán bộ, sau đó sắp xếp danh sách cán bộ theo tuổi và lưu vào một tệp tên là Canbo.txt. Thông tin về cán bộ gồm: Họ và tên, Năm sinh, Quê quán, Hệ số lương. PHỤ LỤC 1 Dưới đây là mô tả một số hàm rất hay dùng trong VB để bạn tham khảo trong khi lập trình và cho các bài tập sau này . Tên hàm Mô tả Ví dụ Abs (x) Hàm tính giá trị tuyệt đối của một số. Abs(-5) 5 Sqr(x) Tính căn bậc hai của một số x (x>=0) Sqr(4) 2 Round(x) Làm tròn số x Round(3.2) 3 Asc(Ch) Trả về mã của ký tự Ch Asc("A") 65 Chr(n) Trả về ký tự có mã Ascii là n Chr(65) "A" Trả về xâu chữ hoa (Nhưng không làm thay đổi UCase(S) UCase("aBc") "ABC" đến xâu S) Trả về xâu chữ thường (Nhưng không làm thay LCase(S) UCase("aBc") "abc" đổi đến xâu S) Len(S) Trả về độ dài của xâu S Len("abc123") 6 Lấy một xâu con trong S từ vị trí thứ i, n ký tự. Mid(S,i,n) Mid("ABCDE", 2,3) "BCD" Nếu bỏ qua tham số n thì mặc định là lấy từ vị trí i đến hết xâu. Left(S, n) Lấy ra n ký tự trong xâu S tính từ bên trái Left(S,"ABCD",3) "ABC" Right(S,n) Lấy ra n ký tự trong xâu S tính từ bên phải Right(S,"ABCD",3) "BCD" Trả về một xâu S nhưng bỏ các dấu trắng hai đầu Trim(S) Trim(" ABC ") "ABC" (Xâu S không bị thay đổi). LTrim(S) Giống như Trim(S) nhưng chỉ cắt phía trái LTrim(" ABC ") "ABC " RTrim(S) Giống như Trim(S) nhưng chỉ cắt phía phải RTrim(" ABC ") " ABC" StrReverse(S) Đảo ngược xâu S (S không bị thay đổi) StrReverse("AB") "BA" Str(x) Chuyển số x sang dạng xâu Str(10) "10" Val(S) Chuyển một xâu sang dạng số Val("10") 10 Kiểm tra xâu S2 có năm trong xâu S1 hay không. Instr(n,S1,S2) Instr(1,"ABC", "BC") 2 Hàm trả về giá trị > 0 nếu có. Split(S, C) Tách xâu S thành các phần tử, với ký hiệu phân Dim S As string, R As Trang 4
  5. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 tách là C. Variant Dim I As integer S = “ha,noi,viet,nam” R = Split(S,”,”) For i=0 to Ubound(R) Msgbox R(i) Next Replace Dim S As string Thay thế các xâu con S1 trong S bằng xâu S2 (S, S1, S2) S = Replace(“A!!”,”!!”,”!”) FileLen(F) Cho biết kích thước của file F tính theo bytes MsgBox FileLen("C:\io.sys") CurDir Trả về đường dẫn của thư mục hiện hành Msgbox CurDir Dim D As Date Year(D) Trả về năm của biến kiểu Date D D = Now Msgbox Year(D) Month(D) Trả về tháng của biến kiểu Date D MsgBox Month(Now) Day(D) Trả về ngày của biểu thức kiểu Date D Day(#21/2/2004#) 21 Hour(T) Trả về giờ của biểu thức kiểu Time T Hour(Time) Now Hàm trả về ngày tháng hiện hành Msgbox now Time Trả về giờ phút giây hiện hành Msgbox Time Hàm trả về một số ngẫu nhiên trong khoảng [0, 1) Rnd Msgbox Rnd Lưu ý: trước đó phải gọi thủ tục Randomize. B. HƯỚNG DẪN - GIẢI MẪU Bài tập 1 a. Hướng dẫn: Cần tính giá trị của Δ, Sau đó sử dụng cấu trúc lệnh If...Then...Else (Hoặc cấu trúc Select Case) để kiểm tra Δ và tính nghiệm. b. Chương trình mẫu: Cách 1: Sử dụng cấu trúc If..Then … Else Cách 2: Sử dụng cấu trúc Select Case Private Sub Form_Load() Private Sub Form_Load() Dim a As Single, b As Single Dim a As Single, b As Single Dim c As Single Dim c As Single Dim Delta As Single Dim Delta As Single Dim x1 As Single, x2 As Single Dim x1 As Single, x2 As Single a = InputBox("Nhập hệ số a (a 0) :") a = InputBox("Nhập hệ số a (a0):") b = InputBox("Nhập hệ số b : ") b = InputBox("Nhập hệ số b : ") c = InputBox("Nhập hệ số c : ") c = InputBox("Nhập hệ số c : ") Delta = b ^ 2 - 4 * a * c Delta = b ^ 2 - 4 * a * c If Delta < 0 Then Select Case Delta MsgBox "Vô nghiệm ", vbInformation Case Is < 0 MsgBox "Vô nghiệm " Else If Delta = 0 Then Case 0 x1 = -b / (2 * a) x1 = -b / (2 * a) MsgBox "Có nghiệm kép:" & x1 MsgBox "Nghiệm kép:" & x1 Case Is > 0 Else x1 = (-b + Sqr(Delta)) / (2 * a) x1 = (-b + Sqr(Delta)) / (2 * a) x2 = (-b - Sqr(Delta)) / (2 * a) x2 = (-b - Sqr(Delta)) / (2 * a) MsgBox "x1=" &x1 & " x2=" &x2 MsgBox "x1=" &x1 &" x2=" &x2 End If '//// Của If Delta = 0 End Select End If '//// Của If Delta < 0 End Sub End Sub c. Ghi chú: Cấu trúc Select Case của VB rất mạnh, nó không những kiểm tra biểu thức ở dạng số nguyên mà còn có thể kiểm tra cả dạng số thực, xâu ký tự, đồng thời với mối loại giá trị có thể kiểm tra một khoảng giá trị (sử dụng từ khoá Case is …) Trang 5
  6. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Bài tập 2 a. Hướng dẫn: Lương thực lĩnh (LTL) = HSL * LCB + Phụ cấp chức vụ. Để tính Phụ cấp chức vụ, cần sử dụng câu lệnh If ... Then để kiểm tra xem chức vụ nhập vào có là "giam doc", "truong phong" hay "to truong" hay không để cộng thêm. b. Chương trình mẫu: Chương trình nhập và tính lương Private Sub Form_Load() Dim HSL As Long, LCB As Long, PCCV As Long, LTL As Long Dim CV As String LCB = InputBox("nhập vào lương cơ bản : ", "Tính lương", 290000) HSL = InputBox("nhập vào hệ số lương", "Tính lương", 1.92) CV = InputBox("Chức vụ ") If CV = "giam doc" Then LTL = HSL * LCB + 500000 If CV = "truong phong" Then LTL = HSL * LCB + 300000 If CV = "to truong" Then LTL = HSL * LCB + 20000 If CV = "nhan vien" Then LTL = HSL * LCB End Sub c. Ghi chú: Có thể thay thế cấu trúc If...Then ở trên bằng cấu trúc If....Then...ElseIf hoặc bằng cấu trúc đa rẽ nhánh Select Case (Đây là cấu trúc phù hợp nhất) Bài tập 3 a. Hướng dẫn: Cấu trúc Case trong VB cho phép kiểm tra cả biểu thức dạng Xâu, Số nên có thể áp dụng vào giải quyết bài toán này. b. Chương trình mẫu: Tính lương đơn giản minh hoạ cấu trúc Select Case Private Sub Form_Load() Dim HSL As Long, LCB As Long, PCCV As Long, LTL As Long Dim CV As String LCB = InputBox("nhập vào lương cơ bản : ", "Tính lương", 290000) HSL = InputBox("nhập vào hệ số lương", "Tính lương", 1.92) CV = InputBox("Chức vụ ") Select Case CV Case "giam doc" LTL = HSL * LCB + 500000 Case "truong phong" LTL = HSL * LCB + 300000 Case "to truong" LTL = HSL * LCB + 20000 Case Else LTL = HSL * LCB End Select MsgBox "Lương của bạn là : " & LTL End Sub C. Ghi chú: Để chương trình vẫn tính đúng cho dù người dùng có thể nhập chức vụ ở dạng chữ thường hay chữ HOA thì nên UCase các xâu trước tiên. (Xem phụ lục 1) Trang 6
  7. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Bài tập 4 a. Hướng dẫn: Để hiển thị hộp thoại Msgbox với các nút và biểu tượng khác nhau, ta chỉ cần thêm các hằng vào tham số thứ 2 của hàm MsgBox, ví dụ : vbQuestion, vbYesNo, vbOKCancel, vbInformation, vbAbortRetryIgnore.... Ngoài ra, để biết người dùng muốn hiển thị loại hộp thoại nào (nhập vào số mấy) cần sử dụng cấu trúc Select Case để kiểm tra và ra quyết định. b. Chương trình mẫu: Private Sub Form_Load() Dim Kieu As Byte Kieu = InputBox("B¹n h·y nhËp vµo mét sè (1-4) ®Ó chän kiÓu MsgBox : ") Select Case Kieu Case 1: MsgBox "KiÓu ®¬n gi¶n chØ cã nót OK" '///ViÕt nhiÒu lÖnh cÇn c¸ch nhau dÊu ":" Case 2: MsgBox "Cã 2 nót Yes vµ No", vbYesNo Case 3: MsgBox "Cã nót OK, Cancel vµ dÊu hái chÊm", vbOKCancel Or vbQuestion Case 4: MsgBox "Cã 3 nót vµ dÊu c¶nh b¸o mµu ®á", vbAbortRetryIgnore Or vbCritical Case Else: MsgBox "B¹n ph¶i nhËp 1,2,3 hoÆc 4", vbExclamation, "nhËp sai" End Select End Sub c. Ghi chú: • Có thể kết hợp hiển thị các nút, các biểu tượng bằng cách tổ hợp OR giữa các hằng số: Ví dụ vbOKCancel Or vbExclamation để hiển thị 2 nút OK/Cancel kèm thêm biểu tượng khuyến cáo …. • Hàm MsgBox luôn trả về một số để cho biết là người dùng vừa click chọn nút nào của hộp thông báo MsgBox. Ví dụ: giá trị trả về là vbOK, vbCancel…. Bài tập 5 a. Hướng dẫn: Việc cộng, trừ, nhân hay chia a với b v.v... còn phụ thuộc vào phép toán (toán tử) mà người dùng nhập vào là gì. Do vậy, để ra quyết định là thực hiện phép toán nào lên 2 toán hạng a và b đó, cần sử dụng cấu trúc Select Case để kiểm tra toán tử nhập vào. b. Chương trình mẫu: Private Sub Form_Load() Dim a As Single, b As Single, KetQua As Single Dim PhepToan As String a = InputBox("NhËp sè h¹ng thø nhÊt: ") PhepToan = InputBox("NhËp vµo phÐp to¸n (+,-,*,/,mod,div,^)") b = InputBox("NhËp sè h¹ng thø hai: ") Select Case PhepToan Case "+": KetQua = a + b Case "-" KetQua = a - b Case "*": KetQua = a * b Case "/": KetQua = a / b Case "div": KetQua = a \ b Case "mod": KetQua = a Mod b Case "^": KetQua = a ^ b Trang 7
  8. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Case Else: MsgBox "T«i kh«ng hiÓu phÐp to¸n nµy !", vbExclamation, "NhËp sai" End Select MsgBox "KÕt qu¶ cña " & a & PhepToan & b & " lµ : " & KetQua End Sub Thực hiện các phép toán cơ bản dùng cấu trúc Select Case C. Ghi chú : các phép chia nguyên và chia dư trong VB: • Phép chia \ là phép chia lấy phần nguyên: Ví dụ 10 \ 3 = 3. Phép chia / là phép chia thông thường (lấy cả phần nguyên và phần dư), ví dụ: 5 / 2 = 2.5. • Phép mod là chia lấy phần dư, ví dụ 10 mod 3 = 1, 6 mod 4 = 2 v.v… Bài tập 6 a. Hướng dẫn: S là tổng các số hạng thứ i, với i chạy từ 1 đến N, Số hạng tổng quát là i. Do vậy để tính tổng của dãy số S, có thể sử dụng một trong 3 loại vòng lặp đã biết. b. Chương trình mẫu (Gõ đoạn mã trong thủ tục Form_Load) Cách 1: Sử dụng vòng lặp For Dim i As Integer Dim N As Integer Dim S As Long N=Inputbox("Nhập số N (N>0) : ") S=0 For i=1 To N S=S+i ‘///S = S + Next Msgbox "Tổng = " & S Cách 2: Sử dụng vòng lặp Do...Loop Until Dim i As Integer Dim N As Integer Dim S As Long N=Inputbox("Nhập số N (N>0) : ") S=0 i=1 Do S=S+i i=i+1 Loop UNTIL i > N Msgbox "Tổng = " & S Cách 3 : Dùng vòng lặp Do While ... Loop Dim i As Integer Dim N As Integer Dim S As Long N=Inputbox("Nhập số N (N>0) : ") S=0 i=1 Do While i
  9. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 S=S+i i=i+1 Loop Msgbox "Tổng = " & S Bài tập 7 a. Hướng dẫn: Có nhiều cách tính nhưng trong trường hợp này có thể sử dụng vòng lặp For kết hợp với điều khoản Step: b. Chương trình mẫu: Private Sub Form_Load() Dim i As Integer, S As Long S=0 For i = 2 To 100 Step 2 S=S+i Next MsgBox "Tæng c¸c sè ch½n tõ 1->100 lµ : " & S End Sub c. Ghi chú: • Nếu không có điều khoản Step thì sau mỗi lần lặp biến chạy i tự động được tăng lên 1 đơn vị. Còn nếu có điều khoản Step 2 thì sau mỗi lần lặp, biến chạy i được tăng lên 2 đơn vị. Tổng quát, nếu Step N (N nguyên âm hoặc dương) thì sau mỗi lần lặp, biến chạy được tăng (nếu N > 0) hay giảm đi (Nếu N
  10. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 b.Giải mẫu: Private Sub Form_load() Dim n As Long, i As Long Dim TongAm As Long Dim TongDuong As Long TongAm = 0 '/// Khëi t¹o tr−íc khi tÝnh tæng TongDuong = 0 '/// Khëi t¹o tr−íc khi tÝnh tæng Do n = InputBox("NhËp vµo mét sè nguyªn : ") If n > 0 Then TongDuong = TongDuong + n Else TongAm = TongAm + n End If '/// Lặp cho đến khi nào nhập n = 0 thì dừng. Loop Until n = 0 MsgBox "Tæng c¸c sè ©m = " & TongAm & ". Tong c¸c sè d−¬ng = " & TongDuong End Sub c. Ghi chú: • Vòng lặp Do …. Loop Until sẽ kết thúc khi điều kiện bằng true • Vòng lặp Do…Loop Until khác với vòng lặp dạng Do….Loop While ở chỗ vòng lặp Do…Loop While kết thúc khi vẫn là False. • Thực chất, cấu trúc lặp Do…Loop Until và Do … Loop While là tương đương nhau, do vậy để tránh nhầm lẫn chúng ta chỉ nên nhớ một loại khi thực hành. • Có thể thoát khỏi vòng lặp dạng Do… Loop bằng câu lệnh Exit Do Bài tập 10 a. Hướng dẫn: Vì không thể biết được là sau bao nhiêu năm thì tổng số tiền sẽ là 2.000.000, mà chỉ biết rằng mỗi năm sẽ tăng thêm một lượng nào đó. Do vậy, ở đây ta sẽ sử dụng vòng lặp không xác định và mỗi lần lặp ta sẽ kiểm tra xem đã được số tiền cần thiết hay chưa? Nếu đủ rồi thì thoát và số lần thử chính là số năm cần tìm. Nhưng ở đây tại sao ta lại sử dụng vòng lặp Do While…Loop mà không là Do …Loop ?. Sở dĩ sử dụng vòng lặp Do While … Loop là vì rằng số tiền gửi vào ban đầu đã rất có thể lớn hơn số tiền kỳ vọng ! b. Chương trình mẫu: Private Sub Form_Load() Dim SoNam As Integer, TongTien As Long SoNam = 0 TongTien = 1000000 Do While TongTien < 2000000 SoNam = SoNam + 1 TongTien = (1 + 0.05) ^ SoNam * TongTien ‘/// C«ng thøc cÇn nhí Loop MsgBox "CÇn ph¶i göi trong " & SoNam & " n¨m !" End Sub c. Ghi chú: Đây là bài toán tính tiền gửi tiết kiệm, GDP có thể áp dụng trong cuộc sống Trang 10
  11. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Bài tập 11 a. Hướng dẫn: Một số N được gọi là số nguyên tố nếu như nó chỉ chia hết cho 1 và chính nó. Hay nói cách khác là số N không là nguyên tố nếu như nó chia hết cho ít nhất một số nằm trong khoảng [2…N-1]. Như vậy, để kiểm tra ta chỉ cần duyệt tất cả các số i trong phạm vi từ [2…N-1] xem N mod i = 0 ?, nếu xảy ra thì kết luận ngay rằng N không là nguyên tố, trái lại nếu sau khi đã duyệt hết mà không thấy trường hợp đó xảy ra thì kết luận N là nguyên tố. Người ta đã chứng minh được rằng không cần phải duyệt từ [2…N-1] mà chỉ cần duyệt trong phạm vi hẹp hơn là từ [2.. N ] . b. Chương trình mẫu: Private Sub Form_Load() Dim n As Integer, i As Integer, KetQua As Boolean n = InputBox("NhËp vµo mét sè nguyªn ") KetQua = True For i = 2 To Sqr(n) If n Mod i = 0 Then KetQua = False Exit For ‘/// Tho¸t ngay khái vßng lÆp For End If Next If KetQua = True Then MsgBox n & “ lµ sè nguyªn tè !” If KetQua = False Then MsgBox n & “ kh«ng ph¶i lµ sè nguyªn tè !” End Sub c. Ghi chú: • Để thoát vô điều kiện khỏi vòng lặp Do While…, Do…Loop While hay Do … Loop Until thì cần gọi lệnh Exit Do • Hàm Sqr(n) trong VB dùng để tính n (không phải là tính bình phương như trong một số ngôn ngữ lập trình khác – như Pascal). • Nếu công việc gì chỉ làm một lần (ví dụ thông báo kết quả như trên) thì “KHÔNG BAO GIỜ” được đặt trong vòng lặp mà phải đặt ở ngoài vòng lặp. Vì đặc điểm của vòng lặp là “lặp đi lặp lại” nhiều lần một công việc ! Bài tập 12 a. Hướng dẫn: Giai thừa của số N được tính theo công thức N!=1.2.3…N-1.N. Để tính toán ta thực hiện nhân dồn các số i ( i = 1 ÷ N) vào kết quả. b. Chương trình mẫu: Private Sub Form_Load() Dim n As Integer, i As Integer, KetQua As Long Trang 11
  12. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 '/// NhËp sè n, ®¶m b¶o 0
  13. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 o Do ……… Loop Until o Do While …….. Loop • Cấu trúc Do While … Loop và Do Until …. Loop cùng có điểm giống nhau là kiểm tra điều kiện trước khi lặp (giống như cấu trúc While …do trong Pascal hay While trong C/C++) nhưng cấu trúc Do While … Loop chỉ lặp khi điều kiện vẫn đúng, còn cấu trúc Do Until …. Loop chỉ lặp khi điều kiện vẫn sai (Hay thoát nếu là đúng). • Cấu trúc Do … Loop While và cấu trúc Do … Loop Until cùng giống nhau là thực hiện lặp sau đó mới kiểm tra điều kiện (Giống cấu trúc Repeat … Until trong pascal hay do … While trong C/C++), nhưng cấu trúc Do … Loop While chỉ lặp nếu điều kiện vẫn còn đúng, trong khi đó cấu trúc Do … Loop Until chỉ lặp nếu biểu thức điều kiện vẫn còn sai (Hay nói cách khác là kết thúc lặp nếu điều kiện lặp là đúng) • Khi thực hành, không nhất thiết phải nhớ cả 4 kiểu lặp đã nêu ở trên mà bạn nên vận dụng thành thạo 3 cấu trúc lặp được khuyến cáo dùng là For, Do While và Do … Loop Until, vì 3 cấu trúc này tương tự như các cấu trúc lặp trong một số ngôn ngữ lập trình phổ biến khác (For,While…do,Repeat ..Until). Bài tập 13 a. Hướng dẫn: Ta có thổng S = S1 + S2 + S3, với S1, S2, S3 tương ứng với 3 tổng trên. Sử dụng vòng lặp để tính tổng của mỗi Si, sau đó cộng lại để được kết quả. b. Chương trình mẫu: Private Sub form_load() Dim i As Integer Dim Tong As Long Dim S1 As Long, S2 As Long, S3 As Long Tong = 0 ' §Çu tiªn do ch−a tÝnh nªn Tong b»ng 0 S1 = 0 S2 = 0 S3 = 0 '/// TÝnh tæng S1 For i = 1 To 8 S1 = S1 + i ^ 2 Next '/// TÝnh tæng S2 For i = 100 To 200 S2 = S2 + i ^ 2 Next '/// TÝnh tæng S3 For i = 300 To 310 S3 = S3 + i ^ 2 Next S = S1 + S2 + S3 MsgBox "Tæng lµ : " & Tong, vbInformation, "Th«ng b¸o ..." End Sub Trang 13
  14. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Bài tập 14: a. Hướng dẫn: Công thức tính giai thừa của số N là: N! = 1.2.3…N-1.N, như vậy ở đây ta cần nhân liên tiếp các số i (i chạy từ 1 đến n) vào kết quả. Trong đó, giá trị khởi tạo cho kết quả là 1. Bài này có thể giải theo cách đệ qui hoặc không đệ qui. b. Chương trình mẫu Cách 1: Dùng vòng lặp (Không dùng đệ qui) Private Sub Form_Load() Dim i As Integer, n As Integer Dim KetQua As Long '/// NhËp sè n (0
  15. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Bài tập 15: a. Hướng dẫn: Với bài toán dạng tính tổng của một chuỗi số khi biết số hạng tổng quát Si, nói chung là đơn giản. Có thể thực hiện theo giải thuậ như sau: S=0 For i = i0 TO in S = S + Si Next Với mỗi dãy khác nhau thì giá trị i0, N, Si có thể khác nhau và cần phải xác định. - Giá trị i0 và N thường xác định bởi giải phương trình Si = S0 và Si = Sn - Số hạng tổng quát Si thường có thể nhìn thấy ngay trong đề bài. Trong bài này: S i = i * n + (i + 1) - Xác định i0: Cho S0 = Si ⇔ 1 * n + 2 = i * n + (i + 1) ⇒ i0=1 - Xác định in: Cho Sn = Si ⇔ n * n + (n + 1) = i * n + (i + 1) ⇒ in=n - b. Chương trình mẫu: Private Sub Form_Load() Dim S As Single, i As Integer, N As Integer N = InputBox("NhËp sè N : ") S=0 For i = 1 To N S = S + i * Sqr(N + (i + 1)) Next MsgBox "Tæng cña d·y ®· cho lµ : " & S End Sub Bài tập 16 a. Hướng dẫn: Với các bài toán được định nghĩa theo kiểu đệ qui thì cách giải phù hợp và dễ nhất là theo giải thuật qui. Tuy nhiên, tốc độ bị chậm đáng kể khi số N lớn, ngoài ra còn có thể bị tràn Stack. b. Chương trình mẫu: '/// TÝnh d·y Fibonasi dïng §Ö qui Function Fib_Dequi(ByVal N As Integer) As Long If N = 0 Or N = 1 Then Fib_Dequi = 1 If N > 1 Then Fib_Dequi = Fib_Dequi(N - 2) + Fib_Dequi(N - 1) End Function '/// TÝnh d·y Fibonasi KH¤NG dïng §Ö qui Function Fib_KhongDequi(ByVal N As Integer) As Long Dim i As Integer Dim F1 As Long, F2 As Long, KetQua As Long F1 = 1 F2 = 1 KetQua = 1 Trang 15
  16. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 i=2 Do While i
  17. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 '/// T×m USCLN b»ng §Ö qui Function USCLN_Dequi(a As Integer, b As Integer) As Integer If a Mod b = 0 Then USCLN_Dequi = b Else USCLN_Dequi = USCLN_Dequi(b, a Mod b) End If End Function '----------------------------------------------------------------------------------------------------------------------------- '/// Ch−¬ng tr×nh chÝnh Private Sub Form_Load() MsgBox "−íc sè chung lín nhÊt cña 20 vµ 30 lµ : " & USCLN(20, 30) MsgBox "−íc sè chung lín nhÊt cña 20 vµ 30 lµ : " & USCLN_Dequi(20, 30) End Sub Bài tập 18: a. Hướng dẫn: Phân số dạng a/b được gọi là tối giản nếu Ước số chung lớn nhất của a và b là 1. Ví dụ: phân số 5/7 và 9/7 là tối giản; 4/6 và 6/4 là chưa tối giản. b. Chương trình mẫu: '/// T×m −íc sè chung lín nhÊt cña 2 sè a vμ b Function USCLN(a As Integer, b As Integer) As Integer If a Mod b = 0 Then USCLN = b Else USCLN = USCLN(b, a Mod b) End If End Function '----------------------------------------------------------------------------------------------------------------------------- '/// Ch−¬ng tr×nh chÝnh Private Sub Form_Load() Dim a As Integer, b As Integer, TuMoi As Integer, MauMoi As Integer a = InputBox("NhËp tö sè : ") b = InputBox("NhËp mÉu sè : ") If USCLN(a, b) = 1 Then MsgBox "Ph©n sè " & a & "/" & b & " ®· tèi gi¶n", vbInformation Else TuMoi = a / USCLN(a, b) ‘/// TÝnh l¹i tö sè míi MauMoi = b / USCLN(a, b) ‘/// TÝnh l¹i mÉu sè míi MsgBox "Ph©n sè sau khi tèi gi¶n lµ : " & TuMoi & "/" & MauMoi End If End Sub Bài tập 19: a. Hướng dẫn: Trước hết cần xây dựng hàm kiểm tra xem số N có phải là nguyên tố hay không ? Sau đó sử dụng kết quả này vào giải quyết yêu cầu bài toán. b. Chương trình mẫu: Trang 17
  18. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 '/// Hμm kiÓm tra xem sè N cã ph¶i lμ sè nguyªn tè hay kh«ng ? Function LaSoNguyenTo(ByVal n As Integer) As Boolean Dim i As Integer LaSoNguyenTo = True For i = 2 To Round(Sqr(n)) If n Mod i = 0 Then LaSoNguyenTo = False Exit Function End If Next End Function '----------------------------------------------------------------------------------------------------------------------------- '/// Ch−¬ng tr×nh chÝnh Private Sub Form_Load() Dim i As Integer, n As Integer, DaySo(100) As Integer n = InputBox("Sè phÇn tö cÇn nhËp : ", , 10) For i = 1 To n DaySo(i) = InputBox("NhËp sè thø " & i) Next For i = 1 To n If LaSoNguyenTo(DaySo(i)) Then Debug.Print DaySo(i) Next End Sub Bài tập 20 a. Hướng dẫn: Để đếm số ký tự a và A trong một xâu S, chúng ta cần duyệt và kiểm tra lần lượt từng ký tự nằm trong xâu S và so sánh với ký tự a và A. Để duyệt (lấy từng ký tự trong xâu S) chúng ta có thể sử dụng một trong 3 loại vòng lặp. Hàm Mid(S,i,1) cho ta ký tự tại vị trí thứ i trong xâu S. b. Chương trình mẫu (Sử dụng vòng lặp Do While): Form_load() Dim S As String Dim TongAa As Integer Dim i As Integer S = InputBox("B¹n h·y nhËp mét x©u : ") i=1 'B¾t ®Çu tõ ký tù thø nhÊt TongAa = 0 'Khëi t¹o sè ký tù A hoa vμ a th−êng ban ®Çu b»ng 0. Do While i
  19. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 C. Ghi chú: Trong vòng lặp For thì biến chạy sẽ được tự động tăng lên 1 đơn vị, còn trong vòng lặp Do While ... Loop và Do...Loop biến chạy không tự động tăng lên 1, do vậy ta phải tự thực hiện tăng biến chạy lên 1 đơn vị bằng câu lệnh i = i + 1 như bài tập ở trên. Bài tập 21: xi a. Hướng dẫn: Tổng S chính là tổng của các số hạng thứ i, với Si = (Đây là số i+n hạng tổng quát) và i chạy từ 0 đến N. Do vậy để tính tổng chúng ta cần sử dụng một trong 3 loại vòng lặp đã học. b. Chương trình mẫu: (Sử dụng vòng lặp For, bạn hãy thực hiện với vòng lặp do...While và do...Loop) Private Sub Form_Load() Dim i As Integer, N As Integer, x As Single Dim S As Single '///////// NhËp x vμ n //////////////////////// x = InputBox("NhËp vµo sè x : ") N = InputBox("NhËp vµo sè n : ") S=0 '// Khëi t¹o tæng S = 0 For i = 0 To N ‘/// Nói chung là : S = S + S = S + x ^ i / (i + 1) Next MsgBox "Tæng S = " & S, vbInformation, "TÝnh tæng chuçi" End Sub Chú ý: Khi tính tổng của một dãy số bất kỳ, việc khó khăn nhất là phải xác định được số hạng tổng quát Si, sau đó là cận dưới và cận trên của vòng lặp. Còn tổng thì thường tính theo công thức : S = S + Si Bài tập 22 a. Hướng dẫn: Trước hết cần khai báo một mảng nguyên, sau đó hỏi người dùng xem muốn nhập bao nhiêu số và sử dụng vòng lặp để tiến hành nhập dữ liệu cho mảng. Để tìm số lớn nhất, thông thường ta giả định là phần tử đầu tiên. Sau đó dùng vòng lặp để duyệt qua các phần tử còn lại và so sánh, nếu số đang xét lớn hơn số giả định thì ta lại thay đổi giá trị của số giả định bằng phần tử đang xét. b. Chương trình mẫu: Private Sub Form_Load() Dim i As Integer, N As Integer Dim MAX As Integer Dim A(100) As Integer 'Khai b¸o m¶ng A cã 101 phÇn tö '///////// NhËp sè phÇn tö n N = InputBox("B¹n cÇn nhËp bao nhiªu sè: ") Trang 19
  20. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 For i = 1 To N A(i) = InputBox("NhËp vµo sè thø " & i) Next '/////// T×m sè lín nhÊt trong N sè võa nhËp /////////////////////// MAX = A(1) '///Gi¶ ®Þnh phÇn tö lín nhÊt lμ phÇn tö A(1) For i = 1 To N If A(i) > MAX Then MAX = A(i) Next MsgBox "PhÇn tö lín nhÊt lµ : " & MAX End Sub C. Ghi chú: ở trên chúng ta đã khai báo mảng A(100) và như vậy phần tử đầu tiên là A(0), nhưng khi nhập ta lại cho i chạy từ 1, tức là không sử dụng phần tử A(0). Đây là thói quen sử dụng của mỗi người. Bạn có thể sử dụng A(0) hay không là tuỳ, còn nếu sử dụng A(0) thì vòng lặp trên sẽ có dạng : For i= 0 to N - 1 .... Bài tập 23 a. Hướng dẫn: Cần phải tìm ra số lớn nhất, kí hiệu là MAX, sau đó hiển thị những phần tử có giá trị bằng với MAX vừa tìm được. b. Chương trình mẫu: Private Sub Form_Load() Dim i As Integer, MAX As Integer Dim DS(100) As Integer, N As Integer '/// NhËp c¸c sè N = InputBox("NhËp sè phÇn tö : ") For i = 1 To N DS(i) = InputBox("NhËp sè thø " & i) Next '/// T×m sè lín nhÊt c¸c sè võa nhËp MAX = DS(1) For i = 1 To N If MAX < DS(i) Then MAX = DS(i) Next '/// HiÓn thÞ nh÷ng phÇn tö b»ng víi MAX (chÝnh lµ nh÷ng ptö lín nhÊt) For i = 1 To N If DS(i) = MAX Then Debug.Print DS(i) Next End Sub C. Ghi chú: • Có thể áp dụng để giải bài toán tìm số nhỏ nhất, in ra các số nhỏ nhất v.v… • Trong danh sách không phải chỉ có duy nhất một phần tử lớn nhất (nhỏ nhất) Bài tập 24 a. Hướng dẫn: Để sắp xếp một dãy số A có N phần tử ta tiến hành như sau: • Bắt đầu từ phần tử đầu tiên Trang 20
Đồng bộ tài khoản