Trong ngôn ngữ lập trình C, mảng là một tập hợp các biến cùng kiểu dữ liệu được đánh dấu bởi cùng một tên. Mảng cho phép lưu trữ nhiều giá trị cùng loại trong một cấu trúc dữ liệu đơn giản và có thứ tự. Dưới đây là một số điểm quan trọng về kiểu mảng trong C
LẬP TRÌNH CĂN BẢN KIỂU MẢNG Giảng viên: TS Trương Quốc Bảo NỘI DUNG CỦA CHƯƠNG Giới thiệu kiểu mảng trong C Mảng 1 chiều Mảng nhiều chiều Thursday, January 15, 2015 Lập trình căn bản 2 GIỚI THIỆU KIỂU MẢNG TRONG C (1) Ví dụ: khai báo một mảng a gồm 10 phần tử là số nguyên: int a[10]; => Hình ảnh của a trong bộ nhớ như sau: Thursday, January 15, 2015 Lập trình căn bản GIỚI THIỆU KIỂU MẢNG TRONG C (2) “Mảng là một tập hợp các phần tử cố định có cùng một kiểu, gọi là kiểu phần tử” Kiểu phần tử có thể là có kiểu bất kỳ: ký tự số 1 cấu trúc (struct) 1 mảng khác (mảng của mảng hay mảng nhiều chiều) … Có 2 loại mảng: mảng 1 chiều và mảng nhiều chiều Lập trình căn bản Thursday, January 15, 2015 MẢNG MỘT CHIỀU Xét dưới góc độ toán học, mảng 1 chiều giống như một vector Mỗi phần tử của mảng 1 chiều có giá trị không phải là một mảng khác Ví dụ: Thursday, January 15, 2015 Lập trình căn bản KHAI BÁO MẢNG MỘT CHIỀU (1) Có một số cách khai báo mảng 1 chiều trong C: Cách 1: Khai báo mảng với số phần tử xác định Cú pháp: ; Ví dụ: float a[100]; Cách 2: Khai báo mảng với số phần tử không xác định Cú pháp: ; Ví dụ: float a[]; Thursday, January 15, 2015 Lập trình căn bản KHAI BÁO MẢNG MỘT CHIỀU (2) Cách 3: Vừa khai báo vừa gán giá trị Cú pháp: []= {Các giá trị cách nhau bởi dấu phẩy} ; Ví dụ: int primes[] = {2,3,5,7,11,13}; int primes[6]; Số phần tử có thể được xác định bằng sizeof() Số phần tử=sizeof(tên mảng)/sizeof(kiểu) =>trong ví dụ trên số phần tử là: sizeof (primes)/sizeof(int)=6 Ta có: primes[0] = 2; primes[1] = 3; primes[2] = 5; primes[3] = 7; primes[4] = 11; primes[5] = 13; Thursday, January 15, 2015 Lập trình căn bản KHAI BÁO MẢNG MỘT CHIỀU (3) Khai báo mảng là tham số hình thức của hàm Không cần chỉ định số phần tử của mảng là bao nhiêu (không cần khai báo tường minh chỉ số mảng) Ví dụ: void Nhap(int a[],int N) { int i; for(i=0; i< N; i++) { printf("Phan tu thu %d: ",i);scanf("%d",&a[i]); } } Lập trình căn bản Thursday, January 15, 2015 TRUY XUẤT PHẦN TỬ CỦA MẢNG MỘT CHIỀU (1) Cú pháp: Tên biến mảng[Chỉ số] Ví dụ: int a[10]; a[0]=5; a[1]=5; a[2]=33; a[3]=33; a[4]=15; printf(“%d %d %d %d %d”, a[0], a[1], a[2], a[3], a[4]); Thursday, January 15, 2015 Lập trình căn bản TRUY XUẤT PHẦN TỬ CỦA MẢNG MỘT CHIỀU (2) Viết đoạn chương trình đổi một số nguyên dương thập phân thành số nhị phân Thuật toán: Lấy số nguyên thập phân N(10) lần lượt chia cho 2 cho đến khi thương số bằng 0 Kết quả số chuyển đổi N(2) là các dư số trong phép chia viết theo thứ tự ngược lại Ví dụ: Số 12(10) = ?(2) 12 2 06 2 03 2 11 1 Kết quả: 12(10) = 1100(2) Thursday, January 15, 2015 Lập trình căn bản TRUY XUẤT PHẦN TỬ CỦA MẢNG MỘT CHIỀU (3) Thuật toán đổi nhị phân: SoBit = 0 Bước 1: Gán Số bits = 0; SoDu = N%2 Bước 2: Số dư = N % 2; Bước 3: Lưu số dư vào mảng: Nhiphan[Sobit] = SoDu Nhiphan[Số bit] = Số dư; Bước 4: Cập nhật số bị chia: N= N/2 N = [N/2]; SoBit = SoBit+1 Bước 5: Số bit = Số bit + 1; Bước 6: Nếu N >0, quay lại Đúng bước 2 Ngược lại sang bước 7 N>0 Bước 7: In dãy bits nhị phân Sai Thursday, January 15, 2015 Lập trình căn bản In dãy bits nhị phân TRUY XUẤT PHẦN TỬ CỦA MẢNG MỘT CHIỀU (4) Chương trình đổi nhị phân Thursday, January 15, 2015 Lập trình căn bản Viết đoạn chương trình nhập vào một dãy n số nguyên và sắp xếp các số theo thứ tự tăng Thuật toán: Xét hai phần tử liên tiếp i và j nếu không đúng thứ tự thì đổi chỗ 2 phần tử này j = i+1 j = 7 = N-1 Khóa a[0] a[1] a[2] a[3] a[4] A[5] a[6] a[7] Bước Ban đầu 5 6 2 2 10 12 9 10 Bước 0 i = 0 2 6 5 2 10 12 9 10 Bước 1 2 5 6 10 12 9 10 Bước 2 5 6 10 12 9 10 Bước 3 6 10 12 9 10 Bước 4 i = 6 Bước 5 9 12 10 10 = N-2 10 12 10 Bước 6 10 12 Kết quả 2 2 3 5 6 9 9 10 Thursday, January 15, 2015 Lập trình căn bản TRUY XUẤT PHẦN TỬ CỦA MẢNG MỘT CHIỀU (5) Chương trình Thursday, January 15, 2015 Lập trình căn bản TRUY XUẤT PHẦN TỬ CỦA MẢNG MỘT CHIỀU (6) Ví dụ: Chương trình sau sẽ hiển thị kết quả gì? Các phần tử của mảng a[0], …, a[11] Việc truy cập a[12] sẽ vượt ra bên ngoài biên của mảng Sửa lỗi này thế nào?? Thursday, January 15, 2015 Lập trình căn bản MẢNG NHIỀU CHIỀU Mảng nhiều chiều là mảng có từ 2 chiều trở lên Điều đó có nghĩa là mỗi phần tử của mảng là một mảng khác Người ta thường sử dụng mảng nhiều chiều để lưu các ma trận, các tọa độ 2 chiều, 3 chiều… Thursday, January 15, 2015 Lập trình căn bản KHAI BÁO MẢNG NHIỀU CHIỀU (1) Có 2 cách khai báo mảng nhiều chiều: Khai báo tường minh Khai báo không tường minh Chúng ta sẽ xét các cú pháp và ví dụ trên mảng 2 chiều Mảng nhiều chiều hơn hoàn toàn tương tự Khai báo mảng 2 chiều tường minh Cú pháp: ; Ví dụ: float m[8][9]; // mảng có 8*9 phần tử là số thực Thursday, January 15, 2015 Lập trình căn bản KHAI BÁO MẢNG NHIỀU CHIỀU (2) Khai báo mảng 2 chiều không tường minh Để khai báo mảng 2 chiều không tường minh, ta chỉ cần phải chỉ ra số phần tử của chiều thứ hai Cú pháp: ; Ví dụ: float m[][9]; Cách khai báo này cũng được áp dụng trong trường hợp: Vừa khai báo vừa gán trị Mảng 2 chiều là tham số hình thức của 1 hàm Thursday, January 15, 2015 Lập trình căn bản TRUY XUẤT PHẦN TỬ CỦA MẢNG NHIỀU CHIỀU Cú pháp: Tên mảng[Chỉ số 1][Chỉ số 2] Ví dụ: matran[3][5]; Viết chương trình cho phép nhập 2 ma trận a, b có m dòng n cột, thực hiện phép toán cộng hai ma trận a,b và in ma trận kết quả lên màn hình Thursday, January 15, 2015 Lập trình căn bản Thursday, January 15, 2015 Lập trình căn bản