Có một tập tiếng Việt chứa n từ cụm từ xếp lộn xộn


Sách bài tập Tin học 11 Bài 8: Lập trình một số thuật toán sắp xếp - Cánh diều

Câu Fcs35 trang 59 SBT Tin học 11: Sắp xếp tiếng Việt

Có một tập tiếng Việt chứa n từ (cụm từ) xếp lộn xộn. Em hãy viết chương trình sắp xếp lại n từ (cụm từ) đó theo thứ tự từ điển tiếng Việt để dễ tra cứu.

Dữ liệu: Nhập từ tệp danhsach.txt:

• Dòng đầu tiên chứa số nguyên dương n.

• n dòng sau, mỗi dòng là một xâu biểu thị từ hoặc cụm từ tiếng Việt. Kết quả: Đưa ra tệp Tudien.out:

Gồm n dòng, dòng thứ i in ra từ hoặc cụm từ thứ i theo thứ tự từ điển.

Có một tập tiếng Việt chứa n từ cụm từ xếp lộn xộn

Lời giải:

Để so sánh thứ tự từ điển của các xâu tiếng Việt, em không thể dùng các phép toán so sánh “<, >, ...” như bình thường, vì trên bảng mã Unicode, các kí tự có dấu sẽ đứng sau 26 kí tự Latinh không dấu trong bảng ASCII. Vì vậy, em sẽ sử dụng thư viện locale là một thư viện chuyên dùng để xử quy chuẩn của các ngôn ngữ.

Em khai báo thư viện locale, sau đó khai báo sử dụng ngôn ngữ tiếng Việt bằng câu lệnh: locale.setlocale(locale.LC_ALL, "vi_VN"). Thư viện này cho phép ta dùng hai hàm như sau:

• locale.strcoll(s1, s2) : so sánh hai xâu và trả về:

– Một số âm nếu s1 đứng trước s2.

- Số 0, nếu s1 giống hệt s2.

– Một số dương nếu s2 đứng trước s1.

locale.strxfrm(s): chuyển đổi một xâu s thành một con số để thuận tiện cho việc so sánh thứ tự.

Câu lệnh locale.strcoll(s1, s2)có thể được viết thành biểu thức locale.strxfrm (s1) < locale.strxfrm (s2).

Trong bài này, đầu tiên em khai báo nhập xuất tệp (phải để mã hoá bằng UTF-8) và sử dụng thư viện locale với ngôn ngữ là tiếng Việt (mã vi_VN hoặc vi). Sau đó, em tạo mảng các xâu s rồi nhập n, tiếp theo em lần lượt nhập n dòng rồi cho vào mảng s. Cuối cùng, em sắp xếp mảng s sau cho strxfrm ( ) của các xâu trong mảng s theo chiều hướng tăng dần (có thể dùng hàm sort với cú pháp như ở dưới) và in ra kết quả.

Chương trình mẫu:

import sys

sys.stdin = open("danhsach.txt", "r", encoding="utf8") sys.stdout open ("Tudien.txt", "w", encoding="utf8") import locale

locale.setlocale (locale. LC ALL, "vi_VN")

n=int (input())

s=[]for i in range (n):

s.append(input())

s.sort (key=locale.strxfrm) for x in s:

print (x)

Lời giải SBT Tin 11 Bài 8: Lập trình một số thuật toán sắp xếp hay khác:

Xem thêm các bài giải sách bài tập Tin học lớp 11 Cánh diều hay, chi tiết khác: