Con trỏ đến hàm Ví dụ Gọi hàm check sử dụng con trỏ đến hàm như là 1 đối số... Tham số mặc nhiên Khái niệm Gán các giá trị mặc nhiên cho các tham số của hàm.. Khai báo tham số mặc
Trang 2Nội dung
Các khái niệm cơ bản trong C++
Cấu trúc điều khiển
Trang 3Các khái niệm cơ bản
Độ dài tối đa là 32
VD: x, hoten, a1, num_of_var, Delta, TEN,
Trang 4Các khái niệm cơ bản
float 4 bytes 1.2e-38 3.4e38double 8 bytes 2.2e-308 1.8e308
Trang 5Cá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);
.
}
Trang 6Các khái niệm cơ bả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;
}
Trang 7Các khái niệm cơ bản
char *str=“Chuoi Ky Tu”;
char chuoi[50]; strcpy(chuoi,“ ”);
if ( strcmp(chuoi,“”)==0) cout << “Chuoi rong”;
Trang 8Các khái niệm cơ bản
Cú pháp: ( Kiểu ) biểu thức ( Kiểu ) biểu thức
hoặc Kiểu ( biểu thức )
Ví dụ:
int a=10, b=3;
float c1 = a / b ; float c2 = float (a/b);
float c3 = (float) a / b ;
Trang 9Các khái niệm cơ bản
/= , %= , -= , &= , |= , ^=
Trang 10Các khái niệm cơ bản
Mảng
Khai báo :
<Kiểu> <Tên mảng> [<Kích thước>];
VD : int m[10]; float ds[MAX];
Sử dụng : phép toán lấy giá trị phần tử.
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++)
Trang 11Các khái niệm cơ bản
# error
Trang 12Các khái niệm cơ bản
Nhập xuất
Thư viện hàm : # include <iostream.h>
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 = “ <<y; cout << “Nhap n = “; cin >> n;
Trang 13Các khái niệm cơ bản
Trang 14Các khái niệm cơ bản
Cấu trúc 1 chương trình đơn giản
Trang 15Cấu trúc điều khiển
Tuần tự
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 cout<< “ x khac 2 “;
Trang 16Cấu trúc điều khiển
Rẽ nhánh
Lệnh 1;
else Lệnh 2;
Trang 17Cấu trúc điều khiển
Trang 18Cấ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
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
Trang 19Hàm và cấu trúc chương trình
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 ] }
VD: int Max ( int x, int y) {
int somax;
somax = (x>y) ? x : y;
return somax;
}
Trang 20Hàm và cấu trúc chương trình
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() {
int a =10 , b =5;
cout<<“ So max= “<< Max(a,b)<<endl;
cout<<“ So min= “<< Min(a,b)<<endl;
} int Max (int x , int y) { } int Min (int x , int y) { }
Trang 21cout<<“So max= “<< Max ( a , b ) << endl; }
Tham số (hình thức)
Đối số (Tham số thực tế)
Trang 22 Dạng chung :
# 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().
Trang 23Con 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ỏ>;
Trang 24 Cấp vùng nhớ : Con trỏ = new <Kiểu> [ Số lượng ];
Ví dụ: int *px= new int;
long *py; py= new long[20];
Thu hồi vùng nhớ : delete <con trỏ>;
Ví dụ: delete px;
delete[] py;
Trang 25Con 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
Trang 27Con trỏ
Con trỏ đến con trỏ
Tương tự (tổng quát hơn) mảng nhiều chiều
Cẩn thận khi cấp vùng nhớ
Trang 28int (*p1) (const char *, const char *);
long (*p2) (int a, int b);
Thường dùng con trỏ này để gọi 1 hàm và gửi
Trang 29Con trỏ đến hàm
Ví dụ
Gọi hàm check sử dụng con trỏ đến hàm như là 1 đối số
Trang 30Con trỏ void*
Có thể trỏ đến bất kỳ loại dữ liệu nào.
Phải dùng phép ép kiểu khi thay đổi.
Trang 31Con trỏ và chuỗi ký tự
Chuỗi ký tự
Là 1 mảng ký tự hay con trỏ ký tự
=> truy xuất phần tử của chuỗi tương tự như mảng.
VD: char chuoi1[20], *chuoi2;
char c = chuoi1[0];
Phải cấp vùng nhớ cho chuỗi dạng con trỏ.
VD: chuoi2 = new char [50];
Chuỗi sẽ được đánh dấu bởi ký tự kết thúc : ‘\0 \0 ’
Trang 32Con trỏ và chuỗi ký tự
Chuỗi ký tự
Một số hàm xử lý chuỗi trong < string.h >:
Copy chuỗi: char* strcpy (char* s1, char* s2);
Tạo bản sao: char* strdup (char* s1);
Chiều dài: int strlen (char* s);
So sánh: int strcmp (char* s1, char* s2);
Ghép chuỗi: char* strcat (char* s1, char* s2);
Đảo ngược: char* strrev (char* s);
Đổi sang HOA: char* strupr (char* s);
Đổi sang thường: char* strlwr (char* s);
Gán n ký tự c:
char* strnset (char* s, int c , int n);
Trang 33Tham số mặc nhiên
Khái niệm
Gán các giá trị mặc nhiên cho các tham 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
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
Nếu không đủ tham số => dùng tham số mặc nhiên
Trang 34Tham 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++
MessageBox (“Hien thi thong bao ra man hinh");
MessageBox ( “Chuc nang khong su dung duoc",
“Bao loi“ );
Có thể gọi hàm theo các dạng sau:
MessageBox ( “Ban muon thoat khoi chuong trinh?",
“Thong bao“,
MB_YESNO | MB_ICONASTERISK );
Trang 35Tham 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;
Trang 36Tá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ố:
Trang 39Hàm inline
Là 1 hàm nhưng tác dụng tương tự như một macro.
Khắc phục được các nhược điểm của hàm và macro
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) ; }
Trang 41Tham chiếu
Tham chiếu dùng như một biến
Khởi tạo : int x=5; int &rx = x;
int &a; int &b=5; // SAI
Tham chiếu hằng : không thể sửa đổi giá trị
const int &n=10;
<=> int x=3; const int &n=x;
n=5; // Báo lỗi vì n lúc này là hằng số
Gán trị lại :
Không thể sửa đổi đối tượng tham chiếu.
Chỉ là thay đối giá trị.
int x = 5, y = 20; int &rx = x;
rx = y; // Chính là gán x=20
// không phải là rx tham chiếu đến y
Trang 42Tham chiếu
Tham chiếu dùng như đối số của hàm
Làm thay đổi giá trị của tham số.
Hữu ích cho hàm trả về nhiều kết quả.
Tiết kiệm được ô nhớ trung gian (tham số hình thức) trong hàm.
void Nhap ( int& a, float& b) { cout << “ Nhap tham so 1 : “; cin >>a;
cout << “ Nhap tham so 2 : “; cin >>b;
}
void main () { int n; float m;
Nhap( n , m );
}
Trang 43Tham chiếu
Tham chiếu dùng như trị trả về của hàm
Đối tượng trả về vẫn bền vững khi hàm kết thúc
Trị trả về là 1 đối tượng toàn cục hay 1 vùng nhớ cục bộ
=> Ích lợi : che đi cách biểu diễn của dữ liệu.
( Chẳng hạn : ta đổi lại dùng CTDL là danh sách liên kết
=> chỉ viết lại hàm GiaTri(int ) mà thôi )
Trang 44Truyền tham số
Truyền theo giá trị
Giá trị tham số khi ra khỏi hàm sẽ không thay đổi không thay đổi
void Swap1 ( int a, int b) {
x y
a b
main Swap1
STEP 01
5 10
x y
5 10
a b
main Swap1
STEP 02
5 10
x y
10 5
a b
main Swap1
STEP 03
Trang 45Truyền tham số
Truyền theo địa chỉ (con trỏ)
Giá trị tham số khi ra khỏi hàm có thể thay đổi có thể thay đổi
void Swap2 ( int * a, int * b) {
x y
a b
x y
100 200
a b
x y
100 200
a b
main Swap2
STEP
200
Trang 46Truyền tham số
Truyền theo tham chiếu:
Giá trị tham số khi ra khỏi hàm có thể thay có thể thay đổi
void Swap3 ( int & & a, int & & b) {
Trang 47 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.
*hoten masosv[]