• Khi a[i]>a[i+1] tøc lµ bät • Sau lượtthứ hai bäth¬n nước cã nướcbên trªn nÆng bät träng lượng lín hai nướcbên dưới =>thø bọt nước n»m s¸t trªn bät vµ nước lín trªn ch×m xuèng bät nước [r]
Trang 1Bµi 13
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!
Trang 4Write(‘ Nhap vao so luong phan tu:’);
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 :=2 to n do
IF a[i]>max then
begin max:=a[i];
csmax:=i;
end;
& '()$*)'(
+",-./0
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 ;
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
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
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
Trang 101!2 $345-6$7$ 89: ;<=)$> ! <2 $3
?.)@-6$7$A
BCD.$> !2 $3B
'('+($*
$H <,/ $ << 8?<:
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 ’);
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
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 ?
I2 -6$ $> ! <$J K$ D 5 <5$F ! <
<5$F/O <M
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)
C5A ?*)M)$2 $Q
Trang 14 C5A?*)M) FR
10 9
8 7
6 5
4 3
2 1
i
33 31
30 22
21 9
6 5
4 2
A
I6$$J K$A <V-W"XXY
33 31
30 22
21
I6$$JA <V-]"UU
I6$$J/A <V-\""
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)
B'<("M$*)$K !<V
e5$* $b 6-N-.> < Df $*)$KDN gY"CD
... class="text_page_counter">Trang 11< /span>Khai báo mảng chiều< /b>
Nhập mảng chiều< /b>
Xử lí mảng thuật
toán...
Trang 12Bài Nhập vào dãy A tăng gồm N (N 250) số nguyên dương khác
số k Cho biết vị trí... 13
Các em nêu cách
để giải toán
trên ?
I2 - 6$ $> ! <$J K$