1. Trang chủ
  2. » Giáo án - Bài giảng

Bài tập mảng một chiều

15 1,2K 8

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 15
Dung lượng 636 KB

Nội dung

* 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... Nhập vào một dãy số nguyên, sắp xếp dãy theo trình

Trang 1

Bµi 13

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

Trang 2

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

* OUTPUT : Chỉ số và giá trị của phần tử lớn nhất

trong dãy

Trang 3

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!

MAX

Trang 4

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

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 5

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.

Trang 6

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 =

Trang 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

Trang 8

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!

Trang 9

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

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 10

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 đượ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 11

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;

Trang 12

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

Trang 13

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ừ ý 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

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

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

22 21

6

21

Trang 15

Dau:=1; Cuoi:=n; tim_thay:=false;

Begin Giua:= (Dau+Cuoi) div 2;

IF A[giua] = k then Tim_thay :=true else

else Dau := Giua +1;

end;

IF Tim_thay then Writeln(‘ Chi so tim duoc la : ’,Giua) Else Writeln(‘Khong tim thay’);

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.

Ngày đăng: 19/07/2014, 11:00

TỪ KHÓA LIÊN QUAN

w