Tải bản đầy đủ (.ppt) (43 trang)

Bài giảng phương pháp lập trình chương 6 (tiếp theo)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (452.25 KB, 43 trang )

CÂU HỎI: Cho biết kết quả thực
thi chương trình sau:
int f(int);
void main()
{
int n=3;
cout<<“Tong day so: “<getch();
}
int f(int a)
{
if (a>0) return a*a + f(a-1);
else return 0;
}


CHƯƠNG 6
KIỂU ARRAY
(Tiếp theo)


A. ARRAY 1 CHIỀU:
I.
II.
III.
IV.
V.

Khai báo biến kiểu array
Truy xuất biến array
Truyền thông số kiểu array


Sử dụng hàm tạo số ngẫu nhiên
Một số thuật tóan trên array


III. Hàm có thông số kiểu array:

Thông số hình thức không cần chỉ định
số phần tử. Thông số thực có thể có số
lượng phần tử bất kỳ.
Ví dụ 1: Hàm xuất giá trị mảng
void xuat(int a[], int n)
{
for(int i=0; i}
Giả sử ta có mảng: int a[100]; int b[20];
Các lời gọi hàm sau đều hợp lệ:
xuat(a,100);
xuat(b,20);
int n=10; xuat(a,n);



III. Hàm có thông số kiểu array
Thông số kiểu array mặc định truyền dạng
tham biến.
Ví dụ 1: Hàm nhập giá trị mảng
void nhap(int a[], int& n)
{ cout<<“nhap so phan tu “;cin>>n;
for (int i=0; i{ cout<<“Nhập a[“<

cin>>a[i];
}
}
void main()
{ int a[50],n;
nhap(a,n);
xuat(a,n);
getch();
}



IV. Sử dụng hàm tạo số ngẫu nhiên





Hàm random(n) cho kết quả là
một số ngẫu nhiên có trị 0  n -1.
Các số ngẫu nhiên sinh ra thay
đổi sau mỗi lần gọi hàm khởi
động trình ngẫu nhiên
randomize();
Hai hàm này được cung cấp bởi
thư viện stdlib.h


Ví dụ 1: Nhập các phần tử mảng bằng số ngẫu
nhiên 0-99:

void nhap(int a[], int& n)
{ cout<<“nhap so phan tu “;cin>>n;
randomize();
for (int i=0; ia[i]= random(100);
}
void xuat(int a[], int n)
{
for(int i=0; i}
void main()
{ int a[50],n;
nhap(a,n);
xuat(a,n);
getch();
}


V. Một số thuật tóan thường gặp
trên dữ liệu kiểu array
0. max/min
1. Tính tổng/tích dãy số: Duyệt tòan bộ
mảng, thực hiện cộng hoặc nhân tích
lũy.
int tong(int a[], int n)
{ int sum=0;
for (int i=0; isum +=a[i];
return sum;
}



V. Một số thuật tóan thường gặp
trên dữ liệu kiểu array
2. Tìm kiếm: Duyệt mảng cho đến khi tìm thấy.
Thường sử dụng lệnh lặp while.
Ví dụ 1: Tìm vị trí phần tử đầu tiên có trị x. Nếu
không tìm thấy trả về -1.
int ViTri(int a[], int n, int x)
{
int vt=0;
while (vtif (vtelse return -1;
}


V. Một số thuật tóan thường gặp
trên dữ liệu kiểu array
Ví dụ 2: Tìm vị trí phần tử cuối cùng của dãy là
số nguyên tố (-1 nếu không tìm thấy).
int PrimeNumber(int n)
{
if (n==0) return 1;
if (n==1) return 0;
if (n<0) n=-n;
int i=2;
while (n%i !=0) i++;
return (i}



V. Một số thuật tóan thường gặp
trên dữ liệu kiểu array
int LastPrimeNumber(int a[], int n)
{ int i=n-1;
while (!PrimeNumber(a[i]) && i>=0) i--;
return i;
}


V. Một số thuật tóan thường gặp
trên dữ liệu kiểu array
3. Đếm số phần tử theo điều kiện cho trước:
Duyệt tòan bộ mảng, tăng trị biến đếm
khi phần tử đang duyệt thỏa điều kiện.
Ví dụ:
Đếm số phần tử lẽ.
Đếm số phần tử chẵn.
Đếm số phần tử là số chính phương.


V. Một số thuật tóan thường gặp
trên dữ liệu kiểu array
Ví dụ: Đếm số phần tử là số chính phương.
int ChinhPhuong(int n)
{
int i=1;
while (i*ireturn (i*i == n);

}
int SoPTChinhPhuong(int a[], int n)
{ int dem=0;
for(int i=0; iif (ChinhPhuong(a[i]) dem++;
return dem;
}


V. Một số thuật tóan thường gặp
trên dữ liệu kiểu array
4. Sắp xếp – Thuật tóan bubble sort:
Mô tả thuật tóan:

Duyệt tòan bộ n phần tử mảng, tìm phần tử
nhỏ nhất đặt lên vị trí đầu bằng cách đổi chỗ
// 0  n-1

Kế đến, duyệt n-1 phần tử còn lại, tìm phần
tử nhỏ nhất đặt lên vị trí 1 bằng cách đổi chỗ
// 1  n-1

Kế đến, duyệt n-2 phần tử còn lại, tìm phần
tử nhỏ nhất đặt lên vị trí 2 bằng cách đổi chỗ
// 2  n-1

...


Cuối cùng duyệt 2 phần tử cuối // n-2  n-1



V. Một số thuật tóan thường gặp
trên dữ liệu kiểu array
4. Sắp xếp – Thuật tóan bubble sort:
Câu lệnh tương ứng:
 i=0;
for( j =i+1; jso sánh a[i] và a[j] đổi chỗ;
 i=2;
for( j =i+1; jso sánh a[i] và a[j] đổi chỗ;
 i=3;
for( j =i+1; jso sánh a[i] và a[j] đổi chỗ;
 ...
 i=n-2;
for( j =i+1; jso sánh a[i] và a[j] đổi chỗ;


V. Một số thuật tóan thường gặp
trên dữ liệu kiểu array
4. Sắp xếp – Thuật tóan bubble sort:
Cài đặt hàm:
void sort(int a[], int n)
{
for(int i=0; ifor(int j=i+1; jif (a[i]>a[j])

{
tam=a[i];
a[i]=a[j];
a[j]=tam;
}
}


B. ARRAY 2 CHIỀU:
Định nghĩa: Là kiểu mảng một chiều trong
đó mỗi phần tử có kiểu là kiểu mảng
một chiều.
Nội dung:
I.
Khai báo và truy xuất phần tử.
II.
Truyền thông số kiểu array 2 chiều.
III.
Một số thuật tóan trên array 2 chiều.


I. Khai báo và truy xuất phần tử
1. Cú pháp khai báo biến:

TênKiểu TênBiến[N1][N2]
Ý nghĩa: Khai báo biến TênBiến là dãy có N1
phần tử, mỗi phần tử là dãy N2 phần tử
kiểu TênKiểu
Trong đó:
TênKiểu: các kiểu cơ sở, là kiểu đơn

N1, N2 là các hằng số
N1 là số phần tử của chiều thứ 1
N2 là số phần tử của chiều thứ 2


I. Khai báo và truy xuất phần tử
Ví dụ 1: Để lưu điểm của 5 môn, mỗi môn có
3 cột điểm.
float diem[5][3];
Ví dụ 2: Lưu họ tên cho 10 sinh viên, mỗi họ
tên là một dãy 30 ký tự.
char HoTen[10][30];


I. Khai báo và truy xuất phần tử
Lưu ý 1: Người ta thường trình bày mỗi phần
tử của chiều thứ 1 trên một dòng. Nên N1
còn gọi là số dòng, N2 là số cột.
Ví dụ 3:
Biến diem là một bảng 5 dòng, 3 cột
Biến HoTen một bảng 10 dòng, 30 cột
Ví dụ 4: Để lưu ma trận số nguyên dạng sau:
4
5
7
1
2
1
8
4

4
6
1
4
Ta khai báo biến:
int MaTran[3][4];


I. Khai báo và truy xuất phần tử
Lưu ý 2: Các phần tử của biến mảng 2 chiều
được cấp phát không gian nhớ liên tục theo
thứ tự hàng.
Ví dụ 5: Các phần tử của biến MaTran trong
bộ nhớ như sau:
4 5 7 1 2 1 8 4 4 6 1 4
Hàng 1

Hàng 2

Hàng 3


I. Khai báo và truy xuất phần tử
2. Truy xuất biến mảng 2 chiều: Phải truy xuất
từng phần tử.

cú pháp: TênBiến[i][j]
Ý nghĩa: Truy xuất phần tử ở dòng i cột j của
biến mảng 2 chiều TênBiến
Trong đó:

i, j là biểu thức nguyên.
i là chỉ số chiều thứ nhất, hay chỉ số dòng.
j là chỉ số chiều thứ hai, hay chỉ số cột.


I. Khai báo và truy xuất phần tử
Ví dụ 1:
int T[2][3];
Biến T gồm các phần tử
T[0][0], T[0][1], T[0][2]
T[1][0], T[1][1], T[1][2]
T[2][0], T[2][1], T[2][2]
T[0][0] là một biến nguyên int.
T[0] là một mảng nguyên 3 phần tử.


I. Khai báo và truy xuất phần tử
Ví dụ 2: Nhập dữ liệu cho biến mảng 2c
int T[10][20];
for(int i=0; i<10; i++)
for(int j=0; j<20; j++)
{ cout<<“Nhập a[“<cin>>a[i][j];
}


I. Khai báo và truy xuất phần tử
Lưu ý: Quản lý số dòng cột thực tế nhập bằng
2 biến nguyên m, n.
Ví dụ 2:

const SIZE1=50;
const SIZE2=50;
int T[SIZE1][SIZE2];
int m, n;
cout<<“số dòng:”; cin>> m;
cout<<“số cột:”; cin>>n;
for(int i=0; ifor(int j=0; j{ cout<<“Nhập a[“<cin>>a[i][j];
}


×