1. MỞ ĐẦU
1.1. Lý do chọn đề tài
Bài toán trong tin học là bài toán xuất phát từ bài toán thực tế, việc
xây dựng giải thuật để giải bài toán tin học bằng máy tính phải bảo đảm
những tính chất cơ bản của thuật toán, trong các tính chất cơ bản đó thì yêu
cầu về thuật toán sau khi đã được cài đặt chương trình trên máy tính bằng
ngôn ngữ lập trình thì thuật toán đó là tối ưu. Đây là yêu cầu rất quan trọng
đối với người lập trình.
Trong việc giảng dạy lập trình cho HS, ngoài việc giúp HS lĩnh hội
những kiến thức cơ bản. Giáo viên còn phải biết kích thích tính tích cực, sự
sáng tạo say mê học hỏi của HS trong việc học tập của các em. Bởi vì, việc
học tập tự giác, tích cực, chủ động và sáng tạo đòi hỏi HS phải có ý thức về
những mục tiêu đặt ra và tạo được động lực bên trong thúc đẩy bản thân họ
hoạt động để đạt các mục tiêu đó.
Chương trình Tin học lớp 11 là một môn học khó, kiến thức thì trải
rộng nhưng đòi hỏi các em phải biết vận dụng kiến thức của từng bài sắp xếp
một cách lôgic để lập trình giải một bài toán hoàn chỉnh. Tuy nhiên trong thực
tế rất ít HS làm được điều đó. Hầu hết các em vận dụng câu lệnh, cú pháp
không phù hợp cho yêu cầu của bài tập.
Là một giáo viên giảng dạy môn Tin học ở trường THPT mà cơ sở vật
chất của trường còn thiếu thốn, tuy nhiên để hưởng ứng đổi mới phương pháp
giảng dạy nên nhà trường đã đầu tư rất mạnh về trang thiết bị như máy tính,
máy chiếu, …, tạo cơ hội cho giáo viên tìm hiểu, ứng dụng vào dạy học. Các
cách thiết kế bài giảng hiện nay nhằm mục đích áp dụng phương pháp hiện
đại để bồi dưỡng cho học sinh năng lực ham muốn học hỏi, tư duy sáng tạo,
năng lực tự giải quyết vấn đề, rèn luyện và phát triển năng lực tự học sáng
tạo, nghiên cứu, nghĩ và làm việc một cách tự chủ, …
Xuất phát từ thực tiễn giảng dạy tại trường THPT Mai Anh Tuấn tôi
thấy rằng, để đạt hiệu quả cao trong mỗi phần học, tiết học cần có cách thiết
kế bài giảng cho phù hợp với nội dung kiến thức; phương pháp, phương tiện
dạy học phải phù hợp với từng đối tượng học sinh. Để qua mỗi phần học, tiết
học học sinh thích thú với kiến thức mới, qua đó hiểu được kiến thức đã học
trên lớp, đồng thời học sinh thấy được tầm quan trọng của vấn đề và việc ứng
dụng của kiến thức trước hết để đáp ứng những yêu cầu của môn học, sau đó
là việc ứng dụng của nó vào các công việc thực tiễn trong đời sống xã hội
(nếu có).
Qua nhiều năm giảng dạy tại trường, đa số các HS là con em thuần nông vì
điều kiện kinh tế của gia đình còn khó khăn nên phương tiện học tập bộ môn (máy
vi tính) hầu như rất ít. Mặt khác, đa số các em chưa có kỹ năng lập trình hay kỹ
năng phân tích, thiết kế về lập trình chưa được tốt nên tôi chọn đề tài “ Một số giải
pháp giúp học sinh xây dựng chương trình dựa trên ý tưởng và các thuật
toán cơ bản trong lập trình pascal- tin học 11”
Trang: 1
Qua đề tài này, tôi muốn chia sẻ một số kinh nghiệm nho nhỏ của
mình đến các đồng nghiệp cũng như các em HS có niềm đam mê lập trình qua
đó hình thành một số kỹ năng về lập trình cho tốt hơn.
1.2. Mục đích nghiên cứu:
Như ta đã biết 1 thuật toán đưa ra thì chỉ có thể giải được một bài
toán, nhưng một bài toán thì có thể có nhiều cách (thuật toán) để giải nó.
Chính vì vậy đứng trước một bài toán chúng ta phải hướng cho học sinh lựa
chọn được thuật toán tối ưu nhất để viết chương trình.
Trong đề tài này tôi muốn đưa ra một số phương pháp dẫn dắt học
sinh tìm ra những giải pháp để có thể lập trình tốt hơn một số bài tập trong
sách giáo khoa tin học 11 dựa trên ý tưởng và các thuật toán cơ bản.
1.3. Đối tượng nghiên cứu:
Đối tượng nghiên cứu: HS lớp 11 bậc trung học phổ thông tại trường
THPT Mai Anh Tuấn.
Phạm vi nghiên cứu: Một số mảng kiến thức lý thuyết và bài tập đã
được nêu trong các bài học của chương IV, V và VI từ trang 52 đến trang 117
sách giáo khoa Tin học 11 bậc trung học phổ thông.
1.4. Phương pháp nghiên cứu:
Sáng kiến kinh nghiệm của tôi dựa theo các phương pháp: Nghiên cứu
sách giáo khoa, các tài liệu liên quan đến chuyên môn, đối chiếu, so sánh,
phân tích và tổng hợp kết quả đánh giá kết quả học tập của HS.
2. NỘI DUNG SÁNG KIẾN KINH NGHIỆM
2.1. Cơ sở lí luận của sáng kiến kinh nghiệm:
Hiện nay trong lý luận dạy học nói chung và lý luận dạy học môn Tin
học nói riêng yêu cầu sử dụng khá nhiều phương pháp: thảo luận, chia nhóm,
hỏi đáp, … Các cách thiết kế bài giảng hiện nay nhằm mục đích áp dụng
phương pháp hiện đại để bồi dưỡng cho HS năng lực tư duy sáng tạo, năng
lực giải quyết vấn đề, … rèn luyện và phát triển năng lực tự học sáng tạo.
Phương pháp dạy học hiện nay, người thầy chủ yếu là người định hướng,
người cố vấn giúp HS tự đánh giá và phát triển năng lực của mình theo
phương pháp định hướng và phát triển năng lực của HS.
Khi tiếp xúc với một bài toán trong tin học, HS thường cố gắng tìm ra
thuật toán tốt nhất để giải quyết trọn vẹn bài toán, đối với những bài toán đơn
giản HS có thể tìm ra ngay thuật toán nhưng đối với những bài toán khó đặc
biệt là những bài toán có dữ liệu đầu vào lớn thì việc tìm ra thuật toán tối ưu
nhất để đạt được số điểm tối đa thường là rất khó. HS không nghĩ được rằng
nếu sử dụng những giải thuật đơn giản để giải quyết các bài toán khó thì cho
dù không đạt được số điểm tối đa nhưng cũng có được một điểm số ở một
mức độ nào đó phù hợp với khả năng của mình để tránh điểm không.
Để rèn luyện kỹ năng tiếp cận bài toán nhằm giúp HS có được kinh
nghiệm tiếp cận bài toán khó bằng nhiều thuật toán theo từng bước từ đơn
giản đến phức tạp phù hợp với khả năng của mình để có được điểm số tốt nhất
Trang: 2
đòi hỏi người giáo viên cần rèn luyện kỹ năng tiếp cận bài toán để làm giảm
độ phức tạp của bài toán.
Khi giải một bài toán trong Tin học, chúng ta cần chọn một trong số
các thuật toán tốt nhất để giải bài toán đó.
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm:
Mặc dù HS có ý thức học tốt, ham học hỏi nhưng đa số HS của trường
được tuyển sinh vào lớp 10 với chất lượng đầu vào chưa thật sự cao dẫn đến
tư duy của các em còn nhiều hạn chế đối với những môn học đòi hỏi tư duy
cao. Đặc thù của môn tin học là một môn có kiến thức trừu tượng, đặc biệt là
môn tin học lớp 11 với một số phần như kiểu mảng, kiểu xâu và chương trình
con nên các em HS còn tiếp thu chậm và tư duy học lập trình chưa được tốt.
Để giúp các em HS tiếp thu tốt và rèn luyện cho các em HS về kỹ năng phân
tích bài toán cũng như lập trình thì sáng kiến kinh nghiệm của tôi sẽ đưa ra
một số biện pháp như sau:
Để giải một bài toán tin học trên máy tính chúng ta thường phải thực
hiện theo từng bước:
Bước đầu tiên (Xác định bài toán) đây là bước quan trọng nhất để
hiểu rõ nội dung bài toán.
Đây là yêu cầu quen thuộc đối với những người làm toán. Để hiểu bài
toán theo cách tiếp cận của tin học ta phải xây dựng một số ví dụ phản ánh
đúng các yêu cầu đề ra của đầu bài rồi thử giải các ví dụ đó để hình thành dần
những hướng đi của thuật toán.
Bước thứ hai (Ý tưởng) là dùng một ngôn ngữ quen thuộc, tốt nhất là
ngôn ngữ toán học đặc tả các đối tượng cần xử lí ở mức độ trừu tượng, lập các
tương quan, xây dựng các hệ thức thể hiện các quan hệ giữa các đại lượng cần
xử lí để có được thuật toán tốt nhất có thể.
Bước thứ ba (Xây dựng thuật toán)là bước xác định cấu trúc dữ liệu
để biểu diễn các đối tượng cần xử lí cho phù hợp với các thao tác của thuật
toán.
Trong những bước tiếp theo ta tiếp tục làm mịn dần các đặc tả theo
trình tự từ trên xuống, từ trừu tượng đến cụ thể, từ đại thể đến chi tiết.
Bước cuối cùng là sử dụng ngôn ngữ lập trình đã chọn để viết chương
trình hoàn chỉnh. Ở bước này ta tiến hành theo kĩ thuật đi từ dưới lên, từ
những thao tác nhỏ đến các thao tác tổ hợp.
Sau khi nhận được chương trình ta cho chương trình chạy thử với các
dữ liệu lấy từ các ví dụ đã xây dựng ở bước đầu tiên.
Chúng ta sẽ vận dụng cách tiếp cận trên để giải một số bài tập cụ thể
được nêu trong sách giáo khoa tin học 11.
Trang: 3
2.3. Các giải pháp đã sử dụng để giải quyết vấn đề:
2.3.1. Hệ thống một số nội dung lý thuyết cần nghiên cứu bài tập:
2.3.1.1. Kiểu mảng một chiều
a. Khái niệm: Mảng một chiều là dãy hữu hạn các phần tử cùng kiểu.
Mảng được đặt tên và một phần tử của nó có một chỉ số. Để mô tả mảng một
chiều cần xác định kiểu của các phần tử và cách đánh số các phần tử của nó.
Các quy tắc, cách thức khi làm việc với mảng một chiều trong ngôn
ngữ lập trình:
- Tên kiểu mảng một chiều;
- Số lượng phần tử mảng;
- Kiểu dữ liệu của phần tử;
- Cách khai báo biến mảng;
- Cách tham chiếu đến phần tử;
b. Khai báo:Tổng quát, khai báo biến một chiều gồm có hai dạng:
- 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> ;
- Trong đó:
+ Kiểu chỉ số: thường là một đoạn số nguyên liên tục có dạng n1 .. n2
với n1, n2 là các hằng hoặc biểu thức số nguyên xác định chỉ số đầu và chỉ số
cuối (n1 ≤ n2).
+ Kiểu phần tử: là kiểu của các phần tử mảng
Ví dụ 1: Hãy viết câu lệnh khai báo biến A là dãy số thực có 15 phần tử;
Ví dụ 2: Hãy viết câu lệnh khai báo các biến M, N, P là dãy số nguyên
có 25 phần tử;
- Trong quá trình giảng dạy trên lớp, tôi đã hướng dẫn và giải thích
cho HS lúc nào thì khai báo biến theo cách 1 (Trực tiếp), lúc nào thì khai báo
biến theo cách 2 (Gián tiếp) để HS khỏi thụ động trong lúc khai báo biến
thuộc kiểu mảng một chiều.
- Trong 2 ví dụ ở trên, tôi đã hướng dẫn HS khai báo biến như sau:
Ví dụ 1:
Var A : Array [1..15] of Real;
Ví dụ 2:
Type songuyen = Array [1 .. 25] of Integer;
Var M, N, P : songuyen;
- Tham chiếu phần tử của mảng một chiều được xác định bởi tên biến
mảng cùng với chỉ số, được viết trong cặp ngoặc [ và ].
Ví dụ 3: Tham chiếu phần tử thứ 10 của dãy số nguyên M như ví dụ 2
được viết là M[10]
Trang: 4
Chỉ số phần tử
Mảng M
1
2
2
6
10
15
24
-9
25
14
M[10]
Hình 1: Minh họa tham chiếu tới mảng một chiều
2.3.1.2. Kiểu xâu
a. Khái niệm
Xâu là dãy các ký tự trong bộ mã ASCII, mỗi ký tự là một phần tử của
xâu. Số lượng ký tự trong xâu được gọi là độ dài của xâu. Xâu có độ dài bằng
0 được gọi là xâu rỗng.
Bản chất của kiểu xâu là kiểu mảng một chiều mà mỗi phần tử là một
kí tự. Dựa vào điều này giáo viên cần gợi ý để HS nhận xét và thấy rõ được
đặc điểm của kiểu xâu.
Từ cách dẫn dắt đặt vấn đề trên HS có thể hiểu và xem xâu kí tự là
một mảng một chiều mà mỗi phần tử là một kí tự. Điều đó sẽ có ích rất nhiều
trong việc sử dụng các câu lệnh lặp để duyệt qua các kí tự để tham chiếu đến
một kí tự nào đó trong xâu.
Mặc dù xâu có thể xem như mảng một chiều, tuy nhiên khi làm việc
với dãy hữu hạn các kí tự mà xem như một xâu thì người lập trình được sử
dụng rất nhiều câu lệnh cũng như các thủ tục và hàm, điều này sẽ thuận lợi
hơn rất nhiều trong khi viết chương trình. Từ đó có thể nhấn mạnh để HS hiểu
rõ hơn về vai trò của kiểu xâu
b. Khai báo
Biến kiểu xâu được khai báo như sau:
Var <Tên biến xâu> : String [<Độ dài lớn nhất của xâu>];
Trong đó: Độ dài lớn nhất của xâu không vượt quá 255. Trong mô tả
xâu có thể bỏ qua phần khai báo độ dài, khi đó độ dài lớn nhất của xâu sẽ
nhận giá trị ngầm định là 255.
Ví dụ:
Var S : String [30];
S1: String; {Nghĩa là S1 có độ dài ngầm định là 255}
2.3.1.3. Chương trình con
Ngoài các nội dung đã giới thiệu ở trên thì chương trình con là một
nội dung mà HS khó tiếp cận nhất trong nội dung tin học 11. Vì đây là phần
lập trình có cấu trúc. Vì vậy, hiểu chi tiết biến, về cấu trúc của chương trình
con dạng thủ tục và hàm, về lời gọi chương trình con cũng như cách truyền
tham số cho chương trình con sẽ mang tính quyết định trong việc viết chương
trình có sử dụng chương trình con. Ta sẽ xét cụ thể từng phần như sau:
Trang: 5
a. Cấu trúc của chương trình con
Cấu trúc của chương trình con tương tự như cấu trúc của một chương trình,
nhưng nhất thiết phải có tên và phần đầu để khai báo tên, nếu là hàm thì phải khai
báo kiểu dữ liệu trả về của hàm. Cấu trúc của chương trình con như sau:
<Phần đầu>
[<Phần khai báo>]
<Phần thân>
b. Tham số hình thức
Các biến được khai báo cho dữ liệu vào/ra được gọi là tham số hình
thức của chương trình con.
Các biến được khai báo để dùng riêng trong chương trình con được
gọi là biến cục bộ.
Biến toàn cục là biến được dùng trong chương trình chính và các
chương trình con đều được sử dụng biến toàn cục.
c. Tham số thực sự
Để thực hiện một chương trình con, ta cần phải có lệnh gọi nó gồm tên
chương trình con với tham số (nếu có) là các hằng và các biến chứa dữ liệu
vào và ra tương ứng với các tham số hình thức được đặt trong cặp ngoặc (và).
Các hằng và biến này được gọi là các tham số thực sự.
Sau khi chương trình con kết thúc, lệnh tiếp theo lệnh gọi chương
trình con sẽ được thực hiện.
d. Cấu trúc của thủ tục
Thủ tục có cấu trúc như sau:
Procedure <Tên thủ tục>[(<Danh sách tham số>)];
[<Phần khai báo>]
Begin
[<Dãy các lệnh>]
End;
Trong đó:
- Danh sách tham số có thể có hoặc không.
- Phần khai báo: dùng để xác định các hằng, kiểu, biến và cũng có thể
là các chương trình con khác được sử dụng trong thủ tục.
e. Cấu trúc của hàm
Hàm có cấu trúc như sau:
Function <Tên hàm>[(<Danh sách tham số>)]:<Kiểu dữ liệu>;
[<Phần khai báo>]
Begin
[<Dãy các lệnh>]
<Tên hàm> := <Biểu thức>;
End;
Cũng giống như thủ tục, nếu hàm không có tham số hình thức thì
không cần có danh sách tham số.
Trang: 6
Để làm rõ những nội dung đã trình bày ở trên, SKKN giới thiệu một
số bài tập và các bước tiến hành để lập trình giải một số bài toán cụ thể sau:
2.3.2. Một số bài tập
Bài tập 1: Viết chương trình nhập vào dãy số nguyên gồm n phần tử.
Tìm chỉ số (vị trí) và giá trị lớn nhất của dãy số vừa nhập rồi đưa kết quả ra
màn hình.
Đối với bài toán này, tôi yêu cầu học sinh nhắc lại các bước: xác định
bài toán, ý tưởng và thuật toán (đã được nghiên cứu trong chương trình tin
học 10). Sau đó học sinh dựa vào thuật toán để đưa ra những câu lệnh cơ bản
phải sử dụng để lập trình và cuối cùng là chỉnh sửa để được một chương trình
hoàn chỉnh.
*. Xác định bài toán:
- Input: Nhập n (n ∈ Z+) và dãy số nguyên: a1, a2, …, an
- Output: Chỉ số và giá trị lớn nhất trong dãy số đã cho.
*. Ý tưởng:
- Khởi tạo Max = a1, vt =1
- Lần lượt với i từ 2 đến n, so sánh giá trị số hạng a i với giá trị Max,
nếu ai > Max thì Max nhận giá trị mới là ai và vt = i.
*. Thuật toán:
- Bước 1: Nhập n và dãy số a1, a2, …, an
- Bước 2: Max ← a1, vt ← 1, i ← 2;
- Bước 3: Nếu i > N thì đưa ra giá trị Max và vt rồi kết thúc;
- Bước 4:
+ Bước 4.1. Nếu ai > Max thì Max ← ai;
+ Bước 4.2. i ← i +1 rồi quay lại bước 3; [1]
*. Chương trình:
Program baitap1;
Uses crt;
Var a: Array [1..100] of Integer;
i, n, max, vt: integer;
Begin
Clrscr;
Write(‘Nhap so luong phan tu: ’); Readln(n);
For i := 1 to n do
Begin
Write(‘a[’, i, ‘] = ’);
Readln(a[i]);
End;
Max := a[1];
vt := 1;
For i := 2 to n do
If a[i] > max Then
Trang: 7
Begin
Max := a[i];
Vt := i;
End;
Write(‘Gia tri lon nhat cua day la: ’, max);
Write(‘Gia tri lon nhat o tai vi tri: ’, vt);
Readln;
End. [ 2]
Bài tập 2: Viết chương trình nhập vào từ bàn phím một xâu S. Thay
thế tất cả các cụm kí tự ‘anh’ bằng cụm kí tự ‘em’ rồi đưa kết quả ra màn
hình.
Đối với bài toán này, tôi yêu cầu học sinh làm các bước: xác định bài
toán, ý tưởng và thuật toán. Sau đó học sinh dựa vào thuật toán để đưa ra
những câu lệnh cơ bản có thể sử dụng để lập trình và cuối cùng là chỉnh sửa
để được một chương trình hoàn chỉnh.
*. Xác định bài toán:
- Input: Nhập một xâu S
- Output: Thay thế tất cả các cụm kí tự ‘anh’ bằng cụm kí tự ‘em’.
*. Ý tưởng:
- Tìm vị trí xâu con ‘anh’ trong xâu S đã cho;
- Xóa xâu con này đi rồi chèn xâu ‘em’ vào vị trí đó
- Lặp lại quá trình này cho đến khi không tìm thấy xâu ‘anh’ cần thay
thế trong xâu S nữa.
*. Thuật toán:
- Bước 1: Nhập xâu S
- Bước 2: Chừng nào còn tìm thấy xâu con ‘anh’ trong xâu S thì còn
làm các công việc sau:
+ Bước 2.1: Tìm vị trí bắt đầu của xâu ‘anh’ trong xâu S;
+ Bước 2.2: Xóa xâu ‘anh’ vừa tìm thấy;
+ Bước 2.3: Chèn xâu ‘em’ vào xâu S tại vị trí trước đây xuất hiện xâu
‘anh’
- Bước 3: In kết quả
*. Chương trình:
Program Baitap2;
Uses crt;
Var s: string;
Vt: byte;
Begin
Write(‘Nhap xau S: ’); Readln(s);
While pos (‘anh’, s) <> 0 Do
Begin
Vt := pos(‘anh’, s);
Trang: 8
Trang: 9
Delete(s,vt,3)
Insert(‘em’,s,vt);
End;
Write(‘Xau sau khi duoc thay the la: ’, s);
Readln;
End. [2] [3]
Bài tập 3: Viết chương trình nhập vào dãy số nguyên có n phần tử.
Ghi dãy số nguyên vừa nhập vào tệp có tên là VIDU.INP
Đối với bài toán này, tôi yêu cầu học sinh làm các bước: xác định bài toán, ý
tưởng và thuật toán. Sau đó học sinh dựa vào thuật toán để đưa ra những câu lệnh
cơ bản có thể sử dụng để lập trình và cuối cùng là chỉnh sửa để được một chương
trình hoàn chỉnh.
*. Xác định bài toán:
− Input: Nhập N và dãy số nguyên a1, a2, …, a3
− Output: Tệp VIDU.INP chứa dãy số vừa nhập.
*. Ý tưởng:
− Gắn tên tệp và mở tệp để ghi;
− Nhập n (số lượng phần tử)
− Nhập dãy số và ghi dữ liệu vào tệp
− Đóng tệp
* Thuật toán:
− Bước 1: Gắn tên tệp Assign(f1, ‘C:\VIDU.INP’);
− Bước 2: Mở tệp để ghi Rewrite(f1);
− Bước 3: Nhập n (số lượng phần tử);
− Bước 4: i ← 1;
− Bước 5: Nếu i > n thì sang bước 7
− Bước 6:
+ Bước 6.1: Nhập giá trị cho dãy số và ghi vào tệp f1;
+ Bước 6.2: i ← i + 1 quay lại bước 5;
− Bước 7: Đóng tệp
*. Chương trình:
Program Baitap3;
Uses crt;
Var f: text;
a : Array[1..100] of Integer;
i, n : Integer;
Begin
Clrscr;
Assign(f, ‘C:\VIDU.INP’);
Rewrite(f);
Write(‘Nhap so luong phan tu: ’);
Readln(n);
Trang: 10
For i := 1 to n do
Begin
Write(‘a[’, i , ‘]= ’);
Readln(a[i]);
Write(f, a[i]:4);
End;
Close(f);
Readln;
End. [5]
Ở trong chương trình trên, khi thực hiện thủ tục rewrite(f) nếu thư mục
gốc của đĩa C chưa có tệp VIDU.INP thì tệp sẽ được tạo với nội dung rỗng.
Nếu đã có, thì nội dung cũ sẽ bị xóa để chuẩn bị ghi dữ liệu mới vào.
Bài tập 4: Viết chương trình nhập vào hai số nguyên dương a và b.
Tính bội chung nhỏ nhất của hai số đó rồi đưa kết quả ra màn hình.
Đối với bài toán này học sinh có thể làm theo hai cách. Tuy nhiên tôi
thường hướng dẫn HS những lớp tôi dạy là viết bằng cách 2.
Cách 1:
*. Xác định bài toán:
−
Input: Nhập a, b với a, b ∈ Z+
−
Output: BCNN(a,b) = ?
*. Ý tưởng:
− Trong khi a<>b , nếu a>b thì a a-b; ngược lại thì b b-a cho đến
khi a=b thì UCLN a
− BCNN được tính là tích của a*b chia cho UCLN(a,b)
*. Thuật toán:
− Bước 1: Nhập a, b với a, b ∈ Z+;
− Bước 2: Nếu a = b thì lấy giá trị chung này làm UCLN rồi chuyển
sang bước 5;
− Bước 3: Nếu a > b thì a ← a – b ngược lại b ← b – a;
− Bước 4: Quay lại bước 2;
− Bước 5: BCNN ← a*b / UCLN (a,b) rồi kết thúc.
*. Chương trình:
Program Baitap4-c1;
Uses crt;
Var a, b, m, n, BCNN: integer;
Begin
Clrscr;
Write(‘Nhap a va b: ’);
Readln(a, b);
m:= a; n:= b;
While m <> n do
If m > n Then m := m - n Else n := n – m;
Trang: 11
BCNN := a*b div m;
Write(‘BCNN cua ’, a, ‘va ’, b, ‘ la: ’, BCNN)
Readln;
END.
Với cách này, mặc dù HS xây dựng thuật toán đúng. Nhưng nếu
không để ý thì đa số HS dễ bị sai kết quả khi tính tích của a*b. Vì: Nếu không
lưu giá trị ban đầu của a và b thì sau quá trình tính toán giá trị của a và b bị
thay đổi. Do đó, đối với bài toán này, tôi hay hướng dẫn HS những lớp tôi dạy
là viết bằng cách 2 là sử dụng chương trình con.
Cách 2:
+ Nên viết hàm tính UCLN của hai số nguyên dương vì chương trình
con cần trả về một giá trị;
+ Hàm tìm BCNN của hai số nguyên dương a, b cần sử dụng hàm
UCLN(a,b) đã viết ở trên.
Sau đây là thứ tự các bước tiến hành để lập trình bài toán này.
*. Xác định bài toán:
−
Input: Nhập a, b với a, b ∈ Z+
−
Output: BCNN(a,b) = ?
*. Ý tưởng:
− Trước tiên, xây dựng hàm tìm UCLN(a,b)
− BCNN được tính là tích của a*b chia cho UCLN(a,b)
*. Thuật toán:
− Bước 1: Nhập a, b với a, b ∈ Z+;
− Bước 2: Nếu a = b thì lấy giá trị chung này làm UCLN rồi chuyển
sang bước 5;
− Bước 3: Nếu a > b thì a ← a – b ngược lại b ← b – a;
− Bước 4: Quay lại bước 2;
− Bước 5: BCNN ← a*b / UCLN (a,b) rồi kết thúc.
*. Chương trình:
Program Baitap4;
Uses crt;
Var a, b : integer;
Function UCLN (m, n: Integer) : Integer;
Begin
While m <> n do
If m > n Then m := m - n Else n := n – m;
UCLN := m;
End;
Function BCNN (m, n: Integer) : Integer;
Begin
BCNN := m*n div UCLN(m, n);
End;
Trang: 12
{Chuong trinh chinh}
BEGIN
Clrscr;
Write(‘Nhap a va b: ’);
Readln(a, b);
Write(‘BCNN cua ’, a, ‘va ’, b, ‘ la: ’, BCNN(a,b));
Readln;
END. [5] [6]
Bài tập 5: Viết chương trình xóa các ký tự chữ số trong một xâu ký tự
được nhập từ bàn phím.
Đối với bài toán này học sinh có thể lập trình được bằng 2 cách. Tuy
nhiên tôi thường hướng dẫn HS những lớp tôi dạy là viết bằng cách 1.
Cách 1:
*. Xác định bài toán:
−
Input: Nhập xâu st
−
Output: xâu đã xóa các ký tự chữ số.
*. Ý tưởng:
- Kiểm tra tuần tự xem trong xâu st có ký tự chữ số hay không? Nếu
có thì xóa kí tự vừa tìm được. (i 1 to length(st))
*. Thuật toán:
− Bước 1: Nhập xâu st
− Bước 2: Trong khi i<= length(st) thì kiểm tra, nếu st[i] IN [‘0’ ..
‘9’] thì delete (st,i,1)
− Bước 3: Đưa ra xâu st sau khi đã xóa các kí tự số
*. Chương trình:
Program Baitap5;
Uses crt;
Var st: string;
i: byte;
Begin
Clrscr;
Write(‘Nhap xau st: ’);
Readln(st);
For i: 1 to length(st) do
If st[i] IN [‘0’ .. ‘9’] Then delete(st, i, 1);
Write(‘Xau sau khi xoa:’,st);
Readln;
END.
Cách 2: Sử dụng chương trình con
+ Viết hàm POSNUM kiểm tra xem trong xâu st có ký tự chữ số hay
không? Nếu có, hàm trả về vị trí đầu tiên của ký tự chữ số, ngược lại hàm trả
về giá trị 0.
Trang: 13
+ Biến Ok là biến kiểu Boolean để kiểm tra xem các phần tử trong
xâu có là ký tự số hay không.
Sau đây là thứ tự các bước tiến hành để lập trình bài toán này.
*. Xác định bài toán:
−
Input: Nhập xâu st
−
Output: xâu đã xóa các ký tự chữ số.
*. Ý tưởng:
− Trước tiên, xây dựng hàm POSNUM để kiểm tra xem trong xâu st
có ký tự chữ số hay không?
− Trong khi xâu st còn kí tự số thì xóa các kí tự số đó.
*. Thuật toán:
− Bước 1: Nhập xâu st
− Bước 2: OK false; i1
− Bước 3: Trong khi length(st) >=i và not OK thì kiểm tra
− Bước 4: Nếu S[i] là các kí tự số thì Ok= true (i = 1 hết xâu)
− Bước 5: Nếu OK = true thì hàm POSNUM trả về giá trị i, ngược lại
hàm POSNUM trả về giá trị 0.
*. Chương trình:
Program Baitap5;
Uses crt;
Var st: string;
Function POSNUM (st: string) : Byte;
Var OK: Boolean; i: Byte;
Begin
OK:= False;
i:= 1;
While (i<=Length(st)) AND (not OK) do
If st[i] IN [‘0’ .. ‘9’] Then Ok:= true
Else i:=i+1;
If OK then POSNUM:=i Else POSNUM:=0;
End;
{Chuong trinh chinh}
BEGIN
Clrscr;
Write(‘Nhap xau st: ’); Readln(st);
While POSNUM(st) <> 0 Do Delete(st, POSNUM(st),1);
Write(‘Xau sau khi xoa:’,st);
Readln;
END. [6]
Bài tập 6: Viết chương trình nhập vào một mảng A gồm N số nguyên
khác nhau và nhập thêm vào một số nguyên k. Hãy kiểm tra xem phần tử k có
trong mảng A hay không?
Trang: 14
Đối với bài toán này, tôi hướng dẫn học sinh làm theo 2 cách sau:
*) Cách 1. sử dụng thuật toán tìm kiếm tuần tự
*) Cách 2. sử dụng chương trình con
Sau đây là thứ tự các bước tiến hành để lập trình bài toán này.
Cách 1:
*. Xác định bài toán:
−
Input: Dãy A gồm N số nguyên khác nhau và số nguyên k;
−
Output: Chỉ số i mà Ai = 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.
*. Ý tưởng: Tìm kiếm tuần tự được thực hiện một cách tự nhiên. Lần
lượt từ số hạng thứ nhất, ta so sánh giá trị số hạng đang xét với khóa cho đến
khi hoặc gặp một số hạng bằng khóa hoặc dãy đã được xét hết và không có
giá trị nào bằng khóa. Trong trường hợp thứ hai dãy A không có số hạng nào
bằng khóa.
*. Thuật toán:
− Bước 1: Nhập N, các số hạng A1, A2, ….., AN và khóa k;
− Bước 2: i1;
− Bước 3: Nếu Ai = k thì thông báo chỉ số i, rồi kết thúc;
− Bước 4: i i + 1;
− Bước 5: Nếu i > N thì thông báo dãy A không có số hạng có giá trị
bằng k, rồi kết thúc;
− Bước 6: Quay lại bước 3. [1]
*. Chương trình:
Program Baitap6;
Uses crt;
Var A: array[1..200] of integer;
i, N, k, dem: integer;
Begin
Clrscr;
Write (‘ nhap so phan tu cua day:’); readln (N);
For i:= 1 to N do
Begin
Write(‘A[‘,i,’]=’); readln(A[i]);
End;
Write (‘ nhap k:’); readln (k);
i:=1; dem:=0;
For i:= 1 to N do
if A[i] = k then
begin
dem:= dem + 1; break;
end;
Trang: 15
If dem <> 0 then write (k, ‘o vi tri thu ’,i, ‘trong day A’)
Else write (k, ‘khong co trong day A’);
Readln
End.
Cách 2:
*. Xác định bài toán:
−
Input: Dãy A gồm N số nguyên khác nhau và số nguyên k;
−
Output: Chỉ số i mà Ai = 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.
*. Ý tưởng: Dùng thuật toán tìm kiếm tuần tự. So sánh k với từng
phần tử của mảng a. Thuật toán dừng lại khi k = A[i] hoặc i> N.
Hàm TimKiem kiểm tra xem trong mảng có k = A[i] hay không? Nếu
có thì vị trí cần tìm là i, ngược lại thì kết quả tìm là 0 (không tìm thấy)
*. Chương trình:
Program Baitap6;
Uses crt;
Type Mang= array[1..200] of integer;
Var A: Mang; i, N, k: integer;
Function TimKiem(k, N:integer; A:Mang): Integer;
Var i: integer;
Begin
i:= 1;
while (i < N) and (k <> A[i]) do i:= i+1;
if i<= N then TimKiem:=i else TimKiem: =0;
End;
{Chuong trinh chinh}
BEGIN
Clrscr;
{ Nhap mang}
Write (‘ nhap so phan tu cua day:’); readln (N);
For i:= 1 to N do
Begin
Write(‘A[‘,i,’]=’); readln(A[i]);
End;
Write (‘ nhap k:’); readln (k);
{ Ket qua tim kiem}
If TimKiem(k, N, A)<>0 then
Writeln(‘vi tri cua k trong mang la:’, TimKiem(k, N, A))
Else writeln ( k, ‘ khong co trong mang A’);
Readln
END. [6]
Trang: 16
2.4. Hiệu quả của sáng kiến kinh nghiệm đối với hoạt động giáo
dục, với bản thân, đồng nghiệp và nhà trường:
2.4.1. Kết quả thực tiễn
− Ban đầu HS còn gặp khó khăn và bỡ ngỡ trong việc hình thành các
bước để lập trình cho một bài toán. Tuy nhiên, sau khi được hướng dẫn cụ thể
các bước tiến hành giải quyết một bài toán trong Tin học đã thu được kết quả
như sau:
+ Chất lượng lập trình tăng lên rõ rệt.
+ Giúp HS củng cố những kiến thức đã học bước đầu hình thành các
kỹ năng về lập trình.
2.4.2. Kết quả thực nghiệm
− Trong quá trình trao đổi, thảo luận, trình bày HS được thể hiện khả
năng vận dụng, hiểu biết của mình nên các em tỏ ra hăng hái trong việc giơ
tay phát biểu tranh luận. Đồng thời tiết học trở nên sinh động hơn và giáo viên
không đóng vai trò là người xây dựng lý luận mà HS là người chủ động để
giải quyết các vấn đề. Sau đây là kết quả thu được khi tôi triển khai đề tài
thông qua một số bài kiểm tra.
Lớp thực nghiệm: Lớp 11G, 11K năm học 2015 – 2016
Giỏi (G)
Khá (K)
Trung bình
Yếu
Kém
Lớp TSHS Số Tỷ lệ Số Tỷ lệ Số Tỷ lệ Số Tỷ lệ Số Tỷ lệ
HS
%
HS
%
HS
%
HS
%
HS
%
11G
41
35 85,37% 6 14,63% 0 0,00% 0 0,00% 0 0,00%
11K
45
10 22,22% 30 66,67% 5 11,11% 0 0,00% 0 0,00%
Lớp đối chứng: Lớp 11B, 11H năm học 2014 – 2015
Lớp TSHS Số
HS
11B
42
20
11H
43
0
Giỏi
Tỷ lệ
%
47,62%
0,00%
Số
HS
18
15
Khá
Trung bình
Yếu
Kém
Tỷ lệ Số Tỷ lệ Số Tỷ lệ Số Tỷ lệ
%
HS
%
HS
%
HS
%
42,86% 4 9,52% 0 0.00% 0 0.00%
34,88% 27 62,79% 1 2,33% 0 0,00%
Trang: 17
Hình 2: Biểu đồ so sánh kết quả đánh giá
Theo kết quả bảng so sánh và biểu đồ, tôi nhận thấy rằng những nội
dung và giải pháp trong SKKN đã nêu ở trên đã có một kết quả khả quan hơn.
Điều đó được thể hiện ở tỉ lệ của các lớp được phân công giảng dạy khi tôi áp
dụng thử nghiệm với những mức độ khác nhau. Trong đó, lớp 11G các năm
học là lớp chọn có đầu vào và kết quả học tập tốt hơn các lớp 11 khác cùng
khóa. Sau khi nghiên cứu và thử nghiệm áp dụng tại đơn vị bước đầu đã có
những hiệu quả, bên cạnh đó tôi thấy cần có thời gian nhiều hơn để thử
nghiệm, vì vẫn còn có một số HS ở một số lớp vẫn chưa đạt yêu cầu tuy điểm
kiểm tra xấp xỉ trung bình.
Trang: 18
3. KẾT LUẬN, KIẾN NGHỊ
3.1. Kết luận:
Ngôn ngữ lập trình nói chung đóng vai trò rất quan trọng trong việc xây
dựng các chương trình ứng dụng để phục vụ cho cuộc sống. Nhờ sự phát triển của
tin học trong đó các nhà lập trình chuyên nghiệp đóng vai trò không nhỏ mà hiện
nay hầu hết các lĩnh vực trong xã hội đã ứng dụng được tin học để giải quyết công
việc nhanh, hiệu quả và chính xác hơn.
Hiện nay, ngôn ngữ lập trình Pascal đã trở thành ngôn ngữ lập trình phổ biến
nhất trên thế giới sử dụng trong lĩnh vực giảng dạy. Trong quá trình giảng dạy các
thầy cô có thể đưa ra các vấn đề từ dễ đến khó để các em có thể chứng tỏ được khả
năng của mình, làm cho HS yêu thích môn học, ham học hỏi và tìm tòi sáng tạo.
Đề tài này mang tính thực tiễn rất cao cụ thể là: trong tiết học các em HS đã
chủ động để tìm tòi lại kiến thức đã học qua đó giải quyết được vấn đề do giáo viên
đặt ra. Trong quá trình giải quyết vấn đề, giáo viên chỉ ra những sai lầm mà các em
HS mắc phải do hiểu không rõ vấn đề giúp cho các em hiểu rõ hơn về câu lệnh.
Kết quả là đa số các em đã biết phương pháp lập trình và vận dụng vào giải
các bài tập khác nhau.
Mặc dù cố gắng tìm tòi, nghiên cứu để thực hiện đề tài song chắc chắn còn
có nhiều thiếu sót và hạn chế. Mong nhận được sự quan tâm đóng góp ý kiến của
quý thầy cô để đề tài sáng kiến kinh nghiệm được hoàn thiện hơn.
3.2. Kiến nghị:
*) Đối với tổ- nhóm chuyên môn
Cần phát động, động viên các thành viên trong tổ tăng cường nghiên cứu
khoa học, đổi mới phương pháp giảng dạy để kích thích sự say mê học tập của học
sinh về bộ môn mà mình đang phụ trách
*) Đối với nhà trường
Cần quan tâm hơn nữa hoạt động dạy và học, cần có kế hoạch lâu dài để
nâng cao chất lượng giáo dục, cũng như đáp ứng tốt những yêu cầu thiết thực của tổ
chuyên môn để phục vụ cho việc tăng cường đổi mới phương pháp dạy học theo
định hướng phát triển năng lực học sinh.
XÁC NHẬN CỦA THỦ TRƯỞNG Thanh hóa ngày 05 tháng 06 năm 2017
ĐƠN VỊ
Tôi xin cam đoan đây là SKKN của mình viết,
không sao chép nội dung của người khác.
Người thực hiện
Nguyễn Thị Hương
Trang: 19
TÀI LIỆU THAM KHẢO
[1] Sách giáo khoa tin học 10 – Hồ Sĩ Đàm (Chủ biên), Hồ Cẩm Hà - Trần Đỗ
Hùng -Nguyễn Xuân My – Nguyễn Đức Nghĩa – Nguyễn Thanh Tùng –
Ngô Ánh Tuyết – Nhà xuất bản giáo dục – Năm 2006.
[2] Sách giáo khoa tin học 11– Hồ Sĩ Đàm (Chủ biên), Hồ Cẩm Hà - Trần Đỗ
Hùng – Nguyễn Đức Nghĩa – Nguyễn Thanh Tùng – Ngô Ánh Tuyết –
Nhà xuất bản giáo dục – Năm 2006.
[3] Sách bài tập tin học 11 – Hồ Sĩ Đàm (Chủ biên), Nguyễn Thanh Tùng–
Nhà xuất bản giáo dục – Năm 2006.
[4] Sách giáo viên tin học 11– Hồ Sĩ Đàm (Chủ biên), Hồ Cẩm Hà - Trần Đỗ
Hùng– Nguyễn Đức Nghĩa – Nguyễn Thanh Tùng – Ngô Ánh Tuyết –
Nhà xuất bản giáo dục – Năm 2006.
[5] Bạn sẽ thành thạo Pascal chỉ trong 21 ngày (Đậu Quang Tuấn)
[6] Giáo trình bài tập pascal ( Khoa công nghệ thông tin trường ĐH khoa học
Huế) – năm 2004.
Trang: 20