LẬP TRÌNH C++ CƠ BẢN
Các nội dung lập trình C++ cơ bản
(Đã học trong môn học NNTL C++)
 1) Input/output màn hình và bàn phím
 2) Lệnh cấu trúc điều khiển
 3) Cấu trúc dữ liệu:
 4) Xâu ký tự
 5) Xử lý dữ liệu với tệp văn bản
 Lập trình hướng đối tượng
1) Vào/ra dữ liệu với màn hình và bàn
phím
 Sử dụng các hàm thư viện chuẩn(standard)
IOSTREAM của C++
 Hàm in ra màn hình
 Hàm đọc từ bàn phím
2) Lệnh cấu trúc điều khiển
 Lệnh cấu trúc rẽ nhánh
 Cấu trúc lặp
Bài tập 1
 Cho sai số epsilon = 1E-6. Tính gần đúng các giá trị
sau
Bài tập 2
 Nhập 1 mã phản hồi của Server theo giao thức FTP
 Lập trình in ra thông báo tương ứng với mã phản
hồi
 Các mã phản hồi
 220 Command is successfully completed
 331 User name okay, need password.
 230 User logged in, proceed. Logged out if
appropriate.
 425 Can't open data connection.
 502 Syntax error, command not implemented.
3) Cấu trúc dữ liệu struct
 Định nghĩ cấu trúc dữ liệu phức hợp chứa các thành
phần dữ liệu bên trong (trường dữ liệu)
Cấu trúc mảng dữ liệu
 Chứa nhiều phần tử dữ liệu cùng kiểu
 Mảng dữ liệu tĩnh:
 Mảng dữ liệu động:
Con trỏ dữ liệu (Pointer)
 Là kiểu lưu trữ địa chỉ của dữ liệu trong bộ nhớ

 Con trỏ đến dữ liệu nào thì tương ứng với kiểu dữ
liệu đó
4) Xâu ký tự
 Biểu diễn qua mảng ký tự char []
 Có thể dùng con trỏ char* để thao tác với xâu
Xâu ký tự
 Các hàm xử lý xâu ký tự dạng char[] và char*
 strcmp, stricmp, strncmp, strincmp: so sánh xâu
 strchr, strstr: tìm kiếm kí tự, xâu con trong 1 xâu cho
trước
 strtok: tách xâu thành các từ
 strcpy: copy xâu
 strcat: ghép xâu
 atoi, atof: chuyển xâu sang dạng số
 Hàm tạo xâu theo định dạng
 sprintf
 Hàm biến đổi từ xâu sang số
 atoi : từ xâu sang số nguyên
 atof: từ xâu sang số thực
 Tham khảo cách sử dụng các hàm trong thư viện
#include <cstring>
Xâu ký tự với kiểu string (C++)
 Biểu diễn xâu bằng kiểu dữ liệu class string của
C++
 string name = “Computer”;
 Các hàm thành phần thao tác với kiểu string
 find: tìm kiếm một xâu con trong 1 xâu cho trước
 size: tính độ dài xâu
 empty: kiểm tra xâu rỗng
 substr: tách xâu con từ 1 xâu cho trước
 compare: so sánh 2 xâu
 copy: sao chép từ xâu cho trước sang 1 xâu mới
 append: ghép 2 xâu thành 1
 insert : chèn 1 xâu vào trong 1 xâu khác
 replace: thay thế 1 xâu con trong 1 xâu bằng 1 xâu
con khác
 Hàm biến đổi dữ liệu
 to_string : biến đổi từ số (nguyên hoặc thực) sang xâu
kí tự
 stoi : biến đổi từ xâu kí tự thành số nguyên int
 stof : biến đổi từ xâu kí tự thành số thực float
 Tham khảo thêm lớp string và các hàm trong thư
viện #include <string>
Các thao tác xử lý xâu kí tự hay sử
dụng trong lập trình mạng
 Tạo 1 xâu ký tự theo định dạng cho trước
 Sử dụng hàm sprintf
 Sử dụng đối tượng ostringstream
 Phân tích cú pháp xâu kí tự theo định dạng cho
trước
 Sử dụng hàm strtok
 Sử dụng istringstream
Xử lý xâu kí tự
 Tách hoặc ghép xâu
 Sử dụng hàm thành phần find()
Ví dụ
 Sau đó, nếu tìm thấy thì dùng hàm thành phần substr
if(p!=string::npos)
{
}
Bài tập 3
 Cho các câu lệnh của giao thức POP3 với cú pháp
như sau
 “USER tênrn”
 “PASS mật khẩu rn”
 “RETR số thứ tự email rn”
 “QUIT”
 Nhập tên, mật khẩu, số thứ tự email từ bàn phím
 Tạo các xâu kí tự chứa lệnh theo cú pháp ở trên
 In ra màn hình các xâu kí tự đó
Tham số
Bài tập 4
 Cho định dạng câu lệnh SMTP là:
“RCPT TO:<địa chỉ email>”
 A) Lập trình thực hiện công việc sau
 Nhập từ bàn phím 1 xâu ký tự biểu diễn câu lệnh trên
 Tách tên lệnh và địa chỉ email
◼ In ra tên lệnh nếu lệnh đúng tên
◼ In ra địa chỉ email nếu địa chỉ email đúng định dạng
<username>@huce.edu.vn
◼ In ra thông báo lỗi nếu tên lệnh sai hoặc địa chỉ email không
đúng cú pháp
 B) Lập trình
 Nhập từ bàn phím tên username
 Tạo một xâu kí tự chứa câu lệnh
“MAIL FROM:<username@huce.edu.vn>”
 In ra màn hình xâu đã tạo
Bài tập 5
 Cho một xâu kí tự chứa HTTP request như sau:
"GET / HTTP/1.1rnHost: ktht.nuce.edu.vnrnUser-
Agent: curl/7.79.1rnAccept: */*rnrn“
 Hãy lập trình để tách xâu kí tự thành các thành phần
sau
 Method, URL và version
 Tách các trường thông tin Header và giá trị tương ứng
 In ra màn hình các thành phần đó
5) Thao tác với file văn bản
 Sử dụng thư viện STDIO (chuẩn C)
 Mở tệp
 Đọc tệp
 Đọc theo dòng, lưu vào xâu char [] :
 Đọc tệp sử dụng cấu trúc lệnh vòng lặp while()
 Ghi tệp
 Ghi một xâu ký tự vào file:
Thao tác với file (chuẩn C++)
 Sử dụng thư viện FSTREAM
 Mở tệp
 Để đọc:
 Để ghi:
 Đọc tệp
 Đọc theo dòng, lưu vào xâu char [] :
◼ char buf[256];
 Đọc theo cả khối:
Ví dụ
 Ghi tệp
 Ghi 1 xâu / khối kí tự:
Ví dụ:
char header_from[] = “from: ktht@huce.edu.vnn”;
Bài tập 6
 Một chương trình Client muốn kết nối đến Server cần có các
thông số cấu hình sau: địa chỉ IP của Server, số cổng kết nối,
Username, Password và thư mục gốc
 Các thông số cấu hình trên được lưu trong file client.conf
theo định dạng mỗi thông số trên 1 dòng
 <tên thông số>=<giá trị thông số>
 Ví dụ file client.conf:
 IP=192.168.3.1
 port=110
 user=tuan
 pass=jk0012~
 root=C:box
 Yêu cầu: Hãy tạo 1 file client.conf và viết chương
trình đọc file đó để nhập vào các thông số cấu hình,
in các thông số đó ra màn hình
6) Lập trình hướng đối tượng với C++
 Cách khai báo lớp
 class ClassName
{
...
};
 Khai báo dữ liệu thành phần và hàm thành phần
 class ClassName
{
int dataMember;
int getDataMember();
…
};
Hàm tạo và hàm hủy
 Hàm tạo thực thi khi tạo đối tượng, hàm hủy thực
thi khi hủy đối tượng
 class ClassName
{
ClassName();
ClassName(int data);
~ClassName();
…
};
Triển khai hàm thành phần
 Triển khai hàm tạo và hàm hủy
ClassName::ClassName()
{
}
ClassName::ClassName(int data)
{
dataMember = data
}
ClassName::~ClassName()
{
}
 Triển khai hàm thành phần
 int ClassName::getDataMember()
{
return dataMember;
}
Thừa kế lớp
 class Base
{
…
};
 class Derive : public Base // Derive thừa kế Base
{
…
};
 Lớp con Derive sẽ kế thừa các thành phần thuộc phạm
vi public và protected của lớp cha Base
Đa hình
 Lớp con không kế thừa các hàm thành phần virtual
của lớp cha
 Lớp con có
 Khi gọi hàm thành phần virtual, tùy thuộc vào kiểu
lớp của đối tượng gọi hàm mà
Ví dụ
 class Base
{
virtual void sayHello(); // hàm virtual của Base
…
};
void Base::sayHello()
{
cout << “Hello, I am Base”;
}
Ví dụ
 class Derive : public Base
{
void sayHello(); // hàm virtual của Derive
…
};
void Derive::sayHello()
{
cout << “Hello, I am Derive”;
}
Ví dụ
 Gọi hàm virtual
Base base;
Derive derive;
Base& ref = derive;
ref.sayHello(); // hàm sayHello() của lớp Derive
Chương trình in ra : “Hello, I am Derive”
Bài 7
Một ứng dụng thi trực tuyến cần có tài khoản sinh viên
bao gồm những thông tin sau: mã sinh viên (string), họ tên,
trạng thái đăng nhập (true: đang đăng nhập, false: không
đăng nhập), địa chỉ IP của máy tính sinh viên (kiểu
unsigned long), thời gian đăng nhập (kiểu time_t), trạng
thái nộp bài( true: đã nộp bài, false: chưa nộp bài), thời
gian nộp bài(kiểu time_t).
 Hãy khai báo lớp SinhVien tương ứng với mô tả trên
với các dữ liệu thành phần tương ứng và các hàm
get/set trên từng dữ liệu thành phần
 Viết một hàm thành phần để nhập dữ liệu mã sinh viên
và họ tên cho 1 đối tượng kiểu lớp SinhVien từ tệp văn
bản. Dữ liệu của tài khoản sinh viên trong tệp như sau:
 123461<TAB>Hoang Phi Hung<CRLF>
Bài 8
 Hãy tổ chức 1 class có tên User, trong đó có thuộc tính là username
 Tạo 1 class có tên là FTPUser thừa kế lớp User. Lớp FTPUser sẽ có
thêm các thuộc tính như đường dẫn thư mục gốc root, password và
phân quyền truy nhập read, write
 Viết hàm tạo và các hàm thành phần get/set cho lớp FTPUser
 Ứng dụng FTP Server lưu thông tin tài khoản User trong 1 file có tên
ftpusers.conf
 Đọc dữ liệu của user từ file ftpusers.conf và lưu vào 1 vector có
phần tử là con trỏ User* (con trỏ được cấp phát động và thực sự
trỏ đến đối tượng lớp FTPUser)
Định dạng file User.conf
[user=tuan]
root=E:boxtuan
pass=jk0012~
read=yes
write=yes
[user=hung]
root=E:boxhung
pass=hs1342*
read=yes
write=no
[user=mai]
root=E:boxmai
pass=ws1001$
read=no
write=yes
ĐỌC THÊM
Nhận dạng xâu kí tự theo biểu thức
chính quy Regular Expression
 Biểu thức chính quy RegEx
 Là một dãy kí tự mô tả khuôn mẫu (quy tắc) để tạo ra
các xâu kí tự có định dạng nhất định
 Biểu thức chính quy được sử dụng để tìm kiếm hoặc đối
chiếu một xâu kí tự có phù hợp với một khuôn mẫu cho
trước hay không
 Biểu diễn biểu thức chính quy
 Sử dụng cú pháp và các kí tự đặc biệt gọi là
metacharacter để biểu diễn RegEx (tham khảo tài liệu)
 Sử dụng thư viện #include <regex> trong C++ để
tìm kiếm và tách xâu theo biểu thức chính quy (tham
khảo https://www.cplusplus.com/reference/regex/
Thao tác với bộ nhớ đệm
 Bộ nhớ đệm và tác dụng
 Khai báo bộ nhớ đệm
 Khai báo tĩnh sử dụng mảng char
char buffer[512];
 Khai báo động sử dụng con trỏ (cần giải phóng)
char* buffer = new char[512];
delete [] buffer;
Tiếp
 Duyệt bộ nhớ đệm sử dụng con trỏ
char buffer[512];
char* p = buffer; // con trỏ ở vị trí byte đầu tiên
p = p + i; // con trỏ ở vị trí byte i+1
// chú ý p không được vượt ra ngoài độ lớn buffer

6 - Lập trình C++ cơ bản_print.pdf

  • 1.
    LẬP TRÌNH C++CƠ BẢN Các nội dung lập trình C++ cơ bản (Đã học trong môn học NNTL C++)  1) Input/output màn hình và bàn phím  2) Lệnh cấu trúc điều khiển  3) Cấu trúc dữ liệu:  4) Xâu ký tự  5) Xử lý dữ liệu với tệp văn bản  Lập trình hướng đối tượng 1) Vào/ra dữ liệu với màn hình và bàn phím  Sử dụng các hàm thư viện chuẩn(standard) IOSTREAM của C++  Hàm in ra màn hình  Hàm đọc từ bàn phím 2) Lệnh cấu trúc điều khiển  Lệnh cấu trúc rẽ nhánh  Cấu trúc lặp
  • 2.
    Bài tập 1 Cho sai số epsilon = 1E-6. Tính gần đúng các giá trị sau Bài tập 2  Nhập 1 mã phản hồi của Server theo giao thức FTP  Lập trình in ra thông báo tương ứng với mã phản hồi  Các mã phản hồi  220 Command is successfully completed  331 User name okay, need password.  230 User logged in, proceed. Logged out if appropriate.  425 Can't open data connection.  502 Syntax error, command not implemented. 3) Cấu trúc dữ liệu struct  Định nghĩ cấu trúc dữ liệu phức hợp chứa các thành phần dữ liệu bên trong (trường dữ liệu) Cấu trúc mảng dữ liệu  Chứa nhiều phần tử dữ liệu cùng kiểu  Mảng dữ liệu tĩnh:  Mảng dữ liệu động:
  • 3.
    Con trỏ dữliệu (Pointer)  Là kiểu lưu trữ địa chỉ của dữ liệu trong bộ nhớ   Con trỏ đến dữ liệu nào thì tương ứng với kiểu dữ liệu đó 4) Xâu ký tự  Biểu diễn qua mảng ký tự char []  Có thể dùng con trỏ char* để thao tác với xâu Xâu ký tự  Các hàm xử lý xâu ký tự dạng char[] và char*  strcmp, stricmp, strncmp, strincmp: so sánh xâu  strchr, strstr: tìm kiếm kí tự, xâu con trong 1 xâu cho trước  strtok: tách xâu thành các từ  strcpy: copy xâu  strcat: ghép xâu  atoi, atof: chuyển xâu sang dạng số  Hàm tạo xâu theo định dạng  sprintf  Hàm biến đổi từ xâu sang số  atoi : từ xâu sang số nguyên  atof: từ xâu sang số thực  Tham khảo cách sử dụng các hàm trong thư viện #include <cstring>
  • 4.
    Xâu ký tựvới kiểu string (C++)  Biểu diễn xâu bằng kiểu dữ liệu class string của C++  string name = “Computer”;  Các hàm thành phần thao tác với kiểu string  find: tìm kiếm một xâu con trong 1 xâu cho trước  size: tính độ dài xâu  empty: kiểm tra xâu rỗng  substr: tách xâu con từ 1 xâu cho trước  compare: so sánh 2 xâu  copy: sao chép từ xâu cho trước sang 1 xâu mới  append: ghép 2 xâu thành 1  insert : chèn 1 xâu vào trong 1 xâu khác  replace: thay thế 1 xâu con trong 1 xâu bằng 1 xâu con khác  Hàm biến đổi dữ liệu  to_string : biến đổi từ số (nguyên hoặc thực) sang xâu kí tự  stoi : biến đổi từ xâu kí tự thành số nguyên int  stof : biến đổi từ xâu kí tự thành số thực float  Tham khảo thêm lớp string và các hàm trong thư viện #include <string> Các thao tác xử lý xâu kí tự hay sử dụng trong lập trình mạng  Tạo 1 xâu ký tự theo định dạng cho trước  Sử dụng hàm sprintf  Sử dụng đối tượng ostringstream  Phân tích cú pháp xâu kí tự theo định dạng cho trước  Sử dụng hàm strtok  Sử dụng istringstream Xử lý xâu kí tự  Tách hoặc ghép xâu  Sử dụng hàm thành phần find() Ví dụ  Sau đó, nếu tìm thấy thì dùng hàm thành phần substr if(p!=string::npos) { }
  • 5.
    Bài tập 3 Cho các câu lệnh của giao thức POP3 với cú pháp như sau  “USER tênrn”  “PASS mật khẩu rn”  “RETR số thứ tự email rn”  “QUIT”  Nhập tên, mật khẩu, số thứ tự email từ bàn phím  Tạo các xâu kí tự chứa lệnh theo cú pháp ở trên  In ra màn hình các xâu kí tự đó Tham số Bài tập 4  Cho định dạng câu lệnh SMTP là: “RCPT TO:<địa chỉ email>”  A) Lập trình thực hiện công việc sau  Nhập từ bàn phím 1 xâu ký tự biểu diễn câu lệnh trên  Tách tên lệnh và địa chỉ email ◼ In ra tên lệnh nếu lệnh đúng tên ◼ In ra địa chỉ email nếu địa chỉ email đúng định dạng <username>@huce.edu.vn ◼ In ra thông báo lỗi nếu tên lệnh sai hoặc địa chỉ email không đúng cú pháp  B) Lập trình  Nhập từ bàn phím tên username  Tạo một xâu kí tự chứa câu lệnh “MAIL FROM:<username@huce.edu.vn>”  In ra màn hình xâu đã tạo Bài tập 5  Cho một xâu kí tự chứa HTTP request như sau: "GET / HTTP/1.1rnHost: ktht.nuce.edu.vnrnUser- Agent: curl/7.79.1rnAccept: */*rnrn“  Hãy lập trình để tách xâu kí tự thành các thành phần sau  Method, URL và version  Tách các trường thông tin Header và giá trị tương ứng  In ra màn hình các thành phần đó
  • 6.
    5) Thao tácvới file văn bản  Sử dụng thư viện STDIO (chuẩn C)  Mở tệp  Đọc tệp  Đọc theo dòng, lưu vào xâu char [] :  Đọc tệp sử dụng cấu trúc lệnh vòng lặp while()  Ghi tệp  Ghi một xâu ký tự vào file: Thao tác với file (chuẩn C++)  Sử dụng thư viện FSTREAM  Mở tệp  Để đọc:  Để ghi:  Đọc tệp  Đọc theo dòng, lưu vào xâu char [] : ◼ char buf[256];  Đọc theo cả khối: Ví dụ  Ghi tệp  Ghi 1 xâu / khối kí tự: Ví dụ: char header_from[] = “from: ktht@huce.edu.vnn”;
  • 7.
    Bài tập 6 Một chương trình Client muốn kết nối đến Server cần có các thông số cấu hình sau: địa chỉ IP của Server, số cổng kết nối, Username, Password và thư mục gốc  Các thông số cấu hình trên được lưu trong file client.conf theo định dạng mỗi thông số trên 1 dòng  <tên thông số>=<giá trị thông số>  Ví dụ file client.conf:  IP=192.168.3.1  port=110  user=tuan  pass=jk0012~  root=C:box  Yêu cầu: Hãy tạo 1 file client.conf và viết chương trình đọc file đó để nhập vào các thông số cấu hình, in các thông số đó ra màn hình 6) Lập trình hướng đối tượng với C++  Cách khai báo lớp  class ClassName { ... };  Khai báo dữ liệu thành phần và hàm thành phần  class ClassName { int dataMember; int getDataMember(); … }; Hàm tạo và hàm hủy  Hàm tạo thực thi khi tạo đối tượng, hàm hủy thực thi khi hủy đối tượng  class ClassName { ClassName(); ClassName(int data); ~ClassName(); … };
  • 8.
    Triển khai hàmthành phần  Triển khai hàm tạo và hàm hủy ClassName::ClassName() { } ClassName::ClassName(int data) { dataMember = data } ClassName::~ClassName() { }  Triển khai hàm thành phần  int ClassName::getDataMember() { return dataMember; } Thừa kế lớp  class Base { … };  class Derive : public Base // Derive thừa kế Base { … };  Lớp con Derive sẽ kế thừa các thành phần thuộc phạm vi public và protected của lớp cha Base Đa hình  Lớp con không kế thừa các hàm thành phần virtual của lớp cha  Lớp con có  Khi gọi hàm thành phần virtual, tùy thuộc vào kiểu lớp của đối tượng gọi hàm mà
  • 9.
    Ví dụ  classBase { virtual void sayHello(); // hàm virtual của Base … }; void Base::sayHello() { cout << “Hello, I am Base”; } Ví dụ  class Derive : public Base { void sayHello(); // hàm virtual của Derive … }; void Derive::sayHello() { cout << “Hello, I am Derive”; } Ví dụ  Gọi hàm virtual Base base; Derive derive; Base& ref = derive; ref.sayHello(); // hàm sayHello() của lớp Derive Chương trình in ra : “Hello, I am Derive” Bài 7 Một ứng dụng thi trực tuyến cần có tài khoản sinh viên bao gồm những thông tin sau: mã sinh viên (string), họ tên, trạng thái đăng nhập (true: đang đăng nhập, false: không đăng nhập), địa chỉ IP của máy tính sinh viên (kiểu unsigned long), thời gian đăng nhập (kiểu time_t), trạng thái nộp bài( true: đã nộp bài, false: chưa nộp bài), thời gian nộp bài(kiểu time_t).  Hãy khai báo lớp SinhVien tương ứng với mô tả trên với các dữ liệu thành phần tương ứng và các hàm get/set trên từng dữ liệu thành phần  Viết một hàm thành phần để nhập dữ liệu mã sinh viên và họ tên cho 1 đối tượng kiểu lớp SinhVien từ tệp văn bản. Dữ liệu của tài khoản sinh viên trong tệp như sau:  123461<TAB>Hoang Phi Hung<CRLF>
  • 10.
    Bài 8  Hãytổ chức 1 class có tên User, trong đó có thuộc tính là username  Tạo 1 class có tên là FTPUser thừa kế lớp User. Lớp FTPUser sẽ có thêm các thuộc tính như đường dẫn thư mục gốc root, password và phân quyền truy nhập read, write  Viết hàm tạo và các hàm thành phần get/set cho lớp FTPUser  Ứng dụng FTP Server lưu thông tin tài khoản User trong 1 file có tên ftpusers.conf  Đọc dữ liệu của user từ file ftpusers.conf và lưu vào 1 vector có phần tử là con trỏ User* (con trỏ được cấp phát động và thực sự trỏ đến đối tượng lớp FTPUser) Định dạng file User.conf [user=tuan] root=E:boxtuan pass=jk0012~ read=yes write=yes [user=hung] root=E:boxhung pass=hs1342* read=yes write=no [user=mai] root=E:boxmai pass=ws1001$ read=no write=yes ĐỌC THÊM Nhận dạng xâu kí tự theo biểu thức chính quy Regular Expression  Biểu thức chính quy RegEx  Là một dãy kí tự mô tả khuôn mẫu (quy tắc) để tạo ra các xâu kí tự có định dạng nhất định  Biểu thức chính quy được sử dụng để tìm kiếm hoặc đối chiếu một xâu kí tự có phù hợp với một khuôn mẫu cho trước hay không  Biểu diễn biểu thức chính quy  Sử dụng cú pháp và các kí tự đặc biệt gọi là metacharacter để biểu diễn RegEx (tham khảo tài liệu)
  • 11.
     Sử dụngthư viện #include <regex> trong C++ để tìm kiếm và tách xâu theo biểu thức chính quy (tham khảo https://www.cplusplus.com/reference/regex/ Thao tác với bộ nhớ đệm  Bộ nhớ đệm và tác dụng  Khai báo bộ nhớ đệm  Khai báo tĩnh sử dụng mảng char char buffer[512];  Khai báo động sử dụng con trỏ (cần giải phóng) char* buffer = new char[512]; delete [] buffer; Tiếp  Duyệt bộ nhớ đệm sử dụng con trỏ char buffer[512]; char* p = buffer; // con trỏ ở vị trí byte đầu tiên p = p + i; // con trỏ ở vị trí byte i+1 // chú ý p không được vượt ra ngoài độ lớn buffer