Bài 10: Mảng trong C - Học lập trình C cơ bản

Đăng bởi: Admin | Lượt xem: 5888 | Chuyên mục: C/C++


Mảng (array) trong C là một tập hoặc một nhóm các phần tử (dữ liệu) có kiểu dữ liệu đồng nhất(tương tự). Các phần tử của mảng được lưu trong các vùng nhớ liên tiếp.

1. Ví dụ

Để có thể hiểu hơn về vai trò của mảng, chúng ta sẽ cùng tìm hiểu ví dụ sau:
#include 
 
int main() 
{
    int a, b, c, d, e; // 5 bien
 
    printf("Nhap a = ");
    scanf("%d", &a);
 
    printf("Nhap b = ");
    scanf("%d", &b);
 
    printf("Nhap c = ");
    scanf("%d", &c);
 
    printf("Nhap d = ");
    scanf("%d", &d);
 
    printf("Nhap e = ");
    scanf("%d", &e);
 
    int tong  = a + b + c + d + e;
    printf("Tong cua %d + %d + %d + %d + %d = %d \n", a, b, c, d, e, tong);
 
    return 0;
}
Kết quả:
Nhap a = 3
Nhap b = 5
Nhap c = 3
Nhap d = 6
Nhap e = 1
Tong cua 3 + 5 + 3 + 6 + 1 = 18
Như ví dụ trên, chúng ta có thể thấy, khi muốn tình tổng của 5 số, chúng ta phải thực hiện rất nhiều câu lệnh giống nhau và với rất nhiều biến. Nếu trong trường hợp số biến là 50, 500 hay 5000,... thì code sẽ rất rắc rối. Để khắc phục điều này, chúng ta sử dụng mảng. 
Như ví dụ, chúng ta thấy nhập cả 5 và chúng tôi tạo ra một số màn hình có vẻ rất khó và chúng tôi đã phải sử dụng quá nhiều biến, nếu số lượng biến chúng tôi không phải là 5, đó là 50, 500, ... thì kết quả này rất khó khăn. Để khắc phục điều này, chúng tôi sử dụng mảng.

2. Mảng 1 chiều

Mảng là một tập hợp tuần tự các phần tử có cùng kiểu dữ liệu và các phần tử được lưu trữ trong một dãy các ô nhớ liên tục trên bộ nhớ. Các phần tử của mảng được truy cập bằng cách sử dụng “chỉ số”. Mảng có kích thước N sẽ có chỉ số từ 0 tới N – 1.
Để khai báo, chúng ta cần 2 yếu tố sau:
  1. Kích thước của mảng: Việc này xác định số lượng phần tử có thể được lưu trữ trong mảng.
  2. Kiểu dữ liệu của mảng: Việc này chỉ định kiểu dữ liệu của các phần tử trong mảng; là số nguyên, số thực, ký tự hay là kiểu dữ liệu nào đó.
Ví dụ:
int arr[5];
Chúng ta có thể vừa khai báo vừa khởi tạo mảng như sau:
int arr[5] = {4, 12, 7, 15, 9};
Nhập mảng 1 chiều : Hàm này nhận vào các đối số là mảng kiểu nguyên a, và số lượng phần tử n. Hàm không trả về giá trị gì nên có kiểu là void.
void NhapMang(int a[], int n){
    for(int i = 0;i < n; ++i){
        printf("\nNhap phan tu a[%d] = ", i);
        scanf("%d", &a[i]);
    }
}
Xuất mảng 1 chiều: Tương tự như hàm nhập, hàm XuatMang cũng nhận vào mảng kiểu nguyên a và số lượng phần tử n. Hàm có giá trị trả về là kiểu void.
void XuatMang(int a[], int n){
    for(int i = 0;i < n; ++i){
        printf("\nPhan tu a[%d] = %d", i, a[i]);
    }
}
Chức năng tìm kiếm trong mảng 1 chiều: Vẫn nhận vào các đối số như 2 hàm nhập và xuất, và nhận thêm một đối số khác nữa là giá trị cần tìm kiếm v. Tuy nhiên, hàm này sẽ trả về chỉ số đầu tiên mà giá trị tại đó giá trị bằng với v. Nếu không có giá trị nào thỏa mãn, hàm trả về giá trị -1.
int TimKiem(int a[], int n, int v){
    for(int i = 0;i < n; ++i){
        if(a[i] == v){
            return i;
        }
    }
    return -1;
}
Đây là một hàm thực hiện tìm kiếm tuyến tính có độ phức tạp O(n). Bằng cách duyệt qua từng phần tử của mảng để kiểm tra.

3. Mảng 2 chiều

Mảng đa chiều(TA: multi-dimensional array) là một mảng của các mảng. Mảng 2 chiều hay ma trận là mảng đa chiều thường được sử dụng nhất; Khi đó, mảng 2 chiều là một mảng của các mảng 1 chiều. Mảng 2 chiều có cách lưu trữ các phần tử giống như một bảng.
Để khai báo mảng 2 chiều, bạn phải chỉ định các tham số sau:
  1. row-size: Khai báo số hàng của mảng 2 chiều
  2. column-size: Khai báo số cột của mảng 2 chiều
  3. Type of array: Kiểu dữ liệu của mảng 2 chiều. Việc này chỉ định kiểu dữ liệu của các phần tử trong mảng; là số nguyên, số thực, ký tự hay là kiểu dữ liệu nào đó
Ví dụ:
int arr[3][5];
Chúng ta có thể vừa khai báo vừa khởi tạo mảng như sau:
int arr[3][5] = {{5, 12, 17, 9, 3}, {13, 4, 8, 14, 1}, {9, 6, 3, 7, 21}};
Thao tác nhập mảng 2 chiều: Hàm NhapMaTran nhận vào các đối số là mảng 2 chiều a, số hàng m, số cột n. Hàm này không trả về giá trị nên có kiểu là void.
void NhapMaTran(int a[][100], int m, int n)
{
   for(int i = 0; i < m; i++)
      for(int j = 0; j < n; j++)
      {
         printf("A[%d][%d] = ", i, j);
         scanf("%d", &a[i][j]);
      }
}
Thao tác xuất mảng 2 chiều: Hàm này tương đối giống với hàm NhapMaTran phía trên. Do vậy, mình không trình bày lại nữa.
void XuatMaTran(int a[][100], int m, int n)
{
   for(int i = 0; i < m; i++)
   {
      for(int j = 0; j < n; j++)
         printf("%d\t", a[i][j]);
      printf("\n");
   }
}
Sau mỗi hàng chúng ta in thêm “\n” để kết quả in ra được dạng bảng.
Tìm kiếm trong mảng 2 chiều: Hàm này sẽ trả về một cặp gồm {chỉ số hàng, chỉ số cột} nên mình để kiểu trả về là pair<int, int>. Ngoài các tham số giống như 2 hàm nhập & xuất, nó còn nhận thêm giá trị cần tìm kiếm v.

Chú ý: pair có trong thư viện #include &lt;utility&gt;. Nếu tìm thấy, trả về vị trí đầu tiên tìm được, ngược lại trả về {-1, -1}.

std::pair TimKiem(int a[][100], int m, int n, int v){
    for(int i = 0; i &lt; m; i++)
       {
          for(int j = 0; j &lt; n; j++)
             if(a[i][j] == v) return {i, j};
       }
    return {-1, -1};
}
Như vậy, thông qua bài học này, chúng ta đã tìm hiểu về tác dụng cũng như các loại mảng trong C. Cảm ơn các bạn đã đọc.
Bài tiếp theo: Con trỏ trong C >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!