Lý do chọn đề tài Trong chương trình Tin học bậc THPT, các em lớp 11 được tìm hiểu với ngôn ngữ lập trình NNLT để trang bị cho các em những kiến thức, kỹ năng cơ bản về lập trình, biết v
Trang 1MỤC LỤC
Trang
1 MỞ ĐẦU 2
1.1 Lý do chọn đề tài 2
1.2 Mục đích nghiên cứu: 2
1.3 Đối tượng và phạm vi áp dụng: 2
1.4 Phương pháp nghiên cứu: 2
2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 3
2.1 Cơ sở lý luận: 3
2.2 Thực trạng của vấn đề 3
2.3 Nội dung của giải pháp 3
2.3.1 Tìm hiểu về thuật toán của bài toán 3
2.3.1.2 Thuật toán 4
2.3.2 Cách thức viết chương trình đối với các dạng thuật toán 5
2.3.3.1 Thuật toán không phân nhánh 5
2.3.3.2 Thuật toán có phân nhánh 7
2.2.3.3 Thuật toán theo chu trình có bước lặp xác định 9
2.3.3.4 Thuật toán theo chu trình có bước lặp không xác định 10
2.4 Hiệu quả của giải pháp 13
2.4.1 Kết quả định tính 13
2.4.2 Kết quả định lượng 13
3 KẾT LUẬN 14
3.1 Kết luận 14
3.2 Kiến nghị 14
Trang 21 MỞ ĐẦU
1.1 Lý do chọn đề tài
Trong chương trình Tin học bậc THPT, các em lớp 11 được tìm hiểu với ngôn ngữ lập trình (NNLT) để trang bị cho các em những kiến thức, kỹ năng cơ bản về lập trình, biết vận dụng chúng để giải một số bài tập cơ bản hình thành những loại hình tư duy như tư duy thuật giải, tư duy điều khiển
Tuy nhiên, môn học có những khái niệm trừu tượng nên các em gặp nhiều khó khăn trong quá trình tiếp thu bài Bởi khi học phần lập trình đòi hỏi học sinh phải tư duy, mà khó khăn nhất đối với các em là bước “Lựa chọn và thiết kế thuật toán”
Khi nắm vững cách lựa chọn và thiết kế thuật toán, học sinh sẽ dễ dàng viết chương trình để giải bài toán trên máy tính bằng bất kỳ ngôn ngữ bậc cao nào
Từ đó, các em có hứng thú với bộ môn Tin học hơn
Hơn nữa, việc lựa chọn và thiết kế thuật toán để giải bài toán trên máy tính giúp rèn luyện cho học sinh khả năng tư duy, sáng tạo, biết phân tích và giải quyết tình huống Đây là những kỹ năng cần thiết để sau này các em hoà nhập vào thực tế cuộc sống
Xuất phát từ thực tiễn giảng dạy tại trường THPT Quan Hóa , nhằm giúp học sinh bước đầu hiểu rõ và tiếp cận với thuật toán giải bài toán để việc lập
trình đạt kết quả tốt hơn, tôi lựa chọn đề tài “ Xây dựng một số thuật toán cơ
bản nhằm cải thiện kĩ năng lập trình tin học 11 cho học sinh ở một trường miền núi”.
1.2 Mục đích nghiên cứu:
Giúp học sinh hiểu được thuật toán của các bài toán cơ bản Từ đó, các em
có thể hình thành tư duy lập trình cho các bài toán khác
1.3 Đối tượng và phạm vi áp dụng:
+ Đối tượng nghiên cứu:
Học sinh khối 11 ở các lớp trường THPT Quan Hoá, bộ môn Tin học để rèn luyện kỹ năng tư duy thuật toán từ đó nâng cao hiệu quả lập trình
+ Phạm vi nghiên cứu:
- Bài 3: Bài toán và thuật toán 10
- Bài tập chương II, III trong sách giáo khoa (SGK) Tin học 11
+ Nhiệm vụ của đề tài:
- Đảm bảo được tính chính xác của thuật toán trong các bài toán đưa ra
- Cách thức lựa chọn, diễn tả thuật toán, viết chương trình cho bài toán
1.4 Phương pháp nghiên cứu:
- Phương pháp nghiên cứu lí thuyết: Nghiên cứu tài liệu và các công trình
nghiên cứu đổi mới PPDH theo hướng tích cực hóa việc học của học sinh
- Phương pháp thực tập sư phạm: Thực nghiệm sư phạm ở trường THPT Quan Hóa, tiến hành theo quy trình của đề tài nghiên cứu khoa học giáo dục để đánh giá hiệu quả của đề tài nghiên cứu
- Phương pháp thống kê toán học: thống kê, đánh giá kết quả thu được.
Trang 32 NỘI DUNG SÁNG KIẾN KINH NGHIỆM
2.1 Cơ sở lý luận:
* Lịch sử nghiên cứu vấn đề:
- Khi các em đã xây dựng được thuật toán thì có thể sử dụng bất kỳ một ngôn ngữ bậc cao nào cũng sẽ viết được chương trình trên cơ sở đảm bảo tính tối ưu
* Cơ sở khoa học của giải pháp:
Là một người giáo viên giảng dạy bộ môn Tin học, tôi nhận thức được nhiệm vụ cơ bản của mình:
- Cung cấp cho học sinh kiến thức phổ thông cơ bản có hệ thống và toàn diện về môn Tin học
- Rèn luyện cho học sinh những kỹ năng chủ yếu sau:
+ Giải được một số bài toán đơn giản trên máy tính bằng cách vận dụng các kiến thức của thuật toán
+ Tư duy thuật toán, từ đó rèn luyện tư duy logic
+ Củng cố kiến thức các môn học như Toán, Lý
2.2 Thực trạng của vấn đề.
* Thuận lợi:
- Toàn ngành, toàn xã hội đang đề cao việc ứng dụng công nghệ thông tin vào tất cả các lĩnh vực ảnh hưởng tích cực theo đó các em học sinh có hứng thú hơn
- Môn Tin học là môn chính khoá trong trường phổ thông
- Các em học sinh thích được thực hành trên máy tính để nghiên cứu tìm tòi
* Khó khăn:
- Máy vi tính và các thiết bị hỗ trợ còn hạn chế ngoài thời gian thực hành tại trường đa phần các em chỉ học qua sách
- Phần lập trình hoàn toàn xa lạ với học sinh
- Chất lượng học sinh ở trường còn thấp không đồng đều ở các lớp
- Học sinh lớp 11 vẫn còn gặp khó khăn với đa phần học sinh của nhà trường trong việc xác định thuật toán để lập trình cho bài toán.do đó khi viết chương trình, sản phẩm thu được chưa đảm bảo tính tối ưu
2.3 Nội dung của giải pháp
2.3.1 Tìm hiểu về thuật toán của bài toán
2.3.1.1 Khái niệm bài toán
a Bài toán
Trong tin học, người ta quan niệm bài toán là một việc nào đó ta muốn máy tính thực hiện Những việc như đưa một dòng chữ ra màn hình, giải phương trình bậc hai, quản lý cán bộ của một cơ quan là những ví dụ về bài toán
Khi dùng máy tính giải toán, ta cần quan tâm đến hai yếu tố: Đưa vào máy thông tin gì (Input) và lấy ra thông tin gì (Output) Do đó để phát biểu một bài
Trang 4toán, ta cần phải trình bày rõ Input và Output của bài toán và mối quan hệ giữa Input và Output
b Các bước để giải bài toán trên máy tính
Bước 1: Xác định bài toán: Xác định Input/Output và mối liên hệ giữa chúng
Bước 2: Lựa chọn hoặc xây dựng thuật toán: Thiết kế hoặc lựa chọn thuật toán đã có đề giải bài toán
Bước 3: Viết chương trình: Lựa chọn cách tổ chức dữ liệu và sử dụng NNLT để diễn tả đúng thuật toán
Bước 4: Hiệu chỉnh
Bước 5: Viết tài liệu
c Cấu trúc của chương trình sử dụng ngôn ngữ lập trình Pascal
Bao gồm 2 phần: [ <Phần khai báo>]
<Phần thân>
* Phần khai báo:
- Khai báo tên chương trình program <tên chương trình>;
- Khai báo thư viện Uses crt;
- Khai báo hằng const <tên hằng> = <giá trị>;
- Khai báo biến var <danh sách biến>: <kiểu dữ liệu>;
* Phần thân:
Begin
[<Dãy lệnh>];
End.
2.3.1.2 Thuật toán
* Khái niệm: Thuật toán để giải một bài toán là một dãy hữu hạn các thao
tác được sắp xếp theo một trình tự xác định sao cho sau khi thực hiện dãy thao tác ấy, từ Input của bài toán, ta nhận được Output cần tìm
* Tính chất của thuật toán
+ Tính tổng quát: thuật toán không chỉ đề cập một bài toán riêng lẻ mà bao
hàm một lớp bài toán cùng kiểu
+ Tính dừng: Thuật toán phải kết thúc sau một số hữu hạn lần thực hiện các thao tác
+ Tính xác định: Sau khi thực hiện một thao tác thì hoặc là thuật toán kết thúc hoặc là có đúng một thao tác xác định để được thực hiện tiếp theo
+ Tính đúng đắn: sau khi thuật toán kết thúc ta phải nhận được Output cần tìm
* Thuật toán có thể phân loại như sau:
- Thuật toán không phân nhánh
- Thuật toán có phân nhánh
- Thuật toán theo chu trình có bước lặp xác định và có bước lặp không xác định
* Có 2 cách thể hiện thuật toán:
+ Liệt kê: Thể hiện thuật toán thông qua các bước.
+ Sơ đồ khối: Sử dụng các kí hiệu để thể hiện
Trang 5Các kí hiệu để diễn tả thuật toán bằng sơ đồ khối.
Quy định trình tự thực hiện các phép toán
Thể hiện các thao tác nhập, xuất dữ liệu
Thể hiện thao tác so sánh
* Lưu ý:
- Với hình ô van thì chỉ có một hướng mũi tên đi ra cho trường hợp thao tác nhập dữ liệu và chỉ có một hướng đi vào cho thao tác xuất dữ liệu
- Với hình chữ nhật thì có một hướng mũi tên vào và một hướng mũi tên ra
- Với hình thoi thì có một hướng mũi tên vào và hai hướng mũi tên ra
2.3.2 Cách thức viết chương trình đối với các dạng thuật toán
* Thuật toán không phân nhánh: đây là dạng thuật toán đơn giản, sau khi học sinh xác định bài toán, vận dụng các kiến thức liên quan, sử dụng một số hàm học chuẩn đã học để giải quyết bài toán
* Thuật toán có phân nhánh: sử dụng câu lệnh if then để viết chương trình
Cấu trúc của câu lệnh rẽ nhánh if then:
+ Dạng thiếu: if <điều kiện> then <câu lệnh>;
+ Dạng đủ: if <điều kiện> then <câu lệnh 1> else<câu lệnh 2>;
* Thuật toán theo chu trình có bước lặp xác định và có bước lặp không xác định
- Thuật toán theo chu trình có bước lặp xác định:
Cấu trúc câu lệnh lặp For-do:
+ Dạng lặp tiến: for <biến đếm>:= <giá trị đầu> to <giá trị cuối> do
<câu lệnh>;
+ Dạng lặp lùi: for <biến đếm>:=<giá trị cuối> downto <giá trị đầu>
do <câu lệnh>;
Kết hợp với câu lệnh if then để giải quyết bài toán
- Thuật toán theo chu trình có bước lặp không xác định
Cấu trúc câu lệnh lặp While-do:
+ While <điều kiên> do <câu lệnh>;
2.3.3 Một số dạng toán
2.3.3.1 Thuật toán không phân nhánh
Bài toán:
Nhập từ bàn phím độ dài 3 cạnh của tam giác ABC, rồi tính chu vi, diện tích và các đường cao của tam giác
* Xác định bài toán:
Trang 6- Input: độ dài 3 cạnh a,b,c
- Output: chuvi, dientich, các đường cao ha, hb, hc
* Thuật toán:
Bước 1: nhập độ dài 3 cạnh a,b,c;
Bước 2:
P(a+b+c)/2;
s p(p-a)(p-b)(p-c);
ha2a s ; , hb 2b s ; hc2c s ;
Bước 3: Đưa ra màn hình chuvi p, dientich s, các đường cao ha, hb, hc
* Chương trình:
Program tinhdt_cv_duongcao;
Var a,b,c,p,s, h1, h2, h3: real;
Begin
Writeln (‘ nhap do dai 3 canh:’);
Readln (a,b,c);
P:=(a+b+c)/2;
S:=sqrt(p*(p-a)*(p-b)*(p-c));
h1:=2*s/a; ; h2:= 2*s/b; h3:=2*s/c;
Writeln(‘chu vi dien tich chieu cao’, p:5:2,s:5:2,h1:5:2,h2:5:2,h3:5:2); Readln
End.
Bài tập áp dụng:
Bài 1: Nhập từ bàn phím toạ độ 3 điểm A,B,C Tính tích vô hướng của hai
vectơ AB và AC
Hướng dẫn:
- Input: Toạ độ 3 điểm A, B và C;
- Output: Tích vô hướng AB AC ;
- Sử dụng các công thức: AB=(x -x ;y -y ) B A B A
; AC=(x -x ;y -y ) C A C A ;
Tích vô hướng: AB.AC=(x -x ).(x -x )+(y -y ).(y -y ) B A C A B A C A
;
Bài 2:
Nhập từ bàn phím toạ độ 3 điểm A,B,C Tính độ dài các đoạn thẳng AB,
AC và BC
Hướng dẫn:
- Input: Toạ độ 3 điểm A, B và C;
- Output: Độ dài các đoạn thẳng AB,AC và BC
AB = (x -x ) +(y -y )
;
Từ các bài tập trên giáo viên hướng dẫn học làm các bài tập trong SGK chương
Bài tâp 9 SGK_tr36:
* Xác định bài toán:
- Input: cạnh a (a>0)
a
x
y
Trang 7- Output: Diện tích gạch chéo
* Thuật toán:
Sơ đồ khối
* Ch ương trình
Program Dtgachcheo;
Const pi=3.14;
Var a,s:real;
Begin
Writeln(‘nhap canh a:’);
Readln(a);
S:=pi*sqr(a);
Writeln (‘ dien tich phan gach cheo la:’,s:8:4);
Readln;
End
Bài tập 10 SGK_tr36: Tính và đưa ra màn hình vận tốc v khi chạm đất của một
vật rơi từ độ cao h biết rằng v= 2gh trong đó g =9.8m/s2, độ cao h nhập từ bàn phím
*Xác định bài toán:
+ Input: h
+ Output: v
* Thuật toán
Bước 1: Nhập h
Bước 2: v sqrt(2*9.8*h)
Bước 3: thông báo v và kết thúc
Sơ đồ khối
Chương trình
Program tinhvantoc;
const g=9.8;
var v,h:real;
Begin writeln( ‘nhao do cao h:’);
readln(h);
v:=sqrt(2*g*h);
writeln(‘van toc la:’,v:6:3);
readln;
End
2.3.3.2 Thuật toán có phân nhánh
Sơ đồ:
Dạng thiếu
Sai
Đúng Điều
kiện Câu lệnh
Nhập a
s pi*sqr(a)/2
Thông báo s rồi kết thúc
Nhập h
v
Thông báo v rồi kết thúc
Trang 8Dạng đủ
Chú ý:
- Ta có thể sử dụng cấu trúc rẽ nhánh lồng nhau
VD: Viết chương trình giải phương trình bậc hai ax2+bx+c=0
* Xác định bài toán
- Input: a,b,c (a<>0)
- Output: Nghiệm x thoả phương trình ax2+bx+c=0
Liệt kê: Bước 1: Nhập a,b,c (a<>0);
Bước 2: Tính Db*b-4*a*c;
Bước 3: Nếu D<0 thì PTVN rồi kết thúc;
Bước 4: Nếu D>0 thì PT có nghiệm x1(-b+sqrt(D))/(2*a)
X2(-b-sqrt(D))/(2*a) rồi kết thúc;
Bước 5: Nếu D= 0 thì PT có nghiệm kép x-b/(2*a) rồi kết thúc;
Bước 6: Kết thúc.
Sơ đồ khối
S
Đ S
Đ
Nhập a,b,c (a<>0)
Db*b- 4*a*c
D<0 Thông báo PT vô
nghiệm rồi
kết thúc
D=0
Thông báo PT
có nghiệm kép
x rồi kết thúc
x-b/
(2*a)
X1(-b+sqrt(D))/(2*a)
X2(-b-sqrt(D))/(2*a)
Thông báo PT
có 2 nghiệm x 1
và x 2 rồi kết thúc
Sai Điều Đúng
1 Câu lệnh
2
Trang 9Chương trình:
Uses Crt;
Var a , b, c : real;
d, x1, x2 : real;
Begin
Clrscr;
Write (‘a, b, c: ’);
Readln (a, b, c) ;
D: = b * b – 4 * a * c ;
if D < 0 then Writeln (‘Phuong trinh vo nghiem’)
Else
Begin x1 = ( - b – sqrt (D))/(2 * a); x1 = ( - b + sqrt (D))/(2 * a); Witeln ( ‘x1 =’, x1 : 8:3 , ‘x2 = ’ , x2 : 8:3);
End;
Readln
End
Bài tập áp dụng:
Bài 1: Nhập dữ liệu là tháng trong năm
Hướng dẫn
- Tháng trong năm phải từ 1 đến 12
- Nếu thoả mãn thì thông báo là tháng, ngược lại thì thông báo không phải
là tháng trong năm
Bài 2: Nhập vào một năm cho ra số ngày của năm đó
Hướng dẫn
- Kết quả là 365 ngày hoặc 366 ngày
- Năm nhuận là 366 ngày, không nhuận là 365 ngày
- Năm nhuận là năm chia hết cho 400 hoặc chia hết cho 4 nhưng không chia hết cho 100
Bài 3: Giải bất phương trình ax+b> 0
Hướng dẫn
- Sử dụng thuật toán như các bài đã gặp
Hướng dẫn
- Sử dụng If lồng nhau
2.2.3.3 Thuật toán theo chu trình có bước lặp xác định.
Sơ đồ:
Bài toán: Tính giai thừa của một số nguyên dương n (n!=1.2 (n-1).n) Xác định bài toán + Input: Số nguyên dương n;
+ Output: Giai thừa của n (GT)
Sai Đúng
Điều kiện
Câu lệnh
Trang 10Sơ đồ khối
Chương trình:
Program tinhgiaithua
Var i,n,gt: integer;
Begin
Writeln(‘ nhap n:’);
Readln(n);
For :=1 to n do gt:=gt*i;
Writeln(‘giai thua cua n la:’,gt);
Readln
End
Bài tập áp dụng:
Bài 1: Tính tổng
S= 1 + 2 + 3 + ……… + n
với n nhập từ bàn phím
Bài 2: Tính tổng
với n nhập từ bàn phím
Giáo viên yêu cầu học sinh áp dụng làm các bài tâp trong SGK
Bài tập 5a SGK_ tr51: Lập trình tính Y=
50
n
n n
Thuật toán
Liệt kê:
Bước 1: i1; s0;
Bước 2: Nếu i>50 thì sang bước 4;
Bước 3:
ss+i/(i+1);
ii+1;
quay lại bước 2;
Bước 4: Thông báo s và kết thúc
Bài tập 6/SGK tr51: tương tự
2.3.3.4 Thuật toán theo chu trình có bước lặp không xác định.
Sơ đồ:
Đ
S
Nhập n
GT1
i1
GTGT*i
ii+1
i n
Thông báo GT rồi kết thúc
Sai
Đúng
Điều kiện
Câu lệnh
Trang 11Bài toán: Tìm ước số chung lớn nhất của hai số nguyên dương a và b
* Xác định bài toán
+ Input: Số nguyên dương a,b;
+ Output: UCLN(a,b)
Thuật toán:
Bước 1: Nhập a,b;
Bước 2: Nếu a=b thì lấy giá trị chung này làm UCLN rồi kết thúc;
Bước 3: Nếu a>b thì aa – b rồi quay lại bước 2;
Bước 4: bb – a rồi quay lại bước 2;
Bước 5: Đưa ra kết quả UCLN rồ kết thúc
Chương trình;
Program UCLN;
Var a,b,ucln:integer;
Begin
Writeln(‘nhap a,b’);
Readln(a,b);
While a<>b do
If a>b then a:=a-b else b:= b-a;
If a=b then ucln:=a;
Writeln(‘ uoc chung lon nhat la: ‘, ucln);
Readln;
End
Bài tập áp dụng:
Bài tập 7 SGK/tr51 :
Nhập từ bàn phím tuổi của cha và con (hiện tại tuổi cha lớn hơn hai lần tuổi con và tuổi cha hơn tuổi con ít nhất là 25 ) Đưa ra màn hình câu trả lời cho câu hỏi “Bao nhiêu năm nữa thì tuổi cha gấp đôi tuổi con ?
*Xác định bài toán :
Input: nhập tuổi cha, tuổi con;
Output: số năm tuổi cha gấp đôi tuổi con
* Thuật toán:
Bước 1: nhập tuoicha, tuoicon (điều kiện tuoicha >2*tuoicon và tuoicha-tuoicon>=25)
Bước 2: nam0;
Bước 3: nếu tuoicha= 2*tuoicon thì đến bước 5;
Bước 4: tuoichatuoicha+1;
tuoicontuoicon + 1;
namnam+1;
Bước 5: thông báo số năm và kết thúc
*Chương trình
Var Tuoicha, tuoicon, nam : word;
Begin
Writeln (‘ nhap tuoi cha va con’);
Đ
S
bb-a
ĐƯA KQ UCLN(a,b )=a KẾT THÚC
Nhập a,b
a=b
aa-b a>b
Đ
S