* OUTPUT : Chỉ số và giá trị của phần tử lớn nhất trong dãy... Các em hãy cho biết để giải bài toán trên, ở lớp 10 chúng ta dùng thuật toán gì?. Là Thuật toán tráo đổi kiểu nổi bọt
Trang 1Bµi 13
Gi¸o ¸n ®iÖn tö tin häc líp 11
Trang 2Bài 1 Tìm phần tử lớn nhất của dãy số nguyên (với n 250
và A[i] 500), nếu dãy có nhiều phần tử cùng giá trị thì đ
a ra chỉ số của phần tử lớn nhất đầu tiên
Hãy xác định Input, Output
và nêu thuật toán tìm Max?
* INPUT : Nhập số nguyên d ơng n và dãy n số nguyên d ơng
a1,a2, ,an
* OUTPUT : Chỉ số và giá trị của phần tử lớn nhất trong dãy
Trang 3Qu¶ nµy
lín nhÊt
Qu¶ nµy míi lín nhÊt
å! Qu¶ nµy lín h¬n
T×m ra qu¶ lín nhÊt råi! thuËt to¸n t×m max
MAX
Trang 41 NhËp n vµ d·y
a 1 , ,a n ;
Write(‘ Nhap vao so luong phan tu:’); Readln(n);
For i:=1 to n do begin
write(‘ Phan tu thu ’ ,i, ’ = ’);
readln(a[i]) end;
2 Max a1 ; i 1; Max:=a[1]; csmax:=1;
For i :=2 to n do
IF a[i]>max then
begin max:=a[i];
csmax:=i;
end;
3 NÕu i>N ® a ra
MAX vµ chØ sè i =>
KÕt thóc;
4 NÕu a[i]>max th×
maxa[i], i i+1 => quay l¹i b íc 3.
Trang 5Program Tim_Max;
Uses crt;
Type dayso = Array[1 250] of integer;
Var
A : dayso ;
i,n,max,csmax : integer;
BEGIN
Clrscr;
write(‘ Nhap vao so phan tu cua day so : ’) ; readln(n) ;
For i := 1 to n do
Begin
write(‘ Phan tu thu ‘,i,’ = ‘) ; readln(A[i]) ;
End;
Max := A[1[ ; csmax :=1 ;
For i := 1 to n do
If (A[i]>max) Then
begin
max := a[i];
csmax=i;
end;
Writeln(‘ Gia tri cua phan tu Max : ’,Max) ; Writeln(‘ Chi so cua phan tu Max : ’, csmax) ; Readln ;
END.
Trang 6Nhap vao so phan tu cua day so : 7
Phan tu thu 1 = 15
20 16 25 18 12 19 Gia tri cua phan tu Max : 25
Chi so cua phan tu Max : 4
Ch ¬ng tr×nh ch¹y vµ cho kÕt qu¶
nh sau:
Phan tu thu 2 =
Phan tu thu 3 =
Phan tu thu 4 =
Phan tu thu 5 =
Phan tu thu 6 =
Phan tu thu 7 =
Trang 7Bµi 2 NhËp vµo mét d·y sè nguyªn, s¾p xÕp d·y theo tr×nh
tù kh«ng gi¶m
* INPUT : NhËp sè nguyªn d ¬ng n vµ d·y n sè nguyªn d ¬ng
a1,a2, ,an
* OUTPUT : D·y sè ® îc s¾p xÕp theo tr×nh tù kh«ng gi¶m
Trang 8Các em hãy cho
biết để giải
bài toán trên,
ở lớp 10 chúng
ta dùng thuật
toán gì?
Là Thuật toán tráo
đổi kiểu nổi bọt từ trên xuống!
Trang 92
9
7
6
Cho dãy số sau: 3 2 9 7 6
Giả sử:
Mỗi phần tử đ ợc xem nh một bọt n ớc;
L ợt 1:
•i chạy từ đầu dãy đến
vị trí [cuối dãy -1]
•Khi a[i]>a[i+1] tức là
bọt n ớc bên trên nặng hơn bọt n ớc bên d ới => bọt n ớc trên chìm xuống
và bọt n ớc bên d ới nổi
lên ( tráo đổi vị trí).
•Sau l ợt thứ nhất, bọt n ớc
có trọng l ợng lớn nhất sẽ chìm xuống đáy.
Trọng l ợng của bọt n ớc thứ i là giá trị
của A[i] L ợt 2:
•i chạy từ đầu dãy đến
vị trí [cuối dãy - 2] (bỏ
qua phần tử cuối).
•Sau l ợt thứ hai bọt n ớc
có trọng l ợng lớn thứ hai nằm sát trên bọt n ớc lớn nhất
•Quá trình duyệt, tráo
đổi đ ợc lặp đi lặp lại cho đến khi chỉ còn duyệt hai phần tử và thu đ ợc dãy không giảm.
Trang 10Số phần tử ở các l ợt duyệt (j) sẽ giảm từ n xuống hai phần tử.
Tại mỗi l ợt duyệt:
- Cho i chạy từ 1 đến số phần
tử -1,
n ếu A[i]>A[i+1] thì
tráo đổi vị trí A[i] và A[i+1]
thông qua biến trung gian (Tg).
Các em hãy cho
biết trong Pascal nhận xét 1 đ ợc thể hiện bằng lệnh gì ?
1
For j := n downto 2 do
IF A[i]>A[i+1] then
Tg := A[i];
A[i] := A[i+1];
A[i+1]:=Tg;
Begin
end;
Trang 11Khai b¸o m¶ng 1 chiÒu
NhËp m¶ng 1
chiÒu
Xö lÝ m¶ng b»ng thuËt to¸n næi
bät
In kÕt qu¶
PROGRAM Sapxep;
Uses crt;
Type dayso = Array[1 250] of integer;
Var
i, j , n , tg : integer;
A : dayso;
BEGIN
Clrscr;
write(‘ Nhap vao so phan tu cua day so : ’);
readln(n);
For i := 1 to n do
Begin write(‘ Phan tu thu ‘,i,’ = ‘);
readln(A[i]);
end;
For j := n downto 2 do
For i:= 1 to j-1 do
If A[i]>A[i+1] Then
begin
Tg := A[i];
A[i]:=A[i+1];
A[i+1]:=Tg;
end;
Writeln(‘ Day so duoc sap xep ’);
For i:=1 to n do Write(A[i]:5);
Readln;
Trang 12Bµi 3 NhËp vµo mét d·y A t¨ng gåm N (N 250) sè nguyªn d ¬ng kh¸c nhau vµ mét sè k Cho biÕt vÞ trÝ cña sè h¹ng cã gi¸ trÞ b»ng k
trong d·y (nÕu cã) ?
* INPUT: NhËp sè nguyªn d ¬ng n, d·y n sè nguyªn d ¬ng
a1,a2, ,an vµ sè nguyªn k
* OUTPUT: ChØ sè i mµ ai = k hoÆc th«ng b¸o “Kh«ng t×m
thÊy” nÕu kh«ng cã sè h¹ng nµo cña d·y A cã gi¸ trÞ b»ng k
Trang 13Các em hãy nêu các cách để giải bài toán
trên ?
Lần l ợt từ số hạng thứ nhất, so sánh giá trị số hạng đang xét với k cho đến khi gặp đ ợc số hạng bằng k, hoặc dãy đã đ ợc xét hết và không có số hạng nào có giá trị bằng k.
Từ ý t ởng trên hãy viết đoạn
ch ơng trình bằng PASCAL
để tìm số hạng của dãy có giá
trị bằng k?
For i := 1 to n do
IF A[i] = k then
Begin Tim_thay:=true;
cs:=i;
break;
end;
Tim_thay := false;
IF tim_thay then writeln(‘Chi so tim duoc: ’,i) else writeln(‘Khong tim thay’);
Cách 1: Tìm kiếm tuần tự
Trang 14 C¸ch 2: T×m kiÕm nhÞ ph©n
10 9
8 7
6 5
4 3
2 1
i
33 31
30 22
21 9
6 5
4 2
A
Víi k = 21 vµ d·y A gåm 10 sè h¹ng nh sau:
L ît thø nhÊt: agi÷a lµ a5 = 9; 9 < 21
vïng t×m kiÕm thu hÑp trong ph¹m vi tõ a6
a10;
33 31
30 22
21
L ît thø hai: agi÷a lµ a8 = 30; 30 > 21
vïng t×m kiÕm thu hÑp trong ph¹m vi tõ a6 a7;
L ît thø ba: agi÷a lµ a6 = 21; 21= 21
22
21
6
21
Trang 15Dau:=1; Cuoi:=n; tim_thay:=false;
while ( Dau<= Cuoi) or NOT(tim_thay) do
Begin Giua:= (Dau+Cuoi) div 2;
IF A[giua] = k then Tim_thay :=true else
IF (A[Giua]>k) then Cuoi := Giua – 1
else Dau := Giua +1;
end;
IF Tim_thay then Writeln(‘ Chi so tim duoc la : ’,Giua)
Else Writeln(‘Khong tim thay’);
V× d·y A lµ d·y t¨ng, ta thùc hiÖn thu hÑp nhanh ph¹m vi t×m kiÕm b»ng c¸ch so s¸nh k víi A[giua] vµ xÐt c¸c tr êng hîp: - A[giua]=k t×m thÊy chØ sè gi÷a vµ kÕt thóc;
- A[giua]>k Thu hÑp vÒ phÝa bªn tr¸i (Cuèi = Gi÷a -1); - A[giua]<k Thu hÑp vÒ phÝa bªn ph¶i (§Çu = Gi÷a +1); Qu¸ tr×nh trªn ® îc lÆp l¹i chõng nµo cßn ch a t×m thÊy hoÆc Dau <= Cuoi.