Bài thực hành số 5:
Kỹ thuật xử lý mảng một chiều
A. Mục tiêu
Tổ chức tốt hệ thống menu chương trình
Nắm vững các khái niệm, thao tác nhập xuất trên mảng một chiều
Nắm vững một số kỹ thuật xử lý cơ bản trên mảng 1 chiều
Rèn luyện cách gọi hàm, truyền tham số.
B. Ôn tập:
Cú pháp định nghĩa biến mảng, kiểu mảng.
Các thao tác nhập xuất dữ liệu
Các kỹ thuật xử lý mảng
1. Cú pháp khai báo (định nghĩa) biến mảng 1 chiều
KDL Ten_Mang[KT];
Trong đó:
• KDL: Kiểu của mảng (của các phần tử của mảng), có thể là một kiểu dữ liệu
nào đó khác kiểu mảng.
• Ten_Mang: Tên của mảng (là một từ tự đặt, đặt theo qui ước đặt tên)
• KT: một số nguyên dương
2. Cú pháp định nghĩa Kiểu mảng 1 chiều
typedef KDL Ten_Mang[KT];
• Ten_Mang: trở thành tên của kiểu dữ liệu mảng 1 chiều
3. Các thao tác nhập xuất:
//Hàm nhập dữ liệu; MAX: là một giá trị hằng định nghĩa trước
void Nhap (int a[MAX], int n)
{
int i;
for ( i = 0; i < n; i++)
{
cout<<”\na[“<< i<<”] = “;
cin>>a[i];
}
• Cục bộ : Chỉ xét một miền con của tập hợp.
Miền con này tạo bởi:
o Liệt kê các giá trị của hàm
o Lập bảng.
c. Kỹ thuật kiểm tra tính đúng, sai
o Bài toán AND:
o Dạng :
Đúng : nếu ∀i, a
i
thỏa mãn.
Sai : nếu ∃i , a
i
không thỏa mãn.
o Cách thực hiện như sau :
Kq = 1; // đúng.
Duyệt để tìm điều kiện gán Kq = 0; // Sai
o Bài toán OR:
o Dạng :
Đúng : nếu ∃i, a
i
thỏa mãn.
Sai : nếu ∀i , a
i
không thỏa mãn.
o Cách thực hiện như sau :
Kq = 0; // Sai.
Duyệt để tìm điều kiện gán Kq = 1; // đúng
C. Luyện tập:
Ví dụ 1: (Các bài toán AND, OR, Thử và sai)
Viết chương trình thực hiện các thao tác trên dãy a gồm n số nguyên. Yêu cầu
//Cac ham chuc nang
int Tim_x(int a[MAX], int n, int x);
int Tang(int a[MAX], int n);
int Max(int a[MAX], int n);
int CSDT_Max(int a[MAX], int n);
//
void main()
{
int Chon, n, a[MAX];
cout<<"\nNhap n = ";
cin>>n;
Nhap (a, n);
do
{
Chon = ChonMenu();
XL_Menu(a, n,Chon);
}
while(1);
}
void Menu()
{
cout<<"\n BANG MENU ";
cout<<"\n1. Tim x";
cout<<"\n2. Kiem tra day co thu tu tang ?";
cout<<"\n3. Max[0, ,n-1]";
cout<<"\n4. CS dau tien dat Max";
cout<<"\n5. Thoat khoi chuong trinh!!!";
}
int ChonMenu()
{
Xuat(a, n);
Kq = Tang(a, n);
if (Kq)
cout<<"\nday tang!";
else
cout<<"\nday khong tang!";
cout<<'\n';
break;
case 3:
cout<<"\n3. Max[0, ,n-1]";
Xuat(a, n);
Gt_Max= Max(a,n);
cout<<"\nMax[0, ,"<<n-1<<"] = "<<Gt_Max;
cout<<'\n';
break;
case 4:
cout<<"\n4. CS dau tien dat Max";;
Xuat(a, n);
Kq = CSDT_Max(a,n);
cout<<"\nChi so dau tien dat Max "<<Kq;
cout<<'\n';
break;
case 5:
cout<<"\n5. Thoat khoi CT!\n";
exit(1);
}
}
//
//void Nhap (int a[MAX], int n): Tự viết
//void Xuat (int a[MAX], int n) : Tự viết
Gt_Max = a[0];
for(i = 1; i < n; i++)
if(Gt_Max < a[i])
Gt_Max = a[i];
return Gt_Max;
}
//Tra ve chi so cua phan tu dau tien dat max: Thu va sai
int CSDT_Max(int a[MAX], int n)
{
int Kq, i, Max;
Kq = 0;
Max = a[Kq];
for(i = 1; i < n; i++)
if(Max < a[i])
{
Kq = i;
Max = a[Kq];
}
return Kq;
}
Ví dụ 2: (Các bài toán Duyệt, Thử và sai)
Viết chương trình thực hiện các thao tác trên dãy a gồm n số nguyên. Yêu cầu
của chương trình là :
- In ra màn hình menu có các chức năng sau :
1. Đếm số lần xuất hiện của x trong dãy a
2. Tổng các phần tử trong dãy
3. Tổng các số nguyên tố trong dãy
4. Sắp theo yêu cầu:
• Đầu dãy: Các số dương tăng dần
• Tiếp theo: Các số âm giảm dần
cout<<"\nNhap n = ";
cin>>n;
Nhap (a, n);
do
{
Chon = ChonMenu();
XL_Menu(a, n,Chon);
}
while(1);
}
void Menu()
{
cout<<"\n BANG MENU ";
cout<<"\n1. Dem x";
cout<<"\n2. Tong";
cout<<"\n3. Tong nguyen to";
cout<<"\n1. Duong tang_ Am giam - Khong";
cout<<"\n5. Thoat khoi chuong trinh!!!";
}
int ChonMenu()
{
int Chon;
for(;;)
{
Menu();
cout<<"\nNhap Chon tu 1 -> 5: ";
cin>>Chon;
if (1 <= Chon && Chon <= 5)
break;
}
cout<<"\nTong cac so nguyen to S = "<<Kq;
cout<<'\n';
break;
case 4:
cout<<"\n1. Duong tang_ Am giam - Khong";
cout<<"\nDay ban dau:\n";
Xuat(a, n);
Sap_D_A_0(a,n);
cout<<"\nDay da sap:\n";
Xuat(a, n);
cout<<'\n';
break;
case 5:
cout<<"\n5. Thoat khoi CT!\n";
exit(1);
}
}
//
void Nhap (int a[MAX], int n)
{
int i;
for ( i = 0; i < n; i++)
{
cout<<"\na["<< i<<"] = ";
cin>>a[i];
}
}
void Xuat (int a[MAX], int n)
{
int i;
}
//Duyet cuc bo - Lap bang
void Sap_D_A_0(int a[MAX], int n)
{
int i,j, t, Mc;
for(i= 0; i < n-1; i++)
for(j= i+1; j < n; j++)
{
Mc = ((a[i] < 0) && (a[j] < 0) && (a[i] < a[j])) ||
(a[i] < 0 && a[j] > 0) ||
(a[i] == 0 && a[j] < 0) ||
(a[i] == 0 && a[j] > 0) ||
((a[i] > 0) && (a[j] > 0) && (a[i] > a[j])) ;
if(Mc)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
//
//Cac ham bo tro
int Nt(int x)
{
int Kq, i, m;
if(x < 2)
Kq = 0;
else
{
4. Tong_Phan_Biet: Tổng các giá trị phân biệt.
Bài 3:
1. Sap_Tang: sắp a theo thứ tự tăng.
2. Sap_Duong_Tang: Sắp tăng các số dương, các số khác giữ nguyên vị trí.
3. Sap_0_Cuoi: Sắp lại mảng a thỏa yêu cầu:
- Các số 0 ở cuối mảng.
- Các số còn lại ở đầu mảng và tăng.
4. Sap_0_Am_Duong:
- Các số 0 đầu mảng
- Các số âm ở giữa mảng và có thứ tự giảm.
- Các số dương cuối mảng và có thứ tự tăng.
Bài 4:
Kiểm tra các phát biểu :
1. a không chứa 0.
2. a có thứ tự tăng.
3. a chứa ít nhất 3 phần tử liên tiếp trùng nhau
4. Nếu a có chưa phần tử 0 thì phải chứa phần tử có giá trị 1.
Bài 5:
Cho mảng a[0 n-1] có n số nguyên, x là số nguyên.Thực hiện các chức năng
sau:
1. Chen(a,n,x,k) ≡ chèn x vào a tại vị trí thứ k, kết quả trả về a.
(Nếu k = n, chèn x vào cuối mảng)
2. Xoa(a,n,k) ≡ Xóa giá trị ở vị trí thứ k của a, kết quả trả về a.
Hướng dẫn:
1. Chèn x vào vị trí thứ k:
• Chuyển các phần tử của a từ vị trí thứ k trở về sau (a
k
, a
k+1
, , a