Khai báo và sử dụng mảng 1 Khái niệm và phân loại mảng

Một phần của tài liệu Đề Cương Môn Kỹ Thuật Lập Trình Trường Cao Đẳng Công Nghiệp Hà Nội (Trang 50 - 55)

1. Khái niệm và phân loại mảng

a. Khái niệm về mảng

Để biểu diễn một dãy số hay một bảng số ta có thể dùng nhiều biến, cách này không tiện lợi do các nhược điểm sau:

- Chương trình viết dài không cần thiết.

- Dễ gây nhầm lẫn.

- Không khả thi trong trường hợp số phần tử của dãy, bảng số quá lớn.

Để khắc phục những nhược điểm trên, người ta đưa ra một kiểu dữ liệu mảng.

Mảng là kiểu dữ liệu để khai báo một tập hợp nhiều phần tử có cùng kiểu và chung một tên. Mỗi phần tử như vậy gọi là một phần tử của mảng.

Nói chung, mảng có các đặc điểm sau:

- Mỗi phần tử của mảng biểu diễn một giá trị.

- Mỗi phần tử của mảng được đánh chỉ số cho phép truy cập tới phần tử đó.

- Để dùng kiểu mảng ta cần xác định rõ:

+ Loại mảng: kiểu của mỗi phần tử của mảng (float, int, double…) + Tên mảng(hay tên biến có kiểu mảng): Tùy ý đặt theo quy ước

đặt tên biến.

+ Số chiều và kích thước mỗi chiều.

b. Phân loại mảng

Dựa vao số chiều của mảng người ta chia ra:

- Mảng một chiều: dùng để lưu dãy các giá trị cùng kiểu. Chỉ số của

mảng được đánh từ 0. Như vậy phân tử thứ i trong mảng được đánh chỉ số là i-1.

VD: Một mảng có tên là a. Khi đó:

Phần tử thứ nhất của mảng là a[0].

Biªn so¹n: NguyÔn M¹nh Cêng Trang 5 0

Phần tử thứ 2 của mảng là a[1]….

Mảng hai chiều: Dùng để lưu trữ một bảng các giá trị cùng kiểu.

Các cột và dòng được đánh chỉ số từ 0. Như vậy, phần tử tại dòng i, cột j đánh chỉ số là [i-1][j-1].

VD: Với mảng hai chiều a ta có:

Phần tử tại dòng 1 cột 1: a[0][0]. Phần tử tại cột 1 dòng 2: a[0][1]. …

2. Khai báo mảng

a. Mảng một chiều

Cú pháp:

<Kiểu mảng> <tên mảng> <[Kichs thuớc]>;

Trong đó:

+ <Kiểu mảng>: có thể là các kiểu chuẩn như float, int, double, long…hoặc kiểu tự định nghĩa.

+ <Tên mảng> : hay tên biến mảng, tùy ý đặt theo quy ước đặt tên biến.

+ <Kích thước>: dùng để xcá định số phần tử tối đa của mảng.

VD: float a[10];

Sẽ khai báo một biến mảng các giá trị kiểu thực, số phần tử tối đa là 10. Các phần tử được đánh chỉ số a[0], a[1], …, a[9].

b. Mảng hai chiều:

Tương tự như mảng một chiều ta có:

<Kiểu mảng> <tên mảng> <[Số dòng] [số cột]>;

Với <[số dòng] [số cột]>: chỉ ra kích thước mỗi chiều của mảng.

VD: double b[3][2];

Sẽ khai báo một mảng 2 chiều có 3 dòng, 2 cột với các phân tử kiểu double. Các phần tử được đánh chỉ số như sau:

b[0][0] b[0][1] b[1][0] b[1][1] b[2][0] b[2][1]

3. Sử dụng mảng

a. Lấy địa chỉ các phần tử

Với mảng một chiều, ta vẫn sử dụng phép lấy địa chỉ thông thường

VD: để lấy địa chỉ phần tử a[i] ta viết: &a[i].

Với mảng hai chiều: nói chung không cho phép lấy địa chỉ của các phần tử mảng. Như vậy, không chấp nhận cách viết: & a[i][j]. Với C+ +3.0 trở lên, ta vẫn có thể sử dụng phép lấy địa chỉ các phần tử mảng thực hai chiều với các file chương trình có phần mở rộng .CPP.

b. Duyệt mảng

Với mảng một chiều có n phần tử, để duyệt qua các phần tử của mảng ta có thể sử dụng 1 vòng lặp for sau:

for(int i=0; i<n; i++) {

Truy cập tới hần tử có chỉ số i; }

VD: Nhập dữ liệu cho một mảng gồm 10 phần tử nguyên.

int a[10];

for(int i=0; i<10; i++) {

printf(“Nhập A[%d] : “,i); scanf(“%d”, &a[i]);

}

Với mảng 2 chiều có n dòng, m cột, ta có thể sử dụng 2 vòng for lồng nhau:

for(int i=0; j<n; i++) for(int j=0; j<m; j++)

{

Truy cập tới phần tử có chỉ số [i][j]; }

VD: Nhập dữ liệu cho mảng thực 2 chiều 5 dòng, 3 cột:

float a[5][3]; float tg;

for(int i=0; i<5; i++) for(int j=0; j<3; j++)

{

Biªn so¹n: NguyÔn M¹nh Cêng Trang 5 2

printf(“Nhập a[%d][%d]: “,i, j); scanf(“%f”, &tg); a[i][j] = tg; }

Chú ý: Vì các file .h trong C không chấp nhận phép lấy địa chỉ các

phần tử mảng hai chiều nên ta không thể viết trực tiếp:

scanf(“%f”, &a[i][j]);

Mà cần sử dụng một biến trung gian tg có cùng kiểu để làm trung gian trong quá trình nhập dữ liệu. Sau đó, ta gán a[i][j] bằng giá trị tg

vừa nhập này. Tuy nhiên, từ C 3.0 trở lên, vẫn cho phép lấy địa chỉ của phần tử mảng 2 chiều như thường.

c. Vấn đề tạo dáng ma trận

Để tạo giáng ma trận, ta sử dụng câu lệnh gotoxy(). Câu lệnh này có tác dụng đưa con trỏ màn hình tới các tọa độ màn hình đã chỉ ra trong các tham số để nhập hoặc xuất các phần tử của mảng.

Cú pháp: gotoxy(X, Y);

Với X là tọa độ theo phương X (cột X) của màn hình, có giá trị từ 1 tới 80.

Y là tọa độ theo phương Y (dòng Y) của màn hình, có giá trị từ 1 tới 25.

1 8

0

25 5

Như vậy, ta có thể sử dụng câu lệnh gotoxy trong vòng lặp như sau

for (i=0; i<n; i++) for(j = 0; j <m; j++)

{

gotoxy(X + j *n, Y + i*m); cout<<a[i][j];

}

Trong đó : X, Y là toạ độ đỉnh trái, trên của ma trận; n, m là các bước nhảy theo trục x và trục y. Thông thường, ta chọn n = 3 và m = 1.

X

4. Các ví dụ minh họa

Viết chương trình nhập vào một mảng n số nguyên. Sắp xếp mảng theo chiều tăng dần và in kết quả ra màn hình.

#include <conio.h> #include <stdio.h> #include <iostream.h> void main() { int a[100]; int tg, n, j; printf(“Nhập n “); scanf(“%d”, &n); for(int i=0; i<n; i++) {

printf(“Nhập a[%d]: “,i); scanf(“%d”, &a[i]); }

for(i=0; i<n-1; i++) for(j=i+1; j<n; j++) if (a[i]>a[j]) { tg=a[i]; a[i] = a[j]; a[j] = tg; }

printf(“mảng sau khi sắp”); for (i=0; i<n; i++)

printf(“%d “, a[i]); getch(); } VD2: Nhập một ma trận số nguyên gồm n dòng, m cột. In ma trận vừa nhập và phần tử lớn nhất ra màn hình. #include <conio.h> #include <stdio.h> #include <iostream.h> void main() { int a[100][100]; int n, m, Max, tg; printf(“Nhập số dòng “); scanf(“%d”, &n); printf(“Nhập số cột “); scanf(“%d”, &m); for(int i=0; i<n; i++)

Biªn so¹n: NguyÔn M¹nh Cêng Trang 5 4

for(int j=0; j<m; j++) { printf(“Nhập a[%d][%d]: “, i, j); scanf(“%d”, &tg); a[i][j] = tg; } Max = a[0][0]; for(i=0; i<n; i++) for(j=0; j<m; j++) { if(a[i][j]>Max) Max = a[i][j]; printf(“%d\n”, a[i][j]); } printf(“Phần tử lớn nhất %d“, Max); getch(); }

Một phần của tài liệu Đề Cương Môn Kỹ Thuật Lập Trình Trường Cao Đẳng Công Nghiệp Hà Nội (Trang 50 - 55)