Khai báo mảng trong pascal

     

DỮ LIỆU KIỂU MẢNG (ARRAY)

I. KHAI BÁO MẢNG

Cú pháp:TYPE = ARRAY OF ;VAR :;hoặc khai báo trực tiếp:VAR : ARRAY OF ;Ví dụ:TYPE Mangnguyen = Array<1..100> of Integer;Matrix = Array<1..10,1..10> of Integer;MangKytu = Array of Char;VAR A: Mangnguyen;M: Matrix;C: MangKytu;hoặc:VAR A: Array<1..100> of Integer;C: Array of Char;

II. XUẤT NHẬP TRÊN DỮ LIỆU KIỂU MẢNG

- Để truy cập đến phần tử thứ k trong mảng một chiều A, ta sử dụng cú pháp: A.

Bạn đang xem: Khai báo mảng trong pascal

- Để truy cập đến phần tử (i,j) trong mảng hai chiều M, ta sử dụng cú pháp: M.

- Có thể sử dụng các thủ tục READ(LN)/WRITE(LN) đối với các phần tử của biến kiểu mảng.

BÀI TẬP MẪU

Bài tập 5.1: Viết chương trình tìm giá trị lớn nhất của một mảng chứa các số nguyên gồm N phần tử.

Ý tưởng:- Cho số lớn nhất là số đầu tiên: Max:=a<1>.- Duyệt qua các phần tử a, với i chạy từ 2 tới N: Nếu a>Max thì thay Max:=a;

Uses Crt;Type Mang = ARRAY<1..50> Of Integer;Var A:Mang;N,i,Max:Integer;Begin{Nhập mảng}Write(Nhap N=); Readln(N);For i:=1 To N DoBeginWrite(A<,i,>=); Readln(A);End;{Tìm phần tử lớn nhất}Max:=A<1>;For i:=2 To N DoIf MaxBài tập 5.2: Viết chương trình tính tổng bình phương của các số âm trong một mảng gồm N phần tử.Ý tưởng:Duyệt qua tất cả các phần tử A trong mảng: Nếu ABài tập 5.3: Viết chương trình nhập vào một mảng gồm N số nguyên. Sắp xếp lại mảng theo thứ tự tăng dần và in kết quả ra màn hình.Ý tưởng:Cho biến i chạy từ 1 đến N-1, đồng thời cho biến j chạy từ i+1 đến N: Nếu A>A thì đổi chổ A, A.

Uses Crt;Type Mang = ARRAY<1..50> Of Integer;Var A:Mang;N,i,j,Tam:Integer;Begin{Nhập mảng}Write(Nhap N=); Readln(N);For i:=1 To N DoBeginWrite(A<,i,>=); Readln(A);End;{Sắp xếp}For i:=1 To N-1 DoFor j:=i+1 To N DoIf A>A ThenBeginTam:=A; A:=A; A:=Tam;End;{In kết quả ra màn hình}Writeln(Ket qua sau khi sap xep:);For i:=1 To N Do Write(A:5);Readln;End.

Bài tập 5.4: Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm vào một số nguyên X. Hãy kiểm tra xem phần tử X có trong mảng A hay không?Ý tưởng:Dùng thuật toán tìm kiếm tuần tự. So sánh x với từng phần tử của mảng A. Thuật toán dừng lại khi x=A hoặc i>N.Nếu x=A thì vị trí cần tìm là i, ngược lại thì kết quả tìm là 0 (không tìm thấy).


Uses Crt;Type Mang = ARRAY<1..50> Of Integer;Var A:Mang;N,i,x:Integer;Function TimKiem(x, N: Integer; A:Mang):Integer;Var i:Integer;BeginI:=1;While (I A) do I:=I+1;If I 0 ThenWriteln(Vi tri cua X trong mang la:, TimKiem(X,N,A))Else Writeln(X khong co trong mang.);Readln;End.

Bài tập 5.5: Giả sử mảng A đã được sắp xếp theo thứ tự tăng dần. Viết hàm để kiểm tra xem phần tử X có trong mảng A hay không?Ý tưởng:So sánh x với phần tử ở giữa mảng A. Nếu x=A thì dừng (vị trí cần tìm là chỉ số của phần tử giữa của mảng). Ngược lại, nếu x>A thì tìm ở đoạn sau của mảng , ngược lại thì tìm ở đoạn đầu của mảng .Sau đây là hàm cài đặt cho thuật toán này:

Function TimKiemNhiPhan(X, N: Integer; A: Mang):Integer;Var dau,cuoi,giua:Integer;Found:Boolean;Begindau:=1; {điểm mút trái của khoảng tìm kiếm}cuoi:=N; {điểm mút phải của khoảng tìm kiếm}Found:=False; {chưa tìm thấy}While (dau A Then dau:=giua+1Else cuoi:=giua-1;End;If Found Then TimKiemNhiPhan:= giua Else TimKiemNhiPhan:=0;End;

Bài tập 5.6: Viết chương trình tìm ma trận chuyển vị của ma trận A.Ý tưởng:Dùng mảng 2 chiều để lưu trữ ma trận. Gọi B là ma trận chuyển vị của ma trận A, ta có: Bij = Aji.

Uses Crt;Type Mang = ARRAY<1..10,1..10> Of Integer;Var A,B:Mang;m,n,i,j:Integer;Begin{Nhập ma trận}Write(Nhap số dòng m=); Readln(m);Write(Nhap số cột n=); Readln(n);For i:=1 To m DoFor j:=1 To n DoBeginWrite(A<,i,j,>=); Readln(A);End;{Tìm ma trận chuyển vị}For i:=1 To m DoFor j:=1 To n Do B:=A;{In ma trận chuyển vị ra màn hình}For i:=1 To m DoBeginFor j:=1 To n Do Write(B:5);Writeln;End;Readln;End.

Bài tập 5.7: Cho một mảng 2 chiều A cấp mxn gồm các số nguyên và một số nguyên x. Viết chương trình thực hiện các công việc sau:a/ Đếm số lần xuất hiện của x trong A và vị trí của chúng.b/ Tính tổng các phần tử lớn nhất của mỗi dòng.

Xem thêm: Giải Bài 1 Sgk Toán 12 Trang 77 Sgk Giải Tích 12: Bài 4, Bài 1 Trang 77 Sgk Giải Tích 12

Uses Crt;Type Mang = ARRAY<1..10,1..10> Of Integer;Var A:Mang;m,n,i,j,x,dem,S,max:Integer;Begin{Nhập ma trận}Write(Nhap số dòng m=); Readln(m);Write(Nhap số cột n=); Readln(n);For i:=1 To m DoFor j:=1 To n DoBeginWrite(A<,i,j,>=); Readln(A);End;{Nhập x}Write(Nhap x=); Readln(x);{Đếm số lãn xuất hiện của x và vị trí của x}dem:=0;Writeln(Vi tri cua x trong mang A: );For i:=1 To m DoFor j:=1 To n DoIf x=A ThenBeginWrite(i,j, ; );dem:=dem+1;End;Writeln(So lan xuat hien cua x trong mang A la: ,dem);{Tính tổng các phần tử lớn nhất của mỗi dòng}S:=0;For i:=1 To m Do {duyệt qua từng dòng}Begin{Tìm phần tử lớn nhất của dòng thứ i}Max:=A;For j:=2 To n Do {duyệt từng phần tử của dòng thứ i}If maxBài tập 5.8: Giải phương trình bằng phương pháp chia nhị phân.Ý tưởng:Giả sử cần tìm nghiệm của phương trình f(x)=0 trên đoạn với y=f(x) đồng biến và đơn trị trên đoạn . Ta giải như sau:

Gọi m là trung điểm của đoạn . Nếu f(m)*f(a)0 Then Writeln("Phuong trinh vo nghiem.")Else If abs(f(Min))Bài tập 5.9: Viết chương trình nhập vào số tự nhiên N (N lẻ), sau đó điền các số từ 1 đến n2 vào trong một bảng vuông sao cho tổng các hàng ngang, hàng dọc và 2 đường chéo đều bằng nhau (bảng này được gọi là Ma phương).

Ví dụ: Với N=3 và N=5 ta có


*

Phuơng pháp:

Xuất phát từ ô bên phải của ô nằm giữa. Đi theo hướng đông bắc để điền các số 1, 2, Khi điền số, cần chú ý một số nguyên tắc sau:- Nếu vượt ra phía ngoài bên phải của bảng thì quay trở lại cột đầu tiên.- Nếu vượt ra phía ngoài bên trên của bảng thì quay trở lại dòng cuối cùng.- Nếu số đã điền k chia hết cho N thì số tiếp theo sẽ được viết trên cùng một hàng với k nhưng cách 1 ô về phía bên phải.


Uses Crt;Var A:Array<1..20,1..20> Of Word;n,i,j,k:Word;BeginWrite("Nhap N= "); Readln(n);Clrscr;{Định vị ô xuất phát}i:=n DIV 2 + 1;j:=n DIV 2 + 2;{Điền các số k từ 1 đến n*n}For k:=1 To n*n DoBeginA:=k;If k MOD n=0 Then j:=j+2Else Begin{Đi theo hướng đông bắc}j:=j+1; i:=i-1;End;If j>n Then j:=j MOD n;If i=0 Then i:=n;End;{In kết quả ra màn hình}For i:=1 To n DoBeginFor j:=1 To n Do write(a:4);Writeln;End;Readln;End.

Bài tập 5.10: Viết chương trình nhập vào 2 mảng số nguyên A, B đại diện cho 2 tập hợp (không thể có 2 phần tử trùng nhau trong một tập hợp). Trong quá trình nhập, phải kiểm tra: nếu phần tử vừa nhập vào đã có trong mảng thì không bổ sung vào mảng. In ra màn hình các phần tử là giao của 2 tập hợp A, B.Ý tưởng:Duyệt qua tất cả các phần tử aiÎA. Nếu aiÎB thì viết ai ra màn hình.

Uses Crt;Type Mang=ARRAY<1..50> Of Integer;Var A,B:Mang;n,m:Byte;Function KiemTra(x:Integer; n:Byte; A:Mang):Boolean;Var i:Byte; Found:Boolean;BeginFound:=False;i:=1;While (iBài tập 5.11: Cho một mảng số nguyên gồm n phần tử. Tìm dãy con gồm m phần tử (m£n) sao cho dãy con này có tổng lớn nhất. (Dãy con là dãy các phần tử liên tiếp nhau trong mảng).

Uses Crt;Type Mang=ARRAY<1..50> Of Integer;Var A:Mang;n,m,i,j,k:Byte;S,Max:Integer;BeginWrite("So phan tu cua mang: n= "); Readln(n);For i:=1 To n DoBeginWrite("a<",i,">="); Readln(a);End;Write("Nhap so phan tu cua day con: m= "); Readln(m);k:=1; {Vị trí phần tử đầu tiên của dãy con}{Giả sử m phần tử đầu tiên của mảng A là dãy con có tổng lớn nhất}Max:=0;For i:=1 To m Do Max:=Max+A;{Tìm các dãy con khác}For i:=2 To n-m+1 DoBegin{Tính tổng của dãy con thứ i}S:=0;For j:=i To i+m-1 Do S:=S+A;If S>Max Then {Nếu dãy con tìm được có tổng lớn hơn dãy con trước}BeginMax:=S; {Thay tổng mới}k:=i; {Thay vị trí đầu tiên của dãy con mới}End;End;Writeln("Day con co tong lon nhat la:");For i:=k To k+m-1 Do Write(A:5);Readln;End.

Bài tập 5.12: Viết chương trình in ra màn hình tam giác Pascal. Ví dụ, với n=4 sẽ in ra hình sau:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

Ý tưởng:Tam giác Pascal được tạo ra theo qui luật sau:+ Mỗi dòng đều bắt đầu và kết thúc bởi số 1.+ Phần tử thứ j ở dòng k nhận được bằng cách cộng 2 phần tử thứ j-1 và j ở dòng thứ k-1.

Uses Crt;Var Dong:Array<0..20> Of Byte;n,i,j:Byte;BeginWrite("n= "); Readln(n);Clrscr;Dong<0>:=1;Writeln(Dong<0>:4);{Khoi tao gia tri cua dong}For i:=1 To n Do Dong:=0;{Voi moi dong i}For i:=1 To n DoBeginFor j:=i DownTo 1 DoBeginDong:=Dong+Dong;Write(Dong:4);End;Writeln(Dong:4);End;Readln;End.

BÀI TẬP TỰ GIẢI

Bài tập 5.13: Viết chương trình nhập vào một dãy số thực và số thực x. Thông báo lên màn hình số lượng các phần tử trong dãy bằng x và vị trí của chúng.Bài tập 5.14: Nhập vào một mảng các số nguyên.a/ Xếp lại mảng đó theo thứ tự giảm dần.b/ Nhập vào một số nguyên từ bàn phím. Chèn số đó vào mảng sao cho mảng vẫn có thứ tự giảm dần. (không được xếp lại mảng)Gợi ý:- Tìm vị trí cần chèn: i.- Đẩy các phần tử từ vị trí i tới n sang phải 1 vị trí.- Gán: A=x;Bài tập 5.15: Cho 2 mảng số nguyên: Mảng A có m phần tử, mảng B có n phần tử.a/ Sắp xếp lại các mảng đó theo thứ tự giảm dần.b/ Trộn 2 mảng đó lại thành mảng C sao cho mảng C vẫn có thứ tự giảm dần (Không được xếp lại mảng C).Gợi ý:- Dùng 2 chỉ số i,j để duyệt qua các phần tử của 2 mảng A, B và k là chỉ số cho mảng C.- Trong khi (i{Tức là khi đồng thời cả 2 dãy A, B đều chưa duyệt hết}+ Nếu A>B thì: C:=A; i:=i+1;+ Ngược lại: C:=B; j:=j+1;- Nếu dãy nào hết trước thì đem phần còn lại của dãy kia bổ sung vào cuối dãy C.Bài tập 5.16: Viết chương trình tính tổng và tích 2 ma trận vuông A, B cấp n.Gợi ý:Công thức tính tổng 2 ma trận: Cij = Aij + BijCông thức tính tích 2 ma trận: Cij =Bài tập 5.17: Viết chương trình nhập vào 2 dãy số nguyên (a)n và (b)m, m£n. Kiểm tra xem dãy {b} có phải là dãy con của dãy {a} không?Bài tập 5.18: Viết chương trình nhập vào một dãy số nguyên a1, a2, , an. Tìm trong dãy {a} một dãy con tăng dần dài nhất (có số phần tử lớn nhất) và in ra màn hình dãy con đó.


Bài tập 5.19: Cho mảng 2 chiều A cấp mxn. Viết chương trình sắp xếp lại mảng A theo yêu cầu sau:a/ Các phần tử trên mỗi dòng được sắp xếp theo thứ tự giảm dần.b/ Các dòng được sắp xếp lại theo thứ tự tăng dần của tổng các phần tử trên mỗi dòng.Bài tập 5.20: Viết chương trình để kiểm tra một dãy các số nguyên được nhập vào từ bàn phím đã được sắp theo thứ tự tăng dần hay chưa theo 2 cách: Đệ qui và không đệ qui.Gợi ý:- Nếu dãy có 1 phần tử thì dãy tăng dần.- Ngược lại:+ Nếu A>A thì dãy không tăng dần.+ Ngược lại: Gọi đệ qui với dãy có n-1 phần tử (bỏ bớt đi phần tử cuối cùng).Bài tập 5.21: Viết chương trình nhập vào 2 mảng số nguyên A, B đại diện cho 2 tập hợp (không thể có 2 phần tử trùng nhau trong một tập hợp). Trong quá trình nhập, phải kiểm tra: nếu phần tử vừa nhập vào đã có trong mảng thì không bổ sung vào mảng.a/ In ra màn hình hợp của 2 tập hợp A, B.b/ In ra màn hình hiệu của 2 tập hợp A, B.Gợi ý:a/- In ra màn hình tất cả các phần tử của tập hợp A.- Duyệt qua tất cả các phần tử b­i­ÎB. Nếu biÏA thì in bi ra màn hình.b/ Duyệt qua tất cả các phần tử a­i­ÎA. Nếu aiÏB thì in ai ra màn hình.Bài tập 5.22: Viết chương trình tính tổng của 2 đa thức h(x) = f(x) + g(x). Trong đó, mỗi đa thức có dạng: a0 + a1x + a2x2 + + anxn.Gợi ý:Dùng các mảng A, B, C để lưu trữ các hệ số ai của các đa thức f(x), g(x) và h(x).

Xem thêm: Soạn Văn 10 Tập 2 Phú Sông Bạch Đằng (Trương Hán Siêu), Phú Sông Bạch Đằng

Bài tập 5.23: Viết chương trình để tìm các phương án đặt 8 quân hậu trên bàn cờ vua (ma trận 8×8) sao cho các quân hậu không ăn được nhau.Gợi ý:Dùng giải thuật quay lui.Bài tập 5.24: Viết chương trình tính định thức của ma trận vuông cấp n.Gợi ý:Dùng cách tính định thức theo phương pháp GAUSE.