Chương 5 Mảng, chuỗi ký tự Mục tiêu của bài học Định nghĩa mảng. Mảng 1 chiều Mảng 2 chiều. Chuỗi ký tự.
Trang 1Chương 5
Mảng, chuỗi ký tự
Trang 2Mục tiêu của bài học
Định nghĩa mảng
Mảng 1 chiều
Mảng 2 chiều
Chuỗi ký tự
Trang 3Phần 1: Mảng một chiều
Trang 4Kiểu dữ liệu mảng
Mảng là tập hợp các phần tử có cùng kiểu dữ liệu, được lưu trữ ở các vị trí kế tiếp nhau trong
bộ nhớ chính
3 2 4 5 1 9 6 7 4 8
Mảng kiểu int, gồm 10 phần tử
Trang 5 Lớp lưu trữ : auto, static, extern, register
Kiểu dữ liệu: Các kiểu dữ liệu cơ bản và nâng cao
Tên mảng: Đặt theo tên định danh
Kích thước mảng: Hằng số
Lớp lưu trữ mặc định là auto Không cần sử dụng từ khóa này khi khai báo các mảng auto
Ví dụ: int A[10];
Trang 6Các phần tử và chỉ số của mảng
Mỗi phần tử được xác định bằng một số thứ tự (còn gọi
là chỉ số) duy nhất trong mảng
Số chiều của mảng được xác định bằng số các chỉ số cần thiết để định danh duy nhất từng phần tử
Chỉ số là một số nguyên dương trong [ ] đặt ngay sau tên mảng
Chỉ số của mảng (trong C) được bắt đầu là 0
Ví dụ: mảng A với 10 phần tử:
A[0],A[1],A[2],…,A[9]
3 2 4 5 1 9 6 7 4 8
Trang 7
Quản lý mảng trong C
Trong ngôn ngữ C, mảng được “đối xử” không giống hoàn toàn với biến
Hai mảng có cùng kiểu và cùng kích thước cũng không được xem là tương đương nhau
Không thể gán trực tiếp một mảng cho một mảng khác
Không thể gán trị cho toàn bộ mảng, mà phải gán trị cho từng phần tử của mảng
Trang 8
Một số thao tác trên mảng
Khởi tạo mảng
Truy xuất các phần tử mảng
Nhập giá trị cho các phần tử mảng
Truyền mảng vào hàm
Trang 9
Khởi tạo mảng
Khởi tạo mảng
Truy xuất các phần tử mảng
Nhập giá trị cho các phần tử mảng
Truyền mảng vào hàm
Trang 10
Khởi tạo mảng
Là thao tác gán giá trị cho các phần tử mảng
Các mảng không được khởi tạo tự động
Không sử dụng mảng khi chưa khởi tạo thích hợp
Khởi tạo mảng trong khi khai báo:
Trang 11Khởi tạo mảng (tt)
Trong trường hợp mảng extern và static , các phần tử được tự động khởi tạo với
giá trị 0
Trang 12
Bài tập áp dụng
Bài tập 1: Viết chương trình:
Khai báo và khởi tạo giá trị cho 1 mảng kiểu int, gồm 10 phần tử
Hiển thi ra màn hình giá trị các phần tử mảng
Kiểm tra trường hợp số giá trị khởi tạo < kích thước mảng
Trang 13
Truy xuất các phần tử mảng
Thực hiện khi muốn xem, hiển thị hoặc sử dụng giá trị của chúng để tính toán, kiểm tra…
Truy xuất phần tử mảng với các chỉ số cụ thể:
Ví dụ:
int A[0] ; int A[5] ;
Trang 14
Nhập giá trị cho các phần tử mảng
Gán trực tiếp giá trị cho các phần tử:
Trang 15
Bài tập áp dụng
Bài tập 2: Viết chương trình:
Khai báo và nhập giá trị cho mảng kiểu int, gồm n phần tử
Hiển thị các giá trị đã nhập ra màn hình
Trang 16
Truyền mảng vào hàm
Khi một mảng được truyền vào hàm như một tham số, chỉ có địa chỉ của mảng được truyền vào
Tên mảng không kèm theo chỉ số là địa chỉ của mảng
Ví dụ:
void main() {
int A[10];
func(A);
}
Mảng A được truyền vào hàm func()
Trang 17
Truyền mảng vào hàm
Khai báo hàm func():
func (int ary []) /*Số phần tử không được xác định trước*/
Trang 18
Bài tập áp dụng
Bài tập 3: Viết chương trình:
Khai báo và nhập giá trị cho mảng kiểu int, gồm n phần tử
Hiển thị các giá trị đã nhập ra màn hình
Tìm giá trị lớn nhất trong mảng
Yêu cầu: Chương trình được viết ở dạng hàm
Trang 19
Bài tập về nhà
Bài 1: Viết chương trình (dạng hàm) thực hiện các yêu cầu sau:
Khai báo và nhập giá trị cho một mảng n phần tử, kiểu int
Hiển thị các giá trị đã nhập ra màn hình
Tính tổng các phần tử trong mảng
Tính tổng các phần tử chẵn trong mảng
Bài 2: Viết chương trình (dạng hàm) thực hiện các yêu cầu sau:
Khai báo và nhập giá trị cho một mảng n phần tử, kiểu int
Hiển thị các giá trị đã nhập ra màn hình
Liệt kê các số chính phương trong mảng
Trang 20Phần 2: Mảng nhiều chiều
Trang 21Mảng hai chiều
Mảng đa chiều đơn giản nhất và thường được dùng nhất là mảng hai chiều
Mảng hai chiều có thể xem như là một mảng với mỗi phần tử là mảng một chiều
Về logic, một mảng hai chiều trông giống như một bảng lịch trình xe lửa, gồm các dòng và các cột
Trang 22Một mảng chuỗi hai chiều được khai báo
theo cách sau:
int Ary[3][4];
Khởi tạo mảng đa chiều (tt)
Mảng có kích thước 3 4 (3 hàng, 4 cột)
A[2,0] A[2,1] A[2,2] A[2,3]
A[1,0] A[1,1] A[1,2] A[1,3]
A[0,0] A[0,1] A[0,2] A[0,3]
Trang 23Khởi tạo mảng đa chiều
1 2 3 4 Ary[0,0]=1; Ary[0,1]=2 ; Ary[0,2]=3; Ary[0,3]=4;
Ary[1,0]=5; Ary[1,1]=6 ; Ary[1,2]=7; Ary[1,3]=8; Ary[2,0]=9; Ary[2,1]=10 ; Ary[2,2]=11; Ary[2,3]=12;
Trang 24int ary[3][4]
={{1,2,3},{4,5,6},{7,8,3}};
Kết quả của phép gán trên như sau:
Khởi tạo mảng đa chiều (tt)
7 8 3 0
4 5 6 0
1 2 3 0 Ary[0,0]=1; Ary[0,1]=2 ; Ary[0,2]=3; Ary[0,3]=0;
Ary[1,0]=4; Ary[1,1]=5 ; Ary[1,2]=6; Ary[1,3]=0; Ary[2,0]=7; Ary[2,1]=8 ; Ary[2,2]=3; Ary[2,3]=0;
Trang 25Truy xuất các phần tử mảng
Truy xuất phần tử mảng với các chỉ số cụ thể
A[0][0] //Phần tử đầu tiên (hàng 0, cột 0)
A[1][3] //Phần tử ở hàng 2, cột 4
A[m-1][n-1] //Phần tử cuối cùng(hàng m, cột n)
Sử dụng vòng lặp (for, while, do…while):
for (int i=0;i<m;i++){
Trang 26
Bài tập áp dụng
Bài tập 4: Viết chương trình:
Khai báo và khởi tạo giá trị cho 1 mảng 2 chiều kiểu nguyên, kích thước 3 3
Hiển thị các giá trị đã nhập ra màn hình
Trang 27Nhập giá trị cho các phần tử mảng
int A[2][3]; //Khai báo mảng
Gán trực tiếp giá trị cho các phần tử mảng
A[0][0] = 1; A[0][1] = 2; A[0][2] = 3;
A[1][0] = 4; A[0][1] = 5; A[0][2] = 6;
A[0][0] = 7; A[0][1] = 8; A[0][2] = 9;
Sử dụng vòng lặp (for, while, do…while):
for (int i=0;i<2;i++)
Trang 28
Bài tập áp dụng
Bài tập 4: Viết chương trình:
Khai báo mảng 2 chiều kiểu nguyên, kích thước m n (m, n bất kỳ, nhập từ bàn phím)
Nhập giá trị cho các phần tử mảng
Hiển thị các giá trị đã nhập ra màn hình
Trang 29Truyền mảng 2 chiều vào hàm
Nguyên mẫu hàm:
func (int ary [10][20])/*Xác định trước kích thước mảng*/
{
}
func (int ary [][20])/*Không xác định kích thước mảng*/
{
}
Hoặc:
Trang 30Truyền mảng 2 chiều vào hàm
}
Mảng Ary được truyền vào hàm func
Trang 31
Bài tập áp dụng
Bài tập 5: Viết chương trình dưới dạng hàm, thực hiện các yêu câu cầu sau:
Khai báo mảng 2 chiều kiểu nguyên, kích thước m n
Nhập giá trị cho các phần tử mảng
Hiển thị các giá trị đã nhập ra màn hình
Liệt kê các số nguyên tố trong mảng
Trang 32Phần 3: Chuỗi ký tự
Trang 33Chuỗi/Mảng ký tự
Khai báo chuỗi:
Chuỗi có thể được định nghĩa như là một mảng
kiểu ký tự, được kết thúc bằng ký tự null („\0‟)
Chuỗi lưu tối đa 9 ký tự, ký tự cuối cùng là ký tự „\0‟
Ví dụ:
char str [10];
char <Tên chuỗi> [Độ dài chuỗi];
Trang 34Chuỗi/mảng ký tự
Có thể gán các hằng chuỗi cho các biến chuỗi
Hằng chuỗi là một chuỗi các ký tự nằm trong dấu
nháy kép
Ký tự null „\0‟ được tự động thêm vào biểu diễn
bên trong của chuỗi
phần tử trống cho ký tự kết thúc
Trang 35Gán giá trị trong khi khai báo:
char str [] = “ Hello ” ; Hoặc char str [ 6 ] = “ Hello ” ;
Nhập chuỗi:
Trang 36Các hàm về chuỗi
Các hàm xử lý chuỗi nằm trong tập tin
string.h Một số thao tác được thực hiện
bởi các hàm này là:
• Ghép chuỗi
• So sánh chuỗi
• Xác định vị trị một ký tự trong chuỗi
• Sao chép một chuỗi sang chuỗi khác
• Tính chiều dài chuỗi
• …
Trang 37Các hàm xử lý chuỗi
Tên hàm Ý nghĩa
strcat(str, s) Nối chuỗi s bắt đầu từ cuối chuỗi str
strncat(str,s,n) Nối n ký tự của chuỗi s bắt đầu từ cuối chuỗi str
strcmp(str1,str2) So sánh 2 chuỗi str1 và str2 Hàm trả về 1 trong 3 giá trị: lớn
hơn 0 (str1>str2), nhỏ hơn 0 (str1<str2) hoặc bằng 0 (str1 = str2) strncmp(str,t,n) So sánh n kí tự đầu tiên của 2 chuỗi str1 và str2 Hàm này cũng
trả về 1 trong 3 giá trị như trên
strcpy(str,s) Copy chuỗi s vào chuỗi str
strncpy(str,s,n) Copy n ký tự của chuỗi s vào chuỗi str
strlen(str) Trả về chiều dài của chuỗi str, được tính bằng số kí tự trong
chuỗi str, không kể kí tự kết thúc null
strchr(str,c) Trả về địa chỉ của ký tự c đầu tiên xuất hiện trong chuỗi str
strrchr(str,c) Trả về địa chỉ của ký tự c cuối cùng xuất hiện trong chuỗi str
Trang 39 Hàm trả về một giá trị:
• Nhỏ hơn 0, nếu str1< str2
• 0, nếu str1 giống str2
• Lớn hơn 0, nếu str1 > str2
Trang 40• con trỏ trỏ đến vị trí tìm được đầu tiên
của ký tự (trỏ bởi chr) trong chuỗi str
• NULL nếu chr không có trong chuỗi
Trang 43Gọi hàm:
Trang 44 Hiển thị các chuỗi đã nhập ra màn hình
Nối 2 chuỗi s1, s2 và hiển thị kết quả ra màn hình
Trang 45
Mảng chuỗi
Mảng của chuỗi mảng ký tự hai chiều
Chỉ số bên trái xác định số chuỗi, chỉ số bên phải xác định kích thước chuỗi
Ví dụ: char str_ary [50][100];
Mảng str_ary chứa 50 chuỗi
Mỗi chuỗi có độ dài tối đa 100 kí tự
str_ary[0]: Chuỗi thứ nhất str_ary[1]: Chuỗi thứ 2 …
str_ary[i]: Chuỗi thứ i + 1
Trang 46}
Trang 47
Xuất mảng chuỗi
Ví dụ:
char str_ary[10][50];
{ printf(“%s\n”,str_ary[i]); }
Trang 48 Hiển thị các chuỗi đã nhập ra màn hình
Tìm chuỗi có độ dài lớn nhất trong các chuỗi đã nhập
Trang 49Truyền mảng chuỗi vào hàm
Nguyên mẫu hàm:
func (char str [20][30])/*Xác định trước kích thước mảng*/
{
}
func (char str [][30])/*Không xác định kích thước mảng*/
{
}
Hoặc:
Tương tự như truyền mảng 2 chiều
Trang 50Truyền mảng chuỗi vào hàm
}
Mảng chuỗi str được truyền vào hàm func
Trang 51 Hiển thị chuỗi đã nhập ra màn hình
Liệt kê những chuỗi ký tự có độ dài bằng chuỗi ký tự đầu tiên