1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BAI TAP VE MANG 1 CHIEUTT

17 18 0

Đ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 17
Dung lượng 90 KB

Nội dung

Ý 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

Ngày đăng: 08/05/2021, 12:34

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w