SKKN Mở rộng các bài toán cơ bản để nâng cao kỹ năng lập trình cho học sinh khả, giỏi

SKKN Mở rộng các bài toán cơ bản để nâng cao kỹ năng lập trình cho học sinh khả, giỏi

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òn nhiề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ấu trúc dữ liệu mà học sinh mới được tiếp xúc lần đầu. Chính vì vậy mà học sinh dễ mắc sai lầm khi lập trình giải quyết các bài toán. Trong việc giảng dạy cho HS, ngoài việc giúp học sinh lĩnh hội những kiến thức cơ bản, người thầy 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 trong học tập của các em. Vì việc học tập tự giác, tích cực, chủ động, sáng tạo đòi hỏi học sinh phải có ý thức về những mục tiêu đặt ra, tạo được động lực bên trong thúc đẩy bản thân các em hoạt động để đạt các mục tiêu đó. Điều này được thực hiện trong dạy học không chỉ đơn giản bằng việc nêu rõ mục tiêu mà quan trọng hơn còn gợi động cơ trong học tập.

 Để rèn luyện kỹ năng lập trình cho học sinh khá, giỏi trước khi chọn đội tuyển đi thi học sinh giỏi môn Tin học có rất nhiều cách mà giáo viên có thể áp dụng đối với các đối tượng học sinh khác nhau. Các trường có điểm thi đầu vào cao thì việc rèn luyện kỹ năng sẽ có nhiều thuận lợi nhưng với các trường có điểm thi đầu vào trung bình và thấp thì việc rèn luyện kỹ năng lập trình cho các em gặp rất nhiều khó khăn. Tuy nhiên trong cùng một trường với các đối tượng học sinh khác nhau giáo viên có thể áp dụng nhiều biện pháp khác nhau để rèn luyện kỹ năng lập trình cho học sinh với hiệu quả khác nhau. Các giáo viên đều hướng dẫn cho học sinh biết một bài toán có thể được giải với nhiều thuật toán khác nhau và mỗi thuật toán chỉ giải được một bài toán hoặc một lớp bài toán, nhưng thực tế cho thấy, đứng trước một bài toán tin học học sinh thường lúng túng khi xác định thuật toán hoặc không xác định được thuật toán. Việc này cũng có thể do nhiều nguyên nhân, chẳng hạn môn Tin học không liên quan đến thi đại học nên các em không chú tâm học, không đầu tư, do các em không có máy để thực hành thêm ở nhà. Tuy nhiên khi cho một bài toán tin học có dạng tương tự hoặc dạng mở rộng từ một bài toán cơ bản nào đó trong sách giáo khoa, hoặc một bài toán cơ bản nào đó mà các em biết thì các em có thể xây dựng và có hứng thú để xây dựng thuật toán cho bài toán đặt ra. Vì vậy giáo viên có thể chọn các bài tập cơ bản từ đó mở rộng và phát triển để rèn luyện kỹ năng lập trình cho học sinh.

 

doc 20 trang thuychi01 6491
Bạn đang xem tài liệu "SKKN Mở rộng các bài toán cơ bản để nâng cao kỹ năng lập trình cho học sinh khả, giỏi", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
1. MỞ ĐẦU
1.1. Lý do chọn đề tài
	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òn nhiề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ấu trúc dữ liệu mà học sinh mới được tiếp xúc lần đầu. Chính vì vậy mà học sinh dễ mắc sai lầm khi lập trình giải quyết các bài toán. Trong việc giảng dạy cho HS, ngoài việc giúp học sinh lĩnh hội những kiến thức cơ bản, người thầy 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 trong học tập của các em. Vì việc học tập tự giác, tích cực, chủ động, sáng tạo đòi hỏi học sinh phải có ý thức về những mục tiêu đặt ra, tạo được động lực bên trong thúc đẩy bản thân các em hoạt động để đạt các mục tiêu đó. Điều này được thực hiện trong dạy học không chỉ đơn giản bằng việc nêu rõ mục tiêu mà quan trọng hơn còn gợi động cơ trong học tập.
	Để rèn luyện kỹ năng lập trình cho học sinh khá, giỏi trước khi chọn đội tuyển đi thi học sinh giỏi môn Tin học có rất nhiều cách mà giáo viên có thể áp dụng đối với các đối tượng học sinh khác nhau. Các trường có điểm thi đầu vào cao thì việc rèn luyện kỹ năng sẽ có nhiều thuận lợi nhưng với các trường có điểm thi đầu vào trung bình và thấp thì việc rèn luyện kỹ năng lập trình cho các em gặp rất nhiều khó khăn. Tuy nhiên trong cùng một trường với các đối tượng học sinh khác nhau giáo viên có thể áp dụng nhiều biện pháp khác nhau để rèn luyện kỹ năng lập trình cho học sinh với hiệu quả khác nhau. Các giáo viên đều hướng dẫn cho học sinh biết một bài toán có thể được giải với nhiều thuật toán khác nhau và mỗi thuật toán chỉ giải được một bài toán hoặc một lớp bài toán, nhưng thực tế cho thấy, đứng trước một bài toán tin học học sinh thường lúng túng khi xác định thuật toán hoặc không xác định được thuật toán. Việc này cũng có thể do nhiều nguyên nhân, chẳng hạn môn Tin học không liên quan đến thi đại học nên các em không chú tâm học, không đầu tư, do các em không có máy để thực hành thêm ở nhà. Tuy nhiên khi cho một bài toán tin học có dạng tương tự hoặc dạng mở rộng từ một bài toán cơ bản nào đó trong sách giáo khoa, hoặc một bài toán cơ bản nào đó mà các em biết thì các em có thể xây dựng và có hứng thú để xây dựng thuật toán cho bài toán đặt ra. Vì vậy giáo viên có thể chọn các bài tập cơ bản từ đó mở rộng và phát triển để rèn luyện kỹ năng lập trình cho học sinh.
Dĩ nhiên cách làm này không mới với giáo viên nhưng cách chọn các bài toán cơ bản như thế nào để học sinh có thể vận dụng và gây được hưng thú cho học sinh đó lại là điều đáng quan tâm. Với đề tài “Mở rộng các bài toán cơ bản để nâng cao kỹ năng lập trình cho học sinh khả, giỏi” nên trong sáng kiến kinh nghiệm này tôi muốn trình bày kinh nghiệm trong việc rèn luyện kỹ năng lập trình cho học sinh khá, giỏi khi học môn Tin học 11. 
2. Mục đích nghiên cứu
Hệ thống các bài toán dưới dạng một số dạng bài tập thường gặp giúp cho giáo viên và học sinh phần nào nhận dạng và giải một số bài tập liên quan. Việc áp dụng thuật toán của các bài toán cơ bản để xây dựng thuật toán cho các bài toán tương tự hoặc các bài toán mở rộng từ các bài toán cơ bản đó là một quá trình giúp học sinh rèn luyện kỹ năng lập trình.
3. Đối tượng nghiên cứu
Sử dụng ngôn ngữ lập trình Turbo Pascal và Free Pascal để tiến hành nghiên cứu các bài toán nâng cao dành cho học sinh khá, giỏi với đối tượng nghiên cứu là học sinh khối 11 của trường PT Nguyễn Mộng Tuân.
Hình thành được kỹ năng thực hành giải các bài tập cho học sinh và có được một hệ thống kiến thức với các dạng bài tập lập trình.
4. Phương pháp nghiên cứu
Hình thành ở học sinh kỹ năng phân tích, xử lý các vấn đề liên quan đến bài tập, sử dụng thành thạo vòng lặp biết trước, thủ tục chuẩn vào/ra đơn giản, bước đầu làm quen với một số chương trình con dạng thủ tục tạo điều kiện thuận lợi cho việc tiếp thu kiến thức về cách viết chương trình có cấu trúc. 
Để trình bày sáng kiến kinh nghiệm này, tôi đã sử dụng phối kết hợp nhiều phương pháp như: nghiên cứu tài liệu, thuyết trình, quan sát, tham khảo ý kiến của cấp trên và đồng nghiệp, điều tra cơ bản, thực nghiệm so sánh, phân tích kết quả thực nghiệm,  phù hợp với môn học thuộc lĩnh vực Tin học.
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
Nghị quyết hội nghị Trung ương VIII khóa XI chỉ đạo: “Giáo dục và đạo tạo là Quốc sách hàng đầu, là sự nghiệp của Đảng và Nhà nước và của toàn dân. Đầu tư cho giáo dục là đầu tư phát triển, được ưu tiên đi trước cho các chương trình, kế hoạch phát triển kinh tế, xã hội; phát triển giáo dục và đào tạo là nâng cao dân trí, đào tạo nhân lực, bồi dưỡng nhân tài. Chuyển mạnh quá trình giáo dục từ chủ yếu trang bị kiến thức sang phát triển toàn diện năng lực và phẩm chất người học. Học đi đôi với hành, lý luận gắn với thực tiễn, giáo dục nhà trường kết hợp với giáo dục gia đình và giáo dục xã hội”. 
Nghị quyết hội nghị Trung ương VIII khóa XI đề ra mục tiêu: “Đối với giáo dục phổ thông tập trung phát triển trí tuệ, thể chất, hình thành phẩm chất, năng lực công dân, phát hiện và bồi dưỡng năng khiếu, định hướng nghề nghiệp cho học sinh. Nâng cao chất lượng giáo dục toàn diện, chú trọng giáo dục lý tưởng truyền thống đạo đức, lối sống, ngoại ngữ, tin học, năng lực và kỹ năng thực hành, vận dụng kiến thức vào thực tiễn, phát triển khả năng sáng tạo và tự học, khuyến khích học tập suốt đời, hoàn thành đào tạo giáo dục phổ thông giai đoạn sau 2015”.
Căn cứ vào mục tiêu của môn Tin học, là phải cung cấp những tri thức cơ bản, làm nền tảng để học sinh có thể tiếp tục đi sâu vào tìm hiểu và xây dựng khoa học Tin học hoặc tiếp thu những tri thức của các lĩnh vực kĩ thuật công nghệ tiên tiến, nhất là các lĩnh vực của công nghệ thông tin. Môn Tin học, cũng như mọi môn học khác, căn cứ vào mục tiêu trên để xác định ra nhiệm vụ cụ thể của môn học, tổ chức hoạt động đào tạo góp phần thực hiện mục tiêu giáo dục mà Đảng và nhà nước đề ra.
Nếu học sinh được rèn luyện các kỹ năng cơ bản về lập trình tốt thì việc mở rộng các bài toán cơ bản dành cho học sinh khá giỏi sẽ cuốn hút học sinh, tạo hứng thú cho học sinh khi học lập trình. 
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm
Môn Tin học là môn học đặc thù có nhiều kiến thức khó như lập trình pascal ở lớp 11 (đây là kiến thức thi học sinh giỏi tỉnh môn Tin học) nhưng thường bị xem nhẹ, bị xem là “môn phụ”. Học sinh – phụ huynh chưa mặn mà, chưa quan tâm đúng mực tới môn học nên việc lựa chọn và bồi dưỡng học sinh giỏi là vô cùng khó khăn. Đứng trước một bài toán tin học, học sinh thường lúng túng và không biết tìm thuật toán của bài toán từ đâu và tìm như thế nào? Một số học sinh khá, giỏi thì có thói quen là mò mẫm và thử nghiệm để tìm lời giải, điều đó có thể dẫn tới kết quả đúng hoặc sai hoặc chệch hướng giải quyết bài toán, hiệu suất để tìm thuật toán như thế là không cao, một số học sinh kém hơn thì không biết cách tìm thuật toán từ đâu và điều đó gây tâm lý chán nản cho các em. Với tình hình ấy để giúp học sinh định hướng tốt hơn trong quá trình tìm thuật toán, trước khi có thể tự tìm được thuật toán tốt hơn thì người giáo viên cần tạo cho học sinh thói quen tìm thuật toán cho bài toán đặt ra từ các các bài toán cơ bản quen thuộc mà các em đã biết, khai thác các yếu tố đặc trưng của một số bài toán cơ bản để tìm thuật toán cho các bài toán mới. Việc áp dụng thuật toán của các bài toán cơ bản để xây dựng thuật toán cho các bài toán tương tự hoặc các bài toán mở rộng từ các bài toán cơ bản đó là một quá trình giúp học sinh rèn luyện kỹ năng lập trình. 	
Chính vì vậy khi mở rộng các bài toán cơ bản trong SGK Tin học 11 để nâng cao kỹ năng lập trình cho học sinh khá giỏi, tôi nhận thấy các em hiểu sâu hơn về thuật toán và cảm nhận thấy học lập trình cũng không khó đến mức mình không thể hiểu, dần dần yêu thích môn học hơn. Và đó cũng là bước cơ bản để tạo tiền đề trong việc lựa chọn học sinh để bồi dưỡng học sinh giỏi.
2.3. Giải pháp đã sử dụng để giải quyết vấn đề
2.3.1. Các giải pháp thực hiện
1. Xây dựng hệ thống bài tập để rèn luyện kỹ năng lập trình thông qua các buổi học, mỗi buổi học nên chọn một bài toán cơ bản để mở rộng và phát triển kỹ năng lập trình.
Mỗi buổi học nên xây dựng hệ thống bài tập như sau:
Bước 1: Chọn bài toán cơ bản hoặc bài toán quen thuộc với học sinh để học sinh lập trình.
Bước 2: Mở rộng bài toán ở cấp độ 1 (chỉ cần học sinh lập trình được mà chưa cần quan tâm đến các yếu tố như: quan tâm đến các yếu tố đặc biệt của dữ liệu vào, thời gian, phạm vi giá trị của biến)
Bước 3: Mở rộng bài toán ở cấp độ 2 (quan tâm đến các yếu tố như: các trường hợp đặc biệt của dữ liệu vào, phạm vi giá trị của các biến, thời gian, chuyển sang đọc ghi vào kiểu tệp )
Bước 4: Mở rộng bài toán để học sinh rèn luyện kỹ năng lập trình ở nhà trên máy hoặc trên giấy sau đó nộp lại để giáo viên kiểm tra đánh giá.
2. Tổ chức cho học sinh hình thành kỹ năng lập trình thông qua nhiều buổi học có sự hướng dẫn của giáo viên tại phòng máy.
3. Tổ chức kiểm tra để thu thập thông tin về khả năng rèn luyện kỹ năng lập trình của học sinh.
2.3.2 Các biện pháp để tổ chức thực hiện
Nội dung này được triển khai thông qua các buổi học (mỗi buổi học 3 tiết). Số lượng buổi học là bao nhiêu buổi là do giáo viên xây dựng tùy vào chất lượng học sinh.
Trong phạm vi chương trình môn tin học lớp 11, chúng ta có thể sử dụng một số hệ thống bài tập sau để rèn luyện kỹ năng lập trình cho học sinh khá, giỏi thông qua các buổi học:
2.3.2.1. Hoạt động 1: Tìm hiểu một số bài toán về ước số(Buổi 1+2)
Bài tập 1: (Bài toán cơ bản)
Viết chương trình nhập từ bàn phím số nguyên dương N, tính tổng các ước thực sự của N và in ra màn hình. Ví dụ: N=6 thì tổng các ước là 1+2+3 =6; N=9 thì tổng các ước là 1+ 3 =4
Nhận xét: Học sinh biết để kiểm tra xem số i có phải là ước của số N hay không thì dùng phép toán Mod (N mod i = 0), giáo viên chỉ cần hướng dẫn học sinh duyệt các số i đó trong khoảng từ 1 đến (N div 2) là học sinh có thể làm được nhanh chóng, ta sẽ có đáp án của bài này có thể như sau:
Program bai1;
Var 	i,tg,N:word;	
Begin
	write(‘Nhap N=’);
	readln(N);
	tg:=0;
	for i:=1 to N div 2 do 
 if n mod i =0 then tg:=tg+i;
	writeln(‘Tong cac uoc la= ‘, tg:5);
Readln;
End.
Giáo viên có thể yêu cầu học sinh nhập một vài giá trị N để xem kết quả. Sau đó yêu cầu học sinh làm bài tập 2 như sau:
Bài tập 2: Số N được gọi là số hoàn hảo nếu tổng các ước thực sự của N bằng chính nó. Viết chương trình nhập từ bàn phím số nguyên dương N, thông báo ra màn hình DUNG nếu N là số hoàn hảo, ngược lại thì thông báo KHONG.
Nhận xét: Học sinh dễ dàng nhận thấy cách làm bài 2 sẽ tương tự cách làm bài 1, chỉ thêm một công việc đó là kiểm tra xem tổng các ước đó có bằng N hay không? Học sinh sẽ nhanh chóng sao chép chương trình bài1 và sửa lại để được chương trình bài 2 như sau:
Program bai2;
Var 	i,tg,N:word;	
Begin
	write(‘Nhap N=’);
	readln(N);
	tg:=0;
	for i:=1 to N div 2 do 
 if n mod i =0 then tg:=tg+i;
	if tg=N then Writeln(‘DUNG’) else writeln(‘KHONG’);
Readln;
End.
Tương tự như vậy ta sẽ yêu cầu học sinh làm bài tập 3 như sau:
Bài tập 3: Viết chương trình in ra màn hình các số hoàn hảo trong khoảng từ a đến b (với 1<a<b). Với a, b được nhập từ bàn phím.
Nhận xét: Giáo viên để cho học sinh tự làm, nếu còn học sinh nào còn lúng túng thì mới hướng dẫn. Tuy nhiên thì với bài 2 đã biết cách làm thì học sinh cũng có thể nhanh chóng hoàn thiện được bài 3 có thể chưa kiểm tra được điều kiện nhập a,b như sau:
Program bai3;
Var 	i,a,b,k,tg:word;	
Begin
	Write(‘Nhap a,b=’);
	Readln(a,b);
	For k:=a to b do
	Begin
	Tg:=0;
	For i:=1 to K div 2 do 
 	If K mod i =0 then tg:=tg+i;
	If tg=K then Writeln(k);
	End;
Readln;
End.
Giáo viên yêu cầu học sinh test với một số bộ dữ liệu tương ứng với các giá trị của a, b và yêu cầu học sinh hoàn thiện thêm đọan lệnh kiểm tra điều kiện nhập a,b bằng repeat..until.
Bài tập 4: Bài tập được nâng lên với mức độ khó hơn
	Trong một buổi học toán, Bờm được học khái niệm về số có tính chất đặc biệt Số hoàn hảo là số có tổng các ước trừ nó ra thì bằng chính nó. Ví dụ: Số 6 là số hoàn hảo vì nó có tổng các ước 1+2+3=6, số 8 không phải là số hoàn hảo vì 1+2+4=7#8. Cho dãy từ a1,a2,.aN. Hãy giúp bờm đếm xem trong dãy có bao nhiêu số có tổng các chữ số là số hoàn hảo.
* Nhận xét:
 	 Bài toán này cũng tương tự như các bài tập trên, nó cũng áp dụng đoạn chương trình kiểm tra số hoàn hảo nhưng được nâng lên mức độ khó hơn, trong chương trình có sử dụng hai biến “dem”.
Chương trình được viết như sau:
 Program Bài 4;
 Var a:array[1..100] of integer;
 n.i.dem1: integer;
 Function sohh(m:integer):Boolean;
 Var j,dem:integer;
 Begin
 dem:=0;
 sohh:=false;
 for j:=1 to m div 2 do
 begin
 If m mod j=0 then dem:=dem+j;
 end;
 if dem=m then sohh:=true;
 End;
 BEGIN
 dem1:=0;
 readln(n);
 for i:=1 to n do read(a[i]);
 for i:=1 to n do if sohh(a[i]) then dem:=dem+1;
 write(dem1);
 END.
Bài tập 5: Hai số a và b được gọi là bạn của nhau nếu tổng các ước của a bằng b và ngược lại tổng các ước của b bằng a. Viết chương trình tìm các số bè bạn như trên trong khoảng từ m đến n (m < n, m và n nhập từ bàn phím).
Tương tự ta yêu cầu học sinh sao chép sửa lại chương trình bài tập 4 để được bài tập 5.
Bài tập 6: (Bài tập về nhà)
Viết chương trình nhập vào 2 số a, b (1<a<b<10000). Thông báo ra màn hình số lượng các số chẵn, số lượng các số lẽ, số lượng các số hoàn hảo trong khoảng từ a đến b, với a, b được nhập từ bàn phím.
Bài tập 7: (Bài tập về nhà)
Em hãy dùng câu lệnh while để viết lại chương trình của bài 4 và bài 5.
Yêu cầu: Kiểm tra điều kiện nhập dữ liệu vào. Viết chương trình ra giấy và nộp lại cho giáo viên.
Sau buổi 2 kỹ năng vận dụng các cấu trúc vòng lặp For- If, While - if lồng nhau đã đựoc cải thiện hơn.
2.3.2.2. Hoạt động 2: Một số dạng bài tập về mảng một chiều (Buổi 3+4)
DẠNG 1: Duyệt mảng để tìm các phần tử thoả mãn một yêu cầu nào đó?
Yêu cầu các phần tử đó có thể là:
+ Là số chẵn	
+ Là số lẻ	
+ Là số chia hết cho một số K	
+ Tính tổng các số của dãy
+ Tìm giá trị lớn nhất, giá trị nhỏ nhất trong dãy
+ Là số chính phương
+ Là số nguyên tố
+ Là số hoàn hảo	
+ Dãy có phải là cấp số cộng hay không
+ Dãy tồn tại một cặp số mà trung bình cộng bằng k
+ Sắp xếp dãy số theo thứ tự tăng hay giảm dần.
.
Bài tập 1: (Bài toán cơ bản)
Viết chương trình nhập vào từ bàn phím số nguyên N và mảng A gồm N phần tử. Thông báo ra màn hình các số chẵn có trong mảng đã nhập và số lượng của chúng.
Nhận xét: Với cách nhập dữ liệu cho mảng, cách dùng vòng For để duyệt mảng đã được học hoặc đã được làm quen với các ví dụ các em có thể dễ dàng hoàn thành chương trình có thể như sau:
Program bai1;
Const Nmax=100;
Var 	A:array[1..Nmax] of integer;
	I,dem,N : integer;
Begin
	Writeln(‘Nhap n=’);
Readln(N); 
	For i:=1 to N do 
begin
writeln(‘nhap phan tu thu ‘,i);
read(A[i]); {doc tung phan tu vao mang}
end;
	Dem:=0; {khoi tao bien dem=0 (chua dem duoc so nao thoa man)}
	For i:=1 to N do
if A[i] mod 2 =0 then {Xu li luon cac phan tu cua mang}
	begin
	write(A[i],’ ‘); {in phan tu thoa man ra man hinh}
	inc(dem); {tang bien dem len mot don vi}
	end;
	writeln; {Dua con tro xuong dong de in so luong phan tu thoa man}
	writeln(dem); {in so luong ra man hinh}
	readln;
END.
Bài tập 2: Viết chương trình nhập vào từ bàn phím số nguyên N và mảng A gồm N phần tử. Thông báo ra màn hình các số lẻ có trong mảng đã nhập và số lượng của chúng.
Nhận xét: Giáo viên yêu cầu học sinh từ chương trình bài tập 1 lưu lại với tên khác và sửa lại để hoàn thành chương trình bài 2. (Mất khoảng 1-2 phút học sinh sẽ hoàn thành)
Bài tập 3: Viết chương trình nhập vào từ bàn phím số nguyên N, số K và mảng A gồm N phần tử. Thông báo ra màn hình các số chia hết cho K có trong mảng đã nhập và số lượng của chúng.
Nhận xét: Giáo viên yêu cầu học sinh từ chương trình bài tập 2 lưu lại với tên khác và sửa lại để hoàn thành chương trình bài 3. (Mất khoảng 3-6 phút học sinh sẽ hoàn thành)
Bài tập 4: Viết chương trình nhập vào từ bàn phím số nguyên N và mảng A gồm N phần tử. Thông báo ra màn hình các số nguyên tố có trong mảng đã nhập và số lượng của chúng.
Bài tập 5: Viết chương trình nhập vào từ bàn phím số nguyên N và mảng A gồm N phần tử. Thông báo ra màn hình các số hoàn hảo có trong mảng đã nhập và số lượng của chúng.
Nhận xét: Giáo viên yêu cầu học sinh từ chương trình bài tập 1 lưu lại với tên khác, dựa vào thuật toán kiểm tra số hoàn hảo đã học ở buổi trước để sửa lại chương trình thành chương trình bài 5. (Mất khoảng 8-12 phút học sinh sẽ hoàn thành).
DẠNG 2: Thuật toán sắp xếp và một số bài tập áp dụng thuật toán sắp xếp
Bài tập 1: (Bài toán cơ bản) 
Viết chương trình vào từ bàn phím số nguyên N và mảng A gồm N phần tử. In ra màn hình mảng A sau khi đã sắp xếp các phần tử theo thứ tự tăng dần.
Nhận xét: Có nhiều thuật toán sắp xếp nhưng chúng ta chưa nên giới thiệu các thuật toán như QuickSort..., chỉ nên giới thiệu thuật toán sắp xếp đơn giản, chẳng hạn:
Program baitap1;
const nmax=20;
var	a:array[1..nmax]of integer;
tg:integer;
i,j,n:integer;
begin
	Writeln(‘Nhap so luong phan tu cua mang’);
	Readln(N); 
 	for i:=1 to n do{Cho i chạy từ 1 đến N}
	Begin
 	 Writeln(‘nhap phan tu thu ‘,i);
 read(a[i]);{Đọc phần tử thứ i vào mảng}
End;
{Sap xep mang}
 for i:=1 to n-1 do{Cho i chạy từ 1 đến N -1}
 for j:=i+1 to n do{Cho i chạy từ i+1 đến N}
 	if a[i]>a[j]then{Nếu a[i]>a[j] thì}
begin
 	 tg:=a[i];a[i]:=a[j];a[j]:=tg;{đỗi chỗ a[i] và a[j]}
 	end;
for i:=1 to n do write(a[i],' ');{In mảng đã sắp xếp ra tệp}
 readln;
end.
Bài tập 2: Tương tự thuật toán sắp xếp như Bài 1 nhưng mức độ được nâng lên khó hơn. Bài toán như sau:
	Cho dãy số gồm N số nguyên dương a1,a2,,an và một số nguyên k.
Yêu cầu: Sắp xếp dãy số theo thứ tự tăng dần và chèn thêm k vào dãy số đã sắp xếp sao cho dãy vẫn là dãy tăng dần.
Chương trình được viết như sau:
 Program baitap2;
 Var a:array[1..1000] of integer;
 Procedure sapxep;
 Begin
 For i:=1 to n-1 do
 For j:=i+1 to n do
 If a[i] >a[j] then
 Begin
 tg:=a[i];
 a[i]:=a[i+1];
 a[i+1]:=tg;
 BEGIN
 readln(n,k);
 for i:=1 to n do read(a[i]);
 sapxep;
 while a[i]<k do i:=i+1;
 if i>n then a[n+1]:=k
 else begin
 for j:=n downto i do
 a[i+1]:=a[i];
 a[i]:=k;
 end;
 for i:=1 to n+1 do write(a[i],’’);
 END. 
Bài tập 3: Hãy đếm xem trong dãy số cho trước có bao nhiêu số đôi một khác nhau.
Nhận xét: + Áp dụng thuật toán sắp xếp như các bài toán trên
 + Khởi tạo một biến dem=1
 + Duyệt từ vị trí 1 đến vị trí thứ n-1, nếu a[i]a[i+1] thì tăng dem 
 lên 1.
 + Kết quả bài toán in ra dem.
Chương trình chạy như sau:
 Program baitap3;
 Maxn=10000;
 Var i,n:longint;
 dem:longint;
 a:array[0..maxn+1] of longint;
 Procedure sapxep;
 Var i,j,tg:longint;
 begin
 For i:=1 to n-1 do
 For j:=i+1 to n do
 If a[i]>a[j] then
 begin
 tg:=a[i];
 a[i]:=a[j];
 a[j]:=tg;
 end;
 end;
 BEGIN
 readln(n);
 for i:=1 to n do read(a[i]);
 dem:=1;
 sapxep;
 for i:=1 to n-1 do
 if a[i] a[i+1] then inc(dem);
 writeln(dem);
 END.
Bài tập về nhà: Em hãy suy nghĩ về thuật toán để giải quyết bài toán sau đây, có thể tham khảo thuật toán đã hướng dẫn.
Bài tập 4: Viết chương trình nhập vào một dãy số nguyên có n phần tử.
a. Đưa những phần tử lẻ ra đầu danh sách, những phần tử chẵn về cuối danh sách và in kết quả ra màn hình.
b. Sắp xếp các phần tử lẻ đầu danh sách theo thứ tứ tăng dần, sắp xếp các phần tử
chẵn cuối danh sách theo thứ tự giảm dần. In danh sách ra màn hình. 
Hướng dẫn thuật toán:
Câu a) Dùng đồng thời 2 biến, biến L duyệt từ đầu dãy đến cuối dãy (để xếp các phần tử lẻ lên đầu), biến R duyệt từ đầu dãy đến cuối dãy (để xếp các phần tử chẵn về cuối), nếu biến L gặp số chẵn và bi

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

  • docskkn_mo_rong_cac_bai_toan_co_ban_de_nang_cao_ky_nang_lap_tri.doc
  • docBia_Mucluc_SKKN2018.doc