1. Trang chủ
  2. » Giáo Dục - Đào Tạo

hoa cuong có thì sử dụng – thích thì lao vào

27 3 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

Nội dung

Từ khóa const : nếu đặt từ khóa const trước tham số hình thức Æ giá trị của các phần tử trong mảng sẽ là hằng số, không được3. phép thay đổi..[r]

(1)

CƠ SỞ LẬP TRÌNH

Phan Đình Thế Huân Tháng - 2008 MẢNG

7

Nội dung Khái niệm

2 Mảng chiều Chuỗi ký tự

(2)

CSLT - Bài Phan Dinh The Huan

1 Khái niệm

1 Mảng (array) kiểu liệu có cấu trúc, bao gồm dãy liên tục phần tử có kiểu liệu

2 Phân loại:

z Mảng chiều

z Mảng nhiều chiều

Ví dụ

Mảng chiều

Chỉ số dịng

Chỉ số cột

21 … [M-1] … … … … … … … … … [1] 12 … [0] [N-1] … [4] [3] [2] [1] [0] a a chỉ số … 10 … 25 N-1 N-2 … n n-1 …

(3)

CSLT - Bài Phan Dinh The Huan

2.Mảng chiều Khai báo

2 Truy xuất mảng

3 Một số thao tác mảng chiều

4 Mảng hàm

2.1 Khai báo mảng

a. Khai báo:

#define N 20

int a[N],n;

a chỉ số

… …

N-1 N-2 …

n n-1 …

2

kiểu DL số lượng

(4)

CSLT - Bài Phan Dinh The Huan

2.1 Khai báo mảng

b. Khai báo khởi gán giá trị: #define N 20

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

Mảng a có 20 phần tử, với phần tử có giá trị cho trước

Mảng b có phần tử có giá trị cho trước, kích thước mảng số lượng phần tử cho trước (7 phần tử)

Mảng days mảng chứa 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 số:

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

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

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

(5)

CSLT - Bài Phan Dinh The Huan

2.3 Một số thao tác mảng chiều

1 Duyệt mảng

2 Nhập mảng

3 Xuất mảng Tìm kiếm Đếm Sắp xếp

7 Chèn thêm phần tử vào mảng Hủy phần tử khỏi mảng

2.3 Một số thao tác mảng chiều

1. Duyệt mảng a có n phần tử:

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

//xử lý a[i]

a iỈ

(6)

CSLT - Bài Phan Dinh The Huan 11

2. Nhập giá trị cho mảng a có n phần tử:

a iỈ

n-1 n-2 …

2.3 Một số thao tác mảng chiều

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

{ cout<<“a[”<<i<<“= ”; cin>>a[i];

}

3. Xuất giá trị mảng a có n phần tử hình:

a iỈ

n-1 n-2 …

2.3 Một số thao tác mảng chiều

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

cout<<a[i]; }

(7)

CSLT - Bài Phan Dinh The Huan 13

4. Tìm kiếm giá trị x mảng a :Ỉ có / khơng

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

break; if(i<n)

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

//khơng tìm thấy

a iỈ … n-1 n-2 … Cách 1:

2.3 Một số thao tác mảng chiều

4. Tìm kiếm giá trị x 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 vị trí i else

//khơng tìm thấy

a iỈ … n-1 n-2 … Cách 2:

dùng ‘cờ

(8)

CSLT - Bài Phan Dinh The Huan 15

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

a[n]=x;

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

if(i<n)

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

//khơng tìm thấy

a iỈ x … n n-1 … Cách 3: dùng ‘lính canh’, ý n

2.3 Một số thao tác mảng chiều

5. Tìm đếm số lượng x mảng a :

int count=0;

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

count++; if(count)

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

//khơng tìm thấy

a iỈ … n-1 n-2 …

(9)

CSLT - Bài 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;

for(j=i+1;j<n;j++) if(a[min]>a[j])

min=j;

hoanVi(a[min],a[i]); }

a iỈ

n-1 n-2 …

2.3 Một số thao tác mảng chiều

7. Chèn thêm phần tử vào mảng :

a chỉ sốỈ

n-1 n-2 …

2.3 Một số thao tác mảng chiều

(1)Chèn phần tử x ví trí k cho trước

(10)

CSLT - Bài Phan Dinh The Huan 19

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

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

for(i=n; i>k; i ) a[i] = a[i-1]; a[k] = x;

n++; }

a

chỉ sốỈ

n n-1 …

2.3 Một số thao tác mảng chiều

k x

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

//mảng xếp tăng n++;

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

a[i] = x;

a

chỉ sốỈ

n n-1 …

2.3 Một số thao tác mảng chiều

(11)

CSLT - Bài Phan Dinh The Huan 21

8. Hủy phần tử x khỏi mảng :

a chỉ sốỈ

n-1 n-2 …

2.3 Một số thao tác mảng chiều

Gồm bước:

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

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

• n = n -

(xem tập)

2.4 Mảng hàm

1 Phương pháp truyền mảng vào hàm: tham chiếu

2 Từ khóa const: đặt từ khóa const trước tham số hình thức Ỉ giá trị phần tử mảng số, không

(12)

CSLT - Bài Phan Dinh The Huan 23

Ví dụ – truyền mảng vào hàm

#include <stdio.h>

void nhapMang(int a[], int n); void inMang(constint a[], int n);

void main()

{ int a[100], n= 10; nhapMang(a, n); inMang(a, n); }

void nhapMang(int a[], int n)

{ cout<<“\nNhap mang:\n”; for(int i=0; i<n; i++)

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

} }

Giá trị mảng số, không cho phép thay đổi

void inMang(constint a[], int n)

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

cout.width(4); cout<<a[i]; }

}

3 Chuỗi ký tự Các khái niệm

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

(13)

CSLT - Bài Phan Dinh The Huan 25

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

1 Định nghĩa:

z Chuỗi ký tự mảng chiều ký tự z Ký tự kết thúc chuỗi ký tự null - ‘\0’

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

z char ten[10];

z char ten[] = “Tin hoc”;

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

iỈ

‘\0’ ‘c’ ‘o’ ‘h’ ‘ ‘

‘n’ ‘i’ ‘T’

9

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

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

1 Nhập xuất

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

z Tên mảng địa mảng nên không

cần phải sử dụng phép lấy địa 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); puts(ten); dùng

lệnh cout<<ten;

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

(14)

CSLT - Bài Phan Dinh The Huan 27

3.2 Các xử lý thông dụng chuỗi ký tự

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

2 Đổi chuỗi sang chữ in hoa/ chữ thường Cắt khoảng trắng thừa bên trái chuỗi Cắt khoảng trắng thừa bên phải chuỗi Cắt tất khoảng trắng thừa chuỗi Đếm số từ chuỗi

7 Đảo ngược chuỗi

8 Trích chuỗi từ chuỗi cho trước Nối hai chuỗi cho trước thành

10 Tìm chuỗi có chuỗi cho trước khơng

(Xem tập)

3.3 Thư viện string.h

1 memccpy memchr memcmp memcpy

memicmp memmove memset movedata

movmem setmem

2 stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup strerror stricmp strlen strlwr strncat strncmp strncmpi strncpy

strnicmp strnset

(15)

CSLT - Bài Phan Dinh The Huan 29

4 Mảng nhiều chiều Khai báo mảng nhiều chiều Truy xuất mảng nhiều chiều Duyệt mảng nhiều chiều

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

5 Truyền mảng vào hàm

4.1 Khai báo mảng nhiều chiều Cú pháp: khai báo mảng k chiều:

z <kiểu DL><tên mảng>[<n1>][<n2>]…[<nk>];

2 Ví dụ:

z int a[3][4]; //mảng chiều: dòng, cột

z int b[3][4][2]; //mảng chiều: lớp, dòng, cột

#define M 10 #define N 20

int a[M][N];// mảng chiều có tối đa 10x20 phần tử

(16)

CSLT - Bài Phan Dinh The Huan 31

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

3 Khai báo khởi gán giá trị cho mảng:

• 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

5

0

1

1

2

a b c

4.2 Truy xuất mảng nhiều chiều Phương pháp truy xuất trực tiếp thông qua

chỉ số Dòng Dòng Dòng

Cột Cột Cột Cột

a[ ][ ] a[ ][ ] a[ ][ ]

a[ ][ ] a[ ][ ] a[ ][ ]

a[ ][ ] a[ ][ ] a[ ][ ]

a[ ][ ] a[ ][ ] a[ ][ ]

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

(17)

CSLT - Bài Phan Dinh The Huan 33

4.3 Duyệt mảng nhiều chiều

1 Duyệt mảng a hai chiều có mxn phần tử

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

//xử lý a[i][j]

4 [2]

6

8 [2]

3

2 [1]

5

4 [0]

[3] [1]

[0] i

j

4.4 Một số thao tác mảng nhiều chiều

1 Nhập giá trị cho mảng In mảng hình

(18)

CSLT - Bài Phan Dinh The Huan 35

4.4 Một số thao tác mảng nhiều chiều

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

printf(“Nhap a[%d][%d]=”,i,j); scanf(“% ”, &x);

a[i][j]=x; }

4.4 Một số thao tác mảng nhiều chiều

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

(19)

CSLT - Bài Phan Dinh The Huan 37

4.4 Một số thao tác mảng nhiều chiều

2 In mảng hình

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

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

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

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

4.4 Một số thao tác mảng nhiều chiều

2 In mảng hình

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

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

cout.width(4); cout<<a[i][j]; }

cout<<endl;//xuong dong }

(20)

CSLT - Bài Phan Dinh The Huan 39

4.4 Một số thao tác mảng nhiều chiều

3 Tìm kiếm phần tử x mảng

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

if(a[i][j]==x)

break; if(i<m && j<n)

//tim thay tai vi tri i,j else

//khong tim thay

Cách 1: for(k=0;k<if(a[k/nm*n][k%n;k++)]==x)

break; if(k<m*n)

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

else

//khong tim thay

4.4 Một số thao tác mảng nhiều chiều

3 Tìm kiếm phần tử x mảng

int found=0;

for(i=0;i<m && !found;i++) for(j=0;j<n && !found;j++)

if(a[i][j]==x)

found=1; if(found)

//tim thay tai vi tri i,j else

//khong tim thay

Cách 2:

(21)

CSLT - Bài Phan Dinh The Huan 41

4.4 Một số thao tác mảng nhiều chiều

4 Đếm số lượng phần tử x 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

4.5 Truyền mảng vào hàm

#include <stdio.h> #include <iostream.h> #define N 10

#define M 20

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

{ int a[M][N], m= 5, n=10;

nhapMaTran(a, m, n); inMaTran(a, m, n);

(22)

CSLT - Bài Phan Dinh The Huan 43

void nhapMaTran(int a[][N], int m, int n) { int i,j, x;

cout<<“\nNhap ma tran:\n”; for(i=0; i<m; i++)

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

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

a[i][j] = x; }

}

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

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

{ cout.width(4); cout<<a[i][j]; }

cout<<endl;//xuong dong }

}

Tóm tắt

1 Mảng gì?

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

(23)

CSLT - Bài Phan Dinh The Huan 45

Ví dụ mảng chiều số nguyên

1 Tìm giá trị lớn nhất/nhỏ mảng Tính giá trị trung bình mảng

3 Đếm số số chẵn/số số lẻ mảng Đếm số nguyên tố mảng

5 Kiểm tra xem mảng có tăng dần/giảm dần Tìm kiếm giá trị mảng có thứ

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

7 Biến đổi tất số âm mảng thành số dương

Bài tập

1 Nhập số tiền chi tiêu sinh viên 12 tháng

z Tính chi tiêu trung bình sinh viên

z Sinh viên tiêu tiền

tháng

z Sinh viên tiêu nhiều tiền

1 tháng

z Những tháng sinh viên tiêu tiền nhiều

nhất

(24)

CSLT - Bài Phan Dinh The Huan 47

Bài tập (tt)

2 Nhập vào mảng chiều mxn số nguyên, cho biết:

z Giá trị phần lớn nhất, nhỏ mảng z Các dịng mảng có tăng dần hay không z Đếm số lượng số nguyên tố có mảng

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

(d) (c) (b) (a) 10 13 12 13 14 15 16 16 15 14 13 15 16 11 14 11 12 11 10 12 11 10 14 13 12 15 10 7 8 16 4

Bài tập (tt)

4 Viết chương trình quản lý thơng tin nhân viên bán

hàng Thông tin nhân viên lưu mảng chiều sau:

z 12 cột tượng trưng cho 12 tháng z dòng gồm:

z Dịng thứ nhất: Số ngày cơng tháng z Dòng thứ hai: Số sản phẩm bán

Hãy cho biết:

1 Thu nhập tháng tổng thu nhập năm

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, tháng nhân viên làm ngày

(25)

CSLT - Bài Phan Dinh The Huan 49

Bài tập (tt)

5 Nhập vào chuỗi ký tự, thực hiện:

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

2 Liệt kê số lần xuất ký tự chữ có

trong chuỗi

3 Hãy cho biết ký tự xuất nhiều nhất, ký

tự xuất chuỗi

(26)

CSLT - Bài Phan Dinh The Huan 51

Phụ lục: Bảng mã ASCII (tt)

(27)

CSLT - Bài Phan Dinh The Huan 53

Một số tập mở rộng Mảng chiều

z Bài 1: Sàng Erathosten số nguyên tố z Bài 2: Bài toán đặt vé máy bay

2 Mảng chiều

z Bài 1: Thực phép toán ma trận:

giữa ma trận số, ma trận, tính định thức ma trận

z Bài 2: Ma phương bậc lẻ z Bài 3: Ma trận Sudoku 9x9

Một số tập ứng dụng trò chơi

1 Bàn cờ trị chơi carơ mxn Hãy xây dựng thuật toán cài đặt hàm kiểm tra tình trạng thắng thua bàn cờ

2 Bàn cờ trị chơi dị mìn mxn Hãy xây dựng thuật tốn cài đặt hàm mở lan truyền trường hợp ô mở ô trống mìn xung quanh

Ngày đăng: 20/04/2021, 01:57

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

TÀI LIỆU LIÊN QUAN

w