Bỏ qua để đến nội dung

Xử lý danh sách (List)

Chuyên đề này nối tiếp Giải toán với Scratch - thay vì chỉ lưu một giá trị trong một biến, ta dùng danh sách (list) để lưu nhiều giá trị cùng lúc, rồi áp dụng lại các kỹ thuật đã học (vòng lặp, điều kiện) để xử lý toàn bộ dữ liệu đó. Gồm 2 phần: ôn lý thuyết danh sách, sau đó thực hành 25 bài - tính tổng/trung bình, tìm lớn nhất/nhỏ nhất, đếm, tìm kiếm, loại bỏ trùng lặp…

Bạn có thể tải file .pdf ở đây: Xử lý danh sách (List)

Vào nhóm Các biến số (màu đỏ cam) → bấm Tạo một danh sách → đặt tên (ví dụ danh sách) → chọn phạm vi, tương tự tạo biến. Xem thêm ở bài Danh sách.

thêm phần tử [10] vào trong [danh sách v]
xóa phần tử thứ (1) của [danh sách v]
Xóa hết tất cả trong liệt kê [danh sách v]
thêm phần tử [5] tại vị trí (1) của [danh sách v]
thay thế phần tử thứ (1) của danh sách [danh sách v] bằng [99]
(phần tử thứ (1) của [danh sách v])
(kích thước của [danh sách v])
<[danh sách v] chứa phần tử [10]?>
(số thứ tự của [10] trong [danh sách v])

kích thước của trả về số phần tử hiện có trong danh sách - luôn dùng làm điều kiện dừng khi duyệt qua toàn bộ danh sách. số thứ tự của ... trong ... trả về 0 nếu giá trị đó không có trong danh sách.

khi bấm vào @greenFlag
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
nói (phần tử thứ (i) của [danh sách v]) trong (0.3) giây
thay đổi [i v] một lượng (1)

Kết hợp biến đếm i với lặp lại cho đến khi <(i) > (kích thước của ...)> để đi qua từng phần tử - cách làm này lặp lại ở hầu hết các bài dưới đây.

Nhập nhiều phần tử vào danh sách (mẫu dùng lại nhiều lần)

Phần tiêu đề “Nhập nhiều phần tử vào danh sách (mẫu dùng lại nhiều lần)”
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)

Hỏi trước số lượng phần tử N, rồi lặp lại N lần việc hỏi và thêm vào danh sách - đây là bước nhập liệu đầu tiên của gần như mọi bài thực hành bên dưới, nên chỉ giải thích một lần ở đây.

Phần 2 - Thực hành: 25 bài xử lý danh sách

Phần tiêu đề “Phần 2 - Thực hành: 25 bài xử lý danh sách”

Nhập N số bất kỳ vào danh sách, sau đó hiện danh sách lên sân khấu.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
hiện danh sách [danh sách v]

hiện danh sách hiện danh sách dưới dạng bảng ngay trên sân khấu, có thể kéo giãn để xem toàn bộ.

Nhập danh sách, sau đó xoá phần tử tại vị trí do người dùng nhập.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
hiện danh sách [danh sách v]
hỏi [Xoá phần tử tại vị trí nào?] và đợi
xóa phần tử thứ (trả lời) của [danh sách v]

Bài 3: Chèn phần tử vào vị trí cho trước

Phần tiêu đề “Bài 3: Chèn phần tử vào vị trí cho trước”

Nhập danh sách, sau đó chèn thêm một giá trị vào vị trí do người dùng chọn (không ghi đè phần tử cũ).

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
hiện danh sách [danh sách v]
hỏi [Nhập giá trị cần chèn:] và đợi
đặt [giá trị v] thành (trả lời)
hỏi [Chèn vào vị trí nào?] và đợi
thêm phần tử (giá trị) tại vị trí (trả lời) của [danh sách v]

thêm phần tử ... tại vị trí ... đẩy các phần tử từ vị trí đó trở về sau lùi lại một bậc, khác với thay thế (Bài 4) sẽ ghi đè mất giá trị cũ.

Nhập danh sách, sau đó thay giá trị tại một vị trí do người dùng chọn bằng giá trị mới.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
hiện danh sách [danh sách v]
hỏi [Thay thế phần tử tại vị trí nào?] và đợi
đặt [vị trí v] thành (trả lời)
hỏi [Nhập giá trị mới:] và đợi
thay thế phần tử thứ (vị trí) của danh sách [danh sách v] bằng (trả lời)

Nhập danh sách, hiện số phần tử hiện có, rồi xoá sạch toàn bộ và hiện lại số phần tử (bằng 0).

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
nói (kết hợp [Số phần tử hiện có: ] (kích thước của [danh sách v])) trong (1.5) giây
Xóa hết tất cả trong liệt kê [danh sách v]
nói (kết hợp [Số phần tử sau khi xoá: ] (kích thước của [danh sách v]))

Nhập danh sách các số, tính tổng tất cả phần tử.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [tổng v] thành (0)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
thay đổi [tổng v] một lượng (phần tử thứ (i) của [danh sách v])
thay đổi [i v] một lượng (1)
end
nói (kết hợp [Tổng các phần tử: ] (tổng))

Nhập danh sách các số, tính trung bình cộng.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [tổng v] thành (0)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
thay đổi [tổng v] một lượng (phần tử thứ (i) của [danh sách v])
thay đổi [i v] một lượng (1)
end
đặt [trung bình v] thành ((tổng) / (kích thước của [danh sách v]))
nói (kết hợp [Trung bình cộng: ] (trung bình))

Nhập danh sách các số, đếm xem có bao nhiêu phần tử là số chẵn.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [đếm v] thành (0)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
nếu <((phần tử thứ (i) của [danh sách v]) chia lấy dư (2)) = (0)> thì
thay đổi [đếm v] một lượng (1)
end
thay đổi [i v] một lượng (1)
end
nói (kết hợp [Số lượng phần tử chẵn: ] (đếm))

Bài 9: Đếm số phần tử lớn hơn một giá trị cho trước

Phần tiêu đề “Bài 9: Đếm số phần tử lớn hơn một giá trị cho trước”

Nhập danh sách và một ngưỡng, đếm xem có bao nhiêu phần tử lớn hơn ngưỡng đó.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
hỏi [Đếm các phần tử lớn hơn giá trị nào?] và đợi
đặt [ngưỡng v] thành (trả lời)
đặt [đếm v] thành (0)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
nếu <(phần tử thứ (i) của [danh sách v]) > (ngưỡng)> thì
thay đổi [đếm v] một lượng (1)
end
thay đổi [i v] một lượng (1)
end
nói (kết hợp [Số lượng phần tử lớn hơn ngưỡng: ] (đếm))

Bài 10: Tính tổng các số chẵn trong danh sách

Phần tiêu đề “Bài 10: Tính tổng các số chẵn trong danh sách”

Nhập danh sách các số, chỉ cộng dồn những phần tử là số chẵn.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [tổng chẵn v] thành (0)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
nếu <((phần tử thứ (i) của [danh sách v]) chia lấy dư (2)) = (0)> thì
thay đổi [tổng chẵn v] một lượng (phần tử thứ (i) của [danh sách v])
end
thay đổi [i v] một lượng (1)
end
nói (kết hợp [Tổng các số chẵn: ] (tổng chẵn))

Bài 11: Đếm số lượng số nguyên tố trong danh sách

Phần tiêu đề “Bài 11: Đếm số lượng số nguyên tố trong danh sách”

Nhập danh sách các số nguyên (lớn hơn 1), đếm xem có bao nhiêu số là số nguyên tố.

Xem lời giải

Kết hợp lại cách kiểm tra số nguyên tố đã học ở chuyên đề Giải toán với Scratch - chỉ khác là lặp lại việc kiểm tra đó cho từng phần tử trong danh sách (vòng lặp lồng trong vòng lặp).

khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo (số nguyên > 1):] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [đếm nguyên tố v] thành (0)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
đặt [số v] thành (phần tử thứ (i) của [danh sách v])
đặt [là số nguyên tố v] thành (1)
đặt [j v] thành (2)
lặp lại cho đến khi <(j) = (số)>
nếu <((số) chia lấy dư (j)) = (0)> thì
đặt [là số nguyên tố v] thành (0)
end
thay đổi [j v] một lượng (1)
end
nếu <(là số nguyên tố) = (1)> thì
thay đổi [đếm nguyên tố v] một lượng (1)
end
thay đổi [i v] một lượng (1)
end
nói (kết hợp [Số lượng số nguyên tố: ] (đếm nguyên tố))

Nhóm 3: Tìm lớn nhất/nhỏ nhất & tìm kiếm

Phần tiêu đề “Nhóm 3: Tìm lớn nhất/nhỏ nhất & tìm kiếm”

Nhập danh sách các số, tìm giá trị lớn nhất.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [max v] thành (phần tử thứ (1) của [danh sách v])
đặt [i v] thành (2)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
nếu <(phần tử thứ (i) của [danh sách v]) > (max)> thì
đặt [max v] thành (phần tử thứ (i) của [danh sách v])
end
thay đổi [i v] một lượng (1)
end
nói (kết hợp [Giá trị lớn nhất: ] (max))

Cách làm giống hệt bài “Số lớn nhất trong ba số” ở chuyên đề trước - chỉ khác là so sánh với tất cả phần tử bằng vòng lặp, thay vì so sánh tay từng biến.

Nhập danh sách các số, tìm giá trị nhỏ nhất.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [min v] thành (phần tử thứ (1) của [danh sách v])
đặt [i v] thành (2)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
nếu <(phần tử thứ (i) của [danh sách v]) < (min)> thì
đặt [min v] thành (phần tử thứ (i) của [danh sách v])
end
thay đổi [i v] một lượng (1)
end
nói (kết hợp [Giá trị nhỏ nhất: ] (min))

Bài 14: Tìm vị trí của giá trị lớn nhất

Phần tiêu đề “Bài 14: Tìm vị trí của giá trị lớn nhất”

Nhập danh sách các số, tìm vị trí (không phải giá trị) của phần tử lớn nhất.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [max v] thành (phần tử thứ (1) của [danh sách v])
đặt [vị trí max v] thành (1)
đặt [i v] thành (2)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
nếu <(phần tử thứ (i) của [danh sách v]) > (max)> thì
đặt [max v] thành (phần tử thứ (i) của [danh sách v])
đặt [vị trí max v] thành (i)
end
thay đổi [i v] một lượng (1)
end
nói (kết hợp [Vị trí của giá trị lớn nhất: ] (vị trí max))

Mỗi khi cập nhật max, cập nhật luôn cả vị trí max bằng chỉ số i hiện tại - hai biến này luôn đi cùng nhau.

Bài 15: Kiểm tra một giá trị có trong danh sách không

Phần tiêu đề “Bài 15: Kiểm tra một giá trị có trong danh sách không”

Nhập danh sách, sau đó kiểm tra một giá trị do người dùng nhập có xuất hiện trong danh sách hay không.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
hỏi [Kiểm tra giá trị nào?] và đợi
nếu <[danh sách v] chứa phần tử (trả lời)?> thì
nói [Có tồn tại trong danh sách!]
nếu không thì
nói [Không tồn tại trong danh sách!]

Bài 16: Tìm vị trí xuất hiện đầu tiên của một giá trị

Phần tiêu đề “Bài 16: Tìm vị trí xuất hiện đầu tiên của một giá trị”

Nhập danh sách, sau đó tìm vị trí xuất hiện đầu tiên của một giá trị do người dùng nhập.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
hỏi [Tìm vị trí của giá trị nào?] và đợi
nói (kết hợp [Vị trí xuất hiện đầu tiên: ] (số thứ tự của (trả lời) trong [danh sách v]))

Khối số thứ tự của ... trong ... đã tự tìm kiếm tuần tự sẵn cho ta - trả về 0 nếu giá trị đó không có trong danh sách.

Bài 17: Đếm số lần xuất hiện của một giá trị

Phần tiêu đề “Bài 17: Đếm số lần xuất hiện của một giá trị”

Nhập danh sách, sau đó đếm xem một giá trị do người dùng nhập xuất hiện bao nhiêu lần.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
hỏi [Đếm số lần xuất hiện của giá trị nào?] và đợi
đặt [giá trị v] thành (trả lời)
đặt [đếm v] thành (0)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
nếu <(phần tử thứ (i) của [danh sách v]) = (giá trị)> thì
thay đổi [đếm v] một lượng (1)
end
thay đổi [i v] một lượng (1)
end
nói (kết hợp [Số lần xuất hiện: ] (đếm))

Khác với Bài 16 (số thứ tự của chỉ tìm được lần đầu tiên), bài này phải tự duyệt toàn bộ danh sách để đếm hết các lần xuất hiện.

Bài 18: Cộng thêm một lượng vào tất cả các phần tử

Phần tiêu đề “Bài 18: Cộng thêm một lượng vào tất cả các phần tử”

Nhập danh sách điểm số, cộng thêm một lượng điểm thưởng do người dùng nhập vào tất cả các phần tử, rồi hiện lại danh sách.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
hỏi [Cộng thêm bao nhiêu vào mỗi phần tử?] và đợi
đặt [lượng cộng v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
thay thế phần tử thứ (i) của danh sách [danh sách v] bằng ((phần tử thứ (i) của [danh sách v]) + (lượng cộng))
thay đổi [i v] một lượng (1)
end
hiện danh sách [danh sách v]

Duyệt qua từng phần tử, thay thế giá trị cũ bằng giá trị cũ cộng thêm lượng đã nhập - không cần biến trung gian vì chỉ sửa tại chỗ.

Bài 19: Nhân đôi giá trị tất cả các phần tử

Phần tiêu đề “Bài 19: Nhân đôi giá trị tất cả các phần tử”

Nhập danh sách các số, nhân đôi giá trị của mỗi phần tử.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
thay thế phần tử thứ (i) của danh sách [danh sách v] bằng ((phần tử thứ (i) của [danh sách v]) * (2))
thay đổi [i v] một lượng (1)
end
hiện danh sách [danh sách v]

Cùng khuôn mẫu với Bài 18 - chỉ đổi phép + thành phép *.

Bài 20: Kiểm tra danh sách đã sắp xếp tăng dần chưa

Phần tiêu đề “Bài 20: Kiểm tra danh sách đã sắp xếp tăng dần chưa”

Nhập danh sách, kiểm tra xem các phần tử đã theo thứ tự tăng dần chưa (không cần sắp xếp lại).

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [đã sắp xếp v] thành (1)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > ((kích thước của [danh sách v]) - (1))>
nếu <(phần tử thứ (i) của [danh sách v]) > (phần tử thứ ((i) + (1)) của [danh sách v])> thì
đặt [đã sắp xếp v] thành (0)
end
thay đổi [i v] một lượng (1)
end
nếu <(đã sắp xếp) = (1)> thì
nói [Danh sách đã sắp xếp tăng dần]
nếu không thì
nói [Danh sách chưa sắp xếp tăng dần]

Chỉ cần tìm thấy một cặp liền kề sai thứ tự là đủ kết luận danh sách chưa sắp xếp - biến đã sắp xếp đóng vai trò cờ đánh dấu, giống cách làm ở bài kiểm tra số nguyên tố.

Bài 21: Loại bỏ các phần tử trùng lặp

Phần tiêu đề “Bài 21: Loại bỏ các phần tử trùng lặp”

Nhập danh sách, tạo ra một danh sách mới chỉ giữ lại mỗi giá trị một lần (loại bỏ trùng lặp).

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
Xóa hết tất cả trong liệt kê [danh sách không trùng v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách v])>
nếu <không phải <[danh sách không trùng v] chứa phần tử (phần tử thứ (i) của [danh sách v])?>> thì
thêm phần tử (phần tử thứ (i) của [danh sách v]) vào trong [danh sách không trùng v]
end
thay đổi [i v] một lượng (1)
end
hiện danh sách [danh sách không trùng v]

Trước khi thêm một phần tử vào danh sách không trùng, kiểm tra xem nó đã có trong đó chưa - nếu chưa mới thêm.

Nhập danh sách, tạo ra một danh sách mới có thứ tự các phần tử đảo ngược lại.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách v]
Xóa hết tất cả trong liệt kê [danh sách đảo ngược v]
hỏi [Nhập số lượng phần tử:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập phần tử tiếp theo:] và đợi
thêm phần tử (trả lời) vào trong [danh sách v]
thay đổi [i v] một lượng (1)
end
đặt [i v] thành (kích thước của [danh sách v])
lặp lại cho đến khi <(i) < (1)>
thêm phần tử (phần tử thứ (i) của [danh sách v]) vào trong [danh sách đảo ngược v]
thay đổi [i v] một lượng (-1)
end
hiện danh sách [danh sách đảo ngược v]

Duyệt danh sách gốc từ cuối về đầu (i giảm dần từ kích thước về 1), mỗi phần tử duyệt tới đều thêm vào cuối danh sách mới.

Nhập 2 danh sách riêng biệt, gộp lại thành 1 danh sách chung (nối tiếp nhau).

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [danh sách 1 v]
Xóa hết tất cả trong liệt kê [danh sách 2 v]
Xóa hết tất cả trong liệt kê [danh sách gộp v]
hỏi [Nhập số lượng phần tử danh sách 1:] và đợi
đặt [n1 v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n1)>
hỏi [Nhập phần tử tiếp theo (DS1):] và đợi
thêm phần tử (trả lời) vào trong [danh sách 1 v]
thay đổi [i v] một lượng (1)
end
hỏi [Nhập số lượng phần tử danh sách 2:] và đợi
đặt [n2 v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n2)>
hỏi [Nhập phần tử tiếp theo (DS2):] và đợi
thêm phần tử (trả lời) vào trong [danh sách 2 v]
thay đổi [i v] một lượng (1)
end
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách 1 v])>
thêm phần tử (phần tử thứ (i) của [danh sách 1 v]) vào trong [danh sách gộp v]
thay đổi [i v] một lượng (1)
end
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (kích thước của [danh sách 2 v])>
thêm phần tử (phần tử thứ (i) của [danh sách 2 v]) vào trong [danh sách gộp v]
thay đổi [i v] một lượng (1)
end
hiện danh sách [danh sách gộp v]

Bài 24: Quản lý tên và điểm số song song

Phần tiêu đề “Bài 24: Quản lý tên và điểm số song song”

Nhập tên và điểm số của N học sinh vào 2 danh sách riêng (tên và điểm) - phần tử thứ i của 2 danh sách luôn tương ứng cùng một học sinh.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [tên v]
Xóa hết tất cả trong liệt kê [điểm v]
hỏi [Nhập số lượng học sinh:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập tên học sinh:] và đợi
thêm phần tử (trả lời) vào trong [tên v]
hỏi [Nhập điểm của học sinh này:] và đợi
thêm phần tử (trả lời) vào trong [điểm v]
thay đổi [i v] một lượng (1)
end
hiện danh sách [tên v]
hiện danh sách [điểm v]

Đây gọi là 2 danh sách song song (parallel lists): không có cách “ghép” tên và điểm thành một cặp trong Scratch, nên ta tự giữ cho chúng luôn cùng độ dài và cùng thứ tự - phần tử thứ i của tên và phần tử thứ i của điểm luôn thuộc về cùng một học sinh.

Bài 25: Tìm học sinh có điểm cao nhất (danh sách song song)

Phần tiêu đề “Bài 25: Tìm học sinh có điểm cao nhất (danh sách song song)”

Nhập tên và điểm số của N học sinh, tìm và in ra tên + điểm của học sinh có điểm cao nhất.

Xem lời giải
khi bấm vào @greenFlag
Xóa hết tất cả trong liệt kê [tên v]
Xóa hết tất cả trong liệt kê [điểm v]
hỏi [Nhập số lượng học sinh:] và đợi
đặt [n v] thành (trả lời)
đặt [i v] thành (1)
lặp lại cho đến khi <(i) > (n)>
hỏi [Nhập tên học sinh:] và đợi
thêm phần tử (trả lời) vào trong [tên v]
hỏi [Nhập điểm của học sinh này:] và đợi
thêm phần tử (trả lời) vào trong [điểm v]
thay đổi [i v] một lượng (1)
end
đặt [điểm cao nhất v] thành (phần tử thứ (1) của [điểm v])
đặt [vị trí v] thành (1)
đặt [i v] thành (2)
lặp lại cho đến khi <(i) > (kích thước của [điểm v])>
nếu <(phần tử thứ (i) của [điểm v]) > (điểm cao nhất)> thì
đặt [điểm cao nhất v] thành (phần tử thứ (i) của [điểm v])
đặt [vị trí v] thành (i)
end
thay đổi [i v] một lượng (1)
end
nói (kết hợp (kết hợp (kết hợp [Học sinh điểm cao nhất: ] (phần tử thứ (vị trí) của [tên v])) [ - điểm: ]) (điểm cao nhất)) trong (2) giây

Tìm vị trí của điểm cao nhất trước (giống Bài 14), rồi dùng đúng vị trí đó để lấy tên tương ứng từ danh sách tên - đây là kỹ thuật cốt lõi khi làm việc với danh sách song song.

  • Thử áp dụng bài “Tìm học sinh điểm cao nhất” (Bài 25) để tìm luôn top 3 học sinh điểm cao nhất, bằng cách lặp lại 3 lần: tìm vị trí lớn nhất, in ra, rồi tạm thời gán điểm đó thành một số rất nhỏ để lần tìm tiếp theo bỏ qua nó.
  • Viết bài kiểm tra danh sách có phải một dãy đối xứng (palindrome) hay không (phần tử đầu = phần tử cuối, phần tử thứ 2 = phần tử áp cuối…).
  • Gói các đoạn lặp lại nhiều lần (tìm max, tính tổng, đếm điều kiện) thành khối tự tạo nhận tham số là tên danh sách, để gọi lại nhiều lần không cần chép code.
  • Khi đã vững vòng lặp lồng nhau, có thể tìm hiểu thêm cách sắp xếp cả danh sách (ví dụ thuật toán sắp xếp nổi bọt/bubble sort) - đây là kiến thức nâng cao hơn, phù hợp học sau khi đã thành thạo mọi bài ở chuyên đề này.