Tải bản đầy đủ (.doc) (12 trang)

detai thuat toan

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (124.49 KB, 12 trang )

I. Mở đầu
1. Lý do chọn đề tài
Dạy học là một hoạt động đặc trưng của loài người nhằm truyền
lại cho thế hệ sau những kinh nghiệm xã hội mà loài người tích luỹ được
biến chóng thành vốn liếng, kinh nghiệm và phẩm chất năng lực của cá nhân
người học.
Để tiếp thu được tri thức, kỹ năng, kinh nghiệm nhằm sử dụng
chúng trong hoạt động thực tiễn, người họ cần thông qua hoạt động tích cực
của bản thân, tham gia vào quá trình tái tạo lại chúng, chiếm lĩnh chúng.
Cũng như những môn học khác, việc dạy học Tin học cần được thực hiện
trong hoạt động và bằng hoạt động tự giác, tích cực, chủ động sáng tạo của
người học.
Đặc thù môn Tin học ra đời sau các môn học khác và được xây
dựng trên các khái niệm trừu tượng và tổng quát hoá từ những bài toán cụ
thể để giải cả lớp bài toán. Do đó việc liên hệ thưc tiễn và bắt đầu từ những
bài toán dễ, quen thuộc trong Toán học, Vật lý để học sinh có lời giải bài
toán cụ thể từ đó hình thành khái niệm thuật toán và chương trình giải bài
toán đó trong Tin học thông qua ngôn ngữ lập trình cụ thể.
2.Đối tượng:
Tin học 10,11
3.Phương pháp:
Tình huống có vấn đề, giao tiếp và dạy học trong hoạt động và
bằng hoạt động khi dạy phần thuật toán và lập trình Pascal.
1
II.nội dung
A.một số khái niệm
1.Bài toán:
Trong Toán học:Bài toán là từ một giả thiết nào đó tìm cách chứng minh
có kết luận đưa ra không ?
Trong Tin học :Bài toán là việc nào đó ta muốn máy tính thực hiện.
Hay nói cách khác từ input của bài toán (thông tin đã có ) đưa vào máy tính


thực hiện ta được output (các thông tin cần tìm)
2.Thuật toán
Trong Toán học : Thuật toán được hiểu là các bước giải bài toán
Trong Tin học : Là 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 các thao tác đó, từ input của bài toán
này ta thu được output cần tìm.
Để biểu diễn thuật toán có hai cách hoặc là sơ đồ khối hoặc là tuàn tự các
bước.
Với cách sö dụng sơ đồ khối ta có các quy ước sau:
Các kí hiệu Ý nghĩa
Hình thoi
Hình chữ nhật
Hình ô van
Các mũi tên
Khối điều kiện
Khối thao tác
Khối nhập xuất DL
Quy trình, trình tự thực hiện các thao tác
3.Ngôn ngữ lập trình:
Diễn tả thuật toán bằng một ngôn ngữ mà máy tính có thể thực hiện
được, ngôn ngữ đó được gọi là ngôn ngữ lập trình.
Trong phạm vi THPT ta sử dụng ngôn ngữ lập trình Pascal để lập trình.
2
b.Một số thuật toán phù hợp Bậc thpt
Bài1: Một số bài toán toán học đơn giản
Cỏc dạng bài toỏn thuật toỏn và chương trỡnh
Dạng 1: Tính
A= x
2
+ y

2
B=x+y + A
C=xy + A – B
2
Nhận xét bài toán trên và nêu
cách giải trong toán học ?
Ngoài ra có thể diễn tả thuật toán
bằng sơ đồ khối:
Dạng 2: Giải
ax + b =0 (1)
ax
2
+ bx + c=0 (2)
Nhận xét các bài toán trên và nêu
cách giải trong toán học ?
1.í tưởng:
Nhập vào giá tị của x, y tính được A= x
2
+ y
2
, sau
đó tính được
B=x+y + A
rồi tính được C=xy + A – B
2.Thuật toán:
B1:Nhập x
B2: A= x
2
+ y
2

,thông báo giá trị A
B3: B=x+y + A, thông báo giá trị B
B4: C=xy + A – B
2
, thông báo giá trị C, kết thúc.
3.chương trình
Var A,B,C,x:real;
Begin
Write(‘nhap vao gia tri x:’);
Readln(x);
A:= x*x + y*y;
writel(‘gia tri A=’,A);
B:=x+y + A;
writel(‘gia tri B=’,B);
C:=x*y + A – B*B;
writel(‘gia tri C=’,C);
readn
End.
1. ý tưởng:
(1) là bài toán giải à biện luận pt bậc nhất
(2) là giải và biện luận pt bậc hai, ta thấy khi
a=0 thì (2) trở thành bài toán (1)
3
Nhập x, y
A<-x
2
+y
2
B<- x+y+A
C<- xy+A - B

In A, B, C
Bài tập: diễn tả thuật toán này
bằng sơ đồ khối
2.Thuật toán:
B1:Nhập a,c,b
B2:nếu a=0,
1.1 nếu b=0,
2.1.1: nếu c=0, pt vssn, sang B7
2.1.2: pt vn, sang B7
2.2 pt có n x=-b/a, sang B7
B3: d=b
2
-4ac;
B4: nếu d<0, ptvn, sang B7
B5:nếu d=0 , pt có n kép x=-b/2a,
B6: x
1
=(-b-
acb 4
2

)/2a, x
2
=(-b+
acb 4
2

)/2a
B7: Đưa ra nghiệm, kết thúc
3.Chương trình:

Var a,b,c,d:real;
Begin
Writeln(‘nhap vao he so pt a,b,c:’);
Readln(a,b,c);
If a=0 then
If b=0 then
If c=0 then
Write(‘ptvssn’)
Else Write(‘ptvn’)
Else Write(‘pt co n x=’,-b/c)
Else d:=b*b- 4*a*;
If d< 0 then Write(‘ptvn’)
Else
if d=0 then
Write(‘ptvssn’)
Else
Write(‘pt co n x
1=
’,(-b-sqrt(d))/
(2*a):3:4,
‘x
2
=', (-b+sqrt(d))/(2*a):2:4);
readln
End.
4
Dạng 3:
Giải hệ





=+
=+
222
111
cybxa
cybxa
Bài tập:
1. Trình bày thuật toán giải hệ
trên bằng 2 cách
2. Viết chương trình giải hệ
bằng ngôn ngữ lập trình
Pascal.
1.ý tưởng:
Với các hệ số bất kỳ ta biện luận qua định thức
D=a
1
*b
2
-a
2
*b
1
;
D
x
=b
1
*c

2
-b
2
*c
1
;
D
y
=c
1
*a
2
-c
2
*a
1
;
Nếu d=d
x
=d
y
=0 thì hệ có vssn
Nếu d=0 và hoặc d
x
≠0 hoặc d
y
≠0 thì hệ có vn
Nếu d≠0 thì hệ có nghiệm x=d
x
/d, y=d

y
/d
2.Thuật toán:
3.Chương trình:
Bài tập đề nghị
1.Lập chương trình tính diện tích của hình chữ nhật khi biết độ dài hai
cạnh bên.
2. Lập chương trình tính diện tích của hình thang khi biết độ dài hai cạnh
đáy đường cao
3.Lập trình tính biểu thức: p=
yx
yx
yx
yx
xy
x
+

+
+
+
+
22
2
,với x,y thực
4.Lập trình tính vận tốc khi chạm đất củavật rơi từ độ cao h, vật
rơi với gia tốc g=9,8m/s
2
5
Có rất nhiều bài toán mà bằng kiến thức THPT chưa thể giải

được bằng Toán học nhưng với Tin học thì có thể giải quyết một cách dễ
dàng. Hay một số bài toán rất Tin học. Sau khi học sinh đã nắm được
khái niệm thuật toán và viết chương trình từ các bài toán đơn giản quen
thuộc sẽ dễ dàng tiếp thu những bài toán Tin học mang tính chuyên
nghiệp về lập trình hơn.
Bài 2. Một số bài toán Tin học
Các dạng bài toán Thuật toán và chương trình
Dạng 1:
Bài toán cổ
Bài1.Trăm trâu trăm cỏ
Trâu đứng ăn ba
Trâu nằm ăn một
Lụ khụ trâu già ba con một

Tính số trâu mỗi loại?
Bài tập: diễn tả thuật toán này
bằng sơ đồ khối
1.ý tưởng:
Giải bài toán bằng phương pháp lập phương trình. Gọi x
là số trâu đứng,y là số trâu nằm, z là số trâu già
Ta có hệ





=++
=++
100
3

1
3
100
zyx
zyx
Cho x,y,z chạy từ 0 tới 100 nếu có cặp nào thoả mãn thì
đó là nghiệm
2.Thuật toán:
B1: x=0,y=0,z=0;
B2:x=x+1
B3:Nếu





=++
=++
100
3
1
3
100
zyx
zyx
thì
X,y,z,là số trâu cần tìm, kết thúc
B4:Nếu x<=100 quay lại B2
B5: y=y+1,quay lại B3
B6:Nếu y<=100,quay lại B5

B7: z=z+1, quay B3
B8:Nếu z<=100 thì quay lại B7
B9:Không có nghiệm thoả mãn, kết thúc.
3.Chương trình
Var x,y,z:byte;
Begin For x:= 1 to 100 do
For y:= 1 to 100 do
For z:= 1 to 100 do
If (x+y+z=100) and(3*x+y+z div 3=100)
then
Writeln(‘nghiem la:’);
write(‘x=’,x:3.’y=’,y:3,’z=’,z:3);
End.
6
Bài 2.Vừa gà vừa chó bó
lại cho tròn một trăm chân
chẵn. Tính số gà và số chó?
Hoàn toàn tương tự bài1
Bài tập:
Trình bày thuật toán bằng
một trong hai cách và hoàn
thành chương trình này
Dạng 2:
Chu trình lặp đơn bài toán
tính tổng
Với N, a nguyên, nhập vào từ
bàn phím
Bài 1.Tính và đưa ra màn hình
tổng
S=

100
1

2
1
.
1
11
+
++
+
+
+
+
aaaa
Bài tập: diễn tả thuật toán này
bằng sơ đồ khối
1.ý tưởng:
2.Thuật toán:
3.Chương trình
1.ý tưởng:
Xuất phát ta gán s =
a
1
, N=0, sau mỗi lần tăng N một đơn
vị ta cộng vào s một giá trị
Na +
1
Việc làm này lặp cho tới khi N=100
2.Thuật toán:

B1:nhập a
B2:s =1/a; n=0;
B3: N=N+1;
B4:Nếu n>100 thì đưa ra S, kết thúc
B5:S = S+1/(a+N); quay lại B3
3.Chương trình:
Var N,a:integer; S:real;
Begin
Write(‘nhap a:’);
Readln(a);
S:=1.0/a; N=0;
while n<= 100 do
begin
N:=N+1;
7
Bài 2: Tính và đưa ra màn
hình tổng
S =

1

2
1
.
1
11
+
+
++
+

+
+
+
Naaaa
Cho đến khi
Na +
1
<0,0001
Hoàn toàn tương tự bài1
Bài tập:
Trình bày thuật toán bằng
một trong hai cách và hoàn
thành chương trình này
Dạng 3:
một số bài toán tìm kiếm và
thay thế
Bài 1:
Tìm phần tử lớn nhất của dãy
N số nguyên.
Bài tập: Hãy trình bày thuật
toán bên bằng sơ đồ khối
S:=S+1.0/(a+N);
End;
Write(‘S=’,S:1:3)
readln
End.
1.ý tưởng
2.Thuật toán:
3.Chương trình:
*Lưu ý: điều kiện ở đây là:

Na +
1
<0,0001
1.ý tưởng:
Duyệt từ đầu đến hết dãy, ban đầu gán max cho phần tử
đầu tiên, kiểm tra các phần tử kế sau nó nếu lớn hơn thì
đổi max cho phần tử đó.
2.Thuật toán:
B1:Nhập N và dãy a
1
,a
2
, … a
N
B2:Max=a
1
, i=1;
B3:Nếu i>N thì đưa ra max, kết thúc
B4:
4.1 Nếu max<a
i
thì max=a
i
4.2i=i+1; quay lại B3;
3.Chương trình:
Const m=100;
Var a:aray[1 m] of integer;
8
Bài2:
Sắp xếp dãy số nguyên bằng

thuật toán tráo đổi.
Bài tập: Hãy trình bày thuật
toán bên bằng sơ đồ khối
I,n,max,csmax:integer;
Begin
Write(‘nhap so luong day:’);
Readln(n);
For i:=1 to n do
Begin writeln(‘a[’,i,’]’);
Readln(a[i]);
End;
Max:=a[1]; csmax:=1;
Forni:=2 to n do
If a[i]> max then
Begin
Max:=a[i];
Csmax:=i;
End.
Writeln(‘gia tri phan tu lon nhat:’,max:4,’ vi tri’,csmax);
Readln
End.
1.ý tưởng
Với mỗi cặp đngs liền nhau trong dãy số, nếu số trước lớn
hơn số sau ta đổi chổ cho nhau. Công việc này được lặp
cho tới khi không có sự đổi chổ nữa.
2.Thuật toán:
B1:Nhập N và dãy a
1
,a
2

, … a
N
B2:m=n;
B3:Nếu m<2 thì đưa ra dãy đã sắp xếp, kết thúc.
B4:m=m-1; i=0;
B5:i=i+1;
B6:Nếu i>m thì quay lại B3
B7:Nếu a
i
>a
i+1
thì đổi chổ a
i
cho a
i+1
cho nhau;
B8:quay lại B5
3.Chương trình:
Const m=100;
Var
a:aray[1 m] of integer;
I,j,n,m:integer;
Begin
Write(‘nhap so luong day:’);
9
Bài3: Tìm kiếm nhị phân
Cho dãy số sắp xếp tăng dần,
tìm trong dãy có số k không?
Bài tập: Hãy trình bày thuật
toán bên bằng sơ đồ khối

Readln(n);
For i:=1 to n do
Begin writeln(‘a[’,i,’]’);
Readln(a[i]);
End;
For i:=n downto 2 do
For j:=1 to i-1 do
If a[j]>a[i] then
Begin
A[j]:=tg;
A[j]:=a[i];
A[i]:=tg;
End;
Writen(‘dãy d xap xep’);
For i:=1 to n do write(a[i]);
Readln
End.
1.ý tưởng:
Ta chia đôi dãy rồi so sánh với khoá k, nếu a(giữa) =k thi
đó là giá trị cần tìm, còn nếu a(giữa)> k thì ta tìm dãy từ
đầu đến giữa ngược lại tìm từ vị trí giữa đến cuối.
2.Thuật toán:
B1:nhập N, dãy a
1
,a
2
,… a và khoá k;
B2:dau=1,cuoi=n;
B3:giua=
2

cuoidau +
;
B4:Nếu a
giua
=k thì thông báo chỉ số giưa kết thúc;
B5:Nếu a
giua
>k thì cuoi=giua – 1; sang B7;
B6: dau = giua +1;
B7:Nêu dau> cuoi thì thông báo dãy không có khoa k, kết
thúc.
B8:quay lại B3.
3.Chương trình:
Const m=100;
Var
a:aray[1 m] of integer;
k,I,n,dau,cuoi,giua:integer;
kt:boolean;
10
Begin
Write(‘nhap so luong day va khoa k’);
Readln(n,k);
For i:=1 to n do
Begin writeln(‘a[’,i,’]’);
Readln(a[i]);
End;
Dau:=1; cuoi:=n kt:=false;
While (dau<=cuoi) and not(kt) do
Begin
Giua:=(dau+cuoi) div 2;

If a[giua]=k then kt:=true
Else
If a[giua]>k then cuoi:=giua -1
Else dau:=giua+1;
End;
If kt then writeln(‘tim thay o vi tri’,giua)
Else writeln(‘khong tim thay’);
Readln
End.
Bài tập đề nghị:
1.lập trình tìm số k trong day chưa sắp xếp
2.Đếm các số âm, dương, chia hết cho 3 trong dãy số
3.Tìm phần tử lớn nhất trên đường chéo chính của ma trận cấp m,n
4.sắp xếp trong dãy n số thành hai phần, phần đầu là các số âm phần
sau là các số dương,phần sau được sắp xếp giảm dần hoặc tăng dần.
5.Tính p=
xxx +++
, với x là số thực và có n dấu căn.
6.Lập trình tính
Y=

=
+
100
1
1
n
n
n
7.tính N!, áp dụng lập trình tính

S= 1+
!
1

!3
1
.
!2
1
!1
1
n
++++
11
III.kết luận
Trên đây chỉ là kinh nghiệm rất ít của tôi khi làm công tác giảng
dạy môn Tin học 10,11. Phần thuật toán và lập trình có thể xem là khó
diễn đạt giảng dạy cũng như trình bày nhất trong Tin học nói chung và
trong chương trình Tin học phổ thông nói riêng vì nó đòi hỏi tư duy
thực sự. Cách bố trí tiếp cận bài toán, thuật toán, chương trình được
trình bày ở trên chỉ mang tính chủ quan với mong muốn bài học có
hiệu quả hơn.
Tôi xin chân thành cảm ơn các đồng nghiệp đã giúp đỡ tôi trong
quá trình thực hiện đề tài này !
Kính mong các đồng chí góp ý chân tình và có gì sai sót mong
các đồng nghiệp thông cảm !
IV.Tài liệu
1.Sgk,sbt,sgv Tin học 10,11
2.Giáo trình lý thuyế và lập trình Pascal , tác giả Nguyễn Đình
Tê và Hoàng Đức Hải

3.Ngôn nhữ lập trình Pascal của Quách Tuấn Ngọc
4.Bài tập Tin học chọn lọc, tác giả Nguyễn Thanh Hùng và
Hoàng Kiếm
12

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×