Lập trình C: Mảng (Array) một chiều

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Video tham khảo

1. Cách nhập liệu cho mảng 1 chiều

2. Cách xóa phần tử khỏi mảng

3. Cách sắp xếp mảng

4. Cách tìm max, min bằng phương pháp sắp xếp

Giới thiệu và khai báo

Mảng (Array) một chiều hay còn gọi là mảng tuyến tính (thẳng) trong ngôn ngữ lập trình C là tập hợp các phần tử (hay biến) cùng kiểu dữ liệu, cùng tên và được cấp phát các vùng nhớ liên tiếp nhau trong bộ nhớ. Những phần tử này được gọi là phần tử mảng.

Một mảng một chiều được khai báo giống như cách khai báo một biến, khác ở điểm là sau tên mảng là cặp ngoặc vuông ([]) và bên trong cặp ngoặc vuông là một số nguyên dương thể hiện kích thước của mảng. Cú pháp tổng quát khai báo một mảng như sau:

Kiểu_dữ_liệu Tên_mảng [Kích_thước];

Vòng lặp for là lựa chọn lý tưởng để thao tác với các mảng. Dưới đây sẽ trình bày một số ví dụ thể hiện cách xử lý mảng dùng cấu trúc for.

Ví dụ sau đây sẽ khai báo một mảng có tên là arr, gán giá trị cho các phần tử mảng rồi dùng vòng lặp for để in chúng:

#include<stdio.h>

main() {
  int arr[3];
  int i;

  arr[0] = 100;
  arr[1] = 300;
  arr[2] = 200;
  for (i = 0; i < 5; i++)
  printf("\n arr[%d] = %d", i, arr[i]);

  return 0;
}

Khởi tạo mảng

Cách 1:

Kiểu_dữ_liệu Tên_mảng[Kích_thước] = {Giá_trị_0, Giá_trị_1, ..., Giá_trị_Kích_thước - 1};

- Cách thức khởi tạo này thường dùng trong trường hợp Kích_thước của mảng nhỏ.

- Kích_thước trong cách thức khởi tạo này có thể bỏ qua, không nhất thiết phải có.

Ví dụ:

int a[5]= {1, 2, 3, 4, 5}; //--> a[0]=1, a[1]=2, a[2]=3, a[3]=4, a[4]=5
hoc:
int b[]= {1, 2, 3, 4, 5}; //--> b[0]=1, b[1]=2, b[2]=3, b[3]=4, b[4]=5

Cách 2:

Kiểu_dữ_liệu Tên_mảng[Kích_thước];
int i;
for(i=0; i<Kích_thước; i++)
    Tên_mảng[i]=Giá_trị_khởi_tạo;

Cách thức khởi tạo này thường dùng trong trường hợp kích thước mảng lớn, khi đó thông thường các phần tử được khởi tạo cùng một giá trị.

Ví dụ:

float a[20];
int i;
for(i=0; i<20; i++)
a[i] = 0.0; //khi to tt c các phn t ca mng đu nhn giá tr 0.

Nhập liệu cho mảng

Cú pháp:

int i;
for(i=0; i<Kích_thước; i++)
    scanf("%Định_dạng", &Tên_mảng[i]);

Ví dụ:

int i;
for(i=0; i<20; i++)
  scanf("%f", &a[i]);

In dữ liệu mảng

Cú pháp:

for(Biến_chạy = 0; Biến_chạy < Kích_thước; Biến_chạy++)
    printf("\n%Định_dạng", Tên_mảng[Biến_chạy]);

Ví dụ dưới đây sẽ in ra màn hình giá trị của 20 phần tử của mảng a, trong đó biến chạy là i:

for(i=0; i<20; i++)
  printf("%f", a[i]);

Lưu ý: bạn không được gán mảng cho mảng và đây là quy tắc trong ngôn ngữ C, ví dụ như khi bạn khai báo int a[10], b[10]; thì bạn không được thực hiện câu lệnh gán a=b;, khi đó trình dịch sẽ báo lỗi.

Ví dụ tổng hợp về mảng một chiều

- Ví dụ sau nhập vào một mảng gồm 10 phần tử, sau đó hiển thị mảng vừa nhập ra màn hình. Chương trình được viết như sau:

#include <stdio.h>
#define N 10 //hoc: const int N=10;

main() {
  int a[N], i;

  printf("\nNhap gia tri cho cac phan tu cua mang:\n");
  for(i=0; i<N; i++) { //dùng vòng lp đ nhp liu cho mng
    printf("\na[%d]= ", i);
    scanf("%d", &a[i]);
  }
  printf("\nCac phan tu cua mang vua nhap la:\n");
  for(i=0; i<N; i++) //ri cũng dùng vòng lp for đ in d liu mng
    printf("\na[%d]= %d", i, a[i]);

  return 0;
}

- Còn đây là ví dụ nhập vào một mảng M phần tử (M nhập từ bàn phím), sau đó hiển thị mảng vừa nhập ra màn hình.

#include <stdio.h>

main() {
  int a[99], i, M;

  do {
    printf("\nNhap vao so phan tu cua mang: ");
    scanf("%d", &M);
  }while(!(0<M && M<100));

  printf("\nNhap lieu cho mang:\n");
  for(i=0; i<M; i++) {
    printf("\na[%d]= ", i);
    scanf("%d", &a[i]);
  }

  printf("\nDu lieu cua mang la:\n");
  for(i=0; i<M; i++)
    printf("\na[%d] = %d", i, a[i]);

  return 0;
}

Một kết quả thử nghiệm được thể hiện dưới đây:

Mảng một chiều - in kết quả

- Nhập vào một mảng n phần tử (n nhập từ bàn phím) sau đó sắp xếp các phần tử theo thứ tự tăng dần. Chương trình được viết như sau:

#include<stdio.h>

main(){
  int n, i, j;
  float a[10], t;

  printf("Nhap vao so phan tu cua mang: ");
  scanf("%d",&n);

  printf("\nNhap gia tri cho tung phan tu:");
  for(i = 0; i < n; i++){
    printf("\na[%d] = ", i);
    scanf("%f", &a[i]);
  }
  //Sp xếp các phn t theo th t tăng dn
  for(i = 0; i < n - 1; i ++){
    for(j = i + 1; j < n; j++){
      if(a[i] > a[j]){ //(Nếu sp xếp theo th t gim → a[i]<a[j])
        t = a[i];
        a[i] = a [ j ];
        a[j] = t;
      }
    }
  }
  // In ra kết qu  for(i = 0; i < n; i++)
    printf("%5g", a[i]);

  return 0;
}

- Ví dụ này sẽ thực hiện lại ví dụ trên nhưng chương trình được viết dưới dạng các hàm bao gồm các hàm sau:

+ Hàm dùng để nhập số lượng phần tử cho mảng.

+ Hàm nhập dữ liệu cho mảng.

+ Hàm sắp xếp các phần tử của mảng theo thứ tự tăng dần.

+ Hàm hiển thị mảng sau khi sắp xếp.

Dưới đây là đoạn mã thực hiện chương trình:

#include <stdio.h>

void nhapN(int *n) { //hàm nhp s phn t mng
  printf("\nNhap vao so phan tu cua mang: ");
  scanf("%d", &*n);
}

void nhapMang(float *a, int n) { //hàm nhp d liu cho mng
  int i;
  printf("\nNhap gia tri cho tung phan tu:");
  for(i=0; i<n; i++) {
    printf("\na[%d] = ", i);
    scanf("%f", &a[i]);
  }
}

void sapXep(float a[], int n){ //hàm sp xếp
  int i,j,t;
  for(i=0;i<n-1;i++){
    for(j=i+1;j<n; j++){
      if(a[i]>a[j]){
        t=a[i];a[i]=a[j];a[j]=t;
      }
    }
  }
}

void hienThi(float a[], int n) { //hàm hin th  int i;
  printf("\nSau khi sap xep, mang se co trat tu la:");
  for(i=0; i<n;i++)
    printf("\n%g", a[i]);
}

main() {
  int n;
  float a[20];

  nhapN(&n); //Nhp s lượng phn t cho mng
  nhapMang(a,n); //Nhp giá tr cho các phn t ca mng
  sapXep(a,n); //Sp xếp mng
  hienThi(a,n); //Hin th mng sau khi sp xếp

  return 0;
}
» Tiếp: Mảng hai chiều
« Trước: Đệ quy (Recursion)
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!