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

Các khái niệm cơ bản • Mảng

– 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++)

a[i] = a[i-1] + a[i-2];

long tong = 0; for(i=0 ; i<10 ; i++)

13

tong += a[i];

Bài tập – mảng

• 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

Các khái niệm cơ bản

• 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 */

#endif

#undefine #else #elif #else #else #include #endif #else #endif #endif

15

#define #if #if #ifdef #ifndef #error

Các khái niệm cơ bản

• Nhập xuất

– Thư viện hàm : #include – Nhập : cin >> Biến – Xuất : cout << (Biểu thức) – 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 = “ <> n;

16

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)

– Ký tự đặc biệt : \n, \t

– Định dạng khác: endl, ends, flush, …

17

• cout.width(n)

Bài tập – nhập xuất

• 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ác khái niệm cơ bản

• Cấu trúc 1 chương trình đơn giản

19

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ặp { } • 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

20

cout<< “ x khac 2 “;

Cấu trúc điều khiển

• 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

}

Cấu trúc điều khiển

• 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

Cấu trúc điều khiển

• 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 và cấu trúc chương trình

• Hàm - Cú pháp :

(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 ]

}

Vd: int Max ( int x, int y) {

int somax; somax = (x>y) ? x : y; return somax;

24

}

Hàm và cấu trúc chương trình

• Hàm - Khai báo prototype :

( Danh sách kiểu );

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)<

} int Max (int x , int y) { ... } int Min (int x , int y) { ... }

25

Định nghĩa hàm

Hàm và cấu trúc chương trình

• 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)

int Max ( int x, int y) {

if(x>y) return x; return y;

}

Đối số (Tham số thực tế)

void main() {

int a =10 , b = 5; cout<<“So max= “<< Max ( a , b ) << endl;

}

26

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.

– 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.

Bài tập – hàm

• 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ỏ 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> *;

VD: long x = 20;

20

x

long *y; y = &x;

1036H

• Các phép toán

*y

103 6

1080H

&y y

31

– Địa chỉ : – Giá trị : – Giá trị dữ liệu mà con trỏ đang trỏ tới : *y

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)++; – px++; – px +=n;

• Cấp vùng nhớ : Con trỏ = new [ Số lượng ];

// 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 ;

• Thu hồi vùng nhớ : Vd: delete px; delete[] py;

32

Con trỏ

• 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

Cấp vùng nhớ vừa đủ cho con trỏ

Thu hồi lại vùng nhớ

33

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ỏ

34

Tham số mặc nhiên

– 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

Tham số mặc nhiên

Hàm thể hiện 1 cửa sổ thông báo trong Visual C++

• Ví dụ

MessageBox( LPCTSTR lpszText,

LPCTSTR lpszCaption = NULL, UINT

nType = MB_OK )

Có thể gọi hàm theo các dạng sau:

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

Tham số mặc nhiên

• Ví dụ

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 : “<

}

37

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à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.

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) <

39

Tái định nghĩa hàm

Vd

int F (int a=0, int b=1)

{ … }

float F (float a=5, float b=9)

{ … }

void main() {

int x1=1, y1=2;

float x2=3, y2=4;

long

x3=5, y3=6;

cout << F(x1)<<“\t”<

cout << F(x3) << F() << endl;

}

40

Hàm inline

• 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) {

return (x*x);

}

inline int Max(int a, int b) {

return ((a>b) ? a : b) ;

41

}

Truyền tham số

– Giá trị tham số khi ra khỏi hàm sẽ không thay đổi.

• Truyền theo giá trị

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

}

42

Truyền tham số

– Giá trị tham số khi ra khỏi hàm có thể thay đổi.

• Truyền theo địa chỉ (con trỏ)

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

43

Struct

• 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

masosv[]

8 bytes

*hoten

2 bytes

namsinh

2 bytes

4 bytes

diemtb

SinhVien a;

44

Struct • Biến kiểu struct :

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 : “<

cin >> ds[19].namsinh;

ds2->hoten = new char[50];

• Gán struct :

SinhVien c = a;

• Con trỏ struct :

45

SinhVien *ds= new SinhVien[100];