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

Tiet 20 bai tap

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 (388.49 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.

* INPUT: Nhập số nguyên dơng
n xác
và dÃy
n số nguyên dơng
HÃy
định
a1,a2,...,an.

* OUTPUT:

Input, Output
và nêu thuật
toán tìm
Chỉ số và giá trị của phần
Max?tử lín nhÊt trong d·y.


thuật toán tìm max

Quả này
lớn nhất



MAX

Quả này
mới lớn
nhất

ồ!
Tìm
Quảra
này
quảlớn
lớn
nhất
hơn rồi!


1. NhËp n vµ d·y
a1,...,an;

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

Max:=a[1]; csmax:=1;
For i :=2 to n do
IF a[i]>max then
begin
max:=a[i];
csmax:=i;
end;


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.


Chơng trình chạy và cho kết quả
nh sau:

Nhap vao so phan tu cua day so :
Phan tu thu 1 =
Phan tu thu 2 =
Phan tu thu 3 =

15

Phan tu thu 4 =

25

Phan tu thu 5 =


18

Phan tu thu 6 =

12

Phan tu thu 7 =

19

20
16

Gia tri cua phan tu Max : 25
Chi so cua phan tu Max : 4

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
a1,a2,...,an.

* 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!


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;
Trọng lợng của bọt nớc thứ i là giá trị
của A[i].
Lợt 1:
2:

3
2
9
7
6

ã i chạy từ đầu dÃy đến
vị trí
trí [cuối dÃy -1]

- 2] (bỏ
qua phần tử cuối).
ã Khi a[i]>a[i+1] tức là
ã Sau
bọt n
lợt
ớc thứ
bênhai
trênbọt
nặng
nớc
hơn

trọng
bọt ln
ợng
ớc lớn
bênthứ
dới hai
=>
bọt nớc
nằm
sát
trên
trên
chìm
bọt n
xuống
ớc lớn


nớc bên
dới tráo
nổi
ã nhất.
Quábọt
trình
duyệt,
lên
trí).
đổi(tráo
đợcđổi
lặpvịđi
lặp lại
ã cho
Sau lđến
ợt thứ khi
nhất,
chỉ
bọt còn
nớc
có trọng
duyệt
hai
lợng
phần
lớn nhất
tử và
sẽ
chìm
thu

đợc
xuống
dÃy không
đáy. giảm.


1

Số phần tử ở các lợt duyệt (j) sẽ giảm từ n xuống hai phầ
tử.

Các em hÃy cho
biết trong
Pascal nhận
2 Tạixét
mỗi1 lđ
ợtợc
duyệt:
thể
hiện
bằng
- Cho
i chạy
từ 1 đến số phần
tử -1, lệnh gì ?
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).


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;


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;

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ả


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


Cách 1: Tìm kiếm tuần tự
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.
Các em hÃy
nêu các
Tim_thay := false;
cách để
Từ ý tởngFor
trên
i := 1 to n do
giải bàihÃy
toán
viết đoạn
IF A[i] = k then
trên ?chơng trình
bằng PASCAL
Begin
để tìm số hạng
Tim_thay:=true;
của dÃy có giá
cs:=i;
break;
trị bằng k?
end;
IF tim_thay then writeln(Chi so tim duoc: ’,i)

else writeln(‘Khong tim thay’);




Cách 2: Tìm kiếm nhị phân
Với k = 21 và d·y A gåm 10 sè h¹ng nh sau:

A

2

4

5

6

9 21 22 30 31 33

i

1

2

3

4


5

6

7

8

9 10

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ừ a 6
a10;
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ừ a 6 a7;
Lợt thứ ba: agiữa là a6 = 21; 21= 21

Vậy chỉ số cần tìm là i = 6.


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


–1
+1;

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
else Dau := Giua
end;
IF Tim_thay then Writeln(‘ Chi so tim duoc la :



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

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