Sáng kiến kinh nghiệm Kinh nghiệm lập trình

Sáng kiến kinh nghiệm Kinh nghiệm lập trình

 Phương pháp 2:

- Bổ sung kiến thức:

+ N là số Nguyên tố khi n>=2 và n không chia hết cho số nào có giá trị trong khoảng từ 2 đến n – 1. Tuy nhiên trên thực tế thì chỉ cần n không chia hết cho số nào có giá trị trong khoản từ 2 đến số nguyên gần với căn n nhất nhưng nhỏ hơn n {Trunc(Sqrt(n))}.

+ Giả sử A và B là hai giá trị kiểu Boolean. Kết quả của các phép toán được thể hiện qua bảng dưới đây:

- Ý tưởng:

+ Giống như phương pháp 1 tuy nhiên ở đây chúng ta không đếm mà sử dụng phương pháp đánh dấu của kiểu boolean. Tức ta xét trường hợp n có chia hết cho i hay không, nếu n chia hết cho i thì ta đánh dấu là False {Giả sử biến KT có biểu dữ liệu là Boolean thì nếu n chia hết cho i thì KT:=False, ban đầu ta gán KT:=True}.

+ Kiểm tra biến KT, nếu KT là True {tức biến KT nhận tất cả là True} thì n là số nguyên tố, ngược lại n không phải số nguyên tố {tức biến KT có nhận lớn hơn hoặc bằng một giá trị False}.

- Chương trình:

 Program KT_SONT;

Var i,n:Integer; Kt:Boolean;

Begin

Write('Nhap gia tri N: ');Readln(n);

Kt:=True;

If n < 2="" then="" kt:="False">

For i:=2 To Trunc(Sqrt(n)) Do

If n Mod i = 0 Then Kt:=False;

If Kt Then Write(n,' la so nguyen to')

Else Write(n,' Khong la so nguyen to');

Readln;

End.

=> Nhận xét:

- Phương pháp 1: Giúp cho học sinh có cái nhìn tổng quan hơn khi xác định n có phải là số nguyên tố hay không thông qua phương thức đếm số lần n có chia hết cho giá trị nào trong khoảng từ [2.n-1] hay không, theo định nghĩa thì số nguyên tố là số chỉ chia hết cho 1 và chính nó {tức nếu N là số nguyên tố chỉ khi n chia hết cho 1 và n}. Vậy nếu n còn chia hết cho số nào trong khoảng [2.n-1] thì n không phải nguyên tố.

- Phương pháp 2: Phương giáp này giúp học sinh tìm hiểu được nhiều kiến thức hơn trên nền kiến thức của phương pháp 1. Khi cho i chạy từ 2 đến trunc(sqrt(n)) thì số lần thực hiện vòng lặp được giảm đi một nữa, sẽ tiết kiệm được thời gian khi chạy chương trình; mặt khác giúp học sinh ôn lại kiến thức lấy kết quả phép so sánh của kiểu dữ liệu Boolean, một kiểu dữ liệu mà chúng ta cũng rất hay sử dụng trong các bài tạo vòng lặp.

 

doc 18 trang Người đăng thuquynh91 Lượt xem 1200Lượt tải 1 Download
Bạn đang xem tài liệu "Sáng kiến kinh nghiệm Kinh nghiệm lập trình", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
ào.
+ Mặt khác, đời sống văn hóa tinh thần ngày một nâng cao, một số nhu cầu giải trí như xem ti vi, chơi game . . . ngày càng nhiều làm cho một số em chưa có ý thức học, bị lôi cuốn, sao nhãng việc học tập, lơ là trong học tập.
Bảng khảo kết quả Tin học 8 cấp trường
(Khi chưa thực hiện đề tài nghiên cứu)
KHỐI 8
Sĩ số 
Giỏi
Khá
Trung bình 
Yếu
Kém
TB trở lên
SL
%
SL
%
SL
%
SL
%
SL
%
SL
%
TS
173
61
35.26
53
30.64
41
23.70
13
7.51
5
2.89
155
89.60
2 3. Về phía phụ huynh:
+ Phụ huy đi làm rẫy, ít có thời gian quan tâm kèm cặp con em mình. Bản thân các em còn phải phụ giúp gia đình ngoài giờ lên lớp, không có thời gian học.
+ Một số gia đình thì có điều kiện kinh tế khá giả hơn nên có điều kiện chăm sóc con như bảo mẫu. Chúng không được trực tiếp làm việc, không được quan sát cho nên sẽ không có kiến thức thực tế, từ đó học sinh không thể liên hệ thực tế các hoạt động diễn ra hằng ngày vào trong các cấu trúc cơ bản của chương trình Pascal.
+ Nhiều cha mẹ học sinh còn cho rằng: tin học là môn học phụ, họ chưa thấy được những ứng dụng trong cuộc sống mà tin học mang lại. Chính vì theo xu thế xã hội mà con em, học sinh của chúng ta cũng bị “định hướng” ngay từ khi còn học cấp THCS nên các em không chú ý học môn Tin học ngay từ đầu.
 * Nguyên nhân thực trạng:
Vậy nguyên nhân của những thực trạng trên là gì? Theo tôi, có rất nhiều nguyên nhân nhưng chủ yếu tập trung ở những nguyên nhân sau:
- Trong thời buổi kinh tế thị trường, kinh tế được coi trọng. Quan điểm của nhiều phụ huynh là chỉ thích con thi khối A, B. Đây không chỉ là quan điểm của phụ huynh học sinh mà còn là quan điểm của nhiều người trong xã hội ngày nay. 
	- Phần lớn học sinh là con em gia đình làm nông. Từ đó không có nhiều thời gian quan tâm đến việc học của con em mình. Vì hoàn cảnh gia đình như thế nhiều học sinh ngoài giờ học ở lớp, các em còn phải phụ giúp gia đình nên không có thời gian học tập, nghiên cứu, đầu tư còn hạn chế. Ý thức vượt khó trong học tập của các em chưa cao.
- Bên cạnh đó, một bộ phận không nhỏ học sinh có điều kiện gia đình khá giả hơn thì lại lơ là việc học. Cùng với sự bùng nổ của lĩnh vực công nghệ thông tin, đặc biệt là Internet đã tác động không nhỏ đến tâm lí tiêu cực của các em, nhiều em bỏ học để chơi game, nghiện game, tham gia các trang mạng xã hội như facebook, nghiện facebook, nhiều em còn rơi vào cảnh sống ảo tưởng như trong game hoặc trên mạng xã hội. Từ đó các em trở thành con mồi cho các đối tượng xấu lợi dụng để truyền bá những thông tin sai lệch, lối sống hưởng thụ sớm, ... dẫn đến việc học trở nên sa sút, bỏ học, lôi cuốn vào các tệ nạn xã hội khác.
- Đa phần học sinh khi được hỏi đến việc học môn tin học ở các lớp dưới như tin học 6, 7 thì các đều rất thích thú và muốn khám phá. Đôi khi các em còn có thể tự mày mò, tự nghiên cứu ở nhà. Nhưng khi hỏi đến bộ môn tin học khối lớp 8 thì đa số học sinh trả lời là: khô khan, trừu tượng, khó học, khó nhớ và không mặn mà gì mấy đến hai từ “Lập trình”. Vì vậy việc học tập gặp rất nhiều khó khăn.
- Đối với những môn học khác, kiến thức học sinh được giáo viên truyền đạt và tiếp thu từ chương trình lớp 6 đến lớp 8 nên các em có được những kiến thức cơ bản nên sẽ thuận lợi cho giáo viên trong việc lựa chọn học sinh có năng khiếu học. Còn bộ môn Tin học (hoặc Hóa học), đặc biệt là Tin học 8 thuộc lĩnh vực “Lập trình mãi đến lớp 8 các em mới được học Pascal với những kiến thức cơ bản và đơn giản nhất”. 
- Bộ môn Tin học THCS thường ít được học sinh quan tâm, yêu thích vì nó là một môn học phụ. Nhất là Tin học lớp 8, một nội dung kiến thức cần rất nhiều tư duy và khả năng sáng tạo trong từng cấu trúc khi lập trình. Mặt khác Tin học 8 không như tin học 6, 7, 9 là các phần mềm ứng dụng dễ hiểu, dễ vận dụng, dễ hình dung, dễ liên hệ thực tế trong cuộc sống. Tin học 8 thường có rất ít ứng dụng dễ nhận thấy do vậy khó tiếp cận, khó gần gũi đối với các em học sinh. Trong nhiều năm giảng dạy, tôi thấy việc tạo hứng thú cho học sinh yêu thích môn lập trình là một việc làm rất cần thiết và cần đầu tư. 
- Đặc trưng của môn Tin học 8 là kiến thức về lập trình. Ngôn ngữ lập trình dường như rất xa lạ vì đây là kiến thức đầu tiên trong lập trình mà các em được học.
- Lập trình Pascal "khó" đối với học sinh THCS ở chỗ: môi trường lập trình Pascal có giao diện và các từ khóa đều bằng tiếng Anh, các dòng thông báo hay trợ giúp cũng vậy. Bình diện chung học sinh THCS vốn tiếng Anh không nhiều, đa số các em còn yếu về tiếng Anh. Lấy đơn vị lớp để tính thì mỗi lớp chỉ có một vài em được gọi là "thông thạo" tiếng Anh qua các bài học. Hầu hết số còn lại nằm trong trạng thái "mù tịt". Đây là một khó khăn cho việc hiểu được Pascal.
- Một vấn đề nữa cũng là rào cản đối với việc các học sinh THCS tiếp cận với lập trình Pascal đó là: tư duy Toán của các em dừng lại ở mức độ Sách Giáo Khoa Toán THCS do đó kỹ năng phân tích, tổng hợp, xây dựng thuật toán cho mỗi bài toán hay vấn đề cần lập trình chưa tốt.  Các em vẫn thụ động trong việc tiếp cận bài toán, sắp xếp tư duy, xây dựng thuật giải.
	- Mặc dù giáo viên đã có nhiều cố gắng trong việc đổi mới phương pháp dạy học theo hướng làm tăng tính tích cực của người học. Nhưng thực tế việc thực hiện theo tinh thần đổi mới phương pháp dạy học vẫn chưa đạt hiệu quả cao. Trong từng tiết học, học sinh còn thụ động nhiều, chỉ ngồi nghe, chép là chính, không khí giờ học “Lập trình” trôi qua nặng nề, nhàm chán.
- Các em học sinh có năng lực với bộ môn Tin học thì thường kèm theo là giỏi bộ môn Toán, Lí, Hóa do đó các em có thể chọn những môn học này để học chuyên sâu.
- Học sinh không biết tìm ra cách học làm sao cho đạt kết quả một cách tốt nhất. Việc học là quan trọng ở người học. Do vậy, dù chúng ta có truyền thụ thật đầy đủ kiến thức cho các em, vận dụng nhiều phương pháp đổi mới trong giờ học thì kết quả các em lĩnh hội cũng không đáng là bao nhiêu. 
-> Đây là nguyên nhân cơ bản, nguyên nhân chính, nguyên nhân lớn nhất có ảnh hưởng đến kết quả học tập của các em.
Tóm lại, với những nguyên nhân vừa mang tính khách quan, vừa mang tính chủ quan cùng với sự tác động của xã hội đến tâm lý của người dạy và người học. Chính vì thế tôi đã không ngừng trăn trở trong việc tìm tòi giải pháp để nâng cao công tác giảng dạy, trao đổi với bạn bè đồng nghiệp trong và ngoài nhà trường, tôi mạnh dạn đưa ra đề tài: “Kinh nghiệm dạy lập trình Pascal ” mà bản thân tôi đúc kết được trong nhiều năm liền khi đảm nhận công tác giảng dạy ở môn Tin học 8. Giúp các em yêu thích lập trình và học lập trình trong sự hứng thú.
3. Nội dung và hình thức của giải pháp:
3.1. Mục tiêu của giải pháp :
 	- Phân tích những thực trạng ngay trong cách áp dụng những phương pháp dạy học tích cực hiện nay ở nhiều giáo viên dạy môn Tin học 8 trong trường THCS.
- Chỉ ra những nguyên nhân cơ bản học sinh không hứng thú học tập môn Tin học (đặc biệt là Lập trình Pascal); việc áp dụng không hiệu quả các phương pháp dạy học không đặc thù với bộ môn Tin học.
- Đưa ra những giải pháp mới mang tính thiết thực nhằm tháo gỡ những khó khăn, vướng mắc ở giáo viên trong quá trình dạy học môn Tin học 8.
- Phân tích những điểm mới, điểm sáng tạo vào lợi ích của giải pháp đưa ra trong đề tài.
- Đề xuất một số điều kiện nhằm sử dụng có hiệu quả của giải pháp mà đề tài đưa ra.
 Tóm lại, bằng những kinh nghiệm giảng dạy môn Tin học 8 trong trường THCS, với tâm huyết nghề nghiệp, với sự trăn trở trước thực trạng dạy- học Lập trình hiện nay, với sự hỗ trợ của bạn bè, đồng nghiệp tôi đã mạnh dạn đưa ra kinh nghiệm nhằm giúp đồng nghiệp giảng dạy một giờ Lập trình sao cho tạo được sự hứng thú, tích cực, chủ động, sáng tạo, ghi nhớ bài học dễ dàng và lâu hơn. Từ đó các em biết cách Lập trình, yêu thích Lập trình, đưa môn Lập trình trở về đúng vị trí xứng đáng của nó.
3.2. Nội dung cách thức thực hiện giải pháp:
a. Chuyên đề Câu lệnh điều kiện
Viết chương trình nhập vào 3 số nguyên dương a, b, c khác nhau. In ra màn hình số lớn nhất và nhỏ nhất trong 3 số trên.
Phương pháp 1:
-	Ý tưởng:
+ Tìm số lớn nhất: (a>b) và (a>c) thì a lớn nhất; (b>a) và (b>c) thì b lớn nhất; (c>a) và (c>b) thì c lớn nhất;
+ Tìm số nhỏ nhất: (a<b) và (a<c) thì a nhỏ nhất; (b<a) và (b<c) thì b nhỏ nhất; (c<a) và (c<b) thì c nhỏ nhất;
-	Chương trình:
Program LN_NN;
Var a, b, c: Integer;
Begin
Writeln (‘Nhap a, b, c:’); Readln (a, b, c);
If (a>b) and (a>c) Then Writeln (a,’ lon nhat’)
Else If (b>a) and (b>c) Then Writeln (b,’ lon nhat’)
 Else Writeln (c,’ lon nhat’);
If (a<b) and (a<c) Then Writeln (a,’ nho nhat’)
Else If (b<a) and (b<c) Then Writeln (b,’ nho nhat’) 
Else Writeln (c,’ nho nhat’);
Readln;
 End.
Phương pháp 2:
-	Ý tưởng:
+ Nếu a>b thì ta gán a cho Max, b cho Min, ngược lại thì ta gán Max cho b, Min cho a {Tìm số lớn nhất và nhỏ nhất trong hai số a, b. Sau khi thực hiện dòng lệnh trên Max sẽ nhận được giá trị lớn nhất, Min sẽ nhận được giá trị nhỏ nhất}.
+ Nếu c>Max thì ta gán c cho Max, ngược lại nếu c<Min thì ta gán c cho Min {So sánh c với giá trị lớn nhất (Max) và nhỏ nhất (Min)}.
-	Chương trình:
Program LN_NN;
Var a, b, c, Max, Min: Integer;
 Begin
Write (‘Nhap lan luot 3 so a, b, c:’); Readln (a, b, c); 
If (a>b) Then Begin Max:=a; Min:=b; End;
Else Begin Max:=b; Min:=a; End;
If (c>Max) Then Max:=c Else If (c<Min) Then Min:=c; 
Write(‘So lon la:’,Max,’ So nho la:’,Min);
Readln; 
End.
Phương pháp 3:
-	Ý tưởng:
+ So sánh giá trị a và b, nếu a>b thì đổi giá trị a và b. {Sau khi đổi giá trị thì sẽ cho kết quả a <b}.
+ So sánh giá trị b và c, nếu b>c thì đổi giá trị b và c. {Sau khi đổi giá trị thì sẽ cho kết quả a, b b hay b>a }.
+ Lại so sánh giá trị a và b, nếu a>b thì đổi giá trị a và b. {Sau khi đổi giá trị thì sẽ cho kết quả a < b và b < c}.
-	Chương trình:
Program LN_NN;
Var a,b,c,tam:Integer; 
Begin
Write('Nhap gia tri a, b, c tuong ung: ');Readln(a,b,c); 
If a>b Then begin Tam:=a; a:=b; b:=tam end;
If b>c Then begin Tam:=b; b:=c; c:=tam end; 
If a>b Then begin Tam:=a; a:=b; b:=tam end; 
Write('So nho la:’,a,’ so lon la’,c);
Readln; 
End.
=> Nhận xét: Trong 3 phương pháp trên thì mỗi phương pháp đều có một ưu điểm và hạn chế riêng:
-	Phương pháp 1: Giúp học sinh làm quen với câu lệnh điều kiện dạng đủ lồng nhau và điều kiện ghép ((a>b) and (a>c)) trong câu lệnh điều kiện thông qua phép toán And.
-	Phương pháp 2: Giúp học sinh làm quen với lệnh gán, sử dụng biến trung gian Max, Min và câu lệnh ghép (Begin Max:=a; Min:=b; End) trong câu lệnh điều kiện.
-	Phương pháp 3: Giúp học sinh làm quen với câu lệnh điều kiện dạng thiếu và ôn lại kiến thức sắp xếp giá trị hai biến theo thứ tự tăng hoặc giảm dần begin Tam:=a; a:=b; b:=tam end;
b. Chuyên đề Câu lệnh lặp
Bài toán 1: Số nguyên tố là số tự nhiên lớn hơn 1, chỉ có hai ước là 1 và chính nó.
Yêu cầu: Nhập vào số nguyên dương N. Kiểm tra xem N có phải là số nguyên tố hay không, thông báo kết quả sau khi kiểm tra.
Phương pháp 1:
-	Ý tưởng:
+ Cho biến i chạy từ 2 đến n-1 {Ta xét trường hợp n có chia hết cho i hay không}, nếu n chia hết cho i thì ta tăng biến đếm lên một đơn vị {ban đầu biến đếm nhận giá trị bằng 0}.
+ Kiểm tra biến đếm, nếu biến đếm nhận giá trị bằng không {tức n không chia hết cho số nào trong khoảng từ 2 đến n-1} vậy n là số nguyên tố, ngược lại biến đếm nhận giá trị lớn hơn 0{tức n chia hết cho cho một hoặc nhiều giá trị trong khoảng [2..n-1]} vậy n không phải là số nguyên tố.
-	Chương trình:
Program So_ND;
Var n,i,dem:Integer;
Begin
Write('Nhap gia tri N: ');Readln(n);
If n<2 Then Write(n, Khong phai la so nguyen to');
 Else 
Begin
dem:=0;
For i:=2 To n-1 Do
If n Mod i = 0 Then Inc(dem);
If dem=0 Then Writeln(n, ' La so nguyen to') 
Else Writeln(n, ' Khong phai So nguyen to');
End;
	Readln;
	End.
Phương pháp 2:
Bổ sung kiến thức:
+ N là số Nguyên tố khi n>=2 và n không chia hết cho số nào có giá trị trong khoảng từ 2 đến n – 1. Tuy nhiên trên thực tế thì chỉ cần n không chia hết cho số nào có giá trị trong khoản từ 2 đến số nguyên gần với căn n nhất nhưng nhỏ hơn n {Trunc(Sqrt(n))}.
+ Giả sử A và B là hai giá trị kiểu Boolean. Kết quả của các phép toán được thể hiện qua bảng dưới đây: 
Ý tưởng:
+ Giống như phương pháp 1 tuy nhiên ở đây chúng ta không đếm mà sử dụng phương pháp đánh dấu của kiểu boolean. Tức ta xét trường hợp n có chia hết cho i hay không, nếu n chia hết cho i thì ta đánh dấu là False {Giả sử biến KT có biểu dữ liệu là Boolean thì nếu n chia hết cho i thì KT:=False, ban đầu ta gán KT:=True}.
+ Kiểm tra biến KT, nếu KT là True {tức biến KT nhận tất cả là True} thì n là số nguyên tố, ngược lại n không phải số nguyên tố {tức biến KT có nhận lớn hơn hoặc bằng một giá trị False}.
- Chương trình:
 Program KT_SONT;
Var i,n:Integer; Kt:Boolean;
Begin
Write('Nhap gia tri N: ');Readln(n); 
Kt:=True;
If n < 2 Then Kt:=False Else
For i:=2 To Trunc(Sqrt(n)) Do
If n Mod i = 0 Then Kt:=False; 
If Kt Then Write(n,' la so nguyen to')
Else Write(n,' Khong la so nguyen to');
Readln; 
End.
=> Nhận xét:
- Phương pháp 1: Giúp cho học sinh có cái nhìn tổng quan hơn khi xác định n có phải là số nguyên tố hay không thông qua phương thức đếm số lần n có chia hết cho giá trị nào trong khoảng từ [2..n-1] hay không, theo định nghĩa thì số nguyên tố là số chỉ chia hết cho 1 và chính nó {tức nếu N là số nguyên tố chỉ khi n chia hết cho 1 và n}. Vậy nếu n còn chia hết cho số nào trong khoảng [2..n-1] thì n không phải nguyên tố.
- Phương pháp 2: Phương giáp này giúp học sinh tìm hiểu được nhiều kiến thức hơn trên nền kiến thức của phương pháp 1. Khi cho i chạy từ 2 đến trunc(sqrt(n)) thì số lần thực hiện vòng lặp được giảm đi một nữa, sẽ tiết kiệm được thời gian khi chạy chương trình; mặt khác giúp học sinh ôn lại kiến thức lấy kết quả phép so sánh của kiểu dữ liệu Boolean, một kiểu dữ liệu mà chúng ta cũng rất hay sử dụng trong các bài tạo vòng lặp.
Bài toán 2: Viết chương trình nhập vào 2 số nguyên dương a, b khác nhau.
Tìm ước chung lớn nhất và bội chung nhỏ nhất của 2 số trên.
Phương pháp 1:
 Ý tưởng:
+ Kiểm tra hai giá trị a, b. Nếu a>b thì a:=a-b ngược lại thì b:=b-a, tiếp tục kiểm tra giá trị a, b và trừ cho đến khi nào a=b thì kết thúc. Lúc đó: USLN=a.
+ BCNN của hai số a, b bằng phần nguyên của a nhân b chia cho USLN(a,b). {BCNN(a,b) = a*b Div UCLL(a,b)}.
Chương trình:
Program UCLN_BCNN;
Var a,b,p,du:Integer; 
Begin
Write('Nhap gia tri a, b tuong uong : ');Readln(a, b); 
P:=a*b;
Repeat
If a>b Then a:=a-b Else b:=b-a; 
Until a = b;
Writeln('UCLN cua a va b la: ',a,' BCNN la: ',p Div a); Readln;
End.
• Lưu ý: Sau khi test chương trình xong giáo viên cho học sinh test cặp giá trị a, b bằng nhau. Yêu cầu học sinh nhận xét, nêu thuật toán và viết lại chương trình trên với điều kiện a, b là hai số nguyên.
Phương pháp 2:
Ý tưởng:
+ Nếu a chia b có phần dư bằng 0 thì b là UCLN của a và b. Từ khái niệm này ta xây dựng thuật toán như sau: du:= a mod b, a:=b; b:=du, chương trình kết thúc khi b=0 và UCLN là a.
+ Viết ra UCLN, BCNN
Chương trình: 
Program UCLN_BCNN;
Var a,b,p,du:Integer; 
Begin
Write('Nhap gia tri a, b tuong uong : ');Readln(a, b); 
P:=a*b;
While b0 Do Begin
Du:=a mod b; a:=b:b:=du;
Writeln('UCLN la: ',a,' BCNN la: ',P Div a); 
Readln;
End.
Phương pháp 3:
 Ý tưởng:
+ Ta cho biến i chạy từ 1 đến a, nếu thỏa mãn đồng thời 2 điều kiện (a mod i =0) và (b mod i =0) thì i là UCLN của a và b.
+ Viết ra UCLN, BCNN
Chương trình: 
Program UCLN_BCNN;
Var a,b,p,d:Integer;
Begin
Write('Nhap gia tri a, b tuong uong : ');Readln(a, b);
 P:=a*b;
For i:=1 To a Do if (a mod i=0) and (b mod i=0) then d:=i 
Writeln('UCLN la: ',d, ‘BCNN la: ',p Div d);
Readln; 
End.
Phương pháp 4:
-	Ý tưởng:
+ Ta cho biến i chạy downto từ a đến 1, nếu thỏa mãn đồng thời 2 điều kiện (a mod i =0) và (b mod i =0) thì i là UCLN của a và b đồng thời kết thúc việc tìm kiếm {kết thúc vòng lặp}.
+ Viết ra UCLN, BCNN
- Bổ sung kiến thức: Lệnh break
+ Cú pháp: Break
+ Hoạt động: Lệnh break hoạt động khi được đặt trong thân các vòng lặp for, while, repeat. Khi gặp lệnh break thì máy sẽ thoát khỏi chu trình của vòng lặp, nếu có nhiều vòng lặp lồng nhau sẽ thoát vòng lặp trong nhất chứa lệnh break;
- Chương trình: 
Program UCLN_BNNN;
Var a,b,p,d:Integer;
Begin
Write('Nhap gia tri a, b tuong uong : ');Readln(a, b); 
P:=a*b;
For i:=a Downto 1 Do if (a mod i=0) and (b mod i=0) then d:=i; 
Writeln('UCLN la: ',d, ‘BCNN la: ',p Div d);
Readln; 
End.
=> Nhận xét:
- Phương pháp 1, 2: Nếu chúng ta cho học thực hiện vòng While Do hoặc Repeat  Until để viết chương trình cho hai phương pháp trên thì cơ bản thuật toán không thay đổi chỉ khác nhau là sử dụng phương pháp chia liên tiếp hay trừ liên tiếp. Tuy nhiên ở đây chúng ta sử dụng While Do cho phương pháp 1 và Repeat Until cho phương pháp 2 với mục đích giúp các em tìm hiểu thêm sự khác nhau trong điều kiện lặp và kết thúc hai câu lệnh trên, từ đó yêu cầu các em chỉnh sửa câu lệnh, thuật toán chia, trừ liên tiếp ngược lại trong hai phương pháp để khắc sâu kiến thức hơn.
- Phương pháp 3, 4: Phương pháp này giúp các em ôn lại 2 nội dung kiến thức, một là điều kiện ghép trong câu lệnh điều kiện, hai là vòng lặp với số lần biết trước. Khi thực hiện vòng lặp dạng tiến For i:=1 To a thì có thể có nhiều giá trị thỏa mãn nhưng chương trình sẽ nhận được giá trị cuối cùng khi kết thúc lặp, giá trị này là giá trị ta cần tìm trong bài toán. Trong phương pháp 4 các em còn tìm hiểu thêm được kiến thức mới về câu lệnh Break. Lệnh này thường được áp dụng để tìm giá trị nhỏ nhất, lớn nhất thỏa mãn các điều kiện nào đó. Ví dụ Viết chương trình tìm số nguyên dương T nhỏ nhất có N chữ số, biết rằng khi chia T cho 19 thì dư 13 và khi chia T cho 31 thì dư 12.
c. Chuyên đề mảng một chiều.
Dãy Fibonaci là dãy 1, 1, 2, 3, 5, 8, 13, 21, ... dãy này được sinh ra bởi công thức đệ qui sau: F1 =1, F2 =1, Fk=Fk-1+Fk-2 với 2<k≤46.
Mọi số nguyên dương N đều có thể triển khai thành tổng của một số trong dãy Fibonaci.
Yêu cầu: Cho trước số N, hãy triển khai N thành tổng của ít nhất các số hạng khác nhau của dãy Fibonaci.
Phương pháp 1:
Ý tưởng:
+ Triển khai N thành dãy Fibonaci và lưu vào mảng A. 
Ví dụ: N = 15 
A	1	1	2	3	5	8	13	21
i	1	2	3	4	5	6	7	8
+ Ban đầu t:=0, j:=0. Thực hiện vòng lặp Downto cho h chạy từ I đến 1, kiểm tra nếu t+ah ≤n thì tăng j lên một đơn vị và lưu ah vào bj , t:=t+ai, chương trình kết thúc khi t=n.
+ Viết ra mảng bi
Chương trình: 
Program Fibonaci;
Var a,b: array[1..100] of Longint; 
i,j,t,h,n:Longint;
Begin
Write('Nhap gia tri N:');Readln(n); 
a[1]:=1;a[2]:=1; i:=2;
While a[i]<N Do 
Begin
 	inc(i);
a[i]:=a[i-1]+a[i-2];
End;
t:=0;j:=0;
For h:=i Downto 1 Do 
if t+a[h]<=n then
Begin
inc(j); b[j]:=a[h]; t:=t+b[j]; 
If b[j] = n then Break 
End;
For i:=1 To j Do Write(b[i],' '); 
Readln;
End.
Phương pháp 2:
-	Ý tưởng:
+ Triển khai N thành dãy Fibonaci và lưu vào mảng A.
+ Thực hiện vòng lặp Downto cho h chạy từ i đến 1, kiểm tra nếu ah ≤n thì viết ra ah , n:=n-ah , chương trình kết thúc khi n=0.
- Chương trình: 
Program Fibonaci;
Var a,b: array[1..100] of Longint; 
i,j,t,h,n:Longint;
Begin
Write('Nhap gia tri N:');Readln(n); 
a[1]:=1;a[2]:=1; i:=2;
While a[i]<N Do 
Begin
 	inc(i);
a[i]:=a[i-1]+a[i-2];
End;
For h:=i Downto 1 Do if a[h]<=n then
Begin
Write(a[h], ‘ ’); N:=n-a[h];
	If n = 0 then Break;
Readln; 
End.
=> Nhận xét:
- Phương pháp 1 và 2 khác nhau ở chỗ phương pháp 1 kiểm tra các phần tử trong a nếu nhỏ hơn hoặc bằng n thì chuyển phần tử đó vào mảng b, khi nào tổng của mảng b bằng n thì dừng, phương pháp 2 kiểm tra giá trị n, nếu n lớn hơn hoặc bằng phần tử trong mảng thì in ra phần tử trên và lấy lại giá trị mới cho n.
- Nhìn chung phương pháp 2 học sinh dễ hiểu thuật toán hơn tuy nhiên ở phương pháp 1 lại giúp các em bổ sung thêm kiến thức về việc sử dụng nhiều biến mảng trong một chương trình.
• Lưu ý chung: Trong các chuyên đề nêu trên, đối với các

Tài liệu đính kèm:

  • docsang_kien_kinh_nghiem_kinh_nghiem_lap_trinh.doc