pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
TRANSCRIPT
trueclass
cout
C++operator
catch
virtual throw
try
friend bool
cinnew
inline private OOP
deleteusing falseSTL
public
1
T h S . Đ ặ n g B ì n h P h ư ơ n gd b p h u o n g @ f i t . h c m u s . e d u . v n
VCBB© 13.09a
this
Bộ môn Công nghệ phần mềm
Khoa Công nghệ thông tin
Trường Đại học Khoa học Tự nhiên
PP LT HƯỚNG ĐỐI TƯỢNG
KIỂU DỮ LIỆU CƠ SỞ
& LỚP DỰNG SẴN
2
VC
BB
1 2 3 4 5
Nội dung
Kiểu dữ liệu cơ sở & lớp dựng sẵn
#include <iostream>using namespace std;
void main(){
cout << “Hello World”;cout << endl;
Các kiểu dữ liệu cơ sở và phép toán
Kiểu chuỗi kí tự
Dữ liệu động
Đối sánh các kiểu dữ liệu cơ sở của C++, Java và C#
Những điểm hạn chế của C++
3
VC
BB
Các kiểu dữ liệu cơ sở và phép toán1 2 3 4 5
Các kiểu dữ liệu cơ sở
NNLT C++ hỗ trợ 4 kiểu cơ sở sau:
Kiểu dữ liệu cơ sở & lớp dựng sẵn
Kiểu số nguyên
Kiểu ký tự
Kiểu số thực
Kiểu luận lý
• Số nguyên không dấu
• Số nguyên có dấu
• Số có độ chính xác đơn
(single-precision)
• Số có độ chính xác kép
(double-precision)
• Ký tự 1 byte
(bảng mã ASCII)
• Ký tự 2 byte
(bảng mã quốc tế UTF-16)
• Giá trị đúng (true) hoặc sai (false)
C++
4
VC
BB
Các kiểu dữ liệu cơ sở và phép toán1 2 3 4 5
Kiểu số nguyên
Kiểu số nguyên có dấu
Miền giá trị (số n-bit): -2n – 1 … +2n – 1 – 1
Kiểu dữ liệu cơ sở & lớp dựng sẵn
Kiểu
(Type)
Độ lớn
(Byte)
Miền giá trị
(Range)
char 1 –128 … +127
int24
–32.768 … +32.767–2.147.483.648 … +2.147.483.647
short 2 –32.768 … +32.767
long 4 –2.147.483.648 … +2.147.483.647
long long 8–9,223,372,036,854,775,808… 9,223,372,036,854,775,807
Một số môi trường lập trình đồng nhất kiểu long long với kiểu long cho nên
kiểu này ít được sử dụng trong lập trình ứng dụng.
5
VC
BB
Các kiểu dữ liệu cơ sở và phép toán1 2 3 4 5
Kiểu số nguyên
Kiểu số nguyên không dấu
Miền giá trị (số n-bit): 0 … 2n – 1
Kiểu dữ liệu cơ sở & lớp dựng sẵn
Kiểu
(Type)
Độ lớn
(Byte)
Miền giá trị
(Range)
unsigned char 1 0 … 255
unsigned int24
0 … 655350 … 4.294.967.295
unsigned short 2 0 … 65535
unsigned long 4 0 … 4.294.967.295
unsigned long long 80 …
18,446,744,073,709,551,615
Một số môi trường lập trình đồng nhất kiểu unsigned long long với kiểu
unsigned long cho nên kiểu này ít được sử dụng trong lập trình ứng dụng.
6
VC
BB
Các kiểu dữ liệu cơ sở và phép toán1 2 3 4 5
Các phép toán trên kiểu số nguyên
Các phép toán số học:
Phép cộng: +, phép trừ: -, phép nhân: *
Phép chia lấy phần nguyên: /
Phép chia lấy phần dư: %
Hằng số nguyên có thể biểu diễn ở 3 dạng:
Bát phân: viết bắt đầu bằng số 0.
Thập lục phân: viết bắt đầu bằng 0x.
Thập phân: viết bắt đầu bằng số từ 1 đến 9.
Kiểu dữ liệu cơ sở & lớp dựng sẵn
7
VC
BB
Các kiểu dữ liệu cơ sở và phép toán1 2 3 4 5
Kiểu số thực
Cấu trúc lưu trữ bên trong của
số thực được thiết kế theo chuẩn
số chấm động (floating-point) của IEEE.
Kiểu dữ liệu cơ sở & lớp dựng sẵn
Kiểu
(Type)
Độ lớn
(Byte)
Miền giá trị
(Range)
float 4 1,4x10-45 … 3,4x1038
float có độ chính xác đơn (single-precision), chính xác đến 7 chữ số.
double 8 4,94x10-324 … 1,79x10308
double có độ chính xác kép (double-precision), chính xác đến 15 chữ số.
long double 10 … 3,4x104932
Một số môi trường lập trình đồng nhất kiểu long double với kiểu double
cho nên kiểu này ít được sử dụng trong lập trình ứng dụng.
8
VC
BB
Các kiểu dữ liệu cơ sở và phép toán1 2 3 4 5
Các phép toán trên kiểu số thực
Các phép toán số học +, -, *, /
Các hàm toán học thường dùng
Kiểu dữ liệu cơ sở & lớp dựng sẵn
12
#include <cmath> // C++ chuẩn
#include <math.h> // C hoặc C++ không chuẩn
Nguyên mẫu hàm Công dụng
double sqrt(double x); Tính 𝑥
double pow(double x,double y);
Tính 𝑥𝑦 (𝑥 > 0)
double exp(double x); Tính 𝑒𝑥 (𝑒 ≈ 2,71828)
double log(double x); Tính ln 𝑥
double log10(double x); Tính log10 𝑥
9
VC
BB
Các kiểu dữ liệu cơ sở và phép toán1 2 3 4 5
Các phép toán trên kiểu số thực
Các hàm toán học thường dùng (tiếp theo)
Kiểu dữ liệu cơ sở & lớp dựng sẵn
Nguyên mẫu hàm Công dụng
int abs(int x);long labs(long x);double fabs(double x);
Tính 𝑥 (x kiểu int)
Tính 𝑥 (x kiểu long)
Tính 𝑥 (x kiểu double)
double cos(double x);double sin(double x);double tan(double x);
Tính cos 𝑥 , sin 𝑥 , tan 𝑥 (xtính theo radian,
1 radian bằng 180/𝜋 độ)
double acos(double x);double asin(double x);double atan(double x);
Tính cos−1 𝑥Tính sin−1 𝑥Tính tan−1 𝑥
double floor(double x);double ceil(double x);
Tính 𝑥Tính 𝑥
10
VC
BB
Các kiểu dữ liệu cơ sở và phép toán1 2 3 4 5
Kiểu luận lý
Khai báo kiểu bool đối với C++ chuẩn hoặc kiểu
số nguyên bất kỳ (short, long, …).
Giá trị khác 0 nghĩa là đúng (true).
Giá trị bằng 0 nghĩa là sai (false).Lưu ý: Kết quả lượng giá một biểu thức luận lý bất kỳ thực hiện bởi
C++ luôn cho kết quả là 0 (false) hay 1 (true).
Các phép toán
Kết hợp: && (and), || (or), ~ (not)
So sánh: >, >=, <, <=, ==, !=
Kiểu dữ liệu cơ sở & lớp dựng sẵn
11
VC
BB
Các kiểu dữ liệu cơ sở và phép toán1 2 3 4 5
Kiểu ký tự
Kiểu ký tự 8-bit
Kiểu char hoặc unsigned char.
Lưu mã ASCII của ký tự, giá trị từ 0 đến 255.
Một số ký tự nên nhớ
Kiểu dữ liệu cơ sở & lớp dựng sẵn
Ký tự Mã
‘ ’ (khoảng trắng) 32
‘0’ .. ‘9’ 48 .. 57
‘A’ .. ‘Z’ 65 .. 90
‘a’ .. ‘z’ 97 .. 122
12
VC
BB
Các kiểu dữ liệu cơ sở và phép toán1 2 3 4 5
Kiểu ký tự
Kiểu ký tự 16-bit
Kiểu wchar_t (#include <cwchar>)
Lưu trữ dự trên bảng mã quốc tế UTF-16
(một dạng mã Unicode).
• Mã UTF-16 của ký tự thông thường (‘0’ đến ‘9’,
‘a’ đến ‘z’, ‘A’ đến ‘Z’, …) trùng mã ASCII.
Hằng ký tự kiểu wchar_t được đặt trước
bằng chứ L.
• Lưu ý, ‘B’ và L‘B’ như nhau (cùng giá trị 66)
nhưng kích thước trong bộ nhớ khác nhau
(sizeof(‘B’) = 1, sizeof(L‘B’) = 2)
Kiểu dữ liệu cơ sở & lớp dựng sẵn
13
VC
BB
Các kiểu dữ liệu cơ sở và phép toán1 2 3 4 5
Kiểu ký tự
Một số hàm liên quan đến ký tự
Kiểu dữ liệu cơ sở & lớp dựng sẵn
Nguyên mẫu hàm Công dụng
bool isupper(char ch);bool iswupper(wchar_t ch);
Kiểm tra ch có phải là
ký tự hoa?
char toupper(char ch);wchar_t towupper(wchar_t ch);
Trả về ký tự hoa
tương ứng với ch
bool islower(char ch);bool iswlower(wchar_t ch);
Kiểm tra ch có phải là
ký tự thường?
char tolower(char ch);wchar_t towlower(wchar_t ch);
Trả về ký tự thường
tương ứng với ch
14
VC
BB
Kiểu chuỗi ký tự1 2 3 4 5
Giới thiệu
Kiểu chuỗi ký tự trong C++ không được xây
dựng sẵn (không phải là “built-in string”) mà
được cài đặt trong một lớp của thư viện chuẩn
STL (C++ Standard Template Library).
Hai kiểu dữ liệu chuỗi
string (chuỗi ký tự 8-bit): mỗi ký tự trong
chuỗi là một ký tự 8-bit có kiểu là char.
wstring (chuỗi ký tự 16-bit): mỗi ký tự trong
chuỗi là một ký tự 16-bit có kiểu là wchar_t.
Kiểu dữ liệu cơ sở & lớp dựng sẵn
15
VC
BB
Kiểu chuỗi ký tự1 2 3 4 5
Kiểu chuỗi 8-bit
Khai báo
Một số toán tử trên chuỗi
Toán tử gán: =
Toán tử ghép chuỗi: +
Toán tử so sánh: >, >=, <, <=, ==, !=
Toán tử xuất, nhập: <<, >>
Kiểu dữ liệu cơ sở & lớp dựng sẵn
12
#include <string>
using namespace std;
16
VC
BB
Kiểu chuỗi ký tự1 2 3 4 5
Kiểu chuỗi 8-bit
Các phương thức của kiểu string (xem chi tiết
trong [OOP] trang 58-59). length(): trả về chiều dài chuỗi.
substr(): trích ra chuỗi con.
insert(): chèn ký tự hoặc chuỗi vào chuỗi cho trước.
erase(): xóa một số ký tự tại vị trí cho trước.
find(), find_first_of(): tìm ký tự hoặc chuỗi trong chuỗi cho trước
từ trái sang phải.
replace(): thay thế một đoạn con trong chuỗi cho trước.
rfind(), find_last_of(): ngược với find() và find_first_of().
find_first_not_of(), find_last_not_of(): tìm vị trí đầu tiên/cuối
cùng khác với ký tự hay chuỗi cho trước.
swap(): hoán chuyển nội dung 2 chuỗi.
char* c_str(): trả về chuỗi ký tự dạng cũ của C (ký tự kết thúc NULL).
Kiểu dữ liệu cơ sở & lớp dựng sẵn
17
VC
BB
Kiểu chuỗi ký tự1 2 3 4 5
Kiểu chuỗi 8-bit
Ví dụ về các toán tử trên chuỗi
Kiểu dữ liệu cơ sở & lớp dựng sẵn
1234567891011121314
#include <string>
#include <iostream>
using namespace std;
void main()
{
string str1(“Object Oriented”);
string str2 = “Programming”;
string str3 = str1 + “ ” + str2 + “.”;
cout << “Final string: ” << str3 << endl;
cout << “Length: ” << str3.length() << endl;
char cFirst = str3[0];
int iLastPos = str3.length() – 1;
char cLast = str3[iLastPos];
}
18
VC
BB
Kiểu chuỗi ký tự1 2 3 4 5
Kiểu chuỗi 8-bit
Lưu ý
Toán tử >> chỉ cho phép đọc một dãy gồm
các ký tự liền nhau (không có khoảng trắng)
vào đối tượng có kiểu string.
Để đọc chuỗi có khoảng trắng từ đối tượng
nhập của lớp istream (ví dụ cin) có thể sử
dụng hàm getline() (trong namespace std)Đây là hàm toàn cục chứ không phải thành viên của một lớp,
khác với phương thức cin.getline() để đọc chuỗi dạng cũ của C.
Kiểu dữ liệu cơ sở & lớp dựng sẵn
12
istream& std::getline(istream& is, string& str, char delim);
istream& std::getline(istream& is, string& str);
19
VC
BB
Kiểu chuỗi ký tự1 2 3 4 5
Kiểu chuỗi 8-bit
Ví dụ về nhập chuỗi có khoảng trắng
Kiểu dữ liệu cơ sở & lớp dựng sẵn
1234567891011
#include <iostream>
#include <string>
using namespace std;
void main()
{
string str;
cout << “Enter a string: ”;
getline(cin, str);
cout << “Inputed string: ” << str;
}
Object Oriented ProgrammingEnter a string:Inputed string: Object Oriented Programming
_ __
20
VC
BB
Kiểu chuỗi ký tự1 2 3 4 5
Kiểu chuỗi 16-bit
Cách thao tác hoàn toàn tương tự như kiểu
chuỗi 8-bit nhưng cần lưu ý:
Hằng chuỗi được đặt trước bằng ký tự L.
Phương thức length() trả về số lượng ký tự
chứ không phải số lượng byte để lưu trữ.
Sử dụng thay thế:• string → wstring , char → wchar_t
• ostream → wostream, istream → wistream
• cin → wcin, cout → wcout.
Kiểu dữ liệu cơ sở & lớp dựng sẵn
21
VC
BB
Kiểu chuỗi ký tự1 2 3 4 5
Kiểu chuỗi 16-bit
Ví dụ về các toán tử trên chuỗi
Kiểu dữ liệu cơ sở & lớp dựng sẵn
1234567891011121314
#include <string>
#include <iostream>
using namespace std;
void main()
{
wstring str1(L“Object Oriented”);
wstring str2 = L“Programming”;
wstring str3 = str1 + L“ ” + str2 + L“.”;
wcout << L“String: ” << str3 << endl;
cout << “Length: ” << str3.length() << endl;
wchar_t wcFirst = str3[0];
int iLastPos = str3.length() – 1;
wchar_t wcLast = str3[iLastPos];
}
22
VC
BB
Dữ liệu động1 2 3 4 5
Một số lớp hữu ích
Thư viện chuẩn STL hỗ trợ sẵn nhiều lớp phục
vụ cho việc lập trình với dữ liệu động
Một số lớp dựng sẵn không chuẩn
CString, CArray, CList trong thư viên lớp MFC
(Microsoft Foundation Classes) trong Visual C++.
Kiểu dữ liệu cơ sở & lớp dựng sẵn
Tên lớp Chỉ thị #include
vector<T> #include <vector>
list<T> #include <list>
stack<T> #include <stack>
queue<T> #include <queue>
priority_queue<T> #include <queue>/<functional>
23
VC
BB
Dữ liệu động1 2 3 4 5
Ví dụ sử dụng lớp vector<T>
Kích thước mảng được xác định từ đầu
Kiểu dữ liệu cơ sở & lớp dựng sẵn
1234567891011121314
#include <vector>
#include <iostream>
using namespace std;
void main() {
int i, n;
vector<int> a;
cout << “Enter the number of elements: ”;
cin >> n;
a.resize(n);
for (i = 0; i < n; i++) {
cout << “Enter a[” << i << “]: ”;
cin >> a[i];
}
}
24
VC
BB
Dữ liệu động1 2 3 4 5
Ví dụ sử dụng lớp vector<T>
Kích thước mảng tự động điều chỉnh
Kiểu dữ liệu cơ sở & lớp dựng sẵn
1234567891011121314
#include <vector>
#include <iostream>
using namespace std;
void main() {
int i, n, nTemp;
vector<int> a;
cout << “Enter the number of elements: ”;
cin >> n;
for (i = 0; i < n; i++) {
cout << “Enter a[” << i << “]: ”;
cin >> nTemp;
a.push_back(nTemp);
}
}
25
VC
BB
Đối sánh các kiểu dữ liệu cơ sở của C++, Java và C#1 2 3 4 5
Đọc thêm [OOP] trang 68-75
Kiểu dữ liệu số và vô hướng.
Kiểu chuỗi ký tự.
Mảng động một chiều và nhiều chiều.
Kiểu dữ liệu cơ sở & lớp dựng sẵn
27
VC
BB
1 2 3 4 5
Một số thuật ngữ
basic data type: kiểu dữ liệu cơ sở (của NNLT)
built-in class: lớp xây dựng sẵn
built-in data type: kiểu dữ liệu có sẵn (của NNLT)
built-in dynamic array: kiểu mảng động có sẵn (của NNLT)
built-in string: kiểu dữ liệu chuỗi có sẵn (của NNLT)
dynamic array: mảng động (kích thước xác định lúc chạy chương trình)
FIFO (first in first out): cơ chế hoạt động của ngăn xếp (vào trước ra trước)
LIFO (last in first out): cơ chế hoạt động của hàng đợi (vào sau ra trước)
MFC (Microsoft Foundation Classes): thư viện lớp của Visual C++
priority queue: hàng đợi theo độ ưu tiên
read-only variable: biến chỉ được phép đọc
static array: mảng tĩnh (kích thước xác định lúc khai báo)
STL (standard template library): thư viện chuẩn của C++
Kiểu dữ liệu cơ sở & lớp dựng sẵn
28
VC
BB
1 2 3 4 5
Tài liệu tham khảo
[OOP] Chương 2 – Kiểu dữ liệu cơ sở và lớp
dựng sẵn (trang 51-75)
[Primer] Chapter 3 – Dealing with Data
Simple Variables, Floating-Point Numbers
& C++ Arithmetic Operators (trang 66-105)
[Primer] Chapter 4 – Compound Types
Strings (trang 114-125)
Introducing the string Class (trang 125-131)
[Primer] Chapter 16 – The string class
and the STL
The string Class (trang 857-872)
Kiểu dữ liệu cơ sở & lớp dựng sẵn
29
VC
BB
1 2 3 4 5
Bài tập
Bài tập 3.1: Sửa lại bài tập 2.8 sử dụng lớp
string thay thế kiểu chuỗi ký tự dạng cũ của C.
Bài tập 3.2: Sửa lại bài tập 2.9 sử dụng lớp
vector thay thế mảng tĩnh (CDynamicArray).
Bài tập 3.3: Cài đặt lớp chuỗi ký tự (CString)
sử dụng mảng ký tự được cấp phát động để
lưu trữ, hỗ trợ một số phương thức cơ bản như:
Nhập, xuất, khởi tạo, lấy/gán, lấy độ dài.
Tạo chuỗi in, thường, đảo chuỗi, nối chuỗi.
So sánh với chuỗi khác.
Kiểu dữ liệu cơ sở & lớp dựng sẵn
30
VC
BB
1 2 3 4 5
Bài tập
Bài tập 3.4: Xây dựng lớp ma trận (CMatrix) sử
dụng lớp vector để lưu trữ, hỗ trợ một số
phương thức cơ bản như:
Nhập, xuất, khởi tạo.
Lấy/Gán phần tử tại vị trí bất kỳ.
Cộng, trừ, nhân với ma trận khác phù hợp.
Bài tập 3.5: Xây dựng lớp mảng nhọn, là mảng
hai chiều với số cột trên mỗi dòng có thể khác
nhau (CJaggedArray) sử dụng lớp vector để
lưu trữ, hỗ trợ một số phương thức cơ bản.
Kiểu dữ liệu cơ sở & lớp dựng sẵn