NGÔN NGỮ LẬP TRÌNH
C/C++
Vũ Song Tùng
1
NỘI DUNG
Đặc điểm của C/C++
3
Các thành phần cơ bản
5
Biểu thức và toán tử
22
Hàm, mảng và con trỏ
45
Kiểu dữ liệu trừu tượng
77
Các cấu trúc dữ liệu cơ bản
123
2
I. Đặc điểm của C/C++
Ngôn ngữ C
• Ngôn ngữ lập trình hàm
• Linh hoạt trong việc sử dụng các kiểu biến
• Truy cập trực tiếp bộ nhớ thông qua các con
trỏ
• Định nghĩa các kiểu biến mới bằng các struct
• Có thể chia nhỏ chương trình thành nhiều
mô-đun
3
I. Đặc điểm của C/C++
Ngôn ngữ C++
•
•
•
•
Kế thừa các đặc điểm của C
Đa hình bằng kỹ thuật xếp chồng (overload)
Hướng đối tượng bằng các lớp (class)
Sử dụng lại các mã bằng kỹ thuật kế thừa
(inheritance)
4
II. Các thành phần cơ bản
Bộ ký tự
Chú thích
Định danh
Hằng
Biến
Vào/ra
5
II. Các thành phần cơ bản
2.1. Bộ ký tự
•
•
•
•
Chữ cái thường : a – z
Chữ cái hoa : A – Z
Chữ số : 0 – 9
Phần lớn các dấu (trừ @ và $)
Ví dụ
# include < iostream >
void m ain()
{
int Arr[] = { 1, 2, 3, 4 };
for (int i= 0; i< 4; i+ + )
std::cout < < Arr[i] < < '\t';
}
6
II. Các thành phần cơ bản
2.2. Chú thích
• Dùng để mô tả một hàm hay một đoạn
chương trình
// H àm tính x^ n
// x - sốốthực, n - sốốnguyên dương
double pow er(double x,int n)
{
/*
double g = 1;
for (int i= 0; i< n; i+ + )
g *= x;
return g;
*/
if (n = = 0)
return 1; // x^ 0 = 1
return x * pow er(x, n - 1);
}
Mô tả hàm
Có thể dùng để bỏ tạm thời một
đoạn chương trình
Làm rõ nghĩa
7
II. Các thành phần cơ bản
2.3. Định danh
• Tên được đặt cho các hàm, các biến, các kiểu dữ liệu v.v…
• Các quy tắc định danh
– Chỉ được dùng các chữ cái, chữ số hoặc dấu gạch nối
– Ký tự đầu tiên không là chữ số
– Không được phép trùng từ khóa
Chú ý. Ngôn ngữ C/C++ phân biệt chữ cái hoa và chữ cái
thường
Ví dụ
void _foo()
// đúng quy cách
{
int so nguyen; // saivìcó chứa dấố
u cách
int soN guyen; // đúng quy cách
}
8
II. Các thành phần cơ bản
2.4. Hằng
• Các giá trị cụ thể trong chương trình
• Có thể là số nguyên, số thực, ký tự hoặc xâu ký tự
Ví dụ
5 // sốốnguyên kiêể
u int
05 // sốốnguyên biêể
u diêễ
n trong hệ 8
0x5
// sốốnguyên biêể
u diêễ
n trong hệ 16
5u // U hoặc u – sốốnguyên kiêể
u unsigned
5l // L hoặc l– sốốnguyên kiêể
u long
5.0 // sốốnguyên kiêể
u double
'5' // ký tự có giá trịsốố(m ã ASCII) bằng 53
'A' // ký tự có giá trịsốố(m ã ASCII) bằng 65
"5" // xấu ký tự gốồ
m ký tự '5'và ký tự N U LL
9
II. Các thành phần cơ bản
2.4. Hằng
Bảng 2.1. Các ký tự đặc biệt
Ký tự
Mô tả
\t
TAB
\n
ENTER
\’
Nháy đơn
\”
Nháy kép
\\
\ (phân biệt với // của đường dẫn)
\0
Ký tự NULL (giá trị bằng 0)
10
II. Các thành phần cơ bản
2.5. Biến
• Là một vùng trong bộ nhớ RAM dùng để lưu
trữ tạm thời các giá trị được xác định bằng
một tên biến
• Phân loại
• Biến đơn
• Biến mảng
• Biến con trỏ
11
II. Các thành phần cơ bản
2.5. Biến
• Cần khai báo biến trước khi sử dụng
kiểể
u tển_biểế
n;
Cú pháp
kiểể
u tển_biểế
n = biểể
u_thức_khởể
i_tạo;
Ví dụ
int a, b = 1; // Khaibáo biêố
n đơn
double A[10];
// Khaibáo biêố
nma
ểng
int *pa = & a;// Khaibáo biêố
n con tro
ể
12
II. Các thành phần cơ bản
2.5. Biến
Bảng 2.2. Các kiểu biến
Kiểu
char
Vùng giá trị
-128 … 127
2
–32,768 … 32,767
4
–2,147,483,648 … 2,147,483,647
4
0 … 4,294,967,295
4
–2,147,483,648 … 2,147,483,647
long long
8
float
4
–9,223,372,036,854,775,808 …
9,223,372,036,854,775,807
±3.4E±38
double
8
±1.7E±308
long double
8
±1.7E±308
short
int
Số
nguyê unsigned
n
long
Số
thực
Kích thước
(byte)
1
13
II. Các thành phần cơ bản
2.5. Biến
• Một vài chú ý
Ví dụ
void m ain()
{
int x = 10, y;
// Các biêể
u thức
Trong một khối {…}, các tên biến phải khác nhau
for (int i= 0; i< 4; i+ + )
{
Cùng một tên biến có thể khai báo trong các khối {…}
int x = 5;
khác nhau
// Các biêể
u thức
}
int y;
}
error C2086: 'int y' : redefinition
14
II. Các thành phần cơ bản
2.5. Biến
• Một vài chú ý
• Kích thước của các kiểu phụ thuộc vào hệ thống mà
chương trình được biên dịch
• Dùng toán tử sizeof(...) để lấy kích thước của
một kiểu, một hằng hay một biến
// Chương trình W in32 Console Application
int sz;
sz = sizeof(sz);
// sz = 4
sz = sizeof(long long); // sz = 8
sz = sizeof("12345"); // sz = 6
15
II. Các thành phần cơ bản
2.5. Biến
• Kiểu liệt kê
• Dùng để định danh cho các giá trị kiểu int
enum tển_kiểể
u { danh sách tển };
Ví dụ
enum Boolean { False, True };
// False = 0, True = 1
enum Keys { Enter = 13, Escape = 27, A = 65, B, C };
// B = 66, C = 67
16
II. Các thành phần cơ bản
2.6. Vào/ra
Dùng các chuẩn vào/ra trong thư viện iostream để
làm việc với màn hình và bàn phím
– Chuẩn vào (cin) sử dụng toán tử luồng vào (>>)
– Các chuẩn ra (cout, cerr) sử dụng toán tử luồng ra (<<)
Ví dụ
double a, b, c;
cout < < "N hap a, b,c: ";
cin > > a > > b > > c; // D ùng dấố
u cách, TAB hoặc EN TER đêểphấn biệt các luốồ
ng
if (a != 0)
{
cout < < "delta = " < < b*b - 4*a*c < < '\n';
// Các biêể
u thức
}
else
cerr < < "a phaikhac 0.\n";
17
II. Các thành phần cơ bản
Giải phương trình bậc 2
Yêu cầu bài toán
• Nhập các hệ số a, b, c từ bàn phím
• Nếu a ≠ 0 thì
– Tính
– In kết quả ra màn hình với các trường hợp
• > 0 X1 = …, X2 = …
• = 0 X1 = X2 = …
• < 0 Vo nghiem.
18
II. Các thành phần cơ bản
Giải phương trình bậc 2
PhuongTrinhBac2.cpp
# include < iostream >
using nam espace std;
// thư viện vào/ra
// nơikhaibáo các thành phấồ
n chuấể
n
void m ain()
{
double a, b, c;
cout < < "N hap a, b,c: "; cin > > a > > b > > c;
if (a != 0) {
// Đ oạn biêể
u thức gia
ểivà biện luận phương trình //
}
else
cerr < < "H e so a phaikhac 0.";
cout < < endl;
system ("pause");
// in ký tự xuốố
n g dòng
// tạm dừng m àn hình
}
19
II. Các thành phần cơ bản
Giải phương trình bậc 2
PhuongTrinhBac2.cpp
// G ia
ểivà biện luận phương trình
double d = b*b - 4*a*c;
if (d > = 0)
{
if (d > 0)
{
cout < < "X1 = " < < (-b - sqrt(d)) / (2 * a) < < ", X2 = "
< < (b - sqrt(d))/(2 * a);
}
else
cout < < "X1 = X2 = " < < -b / (2 * a);
} // if (d > = 0)
else
cout < < "Vo nghiem .";
20
II. Các thành phần cơ bản
Bài tập
• Tạo project PhuongTrinhBac2 trên Visual
Studio .NET và kiểm tra với các hệ số:
– a = 1, b = 2, c = 1
– a = 1, b = 2, c = 3
– a = 1, b = 3, c = 2
• Tối ưu đoạn mã giải phương trình bậc 2
Gợi ý. Giảm số lượng các biểu thức 2 * a và sqrt(d)
21
III. Biểu thức và toán tử
Biểu thức
Các toán tử đơn
Các toán tử có cấu
trúc
22
III. Biểu thức và toán tử
3.1. Biểu thức
• Tập hợp của các toán hạng và toán tử
• Kết thúc bằng dấu chấm phảy
• Có thể rỗng
Ví dụ
(-b – sqrt(d)) / (2 * a)
Các toán tưể
: () - / *
Các toán hạng:
Biêố
n: a, b, d
Hằng: 2
Hàm: sqrt
23
III. Biểu thức và toán tử
3.2. Các toán tử đơn
Bảng 3.1. Phân loại các toán tử đơn
Nhóm
Gán
Các toán tử
Ghi chú
Số học
+
Tăng/Giảm
++
--
So sánh
==
!=
>
Kiểm tra
?:
Logic
&&
||
!
Xử lý bit
&
|
~
Con trỏ
&
*
new
Truy cập thành viên
::
.
Các loại khác
{}
()
=
-
*
/
^
Có thể kết hợp với =
%
<
>=
<=
Cho giá trị 0 hoặc 1
Cho giá trị 0 hoặc 1
<<
>>
Có thể kết hợp với =
delete
->
[]
,
Thứ tự ưu tiên các toán tử tham khảo tại
/>24
III. Biểu thức và toán tử
3.2. Các toán tử đơn
• Toán tử gán:
Cú pháp
lvalue = rvalue
lvalue – tên_biêố
n, rvalue – một biêể
u thức
Ví dụ
a = 5;
// gán 5 vào a
a = b = c = 5; // tương đương: c = 5; b = c; a = b;
a = b + (c = 5);// tương đương: c = 5; a = b + c;
25