1 BÀI TẬP LUYỆN THUẬT GIẢI 1. Lệnh if. Giải phương trình bậc 2 với 3 hệ số a, b, c được nhập từ bàn phím. 2. Lệnh switch. Viết chương trình: a) Nhập vào 3 số nguyên tương ứng ngày, tháng, năm của một ngày nào đó. b) Kiểm tra xem ngày nhập vào có hợp lệ hay không? Ví dụ: Nhập ngày: 30, tháng: 2, năm 2009 -> In ra: Tháng 2 năm 2009 tối đa 29 ngày 3. Lệnh lặp. Viết chương trình: a) Nhập một số nguyên n b) In ra giai thừa của n (n! = 1.2.3….n) bằng: 1. Lệnh for 2. Lệnh do … while 3. Lệnh while 4. Dùng đệ quy (recursive) 4. Mảng. Viết chương trình thực hiện các công việc sau: a) Khai báo mảng 10 số nguyên, các phần tử mảng được lấy ngẫu nhiên (1 <= giá trị mỗi phần tử <=100), không lặp lại (Tìm hiểu lớp Math) b) In các phần tử vừa lấy theo thứ tự ngược với thứ tự gán. c) In mảng đã sắp xếp theo thứ tự tăng và giảm d) Kiểm tra mảng có đối xứng? 5. Chuyển đổi hệ đếm a) Nhập vào một số nguyên dương In ra biểu diễn nhị phân và Hexa Decimal của số đó Ví dụ: Nhập n =65; In ra: 65 = (1000001) 2 65 = (41) 16 b) Nhập một số nhị phân, in ra số thập phân tương ứng. VD: (1010) 2 = (10) 10 6. String. Viết chương trình thực hiện các công việc sau: a) Nhập vào một chuỗi b) Đếm sô từ trong chuỗi nhập c) In chuỗi đã chuẩn hóa. Ví dụ: Chuỗi nhập: “ nGuyEN vAN biNh “ Chuỗi chuẩn hóa: “Nguyen Van Binh” d) Kiểm tra xem chuỗi nhập có phải là một danh hiệu (identifier) hợp lệ hay không? CHÚ Ý: Với Java và C# - Mỗi bài là 1 class, mỗi yêu cầu trong bài là 1 method 2 HƯỚNG DẪN GIẢI THUẬT CÁC BÀI TẬP LUYỆN THUẬT GIẢI 1. GIẢI THUẬT GIẢI PTB2 a*x 2 + b*x + c = 0 BEGI N double a, b, c, d, x, x1, x2 Input(a, b, c) a = 0? b = 0? c = 0? Y Y N N N Y d = b*b– 4*a*c d < 0? N d = 0? N Out(“PT VN”) x = - c / b Out(“PT VSN”) Y Out(“PT VN”) x = - b / (2*a) Out(x)Out(x) x1 = (-b + sqrt(d)) / (2*a) x2 = (-b - sqrt(d)) / (2*a) Out(x1, x2) END Y 1. a = 0, b = 0, c = 0 => PTVSN - OK 2. a = 0, b = 0, c = 2 => PTVN - OK 3. a = 0, b = 2, c = 4 => x = - 2 - OK 4. a = 1, b = 2, c = 2 => PTVN (d < 0) 5. a = 1, b = 2, c = 1 => x = -1 (d = 0) 6. a = 1, b = 4, c = 1 => x1 = … (d > 0) x2 = … 3 2. GIẢI THUẬT KIỂM TRA NGÀY NHẬP BEGI N END byte (char) day, month, d max ; int year; d max lưu giữ số ngày max của 1 tháng trong năm Input (year); // year > 0 Input (month); // 0 < month < 13 Input (day); // 0 < day < 32 month month = 1, 3, 5, 7, 8, 10 , 12 month = 4, 6, 9, 11 month = 2 d max = 31 d max = 30 d max = 29 year % 4 == 0 Y d max = 28 N Y day > d max N Y Y Y Output (“Input Date is invalid”) Output (“Input Date is valid”) 4 3. GIẢI THUẬT TÍNH GIAI THỪA BG int i = 0, n; long int result = 1; Input (n) i = 1 i <= n Output (result) i++ Y N EN D n == 0 || 1 result = 1 Y N result = result * i 5 4. GIẢI THUẬT VỀ CÁC THAO TÁC TRÊN MẢNG 6 5. GIẢI THUẬT CHUYỂN ĐỔI HỆ THỐNG SỐ BG int i = 0, n, m, r; int arr_bin[64]; Input (n) m == 0 m = n Y N r = m %2; arr_bin[i++] = r; m = m / 2; i i >= 0 Output (arr_bin[i]) i Y N EN D 7 6. GIẢI THUẬT VỀ CÁC THAO TÁC TRÊN CHUỖI 6.4 Kiểm tra xem chuỗi nhập có phải là một danh hiệu (identifier) hợp lệ hay không? BEGI N END char id[50] , c; int i = 0; String id; char keywords[ ][30] = {“include”, “main”, “if”, “else”, “for”, “do”, “while”, …}; Input (id); // c = id[0]; i = 1; c = id[i]; i++; c = id[i]; (c >= ‘A’ && c <= ‘Z’) || (c >= ‘a’ && c <= ‘z’) || c == ‘_’ || c == Y Y Y N Y Y Y Output (“Id is valid”) Output (“Id is invalid”) Output (“id is invalid”); // i < length(id) (c >= ‘A’ && c <= ‘Z’) || (c >= ‘a’ && c <= ‘z’) || (c >= ‘0’ && c <= ‘9’) || c == ‘_’ N Y Output (“id is invalid”); id == any key words N Y Y END END 8 // Program writen in c# public bool CheckId(string st) { string [] keywords = {"if", "else", "class", "interface", "for", "do", "final"}; // Kiem tra ky tu dau tien int len = st.Length; char[] chars = st.ToCharArray(); char c = chars[0]; if((c <= 'Z' && c >= 'A')||(c <= 'z' && c >= 'a')||(c == '_')||(c == '$')) { for(int i = 1; i < len; i++) { if((c <= 'Z' && c >= 'A')||(c <= 'z' && c >= 'a')||(c == '_')||(c == '$')||(c <= '9' && c >= '0')) { //flag = true; } else{ return false; } } // Kiem tra xem co trung voi keywords? for(int j = 0; j < keywords.Length; j ++) { if(keywords[j].Equals(st)) { Console.WriteLine(st + " trung voi tu khoa."); return false; } } } else{ return false; // st khong phai la danh hieu cua Java } return true; } 9 Giải thích giải thuật in ra tam giác vuông các ‘*’: Số hàng nhập vào h = 4 Biến lặp mỗi lần thay đổi hàng r = 1 -> 4 - Trên mỗi hàng,dùng biến lưu trữ giá trị cột c, lặp với số lần lặp bằng số thứ tự của hàng r, thực hiện in ‘*’ - Khi đến cuối hàng, di chuyển con trỏ xuống hàng dưới int h = 4, r, c; for(r = 1; r < = h; r++) { for(c = 1; c <= r; c++) { printf(“* ”); } printf(“\n”); } * * * * * * * * * * r c 1 1 2 1 2 3 1 2 3 4 1 2 3 4 Số hàng nhập vào h = 4 Biến lặp mỗi lần thay đổi hàng r = 1 -> h - Trên mỗi hàng,dùng biến lưu trữ giá trị cột c, lặp với số lần lặp bằng số thứ tự của hàng r, thực hiện in: giá trị của cột c (STT cột) - Khi đến cuối hàng, di chuyển con trỏ xuống hàng dưới int h = 9, r, c; for(r = 1; r < = h; r++) { for(c = 1; c <= r; c++) { printf(“%d ”, c); } printf(“\n”); } . hay không? CHÚ Ý: Với Java và C# - Mỗi bài là 1 class, mỗi yêu cầu trong bài là 1 method 2 HƯỚNG DẪN GIẢI THUẬT CÁC BÀI TẬP LUYỆN THUẬT GIẢI 1. GIẢI THUẬT GIẢI PTB2 a*x 2 + b*x + c = 0 BEGI N double. 1 BÀI TẬP LUYỆN THUẬT GIẢI 1. Lệnh if. Giải phương trình bậc 2 với 3 hệ số a, b, c được nhập từ bàn phím. 2. Lệnh switch valid”) 4 3. GIẢI THUẬT TÍNH GIAI THỪA BG int i = 0, n; long int result = 1; Input (n) i = 1 i <= n Output (result) i++ Y N EN D n == 0 || 1 result = 1 Y N result = result * i 5 4. GIẢI THUẬT VỀ