Bài giảng Kỹ thuật lập trình do GV. Hà Đại Dương biên soạn trình bày về nội dung cấu trúc dữ liệu con trỏ (pointer), cấu trúc dữ liệu xâu ký tự (string),... Tài liệu hữu ích để cho các bạn sinh viên ngành Công nghệ thông tin bổ trợ thêm kiến thức lập trình của mình.
Trang 1Tuần 6 - Các cấu trúc dữ liệu cơ
Trang 2Con trỏ (Pointer)
Con trỏ
• Cho phép quản lý vùng nhớ: Ghi, đọc dữ liệu
từ vùng nhớ này (như biến)
• Biến thông thường
int a; float b; char c
a,b,c: Biến (thường), lưu giá trị
• Biến con trỏ (con trỏ): lưu địa chỉ của vùng
nhớ
Trang 3– Tại địa chỉ: FF01có giá trị là678
– Tại địac chỉFF02có giá trị là34.1
Địa chỉ Giá trị
Trang 4Địa chỉ và giá trị …
• Biến thường
int a; float b; char c
Quan tên của nó -> Biết giá trị
• Con trỏ:
int *pa; float *pb; char *pc;
Qua tên của nó -> Biết địa chỉ ô nhớ
– Ví dụ: &a, &b, &c
• Toán tử *: Tác động đến giá trị ô nhớ tại địa
chỉ biến con trỏ
– Cú pháp: *Tên_Biến_Con_trỏ
– Ví dụ: *pa, *pb, *pc
Trang 5Ví dụ 1
Ví dụ 1…
Trang 6Ví dụ 2
Ví dụ 2 …
Trang 7Cấp phát bộ nhớ
• Xét chương trình sau:
Cấp phát bộ nhớ …
• Khi chạy báo lỗi
Sử dụng pa khi chưa khởi tạo
Trang 8Lý do
• Khi gặp khai báo con trỏ -> chương trình chưa
dành chỗ (ô nhớ) để lưu giá trị nên
Trang 9• N: kích thước (byte) mỗi phần tử
– Trả về địa chỉ (đầu) vùng nhớ k*n (bytes) cấp phát
Trang 11Quản lý mảng bằng con trỏ …
• Phép cộng/trừ con trỏ với 1 số nguyên
– Phép công: pb + N cho phép truy cập đến phần tử
(ô nhớ) thứ N+1 tính từ địa chỉ con trỏ pb.
– Phép công: pb - N cho phép truy cập đến phần tử
(ô nhớ) trước con trỏ pb N.
Ví dụ 4
Trang 13• Con trỏ cho phép tạo và quản lý vùng nhớ với
kích thước có thể thay đổi được -> Cấp phát
Trang 14• Ý nghĩa: cấp phát lại vùng nhớ quản lý bởi con
trỏ p với kích thước mới là N (bytes)
• Ví dụ 6:
Trang 159/26/2016 29
Ví dụ 6
Trang 17Bài tập
(Sử dụng con trỏ thay vì dùng mảng)
1 Viết chương trình chuyển số thập phân về
bát phân, thập lục phân
2 Viết chương trình chuyển số nhị phân, bát
phân, thập lục phân về dạng thập phân
Trang 18Xâu ký tự (string)
Định nghĩa
• Xâu ký tự (hay chuỗi ký tự) là một dãy (hoặc
mảng) các ký tự liên tiếp được kết thúc bằng
ký tự ‘\0’ (còn được gọi là ký tự NULL trong
bảng mã ASCII)
• Hằng xâu ký tự là dãy ký tự nằm trong cặp “”
• Ví dụ:
“Ky thuat lap trinh”
“Hoc vien Ky thuat Quan su”
Trang 19Xâu ký tự …
• Trong C++: có kiểu xâu ký tựstring.
• Trong C: xâu là cách tổ chức dữ liệu (không
Trang 21– Cộng 2 xâu: “Sinh Vien” và “Hoc vien KTQS” để
được “Sinh Vien Học vien KTQS” (khác với 2 mảng)
– ….
Xâukhông chỉ là mảng các ký tự
Trang 22Các hàm xử lý xâu
• Hàm strcat()
– Ý nghĩa: Cộng (nối) 2 xâu thành một
– Cú pháp
char *strcat(char *des, const char *source)
– Nối xâu 2 vào xâu 1.
– Ví dụ
Trang 23• Sao chép (copy) 1 xâu
–char *strcpy(char *Des, const char *Source)
Trang 24Các hàm xử lý xâu …
• Sao chép n ký tự đầu tiên
–char *strncpy(char *Des, const char *Source,
size_t n)
• Tìm kiếm nội dung
–char *strstr(const char *s1, const char *s2)
– Tìm kiếm sự xuất hiện đầu tiên của chuỗi s2 trong
chuỗi s1
– Kết quả trả về của hàm là một con trỏ chỉ đến
phần tử đầu tiên của chuỗi s1 có chứa chuỗi s2
hoặc giá trị NULL nếu chuỗi s2 không có trong
chuỗi s1
Ví dụ
Trang 25• Đổi năm dương lịch thành năm âm lịch
– Xem lại chương trình đã viết ở tuần 2
– Chương trình
Trang 26Ví dụ 8 …
Ví dụ 9
• Viết chương trình đếm số từ đơn trong 1 xâu
Ví dụ: “Ky thuat lap trinh” có 4 từ đơn
• Viết chương trình (10)
(Kiểm tra và thảo luận)
Trang 27Ví dụ 10
• Tạo dòng chữ chạy trên màn hình
• Cách làm ?: Ví dụ với xâu “Ky thuat lap trinh ”
– Chạy qua bên trái
“Ky thuat lap trinh ”
“y thuat lap trinh K”
“ thuat lap trinh Ky”
“thuat lap trinh Ky ”
“huat lap trinh Ky t”
….
Ví dụ 10 …
Trang 28Ví dụ 10 …
• Để cảm nhận dòng chữ chạy ngang trên màn
hình thì cần viết các dòng
“Ky thuat lap trinh ”
“y thuat lap trinh K”
“ thuat lap trinh Ky”
cùng 1 vị trí
• Lệnh system(“cls”) trong thư viện stdlib.h; cho
phép xoá màn hình và đưa con trỏ về góc trên
bên trái
Trang 29Ví dụ 10 …
• Chưa thêm system(“cls”)
• Thêm vào system(“cls”)
Ví dụ 10 …
• Để thực sự tạo hiệu ứng dòng chữ chạy ngang
màn hình cần viết ra liên tục, liên tục các dong
“Ky thuat lap trinh ”
“y thuat lap trinh K”
“ thuat lap trinh Ky”
…
ở cùng 1 vị trí
• Viết chương trình hoàn chỉnh (10 phút)
Trang 30Ví dụ 10 …
Ví dụ 10 …
• Chương trình trên đến khi nào dừng?
• Muốn dừng khi người sử dụng nhấn 1 phím
bất kỳ? Làm thế nào?
• Để tốc độ chữ chạy chậm hơn? Làm thế nào?
• Để chữ chạy từ qua phải làm thế nào?
Trang 31Bài tập
Bài tập
1 Viết chương trình thể hiện dòng chữ chạy
ngang trên màn hình từ phải qua trái
2 Chuẩn hoá xâu họ tên người việt
3 Đổi ngày tháng năm thành chữ Ví dụ
27/9/2016 đổi thành dòng chữ “Ngày hai
mươi bảy tháng chín năm hai nghìn không
trăm mười sáu”
4 Nhập vào 1 biểu thức đơn giản gồm 2 toán
hạng và 1 toán tử, tính kết quả biểu thức đó
Trang 32• Tìm hiểu trong VS C/C++ làm thế nào để giữ
chậm 1 khoảng thời gian nào đó?