Giáo trình Nhập môn Tin học LỜi nóI ĐẦU



tải về 4.67 Mb.
trang52/63
Chuyển đổi dữ liệu20.05.2018
Kích4.67 Mb.
1   ...   48   49   50   51   52   53   54   55   ...   63

7.1. Kiểu mảng

7.1.1 Khái niệm


Chúng ta đã làm quen với các kiểu dữ liệu đơn giản là các kiểu dữ liệu vô hướng (integer, real, char, string, boolean). Trong Pascal tồn tại các kiểu dữ liệu có cấu trúc, chúng được tạo từ các kiểu dữ liệu đơn giản theo một qui tắc nào đó. Dữ liệu có cấu trúc được đặc trưng bằng kiểu dữ liệu của các phần tử, phương pháp cấu thành kiểu dữ liệu.

Khi một số hữu hạn các phần tử có cùng kiểu, được đặt tên chung và phân biệt với nhau nhờ thứ tự cách sắp xếp thì ta gọi là dữ liệu có cấu trúc kiểu mảng (array). Số phần tử của mảng được xác định ngay từ khi định nghĩa ra mảng, các phần tử của mảng được truy xuất thông qua tên mảng và chỉ số được để giữa 2 ngoặc vuông [ ].

Trong thực tế, mảng có ứng dụng rất lớn nhất là đối với các bài toán kỹ thuật, như lưu trữ một dãy tài liệu của các trạm đo, lưu giá trị các phần tử trên các nút mạng trong bài toán sai phân...



* Kiểu dữ liệu kiểu mảng có những đặc trưng sau:

- Các phần tử mảng phải cùng kiểu dữ liệu với nhau.

- Mỗi phần tử trong mảng được gắn với một chỉ số, đó chính là vị trí của phần tử trong mảng hay có thể truy cập trực tiếp tới từng phần tử của mảng thông qua biến mảng và chỉ số.

- Các phần tử trong mảng được sắp thứ tự trước sau thông qua chỉ số của nó



+ mảng một chiều: A[i] đứng trước A[j] nếu i

+ mảng hai chiều: A[i1,j1] đứng trước A[i2, j2] nếu i12

hoặc nếu i1=i2 và j12.

- Các chỉ số có của các phần tử trong cùng một mảng phải cùng kiểu dữ liệu với nhau gọi chung là kiểu chỉ số, kiểu chỉ số phải là kiểu hữu hạn đếm được.

Dưới đây sẽ trình bày về khai báo mảng một chiều và mảng hai chiều:


7.1.2 Khai báo mảng một chiều


Có thể khai báo mảng bằng hai cách: khai báo trực tiếp và khai báo thông qua định nghĩa kiểu TYPE.

  • Khai báo trực tiếp:

VAR Tên_biến_mảng: ARRAY[kiểu chỉ số] OF kiểu phần tử;

Trong đó:

- kiểu chỉ số: là cách tổ chức các phần tử của mảng, cách truy nhập vào các phần tử của mảng, nó có thể là các kiểu dữ liệu đơn giản vô hướng đếm được, hữu hạn giá trị.

- kiểu phần tử: là kiểu dữ liệu của các phần tử của mảng, có thể là bất kỳ kiểu dữ liệu nào.



Ví dụ 7.1: Khai báo mảng trực tiếp:

VAR X : array[1..15] of integer;

HT: array[1..50] of string[30];

Trong khai báo trên:

- X là mảng một chiều có thể được xem như là một dãy số có tối đa 15 phần tử, các phần tử được đánh số từ 1 đến 15 và có cùng kiểu nguyên.

- HT là mảng một chiều có thể được xem như là một dãy có tối đa 50 phần tử, các phần tử được đánh số từ 1 đến 15 và có cùng kiểu xâu có tối đa 30 ký tự.



  • Khai báo gián tiếp:

TYPE Tên_kiểu_mảng = ARRAY[kiểu chỉ số] OF kiểu_phần_tử;

VAR Tên_biến_mảng : Tên_kiểu_mảng;

Trong các khai báo trên, chỉ số só thể là kiểu miền con, hoặc kiểu liệt kê vô hướng
Ví dụ 7.2: Khai báo mảng gián tiếp: khai báo mảng trực tiếp như trong ví dụ 5.1 tương đương với cách khai báo gián tiếp như sau:

TYPE M1 = array[1..15] of integer;

M2 = array[1..50] of string[30];

VAR X : M1;

HT : M2;


  • Truy cập đến từng phần tử của mảng 1 chiều theo cú pháp:

Tên_biến_mảng[chỉ_số]
Ví dụ 7.3: với khai báo mảng trong ví dụ 7.2

M1[1] là chỉ phần tử thứ nhất trong mảng M1

M1[i] là chỉ phần tử thứ i trong mảng M1

7.1.3. Khai báo mảng hai chiều


  • Khai báo trực tiếp:

VAR Tên_biến_mảng : ARRAY[chỉ_số_hàng, chỉ_số_cột] OF kiểu_phần_tử;

Trong đó:

- chỉ_số_hàng, chỉ_số_cột: là cách tổ chức các phần tử của mảng, cách truy nhập vào các phần tử của mảng, nó có thể là các kiểu dữ liệu đơn giản vô hướng đếm được, hữu hạn giá trị.

- kiểu_phần_tử: là kiểu dữ liệu của các phần tử của mảng, có thể là bất kỳ kiểu dữ liệu nào.


Ví dụ 7.4: Khai báo mảng trực tiếp:

VAR X : array[1..15,1..5] of integer;

HT: array[1..50,1..50] of string[30];

Trong khai báo trên:

- X là mảng hai chiều có thể được xem như là một ma trận có tối đa 75 (tối đa là 15 hàng và tối đa 5 cột), các phần tử có kiểu nguyên.

- HT là mảng hai chiều có thể được xem như là một ma trận có tối đa 50 hàng và 50 cột, các phần tử có kiểu xâu có tối đa 30 ký tự.



  • Khai báo gián tiếp:

TYPE Tên_kiểu_mảng = ARRAY[chỉ_số_hàng, chỉ_số_cột] OF kiểu_ phần_tử;

VAR Tên_biến_mảng : Tên_kiểu_mảng;


* Chú ý: Trong các khai báo trên, chỉ số só thể là kiểu miền con, hoặc kiểu liệt kê vô hướng
Ví dụ 7.5: Khai báo mảng gián tiếp: khai báo mảng trực tiếp như trong ví dụ 5.1 tương đương với cách khai báo gián tiếp như sau:

TYPE M1 = array[1..15,1..5] of integer;

M2 = array[1..50,1..50] of string[30];

VAR X : M1;

HT: M2;


  • Truy cập đến từng phần tử của mảng 2 chiều theo cú pháp:

Tên_biến_mảng[chỉ_số_hàng, chỉ_số_cột]
Ví dụ 7.6: với khai báo mảng trong ví dụ 7.5

M1[1,1] là chỉ phần tử ở hàng 1, cột 1 trong mảng M1

M1[i,j] là chỉ phần tử ở hàng i, cột j trong mảng M1

* Chú ý: Thực chất mảng hai chiều là màng một chiều mà các phần tử của nó là một mảng một chiều.

7.1.4. Các phép toán trên mảng


* Phép gán:

- Có thể thực hiện gán hai biến mảng cho nhau nếu chúng cùng kiểu dữ liệu với nhau.



Ví dụ 7.7: Với khai báo mảng sau:

TYPE dayso = array[1..50] of integer;

VAR a,b:dayso; {a và b được gọi là cùng kiểu dữ liệu với nhau}

c,d: array[1..50] of integer;



{c và d cùng kiểu dữ liệu với nhau nhưng không cùng kiểu với a và b}

Ta có thể thực hiện các phép gán sau:

a:=b; b:=a; c:=d; d:=c;

- Các phần tử trong một mảng sẽ có các phép toán của kiểu dữ liệu của nó.


Ví dụ 7.8: Với khai báo mảng ở ví dụ 7.7 ta có

Các phần tử a[i] có kiểu dữ liệu là kiểu integer nên nó có mọi tính chất như một biến có kiểu integer.


* Phép so sánh

- Không được sử dung bất kỳ phép so sánh nào với biến có kiểu dữ liệu là kiểu mảng.

- Nếu kiểu phần tử của mảng có thực hiện được các phép so sánh thì có thể thực hiện các phép so sánh giữa các phần tử có cùng kiểu dữ liệu với nhau.

7.1.5. Nhập và in dữ liệu của mảng


7.1.5.1. Nhập dữ liệu cho mảng

Để nhập dữ liệu cho mảng ta cũng sử dụng câu lệnh read hay readln, tuy nhiên không được phép sử dụng các lệnh nhập dữ liệu cho biến mảng mà chỉ sử dụng cho từng phần tử trong mảng. Do vậy để nhập dữ liệu cho mảng ta phải nhập dữ liệu cho từng phần tử trong mảng.

  • Nhập dữ liệu cho mảng một chiều ta sử dụng một vòng FOR như sau:

Ví dụ cho mảng A được khai báo như sau:

Var A:array[1..100] of integer;

Nhập dữ liệu cho mảng A như sau:

For i:=1 to 100 do

Readln(A[i]);

Sử dụng vòng lặp FOR để duyệt hết mảng A, ứng với mỗi giá trị của i ta thực hiện nhập dữ liệu cho phần tử ở vị trí thứ i trong mảng A.



  • Nhập dữ liệu cho mảng hai chiều ta sử dụng hai vòng FOR lồng nhau như sau:

Ví dụ cho mảng A được khai báo như sau:
Var A:array[1..50,1..50] of integer;
Nhập dữ liệu cho mảng A như sau:

For i:=1 to 50 do

For j:=1 to 50 do

Readln(A[i,j]);

Sử dụng hai vòng lặp FOR để duyệt hết mảng A, thực hiện duyệt hết theo từng hàng một, ứng với mỗi giá trị của i ta thực hiện nhập dữ liệu cho phần tử trên hàng i, ứng với mỗi giá trị i và j ta thực hiện nhập dữ liệu cho phần tử ở vị trí hàng i, cột j trong mảng A.
7.1.5.1. In dữ liệu mảng lên màn hình

Để in dữ liệu mảng ta cũng sử dụng câu lệnh write hay writeln, tuy nhiên không được phép sử dụng các lệnh in dữ liệu cho biến mảng mà chỉ sử dụng cho từng phần tử trong mảng. Do vậy để in dữ liệu mảng lên màn hình ta phải in dữ liệu từng phần tử trong mảng.


  • In dữ liệu mảng một chiều ta sử dụng một vòng FOR như sau:

Ví dụ cho mảng A được khai báo như sau:

Var A:array[1..100] of integer;

In dữ liệu mảng A như sau:

For i:=1 to 100 do



write(A[i]:5);

Sử dụng vòng lặp FOR để duyệt hết mảng A, ứng với mỗi giá trị của i ta thực hiện in dữ liệu phần tử ở vị trí thứ i trong mảng A.



  • In dữ liệu mảng hai chiều ta sử dụng hai vòng FOR lồng nhau như sau:

Ví dụ cho mảng A được khai báo như sau:

Var A:array[1..50,1..50] of integer;

In dữ liệu mảng A theo dạng bảng như sau:

For i:=1 to 50 do

begin

For j:=1 to 50 do



write(A[i,j]);

writeln; {xuống dòng}

end;


Sử dụng hai vòng lặp FOR để duyệt hết mảng A, thực hiện duyệt hết theo từng hàng một, ứng với mỗi giá trị của i ta thực hiện in dữ liệu từng phần tử trên hàng i, in hết một hàng sẽ xuống dòng để in tiếp dòng tiếp theo, ứng với mỗi giá trị i và j ta thực hiện in dữ liệu phần tử ở vị trí hàng i, cột j lên màn hình.
Ví dụ 7.9: Viết chương trình nhập vào một dãy số có n phần tử nguyên (1<=n<=100).

  • In dãy số đó lên màn hình theo hàng.

  • Tính tổng và trung bình cộng các phần tử trong dãy số đó. In kết quả lên màn hình.

Program vidu_7_9;

Var A: array[1..100] of integer;

S, i, n: integer;

TB:real;

Begin

Write(‘ Nhap so phan tu cua day so n = ‘); readln(n);



Writeln(‘ Nhap tung phan tu trong day so :’);

For i:=1 to n do

Begin

Write(‘a[‘,i,’]= ‘);readln(a[i]);



End;

Writeln(‘ In day so vua nhap vao la ‘);

For i:=1 to n do

Write(a[i]:5);



{Tinh tong va trung binh cong}

S:=0;

For i:=1 to n do

S:=S+a[i];

TB:=S/n;


Writeln(‘ Tong cac phan tu day so S = ‘,S);

Writeln(‘ Trung binh cong TB = ’,TB:8:2);

Readln;

End.


Ví dụ 7.10: Viết chương trình nhập vào một ma trận nguyên cỡ mxn (1<=n, m<=20).

  • In ma trận đó lên màn hình theo bảng.

  • Tính tổng các phần tử âm của ma trận.

Program vidu_7_10;

Var A: array[1..20,1..20] of integer;

S, i, n: integer;

Begin

Write(‘ Nhap so hàng m = ‘); readln(m);



Write(‘ Nhap so cot n = ‘); readln(n);

Writeln(‘ Nhap tung phan tu trong ma tran :’);

For i:=1 to m do

For j:=1 to n do

Begin

Write(‘a[‘,i,’,’,j,’]= ‘);readln(a[i,j]);



End;

Writeln(‘ In ma tran vua nhap theo dang bang: ‘);

For i:=1 to m do

Begin


For j:=1 to n do

Write(a[i,j]:5);

Writeln;

End;


{Tinh tong cac so am trong ma tran}

S:=0;


For i:=1 to m do

For j:=1 to n do

If a[i,j]<0 then

S:=S+a[i,j];

Writeln(‘ Tong cac phan tu am la S = ‘,S);

Readln;


End.
1   ...   48   49   50   51   52   53   54   55   ...   63


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2016
được sử dụng cho việc quản lý

    Quê hương