You are on page 1of 15

NĂM HỌC: 2022 - 2023

BÁO CÁO CHUYÊN ĐỀ


“LẬP TRÌNH DỰ ÁN GAME ĐƠN GIẢN VỚI THUẬT TOÁN TRONG
MÔI TRƯỜNG LẬP TRÌNH SCRATCH”
I. Đặt vấn đề
1. Giới thiệu về Sratch
Scratch là tên gọi của một loại ngôn ngữ lập trình, được nghiên cứu và phát triển bởi nhóm
Lifelong Kindergarten thuộc trung tâm Media Lab của Viện công nghệ Massachusetts. Dẫn
đầu dự án nghiên cứu sáng tạo ra ngôn ngữ này là giáo sư Mitchel Resnick, ông cũng là giám
đốc điều hành của nhóm Lifelong Kindergarten. Mục đích chính của dự án là nghiên cứu ra
một phương pháp giúp cho trẻ em cũng có thể học lập trình.
Ngôn ngữ lập trình Scratch phát triển theo hướng tương tác trực quan, đồ họa sống động,
sản phẩm liền tay mà vẫn đảm bảo tính khoa học, tính liên thông tri thức. Khi sử dụng Scratch,
thay vì phải viết những dòng lệnh logic dễ gặp lỗi thì chỉ cần nắm và kéo các khối lệnh đầy
màu sắc có sẵn để lắp ghép thành một kịch bản điều khiển các đối tượng trên sân khấu biểu
diễn.
Với đặc điểm dễ học, dễ sử dụng và hiệu quả, Scratch được xem như là một ngôn ngữ nền
tảng trước khi học các ngôn ngữ lập trình khác. Vì thế, đến nay đã có hàng triệu dự án được
chia sẻ trên trang chủ của nhà thiết kế. Rất nhiều trường học trên khắp thế giới, từ trường Tiểu
học đến Đại học đã sử dụng Scratch như một môn học chính thức.
2. Lập trình thuật toán
Lập trình thuật toán được hiểu là giải các bài toán trong phạm vi kiến thức bậc học nhưng
có sử dụng “thuật giải”. “Thuật giải” ở đây được hiểu trong phạm vi hẹp và mang tính định
tính. Chẳng hạn các bài toán: Tìm số lớn nhất, bé nhất trong dãy số; sắp xếp dãy số, tính tổng
liên tiếp, …
Thuật giải là tập hợp các bước tuần tự để giải hoàn chỉnh một bài toán, một số bước trong
thuật giải có thể thay đổi vị trí mà không ảnh hưởng đến kết quả.
Thuật toán là tập hợp các bước tuần tự gồm phép toán và câu lệnh để giải bài toán, các
bước và phép toán trong thuật toán không thể thay đổi được.
Ví dụ 1:

Ví dụ 2: Viết chương trình tìm số lớn nhất (max) trong hai số nhập vào bàn phím. Thứ tự
các bước phải làm là:

Trang - 1 -
NĂM HỌC: 2022 - 2023

II. Nội dung


1. Một số kĩ thuật lập trình phi thuật toán
Đối với học sinh ở bậc trung Tiểu học và THCS, học lập trình là việc rất khó khăn do mới
bước đầu làm quen, rất bỡ ngỡ với máy tính và lập trình, các em chưa biết về cơ sở dữ liệu và
cấu trúc dữ liệu. Do vậy, việc giảng dạy theo chuẩn cấu trúc dữ liệu và thuật toán sẽ làm cho
các em rất khó tiếp thu, dễ gây chán nản trong lúc học. Cách tốt nhất là rèn cho các em kỹ năng
biết lập trình định hướng trước, tức là giải được bài toán trước, rồi sau đó mới rèn tới thuật
toán chính quy. Một trong những phương pháp hiệu quả là rèn học sinh một số kỹ thuật lập
trình phi thuật toán.
Tại sao là “kỹ thuật phi thuật toán”? “kỹ thuật” ở đây hiểu đơn giản là những “mẹo” lập
trình, “phi thuật toán” là vì việc vận dụng những kỹ thuật này là “tùy ý” không bị ràng buộc
vào điều kiện hay quy tắc nào cả. Mỗi một “kỹ thuật” sẽ đặt cho nó một “tên gọi” sao cho học
sinh có thể dễ nhớ nhất khi nhắc đến (mà không nhất thiết phải chính xác về mặt khoa học).
a. Kĩ thuật “qui nạp không hoàn toàn”
Kĩ thuật này thường được dùng trong các bài toán kiểm tra tính đúng/sai một tính chất nào
đó của số hay dãy số. Kĩ thuật này gồm 3 bước:
- Bước 1: Giả sử ban đầu số thỏa mãn tính chất (hoặc không thỏa)
- Bước 2: Kiểm tra trên toàn bộ phạm vi giới hạn của số hay dãy số để tìm kiếm trường hợp vi
phạm giả sử ở bước 1. Nếu có xảy ra vi phạm thì đổi lại giá trị đã giả sử.
- Bước 3: Trả lời kết quả về tính chất cần kiểm tra.
Ví dụ 1: Kiểm tra một số nguyên có phải là hợp số hay không?

Trang - 2 -
NĂM HỌC: 2022 - 2023
Trong ví dụ trên thì biểu thức điều kiện ở bước 2 gồm 2 điều kiện:

: điều kiện kiểm soát phạm vi giới hạn tính chất.

: điều kiện thoát vòng lặp nếu tìm thấy vi phạm bước 1.
Bây giờ bài toán này được phát triển lên như sau:
Ví dụ 2: Viết chương trình nhập vào tùy ý các số nguyên dương cho đến khi nhập số 0 thì
dừng. Hãy đếm xem có bao nhiêu số là hợp số và tính tổng các hợp số đó?

Trang - 3 -
NĂM HỌC: 2022 - 2023
Ở bước thứ 3 trong ví dụ 2, nếu ta sửa điều kiện như sau, thì kết quả là số các số nguyên tố và
tổng các số nguyên tố đã nhập.

Ví dụ 3: Viết chương trình nhập (import) từ file dayso.txt một dãy số nguyên gồm có X phần
tử (X<=10000) vào một danh sách (dayso). Kiểm tra xem dãy số có đối xứng hay không?

b. Kĩ thuật “lính canh”


Là kĩ thuật tìm kiếm trên dãy dữ liệu để tìm một phần tử thỏa điều kiện nào đó. Kĩ thuật
này có 3 bước:
- Bước 1: Ban đầu cho phần tử lính canh là 1 phần tử nào đó của dãy (Phần tử lính canh có thể
là phần tử bất kỳ của dãy, tuy nhiên tùy bài toán mà chọn phần tử lính canh cho phù hợp, thông
thường lính canh là phần tử đầu tiên).
- Bước 2: Duyệt dãy dữ liệu, kiểm tra xem có phần tử nào thỏa điều kiện bài toán thì thay đổi
vị trí lính canh.
- Bước 3: Thông báo kết quả: Sau khi duyệt xong dãy dữ liệu thì phần tử lính canh là phần tử
cần tìm.
Ví dụ: Nhập (import) từ file dayso.txt vào một danh sách dayso. Tìm số lớn nhất và nhỏ nhất
trong dãy số nguyên?
A={a1, a2, ..,an}?
Với bài này, ngay lúc đầu ta giả sử hai phần tử lính canh là lớn nhất “max” và nhỏ nhất
“min” là a1; ta sẽ duyệt qua dãy số đó từ a 2 đến an; cứ mỗi số ak duyệt qua đều so sánh với các
phần tử lính canh, nếu vi phạm điều kiện lính canh thì đổi giá trị lính canh bằng chính giá trị
mới ak.

Trang - 4 -
NĂM HỌC: 2022 - 2023

c. Kĩ thuật “đánh dấu”


Là kỹ thuật thay thế giá trị một phần tử của dãy dữ liệu thoả điều kiện tìm kiếm x nào đó
bởi một giá trị khác (thường thay giá trị cực biên của kiểu dữ liệu) để những lần duyệt tiếp theo
trong dãy dữ liệu, bước duyệt không lặp lại trên phần tử đó. Nếu không đòi hỏi tính tối ưu
thuật toán và thời gian thì kỹ thuật này có thể dùng để khắc phục sự phức tạp của một số thuật
toán như quy hoạch động, quay lui, vét cạn, … khi đó dùng một list phụ đánh dấu lại vị trí bị
thay đổi sẽ đảm bảo được dữ liệu ban đầu.
Trong lập trình hướng phi thuật toán có thể nói đây được xem là một kỹ thuật rất “tuyệt”
giúp giải quyết khá tốt những bài toán trên dãy số mà không cần dùng đến những thuật toán
“mạnh”. Ví dụ như: xuất các phần tử giống nhau hoặc khác nhau trong dãy, xâu, tỉa (loại bỏ
phần tử) dãy, …
Ví dụ: Đề thi tin học trẻ tỉnh Lâm Đồng năm 2018

Trang - 5 -
NĂM HỌC: 2022 - 2023

Ý tưởng thuật toán vận dụng kỹ thuật đánh dấu như sau:
- Dùng 2 danh sách tạm listB, listC nhận dữ liệu từ mảng listA ban đầu.
- Sắp xếp listB tăng dần.
- Tính tổng các phần tử đầu của listB sao cho giá trị tổng <= 500
+ Mỗi lần cộng được một phần tử listB[i] vào tổng thì tìm phần tử listB[i] đó trong listC, khi
tìm thấy thì thay giá trị listC[i] := -1 để đánh dấu.
- Duyệt lại trên listC, nếu phần tử listC[i]= -1 thì lấy giá trị listA[i].
listA[] dữ liệu đầu vào (mảng chính)
60 70 30 15 17 80 16 75 90 85 40 75
listB[] (sắp xếp tắng dần)
15 16 17 30 40 60 70 75 75 80 85 90
listC[] (đánh dấu vị trí được chọn bằng số -1)
-1 -1 -1 -1 -1 -1 -1 -1 90 85 -1 -1
Code giải bằng Scratch:

Trang - 6 -
NĂM HỌC: 2022 - 2023

d. Kĩ thuật lập trình tuần tự “định hướng chia để trị”


Là hướng lập trình chia bài toán lớn thành các bài toán nhỏ và giải quyết lần lượt các bài
toán đó theo một hướng nhất định từ trên xuống dưới. Trong kỹ thuật này, ở mỗi bước lập trình
học sinh đều kiểm tra kết quả dữ liệu đầu ra, nếu đúng thì làm bước tiếp, sai thì xem xét lại cho
đến khi đúng mới tiếp tục.
Ví dụ: ví dụ của phần c là cách lập trình theo kĩ thuật “chia để trị”.
e. Kĩ thuật “thuật toán chung”
Trong lập trình giải toán bằng máy tính có rất nhiều bài toán có những đặc trưng giống
nhau, thông thường những bài toán này có chung với nhau một cách giải, có thể không tối ưu
nhưng sẽ giải được.
Thuật toán 1: Những bài toán về dãy số có quy luật dãy số đẹp, dãy số hoàn hảo, … thì mỗi
phần tử trong dãy luôn có một tính chất đặc trưng và theo quy luật nhất định. Những bài toán
này thường có hai yêu cầu chính là truy xuất đến phần tử thứ n của dãy hoặc truy xuất dãy con
các phần tử của dãy. Với những bài dạng này, chúng ta sử dụng chung một kiểu thuật toán như
sau:

Trang - 7 -
NĂM HỌC: 2022 - 2023

Thuật toán trên, mấu chốt là học sinh phải giải quyết được:
Còn “khoảng_cách/bước_nhảy_giữa_hai_phần_tử” đơn giản nhất là bằng 1.
Ví dụ 1: Đề thi tin học trẻ tỉnh Lâm Đồng năm 2018
Câu 1 (6 điểm) SỐ ĐẸP
Một số được gọi là “số đẹp” nếu tổng bình phương các chữ số của nó (trong dạng biểu
diễn thập phân) là một số nguyên tố.
Ví dụ: 12 là một “số đẹp” vì 12 + 22 = 5 là số nguyên tố. Các “số đẹp” được đánh theo
thứ tự tăng dần của giá trị, bắt đầu từ 1 trở đi.
Yêu cầu: Cho số nguyên N (1≤ N ≤ 106). Hãy tìm “số đẹp” thứ N.
Dữ liệu vào: từ file văn bản SODEP.INP: chứa duy nhất một số nguyên N.
Kết quả: Ghi ra file văn bản SODEP.OUT: chứa duy nhất một số là kết quả “số đẹp”
tìm được tương ứng của mỗi test từ file dữ liệu vào.
SODEP.INP SODEP.OUT
1 11
2 12
Code giải bằng Scratch:

Trang - 8 -
NĂM HỌC: 2022 - 2023

Thuật toán 2: Dùng biến danh sách để giải các bài toán có dạng giống nhau như Fibonaci, dãy
Tribonaci, dãy Lucas, dãy nguyên tố, dãy có cấp số, … Với những bài dạng này, chúng ta sử
dụng chung một kiểu thuật toán như sau:
- Bước 1: Dùng một danh sách list_dayso lưu tất cả các số của dãy thỏa tính chất
- Bước 2: Xuất phần tử theo yêu cầu.
Ví dụ 2:

Code giải bằng Scratch:

Trang - 9 -
NĂM HỌC: 2022 - 2023

2. Một số thuật toán cơ bản


Bài 1. Tính tổng các chữ số của một số
Nhập vào một số tự nhiên n từ bàn phím, viết chương trình thông báo tổng các chữ số của số
n?
Ví dụ: n = 245 thì thông báo “Tổng các chữ số là: 11” (giải thích: 2 + 4 + 5 = 11)
Code giải bằng Scratch:
Cách 1: Dùng thuật toán xâu ký tự số

Trang - 10 -
NĂM HỌC: 2022 - 2023

Cách 2: Dùng thuật toán tách số (tương tự DIV/MOD)

Tương tự, tính tổng bình phương các chữ số của … của một số tự nhiên n?
Tương tự, tìm chữ số lớn nhất, nhỏ nhất… của một số tự nhiên n?
Bài 2. Đếm các chữ số của một chuỗi tùy ý
Bài toán: Nhập vào một chuỗi st từ bàn phím, viết chương trình thông báo có bao nhiêu chữ số
trong chuỗi?
Ví dụ: st = ab2k45e thì thông báo “Số các chữ số là: 3”
Code giải bằng Scratch:

Trang - 11 -
NĂM HỌC: 2022 - 2023

Bài 3. Tính tổng các số tự nhiên liên tiếp không quá n


Bài toán: Nhập vào một số tự nhiên n từ bàn phím, viết chương trình thông báo tổng các số tự
nhiên liên tiếp từ 1 đến n?
S=1+2+3+…+n
Ví dụ: n = 5 thì thông báo “Tổng là: 15” (giải thích: S=1+2+3+4+5=15)
Code giải bằng Scratch:

Bài 4: Tính tổng các số thỏa điều kiện không quá n


Bài toán: Nhập vào một số tự nhiên n từ bàn phím, viết chương trình thông báo tổng các số tự
nhiên chia hết cho 3 không quá n?
S = 3 + 6 + 9 +… + 3k
Ví dụ: n = 10 thì thông báo “Tổng là: 18” (giải thích: S = 3 + 6 + 9 = 18)
Code giải bằng Scratch:

Trang - 12 -
NĂM HỌC: 2022 - 2023

Bài 5: Sắp xếp danh sách tăng dần/giảm dần


Bài toán: Nhập vào một danh sách các số tự nhiên/số nguyên cho đến khi nhập 0 thì dừng. Sắp
xếp danh sách tăng dần?
Code giải bằng Scratch (bằng thuật toán nổi bọt):

Bài 6: Xuất xâu đảo ngược, kiểm tra xâu đối xứng
Bài toán 1: Cho trước (hoặc nhập từ bàn phím) xâu ký tự Str, in ra xâu thu được từ Str bằng
cách viết theo thứ tự ngược lại?
Ví dụ: nhập st = abcdef thì thông báo “Chuỗi đảo ngược: fedcba”
Ý tưởng: Dùng một xâu st_tam và lần lượt nối các ký tự st theo thứ tự ngược lại.
Code giải bằng Scratch:

Trang - 13 -
NĂM HỌC: 2022 - 2023

Bài toán 2: Cho trước (hoặc nhập từ bàn phím) xâu ký tự St, in ra thông báo xâu st có đối xứng
hay không?
Ví dụ: nếu nhập st = abcd thì thông báo “không đối xứng”, nếu nhập st = abba thì thông báo
“đối xứng”.
Ý tưởng: Dùng một xâu st_tam và lần lượt nối các ký tự st theo thứ tự ngược lại, so sánh nếu
st_tam = st thì là xâu đối xứng.
Code giải bằng Scratch:

III. Bài tập vận dụng

Trang - 14 -
NĂM HỌC: 2022 - 2023
Bài 1. Nhập (import) từ file daysoA.txt vào một danh sách daysoA, file daysoB.txt vào một
danh sách daysoB. Viết chương trình tạo ra danh sách daysoC gồm các phần tử số có trong
daysoA mà không có trong daysoB?
Bài 2. Cho dãy số 4, 8, 12, 16, … tính tổng của 100 số hạng đầu tiên.
Bài 3. Cho dãy số 1, 3, 7, 13, 21, …, n biết n là một số gần bằng số 92. Tính trung bình cộng
của dãy số trên.
Bài 4. Em hãy dùng phần mềm Scratch, Lập trình tính tiền điện tiêu thụ cho một hộ gia đình
theo yêu cầu sau:
- Tạo các biến số: Tiền điện, Số điện mới, Số điện cũ, Số điện tiêu thụ.
- Nếu số điện tiêu thụ lớn hơn 100 thì nhân với đơn giá điện là 3000 đồng.
- Ngược lại nhỏ hơn 100 thì nhân với đơn giá điện là 1500 đồng.
Cho biết:
Số điện tiêu thụ= Số điện mới – số điện cũ
Tiền điện =Số điện tiêu thụ * đơn giá.
Bài 5. Tính tuổi: Tổng số tuổi của mẹ và con hiện này là 44 tuổi. Tìm tuổi mẹ và con hiện nay.
Biết rằng 4 năm trước tuổi mẹ gấp 8 lần tuổi con.
Bài 6. Chia kẹo: Qui tắc chia kẹo như sau: Bạn đầu tiên được nhận 1 gói kẹo, bạn tiếp theo
nhận nhiều hơn bạn đứng trước đó 3 gói kẹo. Biết số học sinh tham gia gồm n bạn (Biết n
nguyên dương nhập từ bàn phím). Yêu cầu: Tính tổng số gói kẹo thầy giáo cần có để phát
thưởng cho n bạn học sinh.
Bài 7. Nhập vào 3 số tự nhiên, sau đó chương trình sẽ so sánh tìm ra số nhỏ nhất, số lớn nhất
trong 3 số đó bằng cách so sánh các số.

Trang - 15 -

You might also like