Tải bản đầy đủ (.ppt) (15 trang)

Bài tập (Mảng 1 chiều)

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 (428.08 KB, 15 trang )


Bµi
13
Gi¸o ¸n ®iÖn tö tin häc líp 11

Bà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 a
1
,a
2
, ,a
n
.
* OUTPUT: Chỉ số và giá trị của phần tử lớn nhất
trong dãy.

Qu¶ 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

1. 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.

Program 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.


Nhap 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 =

Bà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 a
1
,a
2
, ,a
n
.

* OUTPUT: Dãy số đợc sắp xếp theo trình tự không giảm.

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ừ trên
xuống!

3
2
9
7
6
Cho dãy số sau: 3 2 9 7 6
Giả sử:
Mỗi phần tử đBợc xem nhB một bọt nBớ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 lBợng của bọt nBớ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.

Số 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 đBợ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;

Khai 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;
END.

Bà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 a
1
,a
2
, ,a
n

và số nguyên k
* OUTPUT: Chỉ số i mà a
i
= 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.

Cá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ừ ý tBởng trên hãy
viết đoạn chBơ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ự


Cách 2: Tìm kiếm nhị phân
10987654321i
3331302221
9
6542A
Với k = 21 và dãy A gồm 10 số hạng nh sau:
Lợt thứ nhất: a
giữa
là a
5
= 9; 9 < 21
vùng tìm kiếm thu hẹp trong phạm vi từ a
6
a
10
;
3331302221
Lợt thứ hai: a
giữa
là a
8
= 30; 30 > 21
vùng tìm kiếm thu hẹp trong phạm vi từ a
6
a

7
;
Lợt thứ ba: a
giữa
là a
6
= 21; 21= 21
Vậy chỉ số cần tìm là i = 6.
22
21
66
21

Dau:=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 cha tìm thấy

hoặc Dau <= Cuoi.

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

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