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).
44 trang |
Chia sẻ: thuychi16 | Lượt xem: 1102 | Lượt tải: 2
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);
}