33
ARRAY

ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Embed Size (px)

Citation preview

Page 1: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

ARRAY

Page 2: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Nội dung1. Khái niệm mảng2. Khai báo mảng3. Truy xuất mảng4. Gán dữ liệu 2 mảng5. Mảng và hàm6. Một số thao tác trên mảng một chiều7. Một số thao tác trên mảng hai chiều8. Chuỗi ký tự

2

Page 3: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Khái niệm• Mảng (Array): Kiểu dữ liệu có cấu trúc. Gồm nhiều phần tử cùng kiểu. Bố trí vùng nhớ liên tục.

• Kích thước mảng (size): số phần tử trong mảng.• Mỗi phần tử trong mảng được xác định bởi một

chỉ số biểu thị vị trí của phần tử trong mảng.• Phần tử đầu tiên của mảng luôn có chỉ số 0.• Chỉ số mảng chạy từ 0 đến size-1.

3

Page 4: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Khái niệm• Mảng có thể có 1 chiều hoặc nhiều chiều.• Mảng n chiều (n>1) được coi như mảng 1 chiều

mà mỗi phần tử là mảng n-1 chiều.• Số phần tử của mảng nhiều chiều bằng tích của

kích thước các chiều.

4

Page 5: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Khai báo<kiểu cơ sở> <tên biến mảng> [<số phần tử>];<kiểu cơ sở> <tên biến mảng> [<N1>][<N2>]…[<Nn>];

• Ví dụ 1: Khai báo mảngint a[10];float b[32];double x[20];char strName[16];

5

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

Page 6: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Truy xuất mảngVí dụ 2: Khai báo và khởi tạo mảngint a[5] = {3,5,1,4,9};int b[5] = {1,4,9}; //Arrays: 1,4,9,0,0int c[5] = {0}; //Arrays: 0,0,0,0,0int d[] = {1,4,3,5,7,8,10}; //size = 7C không cảnh báo khi truy xuất phần tử thứ i>=size, nhưng chương trình sẽ bị lỗi khi chạy => lỗi vượt ngoài biên vì truy xuất phần tử không tồn tại.Ví dụ:

printf(“Phan tu thu 7: %d”,d[6]);printf(“Phan tu thu 7: %d”,d[7]); //Error

6

Page 7: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Gán dữ liệu 2 mảngKhông được sử dụng phép gán thông thường đểsao chép nội dung của mảng này sang mảng kia,mà phải gán từng phần tử tương ứng.Ví dụ:

int a[3] = {3, 5, 7};

int b[3];

b = a; //Error

for(int i = 0; i < 3; i++)

b[i] = a[i];

Không thể so sánh 2 mảng (b==a).7

Page 8: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Duyệt mảngCó 2 cách:Duyệt từ đầu mảng:

int a[size];for(int i = 0; i < size; i++)//do something with a[i];

• Duyệt từ cuối mảng:int a[size]; for(int i = size-1; i >= 0; i--)//do something with a[i];

8

Page 9: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Mảng 2 chiềuKhai báo:

int a[3][4];int b[2][3]={{1,2,3},{4,5,6}};int c[][3]={{1,2,3},{4,5,6}};int d[2][3]={0};

9

Page 10: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Mảng 2 chiềuSử dụng 2 vòng lặp for để truy xuất mảng 2 chiều:#define ROW 10#define COL 10

int a[ROW][COL];int i,j;//Khởi tạo giá trị cho mảngfor(i=0; i<ROW; i++)

for(j=0; j<COL; j++)a[i][j]=i*j;

//In mảngfor(i=0; i<ROW; i++)

for(j=0; j<COL; j++)printf(“%d ”,a[i][j]);

10

Page 11: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Mảng và hàmTruyền mảng:Để nhận mảng là tham số, khi khai báo hàm phảichỉ định trong phần tham số kiểu dữ liệu cơ bản củamảng, tên mảng và cặp ngoặc vuông.Ví dụ:

void input (int a[10], int &n);Mảng truyền theo địa chỉ.Tên của mảng là địa chỉ của phần tử thứ nhất.

11

Page 12: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Mảng và hàmFunction prototype

void modify (int a[10], int n);Thông số trong function prototype:

• int a[10] có thể viết là int [ ]• int n có thể viết là int

=> void modify (int [ ], int);

12

Page 13: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Mảng và hàm#include <iostream.h>#define MAX 5void modify (int [ ], int); //Function prototypevoid main(){

int a[MAX] = {1,2,3,4,5};int i;modify(a, MAX);for(i=0; i<MAX; i++)

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

13

Page 14: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Mảng và hàmvoid modify (int b[ ], int n){

int i;for(i=0; i<MAX; i++)

b[i] *= 2;}

14

Page 15: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

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

1. Nhập mảng2. Xuất mảng3. Thêm 1 phần tử vào mảng4. Xóa 1 phần tử khỏi mảng5. Tìm kiếm trên mảng6. Sắp xếp mảng

15

Page 16: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

1. Nhập mả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ử n thực sự của mảng (n<=MAX). Nhập từng phần tử của mảng từ chỉ số 0 đến n-1.void input (int a[ ], int &n){

printf(“Nhap so luong phan tu cua mang:”);scanf(“%d”, &n);for (int i=0; i<n; i++){

printf(“Nhap phan tu thu %d: ”, i);scanf(“%d”, &a[i]);

}} 16

Page 17: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

2. Xuất mảng Xuất giá trị từng phần tử của mảng từ chỉ số 0 đến

n-1.

void output (int a[ ], int n){

for (int i=0; i<n; i++)printf(“%d ”, a[i]);

printf(“\n”);}

17

Page 18: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

3. Thêm 1 phần tử vào mảngThêm 1 phần tử x vào mảng a kích thước n tại vị trí k: Dời các phần tử bắt đầu từ vị trí k sang phải 1 vị trí. Đưa x vào vị trí k và tăng n lên 1 đơn vị.void insert (int a[ ], int &n, int x, int k){

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

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

a[k] = x;n++;

}} 18

Page 19: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

4. Xóa 1 phần tử khỏi mảngXóa 1 phần tử trong mảng a kích thước n tại vị trí k: Dời các phần tử bên phải vị trí k sang trái 1 vị trí. Giảm n xuống 1 đơn vị.void delete (int a[ ], int &n, int k){

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

for (int i=k; i<n-1; i++)a[i] = a[i+1];

n--;}

}

19

Page 20: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

5. Tìm kiếm trên mảng Tìm kiếm giá trị x, trả về chỉ số của phần tử đầu

tiên có trị = x, nếu không tìm thấy trả về -1.int search (int a[ ], int n, int x){

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

return i;return -1;

}

20

Page 21: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

6. Sắp xếp mảngvoid sort (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])

swap(a[i],a[j]);}void swap (int &x, int &y){

int z;z=x; x=y; y=z;

} 21

Page 22: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

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

1. Nhập mảng2. Xuất mảng

22

Page 23: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

1. Nhập mảng Cho trước một mảng 2 chiều có số dòng là ROW, số cột là COL. Nhập số lượng dòng, cột thực sự của mảng (dòng <= ROW, cột

<=COL). Nhập từng phần tử của mảng.void input (int a[ ][COL], int &m, int &n){

printf(“Nhap so dong, so cot: ”);scanf(“%d%d”, &m, &n);for (int i=0; i<m; i++)

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

printf(“Nhap phan tu [%d][%d]: ”, i, j);scanf(“%d”, &a[i][j]);

}}

23

Page 24: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

2. Xuất mảng Xuất giá trị từng phần tử của mảng theo từng

dòng.void output (int a[ ][COL], int m, int n){

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

for (int j=0; j<n; j++)printf(“%d ”, a[i][j]);

printf(“\n”);}

}24

Page 25: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Chuỗi ký tự Là một dãy các ký tự được kết thúc bằng ký tự

‘\0’. Cú pháp khai báo:

char <tên biến> [chiều dài tối đa]; Ví dụ:

char ten[10];ten = “Trang”;

Nhập xuất chuỗi: Nhập chuỗi từ bàn phím: hàm gets()

Cú pháp: gets(<biến chuỗi>); Xuất chuỗi ra màn hình: hàm puts()

Cú pháp: puts(<biểu thức chuỗi>); 25

Page 26: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Nhập xuất chuỗi Ví dụ: Nhập chuỗi và hiển thị chuỗi vừa nhập.#include<conio.h>#include<stdio.h>#include<string.h>void main(){

char s[255];printf("Nhap chuoi: ");gets(s);printf("Chuoi vua nhap: ");puts(s);getch();

} 26

Page 27: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Một số hàm xử lý chuỗi Xác định độ dài chuỗi: hàm strlen()

Cú pháp: int strlen (const char* s) Đổi một ký tự thường thành ký tự hoa: hàm

toupper()Cú pháp: char toupper (char c) Đổi chuỗi chữ thường thành chuỗi chữ hoa: hàm

strupr()Cú pháp: char* strupr (char *s) Đổi chuỗi chữ hoa thành chuỗi chữ thường: hàm

strlwr()Cú pháp: char* strlwr (char *s)

27

Page 28: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Một số hàm xử lý chuỗi Sao chép chuỗi: hàm strcpy()

Cú pháp:char* strcpy (char *Des, const char *Source)

• So sánh chuỗi: hàm strcmp()Cú pháp:int strcmp (const char *s1, const char *s2) Nếu kết quả là số âm, chuỗi s1 nhỏ hơn chuỗi s2. Nếu kết quả = 0, hai chuỗi bằng nhau. Nếu kết quả là số dương, chuỗi s1 lớn hơn chuỗi s2.

28

Page 29: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Bài tập mảng 1 chiều1. Cho trước mảng nguyên có tối đa 100 phần tử.

Viết các hàm sau:- Nhập mảng.- Xuất mảng.- Tìm kiếm giá trị x trong mảng.- Tìm phần tử lớn nhất, nhỏ nhất trong mảng.- Thêm 1 phần tử vào mảng.- Xóa 1 phần tử khỏi mảng.- Kiểm tra mảng có thứ tự tăng? Giảm? Hay

không có thứ tự?- Đảo ngược thứ tự các phần tử trong mảng.

29

Page 30: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Bài tập mảng 1 chiều- Tính tổng các phần tử trong mảng.- Tính giá trị trung bình của mảng.- Sắp xếp mảng theo thứ tự tăng dần.- Sắp xếp mảng theo thứ tự tăng dần và loại

bỏ các phần tử trùng nhau.- Liệt kê các phần tử là số chẵn, số lẻ, số âm,

số dương, số nguyên tố.- Đếm số lượng các phần tử là số chẵn, số lẻ,

số âm, số dương, số nguyên tố.Viết chương trình áp dụng các hàm trên.

30

Page 31: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Bài tập mảng 1 chiều2. Viết chương trình nhập vào 2 tập hợp A và

B. Xây dựng hàm:- Hợp của 2 tập hợp.- Giao của 2 tập hợp.- Hiệu của 2 tập hợp.3. Viết chương trình nhập vào 2 mảng A và B,

ghép 2 mảng A và B đưa vào mảng C.

31

Page 32: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Bài tập mảng 2 chiều4. Cho mảng 2 chiều có kích thước tối đa 10x10. Viết hàm:- Nhập mảng.- Xuất mảng.- Tìm phần tử nhỏ nhất, lớn nhất trong mảng.- Tính tổng các phần tử trong mảng.- Tính tổng từng dòng trong ma trận.5. Cho ma trận vuông có kích thước tối đa 10x10. Viết hàm:- Nhập ma trận.- Xuất ma trận.- Tính tổng các phần tử trên đường chéo chính.- Sửa các phần tử ở tam giác trên = 0.- In các phần tử ở tam giác dưới.

32

Page 33: ARRAY · 2013-01-08 · Một số thao tác trên mảng một chiều 7. Một số thao tác trên mảng hai chiều 8. ... • Mỗi phần tử trong mảng được xác định

Bài tập chuỗi ký tự6. Viết chương trình nhập vào họ tên của một

người, in ra họ tên, xác định độ dài chuỗi, đổi họtên thành chữ hoa/thường.

7. Viết chương trình nhập vào tối đa họ tên của 10người. Sắp xếp danh sách tăng dần theo họ tên,sau đó xuất danh sách.

33