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

Bài giảng Kỹ thuật lập trình cơ bản (C++): Chương 4 - ThS. Trần Nguyễn Anh Chi

19 14 0

Đ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 19
Dung lượng 829,83 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 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 1

GV: 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 2

Dữ 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 3

Số 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 4

Khở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 5

Truy 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 6

Nhậ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 7

Xuấ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 8

Liệ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 9

Liệ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 10

Liệ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 12

Tí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 13

Tí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 14

Tí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 15

Tì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 16

Tì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 17

Kiể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 18

Kiể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 19

Sắ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]);

}

Ngày đăng: 11/05/2021, 03:34

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

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