Phạm vi: Mảng một chiều, hai chiều; bài toán tìm kiếm; quản trị CSDL; tạo lập bảng; khóa chính, khóa ngoài; cập nhật và truy xuất dữ liệu.
Phần 1: Cơ bản
Bài 1. Cho danh sách a = [4, 7, 2, 9]. Viết câu lệnh in phần tử thứ hai (chỉ số 1).
Bài 2. Nêu ý tưởng thuật toán tìm kiếm tuần tự.
Bài 3. Điều kiện để áp dụng tìm kiếm nhị phân là gì?
Bài 4. Cho danh sách đã sắp xếp a = [1, 4, 6, 9, 12]. Mô tả bước đầu tiên khi tìm kiếm nhị phân giá trị 9.
Bài 5. Viết câu lệnh SQL thêm một học sinh có mã HS10, tên "Bình", lớp 11A1 vào bảng HocSinh.
Bài 6. Viết câu lệnh SQL liệt kê họ tên tất cả học sinh lớp 11A1.
Bài 7. Cho mảng a = [5, 1, 8]. Viết đoạn chương trình in ra mảng sau khi sắp xếp tăng dần (dùng hàm có sẵn).
Bài 8. Khóa ngoại là gì? Nêu một ví dụ.
Bài 9. Viết câu lệnh SQL cập nhật điểm môn "Toán" của học sinh HS01 thành 8.
Bài 10. Cho mảng hai chiều a = [[1, 2], [3, 4]]. Viết đoạn chương trình in tổng tất cả các phần tử.
Bài 11. Trong Python, a.append(x) và a.insert(0, x) khác nhau như thế nào?
Bài 12. Nêu một lý do cần sao lưu cơ sở dữ liệu.
Bài 13. Cho bảng Sach(MaSach, TenSach, Gia). Viết câu lệnh SQL liệt kê tên và giá các sách có giá lớn hơn 100000.
Bài 14. Viết chương trình Python đếm số phần tử chẵn trong mảng [2, 5, 8, 3, 6].
Bài 15. Khi nào cần dùng mảng hai chiều thay vì mảng một chiều? Nêu một ví dụ.
Bài 16. Viết câu lệnh SQL xóa học sinh có mã HS05 khỏi bảng HocSinh.
Bài 17. Cho danh sách a = [3, 1, 4, 1, 5]. Tìm kiếm tuần tự giá trị 4 cần bao nhiêu lần so sánh?
Bài 18. Nêu một điểm khác nhau giữa câu lệnh UPDATE và DELETE trong SQL.
Phần 2: Nâng cao
Bài 19. Viết chương trình Python nhập mảng một chiều gồm n số nguyên, in ra mảng sau khi xóa tất cả các phần tử bằng 0.
Bài 20. Cho danh sách đã sắp xếp a = [2, 5, 8, 11, 16, 21]. Mô tả đầy đủ các bước tìm kiếm nhị phân giá trị 11.
Bài 21. Viết chương trình Python nhập mảng hai chiều m hàng × n cột, in ra hàng có tổng lớn nhất và tổng đó.
Bài 22. Cho hai bảng Lop(MaLop, TenLop) và HocSinh(MaHS, HoTen, MaLop). Viết câu lệnh SQL liệt kê họ tên học sinh cùng tên lớp, chỉ lấy học sinh lớp có tên "11A1".
Bài 23. Viết chương trình Python tìm giá trị nhỏ nhất và lớn nhất trong mảng hai chiều bất kỳ.
Bài 24. Một bảng Diem có khóa ngoại MaHS tham chiếu tới bảng HocSinh. Giải thích điều gì xảy ra nếu cố gắng thêm một bản ghi điểm với MaHS không tồn tại trong bảng HocSinh.
Bài 25. Viết chương trình Python sắp xếp mảng một chiều theo thứ tự giảm dần mà không dùng hàm sort() (gợi ý: dùng sắp xếp chọn hoặc nổi bọt).
Bài 26. Cho bảng SanPham(MaSP, TenSP, Gia) và DonHang(MaDH, MaSP, SoLuong). Viết câu lệnh SQL liệt kê tên sản phẩm, số lượng và thành tiền (Gia × SoLuong) của các đơn hàng.
Đáp án
Bài 1. print(a[1]) → 7.
Bài 2. Duyệt lần lượt từng phần tử từ đầu đến cuối, so sánh với giá trị cần tìm; dừng khi tìm thấy hoặc đã duyệt hết.
Bài 3. Danh sách phải đã được sắp xếp (thường là tăng dần).
Bài 4. Phần tử giữa là 6 (vị trí thứ 3). So sánh 9 > 6 nên tiếp tục tìm ở nửa phải [9, 12].
Bài 5. INSERT INTO HocSinh (MaHS, HoTen, Lop) VALUES ('HS10', 'Bình', '11A1');
Bài 6. SELECT HoTen FROM HocSinh WHERE Lop = '11A1';
Bài 7.
a = [5, 1, 8]
print(sorted(a)) # [1, 5, 8]
Bài 8. Khóa ngoại là trường trong một bảng tham chiếu tới khóa chính của bảng khác. Ví dụ: MaLop trong bảng HocSinh tham chiếu tới MaLop của bảng Lop.
Bài 9. UPDATE Diem SET DiemSo = 8 WHERE MaHS = 'HS01' AND MonHoc = 'Toán';
Bài 10.
a = [[1, 2], [3, 4]]
print(sum(sum(hang) for hang in a)) # 10
Bài 11. append(x) thêm x vào cuối danh sách; insert(0, x) chèn x vào vị trí đầu tiên (chỉ số 0).
Bài 12. Ví dụ: để khôi phục dữ liệu khi ổ cứng hỏng, xóa nhầm hoặc cập nhật sai.
Bài 13. SELECT TenSach, Gia FROM Sach WHERE Gia > 100000;
Bài 14.
a = [2, 5, 8, 3, 6]
dem = sum(1 for x in a if x % 2 == 0)
print(dem) # 3
Bài 15. Khi dữ liệu có cấu trúc bảng (hàng × cột), ví dụ: bảng điểm của học sinh theo môn, ma trận, bàn cờ.
Bài 16. DELETE FROM HocSinh WHERE MaHS = 'HS05';
Bài 17. So sánh với 3 (khác), 1 (khác), 4 (bằng) → 3 lần so sánh.
Bài 18. UPDATE sửa dữ liệu của bản ghi đã có; DELETE xóa bản ghi khỏi bảng.
Bài 19.
n = int(input("Nhập n: "))
a = [int(input(f"Nhập phần tử {i + 1}: ")) for i in range(n)]
a = [x for x in a if x != 0]
print(a)
Bài 20. Danh sách [2, 5, 8, 11, 16, 21], tìm 11: so sánh với phần tử giữa 8 → 11 > 8, tìm ở nửa phải [11, 16, 21]; so sánh với phần tử giữa 16 → 11 < 16, tìm ở nửa trái [11]; so sánh với 11 → bằng, tìm thấy. Tổng 3 lần so sánh.
Bài 21.
m = int(input("Nhập số hàng m: "))
n = int(input("Nhập số cột n: "))
a = [[int(input(f"Nhập a[{i}][{j}]: ")) for j in range(n)] for i in range(m)]
tong_max = max(sum(hang) for hang in a)
hang_max = [sum(hang) for hang in a].index(tong_max)
print("Hàng có tổng lớn nhất:", hang_max, "Tổng:", tong_max)
Bài 22.
SELECT HocSinh.HoTen, Lop.TenLop FROM HocSinh
JOIN Lop ON HocSinh.MaLop = Lop.MaLop
WHERE Lop.TenLop = '11A1';
Bài 23.
a = [[3, 9, 1], [7, 2, 8]]
phang = [x for hang in a for x in hang]
print("Nhỏ nhất:", min(phang), "Lớn nhất:", max(phang))
Bài 24. Hệ quản trị CSDL sẽ báo lỗi vi phạm toàn vẹn tham chiếu (khóa ngoại phải tham chiếu tới một bản ghi đã tồn tại) và không cho thêm bản ghi đó.
Bài 25. Ví dụ dùng sắp xếp chọn giảm dần:
a = [3, 1, 4, 2]
for i in range(len(a)):
vi_tri_max = i
for j in range(i + 1, len(a)):
if a[j] > a[vi_tri_max]:
vi_tri_max = j
a[i], a[vi_tri_max] = a[vi_tri_max], a[i]
print(a) # [4, 3, 2, 1]
Bài 26.
SELECT SanPham.TenSP, DonHang.SoLuong, SanPham.Gia * DonHang.SoLuong AS ThanhTien
FROM DonHang JOIN SanPham ON DonHang.MaSP = SanPham.MaSP;
