Tải bản đầy đủ (.doc) (28 trang)

giáo án bồi dưỡng học sinh giỏi môn tin học

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (346.66 KB, 28 trang )

Ngày soạn: 10/09/2013
Ngày day: 11/09/2013
ÔN TẬP BÀI TOÁN VÀ THUẬT TOÁN
Buổi 1
I. MỤC TIÊU:
Kiến thức:
– Hiểu cách biểu diễn thuật toán bằng sơ đồ khối và bằng liệt kê các bước.
– Hiểu một số thuật toán thông dụng.
Kĩ năng:
– Biết xây dựng thuật toán của một số bài toán thông dụng.
Thái độ:
– Luyện khả năng tư duy lôgic khi giải quyết một vấn đề nào đó.
II. CHUẨN BỊ:
Giáo viên – Giáo án + bảng vẽ các sơ đồ khối.
Học sinh: - Nghiên cứu các bài đã học ở lớp 10 (Bài 4)
III. TIẾN TRÌNH BÀI DẠY:
1. Ổn định tổ chức: Kiểm tra sĩ số.
2. Giảng bài mới:
Nội dung Hoạt động của Giáo viên Hoạt động của Học sinh
Hoạt động 1: Nhắc lại khái niệm về bài toán và cách xác định bài toán
I. Khái niệm bài toán:
• Trong tin học, bài toán là một
việc mà ta muốn máy tính thực
hiện.
• Các yếu tố xác định một bài
toán:
+ Input (thông tin đưa vào
máy): dữ liệu vào
+ Output (thông tin muốn lấy
ra từ máy): dữ liệu ra
VD 1: Tìm UCLN của 2 số M,


N.
VD 2: Tìm nghiệm của pt
ax
2
+ bx + c = 0 ( a ≠ 0)
VD3: Kiểm tra số nguyên dương
n có phải là một số nguyên tố
không?
• GV yêu cầu học sinh Nhớ lại
khái niệm vê bài toán.
• GV yêu cầu học sinh cách xác
định bài toán.
• GV cho một số bài toán yêu
cầu học sinh xác định Input và
Output
• GV nhận xét bài làm của học
sinh.
• HS thảo luận, trả lời yêu cầu
của giáo viên
• HS xác định và thực hiện các
yêu cầu.
Hoạt động 2: Nhắc lại khái niệm thuật toán và cách diễn tả thuật toán
II.Thuật toán và cách diễn tả
thuật toán
1. Khái niệm thuật toán
Thuật toán để giải một bài toán
là một dãy hữu hạn các thao tác
được sắp xếp theo một trình tự
xác định sao cho sau khi thực
hiện dãy thao tác ấy, từ Input

của bài toán, ta nhận được
Output cần tìm.
2. Cách diễn tả thuật toán
- Cách liệt kê
- Sơ đồ khối
• GV yêu cầu học sinh nhắc lại
khái niệm thuật toán.
H. Có mấy cách để diễn tả thuật
toán
GV. Yêu cầu học sinh trình lại
về cách liệt kê và sơ đồ khối.
• Học sinh suy nghĩ và trả lời
• Có hai cách: cách liệt kê và
cách sơ đồ khối
Hs. Suy nghĩ và trả lời
1
Hoạt động 3: Nhắc lại một số thuật toán thông dụng đã học và xây dựng một số thuật toán mới
3. Một số ví dụ áp dụng
Hãy xây dựng thuật toán giải bài
toán sau bằng cách liệt kê hoặc sơ
đồ khối.
Ví dụ 1. Tìm nghiệm của phương
trình bậc 2 tổng quát
• Thuật toán: (Liệt kê)
B1: Nhập các số thực a, b, c
(a#0)
B2: Tính D ← b
2
– 4ac
B3: Nếu D> 0 thì thông báo

phương trình có hai nghiệm phân
biệt x1, x2 rồi kết thúc.
B4: Nếu D<0 thì thông báo
phương trình có nghiệm kép
x1=x2=-b/2a rồi kết thúc
B5. Nếu D<0 thì thông báo
phương trình vô nghiệm rồi kết
thúc.
Ví dụ 2. Tìm giá trị lớn nhất
Max của dãy số.
• Thuật toán: (Liệt kê)
B1: Nhập N
và dãy a
1
, …, a
N
B2: Max ← a
1
; i ←2
B3: Nếu i > N thì đưa ra giá trị
Max và kết thúc.
B4: Nếu a
i
> Max
thì Max ← a
i

B5: i ← i+1, quay lại B3.
- Tìm giá trị nhỏ nhất Min của
dãy số.

Ví dụ 3. Cho N và dãy số a
1
, a
2
,
…, a
N
. Cho biết có bao nhiêu số
hạng trong dãy có giá trị bằng 0
• Thuật toán: (Liệt kê)
• GV yêu cầu học sinh xây dựng
lại thuật toán bằng hai cách giải
bài toán.
• GV đánh giá, nhận xét.
• GV: Yêu cầu học sinh mở rộng
áp dụng với bài toán giải phương
trình bậc nhất tổng quát.
• GV yêu cầu học sinh nêu ý
tưởng và xây dựng lại thuật toán
bằng hai cách giải bài toán.
GV. Nhận xét và giải đáp cách
liệt kê
• GV mô phỏng các bước thực
hiện thuật toán trên với
N = 11 và dãy A: 5, 1, 4, 7, 6, 3,
15, 8, 4, 9, 12.
• GV mở rộng thuật toán với
một số yêu cầu sau:
- Không khởi tạo Max ← a
1


với một a
i
bất kì có nhận xét gì
về thuật toán.
- Với bài toán tìm Min thuật
toán sẽ có thay đổi như thế nào?
GV tiếp tục yêu cầu học sinh
nêu ý tưởng và xây dựng lại
thuật toán bằng hai cách giải bài
toán.
• Học sinh xây dựng cách liệt kê
và cách sơ đồ khối
• Học sinh xây dựng một trong
hai cách: cách liệt kê và cách sơ
đồ khối
• Học sinh xây dựng một trong
hai cách: cách liệt kê và cách sơ
đồ khối
• Học sinh lắng nghe, ghi bài
• Học sinh lắng nghe và đưa ra
nhận xét.
- Thuật toán sẽ so sánh ai với
chính nó. (nghĩa là có thêm một
bước so sánh sẽ thừa ra)
- Thay biến Max bằng biến Min
và B4. Nếu a
i
< Min thì Min← a
i

• Học sinh xây dựng một trong
hai cách: cách liệt kê và cách sơ
đồ khối
2
B1: Nhập N, a
1
, a
2
, …, a
N
B2: i ← 0; Dem ← 0
B3: i ← i + 1
B4: Nếu i > N thì thông báo giá
trị Dem, rồi kết thúc.
B5: Nếu a
i
= 0 thì Dem ← Dem
+ 1.
B6: Quay lại B3.
• GV mở rộng thuật toán với
một số yêu cầu cho các bài toán
sau:
- Với bài toán kiểm tra trong dãy
số có bao nhiêu số âm, bao nhiêu
số dương thì thuật toán có thay
đổi như thế nào
- Hãy dựa trên thuật toán và mở
rộng với các bài toán: tính tổng
các số âm, tổng các số dương
- GV gợi ý và yêu cầu học sinh

xây dựng ý tưởng, thuật toán.
- HS suy nghi và trả lời
- B5: Nếu a
i
= 0 thì Dem ← Dem
+ 1.
Có thể được thay đổi lại như sau:
- Số dương:
B5: Nếu a
i
> 0 thì Dem ← Dem
+ 1.
- Số âm:
B5: Nếu a
i
<0 thì Dem ← Dem +
1.
- Khởi tạo một biến Tong←0
- Số dương:
B5: Nếu a
i
>0 thì Tong← Tong+
a
i
- Số âm:
B5: Nếu a
i
<0 thì Tong← Tong+
a
i

Hoạt động 4:Tìm hiểu tính chất của thuật toán
4. Tính chất thuật toán
- Tính dừng
- Tính xác định
- Tính đúng đắn
• GV yêu cầu học sinh nhắc lại
các tính thuật toán.
GV. Lấy một số ví dụ để thể
hiện các tính chất
• Học sinh suy nghĩ và trả lời
• Có hai cách: cách liệt kê và
cách sơ đồ khối3 tính chất cơ
bản
4. Củng cố kiến thức:
- Khái niệm bài toán, thuật toán
- Cách diễn tả thuật toán: liệt kê, sơ đò khối
5. Bài tập về nhà
Hãy xây dựng thuật toán giải bài toán sau bằng cách liệt kê hoặc sơ đồ khối.
Bài 1. Tìm UCLN của hai số nguyên dương M và N
Bài 2. Kiểm tra số nguyên X có trong dãy số hay không? Nếu có thi thông báo chỉ số?
Bài 3. Kiểm tra tính nguyên tố của một số nguyên dương?
Gợi ý: Xem lại thuật toán SGK tin học 10.
Bài 4. Kiểm tra số nguyễn N có phải là số hoàn hảo hay không?
Gợi ý: só hoàn hảo là số mà có tổng các ước bằng chính nó
VD: số 6 có các ước lần lượt là: 1, 2, 3 và 1+2+3=6
3
Ngày soạn: 15/09/2013
Ngày dạy: 19/09/2013
TÌM HIỂU MÔT SỐ THUẬT TOÁN
Buổi 2

I. MỤC TIÊU:
Kiến thức:
– Hiểu cách biểu diễn thuật toán bằng sơ đồ khối và bằng liệt kê các bước.
– Nắm vứng một số thuật toán thông dụng.
Kĩ năng:
– Biết xây dựng thuật toán của một số bài toán thông dụng và nâng cao.
Thái độ:
– Luyện khả năng tư duy lôgic khi giải quyết một vấn đề nào đó.
II. CHUẨN BỊ:
Giáo viên – Giáo án + tài liệu tham khảo cho học sinh.
Học sinh: - Nghiên cứu các bài đã học ở tiết trước và chuẩn bị chu đáo các bài tập về nhà
III. TIẾN TRÌNH BÀI DẠY:
1. Ổn định tổ chức: Kiểm tra sĩ số.
2. Kiểm tra bài cũ: Kiểm tra vở bài tập và yêu cầu học sinh viết lại thuật toán giải bài toán
kiểm tra tính nguyên tố của một số nguyên dương.
3. Giảng bài mới:
Nội dung Hoạt động của Giáo viên Hoạt động của Học sinh
Hoạt động 1: Tìm hiểu thuật toán sắp xếp bằng tráo đổi (Bubble Sort)
I. Bài toán sắp xếp
Cho dãy A gồm N số nguyên a
1,
a
2
, …, a
N
. Cần sắp xếp các số
hạng để dãy A trở thành dãy
không giảm.
• Thuật toán sắp xếp bằng
tráo đổi (Exchange Sort)

• Ý tưởng: Với mỗi cặp số hạng
đứng liền kề trong dãy, nếu số
trước lớn hơn số sau thì ta đổi
chỗ chúng cho nhau. Việc đó
được lặp lại, cho đến khi không
có sự đổi chỗ nào xảy ra nữa.
• Thuật toán:
a) Cách liệt kê:
- B1: Nhập N, các số hạng a
1
,
a
2
, …, a
N
;
- B2: M
¬
N ;
- B3: Nếu M< 2 thì đưa ra dãy
A đã được sắp xếp rồi kết thúc;
- B4: M
¬
M–1; i
¬
0;
- B5: i
¬
i+1;
- B6: Nếu i > M thì quay lại

bước 3;
- B7: Nếu a
i
> a
i+1
thì tráo đổi a
i
và a
i+1
cho nhau;
- B8: Quay lại bước 5.
Cho một dãy số nguyên A:
6, 1, 5, 3, 7, 8, 10, 7, 12,
4
Hãy sắp xếp dãy A trở thành
dãy không giảm.
• GV hướng dẫn HS tìm thuật
toán giải bài toán.
• GV nhận xét và bổ sung
• Hướng dẫn HS trình bày thuật
toán (bằng pp liệt kê)
• Nhận xét: Sau mỗi lần đổi chỗ,
giá trị lớn nhất của dãy A sẽ
được chuyển dần về cuối dãy và
sau lượt thứ nhất thì giá trị lớn
nhất xếp đúng vị trí là ở cuối
dãy. Và sau mỗi lượt chỉ thực
hiện với dãy đã bỏ bớt số hạng
cuối dãy (M
¬

M–1). Trong
thuật toán trên, i là biến chỉ số
có giá trị nguyên từ 0

M+1.
• GV yêu cầu HS vẽ sơ đồ thuật
toán giải bài toán trên và lấy ví
dụ mô phỏng.
• HS trả lời: 1, 3, 4, 5, 6, 7, 7, 8,
10, 12.
• Ghi lại sơ đồ thuật toán và hình
dung ra các bước thực hiện thuật
toán.
- Tiến hành vẽ sơ đồ khối và lấy
ví dụ áp dụng để mô phỏng.
4
Hoạt động 2: Tìm hiểu một số thuật toán sắp xếp
II. Khái niệm:
1) Sắp xếp là một quá trình tổ chức lại một dãy
các dữ liệu theo một trật tự nhất định.
2) Mục đích của việc sắp xếp là nhằm giúp cho
việc tìm kiếm dữ liệu một cách dễ dàng và nhanh
chóng. Sắp xếp là một việc làm hết sức cơ bản và
được dùng rộng rãi trong các kĩ thuật lập trình
nhằm sử lý dữ liệu.
3) Các giải thuật sắp xếp được phân chia thành hai
nhóm chính là:
- Sắp xếp trong
Toàn bộ cơ sở dữ liệu cần sắp xếp phải được đưa
vào bộ nhớ chính của máy tính. Do đó nó thường

được sử dụng khi khối lượng dữ liệu không vượt
quá dung lượng bộ nhớ chính.
a) Phương pháp đếm (Counting sort)
* Giải thích:
Nội dung của phương pháp này là đếm các phần
tử có khoá nhỏ hơn hay bằng khoá của các phần tử
A[i]. Nếu có j phần tử có khoá nhỏ hơn khoá của
phần tử A[i] thì phần tử A[i] sẽ có vị trí theo thứ
tự (j+1) trong dãy đã có thứ tự.
Trong giải thuật, ta dùng mảng Count[i] ( i = 1,
2, n ) với Count[i] cho biết số phần tử có khoá
nhỏ hơn khoá của phần tử A[i]. Như vậy
Count[i+1] là vị trí của phần tử A[i] trong dãy đã
có thứ tự.
b) Phương pháp chèn (Insertion Sort)
* Giải thích: Nội dung của phương pháp này là
giả sử ta có dãy A[1] A[i-1] đã có thứ tự, có phải
xác định vị trí thích hợp của phần tử A[i] trong
dãy A[1] A[i - 1] bằng phương pháp tìm kiếm
tuần tự từ A[i - 1] trở về A[1] để tìm ra vị trí thích
hợp của A[i]. Ta chèn A[i] vào vị trí này và kết
quả là đãy A[1] A[i] có thứ tự. Ta áp dụng cách
làm này với i = 2, 3, , n.
c) Phương pháp chọn (Selection Sort)
* Giải thích:Nội dung của phương pháp này là ở
bước thứ i (i = 1, 2, 3, ,n-1 ) ta lựa chọn phần tử
nhỏ nhất trong dãy A[i] A[n] rồi đổi chổ phần tử
này với phần tử A[i]. Cuối cùng ta sẽ có dãy
A[1] A[n] có thứ tự.
d) Phương pháp đổi chỗ:

Có rất nhiều phương pháp sắp xếp dựa trên việc
Nhóm sắp xếp trong bao gồm các phương pháp :
* Phương pháp đếm.
* Phương pháp chèn.
* Phương pháp chọn.
* Phương pháp đổi chổ.
* Phương pháp trộn.
* Ví dụ:
Sắp xếp dãy 2 3 1 5 2 7 6 9 4
i: 1 2 3 4 5 6 7 8
Count: 2 0 4 1 6 5 7 3
* Ví dụ:
Ta phải sắp xếp dãy số:
39 50 7 37 89 13 1 62
i=2 39 50 7 37 89 13 1 62
i=3 39 50 7 37 89 13 1 62
i=4 7 39 50 37 89 13 1 62
i=5 7 37 39 50 89 13 1 62
i=6 7 37 39 50 89 13 1 62
i=7 7 13 37 39 50 89 1 62
i=8 1 7 13 37 39 50 89 62
1 7 13 37 39 50 89 62
* Ví dụ:
Ta phải sắp xếp dãy số :
39 50 7 37 89 13 1 62
i=1 39 50 7 37 89 13 1 62
i=2 1 50 7 37 89 13 39 62
i=3 1 7 50 37 89 13 39 62
i=4 1 7 13 37 89 50 39 62
i=5 1 7 13 37 89 50 39 62

i=6 1 7 13 37 50 50 39 62
i=7 1 7 13 37 39 50 89 62
1 7 13 37 39 50 89 62
5
đổi chỗ giữa 2 phần tử của dãy. Sau đây chúng ta
xét các phương pháp:
- Bubble Sort.
- Shake Sort.
- Sell Sort.
- Quick Sort.
+ Bubble Sort:
* Giải thích: Nội dung của phương pháp này là
duyệt các dãy A[1], , A[n]. Nếu A[i].Key >
A[i+1].Key (i = 1, 2, 3, , n-1)#0 thì ta đổi chỗ
A[i].Key với phần tử A[i+1].Key. Lập lại quá
trình duyệt dãy này cho đến khi không còn việc
đổi chổ của hai phần tử.
Chú ý rằng bất cứ lúc nào phần tử nhỏ nhất cũng
gặp trước tiên. Nó như những bột khí nhẹ sẽ nổi
lên trên khi đun nước. Sau đó ở thứ hai phần tử
nhỏ thứ 2 sẽ được đặ vào đúng một vị trí. Vì vậy
sắp xếp nổi bột thao tác như một kiểu sắp xếp
chọn, mặc dù nó không làm nhiều việc hơn để đưa
từng phần tử vào đúng vị trí.
+ Shake Sort:
* Giải thích:
Phương pháp này là một cải tiến của phương
pháp Bubble Sort theo hướng "Không những phần
tử nhẹ nổi lên trên mà cả phần tử nặng cũng xuống
dưới" giống như khi ta rung"rung" một cái nồi và

thuật toán sắp xếp phải được điều khiển cả hai quá
trình "nổi lên" và "chìm xuống" này một cách tự
giác. Muốn vậy ta phải ghi nhớ lần đổi chổ cuối
cùng khi duyệt dãy từ trên lên và khi duyệt từ trên
xuoóng để quyết định chu trình kế tiếp sẽ duyệt từ
đâu đến đâu.
+ Shell Sort:
* Giải thích: Các phương pháp sắp xếp dã trình
bày ở trên nói chung đều di chuyển mỗi phần tử đi
một vị trí trong mỗi bước. Phương pháp Shell Sort
dựa trên ý tưởng chính là hoán các phần tử ở xa
nhau. Để làm được việc đó ta cần phải sắp các tập
tin để nó có tính chất là việc lấy mọi phần tử thứ h
(bắt đầu từ vị trí bất kì nào) cũng đều cho ra tập
tin đã sắp. Một tập tin như vậy được gọi là sắp
theo độ dài bước h. Một cách nói khác, một tập tin
dược sắp theo độ dài bước h là tập tin được sắp
độc lập với nhau, đan xen vào nhau. Bằng cách
sắp xếp theo độ dài bước h ứng với vài giá trị h
khá lớn, chúng ta có thể di chuyển các phần tử ở
những khoảng cách xa nhau trong mảng và vì vậy
dễ dàng hơn để sắp xếp độ dài bước h các giá tri
nhỏ hơn. Dùng thủ tục cho bất kì một dãy các giá
trị của h tận cùng là 1 sẽ cho ra một tập tin đã sắp
xong: Dó chính là Shell Sort.
+ Quick Sort:
* Ví dụ:
Ta phải sắp xếp dãy số:
39 50 7 37 89 13 1 62
Bước 0 1 2 3 4 5 6 7

50 1 1 1 1 13 1 62
39 39 7 7 7 7 7 7
7 50 39 13 13 13 13 13
37 7 50 39 37 37 37 37
89 37 13 50 39 39 39 39
13 89 37 37 50 50 50 50
1 13 89 62 62 62 62 62
62 62 62 89 89 89 89 89
* Ví dụ:
Sắp xếp dãy số:
39 50 7 37 89 13 1 62
d = 2 3 3 4 4
c = 8 8 7 7 4
39 1 1 1 1
50 39 39 7 7
7 50 7 39 13
37 7 37 13 37
89 37 50 37 39
13 89 13 50 50
1 13 62 62 62
62 62 89 89 89
* Ví dụ:
Ta phải sắp xếp dãy số:
39 50 7 39 89 13 1 62
Bước 1: 4-Sort
39 50 7 39 89 13 1 62
39 13 1 37 89 50 7 62
Bước 2: 2-Sort
39 13 1 37 89 50 7 62
1 13 7 37 39 50 89 62

Bước 3: 1-Sort
1 13 7 37 39 50 89 62
1 7 13 37 39 50 89 62
6
* Giải thích: Nội dung của phương pháp này là
chọn phần tử x ở giữa của dãy làm chuẩn để so
sánh. Ta phân hoạch dãy này thành 3 dãy con liên
tiếp nhau:
- Dãy con thứ nhất gồm phần tử có khoá nhỏ hơn
x.key.
- Dãy con thứ hai gồm các phần tử có khoá bằng
x.key.
- Dãy con thứ ba gồm các phần tử có khoá lớn
hơn x.key.
Sau đó áp dụng giải thuật phân hoạch này cho
dãy con thứ nhất nhất và dãy con thứ ba, nếu các
dãy con có nhiều hơn một phần tử (Đệ qui).
Cụ thể là xét một doạn của dãy từ thành phần L
đến thành phần thứ R.
- Lấy giá trị của thành phần thứ (L+R) Div 2 gán
vào biến X.
- Cho i ban đầu là L.
- Cho j ban đầu là R.
- Lập lại.
* Chừng nào còn A[i] < X thì tăng i.
* Chừng nào còn A[j] > X thì giảm j.
* i<=j thì
+ Hoán vị A[i] và A[j]
+ Tăng i
+ Giảm j

Cho đến khi i>j
+ Sắp xếp đoạn từ A[L] đến A[j]
+ Sắp xếp đoạn từ A[i] đến A[R]

* Ví dụ:
Sắp xếp dãy số:
39 50 7 37 89 13 1 62
X = 37
Sau 2 lần đổi chổ ta được dãy:
1 13 7 37 89 50 39 62
Xử lý dãy con:
1 13 7
Ta được:
1 7 13
Sử lý dãy con:
89 50 39 62
Ta được:
39 50 89 62
39 50 62 89
Vậy dãy đã sắp xếp là:
1 7 13 39 50 62 89
Hoạt động 3: Tìm hiểu thuật toán tìm kiếm nhị phân
• Xác định bài toán
- Input: Dãy A là dãy tăng gồm
N số nguyên khác nhau a
1
, a
2
,
…, a

N
và một số nguyên k
- Output: Chỉ số i mà a
i
= k hoặc
thông báo không có số hạng nào
của dãy A có giá trị bằng k.

Thuật toán:
* Cách liệt kê:
- B1: Nhập N, các số hạng a
1
,
a
2
, …, a
N
và khoá k
- B2: Dau
¬
1,Cuoi
¬
N;
- B3: Giưa =
2
Dau Cuoi+
 
 
 
;

- B4: Nếu a
Giưa
= k thì thông báo
chỉ số Giưa, rồi kết thúc;
- B5: Nếu a
Giưa
> k thì đặt Cuoi =
Giưa - 1, rồi chuyển đến bước 7;
- B6: Dau
¬
Giưa +1;
- B7: Nếu Dau > cuoi thì thông
báo dãy A không có số hạng nào
có giá trị bằng k, kết thúc;
• Nhấn mạnh dãy A là một dãy
tăng.
Hỏi: Hãy so sánh bài toán tìm
kiếm tuần tự với bài toán tìm
kiếm nhị phân.
• GV hướng dẫn HS tìm thuật
toán giải bài toán.
• Ý tưởng: Sử dụng tính chất
dãy A là dãy tăng, ta tìm cách
thu hẹp nhanh phạm vị tìm kiếm
sau mỗi lần so sánh khoá với số
hạng được chọn, ta chọn số hạng
a
Giữa
ở " giữa dãy" để so sánh với
k, trong đó Giưa =

1
2
N +
 
 
 
. Khi
đó:
- Nếu a
Giưa
= k thì Giưa là chỉ số
cần tìm.
- Nếu a
Giưa
> k thì do dãy A là
- Tìm hiểu bài toán
- Học sinh xác định bài toán
Đ. Dãy A ở đây là dãy tăng
HS. Lắng nghe, suy nghĩ và xây
dựng thuật toán.
- Xây dựng sơ đồ khối
- Lấy ví dụ để mô phỏng
nhằm nắm vững hơn kiến
thức.
7
- B8: Quay lại bước 3. dãy đã sắp xếp nên việc tìm
kiếm tiếp theo chỉ xét trên dãy
a
1
, a

2
, …, a
Giưa-1
.
- Nếu a
Giưa
< k thì thực hiện tìm
kiếm trên dãy a
Giưa+1
, a
Giưa+2
, …,
a
n
.
Quá trình trên sẽ được lặp lại
một số lần cho đến khi hoặc đã
tìm thấy khoá k trong dãy A
hoặc phạm vi tìm kiếm bằng
rỗng.
- GV: Nhấn mạnh thuật toán này
chi áp dụng với những bài toán
đã được sắp xếp tăng hoặc giảm.
4. Củng cố kiến thức:
- Thuật toán sắp xếp, tìm kiếm
- Cách diễn tả thuật toán: liệt kê, sơ đồ khối
5. Bài tập về nhà
Hãy xây dựng thuật toán giải bài toán sau bằng cách liệt kê hoặc sơ đồ khối.
Bài 1. Sắp xếp dãy số nguyên a
1

, a
2
, …, a
N
thành một dãy giảm (sử dụng cac phương phám đã học)
Bài 2. Dãy A gồm N số nguyên khác nhau a
1
, a
2
, …, a
N
và một số nguyên k. Kiểm tra xem trong dãy
có giá trị nào bằng k hay không?
Bài 3. Dãy A gồm N số nguyên a
1
, a
2
, …, a
N
. Kiểm tra xem trong dãy A có bao nhiêu số nguyên tố?
8
Ngày soạn: 20/09/2013
Ngày day: 25/09/2013
GIỚI THIỆU VỀ NGÔN NGỮ LẬP TRÌNH PASCAL
Buổi 3
I. MỤC TIÊU:
Kiến thức:
–Khái niệm về ngôn ngữ lập trình & chương trình máy tính
–Các bước xây dựng chương trình
–Tìm hiểu một số khái niệm cơ bản về ngôn ngữ lập trình Pascal.

–Áp dụng kiễn thức để giải một số bài toán đơn giản.
Kĩ năng:
– Biết các bước xây dựng chương trình và giải quyết một số bài toán đơn giản
Thái độ:
– Ham học, đam mê lập trình.
II. CHUẨN BỊ:
Giáo viên – Giáo án + tài liệu tham khảo cho học sinh.
Học sinh: –Nghiên cứu các bài đã học ở tiết trước và chuẩn bị chu đáo các bài tập về nhà
III. TIẾN TRÌNH BÀI DẠY:
1. Ổn định tổ chức: Kiểm tra sĩ số.
2. Kiểm tra bài cũ: Kiểm tra vở bài tập và yêu cầu học sinh viết lại thuật toán giải bài toán
kiểm tra tính nguyên tố của một số nguyên dương.
3. Giảng bài mới:
Nội dung Hoạt động của GV và HS
Hoạt động 1: Tìm hiêu khái niệm lập trình và ngôn ngữ lập trình
I. Ngôn ngữ lập trình
1. Lập trình là gì ?
Lập trình là các thao tác đưa ý nghĩ của
con người theo một trình tự có hệ thống vào máy
tính, yêu cầu máy tính thực hiện.
2. Ngôn ngữ lập trình
Là các phần mềm mà nhờ đó các kỹ thuật
viên mô phỏng lại các thao tác trên ngôn ngữ đó
thông qua các qui tắc qui ước mà ngôn ngữ đề ra.
Ngôn ngữ lập trình có chức năng chuyển toàn bộ
chương trình sang mã máy để máy tính có thể thực
hiện và đưa ra kết quả.
3. Các bước xây dựng chương trình
Bước 1. Xác định vấn đề - bài toán.
Bước 2. Lựa chọn phương pháp giải.

Bước 3. Xây dựng thuật toán hoặc thuật giải.
Bước 4. Cài đặt chương trình.
Bước 5. Hiệu chỉnh chương trình.
Bước 6. Thực hiện chương trình.
GV. Trình bày các khái niệm: lập trình và ngôn
ngữ lập trình
HS. Nhớ lại các khái niệm đã học
GV. Lấy một sô ngông ngữ lập trình phổ biến hiện
nay mà em biết
HS: Ngôn ngữ : C, C++, Pascal, Java,
HS. Nhắc lại các bước giải bài toán trên máy tính
GV. Trình bày đầy đủ các bước xây dựng chương
trình để học sinh định hướng khi viết chương trình
HS. Lắng nghe, ghi chép
Hoạt động 2: Tìm hiểu ngôn ngữ lập trình Pascal
9
II. Các khái niệm cơ bản
1. Bộ kí tự
- Các chữ cái: 26 chữ cái hoa (A,B, ,Z)
26 chữ thường (a,b, z)
- Các chữ số thập phân: 0,1,2,3,4,5,6,7,8,9
- Các dấu toán học thông dụng: + - * / > >=
< <= = ( )
- Dấu gạch nối _
- Các kí hiệu đặc biệt: ; . {} [ ] : % & @ $
# ^ ! ‘ “ ?
2. Từ khoá (Key word)
Từ khoá là các từ dành riêng cho Turbo Pascal,
mỗi từ có một chức năng nhất định. Khi sử dụng
phải dùng đúng với cú pháp.

3. Tên
Tên là một dãy kí tự được tạo thành từ các chữ
cái, chữ số và dấu gạch nối. Tên thường dùng để
đặt tên cho các đại lượng trong chương trình như
tên biến, hằng, tên kiểu dữ liệu mới vv
Kí tự đầu tiên của tên không được là chữ số.Tên
có độ dài tuỳ ý nhưng chỉ có 63 kí tự đầu tiên là có
ý nghĩa, tên không được trùng với tên của từ khoá.
* Tên chuẩn: là tên do Turbo Pascal định nghĩa
trước dùng chỉ các hàm, hằng, biến, thủ tục thư
viện của turbo Pascal.
* Tên do người lập trình đặt: Đặt tuỳ ý nhưng phải
tuân thủ theo nguyên tắc của Pascal như tên biến,
tên chương trình, tên kiểu dữ liệu mới
4. Dòng chú thích
- Đặt trong cập ngoặc :{}
5. Dấu chấm phẩy
Dấu chấm phẩy “ ; ” thường nằm sau các
câu lệnh nhằm ngăn cách giữa các câu lệnh với
nhau, không nên hiểu dấu “ ; ” dùng để kết thúc
một câu lệnh.
6. Các kiểu dữ liệu
a. Kiểu logic (Boolean)
- Các phép toán: AND, OR, XOR, NOT.
- Miền giá trị: TRUE (đúng), FALSE (sai).
b.Kiểu số nguyên
c. Kiểu số thực
- Có năm kiểu số thực, được tổng kết qua bảng
sau:
Tên Phạm vi biểu diễn Yêu cầu bộ

nhớ
GV. Turbo Pascal được xây dựng với bộ kí tự sau
HS. Lắng nghe, ghi bài
GV. Hãy nêu một số từ khóa mà em biết
Một số từ khoá:
BEGIN END
PROCEDURE FUNCTION
PROGRAM
CONST VAR TYPE IF
THEN FOR vvv
GV. Đặt một số tên đúng và tên sai trong ngôn
ngữ Pascal.
Ví dụ: PROGRAM TG; {Khai báo tên chương
trình tính diện tích tam giác}
GV. Chỉ có hai giá trị: TRUE (đúng), FALSE
(sai).
Tên Miền giá trị Yêu cầu bộ nhớ
Shortint -128 đến 127 1 byte
Integer -32768 đến 32767 2 byte
Longint - 2147483648 đến 2147483647 4 byte
Byte 0 đến 255 1 byte
10
Single 1.5*10
-45
đến 3.4*10
38
4 bytes
Real 2.9*10
-39
đến 1.7*10

38
6 bytes
Double 5.0*10
-324
đến 1.7*10
308
8 bytes
Extended 3.4*10
-4932
đến 1.1*10
4932
10 bytes
d. Kiểu kí tự (Char)
- Một giá trị kiểu Char chiếm 1 byte và biểu diễn
được một ký tự thông qua bảng mã ASCII.
ví dụ: mã (hay số thứ tự) của A là 65. Có tất cả
256 ký tự đánh số từ 0÷255. Vậy có 256 giá trị
kiểu Char Word 0 đến 65535
Hoạt động3: Tìm hiểu cấu trúc chương trình, khai báo, biểu thức, câu lệnh vào ra dữ liệu của ngữ
lập trình Pascal
III. cấu trúc chương trình, khai báo, biểu thức,
câu lệnh vào ra dữ liệu của ngữ lập trình Pascal
1. Cấu trúc chương trình
Phần 1: Khai báo
PROGRAM Tên_chương_trinh;
USES Tên_các_Unit; {Khai báo thư viện dùng
trong chương trình}
CONST Các hằng;{Khai báo hằng sử dụng trong
chương trình}
TYPE Các_kiểu_dữ_liêu_mới;{Khai báo kiểu

dữ liệu mới}
VAR Các_biến;{Dùng để khai báo biến sử dụng
trong chương trình}
PROCEDURE Các_thủ_tục;{Khai báo các
thủ tục}
FUNCTION Các_hàm; {Khai báo các hàm}
Phần 2: Thân chương trình
BEGIN {Bắt đầu chương trình}
{ Các câu lệnh }
END. {Kết thúc chương trình}
2. Khai báo tên chương trình
Cú pháp:
PROGRAM Tên_chương_trinh;
3. Khai báo thư viện
Cú pháp: USES tên thư viện;
4. Khai báo hằng
Cú pháp:
CONST tên hằng=giá trị hằng;
5. Khai báo biến
Cú pháp:
VAR
Tên biến: Kiểu dữ liệu của biến;
6. Biểu thức
- Biểu thức số học
- Biểu thức quan hệ
- Biểu thức logic
- Các hàm có đối số nguyên hoặc thực :
GV. Giới thiệu cấu trúc chương trình
HS. Lắng nghe, ghi bài
GV. Phần khai báo có thể có oặc không, phần thân

nhất định phải có.
Ví dụ:
PROGRAM VD1;
Ví dụ:
USES CRT;
Ví dụ:
CONST Max = 150; {hằng nguyên}
L = False; {hằng logic}
A = (5*4)/3; {hằng thực }
Ch = ‘Y’; {hằng ký tự}
VAR
x,y,z:Real;
C:Char;
T:Boolean;
Ví dụ: Abs(5 - 8) = 3
11
+ Hàm ABS(x):
+ Hàm SQR(x): tính bình phương của x: x
2
. Kiểu
dữ liệu của kết qủa cùng kiểu với đối số.
+ Hàm SQRT(x): tính , (x 0)
+ Hàm EXP(x) : tính e
x

+ Hàm LN(x): tính lnx, (x > 0)
+ Các hàm SIN(x), COS(x), và ARCTAN(x):
tính sinx, cosx và arctgx.
+ Hàm INT(x) : cho số thực bằng phần nguyên
của x.

+ Hàm FRAC(x) : cho số thực bằng phần lẻ của x.
Ví dụ :
Frac(12.55) = 0.55
+ Hàm TRUNC(x): cho số nguyên là phần nguyên
của x.
+ Hàm ROUND(x): cho số nguyên bằng cách làm
tròn x.
6. Câu lệnh gán
Cú pháp như sau :
TênBiến := Biểuthức ;
- Ý nghĩa : tính toán biểu thức bên phải, rồi lưu kết
qủa tính được vào tên biến ở vế trái.
7. Nhập và xuất dữ liệu
a. Nhập dữ liệu
- Read(biến1, biến2, , biếnk);
- Readln(biến1, biến2, , biếnk);
b. Xuất dữ liệu
- Write(Danh sách kết quả ra);
- Writeln(Danh sách kết quả ra);
Danh sách kết quả ra: Hằng, biến, biểu thức
Ví dụ:
Sqr(4.0) = 16.0
Sqr(7 div 3) = 4
Ví dụ :
Int(12.55) = 12.0
Int(1+10/3)=4.0
Ví dụ :
Trunc(12.55) = 12
Trunc(-2.98) = -2
Ví dụ :

Round(12.45) = 12
Round(-2.98) = -3
Ví dụ: X:=X+1; { Tăng X lên một đơn vị}
Ví dụ, để nhập dữ liệu cho hai biến thực x, y và
biến nguyên j, ta dùng lệnh:
Readln(x, y, j);
Cách nhập như sau:
hoặc gõ 10 6.5 4 (có khoảng trắng 
giữa hai số ),
Ví dụ khi thực hiện lệnh sau :
Writeln(‘ngon ngu pascal’);
kết qủa trên màn hình sẽ hiện hai dòng :
ngon ngu pascal
Hoạt động 4: Tìm hiểu một số ví dụ đơn giản trong ngữ lập trình Pascal
IV. Một sô ví dụ
Bài tập 1: Viết chương trình nhập vào độ dài hai cạnh
của tam giác và góc giữa hai cạnh đó, sau đó tính và in
ra màn hình diện tích của tam giác.
Program Tinh_dien_tich_tam_giac;
Var a,b,goc,dientich: Real;
Begin
Write('Nhap vao do dai canh thu nhat: '); Readln(a);
Write('Nhap vao do dai canh thu hai: '); Readln(b);
Write('Nhap vao goc giua hai canh: '); Readln(goc);
Dientich:=a*b*sin(goc)/2;
Writeln('Dien tich cua tam giac la: ',Dientich:0:2);
Readln;
End.
Bài tập 2: Viết chương trình tính
n

x
, x>0.
GV. Nêu ý tưởng
HS. Thực hiện bằng ngôn ngữ Pascal
Ý tưởng:
Công thức tính diện tích tam giác: S =
)sin(
2
1
θ
ba
với a,b là độ dài 2 cạnh và θ là
góc kẹp giữa 2 cạnh a và b.
12
Program Tinh_can_bac_n_cua_x;
Var x,S: Real;
n: Word;
Begin
Write('Nhap vao n= '); Readln(n);
Write('Nhap vao x= '); Readln(x);
S:=EXP(1/n*LN(x));
Writeln('S = ',S:0:2);
Readln;
End.
Bài tập 3 Viết chương trình nhập vào 2 số a, b.
Sau đó hoán đổi giá trị của 2 số đó:
a/ Cho phép dùng biến trung gian.
Program Swap;
Var a,b,tam: Integer;
Begin

Write('Nhap vao a= '); Readln(a);
Write('Nhap vao b= '); Readln(b);
tam:=a; {tam lấy giá trị của a}
a:=b; {a lấy giá trị của b}
b:=tam; {b lấy lại giá trị của tam}
Writeln('a = ',a,’ b = ‘,b);
Readln;
End.
Ý tưởng:
Ta có:
n
x
=
n
x
1
=
x
n
e
ln
1
b/ Không được phép dùng biến trung gian.
Program Swap;
Var a,b: Integer;
Begin
Write('Nhap vao a= '); Readln(a);
Write('Nhap vao b= '); Readln(b);
a:=a+b; {a lấy tổng giá trị của
a+b}

b:=a-b; {b lấy giá trị của a}
a:=a-b; {a lấy lại giá trị của b}
Writeln('a = ',a,’ b = ‘,b);
Readln;
End.
4. Củng cố kiến thức:
- Các thành phần của ngôn ngữ lập trình Pascal
- Chương trình đơn giản trong Pascal
5. Bài tập về nhà
Bài 1. Viết chương trình nhập vào các số nguyên: a, b, x, y, sau đó in ra màn hình kết quả của các
biểu thức sau:
a/
x y
x
y
+
+2
b/
( )( )
( )
a b c
r
h
a
+ − +
− −
4 2 3
2
9 1
c/ x

y
, x>0 d/ e
| sin ( ) |
a x x
+ −
2
Bài 2. Viết chương trình tính siện tích tam giác theo công thức sau:
S =
p p a p b p c
( )( )( )− − −
với p =
1
2
(a+b+c)
13
Ngày soạn: 28/10/2013
Ngày dạy: 02/10/2013
CÁC CÂU LỆNH CÓ CẤU TRÚC
Buổi 4
I. MỤC TIÊU:
Kiến thức:
– Giới thiệu câu lệnh có cấu trúc: rẽ nhánh và lặp
– Ứng dụng các câu lệnh để giải một số bài toán
Kĩ năng:
– Biết xây dựng được các chương trình ứng với từng trường hợp đối với từng cấu trúc
Thái độ:
– Ham học, đam mê lập trình.
II. CHUẨN BỊ:
Giáo viên – Giáo án + tài liệu tham khảo cho học sinh.
Học sinh: –Nghiên cứu các bài đã học ở tiết trước và chuẩn bị chu đáo các bài tập về nhà

III. TIẾN TRÌNH BÀI DẠY:
1. Ổn định tổ chức: Kiểm tra sĩ số.
2. Kiểm tra bài cũ: Kiểm tra vở bài tập và yêu cầu học sinh viết lại thuật toán giải bài toán
kiểm tra tính nguyên tố của một số nguyên dương.
3. Giảng bài mới:
Nội dung Hoạt động của GV và HS
Hoạt động 1: Tìm hiêu cấu trúc rẽ nhánh
II. Câu lệnh điều kiện IF THEN
1. Câu lệnh điều kiện có hai dạng như sau:
Câu lệnh điều kiện thiếu:
IF <Điều kiện logic> THEN
<Công việc>;
Câu lệnh điều kiện đủ:
IF <Điều kiện logic> THEN
<Công việc1>
ELSE <Công việc 2>;
2. Hoạt động:
- Dạng thiếu: Khi gặp lệnh này chương trình sẽ đi
kiểm tra điều kiện logic, nếu điều kiện logic là
đúng sẽ đi thực hiện <công việc >, nếu sai sẽ bỏ
qua <công việc > và kết thúc.
- Dạng đủ : Khi gặp lệnh này chương trình sẽ đi
kiểm tra điều kiện logic, nếu điều kiện logic là
đúng sẽ đi thực hiện <công việc 1> và bỏ qua
<công việc 2>, nếu sai sẽ đi thực hiện <công việc
2> và bỏ qua <công việc 1>. Trong đó <công
việc1>, <công việc 2> có thể là một câu lệnh
ghép.
Sơ đồ thuật toán cho câu lệnh điều kiện If -
then

14
Câu lệnh
1
IF
Điều
kiện
ĐS
Câu lệnh
2
Câu lệnh
IF
Đ_kiện
Đ
S
Hoạt động 1: Tìm hiêu cấu trúc rẽ nhánh
3. Câu lệnh ghép
Dạng tổng quát của lệnh ghép:
BEGIN
<Câu lệnh 1>;
<Câu lệnh 2>;
<Câu lệnh 3>;

<Câu lệnh n>;
END;
4. Một số ví dụ
Ví dụ 1. Viết chương trình giải phương trình bậc
nhất ax+b=0
Uses Crt;
Var a,b,x : real;
Begin

Write('a = '); Readln(a);
Write('b = '); Readln(b);
If a = 0 Then { Nếu a bằng 0 }
If b = 0 Then Writeln('Phuong trinh co vo so
nghiem')
Else Writeln('Phuong trinh vo nghiem')
Else Begin
x:= -b/a;
Writeln('Phuong trinh co nghiem la :',x:0:2);
End;
Readln;
End.
Ví dụ 2. Viết chương trình nhập vào một số
nguyên và kiểm tra xem số vừa nhập là số chẵn
hay số lẻ.
Ví dụ 3: Tìm số lớn nhất trong ba số nhập vào từ
bàn phím.
Program so_lon_nhat;
Var a,b,c,max:real;
BEGIN
Write('Nhap so a=');Readln(a);
Write('Nhap so b=');Readln(b);
Write('Nhap so c=');Readln(c);
Max:=a; IF Max<b then max:=b;
IF Max<c then max:=c;
Writeln('So lon nhat trong ba so la:',max:6:2);
Readln;
END.
GV. Đặt vấn đề
- Lệnh ghép là một nhóm lệnh được đặt giữa hai từ

khoá BEGIN và END; nhằm thực hiện một công
việc cơ bản nào đó. Lệnh ghép thường xuất hiện
trong các cấu trúc chương trình như câu lệnh điều
kiện, cấu trúc lặp Khi thực hiện kệnh ghép thực
hiện tuần tự từng câu lệnh một theo thứ tự từ trên
xuống.
GV. Áp dung cấu trúc rẽ nhánh để thực hiện
chương trình trên máy tính.
HS. Tiến hành thực hiện chương trình
Uses crt;
Var x:integer;
Begin
Write('Nhap vao mot so nguyen : '); Readln(x);
If x MOD 2=0 Then Writeln('So vua nhap vao la
so chan') Else Writeln('So vua nhap vao la so le');
Readln;
End.

GV. Yêu cầu học sinh sử dung cả hai cấu trúc rẽ
nhánh
- Có thể dùng thuật toán sau:
IF a<b then Max:=b else Max:=a;
If Max<c then Max:=c;
15
Hoạt động 2: Tìm hiêu cấu trúc lặp For –do
II. Cấu lặp xác định FOR - DO
1. Cú pháp
Dạng một: (FOR dạng tiến)
FOR <biến điều khiển>:=giá trị đầu TO
<giá trị cuối> DO <Công việc>;

Dạng hai: (FOR dạng lùi)
FOR <biến điều khiển>:=giá trị cuối DOWNTO
<giá trị đầu> DO <Công việc>;
2. Hoạt động
* Hoạt động của vòng FOR dạng tiến:
Ban đầu biến điều khiển nhận giá trị đầu sau
đó kiểm tra giá trị của biến điều khiển với giá trị
cuối. Nếu giá trị của biến điều khiển <= giá trị
cuối thì đi thực hiện công việc sau DO, sau khi
thực hiện công việc xong, quay trở về đầu vòng
lặp tăng giá trị của biến điều khiển lên một đơn vị
và tiếp tục so sánh với giá trị cuối, quá trình tiếp
tục cho đến khi giá trị của biến điều khiển lớn hơn
giá trị cuối thì thoát khỏi vòng lặp.
GV. Vòng lặp FOR có hai dạng:
Chú ý: Kiểu của <biến điều khiển>, giá trị đầu, giá
trị cuối phải có cùng kiểu giá trị và phải là kiểu vô
hướng đếm được.
GV. Trình bày hoạt động của câu lệnh
* Hoạt động của vòng FOR dạng lùi:
Ban đầu biến điều khiển nhận giá trị cuối
sau đó kiểm tra giá trị của biến điều khiển với giá
trị đầu. Nếu giá trị của biến điều khiển >= giá trị
đầu thì đi thực hiện công việc sau DO, sau khi
thực hiện công việc xong, quay trở về đầu vòng
lặp tăng giá trị của biến điều khiển lên một đơn vị
và tiếp tục so sánh với giá trị đầu, quá trình tiếp
tục cho đến khi giá trị của biến điều khiển nhỏ hơn
giá trị đầu thì thoát khỏi vòng lặp.
Sơ đồ hoạt động của câu lệnh For - do

16
Dạng tiến
Biến đếm:=Min
Biến đếm<=Max
+
-
Thoát
S;
INC(Biến đếm);
Dạng lùi
Biến đếm:=Max
Biến đếm>=Max
+
-
Thoát
S;
DEC(Biến đếm);
II. Cấu lặp xác định FOR - DO
3. Một số ví dụ
Ví dụ 1.Viết chương trình tính tổng S = 1+2+
+N.
Program TinhTong;
Uses crt;
Var N,i,S:integer;
Begin
Clrscr;
Write('Nhap vao gia tri cua N :');
Readln(N);
S:=0;
For i:=1 to N do S:=S+i;

Writeln('Ket qua la :',S);
Readln;
End.
Ví dụ 2. Tìm tất cả các ước số của một số nguyên
n cho trước
Program Timuocso;
Var I,n:integer;
Begin
Write(' Nhap vao n=');Readln(n);
For i:=1 to n do
If n mod i=0 then
Write(i:8);
Readln;
End.
Ví dụ 3. Viết chương trình nhập vào N số nguyên
từ bàn phím. Hãy tính và in ra màn hình tổng của
các số vừa được nhập vào.
Program Tong;
Uses crt;
Var N,S,i,X : Integer;
Begin
Clrscr; S:=0;
For i:=1 To n Do
Begin
Write('Nhap so nguyen X= '); Readln(X);
S:=S+X; End;
Writeln(‘Tong cac so duoc nhap vao la: ‘,S);
Readln;End.
GV. Dùng vòng lặp FOR dạng tiến
HS. Giải bài toán

GV. Yêu cầu học sinh sử dụng dạng lùi
HS. Thay thế câu lệnh
For i:=N downto 1 do S:=S+i;
GV. Phân tích bài toán:
Dữ liệu vào là một số nguyên n nhập từ bàn
phím. Dữ liệu ra là tất cả các ước số của số nguyên
n. Một số i được gọi là ước số của n khi n chia cho
số đó không dư, tức là n mod i=0. Ta xây dựng
một vòng lặp từ 1 tới n và kiểm tra tất cả các số
nguyên trong khoảng đó xem số nào thoả mãn
điều kiện trên thì in ra màn hình.
Thuật toán và sơ đồ
- Bắt đầu
- Nhập số nguyên n
- Trong vòng lặp với i chạy từ 1 đến n, kiểm
tra nếu n mod i=0 thì in i ra màn hình
- Kết thúc
GV. Ý tưởng:
Dùng phương pháp cộng dồn. Cho vòng
lặp FOR chạy từ 1 tới N, ứng với lần lặp thứ i, ta
nhập vào số nguyên X và đồng thời cộng dồn X
vào biến S.
HS. Xây dựng chương trình
17
III. Cấu trúc lặp không xác định While Do
1. Cú pháp:
While <BT logic> Do <Công việc>;
2. Hoạt động:
Khi gặp vòng lặp này chương trình sẽ kiểm tra
biểu thức logic. Nếu biểu thức logic đúng đi thực

hiện công việc, sau khi thực hiện công việc xong
quay trở về đầu vòng lặp kiểm tra biểu thức logic,
quá trình tiếp tục cho đến khi biểu thức logic là
sai thì thoát khỏi vòng lặp.
3. Một số ví dụ
Ví dụ 1: Tìm UCLN của hai số nguyên a và b theo
thuật toán.
Chương trình.
Program USCLN;
Var
a,b:integer;
Begin
Write(' Nhap vao so a=');readln(a);
Write(' Nhap vao so b=');readln(b);
While a<>b do
If a>b then a:=a-b Else b:=b-a;
Writeln('USCLN la:',a);
Readln
End.
Ví dụ 2. Lãi xuất hàng tháng gửi tiết kiệm là 1%
(không kỳ hạn) . Một người gửi vào số tiền ban
đầu là a .Vậy sau bao nhiêu tháng người đó đạt
được số tiền ít nhất là b .
Uses crt;
Const lai==0.01;
Var a,b,luu:real; t:integer;
Begin
Clrscr;
Write(‘nhap a=’); readln(a);
Write(‘nhap b=’); readln(b);

T:=0; luu:=a;
While a<b do
Begin
a:=a+luu*lai;
t:=t+1;
end;
writeln(; so thang la t=’,t); readln; end.
- Nếu a>b thì thay a=a-b, Ngược lại b:=b-a. Quá
trình được lặp lại cho đến khi a= b thì dừng lại.
GV. Nêu ý tưởng giải bài toán
18
4. Củng cố kiến thức:
- Cấu trúc rẽ nhánh và lặp trong Pascal
- Xây dựng một số chương trình thông dụng thường gặp
5. Bài tập về nhà
Bài 1. Viết chương trình tính tổng bình phương các số chẵn từ 1 đến n.
Bài 2. Viết chương trình tìm các số có 3 chữ số
abc
sao cho:
abc
= a
3
+ b
3
+ c
3
.
Ý tưởng:
Dùng phương pháp vét cạn. Ta biết rằng: a có thể có giá trị từ 1→9 (vì a là số hàng trăm), b,c
có thể có giá trị từ 0→9. Ta sẽ dùng 3 vòng lặp FOR lồng nhau để duyệt qua tất cả các trường hợp

của a,b,c.
Ứng với mỗi bộ abc, ta sẽ kiểm tra: Nếu 100.a + 10.b + c = a
3
+ b
3
+ c
3
thì in ra bộ abc đó.
Bài 3. Viết chương trình tính S=1+x+x/2+x/3+ +x/n với x là số thực , n là số nguyên cho trước
Viết chương trình nhập vào một số nguyên dương. Hãy thông báo lên màn hình số đó có bao nhiêu
chữ số và tổng các chữ số của số đó.
Gợi ý:
Dùng vòng lặp WHILE. Trong khi N>0 thì: lấy ra chữ số cuối cùng của N để tính bằng phép
toán MOD 10, sau đó bỏ bớt đi chữ số cuối cùng của N bằng phép toán DIV 10.
Bài 4. Viết chương trình để tìm lời giải cho bài toán sau:
Trăm trâu trăm bó cỏ
Trâu đứng ăn năm
Trâu nằm ăn ba
Lụ khụ trân già
Ba con một bó
Hỏi có bao nhiêu trâu mỗi loại?
19
Ngày soạn: 10/10/2013
Ngày day: 12/10/2013
BÀI TẬP LỆNH CÓ CẤU TRÚC
Buổi 5
I. MỤC TIÊU:
Kiến thức:
– Tiếp tục rèn luyện ky năng xây dựng chương trình bằng câu lệnh có cấu trúc
– Biết nhận dạng bài toán và lựa chong câu trúc thích hợp

– Ứng dụng các câu lệnh để giải một số bài toán từ đơn giản đến phức tạp
Kĩ năng:
– Xây dựng thuật toán, nhận dạng bài toán, lựa chọn cấu trúc phù hợp
Thái độ:
– Ham học, đam mê lập trình.
II. CHUẨN BỊ:
Giáo viên – Giáo án + tài liệu tham khảo cho học sinh.
Học sinh: –Nghiên cứu các bài đã học ở tiết trước và chuẩn bị chu đáo các bài tập về nhà
III. TIẾN TRÌNH BÀI DẠY:
1. Ổn định tổ chức: Kiểm tra sĩ số.
2. Kiểm tra bài cũ: Kiểm tra vở bài tập và yêu cầu học sinh viết lại thuật toán giải bài toán
kiểm tra tính nguyên tố của một số nguyên dương.
3. Giảng bài mới:
Nội dung Hoạt động của GV và HS
Bài 1. Viết chương trình nhập vào số tự nhiên N
rồi thông báo lên màn hình số đó có phải là số
nguyên tố hay không.
Uses crt;
Var N,i,d : Word;
Begin
Writeln(;nhap N=’); readln(N);
If N<2 Then Writeln(N,’ khong phai la so nguyen
to’)
Else
Begin
{Đếm số ước số}
d:=0;
For i:=2 To N div 2 Do
If N MOD i=0 Then
d:=d+1;

{Kiểm tra}
If d=0 Then Writeln(N,’ la so
nguyen to’)
Else Writeln(N,’ khong phai la so
nguyen to’);
End;
Readln;
End.
Bài 2. Số hoàn thiện là số tự nhiên có tổng các ước
của nó (không kể chính nó) bằng chính nó. Viết
chương trình kiểm tra xem một số được nhập vào
từ bàn phím có phải là số hoàn thiện hay không?
Ví dụ: 6, 28 là các số hoàn thiện.
Uses crt;
GV. Nêu ý tưởng giải bài toán
Ý tưởng:
N là số nguyên tố nếu N không có ước số
nào từ 2 → N div 2. Từ định nghĩa này ta đưa ra
giải thuật:
- Đếm số ước số của N từ 2 → N div 2 lưu
vào biến d.
- Nếu d=0 thì N là số nguyên tố.
HS. quan sát, suy nghĩ, xây dựng chương trình
GV. Gợi ý:
- Tính tổng các ước số của N: từ 1 → N div
2 lưu vào biến S.
- Nếu S=N thì N là số hoàn thiện.
20
Var N,i,d : Word;
Begin

Writeln(;nhap N=’); readln(N);
D:=0;
For i:=1 to N div 2 do
If N MOD i=0 Then d:=d+i;
If d=N Then Writeln(N,’ la so hoan thien to’)
Else Writeln(N,’ khong phai la so hoan thien’);
Readln;
End.
Bai 3. Viết chương trình tính các tổng sau
- S = n! = 1*2* *n {n giai thừa}
- S1 = 1 + 1/2! + + 1/n!
USES CRT;
VAR
I,N,S:INTEGER;
BEGIN
WRITE('NHAP N=');
READLN(N);
s:=1;
FOR I:=2 TO N DO s:=S*i;
WRITELN('TONG S=',S:8);
READLN
END.
Bai 4. Lập chương trình tính tổng s=1+1/3!+1/5!+
…+ 1/(2n+1)! với n nguyên nhập vào từ bàn phím
(n>=1).
USES CRT;
VAR S:REAL;
GT,I,N:INTEGER;
BEGIN
WRITE('NHAP N=');

READLN(N);
s:=0; GT:=1;
FOR I:=1 TO N DO
BEGIN
S:=S+ 1/GT;
GT:=GT*(2*I)*(2*I+1);
END;
WRITELN('TONG S=',S:8:2);
READLN
END.
Bai 5. Có ba loại tiền là: 1000đ, 2000đ, 5000đ.
Lập chương trình tìm tất cả các khả năng có thể có
được số tiền là 150.000đ từ 3 loại tiền trên.
Chương trình:
Uses crt;
Var t,t1,n,dem:byte;
Begin clrscr;
Dem:=0;
For t:=1 to 3 do
For t1:=1 to trunc((15-t*5)/2) do
HS. Xây dựng chương trình
USES CRT;
VAR S:REAL;
GT,I,N:INTEGER;
BEGIN
WRITE('NHAP N=');
READLN(N);
s:=0; GT:=1;
FOR I:=1 TO N DO
BEGIN

GT:=GT*I;
S:=S+ 1/GT;
END;
WRITELN('TONG S=',S:8:2);
READLN
END.
GV. Tương tự như bài tính tổng giai thừa trên
nhưng chỉ có thay đổi ở mẫu .
- GT:=GT*(2*i)*(2*i+1);
21
If (t*5+t1*2+(15-t*5-t1*2=15) and (15-t1*5-
t2*2>0) then
Begin
Dem:=dem+1;
Writeln(‘kha nang la:’,dem);
Write(‘ so tien loai 5000 la:’,t);
Write(‘ so tien loai 2000 la:’,t1);
Write(‘ so tien loai 1000 la:’,15-t*5-t1*2);
Readln
End.
Bài 6. Viết chương trình nhập vào một số
nguyên dương. Hãy thông báo lên màn hình số
đó có bao nhiêu chữ số và tổng các chữ số của
số đó.
GV. Gợi ý:
- Dùng vòng lặp WHILE. Trong khi N>0 thì:
lấy ra chữ số cuối cùng của N để tính bằng
phép toán MOD 10, sau đó bỏ bớt đi chữ số
cuối cùng của N bằng phép toán DIV 10.
4. Củng cố kiến thức:

- Cấu trúc rẽ nhánh và lặp trong Pascal
- Xây dựng một số chương trình có cấu trúc thuật toán phức tạp hơn
5. Bài tập về nhà
Bài tập 1 Viết chương trình tính các tổng sau:
S1 = 1 + x + x
2
/2! + x
3
/3! + + x
n
/n!
S2 = 1 - x + x
2
/2! – x
3
/3! + + (-1)
n
x
n
/n!
S3 = 1 + sin(x) + sin
2
(x) + + sin
n
(x).
Bài tập 2 Viết chương trình tính các tổng sau: Đổi một số nguyên sang hệ nhị phân
22
Ngày soạn: 15/10/2013
Ngày dạy: 21/10/2013
DỮ LIỆU CÓ CẤU TRÚC

KIỂU MẢNG
Buổi 6
I. MỤC TIÊU:
Kiến thức:
– Giới thiệu kiểu dữ liệu có cấu trúc: kiểu mảng
– Cách khái báo kiểu mảng: một chiều, hai chiều
– Các tháo tác lên các phần tử của mảng
– Ứng dụng để giải một số bài toán từ đơn giản đến phức tạp
Kĩ năng:
– Vận dụng được kiểu dữ liệu mảng để xử lí một số bài toán.
Thái độ:
– Ham học, đam mê lập trình.
II. CHUẨN BỊ:
Giáo viên – Giáo án + tài liệu tham khảo cho học sinh.
Học sinh: –Nghiên cứu các bài đã học ở tiết trước và chuẩn bị chu đáo các bài tập về nhà
III. TIẾN TRÌNH BÀI DẠY:
1. Ổn định tổ chức: Kiểm tra sĩ số.
2. Kiểm tra bài cũ: Kiểm tra vở bài tập và yêu cầu học sinh viết lại thuật toán giải bài toán
kiểm tra tính nguyên tố của một số nguyên dương.
3. Giảng bài mới:
Nội dung Hoạt động của GV và HS
I. Kiểu mảng một chiều
1.Khái niệm
Mảng một chiều là:
• Một kiểu dữ liệu có cấu trúc
• Gồm dãy hữu hạn các phần tử
• Các phần tử cùng kiểu.
2. Khái báo.
Cách 1: Khai báo trực tiếp:
Var <tên biến mảng>: array[kiểu chỉ số] of <kiểu

phần tử>;
Cách 2: Khai báo gián tiếp
Type <tên kiểu mảng>= array[kiểu chỉ số] of
<kiểu phần tử>;
Var <tên biến mảng>:<tên kiểu mảng>;
mảng.
3. Tham chiếu đến từng phần tử của mảng
- Xác định bởi tên mảng cùng với chỉ số, được viết
trong cặp ngoặ [ và ].
GV. Đối với mảng cần lưu ý
• Tên mảng
• Số lượng phần tử
• Kiểu dữ liệu phần tử
• Các khai báo mảng
• Cách truy cập đến các phần tử của mảng.
Trong đó: +Kiểu chỉ số thường là một đoạn số
nguyên liên tục có dạng n1 n2(n1<n2)(n1,n2 là
các hằng hoặc biểu thức)
+ Kiểu phần tử là kiểu dl của các phần tử của
Ví dụ:
Type mmc=array[1 100] of integer;
Var a:mmc;
Ví dụ:
- a[1] là phần tử ở vị trí 1 của mảng a.
- a[i] là phần tử ở vị trí i của
23
4. Ví dụ về mảng một chiều
Ví dụ 1: Nhập vào một mảng các số nguyên. In ra
màn hình tất cả các số lớn nhất trong dãy.
Program VD1;

Uses CRT;
Var
a:array[1 100] of Integer;
i, max, n:Integer;
BEGIN
Write(‘ Nap vao so phan tu cua mang n=’);
readln(n);
For i:=1 to n do
Begin
Write(‘ Nhap vao phan tu thu a[‘,i,’]=’);
readln(a[i]);
end;
max:=a[1];
For i:=2 to n do
If max<a[i] then max:=a[i];
For i:=1 to n do
If max=a[i] then
Writeln(‘ so lon nhat’,max,’nam o vi tri’,i);
Readln;
END.
Ví dụ 2: Nhập vào một mảng các số nguyên. Sắp
xếp mảng theo thứ tự tăng dần.
Program VD2;
Uses CRT;
Var
a:array[1 100] of Integer;
i, j, n,tg:Integer;
BEGIN
Write(‘ Nap vao so phan tu cua mang
n=’);readln(n);

For i:=1 to n do
Begin
Write(‘ Nhap vao phan tu thu a[‘,i,’]=’);
readln(a[i]);
end;
For i:=1 to n-1 do
For j:=i+1 to n do
if a[i]>a[j] then
GV. Đưa ra gọi ý
Ý tưởng:
- Cho số lớn nhất là số đầu tiên: Max:=a[1].
- Duyệt qua các phần tử a[i], với i chạy từ 2 tới N:
Nếu a[i]>Max thì thay Max:=a[i];
HS. Xây dựng chương trình
GV. Đưa ra gợi ý
- Áp dụng thuật toán nổi bọt để giải bài toán
HS. Xây dựng chương trình
Ý tưởng:
Cho biến i chạy từ 1 đến N-1, đồng thời cho biến j
chạy từ i+1 đến N: Nếu A[i]>A[j] thì đổi chổ A[i],
A[j].
24
Begin
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
end;
For i:=1 to n do
Write(a[i]:6);
Readln;

END.
Ví dụ3: Nhập vào một mảng các số nguyên. Xoá
phần tử thứ k của mảng.
Program VD5;
Uses CRT;
Var
a:array[1 100] of Integer;
i,k, n:Integer;
BEGIN
Write(‘ Nap vao so phan tu cua mang n=’);
readln(n);
For i:=1 to n do
Begin
Write(‘ Nhap vao phan tu thu a[‘,i,’]=’);
readln(a[i]);
end;
Write(‘Nhap vao vi tri can loai bo k=’);
readln(k);
For i:=k to n-1 do
a[i]:=a[i+1];
For i:=1 to n-1 do
Begin
Writeln(‘Day sau khi laoi bo phan tu thu’, k,’
la:’);
Write(a[i]:6);
End;
readln;
END.
25

×