Mở rộng bài tập trên như sau.Việc sắp xếp thứ tự phải ưu tiên tính theo tên trước

Giải sách bài tập Tin học 10 Bài 32: Ôn tập lập trình Python

Câu 32.8 trang 67 SBT Tin học 10: Mở rộng bài tập trên như sau:

- Việc sắp xếp thứ tự phải ưu tiên tính theo tên trước, rồi đến họ, rồi đến đệm.

- Sắp xếp theo thứ tự của bảng chữ cái tiếng Việt.

Lưu ý: Bảng chữ cái tiếng Việt (bao gồm cả dấu thanh) được sắp xếp theo thứ tự sau:

AÀÁẢÃẠĂẰẮẲẴẶÂẤẨẪẬBCDĐEÈÉẺẼẸÊỀẾỂỄỆGHIÌÍỈĨỊJKLMNOÒÓỎÕỌƠỚỞỠỢÔỒỐỔỖỘPQRSTUÙÚỦŨỤƯỪỨỬỮỰVXXYỲÝỶỸỴaàáảãạăằắẳẵặâấẩẫậbcdđeèéẻẽẹêềếểễệghiìíỉĩịjklmnoòóỏõọơớởỡợôồốổỗộpqrstuùúủũụưừứửữựvxxyỳýỷỹỵ.

Quảng cáo

Lời giải:

Để làm được bài tập này chúng ta cần thiết kế cơ chế so sánh từ điển tiếng Việt giữa hai xâu bất kì. Cách làm là đưa ra một từ điển Alphabet bao gồm các chữ cái tiếng Việt theo đúng thứ tự. Việc so sánh theo thứ tự từ điển được thực hiện bởi hàm so_sanh(s1, s2). Hàm này có ý nghĩa như sau:

Giá trị hàm trả lại: Bằng 0, nếu s1 = s2.

Bằng 1, nếu s1 > s2.

Bằng -1, nếu s1 < s2.

Sau khi đã định nghĩa được thứ tự từ điển mới thì các bước tiếp theo là khá dễ dàng.

Chương trình có thể viết như sau:

Alphabet = " AÀÁẢÃẠĂẰẮẲẴẶÂẤẨẪẬBCDĐEÈÉẺẼẸÊỀẾỂỄỆGHIÌÍỈĨỊJKLMN\ OÒÓỎÕỌƠỚỞỠỢÔỒỐỔỖỘPQRSTUÙÚỦŨỤƯỪỨỬỮỰVXXYỲÝỶỸỴ\ aàáảãạăằắẳẵặâấẩẫậbcdđeèéẻẽẹêềếểễệghiìíỉĩịjklmn\ oòóỏõọơớởỡợôồốổỗộpqrstuùúủũụưừứửữựvxxyỳýỷỹỵ."

MAX = 30

def so_sanh(s1, s2):

 m = min(len (s1), len(s2))

 kq = 0

 k = 0

 while k < m and kq == 0:

  ch1, ch2 = s1[k], s2[k]

  if Alphabet.index(ch1) < Alphabet.index(ch2):

   kq = -1

   return -1

  if Alphabet.index(ch1) > Alphabet.index(ch2):

   kq = 1

   return 1

  k = k + 1

 if len(s1) < len(s2):

  return -1

 elif len(s1) > len(s2):

  return 1

 else:

  return 0

def tach_ten(hoten):

 sline = hoten.split()

 return sline[len(sline)-1]

def space(k):

 return " "*k

def transform(A):

 B = []

 for s in A:

  ten = tach_ten(s)

  tenmoi = ten + space(MAX - len(ten)) + s

  B.append(tenmoi)

 return B

def sap_xep(A):

 hs = A.copy( )

 B = transform(A)

 for i in range(1, len(B)):

  j = i

  while j > 0 and so_sanh (B[j],B[j-1]) == -1:

   B[j],B[j-1] = B[j-1],B[j]

   hs[j],hs[j-1] = hs[j-1],hs[j]

   j = j-1

 return hs

# Chương trình chính

A = []

n = int(input("Nhập số học sinh của lớp: "))

for k in range(n):

 hoten = input("Nhập tên học sinh thứ "+str(k+1)+": ")

 A.append(hoten)

hs = sap_xep(A)

print("Danh sách học sinh trong lớp: ")

for s in hs:

 print(s) 

Quảng cáo


Xem thêm các bài giải sách bài tập Tin học lớp 10 Kết nối tri thức hay, ngắn gọn khác:

Tủ sách VIETJACK shopee lớp 10-11 cho học sinh và giáo viên (cả 3 bộ sách):

Săn shopee siêu SALE :

ĐỀ THI, GIÁO ÁN, GÓI THI ONLINE DÀNH CHO GIÁO VIÊN VÀ PHỤ HUYNH LỚP 10

Bộ giáo án, bài giảng powerpoint, đề thi dành cho giáo viên và gia sư dành cho phụ huynh tại https://tailieugiaovien.com.vn/ . Hỗ trợ zalo VietJack Official

Tổng đài hỗ trợ đăng ký : 084 283 45 85

Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng....miễn phí. Tải ngay ứng dụng trên Android và iOS.

Theo dõi chúng tôi miễn phí trên mạng xã hội facebook và youtube:

Nếu thấy hay, hãy động viên và chia sẻ nhé! Các bình luận không phù hợp với nội quy bình luận trang web sẽ bị cấm bình luận vĩnh viễn.


Giải bài tập lớp 10 Kết nối tri thức khác
Tài liệu giáo viên