Lập trình C Aptech - Bài 11: Mảng

Mục tiêu:

 

Kết thúc bài học này, bạn có thể:

 

 Hiểu được các phần tử của mảng và các chỉ số mảng

 Khai báo một mảng

 Hiểu cách quản lý mảng trong C

 Hiểu một mảng được khởi tạo như thế nào

 Hiểu mảng chuỗi/ ký tự

 Hiểu mảng hai chiều

 Hiểu cách khởi tạo mảng nhiều chiều.

 

doc14 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 2066 | Lượt tải: 4download
Tóm tắt nội dung Lập trình C Aptech - Bài 11: Mảng, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
được nhập vào là ap, thì kết quả sẽ là:
	The string is ap
	97 112 0 6 100
Trong ví dụ trên, khi chỉ có hai ký tự được nhập, ký tự thứ ba sẽ là ký tự null. Điều này cho biết là chuỗi đã được kết thúc. Những ký tự còn lại là những ký tự không dự đoán được.
Trong trường hợp trên, tính quan trọng của ký tự null trở nên rõ ràng. Ký tự null xác định sự kết thúc của chuỗi và là cách duy nhất để các hàm làm việc với chuỗi sẽ biết đâu là điểm kết thúc của chuỗi.
Mặc dù C không có kiểu dữ liệu chuỗi, nhưng nó cho phép các hằng chuỗi. Một hằng chuỗi là một dãy các ký tự được đặt trong dấu nháy đôi (“”). Không giống như các hằng khác, nó không thể được sửa đổi trong chương trình. Ví dụ như:
	“Hi Aptechite!”
Trình biên dịch C sẽ tự động thêm vào ký tự null cuối chuỗi.
C hỗ trợ nhiều hàm cho chuỗi, các hàm này nằm trong thư viện chuẩn string.h. Một vài hàm được đưa ra trong bảng 11.1. Cách làm việc của các hàm này sẽ được thảo luận trong bài 17.
Tên hàm
Chức năng
strcpy(s1, s2)
Sao chép s2 vào s1
strcat(s1, s2)
Nối s2 vào cuối của s1
strlen(s1)
Trả về chiều dài của s1
strcmp(s1, s2)
Trả về 0 nếu s1 và s2 là giống nhau; nhỏ hơn 0 nếu s1 s2
strchr(s1, ch)
Trả về một con trỏ trỏ đến vị trí xuất hiện đầu tiên của ch trong s1
strstr(s1, s2)
Trả về một con trỏ trỏ đến vị trí xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1
Bảng 11.1
11.3 Mảng hai chiều:
Chúng ta đã biết thế nào là mảng một chiều. Điều này có nghĩa là các mảng chỉ có một chỉ số. Các mảng có thể có nhiều hơn một chiều. Các mảng đa chiều giúp dễ dàng trình bày các đối tượng đa chiều, chẳng hạn một đồ thị với các dòng và cột hay tọa độ màn hình của máy tính. Các mảng đa chiều được khai báo giống như các mảng một chiều, ngoại trừ có thêm một cặp dấu ngoặc vuông [] trong trường hợp mảng hai chiều. Một mảng ba chiều sẽ cần ba cặp dấu ngoặc vuông,... Một cách tổng quát, một mảng đa chiều có thể được biểu diễn như sau:
	storage_class data_type ary[exp1][exp2]....[expN];
Ở đó, ary là một mảng có lớp là storage_class, kiểu dữ liệu là data_type, và exp1, exp2,..... , expN là các biểu thức nguyên dương xác định số phần tử của mảng được kết hợp với mỗi chiều.
Dạng đơn giản nhất và thường được sử dụng nhất của các mảng đa chiều là mảng hai chiều. Một mảng hai chiều có thể xem như là một mảng của hai ‘mảng một chiều’. Một mảng hai chiều đặc trưng như bảng lịch trình của máy bay, xe lửa. Để xác định thông tin, ta sẽ chỉ định dòng và cột cần thiết, và thông tin được đọc ra từ vị trí (dòng và cột) được tìm thấy. Tương tự như vậy, một mảng hai chiều là một khung lưới chứa các dòng và cột trong đó mỗi phần tử được xác định duy nhất bằng toạ độ dòng và cột của nó. Một mảng hai chiều tmp có kiểu int với 2 dòng và 3 cột có thể được khai báo như sau,
	int tmp[2][3];
Mảng này sẽ chứa 2 x 3 (6) phần tử, và chúng có thể được biểu diễn như sau:
Dòng 
 	Cột
0
1
2
0
e1
e2
e3
1
e4
e5
e6
Ở đó e1 – e6 biểu diễn cho các phần tử của mảng. Cả dòng và cột được đánh số từ 0. Phần tử e6 được xác định bằng dòng 1 và cột 2. Truy xuất đến phần tử này như sau:
	tmp[1][2];
Khởi tạo mảng đa chiều:
Khai báo mảng đa chiều có thể kết hợp với việc gán các giá trị khởi tạo. Cần phải cẩn thận lưu ý đến thứ tự các giá trị khởi tạo được gán cho các phần tử của mảng (chỉ có mảng external và static có thể được khởi tạo). Các phần tử trong dòng đầu tiên của mảng hai chiều sẽ được gán giá trị trước, sau đó đến các phần tử của dòng thứ hai, … Hãy xem sự khai báo mảng sau:
	int ary[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12};
Kết quả của phép khai báo trên sẽ như sau:
ary[0][0] = 1	ary[0][1] = 2	ary[0][2] = 3 	ary[0][3]= 4
ary[1][0] = 5	ary[1][1] = 6	ary[1][2] = 7 	ary[1][3] = 8
ary[2][0] = 9	ary[2][1] = 10	ary[2][2] = 11 	ary[2][3] = 12
Chú ý rằng chỉ số thứ 1 chạy từ 0 đến 2 và chỉ số thứ hai chạy tử 0 đến 3. Một điểm cần nhớ là các phần tử của mảng sẽ được lưu trữ ở những vị trí kế tiếp nhau trong bộ nhớ. Mảng ary ở trên có thể xem như là một mảng của 3 phần tử, mỗi phần tử là một mảng của 4 số nguyên, và sẽ xuất hiện như sau:
Dòng 0
Dòng 1
Dòng 2
1	2	3	4
5	6	7	8
9	10	11	12
Thứ tự tự nhiên mà các giá trị khởi tạo được gán có thể thay đổi bằng hình thức nhóm các giá trị khởi tạo lại trong các dấu ngoặc nhọn {}. Quan sát sự khởi tạo sau:
	int ary [3][4] ={
	 {1, 2, 3},
	 	 {4, 5, 6},
	 {7, 8, 9}
	 };
Mảng sẽ được khởi tạo như sau:
ary[0][0]=1	ary[0][1]=2	ary[0][2]=3	ary[0][3]=0
ary[1][0]=4	ary[1][1]=5	ary[1][2]=6	ary[1][3]=0
ary[2][0]=7	ary[2][1]=8	ary[2][2]=9	ary[2][3]=0
Một phần tử của mảng đa chiều có thể được sử dụng như một biến trong C bằng cách dùng các chỉ số để xác định phần tử của mảng.
Ví dụ 11.5:
/* Chương trình nhập các số vào một mảng hai chiều. */
#include 
void main()
{
	int arr[2][3];
	int row, col;
	for(row = 0; row < 2; row++)
	{
	 for(col = 0; col < 3; col++)
	 {
	 printf(“\nEnter a Number at [%d][%d]: ”, row, col);
	 scanf(“%d”, &arr[row][col]);
	 }
 }
	for(row = 0; row < 2; row++)
	{
	for(col = 0; col < 3; col++)
	{
printf(“\nThe Number at [%d][%d] is %d”,
 row, col, arr[row][col]);
}
 }
}
Một ví dụ về kết quả thực thi chương trình trên như sau:
	Enter a Number at [0][0]: 10
	Enter a Number at [0][1]: 100
	Enter a Number at [0][2]: 45
	Enter a Number at [1][0]: 67
	Enter a Number at [1][1]: 45
	Enter a Number at [1][2]: 230
	The Number at [0][0] is 10
	The Number at [0][1] is 100
	The Number at [0][2] is 45
	The Number at [1][0] is 67
	The Number at [1][1] is 45
	The Number at [1][2] is 230
Mảng hai chiều và chuỗi:
Như chúng ta đã biết ở phần trước, một chuỗi có thể được biểu diễn bằng mảng một chiều, kiểu ký tự. Mỗi ký tự trong chuỗi được lưu trữ trong một phần tử của mảng. Mảng của chuỗi có thể được tạo bằng cách sử dụng mảng ký tự hai chiều. Chỉ số bên trái xác định số lượng chuỗi, và chỉ số bên phải xác định chiều dài tối đa của mỗi chuỗi. Ví dụ bên dưới khai báo một mảng chứa 25 chuỗi và mỗi chuỗi có độ dài tối đa 80 ký tự kể cả ký tự null.
	char str_ary[25][80];
Ví dụ minh hoạ cách sử dụng của một mảng hai chiều:
Ví dụ bên dưới minh hoạ cách dùng của mảng hai chiều như các chuỗi.
Xét bài toán tổ chức một danh sách tên theo thứ tự bảng chữ cái. Ví dụ sau đây nhập một danh sách các tên và sau đó sắp xếp chúng theo thứ tự bảng chữ cái.
Ví dụ 11.6
	#include 
	#include 
	#include 
	void main()
	{
	int i, n = 0;
	int item;
	char x[10][12];
	char temp[12];
	clrscr();
	printf(“Enter each string on a separate line \n\n”);
	printf(“Type ‘END’ when over \n\n”);
	/* Read in the list of strings */
	do
	{
	printf(“String %d: ”, n + 1);
	scanf(“%s”, x[n]);
	} while (strcmp(x[n++], “END”));
	/*Reorder the list of strings */
	n = n – 1;
	for(item = 0; item < n - 1; ++item)
	{
	/* Find lowest of remaining strings */
	for(i = item + 1; i < n; ++i)
	{
	if(strcmp(x[item], x[i]) > 0)
	{
	/*Interchange two strings*/
	strcpy(temp, x[item]);
	strcpy(x[item], x[i]);
	strcpy(x[i], temp);
	}
	}
	}
	/* Display the arranged list of strings */
	printf(“Recorded list of strings: \n”);
	for(i = 0; i < n; ++i)
	{
	printf("\nString %d is %s", i + 1, x[i]);
	}
	}
Chương trình trên nhập vào các chuỗi đến khi người dùng nhập vào từ “END”. Khi END được nhập vào, chương trình sẽ sắp xếp danh sách các chuỗi và in ra theo thứ tự đã sắp xếp. Chương trình kiểm tra hai phần tử kế tiếp nhau. Nếu thứ tự của chúng không thích hợp, thì hai phần tử sẽ được đổi chỗ. Sự so sánh hai chuỗi được thực hiện với sự trợ giúp của hàm strcmp() và sự đổi chỗ được thực hiện với hàmg strcpy().
Một ví dụ về kết quả thực thi của chương trình như sau:
	Enter each string on a separate line
	Type ‘END’ when over
	String 1: has
	String 2: seen
	String 3: alice
	String 4: wonderland
	String 5: END
	Record list of strings:
	String 1 is alice
	String 2 is has
	String 3 is seen
	String 4 is wonderland
Tóm tắt bài học
Một mảng là một tập hợp các phần tử dữ liệu có cùng kiểu được tham chiếu bởi cùng một tên.
Mỗi phần tử của mảng có cùng kiểu dữ liệu, cùng lớp lưu trữ và có cùng các đặc tính.
Mỗi phần tử được lưu trữ ở vị trí kế tiếp nhau trong bộ nhớ chính. Các phần tử dữ liệu được biết như là các phần tử mảng.
Chiều của mảng được xác định bởi số các chỉ số cần thiết để định danh duy nhất mỗi phần tử.
Các mảng có thể có các kiểu dữ liệu như int, char, float, hoặc double.
Phần tử của mảng có thể được tham chiếu bằng cách sử dụng một biến hoặc một biểu thức số nguyên.
Một mảng không thể được khởi tạo, trừ khi mỗi phần tử được gán một giá trị riêng lẻ.
Các mảng extern và static có thể được khởi tạo khi khai báo.
Mảng hai chiều có thể xem như là một mảng của các mảng một chiều.
Kiểm tra tiến độ học tập
Một ________ là một tập hợp các phần tử dữ liệu cùng kiểu và được tham chiếu bởi cùng một tên.
A. Vòng lặp	B. Mảng
C. Cấu trúc	D. Tất cả đều sai
Mỗi phần tử của mảng được định danh bằng ________ duy nhất hoặc ________ được gán tới nó.
A. Chỉ mục, Chỉ số	B. Miền giá trị, Chỉ số
C. Tất cả đều sai
Một tên mảng và một tên biến có thể giống nhau	(Đúng/Sai)
Một phần tử của mảng có thể được sử dụng bất kỳ vị trí nào mà một biến được cho phép và yêu cầu. 	(Đúng/Sai)
Hai mảng, ngay cả khi chúng có cùng kiểu và kích thước, không thể được xem là _________.
A. Điều kiện	B. Sự phủ định
C. Bằng nhau	D. Tất cả đều sai
Một chuỗi được khai báo như là một mảng kiểu ký tự, được kết thúc bởi ký tự _________.
A. chấm phẩy	B. phẩy
C. NULL	D. Tất cả đều sai
Các mảng có thể có nhiều hơn một chiều.	(Đúng/Sai)
Sự so sánh hai chuỗi được thực hiện với sự giúp đỡ của ________ và sự đổi vị trí được thực hiện bằng _________.
A. strcmp, strcpy	B. strcat, strcpy
C. strlen, strcat	D. Tất cả đều sai
Bài tập tự làm
Viết một chương trình để sắp xếp các tên sau đây theo thứ tự abc.
George
Albert
Tina
Xavier
	Roger
	Tim
	William
Viết một chương trình đếm số ký tự nguyên âm trong một dòng văn bản.
Viết một chương trình nhập các số sau đây vào một mảng và đảo ngược mảng
34
45
56
67
89

File đính kèm:

  • docLập trình C Aptech - Bài 11 Mảng.doc