1 / 48

CÁC ĐẶC ĐIỂM CỦA C++

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

asabi
Download Presentation

CÁC ĐẶC ĐIỂM CỦA C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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++ Nguyễn Công Huy – Khoa CNTT&TT

  2. 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 Nguyễn Công Huy – Khoa CNTT&TT

  3. 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, ... Nguyễn Công Huy – Khoa CNTT&TT

  4. Các khái niệm cơ bản • Kiểu dữ liệu Nguyễn Công Huy – Khoa CNTT&TT

  5. 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); ... } Nguyễn Công Huy – Khoa CNTT&TT

  6. 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; } Nguyễn Công Huy – Khoa CNTT&TT

  7. Các khái niệm cơ bản • Hằng • Khai báo : VD: #define MAX 100 const int MAX=100; • Một số hằng quan trọng : • 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”; Nguyễn Công Huy – Khoa CNTT&TT

  8. 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; int y = x ; float sole = x - y; • Do người lập trình sử dụng : Cú pháp: ( 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 ; float c4 = float (a)/b; Nguyễn Công Huy – Khoa CNTT&TT

  9. 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ỉ : &(biến) • Tăng giảm : x++ , x-- , ++x , --x tong+= i ; tich *= i; /= , %= , -= , &= , |= , ^= Nguyễn Công Huy – Khoa CNTT&TT

  10. Cá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++) tong+=a[i]; Nguyễn Công Huy – Khoa CNTT&TT

  11. Các khái niệm cơ bản • Chú thích • Trên 1 dòng : // chú thích trên 1 dòng • 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 : # define # undefine # include # if # else # endif # if # elif # else # endif # ifdef # else # endif # ifndef # else # endif # error Nguyễn Công Huy – Khoa CNTT&TT

  12. Cá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; Nguyễn Công Huy – Khoa CNTT&TT

  13. 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) • cout.precision(n) • cin.seekg(n) • Ký tự đặc biệt : \n, \t, \0, \b, \r • Định dạng khác: endl, ends, flush, … • Nhập chuỗi : • gets(char* str); • cin.getline(char* str, int n); Nguyễn Công Huy – Khoa CNTT&TT

  14. Các khái niệm cơ bản • Cấu trúc 1 chương trình đơn giản Nguyễn Công Huy – Khoa CNTT&TT

  15. 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 cout<< “ x khac 2 “; Nguyễn Công Huy – Khoa CNTT&TT

  16. 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; } Nguyễn Công Huy – Khoa CNTT&TT

  17. Cấu trúc điều khiển • Lặp • while (biểu thức) Lệnh ; • 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ặp Nguyễn Công Huy – Khoa CNTT&TT

  18. 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 • 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 Nguyễn Công Huy – Khoa CNTT&TT

  19. 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 ] } VD: int Max ( int x, int y) { int somax; somax = (x>y) ? x : y; return somax; } Nguyễn Công Huy – Khoa CNTT&TT

  20. 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: intMax ( int , int ); intMin ( int , int ); void main() { int a =10 , b =5; cout<<“So max= “<< Max(a,b)<<endl; cout<<“So min= “<< Min(a,b)<<endl; } intMax (int x , int y) { ... } intMin (int x , int y) { ... } Nguyễn Công Huy – Khoa CNTT&TT

  21. Tham số (hình thức) Đối số (Tham số thực tế) 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ố: 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; } Nguyễn Công Huy – Khoa CNTT&TT

  22. 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 : # 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(). Nguyễn Công Huy – Khoa CNTT&TT

  23. x 20 1036H *y 1036 1080H 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ỏ>; 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 Nguyễn Công Huy – Khoa CNTT&TT

  24. 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 ) • 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; Nguyễn Công Huy – Khoa CNTT&TT

  25. 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ớ Nguyễn Công Huy – Khoa CNTT&TT

  26. 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ỏ Nguyễn Công Huy – Khoa CNTT&TT

  27. Con 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ớ. Nguyễn Công Huy – Khoa CNTT&TT

  28. Con trỏ đến hàm • Là con trỏ đặc biệt dùng để trỏ đến địa chỉ mã lệnh thực thi của 1 hàm. • Khai báo con trỏ đến hàm phải đặt trong cặp dấu ngoặc. (*p): int (*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 hàm đó như là 1 đối số đến 1 hàm khác. void check(char *a, char *b, int (*cmp)(const char *, const char *)); • Gọi hàm: check(“abc”,”ABC”, strcmp); Nguyễn Công Huy – Khoa CNTT&TT

  29. Gọi hàm check sử dụng con trỏ đến hàm như là 1 đối số Con trỏ đến hàm • Ví dụ Nguyễn Công Huy – Khoa CNTT&TT

  30. Con 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. Nguyễn Công Huy – Khoa CNTT&TT

  31. Con 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’ • Hàm nhập chuỗi : • gets(chuoi2); • cin.getline(chuoi2, 49); • In chuỗi ra màn hình: cout<<chuoi1<<chuoi2; Nguyễn Công Huy – Khoa CNTT&TT

  32. Con 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); Nguyễn Công Huy – Khoa CNTT&TT

  33. 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. • Ư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 Nguyễn Công Huy – Khoa CNTT&TT

  34. Tham số mặc nhiên • Ví dụ Hàm thể hiện 1 cửa sổ thông báo trong Visual C++ 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 ); Nguyễn Công Huy – Khoa CNTT&TT

  35. Tham số mặc nhiên • Ví dụ voidHam1 (int a=0, int b=1) { cout<<“tham so 1 = “<<a<<endl; cout<<“tham so 2 = “<<b<<endl; } voidmain() { int x=10, y=20; cout << “Goi Ham1 4 lan, ta duoc : “<<endl; Ham1(x,y); Ham1(x); Ham1(y); Ham1(); } Nguyễn Công Huy – Khoa CNTT&TT

  36. 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ố: • Số lượng • Thứ tự • Kiểu • 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. Nguyễn Công Huy – Khoa CNTT&TT

  37. Tái định nghĩa hàm • Ví dụ 1 • intMax (int a, int b) • { return (a>b) ? a : b; } • floatMax (float a, float b) • { return (a>b) ? a : b; } • SinhVien Max (SinhVien a, SinhVien b) { • return (a.diemtb > b.diemtb) ? a : b; } • voidmain() { • 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; • } Nguyễn Công Huy – Khoa CNTT&TT

  38. Tái định nghĩa hàm • Ví dụ 2 • intF (int a=0, int b=1) • { … } • floatF (float a=5, float b=9) • { … } • voidmain() { • int x1=1, y1=2; • float x2=3, y2=4; • long x3=5, y3=6; • cout << F(x1)<<“\t”<<F(y2)<<endl; • cout << F(x3) << F() << endl; • } Nguyễn Công Huy – Khoa CNTT&TT

  39. Hà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) ; } Nguyễn Công Huy – Khoa CNTT&TT

  40. x 10 1036H Tham chiếu • Khái niệm • Là 1 loại đối tượng dữ liệu “tham chiếu” đến 1 đối tượng có sẵn. • Là 1 bí danh như con trỏ, nhưng không cần có tác tử *. VD: int x = 10; int *px; px = &x; int &rx = x; 3 cách thay đổi giá trị của x : x = 5; *px = 5; rx = 5; &rx *px 1036 1080H Nguyễn Công Huy – Khoa CNTT&TT

  41. Tham 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 Nguyễn Công Huy – Khoa CNTT&TT

  42. Tham 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. voidNhap (int& a, float& b) { cout<< “Nhap tham so 1 : “; cin>>a; cout<< “Nhap tham so 2: “; cin>>b; } voidmain() { int n; float m; Nhap( n , m ); } Nguyễn Công Huy – Khoa CNTT&TT

  43. Tham 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ộ. VD: long a[1000]; long& GiaTri(int i) { return a[i]; } void main() { GiaTri(1) = 1; GiaTri(2) = 1; for( int i= 3; i<1000; i++) GiaTri(i) = GiaTri(i-1) + GiaTri(i-2); } => Í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 ) Nguyễn Công Huy – Khoa CNTT&TT

  44. main main main Swap1 Swap1 Swap1 STEP 03 STEP 01 STEP 02 x x x 5 5 5 a a a 10 5 y y y 10 10 10 b b b 5 10 Truyền tham số • Truyền theo giá trị • Giá trị tham số khi ra khỏi hàm sẽ không thay đổi. voidSwap1(int a, int b) { int temp = a; a = b; b = temp; } voidmain(){ int x = 5, y = 10; Swap1( x , y ); cout << “ x = “ << x << “ y = “ << y << endl; } Nguyễn Công Huy – Khoa CNTT&TT

  45. main Swap2 STEP 01 x 5 a 100 y 10 b 200 main Swap2 STEP 02 x 5 a 100 100 y 10 b 200 200 main Swap2 STEP 03 x 10 a 100 100 y 5 b 200 200 Truyền tham số • Truyền theo địa chỉ (con trỏ) • Giá trị tham số khi ra khỏi hàm có thể thay đổi. voidSwap2(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } voidmain(){ int x = 5, y = 10; Swap2( &x , &y ); cout << “ x = “ << x << “ y = “ << y << endl; } Nguyễn Công Huy – Khoa CNTT&TT

  46. Truyền tham số • Truyền theo tham chiếu: • Giá trị tham số khi ra khỏi hàm có thể thay đổi. main Swap3 voidSwap3(int&a, int&b) { int temp = a; a = b; b = temp; } voidmain(){ int x = 5, y = 10; Swap3( x , y ); cout << “ x = “ << x << “ y = “ << y << endl; } STEP 01 x 5 y 10 a b main Swap3 STEP 02 x 10 y 5 a b main STEP 03 x 10 y 5 Nguyễn Công Huy – Khoa CNTT&TT

  47. masosv[] 8 bytes *hoten 2 bytes namsinh 2 bytes 4 bytes diemtb 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 SinhVien a; Nguyễn Công Huy – Khoa CNTT&TT

  48. 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 : “<<b.tuoi; cin >> ds[19].namsinh; ds2->hoten = new char[50]; • Gán struct : SinhVien c = a; • Con trỏ struct : SinhVien *ds= new SinhVien[100]; Nguyễn Công Huy – Khoa CNTT&TT

More Related