Tìm hiểu các giải thuật sắp xếp dãy 8 giải thuật: - Sắp xếp kiểu chọn Selection Sort - Sắp xếp nổi bọt Bubble Sort - Sắp xếp kiểu chèn Insertion Sort - Sắp xếp kiểu phân đoạn Quick sort
Trang 1Project I CHỦ ĐỀ: GIẢI THUẬT VÀ LẬP TRÌNH C
Lớp: KTMT&TT1-K54 Thời gian: 15 tuần (Tuần 2-16)
Bài 1 Giải thuật Sắp xếp (Sorting Algorithms)
1 Tìm hiểu các giải thuật sắp xếp dãy (8 giải thuật):
- Sắp xếp kiểu chọn (Selection Sort)
- Sắp xếp nổi bọt (Bubble Sort)
- Sắp xếp kiểu chèn (Insertion Sort)
- Sắp xếp kiểu phân đoạn (Quick sort)
- Sắp xếp kiểu vun đống (Heap Sort)
- Sắp xếp trộn (Merge Sort)
- Sắp xếp bằng phép đếm phân phối (Distribution Counting)
- Sắp xếp bằng cơ số (Radix Sort): Theo kiểu hoán vị các khóa (Radix Exchange Sort) và sắp xếp
cơ số trực tiếp (Straight Radix Sort)
2 Cài đặt các giải thuật sắp xếp trên (Viết chương trình C)
- Dữ liệu vào trong file văn bản SORT.INP chứa không nhiều hơn 106 khoá và giá trị mỗi khoá
là số tự nhiên không quá 106 Kết quả được ghi ra file văn bản SORT.OUT chứa dãy khoá được sắp, mỗi khoá trên một dòng
- Chương trình có giao diện dưới dạng menu, mỗi chức năng tương ứng với một thuật toán sắp xếp (Gọi các chương trình con)
- Đánh giá, nhận xét về độ phức tạp của các giải thuật sắp xếp trên
Trang 2Bài 2 Cấu trúc dữ liệu danh sách
1 Tìm hiểu về cấu trúc dữ liệu danh sách (nối đơn, nối kép, nối vòng) Các kỹ thuật xử lý (duyệt,
thêm/bớt phần tử, tìm kiếm)
2 Thực hành viết chương trình C giải bài toán sau:
Lập chương trình quản lý danh sách sinh viên, tuỳ chọn loại danh sách cho phù hợp, chương trình có những chức năng sau: (Hồ sơ một sinh viên giả sử có: Tên, lớp, số điện thoại, điểm
TB …)
- Cho phép nhập danh sách sinh viên từ bàn phím hay từ file
- Cho phép in ra danh sách sinh viên gồm có tên và xếp loại
- Cho phép in ra danh sách sinh viên gồm các thông tin đầy đủ
- Cho phép nhập vào từ bàn phím một tên sinh viên và một tên lớp, tìm xem có sinh viên
có tên nhập vào trong lớp đó không ? Nếu có thì in ra số điện thoại của sinh viên đó
- Cho phép vào một hồ sơ sinh viên mới từ bàn phím, bổ sung sinh viên đó vào danh sách sinh viên, in ra danh sách mới
- Cho phép nhập vào từ bàn phím tên một lớp, loại bỏ tất cả các sinh viên của lớp đó khỏi danh sách, in ra danh sách mới
- Có chức năng sắp xếp danh sách sinh viên theo thứ tự giảm dần của điểm trung bình
- Cho phép nhập vào hồ sơ một sinh viên mới từ bàn phím, chèn sinh viên đó vào danh sách mà không làm thay đổi thứ tự đã sắp xếp, in ra danh sách mới
- Cho phép lưu trữ lại trên đĩa danh sách sinh viên khi đã thay đổi
Trang 3Bài 3 Cấu trúc dữ liệu ngăn xếp (stack) hàng đợi (queue):
1 Tìm hiểu cấu trúc dữ liệu ngăn xếp, hàng đợi Các kỹ thuật xử lý trên ngăn xếp, hàng đợi
2 Vận dụng viết chương trình C giải bài toán sau:
- Hình vẽ mô tả di chuyển các toa tàu tại một ga xe lửa:
- Ban đầu ở đường ray A chứa các toa tàu đánh số từ 1 tới n theo thứ tự từ trái qua phải, người ta muốn chuyển các toa đó sang đường ray C để được một thứ tự mới là một hoán vị của (1, 2, …, n) theo quy tắc: chỉ được đưa các toa tàu chạy theo đường ray theo hướng mũi tên, có thể dùng đoạn đường ray B để chứa tạm các toa tàu trong quá trình di chuyển
a) Hãy nhập vào hoán vị cần có, cho biết có phương án chuyển hay không, và nếu có hãy đưa ra cách chuyển:
Ví dụ: n = 4; Thứ tự cần có (1, 4, 3, 2)
1)A → C; 2)A → B; 3)A → B; 4)A → C; 5)B → C; 6)B → C
b) Những hoán vị nào của thứ tự các toa là có thể tạo thành trên đoạn đường ray C với luật di chuyển như trên
Bài 4 Cấu trúc dữ liệu cây (Tree) Biểu thứ tiền tố, hậu tố.
- Tìm hiểu về cấu trúc dữ liệu cây (Tree) và các kỹ thuật xử lý
- Tìm hiểu ký pháp tiền tố, trung tố, hậu tố
- Viết chương trình C tính giá trị của một biểu thức:
Input: File văn bản CAL.INP chỉ gồm 1 dòng có không quá 255 ký tự, là một biểu thức số học
dạng trung tố chứa các số thực và các toán tử {(, ), +, -, *, /}
Output: File văn bản CAL.OUT chứa:
- Dạng hậu tố của biểu thức
- Dạng tiền tố của biểu thức
- Kết quả biểu thức đó
Bài 5 Kỹ thuật nhánh cận, bài toán người du lịch
Cho n thành phố đánh số từ 1 đến n và m tuyến đường giao thông hai chiều giữa chúng, mạng lưới giao thông này được cho bởi bảng C cấp nxn, ở đây C[i, j] = C[j, i] = Chi phí đi đoạn đường trực tiếp từ thành phố i đến thành phố j Giả thiết rằng C[i, i] = 0 với ∀i, C[i, j] = +∞ nếu không có đường trực tiếp từ thành phố i đến thành phố j
Một người du lịch xuất phát từ thành phố 1, muốn đi thăm tất cả các thành phố còn lại mỗi thành phố đúng 1 lần và cuối cùng quay lại thành phố 1 Hãy chỉ ra cho người đó hành trình với chi phí ít nhất Bài toán đó gọi là bài toán người du lịch hay bài toán hành trình của một thương gia (Traveling Salesman)
Trang 4Viết chương trình C giải bài toán này với yêu cầu:
Input: file văn bản TOURISM.INP
Dòng 1: Chứa số thành phố n (1 ≤ n ≤ 100) và số tuyến đường m trong mạng lưới giao thông
m dòng tiếp theo, mỗi dòng ghi số hiệu hai thành phố có đường đi trực tiếp và chi phí đi trên quãng đường đó (chi phí này là số nguyên dương ≤ 10000)
Output: file văn bản TOURISM.OUT, ghi hành trình tìm được Minh họa:
Bài 6 Bài toán qui hoạch động, bài toán cái túi.
Trong siêu thị có n gói hàng (n ≤ 100), gói hàng thứ i có trọng lượng là W[i] ≤ 100 và trị giá V[i] ≤ 100 Một tên trộm đột nhập vào siêu thị, tên trộm mang theo một cái túi có thể mang được tối đa trọng lượng M ( M ≤ 100) Hỏi tên trộm sẽ lấy đi những gói hàng nào để được tổng giá trị lớn nhất
Viết chương trình giải bài toán trên với yêu cầu:
Input: file văn bản BAG.INP
Dòng 1: Chứa hai số n, M cách nhau ít nhất một dấu cách
n dòng tiếp theo, dòng thứ i chứa hai số nguyên dương W[i], V[i] cách nhau ít nhất một dấu cách
Output: file văn bản BAG.OUT
Dòng 1: Ghi giá trị lớn nhất tên trộm có thể lấy
Dòng 2: Ghi chỉ số những gói bị lấy
Bài 7 Thuật toán Dijkstra tìm đường đi ngắn nhất
Có n thành phố (đánh số 1,2,…n) Sơ đồ mạng lưới giao thông của n thành phố cho bởi ma trận A[i,j] trong đó:
- A[i,j] là độ dài đường đi từ thành phố i đến thành phố j
- A[i,j] = ∞ nếu không có đường đi từ thành phố i đến thành phố j
- A[i,j] nguyên, không âm
Trang 5- Có thể tồn tại đường một chiều hoặc 2 chiều giữa 2 thành phố i, j (Nếu không có chiều từ i đến
j thì A[i,j]= ∞, nhưng có chiều từ j đến i thì A[j,i] = c)
Hãy xác định đường đi ngắn nhất từ thành phố s đến thành phố f
Input: File văn bản MINPATH.INP với nội dung:
- Dòng đầu ghi số n là thành phố (0<n<100), số cung đường m, đỉnh s, đỉnh f Mỗi giá trị cách nhau ít nhất một dấu cách
- m dòng tiếp theo mỗi dòng chứa 3 giá trị i, j, A[i,j] (Cách nhau ít nhất một dấu cách) Cho biết khoảng cách A[i,j] của đường đi từ thành phố i đến thành phố j
Output: File văn bản MINPATH.OUT chứa đường đi ngắn nhất từ đỉnh s đến f và giá trị đường
đi ngắn nhất tìm được Minh họa:
Cách đánh giá:
thuyết, giải thuật cài đặt, kết quả thử nghiệm chương trình)