Ngôn ngữ lập trình C/C++ - Chương 4: Mảng một chiều

Khái niệm mảng một chiều  Mảng là một tập hợp các biến có cùng kiểu dữ liệu nằm liên tiếp nhau trong bộ nhớ và được tham chiếu bởi một tên chung chính là tên mảng.  Mỗi phần tử của mảng được tham chiếu thông qua chỉ mục (index).

pdf44 trang | Chia sẻ: thuychi16 | Lượt xem: 983 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Ngôn ngữ lập trình C/C++ - Chương 4: Mảng một chiều, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Khái niệm mảng một chiều Mảng là một tập hợp các biến có cùng kiểu dữ liệu nằm liên tiếp nhau trong bộ nhớ và được tham chiếu bởi một tên chung chính là tên mảng. Mỗi phần tử của mảng được tham chiếu thông qua chỉ mục (index). Khái niệm mảng một chiều Nếu mảng có n phần tử thì phần tử đầu tiên có chỉ mục là 0 và phần tử cuối có chỉ mục là n-1. Để tham chiếu đến một phần tử ta dùng tên mảng và chỉ mục của phần tử được đặt trong cặp dấu []. Ví dụ: a[0] Khái niệm mảng một chiều Số phần tử trong mảng gọi là kích thước của mảng, luôn cố định, phải được xác định trước và không đổi trong suốt quá trình thực hiện chương trình. Nên định nghĩa trước số phần tử tối đa của mảng ở đầu của chương trình Ví dụ: #define MAX 100 Cú pháp: Ví dụ:  int a[100]; //Khai bao mang so nguyen a gom 100 phan tu  float b[50]; //Khai bao mang so thuc b gom 50 phan tu  char str[30]; //Khai bao mang ky tu str gom 30 ky tu Khai báo mảng một chiều [] Khai báo và gán giá trị cho mảng Gán từng phần tử Ví dụ: int a[5] = {3, 6, 8, 1, 12}; Gán toàn bộ phần tử có cùng giá trị Ví dụ: int a[8] = {3}; Giá trị 3 6 8 1 12 Vị trí 0 1 2 3 4 Giá trị 3 3 3 3 3 3 3 3 Vị trí 0 1 2 3 4 5 6 7 Truy xuất giá trị của mảng  Cú pháp: Ví dụ: void main() { int a[5] = {3, 6, 8, 11, 12}; printf(“Giá trị mảng tại vị trí 3 = %d“,a[3]); } Kết quả: Giá trị mảng tại vị trí 3 = 11 [] Vị trí số 3 Truyền mảng vào hàm Khi một mảng được dùng như một đối số để truyền cho hàm, thì địa chỉ của mảng được truyền vào tham số hình thức.  Truyền mảng vào hàm mặc định là truyền tham chiếu. Những thay đổi đến giá trị của các phần tử mảng trong thân hàm sẽ ảnh hưởng đến mảng gốc Các thao tác trên mảng  Nhập giá trị cho mảng  Xuất (liệt kê)  Tìm kiếm  Đếm  Sắp xếp  Kiểm tra mảng thỏa điều kiện cho trước  Tách/ ghép mảng  Chèn / xóa Hàm nhập mảng Nhập giá trị cho mảng void NhapMang (int a[], int n) { for (int i = 0; i < n; i ++) { printf(“a[%d]=“,i); scanf(“%d”,&a[i]); } } Ví dụ: Nhập giá trị cho mảng Nhập mảng ngẫu nhiên  Khai báo thư viện:  #include  #include  Hàm tạo số ngẫu nhiên: srand() và rand() Tạo mảng ngẫu nhiên  Tạo một số ngẫu nhiên có giá trị trong khoảng [a, b] Cú pháp: a+rand()%(b-a+1) Ví dụ:  Tạo số ngẫu nhiên có giá trị từ 10 đến 20 10+rand()%(20-10+1) Tạo số ngẫu nhiên Hàm xuất mảng: Xuất mảng void XuatMang (int a[], int n) { for (int i = 0; i < n; i ++) printf(“%d\t”,a[i]); } Chương trình chính gọi hàm xuất và nhập mảng Nhập xuất mảng sử dụng hàm con void main ( ) { int a[MAX] , n; printf(“Nhap kich thuoc mang: “); scanf(“%d”,&n); NhapMang (a,n); printf(“Cac gia tri cua mang vua nhap: \n”); XuatMang (a,n); } Liệt kê các phần tử trong mảng  Liệt kê các phần tử thỏa điều kiện cho trước: Mẫu 1: void LietKeMau1(int a[ ], int n) { for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện) Xuất a[i]; } Liệt kê các phần tử trong mảng Mẫu 2: void LietKeMau2(int a[ ], int n, int x) { for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện so với x) Xuất a[i]; } Ví dụ 1: Liệt kê các phần tử có giá trị chẵn trong mảng void LietKeChan(int a[ ], int n) { for (int i = 0; i<n; i++) if (a[i] %2 ==0) printf(“%d\t”, a[i]); } Ví dụ 2: Chương trình nhập vào mảng một chiều số nguyên a, kích thước n. In ra các phần tử có giá trị lớn hơn x có trong mảng #define MAX 100 void NhapMang(int a[], int n); void XuatMang(int a[], int n); void LietKeLonHonX(int a[], int n, int x); void main() { int a[MAX], n, x; printf("Nhap kich thuoc mang: “); scanf(“%d”,&n); NhapMang(a, n); printf("Cac phan tu cua mang: “ ); XuatMang(a, n); printf("Nhap gia tri x: “); scanf(“%d”,&x); printf("Cac phan tu co gia tri lon hon %d “ ,x); LietKeLonHonX(a, n, x); } void LietKeLonHonX(int a[], int n, int x) { for (int i = 0; i<n; i++) if (a[i] > x) printf(“%d \t”,a[i]); } Đếm số phần tử trong mảng Mẫu 1: int DemMau1(int a[ ], int n) { int d = 0; for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện) d++; return d; } Đếm số phần tử trong mảng Mẫu 2: int DemMau2(int a[], int n, int x) { int d = 0; for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện so với x) d++; return d; } Ví dụ 1: Đếm các phần tử có giá trị nhỏ hơn x có trong mảng int DemNhoHonX(int a[ ], int n, int x) { int d = 0; for (int i = 0; i<n; i++) if (a[i] < x) d++; return d; } Ví dụ 2: Đếm các phần tử có giá trị là số nguyên tố bool LaSNT(int k) { int d = 0; for (int i = 1; i <= k; i++) if (k % i == 0) d++; return (d == 2); } int DemSNT(int a[ ], int n) { int d = 0; for (int i = 0; i<n; i++) if (LaSNT(a[i]) ==true) d++; return d; } 12/25/2015 void main() { int a[MAX], n, kq; printf("Nhap kich thuoc mang: “); scanf(“%d”,&n); NhapMang(a, n); printf("Cac phan tu cua mang:\n“); XuatMang(a, n); kq = DemSNT(a, n); if(kq==0) printf("Khong co so nguyen to trong mang“); else printf("So luong so nguyen to la: %d“,kq); } Sắp xếp tăng dần: Sắp xếp mảng for ( i = 0 ; i < n - 1 ; i ++) //sắp xếp for ( j = i + 1 ; j < n ; j ++ ) if ( a [ i ] >a [j ] ) { t = a [ i ] ; a [ i ] = a [ j ]; a [ j ] = t ; } Sắp xếp sử dụng hàm con Sắp xếp mảng void SapTang(int a[], int n) { for (int i = 0; i < n-1; i ++) for(int j = i+1; j < n; j ++) if (a[i] > a[j]) HoanVi(a[i], a[j]); } void HoanVi(int &a, int &b) { int tam = a; a = b; b = tam; } Tìm kiếm phần tử trong mảng int TimMax(int a[], int n) { int max = a[0]; for (int i = 1; i < n; i++) if (a[i] > max) max = a[i]; return max; } Tìm kiếm phần tử trong mảng Mẫu 1: Tìm và trả về vị trí của phần tử có giá trị lớn nhất trong mảng int TimVTMax(int a[ ], int n) { int vtmax = 0; for (int i = 1; i < n; i++) if (a[i] > a[vtmax]) vtmax = i; return vtmax; } Tìm kiếm phần tử trong mảng Mẫu 2: Tìm vị trí phần tử có giá trị x (nếu x không tồn tại trong mảng thì trả về -1) int TimVTX(int a[], int n, int x) { for (int i = 0; i < n; i++) if (a[i] == x) return i; return -1; }  Kiểm tra tồn tại: một phần tử trong mảng thỏa điều kiện cho trước  tìm phần tử thỏa điều kiện. Kiểm tra mảng theo điều kiện cho trước bool KiemTraTonTai(int a[], int n) { for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện) return true; return false; } Kiểm tra tất cả các phần tử thỏa điều kiện nào đó cho trước  tìm phần tử không thỏa điều kiện. Kiểm tra mảng theo điều kiện cho trước bool KiemTra (int a[], int n) { for (int i = 0; i<n; i++) if (a[i] không thỏa điều kiện) return true; return false; } Ví dụ 1: Kiểm tra xem mảng có tồn tại số lẻ không? bool KiemTraTonTaiLe(int a[], int n) { for (int i = 0; i < n; i++) if (a[i] % 2 != 0) return true; return false; } Ví dụ 2: Kiểm tra xem mảng có toàn giá trị âm không? (true: có/ false: không) bool KiemTraToanAm(int a[], int n) { for (int i = 0; i<n; i++) if (a[i] >= 0) return false; return true; } Mẫu 1: Tính tổng các phần tử thỏa điều kiện Tính tổng các phần tử trong mảng int Tong(int a[ ], int n) { int s = 0; for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện) s += a[i]; return s; } 12/25/201536 Ví dụ 1: Tính tổng các phần tử có giá trị lẻ trong mảng int TongLe(int a[], int n) { int s = 0; for (int i = 0; i<n; i++) if (a[i] %2!=0) s += a[i]; return s; } Mẫu 2: Tính trung bình các phần tử trong mảng thỏa điều kiện Tính trung bình các phần tử trong mảng float TrungBinh(int a[ ], int n) { int s = 0, int d = 0; for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện) { s += a[i]; d ++; } if (d==0) return 0; return (float) s / d; } 12/25/201538 Ví dụ 2: Tính giá trị trung bình các phần tử có giá trị âm trong mảng float TrungBinhAm(int a[], int n) { long s = 0; int d = 0; for (int i = 0; i<n; i++) if (a[i] < 0) { s += a[i]; d++; } if (d == 0) return 0; return (float)s / d; } Mảng nhiều chiều C/C++ hổ trợ mảng nhiều chiều. Dạng đơn giản nhất của mảng nhiều chiều là mảng hai chiều. Mảng hai chiều thực chất là mảng của những mảng một chiều. Ta có thể xem mảng hai chiều là một ma trận gồm các hàng và các cột Mảng nhiều chiều Khai báo mảng hai chiều type arrayName[rows][columns]; −rows: số hàng −columns: số cột Ví dụ: Khai báo mảng số nguyên 3 hàng 4 cột: int a[3][4] Mảng nhiều chiều Khai báo và khởi tạo mảng hai chiều Cú pháp: type arrayName[][columns] = { {value1,value2,...,valueN}, {value1,value2,...,valueN}, {...}, {value1,value2,...,valueN}}; Mảng nhiều chiều Số phần tử của mỗi hàng phải bằng số cột Số hàng của khai báo mảng hai chiều để trống. Số hàng của mảng được xác định dựa vào số hàng trong phần khởi tạo. Giá trị các phần tử trong mỗi hàng được đặt trong cặp {}, các hàng phân cách nhau bằng một dấu phẩy. Ví dụ: int a[][4] = {{1,2,3,4}, {5,6,7,8},{9,10,11,12}}; #include #include void main() { int a[4][3]; srand(time(NULL)); for(int i=0 ; i<4 ; i++) for(int j=0 ; j<3 ; j++) a[i][j] = rand()%10; for(int i=0 ; i<4 ; i++) { for(int j=0 ; j<3 ; j++) printf(“%d”, a[i][j] ); printf(“\n”); } } #include #include void main() { int a[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}, {13,14,15,16}}; int sum=0; for(int i=0 ; i<4 ; i++) for(int j=0 ; j<4 ; j++) if(i==j) sum += a[i][j]; printf(“Tong duong cheo chinh la: ” , sum); }
Tài liệu liên quan