Bài thực hành số 5: Kỹ thuật xử lý mảng một chiều - Pdf 20

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


Nhờ tải bản gốc
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status