Trong thời đại thông tin bùng nổ ngày nay, việc lập được các chương trình tự hoạt động cho máy tính, máy gia dụng là cần thiết và để làm được việc đó cần có một quá trình nghiên cứu, học
Trang 1PHẦN I: MỞ ĐẦU I.Lý do chọn đề tài
Sự phát triển mạnh mẽ như vũ bão của tin học đã làm cho xã hội có nhiềunhận thức mới về cách tổ chức các hoạt động Nhiều quốc gia trên thế giới ýthức được rất rõ tầm quan trọng của tin học và có những đầu tư lớn cho lĩnh vựcnày, đặc biệt trong giáo dục nâng cao dân trí về tin học và đào tạo nguồn nhânlực có chất lượng cao Người Việt Nam có nhiều tố chất thích hợp với ngànhkhoa học này, vì thế chúng ta hi vọng có thể sớm hoà nhập với khu vực và trênthế giới
Trong thời đại thông tin bùng nổ ngày nay, việc lập được các chương trình
tự hoạt động cho máy tính, máy gia dụng là cần thiết và để làm được việc đó cần
có một quá trình nghiên cứu, học tập về ngôn ngữ lập trình lâu dài, qua đó nhàlập trình có thể chọn một ngôn ngữ lập trình thích hợp
Tin học là một môn học mới ở các trường phổ thông nên học sinh cònnhiều bỡ ngỡ khi tiếp cận với môn học này Nội dung tin học lập trình lớp 11 làmột nội dung mới lạ đối với đa số học sinh với nhiều khái niệm, thuật ngữ, cấutrúc dữ liệu mà học sinh mới được tiếp xúc lần đầu
Đặc biệt một trong những yếu tố quan trọng và không thể thiếu của mộttrương trình là “việc điều khiển”, cụ thể là các cấu trúc điều khiển, cũng là thành
tố kết hợp đồng thời giữa dữ liệu và tác vụ Cấu trúc điều khiển là một trong cácđặc trưng cơ bản của phương pháp lập trình cấu trúc Trong đó người ta sử dụng
ba cấu trúc điều khiển để tạo nên logic của chương trình Mọi vấn đề về logicđều được giải quyết bằng cách sử dụng linh hoạt ba cấu trúc điều khiển là:
sử dụng cấu trúc lặp
Xuất phát từ cơ sở trên, tôi đã chọn đề tài “Rèn luyện kĩ năng sử dụng cấu trúc lặp trong lập trình Pascal cho học sinh lớp 11 trường THPT Quan Sơn” nhằm cung cấp cho học sinh những kiến thức khái quát hơn về cấu trúc
lặp và rèn luyện kỹ năng lập trình cho học sinh thông qua một số bài toán cụ thể
II.Mục đích nghiên cứu
Do gặp phải những khó khăn trên nên khi lập trình giải các bài toán họcsinh thường mắc rất nhiều lỗi, thậm chí có những lỗi các em mắc phải nhiều lần
do không hiểu nguyên nhân xuất hiện lỗi Vì vậy qua đề tài này tôi mong muốncung cấp cho học sinh một số vấn đề mà các em đang gặp phải về kĩ năng sửdụng cấu trúc lặp trong khi lập trình giúp các em chủ động hơn trong học tập,tích luỹ kiến thức, kỹ năng lập trình
Trang 2III.Đối tượng nghiên cứu
Đề tài này được áp dụng đối với sinh các lớp 11A1, 11A2, 11A3 trườngTHPT Quan Sơn năm học 2020 – 2021
Với nhiệm vụ chủ yếu là đưa ra hệ thống lý thuyết về cấu trúc lặp và ứngdụng cấu trúc lặp giải các bài tập trong ngôn ngữ lập trình Pascal giúp học sinhlĩnh hội tri thức, giúp các em tích cực, chủ động tích lũy kiến thức Qua đó, họcsinh phát triển được tư duy logic thông qua hệ thống bài tập giúp các em rènluyện được tính tự giác, tính kỉ luật, thói quen tự học đó là những đức tính rènluyện tốt của học sinh
Kế hoạch nghiên cứu: Các vấn đề về cấu trúc lặp trong chương trình tin họclập trình trên ngôn ngữ Pascal
IV.Phương pháp nghiên cứu
Để hoàn thành đề tài này, tôi đã tiến hành và áp dụng một số phương phápnghiên cứu sau:
- Dựa trên cơ sở lý thuyết của Ngôn ngữ lập trình Pascal Sự hoạt độngtuần tự từng bước của máy tính khi thực hiện chương trình
- Thu thập dữ liệu thông qua việc hỏi học sinh về mức độ biết, hiểu và vậndụng ngôn ngữ lập trình Pascal vào giải các bài toán trong các môn học khác
- Phân tích đánh giá mức độ học sinh hiểu vận dụng, giải được các bài tập,
từ đó xây dựng, giới thiệu các bài tập phù hợp với từng đối tượng học sinh
- Tổng kết rút kinh nghiệm
Trang 3PHẦN II: NỘI DUNG I.Cơ sở lý luận
Đảng và Nhà nước ta đã nhận thấy được tầm quan trọng của ngành Tin học
và đã đưa môn học này vào nhà trường phổ thông như những môn khoa họckhác bắt đầu từ năm học 2006-2007
Chỉ thị số 55/2008/CT- BGTĐT ngày 30/9/2008 của Bộ trưởng Bộ GDĐT
về tăng cường giảng dạy, đào tạo và ứng dụng công nghệ thông tin trong ngànhgiáo dục giai đoạn 2008-2011
Trong bối cảnh toàn ngành Giáo dục và Đào tạo đang nỗ lực đổi mớiphương pháp dạy học theo hướng phát huy tính tích cực chủ động của học sinhtrong hoạt động học tập Điều 24.2 của Luật giáo dục đã nêu rõ: “Phương phápgiáo dục phổ thông phải phát huy tính tích cực, tự giác, chủ động, sáng tạo củahọc sinh, phù hợp với đặc điểm của từng lớp học, môn học; bồi dưỡng phươngpháp tự học, rèn luyện kỹ năng vận dụng kiến thức vào thực tiễn, tác động đếntình cảm, đem lại niềm vui, hứng thú học tập cho học sinh” Như vậy, chúng ta
có thể thấy định hướng đổi mới phương pháp dạy học đã được khẳng định,không còn là vấn đề tranh luận Cốt lõi của việc đổi mới phương pháp dạy học ởtrường phổ thông là giúp học sinh hướng tới việc học tập chủ động, chống lạithói quen học tập thụ động Với một số nội dung trong đề tài này, học sinh cóthể tự học, tự rèn luyện thông qua một số bài tập, dạng bài tập cụ thể
II.Thực trạng vấn đề
Qua thực tế giảng dạy ở trường THPT Quan Sơn các năm qua, tôi nhậnthấy khi học đến chương trình tin học lớp 11 đa số học sinh đều nhận xét bộmôn này rất khó
Theo thống kê kết quả học tập môn tin học 11 năm học 2019 – 2020 nhưsau:
- Các học sinh thường gặp khó khăn khi làm các bài toán sử dụng cấu trúclặp dẫn đến gặp khá nhiều lỗi khi viết một chương trình trong ngôn ngữ lập trìnhPascal
- Tuy nhiên cũng có một số lượng không nhỏ học sinh rất yêu thích tin học
và thích tìm hiểu một số bài toán, dạng toán ngoài phạm vi sách giáo khoa
III.Các giải pháp đã tiến hành để giải quyết vấn đề
1.Lặp
Xét 2 bài toán sau đây:
Bài toán 1: Tính và đưa kết quả ra màn hình tổng
S = 1+2+3+…+100
Bài toán 2: Tính và đưa kết quả ra màn hình tổng
S = 1+2+3+ +n+… cho đến khi S > 105
Với cả 2 bài toán trên, dễ thấy cách để tính tổng S có nhiều điểm tương tự:
Xuất phát, S được gán giá trị 0;
Tiếp theo công vào tổng S một giá trị i với i = 1,2,3,4,5,…
Việc cộng này được lặp lại một số lần Đối với bài toán 1, số lần lặp là 100
và việc cộng vào tổng S sẽ kết thúc khi thực hiện cồn việc 100 lần
Trang 4Đối với bài toán 2, số lần lặp chưa biết trước nhưng việc cộng vào tổng S
sẽ kết thúc khi điều kiện S > 105 được thỏa mãn
Nói chung, ta thấy trong một số thuật toán có những thao tác phải lặp đi lặplại nhiều lần Cấu trúc lặp mô tả thao tác lặp được phân biệt 2 loại là lặp với sốlần biết trước và lặp với số lần chưa biết trước
Các ngôn ngữ lập trình đều có các câu lệnh để mô tả cấu trúc lặp
2.Lặp với số lần biết trước và câu lệnh FOR – DO
2.1.Cú pháp và hoạt động của câu lệnh For – do
Có 2 thuật toán tong1a và tong1b để giải bài toán 1 như sau:
Thuật toán tong1a
Bước 1: S ← 0; i ← 0;
Bước 2: i ← i+1;
Bước 3: Nếu i > 100 thì chuyển đến bước 5;
Bước 4: S ← S+i rồi quay lại bước 2;
Bước 5: Đưa S ra màn hình rồi kết thúc
Thuật toán tong1b
Bước 1: S ← 0; i ← 101;
Bước 2: i ← i-1;
Bước 3: Nếu i < 1 thì chuyển đến bước 5;
Bước 4: S ← S+i rồi quay lại bước 2;
Bước 5: Đưa S ra màn hình rồi kết thúc
Trong thuật toán tong1a, giá trị i khi bắt đầu tham gia vòng lặp là 1 và saumỗi lần lặp i tăng lên 1 đơn vị cho đến khi i > 100 thì kết thúc lặp (thực hiện 100lần) Trong thuật toán tong1b giá trị i khi bắt đầu tham gia vòng lặp là 100 vàsau mỗi lần lặp giảm đi 1 cho đến khi i < 1 thì kết thúc lặp (thực hiện 100 lần).Cách lặp trong thuật toán tong1a gọi là dạng lặp tiến và trong thuật toán tong1b
+ Biến đếm là biến đơn thường có kiểu nguyên hoặc kiểu kí tự;
+ <giá trị đầu>, <giá trị cuối> là các biểu thức cùng kiểu với biến đếm,
<giá trị đầu> phải nhỏ hơn hoặc bằng <giá trị cuối> Nếu <giá trị đầu> lớn
hơn <giá trị cuối> thì vòng lặp không được thực hiện.
Hoạt động:
+ Ở dạng lặp tiến: câu lệnh viết sau từ khóa do được thực hiện tuần tự, với
biến đếm lần lượt nhận các giá trị liên tiếp tăng từ <giá trị đầu> đến <giá trị
cuối>
Trang 5+ Ở dạng lặp lùi: câu lệnh viết sau từ khóa do được thực hiện tuần tự, với
biến đếm lần lượt nhận các giá trị lien tiếp giảm từ <giá trị cuối>đến <giá trị
đầu>.
Chú ý:
+ Giá trị biến đếm được điều khiển tự động vì vậy câu lệnh sau do khôngđược thay đổi giá trị biến đếm
+ Không giống với các ngôn ngữ khác Pascal không kiểm tra <biến
đếm>><giá trị cuối> trong câu lệnh for – to - do để kết thúc vòng lặp mà kiểm
tra <biến đếm> = <giá trị cuối> để thực hiện lần lặp cuối cùng Vì lẽ đó việc
can thiệp vào biến đếm có thể gây ra sự cố “vòng lặp vô tận” Ngay cả khi biến
đã duyệt hết phạm vi của kiể dữ liệu thì biến lại quay lại giá trị 0 và mọi thứ lại
tiếp tục… trừ khi ấn CTRL+ Break;
+ Trong câu lệnh for<giá trị cuối>, <giá trị đầu> được tính từ khi bắt đầu
vòng lặp để tính số lần lặp, nên trong vòng lặp dù có câu lệnh thay đổi <giá trị
cuối>, <giá trị đầu>thì số lần lặp vẫn không thay đổi.
Sử dụng cấu trúc lặp dạng tiến và dạng lùi như trên để mô tả quá trình lặptrong thuật toán tong1a và tong1b chương trình có thể được cài đặt như sau:
Program tong1a;
Var S, i: longint;
Begin
S:=0;
For i:= 1 to 100 do S:= S+i;
Write (‘Tong S la: ‘, S);
For i:= 100 downto 1 do S:= S+i;
Write (‘Tong S la: ‘, S);
Trang 6- Nếu i lẻ (i mod 2 <> 0) thì tăng biến đếm dem lên 1 đơn vị.
Code tham khảo:
For i:=20 to 100 do if i mod 2 <>0 then inc(dem);
write(‘Co ‘,dem,’ so le trong doan tu 20 den 100’);
- Dùng 2 biến đếm kiểu nguyên (d_chan, d_le) để đếm số lượng số chẵn và
số lượng số lẻ Ban đầu khởi tạo d_chan:=0; d_le:=0;
- Sử dụng vòng lặp for tiến hoặc lùi với biến đếm i chạy từ n+1 đến m-1
- Nếu i chẵn (i mod 2=0) thì tăng biến d_chan lên 1 đơn vị Nếu i lẻ (i mod
2 <> 0) thì tăng biến d_le lên 1 đơn vị
Code tham khảo:
Trang 7For i:=n+1 to m-1 do
if i mod 2 <>0 then inc(d_le) else inc(d_chan);
Writeln(‘Co ‘,d_chan,’ so chan trong khoang tu ‘,n,’ den ‘,m);
Writeln(‘Co ‘,d_le,’ so le trong khoang tu ‘,n,’ den ‘,m);
readln
End.
Ví dụ 4: Một số có tổng các ước thực sự (là các ước không kể chính nó) bằng
chính nó được gọi là số hoàn chỉnh
Ví dụ: Số nguyên 6 có các ước thực sự là 1, 2, 3 Tổng là 1 + 2 + 3 = 6.Viết chương trình xét xem một số n (n<108) được nhập từ bàn phím có phải là sốhoàn chỉnh không
Ý tưởng:
- Dùng biến n lưu số cần xét
- Biến S lưu trữ tổng các ước thực sự, khởi tạo s:= 0;
- Sử dụng vòng lặp for với biến đếm i chạy từ 1 đến n-1 Nếu i là ước của nthì cộng thêm i vào S
- Nếu S = n thì đưa ra thông báo n là số hoàn chỉnh, ngược lại đưa ra thôngbáo n không là số hoàn chỉnh
Code tham khảo:
for i:= 1 to n -1 do if n mod i = 0 then s:=s+i;
if s = n then write(n, ' la so hoan chinh')
else writeln(n, ' khong phai la so hoan chinh');
Chương trình giải bài toán trên có thể được cài đặt lại như sau:
Trang 8for i:= 1 to n div 2 do if n mod i = 0 then s:=s+i;
if s = n then write(n, ' la so hoan chinh')
else writeln(n, ' khong phai la so hoan chinh');
Trang 9Ví dụ 7: Dãy số fibonaci được định nghĩa như sau:
Code tham khảo:
Với bài toán trên có thể sử dụng cấu trúc lặp với số lần biết trước dạng tiến
hay lùi đều được Nếu sử dụng cấu trúc lặp For …downto … do ta có thể xây
dựng công thức truy hồi để tính giá trị Y như sau:
50 và sau mỗi lần lặp n giảm đi 1 cho đến khi n =1 thì dừng Như vậy số lần lặp
Trang 10Câu lệnh
SaiĐúng
Sơ đồ hoạt động của câu lệnh While – do
là biết trước, biến n được sử dụng là một biến đếm giảm từ 50 về 1, tổng cầntính là Y0
Code tham khảo:
Tuy nhiên trong một số trường hợp thì chỉ có thể dùng một cấu trúc, đặc
biệt là khi tính các công thức truy hồi Ta xét một ví dụ dùng for … downto …
do thích hợp hơn:
3.Lặp với số lần chưa biết trước
3.1.Cú pháp và hoạt động của lệnh lặp với số lần chưa biết trước
a.Câu lệnh While – do
Cú pháp:
While<điều kiện>do<câu lệnh>;
Trong đó:
+ Điều kiện là biểu thức logic
+ Câu lệnh là một câu lệnh trong pascal
Hoạt động:
B1: Máy tính và kiểm tra điều kiện sau while
B2: Nếu điều kiện đúng thì thực hiện câu lệnh sau do rồi quay lại B1 (quátrình lặp)
B3: Thực hiện câu lệnh tiếp theo trong chương trình (câu lệnh sau do)
while-Nói một cách khác ta có thể hiểu: Câu lệnh while - do là lệnh lặp kiểm trađiều kiện trước, câu lệnh sau do sẽ được thực hiện cho đến khi điều kiện nhậngiá trị sai
Trang 11Điều kiện
Câu lệnh Sai
B1: Thực hiện dãy lệnh nằm giữa repeat và until
B2: Kiểm tra điều kiện sau until, nếu điều kiện sai thì quay lại B1 (quátrình lặp)
B3:Thực hiện câu lệnh tiếp theo của chương trình (câu lệnh sau repeat –until)
Nói cách khác câu lệnh repeat – until là câu lệnh lặp kiểm tra điều kiện sau
Chú ý:
+ Không giống với vòng lặp for - do, cả repeat - until và while - do đều làcác vòng lặp không xác định trước số lần lặp Vì vậy cần có câu lệnh thay đổigiá trị biến điều khiển vòng lặp để đến một lúc nào đó có thể thoát ra khỏi vònglặp
+ Nếu dùng while - do và repeat - until để cùng giải một bài toán, cùng mộtgiải thuật như nhau thì điều kiện sau while và điều kiện sau until là phủ địnhnhau
+ Các câu lệnh trong vòng lặp repeat- until không cần phải đặt trong cặp từkhóa begin_end
Sự giống và khác nhau giữa while – do và repeat – until
- Giống nhau: Cả hai đều là câu lệnh lặp với số lần chưa biết trước.
- Khác nhau:
Là câu lệnh lặp kểm tra điều kiện
trước
Là câu lệnh lặp kiểm tra điều kiện sau
Câu lệnh sau while được lặp lại khi
điều kiện đúng
Dãy lệnh nằm giữa repeat – until đượclặp lại khi điều kiện sai
Câu lệnh sau while có thể không được
thực hiện lần nào (Khi ngay từ đầu
điều kiện đã sai)
Dãy lệnh nằm giữa repeat – until đượcthực hiện ít nhất 1 lần (dù ngay từ đâuđiều kiện đã đúng)
Trang 12Ví dụ 10: Viết chương trình tìm ước chung lớn nhất (UCLN) của hai số với yêu
cầu sử dụng thuật toán Euclid
Thuật toán Euclid: Nếu a chia hết cho b (a chia b dư 0) thì UCLN(a,b) bằng b
Nếu a chia b dư r thì UCLN(a,b) = UCLN(b,r)
Ý tưởng:
- Nhập a, b và gán r = a mod b
- Lặp với điều kiện r <> 0: b = r, a = b, r = a mod b
Code tham khảo:
Trang 13- Cần hai biến F_1 và F có giá trị đầu là 1, 1.
- Thực hiện lặp cho đến khi F >= n
- Do yêu cầu chỉ in các số bé hơn n nên khi in cần thêm một lệnh kiểm tra
Code tham khảo:
Trang 14- Khởi tạo i=1
- Sử dụng vòng lặp while – do với điều kiện i<=100 để tính tổng
- Sau mỗi lần lặp tăng i lên 1
Code tham khảo:
Var s,i: word;
- Khởi tạo i=1
- Sử dụng vòng lặp repeat – until với điều kiện i>100 để tính tổng
- Sau mỗi lần lặp tăng i lên 1
Code tham khảo:
Var s,i: word;
Trang 15tổng quát hơn, có thể dùng cho mọi vòng lặp, nhưng thường sử dụng cho cáctrường hợp lặp với số lần chưa biết trước.
Ví dụ 15:
Viết chương trình in ra các số lẻ nhỏ hơn hoặc bằng số nguyên dương n(0<n<1018) Yêu cầu nhập lại nếu n <=0
Ý tưởng:
- Sử dụng kiến thức số lẻ đầu tiên bằng 1 Số lẻ sau bằng số trước cộng với 2
- Cho biến i có giá trị ban đầu bằng 1
- Dùng vòng lặp while do với điều kiện i < n và công việc bên trong là in i vàtăng i lên 2
Code tham khảo:
Bài 5: Viết chương trình kiểm tra một số có phải là số nguyên tố hay
không Biết số nguyên tố là số nguyên dương khác 1 và có đúng hai ước là 1 vàchính nó (0<n<=1010)
Bài 6: Đoạn chương trình sau dùng để làm gì? Hãy cho biết giá trị của biến
dem trong đoạn chương trình này:
Trang 16For i:=1 to n do if i mod 3 =0 then dem:=dem+1;
Bài 7: Viết chương trình nhập 2 số nguyên m,n từ bàn phím (m<=n,
m,n<1015) Đếm xem trong đoạn [m,n] có bao nhiêu số chia hết cho cả 3 và 5,tính tổng các số đó
Bài 8: Nhập hai số nguyên a và b từ bàn phím (a<b) Xác định số lượng các
số nguyên lẻ i thỏa mãn điều kiện a<=i<=b Đưa ra màn hình số lượng tnhs được
Yêu cầu: Sử dụng vòng lặp với số lần chưa biết trước:
Bài 10: Dãy số fibonaci được định nghĩa như sau:
Viết chương trình in ra n số fibonaci đầu tiên (n <= 1000);
Bài 11:Sử dụng vòng lặp while – do viết chương trình tính tổng
S = 2 4 2n
với n là một số tự nhiên nhập từ bàn phím
IV.Hiệu quả đạt được
Năm học 2019 – 2020, tôi được phân công giảng dạy môn Tin học các lớp11A1, 11A5, 11A6 tại trường THPT Quan Sơn khi chưa áp dụng phương phápcủa Sáng kiến kinh nghiệm kết quả học tập ở 3 lớp 11A1, 11A5, 11A6 như sau:
Bảng 1 Kết quả học tập cuối năm học 2019 – 2020
Qua bảng 1 kết quả học tập cuối năm học ta nhận thấy tỉ lệ học sinh có họclực khá ít, tỉ lệ học sinh học lực trung bình chiếm nhiều; bên cạnh đó vẫn còn số
ít học sinh có học lực yếu
Năm học 2020 – 2021, tôi được phân công giảng dạy môn Tin học các lớp11A1, 11A2, 11A3 tại trường THPT Quan Sơn tôi đã tiến hành áp dụng sáng