Phạm vi: Mảng; tìm kiếm; sắp xếp đơn giản; kiểm thử và đánh giá chương trình; tạo lập CSDL; bảng có khóa ngoài; cập nhật và truy xuất dữ liệu.
Phần 1: Cơ bản
Bài 1. Nêu ý tưởng thuật toán sắp xếp nổi bọt.
Bài 2. Nêu ý tưởng thuật toán sắp xếp chọn.
Bài 3. Cho mảng a = [3, 1, 2]. Thực hiện một lượt sắp xếp nổi bọt, mảng trở thành gì?
Bài 4. Cho mảng a = [4, 2, 5, 1]. Sau lượt đầu tiên của sắp xếp chọn, mảng trở thành gì?
Bài 5. Kiểm thử chương trình nhằm mục đích gì?
Bài 6. Nêu hai loại lỗi thường gặp trong chương trình và cho ví dụ mỗi loại.
Bài 7. Viết câu lệnh SQL tạo bảng HocSinh gồm các trường MaHS (văn bản, khóa chính), HoTen (văn bản), NgaySinh (ngày).
Bài 8. Viết câu lệnh SQL thêm một học sinh vào bảng HocSinh.
Bài 9. Cho mảng a = [2, 6, 1, 9]. Viết đoạn chương trình tính tổng các phần tử.
Bài 10. Trong SQL, JOIN ... ON dùng để làm gì?
Bài 11. Cho hai bảng TacGia(MaTG, TenTG) và Sach(MaSach, TenSach, MaTG). Hãy chỉ rõ khóa ngoại trong bảng Sach.
Bài 12. Viết câu lệnh SQL liệt kê tên sách và tên tác giả (kết nối hai bảng).
Bài 13. Cho mảng a = [5, 3, 8, 1]. Tìm kiếm tuần tự giá trị 8 cần bao nhiêu lần so sánh?
Bài 14. Nêu một tiêu chí đánh giá chương trình ngoài tính đúng đắn.
Bài 15. Viết câu lệnh SQL cập nhật tên lớp của học sinh HS02 thành "11A2".
Bài 16. Viết chương trình Python nhập một số nguyên n và in ra "Chẵn" nếu n chẵn, "Lẻ" nếu n lẻ.
Bài 17. Khi kiểm thử, vì sao cần test cả trường hợp biên (ví dụ: mảng rỗng, mảng một phần tử)?
Bài 18. Viết câu lệnh SQL xóa các cuốn sách có năm xuất bản nhỏ hơn 2000 khỏi bảng Sach (giả sử bảng có trường NamXuatBan).
Phần 2: Nâng cao
Bài 19. Viết chương trình Python sắp xếp mảng một chiều tăng dần bằng thuật toán sắp xếp nổi bọt, in mảng sau mỗi lượt.
Bài 20. Viết chương trình Python sắp xếp mảng một chiều tăng dần bằng thuật toán sắp xếp chọn, in mảng sau mỗi lượt.
Bài 21. Một chương trình tính tổng các số từ 1 đến n. Hãy đề xuất 4 test case (dữ liệu vào, kết quả mong đợi), gồm ít nhất một trường hợp biên và một trường hợp đặc biệt.
Bài 22. Cho bảng Diem(MaHS, MonHoc, DiemSo) và HocSinh(MaHS, HoTen). Viết câu lệnh SQL tính điểm trung bình môn "Tin học" của tất cả học sinh.
Bài 23. Viết chương trình Python nhập mảng hai chiều, in ra tổng các phần tử trên đường chéo chính (mảng vuông).
Bài 24. Cho chương trình tìm giá trị lớn nhất trong mảng. Hãy đề xuất 4 test case (dữ liệu vào, kết quả mong đợi), gồm ít nhất một trường hợp biên và một trường hợp đặc biệt.
Bài 25. Cho hai bảng KhachHang(MaKH, TenKH) và DonHang(MaDH, NgayDat, MaKH). Viết câu lệnh SQL liệt kê mã đơn hàng, ngày đặt và tên khách hàng, sắp xếp theo ngày đặt tăng dần.
Bài 26. Một bảng HocSinh có khóa ngoại MaLop tham chiếu tới bảng Lop. Giải thích vì sao không thể xóa một lớp vẫn còn học sinh (khi chưa thiết lập xóa lan truyền).
Đáp án
Bài 1. So sánh và đổi chỗ các cặp phần tử kề nhau chưa đúng thứ tự, lặp lại cho đến khi mảng đã sắp xếp.
Bài 2. Mỗi lượt tìm phần tử nhỏ nhất trong phần chưa sắp xếp và đưa về đúng vị trí.
Bài 3. So sánh 3–1 đổi chỗ → [1, 3, 2]; so sánh 3–2 đổi chỗ → [1, 2, 3]. Sau một lượt: [1, 2, 3].
Bài 4. Min của [4, 2, 5, 1] là 1 → đổi chỗ 4 và 1 → [1, 2, 5, 4].
Bài 5. Phát hiện lỗi và kiểm tra chương trình có đáp ứng yêu cầu hay không.
Bài 6. Ví dụ: lỗi cú pháp — thiếu dấu hai chấm sau if; lỗi logic — dùng + thay vì * nên kết quả sai nhưng chương trình vẫn chạy.
Bài 7.
CREATE TABLE HocSinh (
MaHS TEXT PRIMARY KEY,
HoTen TEXT,
NgaySinh DATE
);
Bài 8. INSERT INTO HocSinh (MaHS, HoTen, NgaySinh) VALUES ('HS01', 'An', '2010-05-01');
Bài 9.
a = [2, 6, 1, 9]
print(sum(a)) # 18
Bài 10. Kết nối hai bảng dựa trên điều kiện liên kết (thường là khóa ngoại = khóa chính) để truy xuất dữ liệu từ cả hai bảng.
Bài 11. Khóa ngoại trong bảng Sach là MaTG, tham chiếu tới TacGia(MaTG).
Bài 12.
SELECT Sach.TenSach, TacGia.TenTG FROM Sach
JOIN TacGia ON Sach.MaTG = TacGia.MaTG;
Bài 13. So sánh với 5, 3, 8 → 3 lần.
Bài 14. Ví dụ: hiệu quả (thời gian chạy, bộ nhớ), tính dễ đọc, dễ bảo trì, tính thân thiện với người dùng.
Bài 15. UPDATE HocSinh SET Lop = '11A2' WHERE MaHS = 'HS02'; (giả sử bảng có trường Lop).
Bài 16.
n = int(input("Nhập n: "))
print("Chẵn" if n % 2 == 0 else "Lẻ")
Bài 17. Vì các trường hợp biên thường là nơi dễ phát sinh lỗi (ví dụ: truy cập phần tử không tồn tại, chia cho 0, vòng lặp không chạy).
Bài 18. DELETE FROM Sach WHERE NamXuatBan < 2000;
Bài 19.
a = [5, 2, 4, 1]
n = len(a)
for i in range(n - 1):
for j in range(n - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
print("Sau lượt", i + 1, ":", a)
print("Kết quả:", a)
Bài 20.
a = [5, 2, 4, 1]
n = len(a)
for i in range(n):
vi_tri_min = i
for j in range(i + 1, n):
if a[j] < a[vi_tri_min]:
vi_tri_min = j
a[i], a[vi_tri_min] = a[vi_tri_min], a[i]
print("Sau lượt", i + 1, ":", a)
print("Kết quả:", a)
Bài 21. Ví dụ: (1) n = 5 → 15. (2) n = 1 → 1 (trường hợp biên). (3) n = 0 → 0 (trường hợp biên). (4) n = −3 → báo lỗi hoặc 0 tùy thiết kế (trường hợp đặc biệt: n không hợp lệ).
Bài 22.
SELECT AVG(DiemSo) FROM Diem WHERE MonHoc = 'Tin học';
Bài 23.
n = int(input("Nhập n: "))
a = [[int(input(f"Nhập a[{i}][{j}]: ")) for j in range(n)] for i in range(n)]
print("Tổng đường chéo chính:", sum(a[i][i] for i in range(n)))
Bài 24. Ví dụ: (1) [3, 9, 2] → 9. (2) [7] → 7 (trường hợp biên: một phần tử). (3) [-5, -1, -8] → −1 (trường hợp đặc biệt: toàn số âm). (4) [4, 4, 4] → 4 (trường hợp đặc biệt: các phần tử bằng nhau).
Bài 25.
SELECT DonHang.MaDH, DonHang.NgayDat, KhachHang.TenKH
FROM DonHang JOIN KhachHang ON DonHang.MaKH = KhachHang.MaKH
ORDER BY DonHang.NgayDat ASC;
Bài 26. Vì sẽ vi phạm toàn vẹn tham chiếu: các bản ghi học sinh đang tham chiếu tới lớp đó sẽ trở thành "mồ côi", không còn lớp tương ứng. Hệ quản trị CSDL ngăn xóa để bảo vệ tính nhất quán dữ liệu, trừ khi đã thiết lập xóa lan truyền (xóa cả các học sinh liên quan).
