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

Bài giảng Cơ sở lập trình - Bài 7: Mảng

27 2 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 27
Dung lượng 372,53 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 Cơ sở lập trình - Bài 7: Mảng trình bày về khái niệm mảng, mảng một chiều, chuỗi ký tự, mảng nhiều chiều. Mời các bạn than khảo bài giảng để bổ sung thêm kiến thức về lĩnh vực này. Với các bạn chuyên ngành CNTT thì đây là tài liệu hữu ích.

Trang 2

CSLT - Bài 7 Phan Dinh The Huan 3

gồm dãy liên tục các phần tử có cùng kiểu

2 9

8 3

1 5

2 1

[1]

12

… 7

3 2

5 3

[0]

[N-1]

… [4]

… 25

8 1 7

N-1 N-2

… n

n-1

… 3 2 1 0

Mảng hai chiều

Trang 3

CSLT - Bài 7 Phan Dinh The Huan 5

… n n-1

… 3

2 1 0

kiểu DL số lượng

số lượng tối đa (khai báo)

số lượng thực tế: n<=N

Trang 4

CSLT - Bài 7 Phan Dinh The Huan 7

int a[ N ]={7,1,8,25,4,6,10};

int b[]={7,1,8,25,4,6,10};

const int days[]={31,28,31,30,31,30,31,31,30,31,30,31};

với 7 phần tử đầu tiên có giá trị cho trước.

Mảng b có 7 phần tử đầu tiên có giá trị cho trước, kích thước của mảng bằng số lượng phần tử cho trước (7 phần tử).

Mảng days là mảng chứa các giá trịhằng số, có 12 phần tử.

2.2 Truy xuất mảng

1. Truy xuất trực tiếp thông qua chỉ số:

z Cú pháp: <tênmảng>[<chỉ số>]

z VD:

z a[0] = 1; // gán giá trị 1 cho phần tử a[0]

z printf(“%4d”, a[3]); // in phần tử a[3] ra màn hình

z scanf(“%d”, &a[0]); // nhập giá trị cho phần tử a[0]

z cout<<a[3];

z cin>>a[3];

Trang 5

CSLT - Bài 7 Phan Dinh The Huan 9

… 6 5 4 3 2 1 0

Trang 6

CSLT - Bài 7 Phan Dinh The Huan 11

… 6 5 4 3 2 1 0

for(i=0; i<n; i++) { cout<<“a[”<<i<<“= ”;

… 6 5 4 3 2 1 0

2.3 Một số thao tác cơ bản trên mảng 1 chiều

for(i=0; i<n; i++) { cout.width(8);

cout<<a[i];

}

độ rộng

Trang 7

CSLT - Bài 7 Phan Dinh The Huan 13

4 Tìm kiếm giá trị x trong mảng a :Æ có / không

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

if(a[i]==x)

break ; if( i<n )

//tìm thấy tại vị trí i else

… 6 5 4 3 2 1 0

Cách 1:

4 Tìm kiếm giá trị x trong mảng a :Æ có / không

int found=0;//chưa tìm thấy for(i=0; i<n && !found ; i++)

if(a[i]==x)

found=1 ; if( found )

//tìm thấy tại vị trí i else

… 6 5 4 3 2 1 0

Cách 2:

dùng ‘cờ

2.3 Một số thao tác cơ bản trên mảng 1 chiều

Trang 8

CSLT - Bài 7 Phan Dinh The Huan 15

4 Tìm kiếm giá trị x trong mảng a :Æ có / không

a[n]=x;

for(i=0; a[i]!=x ; i++);

if( i<n )

//tìm thấy tại vị trí i else

… 6 5 4 3 2 1 0

//tìm thấy count phần tử else

… 6 5 4 3 2 1 0

2.3 Một số thao tác cơ bản trên mảng 1 chiều

Trang 9

CSLT - Bài 7 Phan Dinh The Huan 17

6 Sắp xếp mảng :

//phương pháp chọn trực tiếp int min;

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

… 6 5 4 3 2 1 0

… 6 5 4 3 2 1 0

2.3 Một số thao tác cơ bản trên mảng 1 chiều

(1) Chèn phần tử x tại ví trí k cho trước (2) Chèn phần tử x vào mảng sao cho đảm bảo tính tăng dần

Trang 10

CSLT - Bài 7 Phan Dinh The Huan 19

7 (1) Chèn thêm 1 phần tử x vào mảng tại vị trí k:

if (k>=0 && k<=n) {

for(i=n; i>k; i )

… 6 5 4 3 2 1 0

k x

7 (2) Chèn thêm x sao cho đảm bảo tăng dần:

//mảng đã được sắp xếp tăng n++;

for(i=n; a[i]>x && i>0; i )

… 6 5 4 3 2 1 0

2.3 Một số thao tác cơ bản trên mảng 1 chiều

x

Trang 11

CSLT - Bài 7 Phan Dinh The Huan 21

… 6 5 4 3 2 1 0

Gồm các bước:

• Tìm kiếm x trong mảng, nếu có thì:

• Hủy x bằng cách: dịch chuyển các phần tử bên phải x sang trái 1 đơn vị.

phép thay đổi

Trang 12

CSLT - Bài 7 Phan Dinh The Huan 23

cout<<a[i];

} }

3 Chuỗi ký tự

1. Các khái niệm

2. Các xử lý thông dụng trên chuỗi

3. Các hàm xử lý chuỗi trong thư viện string.h

Trang 13

CSLT - Bài 7 Phan Dinh The Huan 25

z Ký tự kết thúc chuỗi là ký tự null - ‘\0’

2 Khai báo và khởi tạo:

z char ten[10];

z char ten[] = “Tin hoc”;

z char ten[10]= {‘T’, ‘i’, ‘n’, ‘ ‘, ‘h’, ‘o’, ‘c’,’\0’};

Chuỗi “Tin hoc” có 7 ký tự nhưng thực tế lưu trữ phải cần ít nhất 8 Truy cập thành phần thông qua chỉ số: VD: ten[4] = ‘h’

3.1Các khái niệm về chuỗi ký tự

1. Nhập xuất

z Nhập: scanf(“%s”, ten); hoặc gets(ten);

cần phải sử dụng phép lấy địa chỉ qua ký tự &

z Không dùng lệnh cin>>ten; để nhập chuỗi.

z Dùng cin.ignore(); cin.getline(ten,<<chiều dài>>) ;

z Xuất: printf(“%s”, ten); hoặc puts(ten); hoặc dùng lệnh cout<<ten;

2. Duyệt chuỗi: giống như duyệt mảng một chiều for(int i=0; s[i]!=‘\0’; i++)

//do something with s[i]

Trang 14

CSLT - Bài 7 Phan Dinh The Huan 27

1 Đếm chiều dài chuỗi

2 Đổi chuỗi sang chữ in hoa/ chữ thường

3 Cắt khoảng trắng thừa bên trái chuỗi

4 Cắt khoảng trắng thừa bên phải chuỗi

5 Cắt tất cả khoảng trắng thừa trong chuỗi

6 Đếm số từ trong chuỗi

7 Đảo ngược chuỗi

8 Trích chuỗi con từ chuỗi cho trước

9 Nối hai chuỗi cho trước thành một

10 Tìm một chuỗi có trong chuỗi cho trước không

(Xem như bài tập)

3.3 Thư viện string.h

movmem setmem

2 stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup

strerror stricmp strlen strlwr

3 strncat strncmp strncmpi strncpy

strnicmp strnset

4 strpbrk strrchr strrev strset strspn strstr strtok strxfrm

strupr

Trang 15

CSLT - Bài 7 Phan Dinh The Huan 29

2. Truy xuất mảng nhiều chiều

3. Duyệt mảng nhiều chiều

4. Một số thao tác trên mảng nhiều chiều

4.1 Khai báo mảng nhiều chiều

1. Cú pháp: khai báo mảng k chiều:

Trang 16

CSLT - Bài 7 Phan Dinh The Huan 31

• int a[2][3]={{1,2,3},{4,5,6}};

• int b[2][2]={{1,2},{3,4}};

• int c[2][2]={{1},{3,4}};

4 3 4

3 6

5 4

0

1 2

1 3

2 1

4.2 Truy xuất mảng nhiều chiều

1. Phương pháp truy xuất trực tiếp thông qua chỉ số

a[ 0 ][ 1 ] a[ 1 ][ 1 ] a[ 2 ][ 1 ]

a[ 0 ][ 2 ] a[ 1 ][ 2 ] a[ 2 ][ 2 ]

a[ 0 ][ 3 ] a[ 1 ][ 3 ] a[ 2 ][ 3 ]

chỉ số dòng tên mảng

chỉ số cột

Trang 17

CSLT - Bài 7 Phan Dinh The Huan 33

for(i=0;i<m;i++) for(j=0;j<n;j++) //xử lý trên a[i][j]

4 5 2 [2]

6 7

8 [2]

3 1

2 [1]

5 6

4 [0]

Trang 18

CSLT - Bài 7 Phan Dinh The Huan 35

1. Nhập giá trị cho mảng: nhập qua trung gian

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

for(j=0;j<n;j++) {

cout<<“Nhap a[”<<i<<”][“<<j<<”]=”; cin>> x ;

a[i][j]= x ; }

x phải cùng kiểu dữ liệu với các phần tử của mảng a C++

Trang 19

CSLT - Bài 7 Phan Dinh The Huan 37

2. In mảng ra màn hình

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

{

for(j=0;j<n;j++) {

printf(“% ”,a[i][j]);

} printf(“\n”);//xuong dong }

cout.width(4);

cout<<a[i][j];

} cout<<endl;//xuong dong }

C++

Trang 20

CSLT - Bài 7 Phan Dinh The Huan 39

//tim thay tai vi tri i,j

//tim thay tai[k/n][k%n]

found =1;

if( found ) //tim thay tai vi tri i,j else

//khong tim thay

Cách 2:

dùng ‘cờ

Trang 21

CSLT - Bài 7 Phan Dinh The Huan 41

4. Đếm số lượng phần tử x trong mảng

int count =0;

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

for(j=0;j<n;j++) if(a[i][j]==x)

count++ ; if( count )

//tim thay count phan tu else

//khong tim thay

void nhapMaTran(int a[][N], int m, int n);

void inMaTran( const int a[][N], int m, int n);

Trang 22

CSLT - Bài 7 Phan Dinh The Huan 43

2. Khai báo mảng một chiều ntn?

3. Khai báo mảng nhiều chiều ntn?

4. Chuỗi ký tự là gì? Chuỗi trong C được lưu trữ như thế nào? Nhập xuất chuỗi ntn?

Trang 23

CSLT - Bài 7 Phan Dinh The Huan 45

1. Tìm giá trị lớn nhất/nhỏ nhất trong mảng

2. Tính giá trị trung bình của mảng

3. Đếm số số chẵn/số số lẻ trong mảng

4. Đếm số nguyên tố trong mảng

5. Kiểm tra xem mảng có tăng dần/giảm dần

6. Tìm kiếm một giá trị trong mảng đã có thứ

tự theo pp tìm kiếm nhị phân

7. Biến đổi tất cả các số âm trong mảng thành

số dương

Bài tập

1. Nhập số tiền chi tiêu của 1 sinh viên trong

12 tháng

z Tính chi tiêu trung bình của sinh viên đó.

z Sinh viên đó tiêu ít nhất bao nhiêu tiền trong 1 tháng.

z Sinh viên đó tiêu nhiều nhất bao nhiêu tiền trong

Trang 24

CSLT - Bài 7 Phan Dinh The Huan 47

z Giá trị phần lớn nhất, nhỏ nhất trong mảng.

z Các dòng trong mảng có tăng dần hay không.

z Đếm số lượng số nguyên tố có trong mảng.

3 Hãy tạo các ma trận vuông nxn như sau:

(d) (c)

(b) (a)

7 8 9 10 13

12 5 4 13

14 15 16 16

15

14

13

6 15 16 11 14

11 6 3 12

11 10 9 12

11

10

9

5 14 13 12 15

10 7 2 5

6 7 8 8

7

6

5

4 3 2 1 16

9 8 1 4

3 2 1 4

z 12 cột tượng trưng cho 12 tháng

z 2 dòng gồm:

z Dòng thứ nhất: Số ngày công trong tháng

z Dòng thứ hai: Số sản phẩm bán được

Hãy cho biết:

1 Thu nhập trong từng tháng và tổng thu nhập trong năm của nhân viên nói trên, biết: lương 1triệu VND/tháng/26 ngày;

thưởng 100ngàn/ngày thêm; hoa hồng 1000đồng/sản phẩm.

2 Trung bình, mỗi tháng nhân viên đó đi làm bao nhiêu ngày và bán được bao nhiêu sản phẩm.

Trang 25

CSLT - Bài 7 Phan Dinh The Huan 49

1 Đếm số từ có 1 ký tự, 2 ký tự, …

2 Liệt kê số lần xuất hiện của các ký tự chữ cái có trong chuỗi.

3 Hãy cho biết ký tự nào xuất hiện nhiều nhất, ký

tự nào xuất hiện ít nhất trong chuỗi.

Phụ lục: Bảng mã ASCII

Trang 26

CSLT - Bài 7 Phan Dinh The Huan 51

Phụ lục: Mã mở rộng

Trang 27

CSLT - Bài 7 Phan Dinh The Huan 53

z Bài 1: Sàng Erathosten các số nguyên tố

z Bài 2: Bài toán đặt vé máy bay

2. Mảng 2 chiều

z Bài 1: Thực hiện các phép toán trên ma trận: giữa ma trận và một số, giữa 2 ma trận, tính định thức ma trận

2. Bàn cờ trò chơi dò mìn mxn Hãy xây dựng thuật toán và cài đặt hàm mở ô lan truyền trong trường hợp ô được mở là một ô trống không có mìn xung quanh

3. Bàn cờ trò chơi tetris 20x10 Hãy xây dựng thuật toán tìm dòng đầy và quét sập dòng đầy trên bàn cờ

Ngày đăng: 21/05/2021, 14:09

w