I/- Khai báo:
- Khai báo gián tiếp:
Type
[Tên mảng] = ARRAY [tập chỉ số ,.] OF
Var
[Tên biến]:[Tên mảng];
Tập chỉ số phải là kiểu miền con, kiểu vô hướng liệt kê, kiểu char hoặc kiểu Boolean.
Ví dụ: Type
Vecto = ARRAY [1.20] OF Integer ;
CHƯƠNG 5: KIỂU MẢNG I/- Khai báo: - Khai báo gián tiếp: Type [Tên mảng] = ARRAY [tập chỉ số ,....] OF ; Var [Tên biến]:[Tên mảng]; Tập chỉ số phải là kiểu miền con, kiểu vô hướng liệt kê, kiểu char hoặc kiểu Boolean. Ví dụ: Type Vecto = ARRAY [1..20] OF Integer ; Var Vt:Vecto ; - Khai báo trực tiếp: [Tên biến]: ARRAY[tập chỉ số ,....] OF ; Ví dụ: Var Vt: ARRAY [1..20] OF Integer ; Chú ý: + Khi khai báo mảng chỉ gồm một tập chỉ số thì mảng đó được gọi là mảng một chiều (vectơ) + Khi khai báo mảng chỉ gồm hai tập chỉ số thì mảng đó được gọi là mảng hai chiều (ma trận) II/- Truy xuất các phần tử của mảng: Mỗi phần tử của mảng được truy xuất thông qua Tên biến mảng cùng với chỉ số của mảng để trong cập dấu [ ]. Chẳng hạn Vt[1] chỉ phần tử thứ nhất của mảng Vt. Mảng được dùng khi cần làm việc với một dãy các giá trị. Các giá trị này được đặt cùng một tên và được phân biệt với nhau bởi các giá trị của chỉ số, vì thế chúng còn có tên là biến chỉ số. Ví dụ: Viết chương trình nhập số liệu từ bàn phím cho một mảng gồm 5 phần tử và in các phần tử đó ra màn hình. Program Chuong_trinh_nhập_xuât_du_lieu_tu_mang; Var i: integer; Vt:Array[1..5] of Integer; Begin { Doc du lieu vao mang Vt} For i:=1 to 5 do Begin Write(‘Nhap vao phan tu thu Vt[‘,i,’]: ‘);readln(Vt[i]); end; { Lay du lieu tu mang Vt} For i:=1 to 5 do Begin Write(‘Phan tu thu Vt[‘,i,’]: ‘);Writeln(Vt[i]); end; Readln; End. Ví dụ 2: Nhập vào một dãy n số và sắp xếp theo thứ tự từ nhỏ đến lớn. Ta có thể làm như sau: Đầu tiên đưa phần tử thứ nhất lần lượt so sánh với các phần tử tiếp theo, nếu nó lớn hơn phần tử so sánh thì đem đổi chỗ giá trị của hai phần tử cho nhau. Sau đó đem phần tử thứ hai so sánh với các phần tử còn lại....cứ như vậy cho đến phần tử thứ n-1. Program sapxep; Var a:array[1..20] of integer; n,i,j,tam,tong:integer; Begin { *************Nhap day so***************} Write(‘Day co bao nhieu phan tu ?’);readln(n); For i:=1 to n do Begin Write(‘Nhap a[’,i,’]= ‘);readln(a[i]); end; { *************Sap xep day so*************} For i:=1 to n -1 do For j:= i+1 to n do If a[i]>a[j] then Begin tam:=a[i]; a[i]:=a[j]; a[j]:=tam; end; { *************In day so ra man hinh*************} For i:=1 to n do Write(a[i],’ ‘); { *************Tinh tong cac so trong mang*************} Tong:=0; Writeln; For i:=1 to n do Tong:=Tong+a[i]; Writeln(‘Tong cua mang la: ‘,Tong); readln; End. BÀI TẬP Bài 1: VCT nhập vào một dãy các số theo thứ tự tăng, nếu nhập sai quy cách thì yêu cầu nhập lại. In dãy số sau khi đã nhập xong. Nhập thêm một số mới và chèn số đó vào dãy đã có sao cho dãy vẫn đảm bảo thứ tự tăng. In lại dãy số đã kiểm tra. Để thực hiện chương trình này ta sử dụng giải thuật sau: - Nhập số phần tử của mảng (mảng có bao nhiêu phần tử). - Dùng vòng lặp For để nhập giá trị cho từng phần tử từ bàn phím - Do nhập theo thứ tự tăng dần nên trong lúc nhập ta dùng vòng lặp While để kiểm tra điều kiện: + Trong khi a[i] < a[i-1] thì thông báo lỗi và yêu cầu nhập lại - In dãy số đã nhập ra màn hình để kiểm tra. - Yêu cầu người dùng nhập vào số mới. - Sắp xếp các phần tử trong mảng sao cho có thứ tự tăng dần. - In dãy số để kiểm tra. Bài 2: VCT tính trung bình cộng cho n phần tử số nguyên của mảng được nhập vào từ bàn phím. Sau đó in kết quả ra màn hình. Để thực hiện chương trình này ta sử dụng giải thuật sau: - Nhập số phần tử của mảng (mảng có bao nhiêu phần tử). - Dùng vòng lặp For để nhập giá trị cho từng phần tử từ bàn phím - Tính tổng và trung bình cộng. - Xuất kết quả ra màn hình (trung bình cộng của mảng). Bài 3: VCT nhập một mảng các số nguyên sau đó tìm trị nhỏ nhất, trị lớn nhất và vị trí của chúng. Để thực hiện chương trình này ta sử dụng giải thuật sau: - Nhập số phần tử của mảng (mảng có bao nhiêu phần tử). - Dùng vòng lặp For để nhập giá trị cho từng phần tử từ bàn phím - Gán giá trị Max, Min là phần tử đầu tiên của mảng. - Gán vị trí Max, Min bằng 1 (vị trí đầu tiên). - Dùng vòng lặp For để so sánh các phần tử của mảng. + Nếu một phần tử a[i] > Max thì Max := a[i] và vị trí Max := i + Nếu một phần tử a[i] < Min thì Min := a[i] và vị trí Min := i - In kết quả tìm được ra màn hình. Ví dụ: Giả sử ta có mảng như sau: Vị trí: 1 2 3 4 5 14 12 2 10 18 ==> Max = 18 Vị trí Max = 5 ==> Min = 2 Vị trí Min = 3 Bài 4: VCT nhập vào một mảng gồm n số thực. Xuất ra màn hình những phần tử sai khác với trị trung bình cộng của mảng không quá một. Để thực hiện chương trình này ta sử dụng giải thuật sau: - Nhập số phần tử của mảng (mảng có bao nhiêu phần tử). - Dùng vòng lặp For để nhập giá trị cho từng phần tử từ bàn phím - Tính tổng và trung bình cộng. - Dùng vòng lặp For để so sánh từng phần tử của mảng với trị trung bình. - Nếu trị tuyệt đối của pầhn tử a[i] trừ trị trung bình mà nhỏ hơn hay bằng 1 thì in phân tử đó ra màn hình. Ví dụ: Mảng có 4 phần tử như sau: 1.5 1.2 1.0 1.6 Trung bình cộng của mảng là: 1.3 ==> số phần tử thoả là: 1.5 1.2 1.0 1.6 Bài 5: VCT chèn thêm một số vào vị trí thứ n của một mảng số nguyên. Để thực hiện chương trình này ta sử dụng giải thuật sau: - Nhập số phần tử của mảng (mảng có bao nhiêu phần tử). - Dùng vòng lặp For để nhập giá trị cho từng phần tử từ bàn phím - In kết quả ra màn hình để kiểm tra - Yêu cầu người dùng nhập vào số cần chèn và vị trí chèn - Dùng vòng lặp For ......Downto để thay đổi vị trí của các phần tử trong mảng bắt đầu từ phần tử cuối cộng thêm 1 (n+1) đến vị trí cần chèn a[i] := a[i-1] (lưu ý lúc này số phần tử trong mảng tăng thêm 1). - Thêm số mới vào vị trí trống. - In kết quả ra màn hình để kiểm tra . Ví dụ: Giả sử mảng có 4 phần tử (n = 4) là :1,2,3,4 1 2 3 4 ==> Khi ta thêm phần tử thứ năm là 8 vào vị trí thứ 3 thì ta có hình như sau: 1 2 8 3 4 ==> Lúc này n= 4+1 = 5 Bài 6: VCT xoá phần tử thứ n trong mảng các số nguyên. Để thực hiện chương trình này ta sử dụng giải thuật sau: - Nhập số phần tử của mảng (mảng có bao nhiêu phần tử). - Dùng vòng lặp For để nhập giá trị cho từng phần tử từ bàn phím - In kết quả ra màn hình để kiểm tra - Yêu cầu người dùng nhập vào vị trí cần xoá. - Dùng vòng lặp For ......to để thay đổi vị trí của các phần tử trong mảng bắt đầu từ vị trí cần xoá trở về sau a[i] := a[i+1] (lưu ý lúc này số phần tử trong mảng giảm 1). - In kết quả ra màn hình để kiểm tra . Ví dụ: Giả sử mảng có 4 phần tử (n = 4) là :1,2,3,4 1 2 3 4 ==> Khi ta xoá phần tử ở vị trí thứ 3 thì ta có hình như sau: 1 2 4 ==> Lúc này n= 4 -1 = 3 Bài giải Bài 1: Program Chenso; Uses crt; Var a: array[1..20] of integer; n,i,k,j,tam:integer; Begin {nhap day so} clrscr; write('Day co bao nhieu phan tu: ');readln(n); writeln('Nhap day so theo thu tu tang:'); writeln; write('Nhap phan tu thu a[1]: ');readln(a[1]); For i:=2 to n do begin write('Nhap phan tu thu a[',i,']: ');readln(a[i]); While a[i]<a[i-1] do {kiem tra so khi nhap vao} begin write('Ban da nhap sai, hay nhap lai!'); readln(a[i]); end; end; {In day so} For i:=1 to n do write(a[i]:5); writeln; {Yeu cau nguoi dung nhap vao so moi} write('Nhap so can chen vao: ');readln(a[n+1]); {Sap xep lai cac phan tu trong mang theo thu tu tang} For i:=1 to n do For j:=i+1 to n+1 do If a[i]>a[j] then begin tam:=a[i]; a[i]:=a[j]; a[j]:=tam; end; {In day so de kiem tra} For i:=1 to n+1 do Write(a[i]:5); writeln; write('Bam phim Enter de dung'); Readln; End. Bài 2: Program Trung_binh_cong; uses crt; Var so:array[1..100] of integer; Tong,i,n: integer; tb:real; Begin Clrscr; write('Mang co bao nhieu phan tu: ');readln(n); Tong:=0; For i:=1 to n do begin write('so thu: ',i:2,'='); readln(so[i]); tong:=tong+so[i]; end; tb:=tong/n; writeln; writeln('Tri trung binh cong cua:',n:3,' so nguyen = ',tb:8:2); writeln('Nhan phim Enter de ket thuc'); Readln; End. Bài 3: Program Lon_nho; uses crt; Var a:array[1..100] of integer; max,min,i,n:integer; vtmax,vtmin:integer; Begin clrscr; write('Mang co bao nhieu phan tu: ');readln(n); For i:=1 to n do begin write('Nhap vao phan tu thu',i:2,' = '); readln(a[i]); end; Max:=a[1]; vtmax:=1; Min:=a[1]; vtmin:=1; For i:=1 to n do begin If a[i]>Max then begin Max:=a[i]; vtmax:=i; end; If a[i]<Min then begin Min:=a[i]; vtmin:=i; end; end; writeln('+ Tri lon nhat: ',Max:3,' o vi tri thu: ',vtmax); writeln('+ Tri nho nhat: ',Min:3,' o vi tri thu: ',vtmin); readln; End. Bai 4: Program Sai_khac_tbc; uses crt; Var a:array[1..100]of real; n,i:integer; tong,tb:real; Begin clrscr; write('Mang co bao nhieu phan tu: ');readln(n); tong:=0; For i:=1 to n do begin write('Phan tu thu: ',i:2,' = ');readln(a[i]); tong:=tong+a[i]; end; tb:=tong/n; writeln('Trung binh cong cua: ',n:3,' phan tu = ',tb:8:2); writeln('Cac so sai khac voi Tb khong qua 1 la: '); For i:=1 to n do If ABS(a[i]-tb)<=1 then write(a[i]:8:2,''); Readln; End. Bài 5: Program Chen; uses crt; Var a:array[1..100]of integer; i,n,so,vitri:integer; Begin clrscr; write('Mang co bao phan tu: ');readln(n); For i:=1 to n do begin write('Phan tu thu ',i,' = '); readln(a[i]); end; writeln('Mang truoc khi chen'); For i:=1 to n do write(a[i]:6); writeln; write('Nhap vao so can chen: ');readln(so); write('Nhap vao vi tri can chen: ');readln(vitri); {thay doi vi tri cua cac phan tu trong mang} For i:= n+1 downto vitri+1 do a[i]:=a[i-1]; a[vitri]:=so; write('Mang sau khi chen'); for i:=1 to n+1 do write(a[i]:6); Readln; End. Bài 6: Program Xoa; uses crt; Var a:array[1..100]of integer; i,n,vitri:integer; Begin clrscr; write('Mang co bao phan tu: ');readln(n); For i:=1 to n do begin write('Phan tu thu ',i,' = '); readln(a[i]); end; writeln('Mang truoc khi chen'); For i:=1 to n do write(a[i]:6); writeln; write('Nhap vao vi tri can xoa: ');readln(vitri); {thay doi vi tri cua cac phan tu trong mang} For i:=vitri to n-1 do a[i]:=a[i+1]; write('Mang sau khi chen'); for i:=1 to n-1 do write(a[i]:6); Readln; End.
Tài liệu đính kèm: