1. Trang chủ
  2. » Công Nghệ Thông Tin

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

11 613 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 11
Dung lượng 101,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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ố

Trang 1

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];

}

}

//Hàm xuất dữ liệu của mảng ra màn hình

void xuat (int a[MAX], int n)

{

int i;

for ( i = 0; i < n; i++)

cout<<a[i]<<’\t’;

}

Trang 2

Lưu ý:

a đối với mảng 1 chiều, có 2 giá trị thường đi theo:

 KT: kích thước khai báo, là một giá trị có trước, nên là một hằng định nghĩa trước.

 n : Kích thước thực sự của mảng trong mỗi lần chạy chương trình (n <= KT)

b Truyền tham số:

của đối)

4 Kỹ thuật xử lý mảng.

a Kỹ thuật thử và sai

Cần xác định Kq khi biết Kq{a0, ,an-1 } :

 Giả sử Kq = a0;

 Duyệt các phần tử còn lại để chính xác giá trị Kq.

b Kỹ thuật duyệt :

 Toàn cục : duyệt tất cả các phần tử của tập hợp.

 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, ai thỏa mãn.

 Sai : nếu i , ai 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, ai thỏa mãn.

 Sai : nếu i , ai 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 của chương trình là :

- In ra màn hình menu có các chức năng sau :

1 Tìm x có trong a ? Nếu có trả về 1, nếu không trả về 0.

2 a có thứ tự tăng

3 Max(a0, ,an-1): giá trị lớn nhất của dãy.

Trang 3

4 CSDT_Max : Trả về chỉ số đầu tiên đạt max(a0, ,an-1)

5 Thóat khỏi chương trình

- Muốn thực hiện thao tác nào thì chọn chức năng tương ứng của menu

Thực hiện:

Bước 1: Tạo Project với tên “Lab5_Vd1”

Bước 2: Tạo tập tin chương trình vd1.cpp

Bước 3: Trong tập tin vd1.cpp, soạn code theo cấu trúc:

#include <iostream>

#define MAX 1000

using namespace std;

//Cac ham menu

void Menu();

int ChonMenu();

void XL_Menu(int a[MAX], int n, int Chon);

//Cac ham nhap xuat

void Nhap (int a[MAX], int n);

void Xuat (int a[MAX], int n);

//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()

{

int Chon;

for(;;)

{

Menu();

cout<<"\nNhap Chon tu 1 -> 5: ";

Trang 4

if (1 <= Chon && Chon <= 5)

break;

}

return Chon;

}

void XL_Menu(int a[MAX], int n, int Chon)

{

int x, Kq, Gt_Max;

switch(Chon)

{

case 1:

cout<<"\n1 Tim x";

cout<<"\nNhap x: ";

cin>>x;

Xuat(a, n);

Kq = Tim_x(a, n, x);

if (Kq )

cout<<"\n"<<x<<" co trong day a"; else

cout<<"\n"<<x<<" khong co trong day a!"; cout<<'\n';

break;

case 2:

cout<<"\n2 Kiem tra day co thu tu tang ?";

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

Trang 5

// -//Tim x co trong mang : bt OR

int Tim_x(int a[MAX], int n, int x)

{

int i, Kq = 0;

for(i= 0; i < n; i++)

if(a[i] == x) {

Kq = 1;

break;

} return Kq;

}

//Kiem tra day tang : BT AND

int Tang(int a[MAX], int n)

{

int Kq, i;

Kq = 1;//Day tang - AND

for(i = 0; i < n-1; i++)

if(a[i] > a[i+1]) {

Kq = 0;

break;

} return Kq;

}

//Tim gia tri max cua day: Thu va sai

int Max(int a[MAX], int n)

{

int i, Gt_Max;

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

Trang 6

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

 Cuối cùng: Các số 0

5 Thóat khỏi chương trình

- Muốn thực hiện thao tác nào thì chọn chức năng tương ứng của menu

Thực hiện:

Bước 1: Tạo Project với tên “Lab5_Vd2”

Bước 2: Tạo tập tin chương trình vd2.cpp

Bước 3: Trong tập tin vd2.cpp, soạn code theo cấu trúc:

//Duyet, THU VA SAI

#include <iostream>

#include <math.h>

#define MAX 1000

using namespace std;

//Cac ham menu

void Menu();

int ChonMenu();

void XL_Menu(int a[MAX], int n, int Chon);

//Cac ham nhap xuat

void Nhap (int a[MAX], int n);

void Xuat (int a[MAX], int n);

//Cac ham chuc nang

int Dem_x(int a[MAX], int n, int x);

int Tong(int a[MAX], int n);

int Tong_NT(int a[MAX], int n);

void Sap_D_A_0(int a[MAX], int n);

//Cac ham bo tro

int Nt(int x);

// -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 Dem x";

Trang 7

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;

}

return Chon;

}

void XL_Menu(int a[MAX], int n, int Chon)

{

int x, Kq;

switch(Chon)

{

case 1:

cout<<"\n1 Dem x";

cout<<"\nNhap x: ";

cin>>x;

cout<<"\nDay a:\n";

Xuat(a, n);

Kq = Dem_x(a, n, x);

cout<<"\nSo lan "<<x<<" xuat hien trong a: "<<Kq; cout<<'\n';

break;

case 2:

cout<<"\n1 Tong";

cout<<"\nDay a:\n";

Xuat(a, n);

Kq = Tong(a, n);

cout<<"\nTong S = "<<Kq;

cout<<'\n';

break;

case 3:

cout<<"\n1 Tong";

cout<<"\nDay a:\n";

Xuat(a, n);

Kq = Tong_NT(a, n);

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;

Trang 8

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;

for ( i = 0; i < n; i++)

cout<<a[i]<<'\t';

}

// -//Cac ham chuc nang

//Dem so lan x xuat hien trong a: Duyet cuc bo (xu ly cuc bo) int Dem_x(int a[MAX], int n, int x)

{

int i, Kq = 0;

for(i= 0; i < n; i++)

if(a[i] == x)

Kq++;

return Kq;

}

//Tong cac phan tu trong day: Duyet toan cuc

int Tong(int a[MAX], int n)

{

int i, S = 0;

for(i= 0; i < n; i++)

S += a[i];

return S;

}

//Tong cac so nguyen to trong day: - Duyet cuc bo - gia tri ham int Tong_NT(int a[MAX], int n)

{

int i, S = 0;

for(i= 0; i < n; i++)

if(Nt(a[i]))

S += a[i];

return S;

}

//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++)

Trang 9

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

{

Kq = 1;

m = (int)sqrt(x);

i = 2;

while (i <= m && Kq) {

if(x % i == 0)

Kq = 0;

i++;

} }

return Kq;

}

D Bài tập:

Bài 1:

1 Tìm x có trong a ? Nếu có trả về chỉ số tương ứng đầu tiên Nếu không trả về -1.

2 Tìm số nguyên tố có trong a ? Nếu có trả về chỉ số tương ứng cuối cùng Nếu không trả về -1.

3 Dem_Nt: Đếm số các số nguyên tố.

4 Đếm số lượng các đường chạy

(Đường chạy là dãy con có thứ tự dài nhất gồm những phần tử kế tiếp)

5 Tìm phần tử xuất hiện nhiều nhất và đếm số lần xuất hiện của nó.

Bài 2:

1 Cs_Am_Max: Tìm chỉ số (đầu tiên) của số âm lớn nhất, nếu có Nếu không, trả

về -1.

2 Min: Tính min(a1, ,an).

Trang 10

3 Tong_Duy_Nhat: Tổng các giá trị chỉ xuất hiện 1 lần

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 (ak, ak+1, , an-1) ra sau 1 vị trí :

for(int i = n-1; i>=k;i ) //Theo thứ tự này để không mất thông tin

a[i+1] = a[i];

 sau đó chèn x vào vị trí thứ k:

a[k] = x;

n = n+1;

2 Xóa giá trị ở vị trí thứ k của a:

 Chuyển các phần tử của a từ vị trí thứ k+1 trở về sau (ak+1, , an-1 ) về trước 1 vị trí :

for(int i = k+1; i < n ; i++)

Trang 11

a[i-1] = a[i];

n = n-1;

Ngày đăng: 01/08/2014, 01:20

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w