2. Bài 1: Viết CT tạo mảng A gồm N (N250) số nguyên. Sắp xếp lại
mảng A này bằng đã học ở lớp 10/Bài 4 toán và thuật toán,trang 38-
39-40. thuật toán tráo đổi (Exchange Sort)
-Số nguyên dương (N<=250)
-Dãy A gồm N số nguyên
dương A1,A2,..,AN, mỗi số
không vượt quá 500.
INPUT OUTPU
T
-Dãy số A được sắp xếp
không giảm (Tăng dần).
Input: A = {2,3,5,2,9,1,0},N=6
Output: 0 1 2 3 5 9
2
3. THUẬT TOÁN TRÁO ĐỔI
(EXCHANGE SORT)
Bước 1: Nhập N,các số hạng A1,A2,..,AN
Bước 2: j N;
Bước 3: Nếu j < 2 thì đưa ra dãy A đã
được sắp xếp rồi kết thúc.
Bước 4: j j -1 ,i 0;
Bước 5: i i+1;
Bước 6: Nếu i > j thì quay lại B3;
Bước 7: Nếu Ai > Ai+1 thì tráo đổi
Ai , Ai+1 cho nhau;
Bước 8: Quay lại B5;
Liệt kê
3
13. CÁC VIỆC CHÍNH CẦN THỰC
HIỆN TRONG CT NÀY LÀ GÌ?
+ Cho biết số ptử của mảng A.
+ Nhập giá trị cho các ptử của mảng A
+ Sắp xếp các phần tử của mảng A.
Hoán đổi vị trí của phần tử phía trước và phía sau nếu
như p/tử phía trước lớn hơn p/tử phía sau.
13
14. CÁC BIẾN CHÍNH CẦN SỬ DỤNG LÀ GÌ?
Mảng A
Biến đơn: N, i,j,t
14
15. PHẦN KHAI BÁO
var
a:array [1..100] of integer;
f,g : text;
i,j,t,n:integer;
Trong đó:
i: dùng để lặp từ 1 đến N-1
J:dùng để lặp từ N về 2,…
t : Dùng để lưu biến tạm của A[i],khi hoán đổi vị trí với A[i+1]
15
16. VIẾT PHẦN CHTRÌNH TẠO GIÁ
TRỊ CHO CÁC PTỬ CỦA MẢNG A.
(*doc file*)
assign(f,'sx.inp');
reset(f);
read(f,n);
for i:= 1 to n do
read(f,a[i]);
close(f);
16
17. Để viết tiếp đoạn chtrình còn lại (sắp xếp mảng A) theo
thuật toán ta phải kiểm tra so sánh Ai > Ai+1 hay không?
Sau đó ta mới hoán đổi vị trí của Ai ,Ai+1 .
Vậy ta sử dụng câu lệnh gì ở đây?
(*Xu ly*)
if( a[i] >a[i+1]) then
begin
(*Hoán đổi a[i] và a[i+1]*)
end;
17
18. Trong phần sắp xếp này chúng ta sử dụng mấy vòng lặp?
Vòng lặp đó dùng làm gì?
Lặp từ vị trí nào tới vị trí nào ?
-2 vòng lặp.
-Vòng lặp đầu tiên dùng để duyệt từ p/tử vị trí cuối cùng đến p/tử ở vị trí thứ
2(lặp đến N-1 lần,mục đích để loại bỏ N-1 lần các phần tử lớn nhất sau mỗi
lần sắp xếp)
-Vòng lặp thứ 2,lặp từ p/tử ở vị trí đầu tiên đến p/tử ở vị trí thứ N-1,dùng để
so sánh từng đôi một kề nhau từ vị trí 1 N-1
18
19. (*Xu ly*)
for j:= n downto 2 do
for i:=1 to j-1 do
begin
if( a[i] >a[i+1]) then
begin
(*Hoán đổi a[i] và
a[i+1]*)
end;
end;
19
20. Trong 2 vòng lặp thì khi điều kiện if a[i] > a[i+1] nếu đúng
sẽ làm gì tiếp theo?
Hoán đổi vị trí A[i] và A[i+1]:
t := a[i]
a[i] := a[i+1] ;
a[i+1] := t;
20
21. CT HOÀN CHỈNH
program sx;
var
a:array [1..100] of integer;
f,g : text;
i,j,t,n:integer;
begin
(*doc file*)
assign(f,'sx.inp');
reset(f);
read(f,n);
for i:= 1 to n do
read(f,a[i]);
close(f);
(*Xu ly*)
for j:= n downto 2 do
for i:=1 to j-1 do
begin
if( a[i] >a[i+1])
then
begin
t:=a[i];
a[i]:=a[i+1];
a[i+1] := t;
end;
end;
(*Xuat file*)
assign(g,'sx.out');
rewrite(g);
for i:= 1 to n do
write(g,' ',a[i]) ;
close(g);
end.
21
23. BÀI TOÁN 2:
EM HÃY ĐẾM SỐ PHẦN TỬ ÂM
VÀ DƯƠNG CỦA MẢNG A (BÀI 1)
VD:
Input:A= {3 5 9 -2 -5},N=5
Output : am =2,duong = 3
Phân tích:
am=0,duong=0
+i=1: 3>0,am=0,duong=1
+i=2: 5>0,am=0,duong= 2
+i=3: 9 >0,am =0,duong =3
+i=4: -2 <0 ,am =1,duong = 3
+i=5: -5<0,am= 2,duong =3
23
24. am := 0; duong := 0;
{dem}
for i:=1 to n do
if a[i] >0 then
duong := duong + 1
else if a[i]<0 then
am := am + 1;
24
25. GHI SỐ LƯỢNG P/TỬ
ÂM/DƯƠNG VÀO FILE SX.OUT
(*Xuat file*)
assign(g,'sx.out');
rewrite(g);
for i:= 1 to n do
write(g,' ',a[i]) ;
writeln(g);
writeln(g,'so luong phan tu am = ',am);
writeln(g,'so luong phan tu duong =',duong);
close(g);
25
27. - Cho 2 mảng A, B gồm n (n<=250) số nguyên. Hãy viết
chương trình xây dựng mảng C[1..n], trong đó C[i] là tổng
của 2 phần tử thứ i thuộc mảng A và mảng B. (tức là: C[i] =
A[i] + B[i]).
27