KHÁI QUÁT M Ả NG NHI Ề U CHI Ề U• ðể biểu diễn dãy các giá trị, ta dùng mảng 1 chiều, • ðể biểu diễn bảng các giá trị, ta dùng mảng 2 chiều, • ðể biểu diễn khối các giá trị, ta dùng mảng
Trang 1ThS VÕ NHẬT VINH
Trang 6QUY ðỊ NH C Ủ A GI Ả NG VIÊN
Trang 9GI Ớ I THI Ệ U M Ả NG 2 CHI Ề U
• ðể lưu trữ dữ liệu theo 1 hàng dọc hoặc hàng
ngang, ta dùng mảng (xem Cơ sở lập trình),
• ðể lưu trữ kết quả ñược sắp xếp theo cả chiều
ngang và chiều dọc, ta sẽ dùng mảng 2 chiều
Trang 10KHAI BÁO M Ả NG 2 CHI Ề U
• Khai báo mảng cần 3 thông tin:
Trang 12• Ví dụ: xét mảng ñược khai báo int A[50][60]
Trang 13• Có thể khởi tạo giá trị của mảng ngay từ lúc khai
báo mảng bằng cách liệt kê các giá trị của các phần
tử: int A[2][3] = {{1, 2, 3},
{2, 3, 4}}
Nếu liệt kê không ñầy ñủ thì giá trị các phần tử còn
lại mặc ñịnh là 0
Trang 14KHÁI QUÁT M Ả NG NHI Ề U CHI Ề U
• ðể biểu diễn dãy các giá trị, ta dùng mảng 1 chiều,
• ðể biểu diễn bảng các giá trị, ta dùng mảng 2 chiều,
• ðể biểu diễn khối các giá trị, ta dùng mảng 3 chiều,
• …
• Ta sẽ có thể mảng nhiều chiều (2 chiều, 3 chiều…)
ñể biểu diễn các phần tử liên tiếp nhau trong bộ nhớ,
có cùng kiểu dữ liệu, cùng tên theo một cách sắp xếpkhông gian nào ñó,
Trang 16TÓM T Ắ T
• Mảng dùng ñể một loạt các phần tử liên tiếp, cùng
kiểu dữ liệu và cùng tên,
• Tùy theo cách sắp xếp không gian của các phần tử
liên tiếp mà ta có mảng 1 chiều, 2 chiều, 3 chiều,…
• Khi khai báo ta cần các thông tin: kiểu dữ liệu, tên
mảng và kích thước mảng (số lượng kích thước tùytheo số chiều của mảng),
• Khi truy xuất, cần gọi ñúng tên mảng, vị trí của phần
Trang 17ThS VÕ NHẬT VINH
Trang 18T Ổ NG QUAN
• Hạn chế của bộ nhớ tĩnh,
• Giới thiệu con trỏ:
– Khái quát v ề con tr ỏ ,
– Khai báo con tr ỏ ,
– Kh ở i t ạ o và h ủ y b ỏ con tr ỏ ,
– Truy xu ấ t vùng nh ớ và giá tr ị l ư u trong vùng nh ớ ,
• Ứng dụng con trỏ cho mảng một chiều,
• Tóm tắt
Trang 19H Ạ N CH Ế C Ủ A B Ộ NH Ớ T Ĩ NH
• Dữ liệu phải lưu vào vùng nhớ ñã ñược khai báo
trước trong chương trình,
• Chương trình khi nhận ñược sự khai báo sẽ dành
hẳn 1 vùng nhớ tương ứng ñể chờ ñợi dữ liệu,
• Trong quá trình tính toán, dữ liệu ít hơn dự kiến thì
không thể yêu cầu chương trình cắt bớt vùng nhớ,
• Nếu dữ liệu nhiều hơn dự kiến thì cũng không thể
yêu cầu chương trình tăng thêm vùng nhớ,
• Ví dụ: khai báo mảng 10 phần tử nhưng có lúc chỉ
cần dùng 7 phần tử hoặc cần dùng 15 phần tử?
Trang 20KHÁI QUÁT V Ề CON TR Ỏ
Trang 21KHAI BÁO CON TR Ỏ
• Biến con trỏ cũng phải ñược khai báo trước khi sử
Trang 22KHAI BÁO CON TR Ỏ (tt)
• Cú pháp: kiểu_dữ_liệu * tên_biến_con_trỏ
• Ví dụ: int * Con_tro;
– Ngh ĩ a là: bi ế n Con_tro s ẽ ch ỉ ñế n 1 vùng nh ớ mà vùng
nh ớ này s ẽ ch ứ a m ộ t giá tr ị s ố ki ể u int
– Giá tr ị c ủ a bi ế n Con_tro là ñị a ch ỉ vùng nh ớ ñ ang ñượ c
ch ỉ ñế n.
Trang 23KH Ở I T Ạ O VÀ H Ủ Y B Ỏ CON TR Ỏ
• Khác với các biến thông thường, sau khi khai báo,
biến con trỏ vẫn chưa sử dụng ñể truy xuất ñược
mà phải khởi tạo, nghĩa là chỉ rõ vùng nhớ mà nó
trỏ ñến Có 2 cách:
• Gán con trỏ tới vùng nhớ ñã ñược cấp sẵn,
Vd:int * con_tro; int i; //vùng nhớ của i ñã ñược cấp
con_tro = &i; // con_tro chỉ tới vùng nhớ ñã có
• Yêu cầu xin cấp vùng nhớ mới cho con trỏ:
Vd: int * con_tro; con_tro = new (int);
Trang 25– Truy xu ấ t giá tr ị : * con_tro
– Truy xu ấ t ñị a ch ỉ : con_tro
Trang 26TRUY XU Ấ T VÙNG NH Ớ VÀ GIÁ TR Ị (tt)
• Ví dụ:
int i; int * con_tro;
truy xuất giá trị // *con_tro = i; // giá trị của i truy xuất ñịa chỉ // con_tro = &i; // ñịa chỉ của i
Trang 27Ứ NG D Ụ NG CON TR Ỏ CHO M Ả NG
• Con trỏ ñược dùng ñể truy xuất mảng:
– Khai báo m ả ng: int Mang[10];
– Khai báo con tr ỏ : int * con_tro;
– Con tr ỏ ch ỉ ñế n m ả ng: con_tro = & Mang[0];
– Dùng con tr ỏ truy xu ấ t m ả ng:Mang[0] *con_tro
Mang[1] *(con_tro+1) Mang[n] *(con_tro+n)
Trang 28Ứ NG D Ụ NG CON TR Ỏ CHO M Ả NG (tt)
• Con trỏ thay thế hoàn toàn mảng:
– Khai báo con tr ỏ : int * con_tro;
– M ả ng t ạ o b ở i con tr ỏ : con_tro = new int[10];
– Truy xu ấ t giá tr ị m ả ng: * (con_tro+0) hoặc con_tro[0]
* (con_tro+1) hoặc con_tro[1]
Trang 29TÓM T Ắ T
• Con trỏ là biến sử dụng bộ nhớ ñộng, khắc phục hạn
chế của bộ nhớ tĩnh về cấp phát bộ nhớ khi cần thiết/ không cần thiết,
• Con trỏ lưu ñịa chỉ vùng nhớ tương ứng của nó,
• Kiểu dữ liệu của con trỏ là kiểu dữ liệu của giá trị
ñang lưu trong vùng nhớ tương ứng của con trỏ,
• Con trỏ có thể chỉ ñến vùng nhớ tĩnh ñã ñược tạo ra
trước ñó hoặc tạo mới với new và xóa bỏ với delete,
• Con trỏ có thể trỏ ñến mảng hoặc thay thế cho mảng
Trang 30CHU Ỗ I KÝ T Ự
ThS VÕ NHẬT VINH
Trang 31T Ổ NG QUAN
• Nhắc lại về mảng và con trỏ,
• Giới thiệu chuỗi ký tự:
– Khái quát chu ỗ i ký t ự ,
– Khai báo chu ỗ i ký t ự ,
Trang 33GI Ớ I THI Ệ U V Ề CHU Ỗ I KÝ T Ự
• Khaí quát chuỗi ký tự:
– T ậ p h ợ p các ký t ự ñượ c x ế p liên ti ế p nhau trong b ộ
nh ớ và có ký hi ệ u ñặ c bi ệ t k ế t thúc ở cu ố i,
– Có th ể s ử d ụ ng m ả ng, con tr ỏ ñể l ư u tr ữ chu ỗ i ký t ự , – Visual C++ cho phép có m ộ t s ố tác ñộ ng khác lên
chu ỗ i so v ớ i m ả ng ký t ự ,
• Khai báo chuỗi ký tự:
– Chu ỗ i ký t ự s ử d ụ ng m ả ng,
– Chu ỗ i ký t ự s ử d ụ ng con tr ỏ ,
Trang 34GI Ớ I THI Ệ U V Ề CHU Ỗ I KÝ T Ự (2)
• Khai báo chuỗi ký tự:
Cần khai báo thư viện các hàm xử lý chuỗi và
vùng nhớ ñể nạp chuỗi ký tự.
#include <string.h> using namespace std;
– Chu ỗ i ký t ự s ử d ụ ng m ả ng:
• Khai báo tên, kích th ướ c, ki ể u d ữ li ệ u ký t ự ,
• Kích th ướ c là ñộ dài t ố i ñ a c ủ a chu ỗ i và ký t ự ñặ c bi ệ t k ế t thúc chu ỗ i,
• Trong Visual C++: char tên_mảng [kích_thước];
– Chu ỗ i ký t ự s ử d ụ ng con tr ỏ :
Trang 35char tên_mảng [kích_thước] = “chuỗi_ký_tự”;
char tên_mảng[ ] = {‘kytu1’, ‘kytu2’,’kytu3’,’\0’};
char * tên_con_trỏ = “chuỗi_ký_tự”;
• VC++ h ỗ tr ợ c ấ p m ộ t vùng nh ớ cho chu ỗ i ký t ự h ằ ng,
– Sau khi khai báo:
• Chu ỗ i dùng con tr ỏ : có th ể gán tr ự c ti ế p chu ỗ i h ằ ng (sau khi
kh ở i t ạ o b ằ ng new),
• Chu ỗ i dùng m ả ng: ph ả i gán t ừ ng ph ầ n t ử c ủ a m ả ng.
Trang 36– Truy xu ấ t t ừ ng ph ầ n t ử c ủ a chu ỗ i: gi ố ng nh ư truy
xu ấ t m ả ng và con tr ỏ thông th ườ ng.
Trang 37M Ộ T S Ố HÀM X Ử LÝ VĂN BẢ N
• Kích thước: size(), strlen()
• Nối hai chuỗi: strcat(), strncat()
• Thay ñổi nội dung của chuỗi bằng chuỗi khác:
strcpy(), strncpy()
• ðịnh vị một ký tự trong chuỗi: strchr()
• Lưu ý:
– Gán tr ự c ti ế p m ộ t chu ỗ i h ằ ng cho m ộ t chu ỗ i b ằ ng con
tr ỏ : con tr ỏ ñượ c liên h ế t v ớ i vùng nh ớ ñ ang ch ứ a
chu ỗ i h ằ ng,
– Nên s ử d ụ ng strcpy() thay phép gán.
Trang 38• Việc nhập/ xuất dữ liệu thông qua tập tin (file) sẽ
giúp ta giải quyết vấn ñề trên
Trang 39• Một số hàm hỗ trợ xử lý văn bản,
• Lưu ý việc gán giá trị chuỗi cho chuỗi ký tự,
• Tập tin sẽ tạo thuận tiện cho việc nhập/ xuất
Trang 40CH ƯƠ NG 4 (T ậ p tin và lu ồ ng)
ThS Võ Nhật Vinh
Trang 42dụng sau này,
Trang 43GI Ớ I THI Ệ U T Ậ P TIN
• Tập tin dùng ñể lưu trữ dữ liệu trên ổ ñĩa, có thểñược truy xuất nhiều lần và lâu dài,
• Tập tin sắp xếp các dữ liệu theo tuần tự, muốntruy xuất 1 dữ liệu nào ñó thì phải truy xuất lần
lượt các dữ liệu ñược xếp trước ñó,
• Sau dữ liệu cuối cùng trong tập tin là ký hiệu kếtthúc tập tin
Trang 44• ðối tượng (object) là giá trị có thể ñược tạo, lưu
trữ và thao tác trong một ngôn ngữ lập trình,
• Mọi ñối tượng phải thuộc 1 lớp nào ñó
– VD: ðố i t ượ ng T7B2 thu ộ c l ớ p lớp_ðH_Mở
Trang 45TRUY XU Ấ T T Ậ P TIN
• Các lớp và ñối tượng trong VC++:
– Bi ể u di ễ n các lu ồ ng xu ấ t nh ậ p t ừ bàn phím và ra màn hình:
• ðố i t ượ ng cin c ủ a iostream k ế t n ố i v ớ i bàn phím,
• ðố i t ượ ng cout c ủ a iostream k ế t n ố i v ớ i màn hình,
– Bi ể u di ễ n các lu ồ ng xu ấ t nh ậ p t ừ t ậ p tin:
• ðố i t ượ ng c ủ a ifstream k ế t n ố i d ữ li ệ u ñọ c t ừ t ậ p tin,
• ðố i t ượ ng c ủ a ofstream k ế t n ố i d ữ li ệ u ghi vào t ậ p tin,
• Các l ớ p này n ằ m trong th ư vi ệ n fstream.h
Trang 47ofstream ñối_tượng_xuất;
ñối_tượng_xuất open (“tên_tập_tin”);
ñối_tượng_xuất << n;
ñối_tượng_xuất close() ;
Trang 48– Các thao tác cho cin và cout có th ể ñượ c s ử d ụ ng
cho các ñố i t ượ ng xu ấ t nh ậ p b ằ ng t ậ p tin,
– Vd: các toán t ử và hàm <<, >>, getline() v ẫ n ñượ c
Trang 50TÓM T Ắ T
• Nhập/ghi dữ liệu qua tập tin tiện lợi hơn, tập tin
lưu dữ liệu theo kiểu tuần tự,
• Lớp giống như một kiểu dữ liệu ñược tạo ra và
ñối tượng là một giá trị ñược tạo ra – lưu trữ
-thao tác ðối tượng phải thuộc 1 lớp nào ñó,
• Việc nhập/ghi dữ liệu qua tập tin theo các bước:
mở tập tin, nhập/ghi dữ liệu, ñóng tập tin,
• Sử dụng ñối tượng nhập thuộc ifstream, ñối
tượng xuất thuộc ofstream ñể ñọc/ghi tập tin,
Trang 51CH ƯƠ NG 5 ( ðệ quy)
ThS Võ Nhật Vinh
Trang 53– G ọ i hàm luy_thua(n) s ẽ cho giá tr ị 2 n ,
– G ọ i hàm luy_thua(n-1) s ẽ cho giá tr ị 2 n-1 ,
– Có th ể vi ế t l ạ i: luy_thua(n) = 2 x luy_thua(n-1),
• Có thể giải một số bài toán bằng phương pháp
“gọi lại chính nó”
Trang 55GI Ớ I THI Ệ U ðỆ QUY
• Phần chính của ñệ quy:
– Tính toán k ế t qu ả c ầ n tr ả ra d ự a trên k ế t qu ả c ủ a l ầ n tính toán tr ướ c (xem nh ư ñ ã bi ế t),
– L ư u ý s ự thay ñổ i c ủ a tham s ố ,
– Vd: v ớ i luy_thua(n) ta s ẽ return 2 * luy_thua (n-1).
Trang 56GI Ớ I THI Ệ U ðỆ QUY
• ðiều kiện dừng của ñệ quy:
– Tham s ố c ủ a l ờ i g ọ i ñệ quy s ẽ thay ñổ i,
– Tham s ố ph ả i thay ñổ i và ph ả i h ộ i t ụ v ề 1 giá tr ị ñượ c xác ñị nh tr ướ c,
– Khi tham s ố ñạ t ñượ c giá tr ị h ộ i t ụ ñ ó, m ộ t k ế t qu ả
xác ñị nh tr ướ c ph ả i ñượ c tr ả ra và không th ự c hi ệ n
l ờ i g ọ i ñệ quy n ữ a,
– Vd:
• luy_thua(n) s ẽ cho return 2*luy_thua(n-1),
Trang 58M Ở R Ộ NG V Ấ N ðỀ
• Các kiểu dữ liệu cơ bản ñược cung cấp sẵn
không ñủ ñể biểu diễn các dữ liệu trong thực tế,
• Ta có thể tạo “kiểu dữ liệu” mới gọi là “lớp” vớicác giá trị cụ thể “ñối tượng” ñể quản lý chươngtrình dễ hơn,
• Lập trình hướng ñối tượng (OOP) sẽ sử dụng
ñối tượng và lớp,
• Chương 6 sẽ ñề cập ñến vấn ñề này
Trang 60CH ƯƠ NG 6
(L ớ p)
ThS Võ Nhật Vinh
Trang 62ðẶ T V Ấ N ðỀ
• Có những ñối tượng trong cuộc sống mà ta cầnmiêu tả chúng,
• Một ñối tượng có nhiều khía cạnh cần ñược miêu
Trang 63kiểu_dữ_liệu_1 biến_1;
kiểu_dữ_liệu_2 biến_2;
kiểu_dữ_liệu_3 biến_3;
}
Trang 64XÂY D Ự NG KI Ể U D Ữ LI Ệ U STRUCT (2)
• Khai báo một “biến” thuộc kiểu dữ liệu vừa tạo
ra: ten_kieu tên_biến;
• Truy xuất thuộc tính:
– Các bi ế n d ữ li ệ u bên trong ki ể u d ữ li ệ u m ớ i ñượ c g ọ i
là các “thu ộ c tính”,
– S ử d ụ ng toán t ử d ấ u ch ấ m (bi ế n thông th ườ ng) và
toán t ử m ũ i tên (bi ế n con tr ỏ ) ñể truy xu ấ t các “thu ộ c
tính”.
Trang 65– Khai báo “bi ế n” MyBook ki ể u Books: Books MyBook ;
– Truy xu ấ t các thu ộ c tính c ủ a MyBook:
MyBook nam_xuat_ban
MyBook gia_tien
Trang 66XÂY D Ự NG L Ớ P
• Lớp (Class) cũng có thể ñược xem là kiểu dữ liệu
ñược người dùng ñịnh nghĩa giống như struct
nhưng ngoài các thuộc tính, nó còn chứa những
cách thức tác ñộng lên dữ liệu của nó (hàm),
• Lớp có thể hiểu là tập hợp những ñối tượng giốngnhau mà ta cần miêu tả,
• Lớp cho phép che các dữ liệu của nó khi nhìn từ
bên ngoài
Trang 67// khai báo các bi ế n // khai báo các ph ươ ng th ứ c (hàm)
}
Trang 68XÂY D Ự NG L Ớ P (3)
• Xây dựng các phương thức của lớp:
– Ph ươ ng th ứ c ñặ c bi ệ t kh ở i t ạ o dùng ñể kh ở i t ạ o các giá tr ị ban ñầ u cho d ữ li ệ u c ủ a ñố i t ượ ng Ph ươ ng
th ứ c kh ở i t ạ o cùng tên v ớ i tên l ớ p và không tr ả tr ị
Các giá tr ị c ủ a d ữ li ệ u KHÔNG th ể ñượ c kh ở i t ạ o lúc khai báo,
– Ph ầ n ñị nh ngh ĩ a c ủ a các ph ươ ng th ứ c (hàm thành
viên) có th ể ñượ c ñặ t trong ho ặ c ngoài ph ầ n ñị nh
ngh ĩ a l ớ p N ế u ñặ t ngoài, tr ướ c tên hàm ph ả i có tên
Trang 70XÂY D Ự NG L Ớ P (5)
• Truy xuất thuộc tính, phương thức:
– Truy xu ấ t gi ố ng nh ư trong tr ườ ng h ợ p struct,
Trang 71• L ớ p phan_so ñượ c ñị nh ngh ĩ a ñể th ể hi ệ n m ộ t phân s ố ,
• Làm sao ñể th ự c hi ệ n phép toán + gi ữ a 2 ñố i t ượ ng
phan_so?
Trang 72M Ở R Ộ NG V Ấ N ðỀ
• Các toán tử nạp chồng rất cần thiết cho việc
thao tác trên các ñối tượng của lớp,
• Các toán tử nạp chồng cơ bản bao gồm: nhập,
xuất, toán tử 1 ngôi, toán tử 2 ngôi,
• Phần sau của chương này sẽ trình bày thêm về
cách thức xây dựng các toán tử nạp chồng nóitrên