Bài giảng Kỹ thuật lập trình cơ bản (C++) - Chương 4 trang bị cho người học những kiến thức về mảng một chiều. Các nội dung cụ thể trình bày trong chương này: Dữ liệu kiểu mảng, số phần tử mảng, khởi tạo giá trị cho mảng, một số thao tác trên mảng,... Mời các bạn cùng tham khảo.
Trang 1GV: ThS TRẦN NGUYỄN ANH CHI
Trường Cao đẳng Công nghệ Thông Tin Khoa Công nghệ Thông Tin
TpHCM, 02/2011
CHƯƠNG 4 MẢNG MỘT CHIỀU
Đặt vấn đề
Ví dụ
Chương trình cần lưu trữ 3 số nguyên?
=> Khai báo 3 biến int a1, a2, a3;
Chương trình cần lưu trữ 100 số nguyên?
=> Khai báo 100 biến kiểu số nguyên!
Người dùng muốn nhập n số nguyên?
=> Không thực hiện được!
Giải pháp
Kiểu dữ liệu mới cho phép lưu trữ một dãy các số nguyên
2
Trang 2Dữ liệu kiểu mảng
Khái niệm
Là một kiểu dữ liệu có cấu trúc do người lập trình định nghĩa
Biểu diễn một dãy các biến có cùng kiểu Ví dụ: dãy các số nguyên, dãy các ký tự…
Kích thước được xác định ngay khi khai báo
NNLT C luôn chỉ định một khối nhớ liên tục cho một biến kiểu mảng
3
Dữ liệu kiểu mảng (tt)
Khai báo
<kiểu cơ sở> <tên biến mảng>[<số phần tử>];
0 1 2 3 4 5 6 7 8 9
Mang1Chieu
Ví dụ 1
int Mang1Chieu[10];
0 1 2 3 4 5 6
Ví dụ 2
float a[7];
Chỉ số Giá trị
Chỉ số
Trang 3Số phần tử mảng
Phải xác định cụ thể số phần tử ngay lúc khai báo, không được sử dụng biến chưa có giá trị
5
Nên sử dụng chỉ thị tiền xử lý #define để định nghĩa số phần tử mảng
int n1; int a[n1]; //sai
int n2 = 10; int a[n2];
#define n3 10
int a[n3]; // int a[10];
Khởi tạo giá trị cho mảng
Khởi tạo giá trị cho mọi phần tử của mảng
6
Khởi tạo giá trị cho một số phần tử đầu mảng
int a[4] = {123, 456, -789, 100};
a
int a[4] = {123, -456};
a
Trang 4Khởi tạo giá trị cho mảng(tt)
Khởi tạo giá trị 0 cho mọi phần tử của mảng
7
int a[4] = {0};
a
Tự động xác định số lượng phần tử của mảng
int a[] = {123, -456, 789, 100};
a
Truy xuất đến một phần tử trong mảng
Truy xuất thông qua chỉ số
Ví dụ:cho mảng như sau:
int a[4];
Các truy xuất:
Hợp lệ: a[0], a[1], a[2], a[3]
Không Hợp lệ: a[-2], a[-1], a[4], a[5]…
Chỉ số không hợp lệ thường cho kết quả không mong muốn
Trang 5Truy xuất đến một phần tử (tt)
9
i= 0 i= 1 i= 2 i= 3 i= 4
Một số thao tác trên mảng
Nhập mảng
Xuất mảng
Đếm, tính tổng, tính trung bình
Tìm kiếm
Kiểm tra mảng thỏa điều kiện cho trước
Sắp xếp
Tách / ghép mảng
Chèn / xóa
10
Trang 6Nhập mảng
Yêu cầu
Cho phép nhập mảng a, số lượng phần tử n
Ý tưởng
Cho trước một mảng có số lượng phần tử là MAX
Nhập số lượng phần tử thực sự n của mảng
Nhập từng phần tử cho mảng từ chỉ số 0 đến n – 1
11
4
…
Nhập mảng (tt)
#define MAX 100
void NhapMang(int a[], int n)
{
int i;
for (i=0; i<n; i++) //for(i=0; i<=n-1;i++)
{
cout<<“Phan tu thu: ”<<i;
cin>>a[i];
}
}
Trang 7Xuất mảng
Yêu cầu
Cho trước mảng a, số lượng phần tử n Hãy xuất nội dung mảng a ra màn hình
Ý tưởng
Xuất giá trị từng phần tử của mảng từ chỉ số 0 đến n-1
13
…
Xuất mảng (tt)
14
void XuatMang(int a[], int n)
{
int i;
for (i = 0; i < n; i++)
cout<<a[i]<<“\t”;
}
void main()
{
int n, a[MAX];
cout<<“Nhap so luong phan tu thuc su: “;
cin>>n;
NhapMang(a,n);
XuatMang(a,n);
}
Trang 8Liệt kê các phần tử thỏa điều kiện
Yêu cầu
Cho trước mảng a, số lượng phần tử n Hãy xuất các phần tử thỏa điều kiện nào đó
Ý tưởng
Duyệt từ đầu đến cuối mảng (từ chỉ số 0 đến n-1)
Tại vị trí thứ i, nếu a[i] thỏa điều kiện → xuất giá trị a[i]
Nếu không có giá trị nào thỏa điều kiện → xuất thông báo
15
Liệt kê các phần tử thỏa điều kiện (tt)
Ví dụ 1: Liệt kê các số chẵn trong mảng
void XuatChan(int a[], int n)
{
int i;
for (i = 0; i < n; i++)
if(a[i]%2==0)
cout<<a[i]<<“\t”;
}
Main:
XuatChan(a,n);
Trang 9Liệt kê các phần tử thỏa điều kiện (tt)
17
void XuatChan(int a[], int n) //co thong bao
{
int i, flag=0;
for (i = 0; i < n; i++)
if(a[i]%2==0) {
flag = 1;
cout<<a[i]<<“\t”;
} if(flag==0)
cout<<“Khong co so chan trong mang”;
}
Liệt kê các phần tử thỏa điều kiện (tt)
Ví dụ 2: Liệt kê các số nguyên tố
18
bool LaSNT(int x)
{
if(x<2)
return false;
int i, demus=0;
for (i = 1; i <= x; i++)
if(x%i==0)
demus++;
if(demus==2)
return true;
return false;
}
void XuatSNT(int a[], int n) {
int i;
for (i = 0; i < n; i++)
if(LaSNT(a[i])==true)
cout<<a[i]<<“\t”; }
Trang 10Liệt kê các phần tử thỏa điều kiện (tt)
19
void XuatSNT(int a[], int n) //co thong bao
{
int i, flag=0;
for (i = 0; i < n; i++)
if(LaSNT(a[i])==true) {
flag = 1;
cout<<a[i]<<“\t”;
} if(flag==0)
cout<<“Khong co SNTtrong mang”;
}
Main:
Đếm số lượng các phần tử thỏa đk
Yêu cầu
Cho trước mảng a, số lượng phần tử n Hãy đếm các phần tử thỏa điều kiện nào đó
Ý tưởng
Duyệt từ đầu đến cuối mảng
Tại vị trí thứ i, nếu a[i] thỏa điều kiện → tăng giá trị biến đếm
Trả về giá trị đếm được
Trang 11Đếm số lượng (tt)
Ví dụ 1: Đếm số lượng các số chẵn
21
int DemChan(int a[], int n)
{
int i, dem=0;
for (i = 0; i < n; i++)
if(a[i]%2==0)
dem++;
return dem;
}
Main:
int kq = DemChan(a,n);
if(kq==0)
cout<<“Khong co so chan”; else
cout<<“SL so chan: “<<kq;
Đếm số lượng (tt)
22
Ví dụ 2: Đếm số lượng các số nguyên tố
int DemSNT(int a[], int n)
{
int i, dem=0;
for (i = 0; i < n; i++)
if(LaSNT(a[i])==true)
dem++;
return dem;
}
Main:
Trang 12Tính tổng/tích các phần tử thỏa đk
Yêu cầu
Cho trước mảng a, số lượng phần tử n Hãy tính tổng/tích các phần tử thỏa điều kiện nào đó
Ý tưởng
Duyệt từ đầu đến cuối mảng
Tại vị trí thứ i, nếu a[i] thỏa điều kiện → cộng dồn/nhân dồn giá trị biến tổng/tích
Trả về giá trị tính được
23
Tính tổng/tích (tt)
Ví dụ 1: Tính tổng các số chẵn
int TongChan(int a[], int n)
{
int i, tong=0, flag=0;
for (i = 0; i < n; i++)
if(a[i]%2==0) {
flag = 1;
tong+=a[i];
} if(flag==1)
return tong;
return -1;
Main:
Trang 13Tính tổng/tích (tt)
25
Ví dụ 2: Tính tích các số nguyên tố
long TichSNT(int a[], int n)
{
int i;
long tich=1;
for (i = 0; i < n; i++)
if(LaSNT(a[i])==true)
tich*=a[i];
return tich;
}
Main:
Tính trung bình các phần tử thỏa đk
Yêu cầu
Cho trước mảng a, số lượng phần tử n Hãy tính trung bình cộng các phần tử thỏa điều kiện nào đó
Ý tưởng
Duyệt từ đầu đến cuối mảng
Tại vị trí thứ i, nếu a[i] thỏa điều kiện → tăng giá trị biến đếm và cộng dồn
Tính trung bình = tổng/đếm
Trả về giá trị trung bình tính được
26
Trang 14Tính trung bình (tt)
Ví dụ 1: Tính trung bình cộng các số chẵn
27
float TrungBinhChan(int a[], int n)
{
int i, dem=0, tong=0;
for (i = 0; i < n; i++)
if(a[i]%2==0) {
tong+=a[i];
dem++;
} return (float)tong/dem;
}
Tính trung bình (tt)
Ví dụ 2:Tính trung bình cộng các số nguyên tố
float TrungBinhSNT(int a[], int n)
{
int i, dem=0, tong=0;
for (i = 0; i < n; i++)
if(LaSNT(a[i])==true) {
tong+=a[i];
dem++;
} if(dem!=0)
return (float)tong/dem;
return 0;
Trang 15Tìm kiếm giá trị thỏa đk
Yêu cầu
Cho trước mảng a, số lượng phần tử n Hãy tìm 1 phần
tử thỏa điều kiện nào đó
Ý tưởng
Duyệt từ đầu đến cuối mảng
Tại vị trí thứ i, nếu a[i] thỏa điều kiện → trả về giá trị a[i], hoặc trả về vị trí thứ i
29
Tìm kiếm giá trị thỏa đk (tt)
Ví dụ 1: Tìm giá trị lớn nhất mảng
30
int TimMax(int a[], int n)
{
int i, max = a[0];
for (i = 1; i < n; i++)
if(a[i]>max)
max = a[i];
return max;
}
Trang 16Tìm kiếm giá trị thỏa đk (tt)
31
Ví dụ 2: Tìm vị trí của giá trị lớn nhất mảng
int TimViTriMax(int a[], int n)
{
int i, max = a[0], vtmax = 0;
for (i = 1; i < n; i++)
if(a[i] > max) {
max = a[i];
vtmax = i;
} return vtmax;
}
Tìm kiếm giá trị thỏa đk (tt)
Ví dụ 3: Tìm vị trí giá trị chẵn đầu tiên
int TimChanDau(int a[], int n)
{
int i;
for (i = 0; i < n; i++)
if(a[i]%2==0)
return i;
return -1;
}
Trang 17Kiểm tra tính chất mảng
TH1: kiểm tra xem trong mảng có tồn tại 1 phần tử thỏa điều kiện nào đó hay không → tìm phần tử thỏa điều kiện rồi kết luận
Ý tưởng:
Duyệt từ đầu đến cuối mảng
Tại vị trí thứ i, nếu a[i] thỏa điều kiện → trả về true
Trả về false
33
Kiểm tra tính chất mảng (tt)
TH2: kiểm tra xem tất cả các phần tử trong mảng có thỏa điều kiện nào đó hay không → tìm phần tử không thỏa điều kiện rồi kết luận
Ý tưởng:
Duyệt từ đầu đến cuối mảng
Tại vị trí thứ i, nếu a[i] không thỏa điều kiện → trả về false
Trả về true
34
Trang 18Kiểm tra tính chất mảng (tt)
Ví dụ 1: Kiểm tra xem trong mảng có tồn tại giá trị lẻ hay không?
35
bool KiemTraTonTaiLe(int a[], int n)
{
int i;
for (i = 0; i < n; i++)
if(a[i]%2!=0)
return true;
return false;
}
Kiểm tra tính chất mảng (tt)
Ví dụ 2: Kiểm tra xem mảng có chứa toàn giá trị lẻ hay không?
bool KiemTraToanLe(int a[], int n)
{
int i;
for (i = 0; i < n; i++)
if(a[i]%2==0)
return false;
return true;
}
Trang 19Sắp xếp
Có nhiều thuật toán sắp xếp mảng: chọn trực tiếp, chèn trực tiếp, đổi chỗ trực tiếp…
37
Có nhiều tiêu chí sắp xếp mảng: sắp tăng dần, sắp giảm dần, sắp chẵn tăng lẻ giảm…
Ý tưởng:
Sử dụng 2 biến i và j để so sánh tất cả cặp phần tử với nhau và hoán vị các cặp nghịch thế (sai thứ tự)
…
8
1 5
j
Sắp xếp (tt)
Ví dụ: Sắp xếp mảng tăng dần
38
void HoanVi(int &x, int &y)
{
int tam=x;
x = y;
y = tam;
}
void SapTang(int a[], int n) {
int i, j;
for (i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
if(a[i]>a[j])
HoanVi(a[i],a[j]);
}