Chương 1
CÁC ĐẶC ĐIỂM CỦA C++
• 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++
1
Nội dung
• 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 • Tái định nghĩa hàm • Hàm tại chổ (inline) • Truyền tham số • Tham chiếu • Struct
2
Các khái niệm cơ 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ữ HOA và chữ thường – Gồm chữ, 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, ...
3
Các khái niệm cơ bản
• Kiểu dữ liệu
Tên kiểu
Kích thước
Phạm 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
4
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
Vd: int x=5, y=10;
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
• 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;
void GanSo(int x) {
so = x;
} int NuaSo(int x) {
int c = 2; int so = x/c ; return so;
6
}
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 :
const int MAX=100;
• Số nguyên: 10 , -5, 300000, 1000L, ... • Số thực : 3.1416, .5 , 123E-5, ... char ch1 = ‘A’ , ch2=97; • Ký tự : • 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
• Kiểu: Chuyển đổi kiểu : – Mặc nhiên (tự động) :
– Do người lập trình sử dụng :
float x = 3.1416; int y = x ; float sole = x - y;
Cú pháp:
( Kiểu ) biểu thức hoặc Kiểu ( biểu thức )
Vd:
8
int a=10, b=3; float c1 = a / b ; float c2 = float (a/b); float c3 = (float) a / b ; float c4 = float (a)/b;
Các khái niệm cơ bản
+ , - , * , / , %
=
• Các phép toán – Số học: – Luận lý: ==, !=, >, <, >=, <=, &&, ||, ! – Gán : – Lấy kích thước: sizeof (đối tượng dữ liệu ) – Điều kiện : e1 ? e2 : e3 – Lấy địa chỉ : – Tăng giảm :
&(biến)
x++ , x-- , ++x , --x tong+= i ; tich *= i; /= , %= , -= , &= , |= , ^=
9
Tìm lỗi biến?
int x = 10; int x = 10; ---------------------- int 1x = 10; ---------------------- int x1 = 10; ---------------------- int x=3, y=4; int tong = X+Y;
int if = 10; -------------------- int diem so = 10; -------------------- int diem_so = 10; -------------------- int @diem = 10; -------------------- int diem@ = 10;
10
Tìm lỗi tên biến?
int x = 10; int x = 10; ---------------------- int 1x = 10; ---------------------- int x1 = 10; ---------------------- int x=3, y=4; int tong = X+Y;
int if = 10; -------------------- int diem so = 10; -------------------- int diem_so = 10; -------------------- int @diem = 10; -------------------- int diem@ = 10;
11
Biến toàn cục và cục bộ?
int x1 = 5; int x2 = 2; void GanSo(int x) {
Kết quả cuối in ra x1,
int x1 = x; x2 = x; }
x2 bằng mấy?
int main(void){
GanSo(3);
cout<<"x1: "< } 12 – Khai báo: Vd: int m[10]; float ds[MAX];
– 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++) long tong = 0;
for(i=0 ; i<10 ; i++) 13 tong += a[i]; • Dùng mảng lưu số tự nhiên từ 1 đến 10. • In dãy số này ra màn hình. • Tính tổng của dãy số và in ra màn hình. 14 • Chú thích – Trên 1 dòng:
– Trên nhiều dòng: /* //chú thích trên 1 dòng • Các chỉ thị tiền biên dịch: chú thích trên nhiều dòng
*/ #undefine
#else
#elif
#else
#else #include
#endif
#else
#endif
#endif 15 #define
#if
#if
#ifdef
#ifndef
#error • Nhập xuất 16 • Nhập xuất – Một số hàm định dạng toàn cục: • cin.width(n) – Ký tự đặc biệt : \n, \t – Định dạng khác: endl, ends, flush, … 17 • cout.width(n) • Viết đoạn lệnh cho phép người dùng nhập một chuỗi và in chuỗi đó ra màn hình. 18 • Cấu trúc 1 chương trình đơn giản 19 • 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ặp { }
• Tương đương với 1 câu lệnh
• Giá trị của biểu thức điều kiện if(x==2) cout<< “ x bang 2 “; else 20 cout<< “ x khac 2 “; • Rẽ nhánh – if (biểu thức) Lệnh 1; else 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; 21 } • Lặp – while (biểu thức) – do Lệnh ; Lệnh ; – for ( e1 ; e2 ; e3 ) while (biểu thức); 22 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ặp • 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 23 • Hàm - Cú pháp : { [ Khai báo dữ liệu cục bộ ] [ Thân hàm ]
[ Câu lệnh return ] } Vd: int Max ( int x, int y) { int somax;
somax = (x>y) ? x : y;
return somax; 24 } • Hàm - Khai báo prototype : Vd: int Khai báo
hàm Max ( int , int );
int Min ( int , int );
void main() { a =10 , b =5; int
cout<<“So max= “<< Max(a,b)< 25 Định
nghĩa
hàm • Hàm – Cách gọi : – Tham số và đối số: Tham số
(hình thức) Tên hàm(tham số theo thứ tự từ trái sang) Đối số
(Tham số thực tế) 26 • 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. – Dạng chung : Khai báo prototype; #include < Thư viện hàm > Khai báo dữ liệu toàn cục. Định nghĩa hàm main(). 27 Định nghĩa các hàm đã khai báo. • Viết hàm giải phương trình bậc 1 a * x + b=0 – Không xét trường hợp hàm vô nghiệm – Hàm có 2 tham số truyền vào (a,b) – Giá trị trả về của hàm là nghiệm x – Tại hàm main, a,b sẽ do người dùng nhập vào 28 • Hàm tính bình phương của một số float BinhPhuong(int) • Hàm tính chu vi hình vuông với cạnh là giá trị truyền vào int ChuVi(int canh) • Hàm tính diện tích hình vuông với cạnh là
giá trị truyền vào int DienTich(int canh) 29 • Hàm tính tổng các số chẵn trong chuỗi từ 0 -> n : int TongChan(int) • Hàm tính tổng các số lẻ trong chuỗi từ 0->n: int TongLe(int) 30 – 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> * VD: long x = 20; long *y; y = &x; • Các phép toán &y
y 31 – Địa chỉ :
– Giá trị :
– Giá trị dữ liệu mà con trỏ đang trỏ tới : *y • 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)++;
– px++;
– px +=n; • Cấp vùng nhớ : Con trỏ = new // Gán x=11
// px = 1001 vì px là con trỏ kiểu int
// px đang trỏ đến địa chỉ (1001 + 2*n ) Vd: int *px= new int; long *py; py= new long[20]; delete 32 – 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 Cấp vùng nhớ
vừa đủ
cho con trỏ Thu hồi lại vùng
nhớ 33 34 – Gán các giá trị mặc nhiên cho các tham số của hàm. • Khái niệm • Ưu điểm – Có thể giảm được số lượng hàm cần định nghĩa. – Không cần phải hiểu rõ ý nghĩa tất cả các tham số. • 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ấp đủ tham số => dùng tham số truyền vào. 35 – Nếu không đủ tham số => dùng tham số mặc nhiên • Ví dụ MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL,
UINT nType = MB_OK ) 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 ); 36 • Ví dụ 37 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àm trùng tên phải khác nhau về tham số: • Thứ tự • Số lượng • Kiểu – Tìm hàm có kiểu tham số phù hợp. • Quy tắc gọi hàm – Dùng phép ép kiểu tự động. 38 – Tìm hàm gần đúng (phù hợp) nhất. 39 int F (int a=0, int b=1) { … } float F (float a=5, float b=9) { … } int x1=1, y1=2; float x2=3, y2=4; cout << F(x1)<<“\t”< cout << F(x3) << F() << endl; 40 • 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) { } inline int Max(int a, int b) { 41 } – Giá trị tham số khi ra khỏi hàm sẽ không thay đổi. • Truyền theo giá trị 42 – Giá trị tham số khi ra khỏi hàm có thể thay đổi. • Truyền theo địa chỉ (con trỏ) 43 • 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 44 SinhVien a, b, ds1[20], *ds2; • Truy xuất các thành phần của struct : cin >> a.masosv; cout << “Tuoi cua b la : “< ds2->hoten = new char[50]; • Gán struct : • Con trỏ struct : 45 SinhVien *ds= new SinhVien[100];Các khái niệm cơ bản
• Mảng
a[i] = a[i-1] + a[i-2];
Bài tập – mảng
Các khái niệm cơ bản
#endif
Các khái niệm cơ bản
– Thư viện hàm : #include
Các khái niệm cơ bản
Bài tập – nhập xuất
Các khái niệm cơ bản
Cấu trúc điều khiển
– Bằng 0 : <=> SAI
– Khác 0 : <=> đúng
Vd: int x=0;
Cấu trúc điều khiển
Cấu trúc điều khiển
Cấu trúc điều khiển
Hàm và cấu trúc chương trình
Hàm và cấu trúc chương trình
}
int Max (int x , int y) { ... }
int Min (int x , int y) { ... }
Hàm và cấu trúc chương trình
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àm và cấu trúc chương trình
Bài tập – hàm
Con trỏ và chuỗi ký tự
• Khái niệm
20
x
1036H
*y
103
6
1080H
Con trỏ
• Thu hồi vùng nhớ :
Vd: delete px;
delete[] py;
Con trỏ
• Con trỏ và mảng
Con trỏ
Phân biệt mảng con trỏ và con trỏ đến mảng
Con trỏ đến 1 mảng
10 phần tử kiểu int
Mảng gồm 10 con trỏ
Tham số mặc nhiên
Tham số mặc nhiên
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:
Tham số mặc nhiên
void Ham1 (int a=0, int b=1) {
cout<<“tham so 1 = “<
}
void main() {
int x=10, y=20;
cout << “Goi Ham1 4 lan, ta duoc : “<
}
Tái định nghĩa hàm
• Khái niệ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; }
void main() {
x1=1, y1=2;
int
float x2=3, y2=4;
long
x3=5, y3=6;
cout << Max(x1,y1)<<“\t”<
dl;
cout << Max(x3,y3) <
Tái định nghĩa hàm
Vd
void main() {
long
x3=5, y3=6;
}
Hàm inline
return (x*x);
return ((a>b) ? a : b) ;
Truyền tham số
main
Swap1
void Swap1(int a, int b) {
x
5
a
STEP
01
y
10
b
int temp = a;
a = b;
b = temp;
}
main
Swap1
x
5
a
5
void main(){
STEP
02
y
10
b
10
main
Swap1
int x = 5, y = 10;
Swap1( x , y );
cout << “ x = “ << x
x
5
a
10
<< “ y = “ << y
<< endl;
STEP
03
y
10
b
5
}
Truyền tham số
main
Swap2
void Swap2(int* a, int* b) {
x
5
a
100
STEP
01
y
10
b
200
int temp = *a;
*a = *b;
*b = temp;
}
main
Swap2
x
5
a
100
void main(){
STEP
02
y
10
b
200
10
0
20
0
main
Swap2
int x = 5, y = 10;
Swap2( &x , &y );
cout << “ x = “ << x
x
10
a
100
<< “ y = “ << y
<< endl;
STEP
03
y
5
b
}
200
10
0
20
0
Struct
masosv[]
8 bytes
*hoten
2 bytes
namsinh
2 bytes
4 bytes
diemtb
SinhVien a;
Struct
• Biến kiểu struct :
cin >> ds[19].namsinh;
SinhVien c = a;