* 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 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× max←a[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ẽư
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ư
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
2 For i := 1 to j-1 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
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’);
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
33 31
30 22
21
L ît thø hai: agi÷a lµ a8 = 30; 30 > 21
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.