Đề tài Vận dụng và khai thác câu lệnh lặp For ... to
1. Tìm hiểu về câu lệnh lặp For . To
a. Cấu trúc câu lệnh:
Cấu trúc vòng lặp For:
for
Dạng khác của vòng lặp for (giảm dần biến đếm của vòng lặp for):
for
b. Phân tích câu lệnh:
Thực hiện phép toán lặp lại tuần tự theo giá trị của biến đếm.
Giá trị của biến đếm là số nguyên.
Giá trị của biến tăng thêm 1 đơn vị sau khi lặp.
Biến đếm có giới hạn về giá trị: Có giá trị bắt đầu và giá trị kết thúc.
Vòng lặp kết thúc khi giá trị của biến thỏa mãn ‘Giá trị kết thúc’.
2. Tình huống và giải pháp trong thực tiễn:
a. Tình huống 1: Thông thường câu lệnh “For . to” được vận dụng để giải những bài toán có tính lặp lại tuần tự theo biến đếm.
Trong tình huống này chúng ta cần nêu ra những bài tập thông thường nhằm giúp học sinh nắm được cách áp dụng câu lệnh “For . to” vào trong bài toán lập trình.
b. Tình huống 2: Bài toán cần thực hiện lặp lại tuần tự nhưng không nhất thiết phải liên tục.
Các bài toán trong tình huống này sẽ giúp học sinh nắm bắt được cách thức hoạt động của câu lệnh trong bài toán, đồng thời biết cách làm giảm số lần lặp lại lặp lại không cần thiết nhằm tối ưu mã lệnh.
c. Tình huống 3: Bài toán thực hiện lặp lại nhưng có nhiều hơn 1 điều kiện kết thúc lặp.
Bài toán trong tình huống này sẽ giúp người học rèn luyện được cách xác định được những thời điểm kết thúc của vòng lặp nhằm tránh rơi vào tình trạng lặp vô hạn và tối ưu mã lệnh.
3. Ví dụ vận dụng
Tìm hiểu về câu lệnh lặp For ... To Cấu trúc câu lệnh: Cấu trúc vòng lặp For: for := to do ; Dạng khác của vòng lặp for (giảm dần biến đếm của vòng lặp for): for := downto do ; Phân tích câu lệnh: Thực hiện phép toán lặp lại tuần tự theo giá trị của biến đếm. Giá trị của biến đếm là số nguyên. Giá trị của biến tăng thêm 1 đơn vị sau khi lặp. Biến đếm có giới hạn về giá trị: Có giá trị bắt đầu và giá trị kết thúc. Vòng lặp kết thúc khi giá trị của biến thỏa mãn ‘Giá trị kết thúc’. Tình huống và giải pháp trong thực tiễn: Tình huống 1: Thông thường câu lệnh “For ... to” được vận dụng để giải những bài toán có tính lặp lại tuần tự theo biến đếm. Trong tình huống này chúng ta cần nêu ra những bài tập thông thường nhằm giúp học sinh nắm được cách áp dụng câu lệnh “For ... to” vào trong bài toán lập trình. Tình huống 2: Bài toán cần thực hiện lặp lại tuần tự nhưng không nhất thiết phải liên tục. Các bài toán trong tình huống này sẽ giúp học sinh nắm bắt được cách thức hoạt động của câu lệnh trong bài toán, đồng thời biết cách làm giảm số lần lặp lại lặp lại không cần thiết nhằm tối ưu mã lệnh. Tình huống 3: Bài toán thực hiện lặp lại nhưng có nhiều hơn 1 điều kiện kết thúc lặp. Bài toán trong tình huống này sẽ giúp người học rèn luyện được cách xác định được những thời điểm kết thúc của vòng lặp nhằm tránh rơi vào tình trạng lặp vô hạn và tối ưu mã lệnh. Ví dụ vận dụng Hệ thống bài tập cho tình huống 1: Bài 1: Tính giá trị biểu thức sau: S = 1 + 2 + ... + 100 Mã lệnh thực hiện: program tinhtong; uses crt; var i,S:integer; begin clrscr; S:=0; for i:=1 to n do S:=S+i; writeln('Tong S = :',S); readln; end. Nhận xét: Sử dụng biến đếm của vòng lặp để cộng dồn sau mỗi lần lặp. Bài 2: Tìm ước của 1 số tư nhiên Mã lệnh thực hiện: program timuoc; uses crt; var i,n:integer; begin clrscr; write(‘nhap so tu nhien n = ’); readln(n); write(‘cac uoc cua so n la: ’); for i:=1 to n div 2 do if n mod i = 0 then write(i,’ ; ‘); readln; end. Nhận xét: Ước của n thì sẽ nhỏ hơn hoặc bằng n:2. Dùng biến đếm của vòng lặp để kiểm tra các số từ 1 đến n:2 Bài 3: Tính n! Mã lệnh thực hiện Program TinhGiaiThua; Uses Crt; Var i,n,GT:integer; Begin Clrscr; Write('Nhap n:'); Readln(n); GT:=1; For i:=1 to n do GT:=GT*i; Writeln(n,'!=',GT); Readln; End. Nhận xét: Sử dụng biến đếm của vòng lặp để nhân dồn sau mỗi lần lặp. Bài 4: Nhập vào dãy số nguyên gồm 10 phần tử; Sắp xếp phần tử theo giá trị tăng dần; Tìm phần tử có giá trị lớn nhất; Tìm các số hoàn hảo có trong dãy; Mã lệnh thực hiện Program Sapxep_TimGTLN; User crt; Var a:array[1..10] of integer; Begin Writeln(‘Nhap mang so nguyen’); For i:= 1 to 10 do readln(a[i]); {i đóng vai trò là thứ tự của phần tử trong dãy} For i:=1 to 9 do {Lấy số thứ i so sánh với lần lượt các số thứ j sau đó} For j:=1+1 to 10 do If a[i]>a[j] then {nếu giá trị giảm thì đổi vị trí cho nhau} Begin Tam:=a[i]; a[i]:=a[j]; a[j]:=a[i]; End; Max:=a[1]; {giả sử số lớn nhất là số thứ nhất} For i:=2 to 10 do {Kiểm tra các số tiếp theo, nếu số nào lớn hơn số lớn nhất trước đó thì số đó là số lớn nhất} If a[i]>Max then Max:=a[i]; Writeln(‘So lon nhat trong day: ‘); For i:=1 to 10 do {Kiểm tra các số theo thứ tự} Begin Tam:=0; For j:=1 to a[i] div 2 do {Tìm tổng các ước của a[i] và so sánh với a[i]} If a[i] mod j =0 then tam:=tam+j; If tam = a[i] then write(‘a[i],’ ; ’); End; End. Hệ thống bài tập cho tình huống 2: Bài 5: Viết chương trình nhập vào số tự nhiên n>1 và tính tổng các số chia hết cho 3 nhỏ hơn n. Write(‘Nhap vao so tu nhien lon hon 10: ’); readln(n); S:=0; For i:=1 to n-3 do Begin i:=i+2; s:=s+i end; writeln(‘Tong cac so chia het cho 3 nho hon ’,n,‘ bang ‘,s:3); readln; Nhận xét: Xác định rõ biến đếm bắt đầu là 1; số cần tính bắt đầu là 3; Khoảng cách 2 số gần nhất là 2 đơn vị Bài 6: Viết chương trình nhập 1 day số từ bàn phím theo thứ tự: các phần tử thứ chẵn nhập trước rồi quay lại nhập các phần tử thứ lẻ. Cost n=10; Var a:array[1..n] of integer; i:integer; Writeln(‘Hay nhap cac phan tu thu chan cho day: ’); For i:=2 to n-1 do {bắt đầu từ thứ tự chẵn nhỏ nhất} Begin Readln(a[i]); i:=i+1; {Bỏ qua số thứ tự lẻ} end; Writeln(‘Hay nhap cac phan tu thu chan cho day: ’); For i:=1 to n-1 do {bắt đầu từ thứ tự lẻ nhỏ nhất} Begin Readln(a[i]); i:=i+1; {Bỏ qua số thứ tự chẵn} end; Hệ thống bài tập cho tình huống 3: Bài 7: Tìm UCLN của 2 số tự nhiên nhập từ bàn phím Đoạn mã xử lí: Write(‘Hay nhap vao 2 so tu nhien a >1 va b >1’);readln(a,b); UCLN:=1; {UCLN nhỏ nhất là 1} t:=a+b; {Lấy số lần lặp tối đa} For i:=1 to t do {sử dụng thuật toán euclid} If a>b then a:=a-b else if a<b then b:=b-a else Begin UCLN:=a; Writeln(‘UCLN cua 2 so da nhap la: ’,UCLN); i:=t; {dừng vòng lặp khi đã tìm thấy UCLN} end; Readln; Bài 8: Tìm BCNN của 2 số tự nhiên nhập từ bàn phím Write(‘Hay nhap vao 2 so tu nhien a >1 va b >1’);readln(a,b); BCNN:=a*b; {BCNN có giá trị lớn nhất là tích 2 số đó} For i:=1 to a*b do {dò tăng dần tất cả các giá trị nhỏ hơn hoặc bằng BCNN trên} If (i mod a =0)and(i mod b = 0) then {giá trị đầu tiên tìm được sẽ là BCNN} Begin BCNN:=i; Writeln(‘BCNN cua 2 so da nhap la: ’,BCNN); i:=a*b; {nhảy giá trị biến đếm để thoát ra} End; Readln; Bài 9: Kiểm tra số tự nhiên nhập từ bàn phím có phải là số chính phương Write(‘Hay nhap vao so tu nhien a >1: ’);readln(a); Kt:=false; {giả sử ban đầu khong là số chính phương} For i:=1 to a div 2 do {kiểm tra các số < a/2 có thỏa mãn } If i*i=a then Begin Write(a, ‘ la so chinh phuong’); Kt:=true; {thay đổi biến kt là đúng} i:=a div 2; {nhảy giá trị biến đếm để dừng vòng lặp} End; If kt then writeln(a,‘ khong phai la so chinh phuong’); {kt là sai thì khẳng định là không phải số chính phương} Readln; Bài 10: Dãy số tự nhiên a1, a2, a3... ak được gọi là hạnh phúc nếu nó thoả mãn các điều kiện sau : - Dãy trên là một dãy giảm dần. - Với mọi i (1<=i <= k) ai hoặc là số nguyên tố, hoặc phải là ước của một trong các số a1, a2, ... ai-1 VD: 18 17 13 11 9 7 6 5 3 2 là dãy hạnh phúc Viết chương trình nhập 1 dãy số tư nhiên và kiểm tra dãy trên có phải là dãy số hạnh phúc hay không? Kt:=true; {giả sử dãy đã nhập là dãy số HP} For i:=1 to n-1 do {kiểm tra tiêu chí: dãy giảm dần để khẳng định lại} If a[i]<a[i+1] kt:=false; If kt:=true then {nếu dãy là giảm thì kiểm tra tiếp} Begin For i:=1 to n do {kiểm tra lần lượt các giá trị trong dãy 2 đk còn lại} begin {kiểm tra có là số nguyên tố} For j:=2 to a[i]div 2 do if a[i] mod j =0 then Begin kt:=false; {không phải số nguyên tố} j:=a[i]; {nhảy giá trị đếm thoát vòng lặp} End; {nếu không phải số nguyên tố thì kiểm tra có là ước của số trước đó} If kt:=false then For k:=1 to i-1 if a[k] mod a[i]=0 then Begin kt:=true; {nếu là ước} k:=i-1; {thì nhảy biến đếm} end; end; End; If kt:= true then writeln(‘Day so da nhap o tren la day so hanh phuc!’) Else writeln(‘Day so da nhap o tren khong phai la day so hanh phuc!’); Readln; Kết luận Ở trên là hệ thống một số bài tập minh họa cho ý tưởng của tôi nhằm khắc sâu kiến thức câu lệnh “For ... to” và tăng khả năng tư duy linh hoạt khi sử dụng một câu lệnh vào trong lập trình. Các bài tập nêu trên mới chỉ dừng lại ở kiến thức của học sinh khối 7 – 8 bậc THCS và tùy theo năng lực của học sinh mà giáo viên sử dụng những bài tập khác phù hợp hơn. Tuy nhiên, Cũng vì thời gian có hạn, kinh nghiệm còn chưa nhiều nên bài viết của tôi còn có một số hạn chế: Các bài tập ở trên vẫn có thể giải bằng các loại câu lệnh khác mà không được giới thiệu. Hệ thống bài tập còn khá đơn giản. Bài tập vận dụng chưa đa dạng. Để có thể khắc phục được những nhược điểm trên, tôi cũng hiểu rằng, bản thân cần phải dành nhiều thời gian hơn nữa để nghiên cứu, tìm và học từ các nguồn tài liệu khác đề dần nâng cao năng lực, trình độ bản thân và đạt kết quả tốt hơn trong công tác. Và tôi cũng mong ban lãnh đạo cùng đồng nghiệp có thể góp ý cho tôi về đề tài này để có thể nâng cao khả năng ứng dụng của đề tài.
File đính kèm:
- de_tai_van_dung_va_khai_thac_cau_lenh_lap_for_to.doc