Ý tưởng: Giả sử mảng A là mảng tăng, sử dụng vòng lặp để kiểm tra có tồn tại phần tử nào nhỏ hơn phần tử đứng trước nó hay không, nếu có thì trả về là mảng không không phải là mảng tăng [r]
(1)Một số tập lập trình Pascal Created by NgoHung
Vấn đề 3: Mảng chiều
Bài toán số 3.1: Nhập xuất tính tổng phần tử mảng.
Ví dụ: A: Kết quả: Tong S = 23
Hướng dẫn: Để giải toán cần phải đảm bảo vấn đề:
- Nhập mảng, xây dựng thành hàm để đóng gói sử dụng lại Các thao
tác theo yêu cầu: (1) Nhập số N
(2) Tiến hành lặp (từ đến N-1) nhập cho giá trị Ai mảng Lưu ý: N phải vào truyền theo dạng tham biến (tức &N)
- Xuất mảng Công việc đơn giản sử dụng voøng lặp từ đến N-1 để in
giá trị Ai cho mảng Sau đó, Writeln xuống dịng
- Hàm tính tổng phần tử cho mảng A
o Khai báo khởi tạo toång S
o Sử dụng vòng lặp (từ đến N-1 để duyệt qua tất giá trị Ai) để
tính cộng dồn giá trị Ai vào tổng S
- Viết thân chương trình với nội dung dùng để kiểm tra kết thực
của hàm
o Khai báo mảng A có tối đa 20 phần tử biến N số lượng phần tử
A
o Gọi hàm nhập mảng để nhập mảng A, với N phần tử
o Gọi hàm xuất mảng A, với N phần tử
o In giá trị tổng phần tử cách truyền trực tiếp giá trị trả
(2)o Gọi hàm Readln( ) trước kết thúc để dừng lại xem kết
Chương trình:
{ Cac khai bao cho chuong trinh }
Program Mang1C;
Uses crt;
Type Mang20 = array[1 20] of Integer; Var N:Integer;
A:Mang20;
{ Thu tuc nhap mang A voi N la so phan tu }
Procedure NhapMang1C(Var A : Mang20 ;Var N:Integer);
Var i: Integer; Begin
Write( 'So luong phan tu:' ); Readln( N); For i:=0 to N
Begin
Write( 'Nhap phan tu thu ', i,'' ); Readln( A[i] ); End;
End;
{ Thu tuc xuat mang A voi N la so phan tu }
Procedure XuatMang1C( Var A : Mang20;Var N :Integer );
Var i:Integer; Begin
(3)Writeln; End;
{ Chuong trinh tinh tong cac phan tu mang }
Function TongMang1C( A : Mang20; N:Integer):longint;
Var i :Integer; S :longint; Begin
S := 0;
For i:=0 to N S := S + A[i] ; TongMang1C:=S; End;
{ Than chuong trinh chinh }
BEGIN
NhapMang1C( A, N ); XuatMang1C( A, N );
Writeln(' Tong cac phan tu mang ', TongMang1C(A, N) ); Readln;
END.
Bài tốn tương tự:
(1) Tính tổng số ngun dương chia hết cho
(4)Var S,i :Integer; Begin
S:=0;
For i:=0 to N If(A[i] mod 5=0) S := S+A[i]; TongSoChiaHet5:= S; End;
(2) Tính tổng số nguyên tố mảng
Function LaSoNT( Var N:Integer) :Integer;
Var i:Integer; Begin
For i:=2 to N-1do If(N mod i = 0) then return
Else
return 1; End;
Function TongSoNT(Var A : Mang20, Var N:Integer):Integer;
Var S,i:Integer; Begin
S:=0;
For i:=0 to Ndo
(5)TongSoNT :=S; End;
Bài toán số 3.2: Đếm số lần xuất giá trị X mảng A Đếm số lần xuất các
phần tử mảng
Ví dụ: A: 5 1 X:
Kết quả: So lan xuat hien X la
So lan xuat hien cua cac phan tu: ==> ==> ==> ==>
4 ==> ==> ……
Hướng dẫn:
+ Viết hàm đếm số lần xuất củat giá trị X nhập vào, xem X nhà tham số cho việc đếm số lần xuất A
+ Viết hàm in số lần xuất hiên tất phần tử mảng, sử dụng lại hàm xây dựng trước
+ Xây dựng chương trình giải tốn gồm:
- Khai báo mảng A, N phần tử
- Nhập / Xuất mảng A với N phần tử (lưu ý, phải có định nghĩa hàm
nhập /xuất mảng)
Hai hàm sử dụng kết toán 3.1
- Nhập giá trị X cần đếm số xuất
- In số lần xuất X A Ý tưởng:
o Khởi tạo biến đếm ban đầu
o Sử dụng vòng lặp i, lặp từ đến N
o Đối với phần tử A[i], A[i] = X tăng biến đếm lên
(6)- In số lần xuất phần tử A
Các hàm xây dựng:
{ Dem so phan tu A[i] mang bang gia tri X }
Function DemPtuX(Var A : Mang20; N, X : Integer) : Integer;
Var i , Count : Integer; Begin
Count := 0; For i:=0 to N
If ( A[i] = X ) then
Count := Count + 1; DemPtuX := Count;
End;
{ Dem so lan xuat hien cua tat ca cac phan tu mang }
Procedure InSoLanXHcuaPTu( A:Mang20; N: Integer);
Var i :Integer; Begin
For i:=0 to N
Writeln( A[i] ,' ===> ', DemPtuX( A, N, A[i] ) ); End;
Source code chương trình chính:
BEGIN
(7)NhapMang1C( A, N ); XuatMang1C( A, N );
Write( 'Gia tri X:' ); Readln( X );
Writeln( 'So lan xuat hien A la:', DemPtuX(A, N, X) ); InSoLanXHcuaPTu ( A, N );
Readln;
END
Cải tiến: Không in phần tử lặp lại.
Hướng dẫn: Đối với phần tử, trước in, kiểm tra xem xuất trước hay không
- Nếu A[i] chưa xuất trước nó, in số lần xuất A[i]
- Nếu A[i] có xuất trước nó, khơng in số lần xuất A[i] nữa,
đã in số lần xuất phần tử có giá trị A[i]
Mở rộng: In phần tử xuất nhiều mảng.
Bài toán số 3.3: Tìm kiếm thay Tìm kiếm vị trí xuất x trên
mảng A Thay giá trị Ai x thành y Ví dụ: A: 5 1
X=5 Y=15
Kết quả: Vi tri xuat hien X la
Ket qua thay the: 15 15 15 1
Hướng dẫn:
- Xây dựng hàm tìm kiếm giá trị X mảng A, N phần tử Sử dụng vòng lặp từ
0 đến N-1 để kiểm tra tất giá trị Ai, x trả vị trí i tìm thấy Nếu vịng lặp mà khơng tìm thấy trả –1
- Xây dựng hàm thay giá trị x y vị trí tìm thấy Tương tự
tìm kiếm, tìm thấy tiến hành gán giá trị cho Ai y
- Xây dựng hàm thay tất giá trị x y vị trí tìm thấy Sử dụng
(8)Các hàm xây dựng:
{ Ham tim kiem gia tri X mang A voi N phan tu }
Function TimKiem ( A:Mang20; N:Integer; X:Integer ):Boolean;
Var Flag : Boolean; i:Integer; Begin
Flag:=False; For i:=0 to N Begin
If (A[i] = x) then Begin
Flag:=True;
Break; {Tim thay ==> Tra ve vi tri tim thay } End;
End;
TimKiem:=Flag; End;
{ Thay the phan tu X dau tien tim thay mang bang gia tri Y }
Function ThayThe(Var A:Mang20;Var N, x, y:Integer):Integer;
Var i:Integer; Begin
For i:=0 to N If (A[i] = x) then Begin
(9)Break; { Cham dut qua trinh thay the} End;
ThayThe := i; End;
{ Thay the tat ca cac phan tu co gia tri X tim thay bang gia tri Y }
Procedure ThayTheTatCa (Var A:Mang20; Var N, x,y:Integer);
Var i:Integer; Begin
For i:=0 to N
If(A[i] = x) then { Tim thay x ==> thay the y } A[i] := y;
End;
Source code chương trình chính
BEGIN
NhapMang1C(A, N); { Ham nhap xuat khong lam lai nua } XuatMang1C(A, N); { Su du let qua o truoc }
Write('Gia tri x:'); Readln(x); If (TimKiem(A,N,x)) then
Writeln( 'Tim thay tai vi tri mang A.', x, k ) Else
Writeln( 'Khong tim thay mang A', x ); Write('gia tri y:'); Readln(y);
(10)Writeln('Ket qua thay the ',x, y); XuatMang1C(A, N);
ThayTheTatCa(A, N, x, y);
Writeln('Ket qua thay the tat ca la:',x, y); XuatMang1C(A, N);
Readln;
END.
Mở rộng: + Tìm kiếm cặp phần tử gần có tổng chia hết cho 10 Thay phần
tử tổng chúng
Ví dụ: A: 19 62 32 12 Ket qua: 20 20 62 40 40 12
Procedure ThayTheBangTong(Var A:Mang20; N:Integer; X, Y:Integer);
Var i,k:Integer; Begin
For i:=0 to N
If( (A[i-1]+A[i]) mod 10 = 0) then Begin
k := (A[i-1]+A[i]); A[i-1] := k; A[i] := k; End;
End;
Bài tốn số 3.4: Kiểm tra mảng có đối xứng hay khơng? Kiểm tra mảng có tăng dần hay khơng?
(11)Nếu mảng mảng tăng dần, xếp thành mảng tăng dần Ví dụ: Mảng A: 15 7 15
Kết quả: Mang A doi xung, Mang A khong phai la mang tang dan Mảng A: 14 17 26 26 31
Kết quả: Mang A khong doi xung, Mang A khong phai la mang tang dan
Hướng dẫn:
+ Xây dựng hàm int KtraDoiXung( A, N ) để kiểm tra tính đối xứng mảng Ý tưởng: Giả sử mảng A mảng đối xứng, sử dụng vịng lặp để tìm kiểm cặp đối xứng lại có giá trị khơng nhau, trả mảng khơng đối xứng Ngược lại khơng tìm thấy nên mảng mảng đối xứng
+ Xây dựng hàm int KtraMangTang( A, N ) để kiểm tra xem mảng A có phải mảng tăng hay khơng Mảng tăng mảng có phần tử đứng sau khơng nhỏ phần tử đứng trước Ý tưởng: Giả sử mảng A mảng tăng, sử dụng vòng lặp để kiểm tra có tồn phần tử nhỏ phần tử đứng trước hay khơng, có trả mảng không mảng tăng (return 0) Ngược lại khơng tìm thấy nên mảng mảng tăng (return 1)
+ Xây dựng hàm Function SxepMangTang( A, N ) để xếp mảng A thành mảng tăng dần Ý tưởng: Sử dụng vòng lặp lồng để kiểm tra hai phần tử vị trí i, j i < j mà A[i] > A[j] hốn đổi giá trị chúng
+ Xây dựng chương trình để thể kết đánh giá
Các hàm xây dựng:
{ Ham kiem tra mang doi xung }
Function KtraDoiXung (A:Mang20; N:Integer ) : Boolean;
Var Flag:Boolean; i :Integer; Begin
Flag:=True; For i :=1 to N
(12)Flag :=False; { Cham dut kiem tra, ket qua qua trinh : khong doi xung } KtraDoiXung :=Flag;
End;
{ Ham kiem tra mang tang }
Function KtraMangTang ( A:Mang20; N :Integer) : Boolean;
Var Flag : Boolean; i :Integer; Begin
Flag := True; For i :=1 to N
If(A[i] < A[i-1]) Then
Flag :=False; { Cham dut kiem tra, ket qua qua trinh : khong tang } KtraMangTang :=Flag;
End;
{ Thu tuc sap xep mang tang }
Function SxepMangTang (A:Mang20; N:Integer ):Integer;
Var i ,j,k :Integer; Begin
For i :=1 to N For j :=1 to N
If ( (i<j) and (A[i] > A[j]) ) then Begin
(13)End; End;
Source code chương trình chính:
BEGIN
Clrscr;
NhapMang1C(A, N); { Ham nhap xuat khong nhac lai nua } XuatMang1C(A, N); { Su dung ket qua o truoc }
If ( KtraDoiXung (A, N ) ) then Writeln( ' Mang A doi xung.') Else
Writeln(' Mang A khong doi xung.'); If ( KtraMangTang (A, N ) ) then
Writeln( 'Mang A la mang tang ') Else
Begin
Writeln( 'Mang A khong phai la mang tang '); SxepMangTang( A, N );
Writeln( 'Ket qua sap sep:'); XuatMang1C(A, N);
End; Readln;
END
Mở rộng:
(14)+ Kiểm tra mảng giảm dần, Sắp xếp mảng giảm dần.
+ Sắp xếp mảng A có số dương tăng dần, số âm giảm dần
Function SxepDuongTangAmGiam ( A[]:Mang20, N:Integer );
Var i ,j ,k:Integer; Begin
For i:=1 to N For j:=1 to N
If ( ( (i<j)and (A[i] > A[j]) and (A[i]>0) and (A[j]>0)) or ((i<j) and ( A[i] < A[j] ) and ( A[i]<0) and ( A[j]<0))) then Begin
k := A[i]; { Tien hanh hoan doi gia tri A[i], A[j]} A[i] := A[j]; { thong qua bien tam k } A[j] := k;
End; End;
+ Kiểm tra mảng A chuỗi cấp số cộng có cơng sai k = 5? Ví dụ: 11 16 21 26 31
Function KtraMangCapSoCong (A:Mang20; N:Integer; k:Integer):Boolean;
Var flag :boolean; i :Integer; Begin
for i:=1 to N
if(A[i] < > A[i-1] + k) then
(15)End;
Bài toán số 3.5: Viết thủ tục chương trình chèn phần tử X vào vị trí k mảng A, N phần
tử Xoá phần tử vị trí h mảng A Ví dụ: A : 12 17 X = 20 , k = h =
Kết chèn: 12 20 17 Kết xoá: 12 20 17
Hướng dẫn:
- Viết thủ tục chèn phần tử X vào vị trí k cho mảng A (có N phần tử)
Ý tưởng thuật toán:
+ Dịch chuyển phần tử từ vị trí k đến N-1 lùi vị trí, trở thành phần tử từ vị trí k+1 đến N Lưu ý, để tránh trường hợp phần tử đè lên nhau, giải thuật phải tiến hành di dời phần tử sau trước….đến phần tử k sau + Gán giá trị cho A[k] x
+ Tăng số lượng phần tử A lên 1, N phải truyền theo dạng tham biến
- Viết thủ tục xoá phần tử vị trí k mảng A (có N phần tử) Ý tưởng thuật
toán:
+ Dịch chuyển phần tử từ vị trí k đến N-1 tiến trước vị trí, trở thành phần tử từ vị trí k-1 đến N-2
+ Giảm số lượng phần tử A xuống 1, N phải truyền theo dạng tham biến
Nội dung thủ tục xây dựng:
{ Thu tuc chen phan tu }
Procedure ChenPhanTu( A:Mang20;Var N : Integer; k, X:Integer);
(16)For i:=N downto k+ A[i] := A[i-1];
A[k] := X; N:=N+1; End;
{ Thu tuc xoa phantu }
Procedure XoaPhanTu( A:Mang20; Var N ,k:Integer);
Var i :Integer; Begin
For i:=k to N-1 A[i] := A[i+1]; N:=N-1;
End;
Source code chương trình chính:
BEGIN
NhapMang1C(A, N); { Ham nhap xuat khong lam lai nua } XuatMang1C(A, N); { Su du let qua o truoc }
Write('Gia tri x:'); Readln(x);
Write('Vi tri k,h:'); Readln(k,h); Writeln('Ket qua chen vao la:'); ChenPhanTu(A, N, k, x); XuatMang1C(A, N);
(17)XuatMang1C(A, N); Readln;
y NgoHung