Ch
ng 4
L p trình ng d ng trong k thu t ậ ụ
ứ
ậ
ỹ
ươ
NG 4 : C++/CLI NÂNG CAO.
TÓM T T CH Ắ
ƯƠ
1) Th vi n (Library): ư ệ
ọ ậ ư ệ ể ỉ ữ
ầ ể
ộ ươ ế ượ
ẵ c vi ng trình con (sobroutine), các class, các bi n hay h ng s đã đ ươ c xây d ng s n. ự ng trình đã đ ượ ế ẵ ằ ạ ể ả ộ
ự
ượ
ế ng trình. Theo khoa h c máy tính, th vi n là m t thu t ng dùng đ ch các tài nguyên (resources) dùng ng trình (program). Các tài nguyên này có th là các đ phát tri n ph n m m (software) hay ch ể ể ề Nói m t cách ch ộ ươ ố ạ t s n. Trong đo n đ n gi n, chúng ta có th xem ch ng trình là m t đo n ch ơ ươ ộ ng trình đó đã khai báo và xây d ng các bi n, h ng s , các hàm và các class. Khi xây d ng m t ch ằ ươ ố ế ự i các bi n, h ng s , hàm hay class đã đ ch ự c xây d ng ng trình m i, chúng ta có th s d ng l ố ằ ạ ươ ể ử ụ trong th vi n b ng cách g i th vi n trong ch ươ ư ệ ư ệ ớ ằ ọ
ườ ậ ặ ậ
ạ ư ệ ng trình. Trong C++/CLI, chúng ta th đuôi .lib hay .dll. Tr ể ướ hi u v quá trình d ch (compile) và th c thi (execute) m t ch ị ng g p các th vi n có d ng là cái t p tin có đuôi .h, t p tin c khi tìm hi u v s khác nhau gi a các th vi n .h, .lib và .dll, chúng ta hãy tìm ề ự ươ ự ư ệ ữ ộ ể ề
Hình trên mô t quá trình d ch và th c thi m t ch ng trình trong C++/CLI. ả ự ộ ị ươ
ị ệ ượ là quá trình chuy n các câu l nh đ ể ộ
ữ
ữ ậ ữ ấ ữ ự ế ồ
ị ủ ẫ ở
ị
Biên d ch (Compile) nào đó sang ngôn ng máy có th đ c g i là ch c chuy n đ i đ đ ượ ổ ượ ọ ể c g i là ch c t o ra đ đ ươ ượ ọ ượ ạ i dùng mu n ch y ch ng ạ ươ ố ườ và các ch th c a ch ươ ị ủ ỉ trình, CPU s truy xu t d li u và t o ra các k t qu . ấ ữ ệ ẽ file l p trình (file .cpp) sang file đ i t chuy n t t b ng m t ngôn ng l p trình c vi ế ằ ng trình ngôn ng c p cao Ch c thi hành tr c ti p trên máy tính. ươ ng trình ngôn ng máy ng trình ngu n (source program) và ch ươ ng (object program) ho c mã đ i t ng (object code). Khi ố ượ ặ c n p lên b nh chính c a CPU ng s đ ủ ớ ộ ẽ ượ ạ ố ượ ươ ng ng d n b i các ch th c a ch c h ỉ ướ ượ ả C th , trong C++/CLI, biên d ch là quá trình ụ ể ng (file .obj). ể ượ ươ ng trình đ i t ố ượ ng trình, ch ng trình đ i t ươ ng trình s đ c thi hành. Khi đ ẽ ượ ế ạ ố ượ ể ừ ậ
Sau khi biên d ch m t ch ng trình, s có r t nhi u các file .obj đ ộ ẽ ề ấ
ng trình còn s d ng các th vi n có s n. Do đó, c n ph i k t h p t ầ ị ử ụ ươ ư ệ ượ ạ t c l ả ế ợ ấ ả ạ c t o ra. Ngoài ra, trong ự i thành m t file th c ộ ươ
ch thi duy nh t, quá trình này đ c g i là liên k t (linker). ấ ượ ọ ẵ ế
B môn C đi n t
ơ ệ ử
ộ
Trang 1
Ch
ng 4
L p trình ng d ng trong k thu t ậ ụ
ứ
ậ
ỹ
ươ
Liên k t (Linker) c t o ra t ng đ ế là quá trình k t h p các file đ i t ế ợ ượ ạ ố ượ ừ
ư ệ ị ế ự ể ế ẵ ấ ộ
quá trình biên d ch và các th vi n có s n thành m t file th c thi duy nh t (file. Exe). Có hai ki u liên k t là liên k t tĩnh (static linker) và liên k t đ ng (dynamic linker). ế ộ
c d ch thành file .obj. Sau đó các file.obj đ Các file .h, .cpp đ ượ ượ ị
Liên k t tĩnh : ế ế ớ ư ệ ư
ạ ể c đi m là file .exe có kích th ế ớ c liên k t v i nhau và liên k t v i các file th vi n .lib. Cách này có u đi m là khi ch y ch c n file .exe mà không c n thêm th vi n nào khác. Tuy nhiên có nh ể ầ ỉ ầ c l n, n ng. ướ ớ ư ệ ượ ặ
ng t ế ộ ự ế ỉ
Liên k t đ ng : ả ứ ừ
ng trình s t ự Cũng t ư ươ . Các thông tin th t đ ẽ ự ộ hi liên k t, các file .lib ch là trung các file .dll trong quá trình th c thi. Đo đó, khi ự ự đ ng liên k t đ n các file .dll. N u thi u các file .dll này thì quá trình th c nh liên k t tĩnh. Tuy nhiên k ế c l y ra t ậ ượ ấ ế ế ế ế
gian ch a thông tin gi th c thi, ch ươ i. thi s b l ẽ ị ỗ
Các file .lib và .dll là hai lo i th vi n th ườ ạ ế ộ ng g p nh t trong C++/CLI : th vi n liên k t đ ng ư ệ ặ
ấ (dynamic linking library), th vi n liên k t tĩnh (static library). ư ệ ư ệ ế
2) Header file và source file :
ng tr ươ ướ ươ ề ậ ụ
ng trình nh ồ Trong các ví d đã đ c p trong các ch ỉ ứ ố ớ c, ch ỉ
ữ ứ ạ ớ
ỗ ứ ạ ệ ụ ấ ị ứ ụ ươ ệ
ể ượ ệ ằ ữ ữ ề
ấ ư ệ ỏ ỏ ỏ ự ấ ỗ ộ
ng riêng (file .obj), sau đó các file này s ộ ị ộ
ụ d ng ch bao g m m t file duy nh t. Tuy nhiên, cách này ch thích h p đ i v i các ch ộ ấ ự không ph c t p. Đ i v i nh ng ch ố ớ ươ nh , m i thành ph n th c hi n m t nhi m v nh t đ nh. Vi c chia ch ầ ộ nh có th đ ự nh , m i nhóm này đ ượ khi biên d ch, m i file đ ị c liên k t l đ ượ ng trình ng d ng mà chúng ta xây ỏ ươ ợ ng trình ng d ng l n, ph c t p, nên chia thành nhi u thành ph n ầ ề ầ ng trình thành nh ng ph n ự c th c hi n b ng nhi u cách; cách thông d ng nh t là chia mã code thành nh ng nhóm ụ ệ c g i là m t th vi n (library). M i th vi n này th c ch t là m t file riêng; ỗ ư ệ ọ c biên d ch thành m t file đ i t ẽ ố ượ ượ ự ỗ i trong quá trình liên k t thành m t file th c thi duy nh t (file .exe). ộ ế ạ ế ấ
ệ ư ệ Vi c khai báo các th vi n này còn có m t u đi m n a là n u nh ta xây d ng m t ch ộ ư ữ ư ự ế ộ
ụ ữ ế
ể ử ụ ứ ượ ữ
ớ c xây d ng trong m t th vi n c a ch ươ ộ i b ng cách s d ng l ể ử ụ ướ i th vi n này. trình ng d ng khác và trong ch đã đ ự này mà không c n ph i xây d ng l ầ ươ ư ệ ủ ạ ằ ươ ng ng trình m i này có s d ng nh ng tài nguyên (hàm, bi n hay class) c, ta có th s d ng lai nh ng tài nguyên ư ệ ng trình tr ạ ử ụ ự ả
H u h t các th vi n th ng đ c tách thành hai d ng file : header file và source file. ư ệ ế ầ ườ ượ ạ
a) Header file :
ng tr ươ ươ ướ
ng t t là header file th ng đ ậ ượ ư ể ớ
ể c. Đi m c l u v i đuôi .h thay vì .cpp. Chúng ta có th dùng notepad đ xây ể c đây (nh ng l u file v i đuôi .h), nh các file l p trình mà chúng ta đã làm quen trong các ch ự ư ườ ư ướ ự ư ư ớ
Header file cũng t khác bi ệ d ng header file gi ng nh cách chúng ta xây d ng các file .cpp tr ố ự ho c xây d ng tr c ti p trong 1 project. ự ế ặ ự
ộ ể ạ ủ ả ộ
ố ử ụ ườ ọ ợ ộ
Đ t o m t header file trong 1 project, trong c a s Solution Explorer c a project, click chu t ph i vào ử ổ dòng Header Files và ch n Add ->New Item (trong tr ẵ ng h p mu n s d ng m t header file đã có s n thì ch n Existing Item). ọ
B môn C đi n t
ơ ệ ử
ộ
Trang 2
Ch
ng 4
L p trình ng d ng trong k thu t ậ ụ
ứ
ậ
ỹ
ươ
Trong c a s Add New Item, ch n ki u file là header và nh p tên c a file vào ô Name. ử ổ ủ ể ậ ọ
ườ ư ệ ẽ ồ ộ
ủ ủ ứ ệ ế ầ
ộ ề ế c khai báo trong header file. ỉ ứ Thông th ng, m t th vi n s bao g m m t header file và source file. Trong đó, header file ch ch a các khai báo v bi n, hàm hay class còn source file ch a mã l nh đ y đ c a các bi n, hàm và class đã đ ượ
Header file + Source file = Complete source
VD : //Sinh_vien.h
using namespace System; int x,y,z; String^ A,B,C;
B môn C đi n t
ơ ệ ử
ộ
Trang 3
Ch
ng 4
L p trình ng d ng trong k thu t ậ ụ
ứ
ậ
ỹ
ươ
Print(String^ A);
void UInt32 Fractorial (UInt16 a); ref class Sinh_vien { public:
String^ Ho_ten; UInt32 MSSV; String^ Nganh_hoc;
void Show();
};
Trong ví d trên, trong header file đã khai báo các bi n x,y,z và A,B,C cùng các hàm Print() , ụ ế Fractorial() và class Sinh_vien. Chú ý là đây ch là các khai báo v bi n, hàm và class. ề ế ỉ
b) Source file :
ế ư ẽ ứ ứ ự ệ
N u nh header file ch a các khai báo thì source file s ch a mã l nh th c thi các khai báo. Source file có đuôi .cpp.
ộ ể ạ ủ ả ộ
ố ử ụ ườ ọ ợ ộ
Đ t o m t source file trong 1 project, trong c a s Solution Explorer c a project, click chu t ph i vào ử ổ dòng Source Files và ch n Add ->New Item (trong tr ẵ ng h p mu n s d ng m t source file đã có s n thì ch n Existing Item). ọ
Trong c a s Add New Item, ch n ki u file là C++ File và nh p tên c a file vào ô Name. ử ổ ủ ể ậ ọ
B môn C đi n t
ơ ệ ử
ộ
Trang 4
Ch
ng 4
L p trình ng d ng trong k thu t ậ ụ
ứ
ậ
ỹ
ươ
Trong source file ta s xây d ng các hàm đã khai báo trong header file. ự ẽ
VD : //Sinh_vien.cpp
#include “Sinh_vien.h” using namespace System; x = 10; y = 20; z = 8111; A = “Nguyen Van A”; B = “Co dien tu”; C = “SPKT”;
Print(String^ A)
void {
Console::WriteLine(A);
}
UInt32 Fractorial (UInt16 a) {
if (a > 1) else
return (a*Factorial(a-1)); return 1;
}
Sinh_vien::Show()
void {
Console::WriteLine(Ho_ten); Console::WriteLine(MSSV); Console::WriteLine(Nganh_hoc);
}
B môn C đi n t
ơ ệ ử
ộ
Trang 5
Ch
ng 4
L p trình ng d ng trong k thu t ậ ụ
ứ
ậ
ỹ
ươ
#include
ng trình có thêm dòng l nh ệ Trong ví d trên, vi c xây d ng các bi n và hàm cũng không khác so v i cách chúng ta đã th c ự ươ ớ ệ ướ ớ ụ ệ ự c. Hai đi m m i là ng tr ể ươ ị ề ử và khi t o ph c g i là ch th ti n x lí) ượ ọ ế đ u ch ở ầ ạ ươ ứ ủ ng th c ng th c Show() c a class Sinh_vien chúng ứ void Sinh_vien::Show() (khác so v i cách khai báo thông ớ ỉ ả ươ ả hi n qua các ch “Sinh_vien.h” (đ ta c n ph i khai báo class qu n lí ph th ng trong class là void Show()). ầ ườ
ế ể
ỉ ử ng trình ng d ng thì không nên khai báo hàm Trong header file và source file có th khai báo hàm main(). Tuy nhiên, n u chúng ta ch s ươ ư ệ ứ ụ
L u ý : ư d ng header file và source file làm th vi n cho ch ụ main().
ư ệ ng trình ng d ng, chúng ta mu n s d ng m t th vi n nào đó, ta có th g i th vi n ố ử ụ ư ệ ể ọ ụ ộ ế ươ
ứ ị ề ử ỉ
N u trong ch đó ra thông qua các ch th ti n x lí. VD : //Program.cpp
#include “Sinh_vien.h” #include “window.h”
3) Ch thi ti n x lí (Preprocessor Directive) : ề ử ỉ
Tr c khi biên d ch ch ng trình sang mã đ i t ướ ề ầ
ề ị ệ ử ạ ằ
c khai báo ộ ị ị ề ươ ượ ử ỉ
ng, c n có m t quá trình ti n x lí. Quá trình ố ượ ti n x lí có th là các l nh đ nh nghĩa các h ng s , ngăn trình biên d ch biên d ch 1 đo n mã nào đó, ể ử ị ố ở ầ đ u ng trình .v.v… Các ch th ti n x lí đ xác đ nh các th vi n liên k t v i ch ư ệ ị ng trình và b t đ u v i d u ch ắ ầ ươ ị ế ớ ớ ấ #. ươ
ấ ỉ ề ậ ử ế ề ạ ạ ỉ
ị ề include và using. ng dùng là Có r t nhi u các lo i ch th ti n x lí, tuy nhiên chúng ta ch đ c p đ n hai lo i khai báo ti n ề ườ x lí th ử
a) Include Directive :
ị ụ ươ ườ ạ ộ
ng trình. Thông th ị ặ ỉ
ỉ ạ <> và “”. Hai cách khai báo này ch khác nhau v th t ế
ng là chèn các Ch th Include có tác d ng chèn m t đo n mã vào mã code ch đo n mã khai báo trong header file và source file. Có hai cách khai báo ch th Include : s d ng c p kí ử ụ t tìm ki m các header file khi chúng ta không ự khai báo đ ề ứ ự ng d n c th v v trí l u tr c a header file. ẫ ụ ể ề ị ữ ủ ỉ ư ườ
VD : //Program.cpp
// Có khai báo đ ườ // Không khai báo đ
ẫ ng d n.
ng d n. ườ
ẫ
#include
#include “Sinh_vien.h”
#include
b) Using Directive :
nh Include. ng t ươ ụ ạ ộ
Ch th Using cũng có tác d ng chèn m t đo n mã vào mã code ch ị Đi m khác bi t là Include thì dùng v i các file header .h còn using s d ng v i các file th vi n .dll. ng trình t ớ ự ư ư ệ ươ ử ụ ỉ ể ệ ớ
VD : //Program.cpp
// Có khai báo đ ườ // Không khai báo đ
ẫ ng d n.
ng d n. ườ
ẫ
#using
#using “Sinh_vien.dll”
#iusing
B môn C đi n t
ơ ệ ử
ộ
Trang 6
Ch
ng 4
L p trình ng d ng trong k thu t ậ ụ
ứ
ậ
ỹ
ươ
ng d n c th cho các file .h và .dll, ta ph i đ t các file này trong cùng th ườ ả ặ ư
ng trình hay n m trong th m c include đã khai báo. L u ý : ư m c v i file ch ụ ớ Khi không báo đ ươ ẫ ụ ể ằ ư ụ
4) X lý ngo i l (Exception) : ạ ệ ử
ố ỗ ố
ữ ị ầ ữ ố ố ề
ng trình b thoát. Tuy nhiên, trong th c t ng trình luôn luôn g p ph i nh ng tình hu ng, nh ng l ữ ệ ượ ử ị
ặ ả c ng b đ y, truy n đ i s cho hàm không h p l … Nh ng l , ợ ệ ổ ứ c x lý s khi n ch ươ ẽ ộ ợ ệ có nh ng ch ữ ự ế ể ộ ; do đó c n có m t c ch đ có th kh c ph c đ ư : ng i không mong mu n nh ữ ỗ ươ ụ ượ ắ ọ
ộ ơ ỗ ử ố
i dùng ườ ế i này n u ng trình quan ỗ c nh ng l i ế ể ữ t code, ề ế i và sau m i l n g i hàm đ u ph i có ả ọ ỗ i truy n th ng là trong quá trình vi ề ỗ ầ ệ
ạ ế ả i khi n cho ch Ch ươ nh p d li u không h p l ậ không đ ế tr ng không cho phép d ng đ t ng t ừ phát sinh trong quá trình ch y ch ươ i l p trình luôn ph i vi ng ườ ậ l nh ki m tra l ỗ ể ệ ầ ng trình. Cách x lý l t thêm 1 l nh tr v đ thông báo l ả ề ể ng trình ph c t p và dài. ứ ạ ươ ế
i quy t đ ấ ộ ỗ ế ượ
ấ i trong đó tách riêng ph n x lý l i có th gi ể ả ử c các v n đ v a k trên thông qua ỏ i ra kh i ề ử ể ử ầ ỗ ỗ
: C++/CLI đã cung c p m t cách th c x lí l Exception. Exception là m t c ch thông báo và x lý l ộ ơ ph n thu t toán chính. Các thu t ng liên quan ậ ứ ử ế ữ ầ ậ
ng ch a thông tin v m t l i và đ là m t đ i t ề ộ ỗ ứ ượ c dùng đ truy n thông tin đó ề ể ộ ố ượ
t • M t ngo i l ộ ạ ệ i c p th c thi cao h n ơ ự ớ ấ
ng c nh th c thi hi n hành t i m c th c thi cao h n g i là ném t ữ ả ự ệ ớ ứ ự ơ ọ ạ ệ ừ
ề (throw an exception) m t ngo i l • Quá trình truy n ngo i l ạ ệ ộ
, nó đ • Khi m t ng c nh th c thi ti p nh n và truy nh p m t ngo i l ế ữ ả ạ ệ ự ậ ậ ộ ộ ượ c coi là b t ngo i l ắ ạ ệ
(catch the exception)
B t và x lý ngo i l ử : ạ ệ ắ
i phát sinh trong quá trình ch y ch ng trình, chúng ta dùng c u trúc ể ắ ộ ỗ ử ạ ươ ấ
Đ b t và x lý m t l try{} … catch(){}
try
{
//Ch a đo n code có kh năng phát sinh ra l i. ứ ạ ả ỗ
}
catch (
{
//Code x lý l i. ử ỗ
}
catch (
{
//Code x lý l i. ử ỗ
}
try : ch a đo n l nh mà ng i l p trình cho r ng có th phát sinh l i trong qua trình ch ạ ệ ứ ườ ậ ể ằ ỗ ươ ng
trình th c thi. ự
B môn C đi n t
ơ ệ ử
ộ
Trang 7
Ch
ng 4
L p trình ng d ng trong k thu t ậ ụ
ứ
ậ
ỹ
ươ
ỗ ỗ
i phát sinh tùy theo ki u l ể ỗ i s có m t cách khai báo khác nhau. Trong tr ứ ể ỗ ử ệ ử ể ỗ ẽ i khi có l ộ
t ki u l i phát sinh thu c d ng nào, chúng ta có th dùng cách khai báo chung ể
ể ề
ư i khác nhau. catch: ch a đo n mã l nh x lý l ạ i x lý, m i ki u l cho bi ỗ ki u l ộ ạ M t c u trúc b t và x lý l ử ch a m t đo n l nh x lý l ử i. Tham s c a catch ố ủ ế t ng h p không bi ợ ườ (Exception^ e) ho c (…). ặ ố try nh ng có th có nhi u kh i catch; m i kh i ố catch ỗ ố ạ ỗ i ch có m t kh i ỗ ộ ỉ i đ i v i t ng lo i l ỗ ố ớ ừ ế ể ỗ ộ ấ ứ ắ ạ ệ ộ
ủ ạ ệ ươ ử ầ
ự ỏ
ng h p có phát sinh l ườ ự ợ
ỗ ươ i, ch ố try và ti n hành th c thi các đo n l nh ch a trong kh i ng trình th c thi các đo n l nh ch a i: ban đ u ch ứ ự ạ ệ ng trình b qua kh i catch và th c hi n các đo n l nh ệ i dòng l nh phát ệ ạ ươ ố catch, sau đó s th c thi ẽ ự ẽ ừ ứ ự ế ỗ
ng trình x lý l Ho t đ ng c a ch ươ ạ ộ trong kh i ố try; n u không có l i phát sinh, ch ỗ ế ti p theo. Trong tr ế ỗ i trong kh i sinh l ti p các đo n l nh ti p theo n m ngoài kh i x lý l ạ ệ ế ố ng trình s d ng th c thi ngay t ạ ệ i. ỗ ố ử ế ằ
i ph ươ ố ủ ế
ậ ố ậ
ng trình gi ng h p ng ợ t) thì ch ươ ng trình trong đó các thông s c a ph ng i dùng nh p sai đ nh d ng (thay vì nh p s thì ạ i này và x lý b ng cách yêu ng trình s b t l ả ườ ươ ậ ị ẽ ắ ỗ ử ệ ằ ả ử ườ ộ ặ
i các thông s này. ươ ườ đ c bi ự ặ ố
Gi s chúng ta vi t 1 đo n ch ạ trình do ng i dùng nh p vào. Trong tr l i nh p m t kí t ch cái ho c kí t ậ ạ ự ữ c u ng i dùng nh p l ườ ậ ạ ầ //Exception.cpp VD : #include “stdafx.h” using namespace System;
void main() {
X:
float a,b,x; try {
Console::Write (“Nhap thong so a = ”); a = Convert::ToSingle(Console::ReadLine()); Console::Write (“Nhap thong so b = ”); b = Convert::ToSingle(Console::ReadLine()); x = -b/a;
} catch (Exception^ e) // Khong biet loi la loai gi, cung co the dung cach khai bao catch(…) {
Console::WriteLine (“Ban da nhap sai dinh dang, xin vui lòng nhap lai ”); goto X;
} Console::WriteLine(“Nghiem cua phuong trinh la ” + x);
}
ng trình s ch y l i, ch ư ẽ ạ ạ ạ ệ ườ ỗ ố try nhi u l n. Do đó ề ầ
L u ý : ta không đ ươ c đ a các đo n l nh khai báo bi n vào trong kh i Thông th ượ ư ng n u có l ế ạ ệ i đo n l nh trong kh i ố try. ế
Class Exception:
ự ng trình x lý l Đây là Class qu n lý các ki u l ể ỗ ả ị ươ ẽ ử ể ế
ươ i đây trình bày m t s ki u s ng trình s xác đ nh ki u l ấ ề i phát sinh trong quá trình ch ươ i và chuy n đ n đo n ch ạ i khác nhau, hình d ướ ng trình th c thi. M i khi có m t ộ ư ng ng ố ỗ i t ỗ ươ ộ ố ể ể ỗ
l ể ỗ ỗ nh Class Exception này. Có r t nhi u ki u l th i phát sinh, ch ờ ườ ng g p. ặ
B môn C đi n t
ơ ệ ử
ộ
Trang 8
Ch
ng 4
L p trình ng d ng trong k thu t ậ ụ
ứ
ậ
ỹ
ươ
Các ki u l i th ể ỗ ườ ng g p: ặ
- Argument Exception: l i do truy n tham s không đúng cho hàm. ỗ ề ố
- ArithmeticException: l i khi tính toán (chia cho 0, tràn s ). ỗ ố
- DataExceptions: l i khi t ng tác v i d li u. ỗ ươ ớ ữ ệ
ng h p chúng ta bi ườ ồ t t ế ừ khóa đ nh nghĩa ị
Trong tr ư ế i, chúng ta có th ki m tra thông qua 1 đo n l nh đ n gi n sau. t ngu n g c phát sinh l ố ạ ệ i nh ng không bi ỗ ả ợ ể ể ơ ể ỗ
ki u l VD :