Bài giảng Ngôn ngữ lập trình C++ - Bài 2: Ngôn ngữ C++ và các mở rộng so với C

Lịch sử phát triển của C++

Được xây dựng trên nền của C.

Phiên bản đầu tiên của C++ ra đời năm 1980 với tên là “C with classes”. Đến năm 1983 .

Năm 1990, ANSI/ISO 9899 đã định nghĩa một chuẩn cho C.

Năm 1998, ISO/IEC 14882 đã cụ thể hóa chuẩn cho C++

 

pptx 54 trang yennguyen 2820
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Ngôn ngữ lập trình C++ - Bài 2: Ngôn ngữ C++ và các mở rộng so với C", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Ngôn ngữ lập trình C++ - Bài 2: Ngôn ngữ C++ và các mở rộng so với C

Bài giảng Ngôn ngữ lập trình C++ - Bài 2: Ngôn ngữ C++ và các mở rộng so với C
Bài 2: Ngôn ngữ C++	 Các mở rộng so với C 
1 
Lịch sử phát triển của C++ 
Được xây dựng trên nền của C. 
Phiên bản đầu tiên của C++ ra đời năm 1980 với tên là “C with classes”. Đến năm 1983 . 
Năm 1990, ANSI/ISO 9899 đã định nghĩa một chuẩn cho C. 
Năm 1998, ISO/IEC 14882 đã cụ thể hóa chuẩn cho C++ 
2 
C++ và C 
C là tập con của C++. 
Tất cả các thư viện trong C đều có thể sử dụng trong C++. 
C++ cũng có cùng những yếu điểm như C (về con trỏ) 
Một số mở rộng của C++ so với C: 
Từ khóa mới 
Dữ liệu, khai báo biến 
Chuyển kiểu, tham chiếu, cấp phát bộ nhớ  
3 
C++ và Java 
Java là ngôn ngữ hoàn toàn hướng đối tượng. Tất cả các mã lệnh đều đóng gói trong các lớp. 
C++ là ngôn ngữ lai ghép. Nó hỗ trợ cả lập trình hướng chức năng và lập trình hướng đối tượng. 
Do vậy C++ mạnh hơn nhưng cũng khó kiểm soát hơn. 
4 
Nội dung 
Phân tích một ví dụ chương trình C++. 
Các kiểu dữ liệu, các toán tử, các hàm, vào ra (I/O). 
Các cấu trúc điều khiển. 
Các mảng, chuỗi, con trỏ. 
Một số mở rộng của C++ so với C. 
5 
Một chương trình cụ thể trên C++ 
// Title: The program doing something 
#include 
void doSomething(int p); 
int main() 
{ 
 int p = 7; 
 doSomething(p); 
 cout << “I have something done.” << endl; 
 return 0; 
} 
void doSomething(int p) { 
 for( int i = 0; i < p; i++ ) { 
 cout << “*” << endl; 
 } 
} 
6 
Các kiểu dữ liệu cơ bản của C++ 
Một số kiểu dữ liệu cơ bản: 
char	characters: ’a’, ’b’, ’\n’, ’\0’, ’7’ 
int	integers: 3, 6883, -5, 0 
double	floating point numbers: 3.14, 7e9 
bool 	true or false.	 
Ngoài ra : float, long, unsigned long, short, unsigned char, wchar_t 
7 
Khai báo biến trong chương trình 
char a; 
int b; 
double c; 
Phép gán: 
b = 4; a = 'w’; c = -3.777; 
int x = 78; 
Chú ý: 
C++ cho phép khai báo biến tại bất cứ đâu trước khi sử dụng. 
8 
Các kiểu dữ liệu cơ bản của C++ 
Hằng số: 
const double PI=3.1415926; 
const int MAXBUFFER=20;  
Ép kiểu: 
Khi gán giá trị vào biến kiểu khác. 
Ví dụ 
myInt=(int)myFloat; Theo cách của C 
myInt=int(myFloat); Theo cách của C++ 
9 
Các kiểu dữ liệu cơ bản của C++ 
Các toán tử cơ bản trong C++ 
Arithmetic operators: 
+, -, *, /, % 
Comparison: 
==, !=, , >=, <= 
Logical: 
&&, ||, ! 
Assignment: 
= 
Bitwise: 
&, |, ~,^ 
Shortcuts: 
+=, *=, ^=, (etc.) 
Other: 
>, ? :, ->, ., , 
10 
Các toán tử trong C++ 
Toán tử ++ and --: 
++ 	increment by 1 
-- 	decrement by 1  
Chú ý rằng i++ và ++i được thực thi khác nhau. 
11 
Hàm (function) 
int someFunction(double f, char c) { // } 
12 
Name 
Body 
ParameterList 
Return Type 
Hàm (function) 
Chú ý rằng các hàm được phân biệt bởi tên và danh sách các tham số. Các hàm sau là khác nhau. 
int exampleFunction(int i, char c); 
int exampleFunction(double f); 
int exampleFunction(); 
int exampleFunction(char c, int i); 
Ngoài ra có sự khác nhau giữa biến truyền kiểu tham chiếu và biến truyền kiểu giá trị (giới thiệu phần sau) 
13 
Kiểu vào ra cơ bản 
Để xuất ra màn hình dùng hàm cout. 
cout << “The result is: “ << result << endl; 
Nhập giá trị từ bàn phím dùng hàm cin. 
cin >> x; 
Khai báo thư viện 
#include 
14 
Cấu trúc điều khiển – Rẽ nhánh 
The if statement: 
if ( x > 0 ) 
{ 
 cout << “positive”; 
} 
 else 
{ 
 cout << “negative or zero”; 
} 
15 
Cấu trúc điều khiển – Lựa chọn 
Ví dụ switch : 
int x; 
cout << "Enter choice (1, 2, or 3)"; 
cin >> x; 
switch(x) { 
 case 1: doThis(); break; 
 case 2: doThat(); break; 
 case 3: doSomethingElse(); break; 
 default: cout << "Sorry, invalid Input"; 
} 
16 
Cấu trúc điều khiển – Lặp 
The for loop: 
for(k = 0; k < 10; k++ ) 
{ 
 cout << “The square of “ << k << “ is “ 
 << k * k << endl; 
 } 
17 
Start condition 
Action taking place atthe end of each iteration 
Terminating condition 
Cấu trúc điều khiển – Lặp 
Cấu trúc lặp while : 
while ( condition ) 
{ 
 // do something 
 } 
18 
Equivalent to: 
for( ; condition ; ) { 
 // do something 
 } 
Cấu trúc điều khiển -  Lặp do  while 
Cú pháp: 
do 
{ 
 // something 
} while( condition); 
Các lệnh nhảy: break, continue, goto 
19 
Equivalent to: 
// something 
while( condition) { 
 // something 
 } 
Địa chỉ ô nhớ 
Mỗi vị trí mà một đơn vị dữ liệu được lưu trữ gọi là địa chỉ ô nhớ. 
Khi khai báo một biến: Ví dụ i nt myAge. 
Máy tính sẽ chọn một vị trí ô nhớ sẵn có. 
Gán cho tên myAge địa chỉ của ô nhớ đó. 
20 
Mảng 
Mảng dùng để lưu trữ các phần tử có cùng kiểu dữ liệu. 
int someNumbers[7]; 
21 
Lưu trữ các giá trị trong mảng 
22 
int rent[4]; 
rent[0] = 250; 
rent[1] = 375; 
rent[2] = 460; 
rent[3] = 600; 
int rent[4] = {250, 375, 460, 600}; 
int rent[] = {250, 375, 460, 600}; 
int rent[4] = {250, 375}; 
int rent[3] = {250, 375, 460, 600}; 
int rent[4] = {0}; 
22 
Syntax error 
rent[2] and rent[3] are set to 0 
Sets all array elements to 0 
Lưu trữ các giá trị trong mảng 
23 
int rent[4]; 
rent[0] = 250; 
rent[1] = 375; 
rent[2] = 460; 
rent[3] = 600; 
int rent[4] = {250, 375, 460, 600}; 
int rent[] = {250, 375, 460, 600}; 
int rent[4] = {250, 375}; 
int rent[3] = {250, 375, 460, 600}; 
int rent[4] = {0}; 
23 
Syntax error 
rent[2] and rent[3] are set to 0 
Sets all array elements to 0 
Một số lỗi thường gặp khi làm việc với mảng  Quên là mảng được đánh chỉ số từ 0 
24 
Một số lỗi thường gặp khi làm việc với mảng 
25 
Truy cập đến ngoài phạm vi của mảng 
Element is out of bounds 
Mảng lưu trữ các đối tượng cấu trúc 
26 
Bài tập 
27 
Nhập vào tọa độ 3 điểm. Kiểm tra xem 3 điểm có tạo thành một tam giác ? (Sử dụng cấu trúc điểm) 
Tạo một chuỗi bằng mảng các ký tự 
28 
char firstName[] = “Mary”; 
char firstName[] = {“Mary”}; 
char firstName[5] = “Mary”; 
char firstName[5] = {“Mary”}; 
char firstName[5] = {'M', 'a', 'r', 'y', '\0'}; 
cout<<firstName; // displays Mary 
cout<<&firstName[1]; // displays ary 
Null character. You could also use the constant NULL, defined in iostream 
Một số vấn đề khi sử dụng mảng ký tự 
29 
Khi nhập mảng có chứa ký tự trống. 
Gán một chuỗi cho chuỗi khác sử dụng toán tử gán. 
So sánh các chuỗi sử dụng toán tử so sánh. 
Vượt quá giới hạn của mảng. 
30 
Ví dụ: “hello” 
Có thể tạo biến string theo hai cách. 
Tạo một mảng các ký tự để lưu trữ một chuỗi. 
Sử dụng lớp string trong thư viện của C++. 
Vấn đề khi nhập một chuỗi có ký tự trống 
31 
32 
Khắc phục 
Gán một chuỗi bằng chuỗi khác 
char clubPresident[10] = {“Eric”}; 
clubVicePresident[10] = {“Danielle”}; 
Alternative 1 (does not work as expected): 
clubPresident = clubVicePresident; 
Alternative 2 (tedious): 
clubPresident[0] = clubVicePresident[0]; 
clubPresident[1] = clubVicePresident[1]; 
clubPresident[2] = clubVicePresident[2]; 
Alternative 3 (must include string.h): giải pháp 
strcpy(clubPresident, clubVicePresident); 
33 
So sánh hai chuỗi 
Alternative 1 (does not work as expected): 
if(clubPresident == clubVicePresident) 
 cout<<”They are the same”<<endl; 
Alternative 2 (tedious): 
if(clubPresident[0] == clubVicePresident[0] && clubPresident[1] == clubVicePresident[1]. . . 
Alternative 3 (must include string.h): Giải pháp 
strcmp(firstName, secName); 
34 
A return value of 0 indicates they are equal 
35 
Vượt quá giới hạn của mảng 
36 
Sử dụng lớp string trong thư viện của C++ 
37 
Con trỏ (Pointers) 
Pointers: Các biến chứa địa chỉ ô nhớ. 
Kiểu của con trỏ là kiểu của biến mà ô nhớ đó chứa. 
Ví dụ 
int *aPointer; 
int myValue; 
aPointer = &myValue; 
cout<<myValue; //outputs contents of myValue 
cout<<*aPointer; //outputs contents of myValue 
cout<<&myValue; //outputs address of myValue 
cout<<aPointer; //outputs address of myValue 
38 
Con trỏ (Pointers) 
Pointers: Các biến chứa địa chỉ ô nhớ. 
Kiểu của con trỏ là kiểu của biến mà ô nhớ đó chứa. 
Ví dụ 
int *aPointer; 
int myValue; 
aPointer = &myValue; 
cout<<myValue; //outputs contents of myValue 
cout<<*aPointer; //outputs contents of myValue 
cout<<&myValue; //outputs address of myValue 
cout<<aPointer; //outputs address of myValue 
39 
Con trỏ (Pointers) 
& (address operator) 
Returns memory address of its operand 
Example 
int y = 5; 
int *yPtr; 
yPtr = &y; // yPtr gets address of y - yPtr “points to” y 
*yPtr=9; 
40 
Con trỏ và mảng 
In C++ pointer and arrays are strongly related ( “ array = pointer + memory” ). 
int primes[] = {2, 3, 5, 7, 11 }; 
int *aPr = primes; 
aPr++; 
cout << “The third prime is “ << *(aPr + 2); 
41 
pointer arithmetic 
The * operator accesses the data on the memory address 
Con trỏ hằng 
Con trỏ hằng trỏ tới một địa chỉ ô nhớ cố định. 
Ví dụ 
int main() 
{ 
int x, y; 
// ptr is a constant pointer to an integer that can 
 // be modified through ptr, but ptr always points to the 
 // same memory location. 
int * const ptr = &x; 
//but if int const *ptr=&x then red line is error 
//and magenta line is not error 
*ptr = 7; // allowed: *ptr is not const 
ptr = &y; // error: ptr is const; cannot assign new address 
return 0; // indicates successful termination 
} // end main 
42 
Con trỏ hằng 
int main() 
{ 
int x = 5, y; 
// ptr is a constant pointer to a constant integer. 
// ptr always points to the same location; the integer 
 // at that location cannot be modified. 
 const int *const ptr = &x; 
cout << *ptr << endl; 
*ptr = 7; // error: *ptr is const; cannot assign new value 
ptr = &y; // error: ptr is const; cannot assign new address 
 return 0; // indicates successful termination 
 } // end main 
43 
C++ _Một số mở rộng so với C 
Các từ khóa mới. 
Cách ghi chú (/*...*/ và //) 
Dòng nhập xuất (cin, cout) 
Cách chuyển đổi dữ liệu. 
Khai báo biến 
Cho phép khai báo biến tại vị trí bất kỳ không nhất thiết phải đầu chương trình. 
Biến có hiệu lực từ vị trí được khai báo. 
Hằng const. 
44 
Biến tham chiếu. 
Hai loại biến dùng trong C. 
Biến giá trị 
Biến con trỏ 
Double x, *px; 
X=3.14; 
Px=&x; 
Biến tham chiếu 
Không được cấp phát bộ nhớ; Không có địa chỉ riêng. 
Dùng làm bí danh cho một biến (kiểu giá trị) nào đó và sử dụng vùng nhớ của biến này. 
Vd: float u,v,&r=u; 
Ý nghĩa: 
r dùng chung vùng nhớ của u; 
Trong mọi câu lênh, viết u hay viết r là như nhau. 
45 
Biến tham chiếu. 
Ví dụ: 
int u, v, &r = u; 
r = 10 ; // u=10 
cout << u ; // in ra số 10 
r++ ; // u = 11 
++ u ; // r = 12 
cout << r ; // in ra số 12 
v = r ; // v=12 
& r ; // Cho địa chỉ của u 
Công dụng: 
Thường sử dụng làm đối của hàm. 
Chú ý: 
Trong khai báo phải chỉ rõ tham chiếu đến biến nào. 
Có thể tham chiếu đến một phần tử của mảng hoặc hằng. 
Không khai báo mảng tham chiếu. 
Hằng tham chiếu 
int n = 10 ; 
const int &r = n; 
Không cho phép thay đổi giá trị của hằng. 
46 
Truyền giá trị cho hàm theo tham chiếu 
Trong C: Chỉ cho phép truyền dữ liệu cho hàm theo giá trị. 
Truyền giá trị cho hàm theo tham chiếu 
Dùng đối là biến tham chiếu hoặc hằng tham chiếu. 
Ưu điểm: 
Không cần tạo ra bản sao của tham số ->Tiết kiệm bộ nhớ. 
Hàm sẽ thao tác trực tiếp trên vùng nhớ của tham số -> Dễ dàng thay đổi giá trị của tham số khi cần. 
Ví dụ: 
void HoanVi( double &x, double &y) 
{ 
double tg=x;x=y;y=tg; 
} 
void main() 
{ 
double a,b; 
cin>>a>>b; 
HoanVi(a,b); 
cout<<b<<a; 
} 
47 
Hàm trả về các tham chiếu 
Hàm có thể có kiểu tham chiếu và trả về giá trị tham chiếu 
Ví dụ: 
int z ; 
int &f() // Hàm trả về một bí danh của biến toàn cục z 
{ 
	return z; 
} 
void main(void) 
{ 
f()=50; // z = 50	 
cout <<"\nz= " << z; 
getch(); 
} 
48 
C++ _Một số mở rộng so với C 
Struct và union 
Trong C++ tên của struct và union được xem luôn là tên kiểu giống như khai báo bằng lệnh typedef 
Quy định này cũng áp dụng cho cả union và enum . Tuy nhiên để tương thích với C, C++ vẫn chấp nhận cú pháp cũ 
49 
Trong C, chúng ta có thể có đoạn mã sau : 
struct Complex 
{ 
 float Real; 
 float Imaginary; 
}; 
.. 
struct Complex C 
Trong C++, vấn đề trở nên đơn giản hơn: 
struct Complex 
{ 
float Real; 
float Imaginary; 
}; 
.. 
Complex C; 
C++ _Một số mở rộng so với C 
Toán tử định phạm vi 
Toán tử định phạm vi ký hiệu là :: , nó được dùng truy xuất một phần tử bị che bởi phạm vi hiện thời 
Hàm inline 
Nhược điểm của hàm: Làm chương trình chậm hơn do phải thực hiện một số thao tác khi gọi hàm như: cấp phát vùng nhớ cho biến cục bộ, giải phóng vùng nhớ khi thoát khỏi hàm. 
Dùng hàm inline để khắc phục nhược điểm trên 
Cú pháp: 
inline data_type function_name ( parameters ) 
{ 
} 
Chú ý khai báo hàm inline phải trước lời gọi hàm. 
Nguyên tắc thực hiện: Thay lời gọi hàm bằng đoạn chương trình thực hiện chức năng của hàm. 
50 
C++ _Một số mở rộng so với C Toán tử new và delete 
Trong C tất cả các cấp phát bộ nhớ đều thông qua các hàm calloc(), malloc(), free(). Trong C++ việc cấp phát động bộ nhớ được thực hiện thông qua hai toán tử new và delete. 
Vd: i nt *p; 
	 p = new int 
Nếu toán tử new cấp phát không thành công nó sẽ trả về giá trị null. 
Vừa cấp phát vừa khởi tạo giá trị ô nhớ. 
	 i nt *p; 
	 p = new int(100); // *p=100; 
Toán tử delete thay cho hàm free() của C 
	 delete p; 
Cấp phát một mảng 
int *P; 
P = new int[10]; 
delete []p; 
51 
C++ _Một số mở rộng so với C 
Các giá trị tham số mặc định 
Một trong các đặc tính nổi bật nhất của C++ là khả năng định nghĩa các giá trị tham số mặc định cho các hàm. 
Xét ví dụ 
 	void MyDelay(long Loops); //prototype 
Chẳng hạn muốn gán giá trị mặc định cho tham số Loops là 1000. 
	void MyDelay(long Loops = 1000); //prototype 
Mỗi khi gọi hàm MyDelay() mà không gởi một tham số tương ứng thì trình biên dịch sẽ tự động gán cho tham số Loops giá trị 1000 
52 
C++ _Một số mở rộng so với CPhép nạp chồng 
Nạp chồng hàm 
Dùng cùng một tên để định nghĩa các hàm khác nhau. 
Dùng nạp chồng hàm khi nào? 
Thực hiện công việc như nhau trên các đối tượrg có kiểu khác nhau. 
Ví dụ: 
int TinhMax( int a, int b); 
int TinhMax( int a[], int n); 
Nạp chồng toán tử 
53 
Bài tập 
1. Viết chương trình tính: 
2. Nhập ma trận thực cấp mxn: 
Tìm phần tử lớn nhất 
Sắp xếp tăng dần 
In ma trận sau khi đã sắp xếp. 
3. Xây dựng chương trình thao tác với phân số: nhập, in, tối giản, cộng, tích hai phân số 
4. Xây dựng chương trình thao tác với vec tơ: 
Nhập 2 vec tơ 
In 
Tính tổng, tích hai vectơ 
54 

File đính kèm:

  • pptxbai_giang_ngon_ngu_lap_trinh_c_bai_2_ngon_ngu_c_va_cac_mo_ro.pptx