• Con tr ỏ và mảng– Con trỏlà 1 mảng ñộng => kích thước có thểthayñổi.. – Mảng nhưlà 1 con trỏnhưng ñộlớn vùng nhớ cố ñịnh.. Cách sử dụng mảng và con trỏgần như giống nhau 25 Cấp vùng nh
Trang 1CÁC ðẶ C ð I Ể M C Ủ A C++
CÁC ðẶ C ð I Ể M C Ủ A C++
Ch ươ ng 2
1
• Các khái ni ệ m c ơ b ả n c ủ a C++
• L ậ p trình c ấ u trúc trong C++
• Các ñặ c ñ i ể m m ớ i c ủ a C++
• Các khái ni ệ m c ơ b ả n trong C++
• C ấ u trúc ñ i ề u khi ể n
• Hàm và c ấ u trúc ch ươ ng trình
• Con tr ỏ và chu ỗ i ký t ự
• Tham s ố m ặ c nhiên c ủ a hàm
• Tham s ố m ặ c nhiên c ủ a hàm
• Tái ñị nh ngh ĩ a hàm
• Hàm t ạ i ch ổ (inline)
• Truy ề n tham s ố
• Tham chi ế u
• Struct
2
Các
Các khái khái niệm niệm cơ cơ bản bản
• T ừ khóa
– Dành riêng cho ngôn ngữkhông ñược ñặt tên
trùng với từkhóa
– Là chữthường
Vd : char, int, return, for, else, const,
static
• Tên
– Phân biệt chữHOAvà chữth ườ ng
– Gồmchữ, số, ‘_’ và phải bắtñầu bằng chữcái
– ðộdài tối ña là 32
– Nên theo quy cáchñặt tên
Vd: x, hoten, a1, num_of_var, Delta, TEN,
Các khái niệm cơ bản Các khái niệm cơ bản
• Ki ể u d ữ li ệ u
Tên Tên ki ki ể ể u u Kích Kích th th ướ ướ c c Ph Ph ạ ạ m m vi vi
char 1 byte -128 127 unsigned char 1 byte 0 255 int 2 bytes -32768 32767 unsigned int 2 bytes 0 65535 short 2 bytes 0 65535 long 4 bytes -231 231 - 1 unsigned long 4 bytes 0 232 - 1 float 4 bytes 1.2e-38 3.4e38 double 8 bytes 2.2e-308 1.8e308
Trang 2Các khái niệm cơ bản
Các khái niệm cơ bản
• Bi ế n
– Khai báo: b ấ t k ỳ v ị trí nào trong ch ươ ng trình
– Kh ở i t ạ o: có th ể v ừ a khai báo và kh ở i t ạ o
for( int i=0, tong =0 ; i<10 ; i++) for( int i=0, tong =0 ; i<10 ; i++) tong +=i ;
– Bi ế n khai báo trong 1 kh ố i l ệ nh: ch ỉ có ph ạ m vi
ho ạ t ñộ ng trong kh ố i l ệ nh ñ ó.
Vd: if( delta >0 ) {
float x1= (-b + sqrt(delta)) / (2*a);
float x2= (-b - sqrt(delta)) / (2*a);
}
5
Các khái niệm cơ bản Các khái niệm cơ bản
• Bi ế n
– Bi ế n toàn c ụ c: có tác d ụ ng trong toàn b ộ CT – Bi ế n ñị a ph ươ ng (c ụ c b ộ ): ch ỉ có tác d ụ ng trong
ph ạ m vi c ủ a nó.
Vd: int so = 5;
so = x;
}
return so;
}
6
Các khái niệm cơ bản
Các khái niệm cơ bản
• H ằ ng
– Khai báo: Vd: #define MAX 100
– Một số hằng quan trọng :
• Sốnguyên: 10 , -5, 300000, 1000L,
• Sốnguyên: 10 , -5, 300000, 1000L,
• Sốthực : 3.1416, .5 , 123E-5,
• Ký tự: char ch1 = ‘A’ , ch2=97;
• Chuỗi ký tự:
char *str=“Chuoi Ky Tu”;
char chuoi[50]; strcpy(chuoi,“ ”);
if ( strcmp(chuoi,“”) ==0)
cout << “Chuoi rong”;
7
Các khái niệm cơ bản Các khái niệm cơ bản
• Ki ể u: Chuyể n ñổ i ki ể u :
– M ặ c nhiên (t ự ñộ ng) :
float x = 3.1416;
– Do ng ườ i l ậ p trình s ử d ụ ng : – Do ng ườ i l ậ p trình s ử d ụ ng :
Cú pháp: ( ( Ki Ki ể ể u u ) ) bi bi ể ể u u th th ứ ứ c c
hoặc Ki Ki ể ể u u ( ( bi bi ể ể u u th th ứ ứ c c ) )
float c1 = a / b ; float c2 = float (a/b);
float c3 = (float) a / b ;
Trang 3• Các phép toán
– S ố h ọ c: + , - , * , / , %
– Lu ậ n lý: ==, !=, >, <, >=, <=, &&, ||, !
– L ấ y kích th ướ c:
– L ấ y kích th ướ c: sizeof ( ñố i t ượ ng d ữ li ệ u )
– ð i ề u ki ệ n : e1 ? e2 : e3
– L ấ y ñị a ch ỉ : &(bi ế n)
tong+= i ; tich *= i;
/= , %= , -= , &= , |= , ^=
9
– Khai báo: < <Ki Ki ể ể u u> < > <Tên Tên m m ả ả ng ng> [< > [<Kích Kích th th ướ ướ c c>]; >];
– Th ứ t ự ph ầ n t ử : t ừ 0 ñế n (kích th ướ c -1)
Vd:
//CT tính t ổ ng c ủ a 10 s ố Fibonacci ñầ u tiên
long a[10]; a[0] = a[1] = 1;
for (int i = 2; i < 10 ; i++) a[i] = a[i-1] + a[i-2];
long tong = 0;
for(i=0 ; i<10 ; i++)
Các khái niệm cơ bản
Các khái niệm cơ bản
• Chú thích
– Trên nhi ề u dòng: /*
chú thích trên nhi ề u dòng
*/
• Các ch ỉ th ị ti ề n biên d ị ch:
#error
Các khái niệm cơ bản Các khái niệm cơ bản
• Nh ậ p xu ấ t
– Thưviện hàm: #include <iostream.h>
– Nhập: cin cin >> >> Bi Bi ế ế n n
– Xuất : cout cout << ( << (Bi Bi ể ể u u th th ứ ứ c c))
– Các kiểu dữliệu có thể nhập xuất : – Các kiểu dữliệu có thể nhập xuất :
char , int, unsigned, long, unsigned long, … float, double, char* , char []
(void*): l ấ y ñị a ch ỉ ñầ u c ủ a chu ỗ i
– Có thể nhập xuất liên tục trên một dòng
Vd:
cout << “Gia tri x = “ << x << “ , y = “ <<y; cout << “Nhap n = “; cin >> n;
Trang 4Các khái niệm cơ bản
Các khái niệm cơ bản
• Nh ậ p xu ấ t
– M ộ t s ố hàm ñị nh d ạ ng toàn c ụ c:
• cin.width(n)
• cout.width(n)
– Ký t ự ñặ c bi ệ t : \n, \t, \0, \b, \r
– ðị nh d ạ ng khác: endl, ends, flush, …
13
Các khái niệm cơ bản Các khái niệm cơ bản
• C ấ u trúc 1 ch ươ ng trình ñơ n gi ả n
14
Cấu trúc ñiều khiển
Cấu trúc ñiều khiển
• Tu ầ n t ự
– Câu l ệ nh: vi ế t trên m ộ t hay nhi ề u dòng
– Kh ố i l ệ nh:
• Là dãy các lệnh viết trong cặ { }
• Tươngñương với 1 câu lệnh
• Tươngñương với 1 câu lệnh
• Giá tr ị c ủ a bi ể u th ứ c ñ i ề u ki ệ n
– B ằ ng 0 : <=> SAI
– Khác 0 : <=> ñ úng
Vd: int x=0;
if(x==2) cout<< “ x bang 2 “;
else cout<< “ x khac 2 “;
Cấu trúc ñiều khiển Cấu trúc ñiều khiển
• R ẽ nhánh
– if (bi ể u th ứ c)
L ệ nh 1;
else
L ệ nh 2;
L ệ nh 2;
– switch (bi ể u th ứ c) {
case ‘giá tr ị 1’ : L ệ nh 1; [ break ; ]
case ‘giá tr ị 2’ : L ệ nh 2; [ break ; ]
case ‘giá tr ị n’ : L ệ nh n; [ break ; ]
default : L ệ nh n+1;
}
Trang 5• L ặ p
– while (bi ể u th ứ c)
L ệ nh ;
– do
– do
L ệ nh ;
while (bi ể u th ứ c);
– for ( e1 ; e2 ; e3 )
L ệ nh;
e1 : biểu thức khởi tạo e2 : biểu thứcñiều kiện e3 : biểu thức lặ 17
• T ừ khóa break
– Thoát ra kh ỏ i c ấ u trúc switch
– Thoát ra kh ỏ i vòng l ặ p : while, do while, for
• T ừ khóa continue: Trở v ề ñầ u vòng l ặ p
• L ệ nh nh ả y goto
– Dùng chung v ớ i nhãn l ệ nh
– Không nên s ử d ụ ng vì s ẽ phá v ở c ấ u trúc CT – Ư u ñ i ể m : thoát kh ỏ i các vòng l ặ p l ồ ng sâu
18
Hàm và cấu trúc chương trình
Hàm và cấu trúc chương trình
• Hàm - Cú pháp :
<Ki ể u tr ả v ề > <Tên hàm> (Danh sách ki ể u và tham s ố )
{ [ Khai báo dữ li ệ u c ụ c b ộ]
[ Thân hàm ]
[ Câu lệ nh return]
[ Câu lệ nh return]
}
somax = (x>y) ? x : y;
return somax;
}
Hàm và cấu trúc chương trình Hàm và cấu trúc chương trình
• Hàm - Khai báo prototype :
<Ki ể u tr ả v ề > <Tên hàm> ( Danh sách ki ể u );
Vd: int Max ( int , int );
int Min ( int , int );
void main() {
Khai báo hàm
void main() {
cout <<“ So max= “<< Max (a,b)<< endl ;
cout <<“ So min= “<< Min (a,b)<< endl ; }
ðịnh nghĩa hàm
Trang 6Hàm và cấu trúc chương trình
Hàm và cấu trúc chương trình
• Hàm
– Cách gọi :
Tên hàm(tham s ố theo th ứ t ự t ừ trái sang)
– Tham sốvàñối số: Tham số
(hình thức)
int Max ( int x , int y ) {
if(x>y) return x;
return y;
}
void main () {
int a =10 , b = 5;
cout<<“So max= “<< Max ( a , b ) << endl;
(hình thức)
ðối số (Tham số thực tế)
Hàm và cấu trúc chương trình Hàm và cấu trúc chương trình
• C ấ u trúc ch ươ ng trình
– Chương trình theo dạng lập trình cấu trúc gồm
tập hợp nhiều hàmñộc lập nhau
– Hàm main() làhàm thực thi – Một chương trình chỉcó thể có1 hàm main() duy
nhất
nhất
– Dạng chung :
22
#include < Thư viện hàm >
Khai báo prototype;
Khai báo dữ liệu toàn cục
ðịnh nghĩa các hàm ñã khai báo
ðịnh nghĩa hàm main()
Con trỏ và chuỗi ký tự
Con trỏ và chuỗi ký tự
• Khái ni ệ m
– Con trỏlưuñịa chỉcủa 1 ñối tượng dữliệu khác
– Kích thước con trỏ= 1 ô nhớ của hệ ñiều hành
– Trên MS-DOS, kích thước của con trỏlà 2 bytes
• Khai báo : < Ki ể u> *<Tên con tr ỏ >;
• Khai báo : < Ki ể u> *<Tên con tr ỏ >;
VD: long x = 20;
long *y; y = &x;
• Các phép toán
– ðịa chỉ: & y
– Giá trị: y
– Giá trịdữliệu mà con trỏ ñang trỏtới : ** y
20
1036H
x
1036
1080H
*y
Con trỏ Con trỏ
• Cách tính ñị a ch ỉ
– int x=10;// Ch ẳ ng h ạ n bi ế n x ñ ang ở ñị a ch ỉ 1000
– int *px = &x;// px =1000
– (*px)++; // Gán x=11
– px++; // px = 1002 vì px là con tr ỏ ki ể u int
– px +=n; // px ñ ang tr ỏ ñế n ñị a ch ỉ (1002 + 2*n )
– px +=n; // px ñ ang tr ỏ ñế n ñị a ch ỉ (1002 + 2*n )
• C ấ p vùng nh ớ : Con trỏ= new <Kiểu> [ S ố l ượ ng ];
long *py; py= new long[20];
• Thu h ồ i vùng nh ớ : delete <con trỏ>;
Vd: delete px;
delete[] py;
Trang 7• Con tr ỏ và mảng
– Con trỏlà 1 mảng ñộng => kích thước có thểthayñổi
– Mảng nhưlà 1 con trỏnhưng ñộlớn vùng nhớ cố ñịnh
Cách sử dụng mảng và con trỏgần như giống nhau
25
Cấp vùng nhớ
vừa ñủ
cho con trỏ
Thu hồi lại vùng
nhớ
Phân bi ệ t m ả ng con tr ỏ và con tr ỏ ñế n m ả ng
26
Mảng Mảng gồm gồm 10 con 10 con trỏ trỏ
Con Con trỏ trỏ ñến ñến 1 1 mảng mảng
10
10 phần phần tử tử kiểu kiểu int int
Tham số mặc nhiên Tham số mặc nhiên
• Khái ni ệ m
– Gán cácgiá trịmặc nhiêncho cáctham sốcủa hàm
• Ư u ñ i ể m
– Không cần phải hiểu rõ ý nghĩa tất cảcác tham số – Có thểgiảmñược sốlượng hàm cầnñịnh nghĩa
– Có thểgiảmñược sốlượng hàm cầnñịnh nghĩa
• Khai báo tham s ố m ặ c nhiên
– Tất cảcác tham sốmặc nhiênñều phảiñặ t ở cu ố i hàm – Chỉcầnñưa vào khai báo, không cần trongñịnh nghĩa
• G ọ i hàm có tham s ố m ặ c nhiên
– Nếu cung cấ ñủtham số=> dùng tham sốtruyền vào – Nếukhông ñủtham số=> dùngtham sốmặc nhiên
Trang 8Tham số mặc nhiên
Tham số mặc nhiên
• Ví d ụ
MessageBox ( LPCTSTR lpszText,
LPCTSTR lpszCaption = NULL,
UINT nType = MB_OK )
Hàm thể hiện 1 cửa sổ thông báo trong Visual C++
Có thể gọi hàm theo các dạng sau:
29
MessageBox (“Hien thi thong bao ra man hinh");
MessageBox ( “Chuc nang khong su dung duoc",
“Bao loi“ );
MessageBox ( “Ban muon thoat khoi chuong trinh?",
“Thong bao“,
MB_YESNO | MB_ICONASTERISK );
Tham số mặc nhiên Tham số mặc nhiên
• Ví d ụ
void Ham1 ( int a=0, int b=1) {
cout <<“ tham so 1 = “<<a<< endl ;
cout <<“ tham so 2 = “<<b<< endl ; }
void main () {
30
void main () {
int x=10, y=20;
cout << “ Goi Ham1 4 lan, ta duoc : “<< endl ; Ham1(x,y);
Ham1(x);
Ham1(y);
Ham1();
}
Tái ñịnh nghĩa hàm
Tái ñịnh nghĩa hàm
• Khái ni ệ m
C++ cho phépñịnh nghĩa các hàm trùng tên
• Quy t ắ c tái ñị nh ngh ĩ a
– Các hàmtrùng tênphảikhácnhau vềtham số:
• Sốlượng
• Thứtự
• Kiể
• Quy t ắ c g ọ i hàm
– Tìm hàm có kiểu tham sốphù hợp
– Dùng phép ép kiểu tự ñộng
– Tìm hàm gầnñúng (phù hợp) nhất
Tái ñịnh nghĩa hàm Tái ñịnh nghĩa hàm
Vd
int Max ( int a, int b) { return (a>b) ? a : b; }
float Max ( float a, float b) { return (a>b) ? a : b; } SinhVien Max (SinhVien a, SinhVien b) SinhVien Max (SinhVien a, SinhVien b) { return (a.diemtb > b.diemtb) ? a : b; }
void main() {
int x1=1, y1=2;
float x2=3, y2=4;
long x3=5, y3=6;
cout << Max (x1,y1)<<“\t”<< Max (x2,y2)<< endl ;
cout << Max (x3,y1) << endl ;
cout << Max (x3,y2) << endl ;
cout << Max (x3,y3) << endl ; }
Trang 9{ … }
float F ( float a=5, float b=9) { … }
33
void main() {
float x2=3, y2=4;
cout << F (x1)<<“\t”<< F (y2)<< endl ;
cout << F (x3) << F () << endl ; }
• Giảm thời gian thực thi chương trình
• Tăng kích thước của mã lệnh thực thi
• Chỉnênñịnh nghĩa inline khi hàm có kích thước nhỏ
• Cú pháp : thêm từkhóa inline vào trước hàm
VD: inline float sqr(float x) { VD: inline float sqr(float x) {
return (x*x);
}
inline int Max(int a, int b) { return ((a>b) ? a : b) ;
}
34
Truyền tham số
Truyền tham số
• Truy ề n theo giá tr ị
– Giá tr ị tham s ố khi ra kh ỏ i hàm s ẽkhông thay không thay ñổ ñổ i i
void Swap1 ( int a, int b) {
int temp = a;
a = b;
b = temp;
5 10
x y
a b
main Swap1 STEP
01
b = temp;
}
void main (){
int x = 5 , y = 10 ;
Swap1 ( x , y );
cout << “ x = “ << x
<< “ y = “ << y
<< endl;
}
10
5 10
x y
5 10
a b
main Swap1 STEP
02
5 10
x y
10 5
a b
main Swap1 STEP
03
Truyền tham số Truyền tham số
• Truy ề n theo ñị a ch ỉ (con tr ỏ )
– Giá tr ị tham s ố khi ra kh ỏ i hàm có th có th ể ể thay thay ñổ ñổ i i
void Swap2 ( int * a, int * b) {
int temp = * a;
* a = * b;
* b = temp;
5 10
x y
a b
main Swap2 STEP
01 100
200
* b = temp;
}
void main (){
int x = 5 , y = 10 ;
Swap2 ( & x , & y );
cout << “ x = “ << x
<< “ y = “ << y
<< endl;
}
10
y 200 b
5 10
x y
100 200
a b
main Swap2 STEP
02 100
200
10 5
x y
100 200
a b
main Swap2 STEP
03 100
200
Trang 10• Khái ni ệ m
Struct là 1 dạng cấu trúc dữliệu mà bản thân có thểchứa
nhiều loại dữliệu có kiểu khác nhau.
• Khai báo
37
SinhVien a;
2 bytes
2 bytes
4 bytes
8 bytes
diemtb namsinh
*hoten masosv[]
Struct
• Bi ế n ki ể u struct :
• Truy xu ấ t các thành ph ầ n c ủ a struct :
cin >> a.masosv;
cout << “Tuoi cua b la : “<<b.tuoi;
cin >> ds[19].namsinh;
ds2->hoten = new char[50];
• Gán struct :
• Con tr ỏ struct :
SinhVien *ds= new SinhVien[100];
38
Bài Bài tập tập
• Vi ế t struct cho qu ả n lý kho hàng hóa (t ồ n kho) g ồ m các thông tin tên hàng,
» Tên hàng
» S ố l ượ ng,
• Khi nh ậ p hàng s ẽ cho bi ế t tên hàng,
» s ố l ượ ng,
• Khi xu ấ t s ẽ ch ọ n hàng có trong kho
» s ố l ượ ng bán