You are on page 1of 36

12/07/21 Nguyen Ha Giang 1

 Biến gồm nhiều phần tử con cùng kiểu dữ liệu


 Truy xuất các phần tử con thông qua chỉ mục

 Biến mảng được cấp phát bộ nhớ liên tục

Chỉ mục 0 1 2 3 n-2 n-1


Mảng a ...

a[0] a[n-1]
12/07/21 Nguyen Ha Giang 2
 Khai báo mảng tĩnh
#define MAX 100

int a[MAX];
float f[50];
 Cấp phát động
int * a;

a = new int[n];

12/07/21 Nguyen Ha Giang 3


 Sử dụng các hàm nhập xuất của C/C++
void InputArray(int *&a, int &n)
{
printf(“Nhap n: “);
scanf(“%d”, &n);
a = new int[n];
for(int i=0; i < n; i++)
{
printf(“a[%d] = ”, i);
scanf(“%d”, &a[i]);
}
}

12/07/21 Nguyen Ha Giang 4


Kỹ thuật đặt cờ
1 hiệu
Bài toán “kiểm tra”, “đánh dấu”

Kỹ thuật đặt lính


2 canh
Bài toán “tìm kiếm”, “liệt kê”

Nguyen Ha Giang 5
 Kiểm tra xem mảng có thứ tự tăng dần?
 Sửdụng biến cờ hiệu
 Duyệt qua từng cặp phần tử

 Nếu vi phạm thứ tự  bật cờ hiệu: dừng


 Duyệt đến hết mảng nếu không có cặp nào vi phạm
 mảng tăng

12/07/21 Nguyen Ha Giang 6


 Sinh viên cài đặt
int KiemTraTang (int a[ ], int n) {
int flag = TRUE;
for (int i = 0; i < n-1; i ++ )
if ( a[i] > a[i+1] )
{
flag = FALSE;
break; #define TRUE 1
#define FALSE 0
}
return flag;
}

12/07/21 Nguyen Ha Giang 7


 Kiểm tra mảng có đối xứng hay không
 Sửdụng biến cờ hiệu
 Duyệt qua từng cặp phần tử ở vị trí đối xứng

 Nếu có một cặp ở vị trí đối xứng mà giá trị khác nhau
 bật cờ hiệu, dừng
 Duyệt đến hết các cặp đối xứng vị trị trí, nếu tất cả
đều thỏa  mảng đối xứng.

12/07/21 Nguyen Ha Giang 8


 Cài đặt
1 2
int DoiXung(int a[], int n) int DoiXung(int a[], int n)
{ {
int flag = TRUE; int h = n/2;
for( int i =0; i <n/2; i+ for( int i =0; i <h; i++)
+) if ( a[i] != a[n-i-1])
if ( a[i] != a[n-i-1]) return 0; // ko dx
{ return 1; //doi xung
flag =false; }
break;
}
return flag;
}

12/07/21 Nguyen Ha Giang 9


 Đếm xem có bao nhiêu phần tử trong mảng có
tính chất không nhỏ hơn tất cả phần tử trước
 Khởi tạo biến đếm = 0
 Xét từ phần tử thứ 2 đến phần tử cuối

 Với mỗi phần tử này: duyệt từ đầu mảng  phần tử


trước nó
 Nếu pt này không nhỏ hơn tất cả phần tử trước nó 
tăng biến đếm
 Ngược lại qua phần tử kế tiếp

12/07/21 Nguyen Ha Giang 10


 Cài đặt
int DemPhanTu (int a[], int n) {
int count=0, flag;
for(int i=1; i<n; i++) {
flag = 1;
for(int j =0; j <i ; j++)
if (a[j]>a[i]) {
flag = 0;
break;
}
count +=flag;
+=flag
}
return count;
}

12/07/21 Nguyen Ha Giang 11


 Hãy cho biết các phần tử trong mảng có lập
thành cấp số cộng hay không
 Nếu mảng là cấp số cộng thì khoảng cách giữa hai
phần tử liên tiếp trong mảng là hằng (r)
 Kiểm tra xem khoảng cách giữa các phần tử liên
tiếp có bằng r hay không
 Nếu tất cả cùng thỏa  mảng lập thành cấp số
cộng
 Ngược lại mảng không có tính chất đó

12/07/21 Nguyen Ha Giang 12


 Cách thực hiện
 Tính d là khoảng cách của pt đầu tiên và thứ hai
 Khai báo biến cờ hiệu

 Duyệt qua các phần tử còn lại

 Nếu một phần tử có khoảng cách với pt trước nó khác d


thì  mảng không là cấp số cộng
 Nếu tất cả thỏa thì mảng là dãy cấp số cộng, công sai d

12/07/21 Nguyen Ha Giang 13


 Cài đặt
int KiemTraCapSoCong(int a[], int n)
{
if ( n <=2) return 1;
int d = a[1] - a[0];
int flag = 1;
for(int i=1; i <n-1;i++)
if (a[i+1]-a[i] != d)
{
flag = 0;
break;
}
return flag;
}

12/07/21 Nguyen Ha Giang 14


 Xác định xem phần tử x có trong mảng?
 Vét cạn: với mảng bất kỳ
 Duyệt qua từng phần nếu tìm thấy trả về “tìm
thấy”
 Ngược lại duyệt hết các phần tử, nếu ko có  “
không tìm thấy”
 Nhị phân: mảng được sắp
 Tìm kiếm nhị phân

12/07/21 Nguyen Ha Giang 15


 Cài đặt int TimKiem(int a[], int n, int x)
{ 2
int i=0;
int TimKiem(int a[], int n, int
while (i<n && x!=a[i]) i++;
x)
1 if (i==n)
{
return -1; // không tìm
int i=0;
thấy
a[n] = x;
return i; //trả về vị trí tìm
while ( a[i] != x)
được
i++;
}
if (i== n) int TimKiem(int a[], int n,
return -1; int x)
return i; { 3
for(int i=0; i < n; i++)
} if (a[i] == x)
return i;
return -1;
12/07/21 }
Nguyen Ha Giang 16
 Tìm giá trị lớn nhất trong mảng
 Kỹthuật đặt lính canh
 Duyệt đến hết mảng

 Cách thực hiện


 Chobiến tạm max = phần tử đầu tiên
 Duyệt qua các phần tử còn lại

 Nếu phần tử a[i] lớn hơn max thì gán max = a[i]
 Sau khi xét hết các phần tử của mảng  max

12/07/21 Nguyen Ha Giang 17


 Cài đặt

int TimMax(int a[], int n)


{
int i=1;
int max = a[0];
while (i<n)
{
if (a[i] >max ) max = a[i];
i++;
}
return max;
}

12/07/21 Nguyen Ha Giang 18


 Hãy tìm phần tử trong mảng số nguyên, có giá
trị xa giá trị x nhất
 Phần tử xa x nhất chính là phần tử trong mảng có
khoảng cách đến x là lớn nhất.
 Duyệt qua từng phần tử để tìm phần tử có khoảng
cách đến x là lớn nhất

12/07/21 Nguyen Ha Giang 19


 Cài đặt

int TimPTXaNhat(int a[], int n, int x)


{
int d = abs(x-a[0]);
int pt = a[0];
for(int i=1; i < n; i++)
if (abs(a[i]-x)>d)
{
d = abs(a[i]-x);
pt = a[i];
}
return pt;
}

12/07/21 Nguyen Ha Giang 20


 Tìm số chính phương đầu tiên trong mảng số
nguyên
 Số chính phương là số bình phương của số nguyên
khác hay căn bậc hai của số CP là số nguyên.
 Cách tìm
 Cài đặt hàm kiểm tra xem một số nguyên có phải là số
chính phương hay không
 Duyệt từ đầu mảng
 Kiểm tra xem phần tử đó có phải số CP hay không
 Nếu đúng => số CP tìm được
 Ngược lại duyệt hết mảng => không tìm thấy

12/07/21 Nguyen Ha Giang 21


 Cài đặt
int SoChinhPhuong(int x)
{
for(int i=1; i <x; i++)
if (i*i == x)
return 1;
return 0;
}
int TimSoCP(int a[], int n)
Trả về: {
-1: không có số CP for(int i=0; i < n; i++)
>=0: vị trí trong if (SoChinhPhuong(a[i]))
mảng return i;
của số CP đầu tiên return -1;
}
12/07/21 Nguyen Ha Giang 22
 Tính tổng các số có chữ số hàng chục là 5
 Khởi tạo sum =0;
 Duyệt qua từng phần tử, kiểm tra xem phần tử đó
có giá trị 5 ở hàng chục không
 Nếu có cộng dồn vào sum
 Ngược lại qua xét phần tử kế tiếp cho đến hết

12/07/21 Nguyen Ha Giang 23


 Cài đặt

int TongSoHangChuc5(int a[], int n)


{
int sum=0;
for(int i=0; i < n; i++)
if ((abs(a[i])/10)%10 == 5)
sum +=a[i];
return sum;
}

12/07/21 Nguyen Ha Giang 24


 Tính tổng các phần tử cực trị trong mảng
 Phần tử cực trị là phần tử lớn hơn hay nhỏ hơn phần
tử xung quanh nó
 Lưu ý phần tử ở hai biên chỉ có một phần tử kế cận

12/07/21 Nguyen Ha Giang 25


 Cài đặt
int TongCucTri(int a[], int n)
{
int sum =0;
if (a[0] != a[1]) sum+=a[0];
if (a[n-1] != a[n-2]) sum +=a[n-1];
for(int i=1; i < n-1; i++)
{
if (( a[i]>a[i-1] && a[i] >a[i+1]) ||
(a[i]<a[i-1] && a[i]<a[i+1]))
sum += a[i];
}
return sum;
}

12/07/21 Nguyen Ha Giang 26


 Đếm số lượng giá trị lớn nhất có trong mảng
 Tìm giá trị lớn nhất
 Sau khi có giá trị lớn nhất, duyệt mảng lần nữa đếm
xem có bao nhiêu giá trị bằng giá trị lớn nhất vừa tìm
  hai lần duyệt mảng!

 Cách làm chỉ duyệt mảng 1 lần


 Sử dụng biến count làm biến đếm
 Duyệt qua từng phần tử a[i]

 Nếu a[i] > max  cập nhật lại max và count =1;
 Nếu a[i] = max  count++;
12/07/21 Nguyen Ha Giang 27
 Thêm một phần tử x vào mảng ở vị trí k
 Xuất phát từ cuối mảng tiến hành đẩy lần lượt các
phần tử về phía sau đến vị trí cần chèn
 Chèn phần tử vào vị trí cần chèn

 Tăng kích thước mảng

12/07/21 Nguyen Ha Giang 28


 Cài đặt

void Chen(int a[], int &n, int X, int vitri)


{
if (vitri >n || vitri <0) return;
for (int i = n; i >vitri ; i--)
a[i] = a[i-1] ;
a[vitri] = X;
n++;
}

Lưu ý: cẩn thận với việc tăng kích thước của mảng a

12/07/21 Nguyen Ha Giang 29


 Xóa phần tử có chỉ số k trong mảng
 Duyệt mảng từ bên trái
 Tại vị trí cần xóa tiến hành dời các phần tử phía sau
lên
 Giảm kích thước mảng

12/07/21 Nguyen Ha Giang 30


 Cài đặt

void XoaTaiViTri (int a[], int &n, int vitri)


{
for (int i = vitri; i < n-1 ; i++)
a[i] = a[i+1];
n--;
}

12/07/21 Nguyen Ha Giang 31


 Thêm phần tử x vào mảng tăng và giữ nguyên
tính tăng sau khi thêm
 Duyệt từ cuối mảng
 Nếu phần tử a[i] lớn hơn x thì dời phần tử này ra phía
sau
 Tại vị trí i nào đó a[i] <x thì chèn x vào vị trí i+1 

kết thúc
 Tăng kích thước mảng lên 1

12/07/21 Nguyen Ha Giang 32


 Cài đặt
void ChenTang(int a[], int &n, int x)
{
int i = n-1;
while ( a[i]>x && i>=0)
{
a[i+1] = a[i];
i--;
}
a[i+1] = x;
n++;
}

12/07/21 Nguyen Ha Giang 33


 Dịch trái xoay vòng các phần tử trong mảng

void dichtrai(int a[], int n)


 {
              int tam = a[0]; // lưu tạm phần tử đầu tiên
              for (int i=0; i<n-1; i++)
       {
                          a[i]=a[i+1];
       }
              a[n-1]= tam; // phần tử cuối cùng = phần từ đầu tiên
 }

12/07/21 Nguyen Ha Giang 34


 Tìm giá trị x sao cho đoạn [-x,x] chứa tất cả các giá
trị trong mảng
 Sắp xếp dương tăng, âm giảm, vị trí tương đối

không đổi
 Cho biết mảng a có phải là mảng con b hay không

 Đếm số lần xuất hiện của mảng a trong mảng b

 Trộn hai mảng a,b tăng thành mảng c cũng tăng

 Liệt kê các dãy con tăng dần

12/07/21 Nguyen Ha Giang 35


Viết chương trình nhập vào một dãy số a gồm
n số thực ( n ≤ 100 ), nhập vào dãy số b gồm m
số thực (m ≤ 100 ).
1.In ra những phần tử chỉ xuất hiện trong dãy a
mà không xuất hiện trong dãy b.
2.In ra những phần tử xuất hiện ở cả hai dãy.

12/07/21 Nguyen Ha Giang 36

You might also like