Toptailieu.vn biên soạn và giới thiệu lời giải SBT Tin học 11 (Cánh diều) Bài 8: Lập trình một số thuật toán sắp xếp hay, chi tiết sẽ giúp học sinh dễ dàng trả lời câu hỏi sách bài tập Tin học 11 Bài 8 từ đó học tốt môn Tin học 11.
SBT Tin học 11 (Cánh diều) Bài 8: Lập trình một số thuật toán sắp xếp
Lời giải:
Số lượng nghịch thế đạt giá trị lớn nhất khi dãy 4 đã được sắp sẵn theo thứ tự giảm dần. Khi đó, số lượng nghịch thế của A là:
Câu Fcs32 trang 57 SBT Tin học 11: Phân loại hoá chất
Bằng một chiếc cân chính xác, em đã lấy ra được khối lượng của n lọ đó, là dãy số a, a, a,........,
a, n-1'
Yêu cầu: Em hãy lập trình để kiểm tra trong n lọ này chứa bao nhiêu chất
khác nhau.
Dữ liệu: Nhập từ thiết bị vào chuẩn:
• Dòng đầu tiên chứa một số nguyên dương n.
Dòng thứ hai chứa n số nguyên theo thứ tự a, a, a,,... -
Kết quả: Hiển thị ở thiết bị ra chuẩn số nguyên là số chất khác nhau:
Lời giải:
Em có thể sắp xếp theo thứ tự dãy 4 rồi thực hiện phép duyệt từ trái sang phải để “lướt” qua các đoạn phần tử bằng nhau:
Câu Fcs33 trang 57 SBT Tin học 11: Số lần đổi chỗ.
Cho dãy số 4 gồm n số nguyên phân biệt: Ao, A,, A,,..., A n-1'
Em có thể dùng thao tác sau: Chọn hai vị trí kề nhau i và i + 1 bất kì (0
i+1
cho nhau.
Em hãy thao tác trên mảng A, sao cho sau khi thực hiện tuần tự các thao tác, mảng 4 được sắp xếp tăng dần,
Yêu cầu: Hãy in ra số lần đổi giá trị và vị trí i và j của lần đổi chỗ đó. Dữ liệu: Nhập từ thiết bị vào chuẩn:
- Dòng đầu tiên chứa một số nguyên dương n.
Dòng thứ hai chứa n số nguyên theo thứ tự án, A0, A1, A2,...,An-1"
Kết quả: Hiển thị ở thiết bị ra chuẩn:
Dòng đầu tiên chứa số nguyên dương K là số thao tác bạn làm.
- Á dòng sau, dòng thứ i in ra hai số a," (0Śu<"< n) cho biết bạn sẽ đội giá trị của hai vị trí u, v cho nhau.
Lời giải:
Chương trình mẫu:
Ghi chú: Các thao tác được lưu vào một danh sách. Mỗi phần tử của danh sách là một tuple (khai báo bởi ( ) ). Tuple khá giống danh sách, nhưng các phần tử của nó không thể thay đổi giá trị.
Câu Fcs34 trang 58 SBT Tin học 11: Sắp xếp tên sách tiếng Anh
Gợi ý: Một xâu 4 độ dài 1, được gọi là đứng trước xâu B độ dài 1, theo thứ tự từ điển, nếu sau khi loại bỏ toàn bộ khoảng trắng, tồn tại vị trí i đầu tiên sao cho khi so sánh thứ tự trong bảng chữ cái, A #B và 4 đứng trước B; hoặc 1, ≤ 1 và A = B với mọi i<I
Dữ liệu: Nhập từ tệp danhsach.txt:
- Dòng đầu tiên chứa số nguyên n.
- n dòng sau, mỗi dòng là một xâu biểu thị tên của một quyển sách. Dữ liệu đảm bảo tên chỉ gồm các chữ cái Latinh in hoa hoặc in thường cùng với dấu cách, giữa hai từ liên tiếp nhau chỉ chứa đúng một dấu cách và không có hai quyển sách nào trùng tên nếu không tính in hoa hoặc in thường. Kết quả: Hiển thị ở thiết bị ra chuẩn:
Lời giải:
Vì thứ tự từ điển của hai xâu không phụ thuộc vào chữ hoa/thường, mà vị trí của chữ hoa/thường trên bảng ASCII lại khác nhau, nên khi so sánh em đưa tất cả về chỉ chữ hoa hoặc chỉ chữ thường để so sánh.
Để đưa tất cả kí tự của xâu S bất kì thành chữ hoa, ta dùng S.upper(). Ngược lại, để đưa về chữ thường, ta dùng S.lower ().
Câu Fcs35 trang 59 SBT Tin học 11: Sắp xếp tiếng Việt
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.
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)
Câu Fcs36 trang 59 SBT Tin học 11: Phân bố phòng thi
Sắp diễn ra kiểm tra cuối kì II, nhà trường yêu cầu phòng Công nghệ thông tin tạo danh sách phòng thi. Đầu tiên, nhà trường sẽ sắp xếp danh sách phần tên trong họ tên các bạn theo thứ tự từ điển, nếu trùng tên sẽ sắp xếp theo họ. Sau đó, các bạn sẽ lần lượt được phân vào phòng thi theo thứ tự này, mỗi phòng thi có đúng m bạn, riêng phòng cuối có thể ít hơn m bạn.
Ví dụ, phòng thi có bốn bạn. Có hai lớp, lớp 11A có ba bạn là: “Đỗ Nhỏ”, “Lê Hiếu” và “Lê Đức”. Lớp 11B có ba bạn là: “Đặng Hiếu”, “Lê Quý” và “Lê Hân”. Khi đó, danh sách các bạn trong hai lớp này theo thứ tự sắp xếp là: [Lê Đức, Lê Hân, Đặng Hiếu, Lê Hiếu, Đỗ Nhỏ, Lê Quý]. Ta có thể phân thành hai phòng và xếp bốn bạn đầu danh sách đã sắp xếp vào phòng 1, hai bạn còn lại vào phòng 2.
Em được cho danh sách học sinh của mỗi lớp. Em hãy tạo danh sách phòng thi. Dữ liệu: Nhập từ tệp danhsach.txt:
- Dòng đầu tiên gồm hai số nguyên dương n, m là số lượng lớp trong trường và số học sinh trong phòng thi.
- n cụm dòng tiếp theo, mỗi cụm dòng thứ i có dạng như sau:
Dòng đầu tiên chứa số x là số lượng học sinh trong lớp thứ i.
- x dòng tiếp theo, mỗi dòng gồm hai xâu cách nhau một khoảng trắng, mỗi xâu không chứa khoảng trắng và chỉ chứa kí tự trong bảng chữ cái tiếng Việt. Hai xâu này lần lượt là họ và tên của một bạn học sinh trong lớp.
Kết quả: Đưa ra tệp phongthi.txt:
- Dòng đầu tiên in ra c là số lượng phòng thi.
- cụm dòng tiếp theo tương ứng với c phòng thi, mỗi phòng thi in ra những dòng sau:
- Dòng đầu tiên chứa số nguyên k là số lượng thí sinh trong phòng.
k dòng theo thứ tự từ điển, mỗi dòng chứa họ và tên của các bạn học sinh trong phòng thi.
Cần đảm bảo thứ tự xuất hiện của các dòng họ và tên phải theo thứ tự từ điển.
Lời giải:
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"). Để so sánh hai xâu, sử dụng hàm locale.strcoll(s1, s2) . Hàm sẽ trả về một số âm nếu xâu s1 đứng trước xâu s2, số 0 khi hai xâu bằng nhau và số dương nếu xâu s2 đứng trước xâu s1.
Đầu tiên, em nhập toàn bộ danh sách học sinh các lớp và gom hết vào một mảng. Sau đó, em tiến hành sắp xếp nổi bọt nhưng việc so sánh sẽ phức tạp hơn: so sánh phần tên trước, nếu phần tên bằng nhau sẽ so sánh phần họ. Tiếp theo, em lần lượt đưa học sinh vào các phòng thi. Em tạo hai danh sách, một mảng allRoom dùng để chứa toàn bộ danh sách thí sinh từng phòng thi và một danh sách currentRoom dùng để lưu thông tin thí sinh của phòng thi hiện tại đang xếp. Khi phòng currentRoom xếp đủ m người, em đẩy toàn bộ phòng thi đã xếp xong này vào trong allRoom, sau đó xoá currentRoom để bắt đầu xếp phòng khác.
Cuối cùng, em in ra như đề bài.
Xem thêm các bài giải sách bài tập Tin học 11 Cánh diều hay, chi tiết khác:
Bài 6: Kiểm thử và sửa lỗi chương trình
Bài 7: Lập trình giải bài toán tìm kiếm
CÔNG TY TNHH ĐẦU TƯ VÀ DỊCH VỤ GIÁO DỤC VIETJACK
- Người đại diện: Nguyễn Thanh Tuyền
- Số giấy chứng nhận đăng ký kinh doanh: 0108307822, ngày cấp: 04/06/2018, nơi cấp: Sở Kế hoạch và Đầu tư thành phố Hà Nội.
2021 © All Rights Reserved.