You are on page 1of 172

Chapter 0

C++ Programming

Trần Giang Sơn

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 1
© 2016
PHẦN 1

Kiến thức cơ bản

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 2 2
© 2016
Nội dung
• Giới thiệu
• Chương trình C/C++ đơn giản
• Chương trình tính toán đơn giản
• Sử dụng thư viện math.h
• Quiz

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 3
© 2016
Giới thiệu
• Cách học lập trình cũng như học một thứ
tiếng
• Ban đầu, bằng cách học máy móc một số
chương trình mẫu
• Sửa đổi, hoặc thêm bớt trong chương trình
mẫu
• Thường xuyên xảy ra sai sót  phải biết cách
sửa lỗi
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 4
© 2016
Chương trình C++ đơn giản

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 5
© 2016
Chương trình C++ đơn giản
• Khai báo thư viện sẽ được sử dụng
– Chỉ thị #include:
• Hàm main có sử dụng (gọi) đến hai hàm cout và system.
• Hàm cout được khai báo trong thư viện iostream
• Hàm system được khai báo trong thư viện stdlib, cụ thể
là tập tin <stdlib.h>
• Do đó, cần dùng chỉ thị #include với hai thư viện nói
trên để khi biên dịch không báo lỗi

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 6
© 2016
Chương trình C++ đơn giản
• Lệnh được thực thi đầu tiên
– Lệnh đầu tiên ngay sau hàm main()
– Mỗi chương trình viết bằng C/C++ phải có một
hàm có tên main

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 7
© 2016
Chương trình C++ đơn giản
• Chú thích
– Chú thích là văn bản không cần có văn phạm của
C/C++.
– Chú thích được chèn vào nhằm giải thích, ghi chú,
đánh dấu, hay lập tài liệu cho chương trình C/C++.
– Hai dạng chú thích:
• Chú thích gồm nhiều dòng, nằm giữa cặp đánh dấu “/*”
và “*/”
• Chú thích đến cuối dòng, đánh dấu bởi “//”

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 8
© 2016
Chương trình tính toán đơn giản

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 9
© 2016
Chương trình tính toán đơn giản

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 10
© 2016
Chương trình tính toán đơn giản
int grade1;
int grade2;
int total;
int average;

grade1 = 85;
grade2 = 97;
total = grade1 + grade2;
average = total/2;
cout << "The average grade is: " << average << endl;

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 11
© 2016
Chương trình tính toán đơn giản
 Danh hiệu(hay định danh): là tên hợp lệ trong ngôn ngữ, dùng để đặt tên
cho biến, hàm.
 Thành phần: gồm chữ cái, số và gạch dưới (_), không bắt đầu bằng số và
không có khoảng trắng
– Welcome1, idenfier, _value, m_inputField1
 Quy ước cho danh hiệu: Xem tài liệu
Đặt tên có ý nghĩa, dễ hiểu, đừng nên dài quá
Viết hoa chữ cái đầu tiên: MonthlySalary
Dùng gạch nối: monthly_salary
 Danh hiệu nào sau đây hợp lệ:
DegToRad, %x1, %my_var, intersect, addNums, @x2, _density
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 12
© 2016

Chương
Bảng từ khóa
trình tính toán đơn giản

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 13
© 2016
Chương trình tính toán đơn giản
• Kiểu dữ liệu:
– Tập các giá trị
– Tập các phép toán

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 14
© 2016
Chương trình tính toán đơn giản
• Kiểu dữ liệu trong C/C++

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 15
© 2016
Chương trình tính toán đơn giản
• Phép toán số học

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 16
© 2016
Chương trình tính toán đơn giản
• Phép chia số nguyên cho ra kết quả là phần
thương của hai số.
– 7 / 4 cho ra 1 (nếu viết 7.0 / 4 hoặc 7 / 4.0
hoặc 7.0 / 4.0 kết quả sẽ bằng 1.75)
– 17 / 5 cho ra 3
• Phần thập phân bị cắt đi, chứ không phải làm
tròn
• Phép chia lấy số dư (%) : hai toán hạng là số
nguyên
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 17
© 2016
Chương trình tính toán đơn giản
int grade1;
int grade2;
int total;
int average;

cin >> grade1;


cin >> grade2;
total = grade1 + grade2;
average = total/2;
cout << "The average grade is: " << average << endl;

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 18
© 2016
Chương trình tính toán đơn giản

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 19
© 2016
Chương trình tính toán đơn giản
int grade1, grade2, total, average;

cout << "Input grade 1: ";


cin >> grade1;
cout << "Input grade 2: ";
cin >> grade2;
total = grade1 + grade2;
average = total/2;
cout << "The average grade is: " << average << endl;

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 20
© 2016
Chương trình tính toán đơn giản

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 21
© 2016
Sử dụng thư viện math.h
• Yêu cầu của chương trình:
– Đọc hai số x và y là tọa độ trong không gian 2D.
– Tính và in ra khoảng cách từ tâm hệ trục tọa độ
đến điểm (x,y)
• Dùng thư viện toán học, cần chèn tập tin
<math.h>
• sqrt(.): tính căn bậc hai của giá trị được truyền
vào và trả về kết quả
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 22
© 2016
Sử dụng thư viện math.h

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 23
© 2016
Sử dụng thư viện math.h

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 24
© 2016
Sử dụng thư viện math.h
• Một số hàm trong thư viện math.h
Function Name Description Return Value
---------------------------------------------------------------------------------------------
abs(a) Absolute value Same data type as argument
log(a) Natural logarithm double
sin(a) sine of a (a in radians) double
cos(a) cosine of a (a in radians) double
tan(a) tangent of a (a in radians) double
log10(a) common log (base 10) double
pow(a1,a2) a1 raised to the a2 power double
exp(a) ea double
sqrt(a) square root of a double

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 25
© 2016
Quiz 1+Lab 1

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 26 26
© 2016
PHẦN 2

Cấu trúc lựa chọn

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 27 27
© 2016
Giới thiệu
• Thông thường, câu lệnh thực hiện theo trình
tự từ trên xuống, thực thi tuần tự
• Có ba cấu trúc điều khiển thứ tự thực thi
chính
– Cấu trúc tuần tự (sequence structure)
– Cấu trúc lựa chọn (selection structure)
– Cấu trúc lặp (repetition structure)

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 28 28
© 2016
Giới thiệu
• Câu lệnh lựa chọn có 3 loại:
– Câu lệnh lựa chọn đơn
Chọn hoặc không chọn thực hiện hành động
– Câu lệnh lựa chọn kép
Chọn giữa hai hành động để thực hiện
– Câu lệnh đa lựa chọn
Chọn một trong nhiều hành động khác nhau

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 29 29
© 2016
Giới thiệu
• Quy trình giải quyết vấn đề gồm:
– Xác định các hành động cần làm
– Thứ tự thực hiện các hành động đó
Ví dụ:
1. Ra khỏi giường 5. Ăn sáng
2. Thay đồ ngủ 6. Đi học
3. Đi tắm 7. Nếu trời không mưa thì đi chơi
4. Mặc đồ đi làm 8. Học bài

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 30 30
© 2016
Câu lệnh lựa chọn đơn
• Nếu điểm số từ 5 điểm trở lên, in ra thông báo
“Passed” (Đã đậu).
• Mã giả:
kiểm tra nếu điểm lớn hơn hoặc bằng 5
in “Đã đậu”
• Mã C/C++:
if (grade >= 5)
printf("Passed");

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 31 31
© 2016
Câu lệnh lựa chọn đơn

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 32 32
© 2016
Câu lệnh lựa chọn đơn
• Cú pháp
if (biểu thức điều kiện)
câu lệnh;
• Sơ đồ khối

false
<biểu thức điều kiện>

true

<câu lệnh>

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 33 33
© 2016
Câu lệnh lựa chọn đơn
false
grade >= 5

true
In “Passed”

• Biểu thức điều kiện là biểu thức mang giá trị


đúng hoặc sai.
• Câu lệnh if ra quyết định dựa trên giá trị của
biểu thức điều kiện.
• Nếu biểu thức điều kiện là đúng, thân câu lệnh if
sẽ thực hiện. Nếu sai, thì không thực hiện.
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 34 34
© 2016
Câu lệnh lựa chọn đơn
• Cấu trúc của biểu thức điều kiện:
biểu thức số học toán tử so sánh biểu thức số học
Ví dụ: grade >= 5
• Toán tử so sánh
– Toán tử so sánh được sử dụng để so sánh hai toán
hạng, xem chúng bằng nhau hay khác nhau, hay toán
hạng thứ nhất lớn hơn toán hạng thứ hai, hoặc ngược
lại.
– Phép toán so sánh sẽ trả về giá trị đúng (true) hoặc sai
(false).
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 35 35
© 2016
Câu lệnh lựa chọn đơn
• Danh sách các toán tử so sánh
Toán tử Mô tả Ví dụ
-----------------------------------------------------------------------------------
== bằng a ==‘y’
!= không bằng m!= 5
> lớn hơn a*b > 7
< nhỏ hơn b<6
<= nhỏ hơn hoặc bằng b <= a
>= lớn hơn hoặc bằng c >= 6

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 36 36
© 2016
Câu lệnh lựa chọn đơn
• Tính toán giá trị biểu thức điều kiện
Ví dụ:
char key = ‘m’;
int i = 5, j = 7, k = 12;
double x = 22.5;

Biểu thức Biểu thức tương đương Giá trị


-----------------------------------------------------------------------------------
i + 2 == k-1 (i + 2) = = ( k –1) false
‘a’ +1 == ‘b’ (‘a’ +1) = = ‘b’ true
25 >= x + 1.0 25 >= (x + 1.0) true
key –1 > 20 (key –1) > 20 true
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 37 37
© 2016
Câu lệnh lựa chọn đơn
• key = ‘m’

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 38 38
© 2016
Câu lệnh lựa chọn kép
• Hành động 1 được thực hiện khi biểu thức
điều kiện đúng, và hành động 2 được thực
hiện khi biểu thức điều kiện sai
nếu điểm lớn hơn hoặc bằng 5
in “Đã đậu”
ngược lại
in “Đã rớt”

if (grade >= 5)
printf("Passed");
else
printf("Failed");

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 39 39
© 2016
Câu lệnh lựa chọn kép

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 40 40
© 2016
Câu lệnh lựa chọn kép
• Cú pháp
if (<biểu thức điều kiện>)
<câu lệnh T>; if (<biểu thức điều kiện>) <câu lệnh T>;
else else <câu lệnh F>;
<câu lệnh F>;

• Sơ đồ khối
false
<biểu thức điều kiện>

true
<câu lệnh T> <câu lệnh F>

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 41 41
© 2016
START
Câu lệnh lựa chọn kép
• Viết chương trình tính thuế
Input
taxable

Yes – Nhập vào thu nhập


taxable <=
CUTOFF?
– Căn cứ vào giá trị thu nhập
No để tính giá trị thuế tương
taxes = HIGHRATE*(taxable – ứng
CUTOFF) + FIXEDAMT

taxes = LOWRATE*taxable
– CUTOFF = 20000.0
– LOWRATE = 0.02
Output
– HIGHRATE = 0.025
taxes
– FIXEDAMT = 400
END

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 42 42
© 2016
Câu lệnh lựa chọn kép

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 43 43
© 2016
Khối lệnh
if ( grade >= 5 )
cout << "Passed" << endl;
else
{
cout << "Failed" << endl;
cout << "You must take this course again ";
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 44 44
© 2016
Khối lệnh
if ( grade >= 5 )
{
cout << "Passed" << endl;
cout << “Congratulation";
}
else
{
cout << "Failed" << endl;
cout << "You must take this course again";
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 45 45
© 2016
Câu lệnh đa lựa chọn
• Từ điểm số
in ra xếp loại

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 46 46
© 2016
Câu lệnh đa lựa chọn
Đầu vào: điểm

false false false false


diem < 5 diem < 6.5 diem < 8 diem < 9.5

true true true true

loai = “G” loai = “XS”


loai = “K”

loai = “TB”
loai = “Y”

Đầu ra: loại


Các câu lệnh con lồng bên trong khi
điều kiện (diem<5) bị sai
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 47 47
© 2016
Câu lệnh đa lựa chọn
• Cú pháp: có nhiều cách viết

if (<biểu thức điều kiện 1>) <Câu lệnh thực thi 1>
else if (<biểu thức điều kiện 2>) <Câu lệnh thực thi 2>
else if (<biểu thức điều kiện 3>) <Câu lệnh thực thi 3>
else <Câu lệnh thực thi 4>

if (<biểu thức điều kiện 1>)


<Câu lệnh thực thi 1>
else if (<biểu thức điều kiện 2>)
<Câu lệnh thực thi 2>
else if (<biểu thức điều kiện 3>)
<Câu lệnh thực thi 3>
else
<Câu lệnh thực thi 4>
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 48 48
© 2016
Câu lệnh đa lựa chọn

if (<biểu thức điều kiện 1>) <Câu lệnh thực thi 1>
else if (<biểu thức điều kiện 2>) <Câu lệnh thực thi 2>
else if (<biểu thức điều kiện 3>) <Câu lệnh thực thi 3>
else <Câu lệnh thực thi 4>

if (<biểu thức điều kiện 1>)


<Câu lệnh thực thi 1>
else if (<biểu thức điều kiện 2>)
<Câu lệnh thực thi 2>
else if (<biểu thức điều kiện 3>)
<Câu lệnh thực thi 3>
else
<Câu lệnh thực thi 4>

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 49 49
© 2016
Câu lệnh đa lựa chọn
if (expression 1)
statement 1 // thực hiện nếu expression 1 = true
else if (expression 2)
statement 2 //thực hiện nếu expression 1 = false và
else expression 2 = true
statement 3 //thực hiện nếu expression 1 = false và
expression 2 = false

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 50 50
© 2016
Câu lệnh đa lựa chọn
• Giải phương trình bậc hai: ax2 + bx + c = 0
– Nhập hệ số a, b, c
– Tính delta = b2 – 4ac
– Nếu delta = 0
• X1 = X2 = -b/(2a)
– Nếu delta > 0
• X1 = (-b + square(delta))/(2a)
• X2 = (-b - square(delta))/(2a)
– Nếu delta < 0
• Vô nghiệm

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 51 51
© 2016
Câu lệnh đa lựa chọn
#include <math.h>

float a, b, c, delta, x1, x2;

cout << "Nhap he so a, b, c: ";


cin >> a >> b >> c
delta = b*b - 4*a*c;

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 52 52
© 2016
Câu lệnh đa lựa chọn
if(delta == 0) {
x1 = -b/(2*a);
x2 = -b/(2*a);
cout << "Phuong trinh co nghiem kep x = “ << x1;
}
else if(delta > 0){
x1 = (-b + sqrt(delta))/(2*a);
x2 = (-b - sqrt(delta))/(2*a);
cout << "Phuong trinh co 2 nghiem x1 = “ << x1
<< “ x2 = “ << x2;
}
else
cout << "Phuong trinh vo nghiem";
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 53 53
© 2016
Toán tử logic

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 54 54
© 2016
Toán tử logic
• Bảng chân trị của toán tử logic
– OR (||)

– AND (&&)

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 55 55
© 2016
Toán tử logic
• Bảng chân trị của toán tử logic
– NOT (!)

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 56 56
© 2016
Toán tử logic
• Toán tử AND
– Khi hai biểu thức con cùng true thì giá trị biểu thức tổng
hợp mới nhận giá trị true.
– Khi một trong hai biểu thức con là false thì giá trị biểu
thức tổng hợp là false.

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 57 57
© 2016
Toán tử logic
• Toán tử logic OR
– Thực thi nếu chỉ cần một trong hai điều kiện là true
if ( ( semesterAverage >= 90 ) || ( finalExam >= 90 ) )
printf( "Student grade is A" );

– Khi cả hai điều kiện đều sai thì mới không thực thi
câu lệnh in.
– Toán tử && có độ ưu tiên cao hơn toán tử ||, đều
kết hợp từ trái qua

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 58 58
© 2016
Ví dụ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 59 59
© 2016
Ví dụ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 60 60
© 2016
Ví dụ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 61 61
© 2016
Ví dụ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 62 62
© 2016
Ví dụ
• Tìm số lớn nhất trong 3 số

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 63 63
© 2016
Ví dụ
• Tìm số lớn nhất trong 3 số

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 64 64
© 2016
Ví dụ
• Tìm số lớn nhất trong 3 số (sử dụng hàm có sẵn)

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 65 65
© 2016
Câu lệnh switch-case
• Nhập một số (trong phạm vi từ 1 đến 5) sau đó in ra từ tiếng Anh
tương ứng.
• 1 (one), 2 (two), 3 (three), 4 (four), 5 (five)

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 66 66
© 2016
Câu lệnh switch-case

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 67 67
© 2016
Câu lệnh switch-case

A 9, 10
B 8

C 7

D 6

F 0, 1, 2, 3, 4, 5

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 68 68
© 2016
Câu lệnh switch-case

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 69 69
© 2016
Câu lệnh switch-case

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 70 70
© 2016
Quiz 2 + Lab 2

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 71 71
© 2016
PHẦN 3
Cấu trúc lặp

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 72 72
© 2016
Cấu trúc lặp là gì?
• Các cấu trúc điều khiển
– Tuần tự:
• Bản chất của chương trình là tuần tự, hết lệnh này
đến lệnh khác
– Rẽ nhánh
• Để chọn thực thi một số phát biểu
• Đã học – chương trước
– Lặp
• Thực thi một công việc nhiều lần.

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 73 73
© 2016
Cấu trúc lặp là gì?
• In ra 5 dòng chữ “Hello”
cout << "Hello“ << endl;
cout << "Hello“ << endl;
cout << "Hello“ << endl;
cout << "Hello“ << endl;
cout << "Hello“ << endl;
• In ra 100 dòng chữ “Hello”

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 74 74
© 2016
Cấu trúc lặp là gì
• Bài toán: Nhập và tính tổng điểm của 10 sinh viên
• float a;
float sum = 0;

cin >> a;
sum = sum + a;

cin >> a;
sum = sum + a;
…………………………………
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 75 75
© 2016
Cấu trúc lặp là gì
• Chương trình sẽ rất dài nếu yêu cầu nhập và
tính tổng điểm cho 100, 200, 1000 sinh viên
v.v.
• Để ý thấy chương trình trên lặp đi lặp lại động
tác sau nhiều lần:
cin >> a;
sum = sum + a;

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 76 76
© 2016
Cấu trúc lặp là gì
• C/C++ cho phép sử dụng 3 loại vòng lặp với cú
pháp như sau:
– Vòng lặp while

while (condition) statement;

– Vòng lặp do
do statement while (condition);
– Vòng lặp for
for (initopt ; condopt ; loopopt ) statement;

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 77 77
© 2016
Câu lệnh while

false
<điều kiện>

true
<câu lệnh>

<điều kiện>:
Là biểu thức luận lý hay chuyển đổi qua luận lý được
<câu lệnh>:
Là câu lệnh đơn hay phức

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 78 78
© 2016
Câu lệnh while
• Cú pháp while(<điều kiện>){
while(<điều kiện>) <câu lệnh 1>;
<câu lệnh>; <câu lệnh 2>;
<câu lệnh N>;
}
 Nguyên tắc thực thi
 Chương trình kiểm tra biểu thức điều kiện
 Nếu điều kiện là true
 Thực thi câu lệnh

 Quay lên kiểm tra điều kiện

 Ngược lại, (là false) kết thúc lệnh lặp


 Lưu ý: Thân vòng lặp phải có phép toán thay đổi biểu thức điều kiện
để chương trình không lặp vô hạn
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 79 79
© 2016
Câu lệnh while

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 80 80
© 2016
Câu lệnh while
• Bài toán:
– Cần nhập 10 giá trị số thực, sau đó tính giá trị trung
bình của 10 giá trị trên

gán total (tổng điểm) bằng 0


gán counter (biến đếm số lần nhập điểm) bằng 1

while counter nhỏ hơn hoặc bằng 10


yêu cầu người dùng nhập giá trị tiếp theo
đọc giá trị
cộng giá trị này vào total
tăng counter lên 1

giá trị trung bình bằng total chia cho 10


in giá trị trung bình

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 81 81
© 2016
Câu lệnh while

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 82 82
© 2016
Câu lệnh while

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 83 83
© 2016
Toán tử gán phức

total += val;

counter += 1;

counter ++;

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 84 84
© 2016
Câu lệnh do..while

<câu lệnh>

true
<điều kiện>

false

<điều kiện>:
Là biểu thức luận lý hay chuyển đổi qua luận lý được
<câu lệnh>:
Là câu lệnh đơn hay phức

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 85 85
© 2016
Câu lệnh do..while
• Nguyên tắc thực thi
– (1) Chương trình thực thi ngay <câu lệnh>
• Do đó, <câu lệnh> được thực thi ít nhất 01 lần
• Sau khi thực thi xong, chương trình đánh giá biểu
thức điều kiện và kiểm tra
– (2) Nếu điều kiện là true
• Đi đến bước (1) để thực thi <câu lệnh>
– (3) Ngược lại, (false) thì vòng lặp kết thúc

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 86 86
© 2016
Câu lệnh do..while
do{ do
<câu lệnh>; <câu lệnh>;
} while <điều kiện>) while <điều kiện>)

do{
<câu lệnh 1>;
<câu lệnh 2>;
<câu lệnh N>;

} while <điều kiện>)

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 87 87
© 2016
Câu lệnh do..while

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 88 88
© 2016
Câu lệnh for

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 89 89
© 2016
Câu lệnh for

<khởi tạo>

false
<điều kiện>

true

<câu lệnh> <thay đổi giá trị>

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 90 90
© 2016
Câu lệnh for
• Nguyên tắc thực thi
– (1) Chương trình sẽ khai báo và khởi tạo các
biến trong trong <khởi tạo> và kiểm tra biểu
thức điều kiện
– (2) Nếu <điều kiện> là true
• Thực hiện câu lệnh <câu lệnh>
• Thực thi các thay đổi trong <thay đổi giá trị>
• Kiểm tra lại điều kiện ở Bước (2) ở trên
– (3) Ngược lại
• Kết thúc vòng lặp, đi đến câu lệnh theo sau câu lệnh
lặp này
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 91 91
© 2016
Câu lệnh for
for (<khởi tạo>; <điều kiện>; <thay đổi giá trị>)
<câu lệnh>;

for (<khởi tạo>; <điều kiện>; <thay đổi giá trị>) {


<câu lệnh>
}

for (<khởi tạo>; <điều kiện>; <thay đổi giá trị>)


{
<câu lệnh 1>;
<câu lệnh 2>;
<câu lệnh N>;
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 92 92
© 2016
Câu lệnh for

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 93 93
© 2016
Câu lệnh for
• Gửi 1000 $ vào ngân hàng với lãi suất 5%. Biết
rằng số tiền nhận được sau mỗi năm tính theo
công thức:
a = p(1 + r)n
• Với p là số tiền gốc ban đầu, r là lãi suất, n là
số năm
• Hãy in ra số tiền trong 10 năm đầu

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 94 94
© 2016
Câu lệnh for

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 95 95
© 2016
Câu lệnh for

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 96 96
© 2016
Câu lệnh for
• C/C++ cung cấp lệnh break và continue để
thay đổi dòng điều khiển
• break có thể dùng để dừng thực thi lệnh
switch
• break còn dùng để dừng các câu lệnh lặp

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 97 97
© 2016
Câu lệnh for
• Dùng break trong while, for, do...while, switch để thoát
lập tức khỏi vòng lặp
• Thực hiện lệnh kế tiếp sau vòng lặp
• Chủ yếu để thoát sớm khỏi vòng lặp

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 98 98
© 2016
Câu lệnh for
• Dùng continue trong while, for, do...while
• Bỏ các câu lệnh còn lại trong thân vòng lặp
• Thực hiện lần lặp tiếp theo
• while và do...while: kiểm tra điều kiện ngay
• for: tăng biến đếm, rồi kiểm tra điều kiện

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 99 99
© 2016
Các lệnh lặp lồng nhau
• In ra 10 dòng chữ, mỗi dòng có 10 chữ “Hello”

for(int i = 1; i<=100; i++)


cout << "Hello ";

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 100 100
© 2016
Các lệnh lặp lồng nhau
for(int i = 1; i<=100; i++) {
cout << "Hello ";
if(i % 10 == 0)
cout << endl;
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 101 101
© 2016
Các lệnh lặp lồng nhau
for(int i = 1; i<=10; i++){
for(int j = 1; j<= 10; j++)
cout << "Hello ";

cout << endl;


}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 102 102
© 2016
Các lệnh lặp lồng nhau
• In 10 dòng:
– Dòng thứ nhất có 1 số 1
– Dòng thứ hai có 2 số 2
– Dòng thứ ba có 3 số 3
– ………………………….
– Dòng thứ mười có 10 số 10

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 103 103
© 2016
Các lệnh lặp lồng nhau
for(int i = 1; i<=10; i++) {
for(int j = 1; j<= i; j++)
cout << i << “ “;

cout << endl;


}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 104 104
© 2016
Các lệnh lặp lồng nhau
• Có thể sử dụng các lệnh for, while, do … while
lồng nhau
• Số cấp lồng nhau có thể tùy ý
• Có thể sử dụng các lệnh for, while, do … while
hỗn hợp với nhau

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 105 105
© 2016
Quiz 3 + Lab 3

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 106 106
© 2016
PHẦN 4
Cấu trúc, mảng, chuỗi, con trỏ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 107 107
© 2016
Cấu trúc
• Tính khoảng cách giữa 2 điểm

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 108 108
© 2016
Cấu trúc

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 109 109
© 2016
Cấu trúc

• Cấu trúc là gì
– Là một kiểu dữ liệu mô tả một tổ hợp của các kiểu dữ
liệu thành phần khác. Các kiểu dữ liệu thành phần có
thể có cùng kiểu hay khác kiểu, thậm chí là một kiểu
cấu trúc khác.

– Một mở rộng của kiểu này (struct) là kiểu lớp (class)


trong các ngôn ngữ lập trình hướng đối tượng

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 110 110
© 2016
Cấu trúc
• Sự cần thiết
– Bài toán: Quản lý sinh viên
• Mỗi sinh viên, chương trình cần lưu và xử lý các
mảnh dữ liệu sau
– Mã số sinh viên
– Họ tên sinh viên
– Ngày sinh
– Địa chỉ
– Số điện thoại
– Email
– V.v

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 111 111
© 2016
Cấu trúc
• Sự cần thiết
– Bài toán: Quản lý sinh viên
• Nếu chỉ sử dụng các kiểu cơ bản để lưu trữ tạm
một sinh viên trong bộ nhớ.
– Người lập trình cần khai báo NHIỀU biến đơn lẻ, mỗi cho
một mảnh dữ liệu của sinh viên
– => Quá bất tiện: dài dòng, khó hiểu, v.v
– => Khi cần vài sinh viên trong bộ nhớ: các dòng khai báo
biến đã chiếm một vùng lớn mã nguồn!

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 112 112
© 2016
Cấu trúc
• Sự cần thiết
– Bài toán: Quản lý sinh viên
– Tương tự cho hầu hết bài toán trong thực tế
• Thông tin một điểm hay vector trong chương trình
• Thông tin một sản phẩm, hàng hoá trong siêu thị
• V.v.

– Giải pháp cho các trường hợp như vậy


• GOM tất cả các dữ liệu có quan hệ với nhau thành một
khối
– Luôn luôn cấp phát CÙNG NHAU, LIÊN TỤC trong bộ nhớ
– Luôn luôn được huỷ khỏi bộ nhớ CÙNG NHAU
– Các mảnh dữ liệu thành phần có thể truy xuất độc lập,
thông quan tên gọi của nó.

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 113 113
© 2016
Cấu trúc
• Sự cần thiết
– Giải pháp cho các trường hợp như vậy
• GOM tất cả các dữ liệu có quan hệ với nhau thành
một khối
– Luôn luôn cấp phát CÙNG NHAU, LIÊN TỤC trong bộ
nhớ
– Luôn luôn được huỷ khỏi bộ nhớ CÙNG NHAU
– Các mảnh dữ liệu thành phần có thể truy xuất độc lập,
thông quan tên gọi của nó.

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 114 114
© 2016
Mảng
Bài toán: Nhập vào 5 số thực, sau đó, lưu số lớn nhất vào
n1, số lớn thứ hai vào n2, v.v, số bé nhất vào n5.
float n1, n2, n3, n4, n5;
cin >> n1 >> n2 >> n3 >> n4 >> n5;

//Đoạn mã sắp xếp

cout << n1 << “ ” << n2 << “ ” << n3 << “ ”


<< n4 << “ ” << n5 << “ ”;

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 115 115
© 2016
Mảng
• Mở rộng bài toán trên cho trường hợp n =
100, n = 1000 số v.v.

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 116 116
© 2016
Mảng
int main(){
int a[6];
int b[6] = {10, 20, 30};
int c[6] = {10, 20, 30, 40, 50, 60};

return 0;
}

• a: mảng của 6 số nguyên


– Giá trị từng phần tử chưa xác định
• b: mảng của 6 số nguyên
– Giá trị 3 phần tử đầu là: 10, 20, và 30
– Giá trị 3 phần tử sau chưa xác định
• c: mảng của 6 số nguyên
– Giá trị các phần tử lần lượt là: 10, 20, 30, 40, 50, và 60

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 117 117
© 2016
Mảng
• Truy xuất phần tử của mảng:
– Sử dụng tên mảng và chỉ số. Chỉ số bắt đầu từ 0.

int main(){
int c[6] = {10, 20, 30, 40, 50, 60};
int id = 0;
/*Write to element*/
c[3] = 99;
c[id + 1] = 100;
/*Read and print element*/
cout << c[3];
cout << c[id + 1];
return 0;
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 118 118
© 2016
Mảng

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 119 119
© 2016
Mảng
float n[5];
for (int i = 0; i<5; i++) cin >> n[i];

//Đoạn mã sắp xếp

cout << n[i] << “ ”;

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 120 120
© 2016
Chuỗi
• Trong C++, chuỗi là mảng của các ký tự trong
chuỗi và kết thúc bằng ký tự đặc biệt là ‘\0’
• => Mảng có kích thước N phần tử chỉ có thể
chứa tối đa (N-1) ký tự
• Ví dụ: chuỗi “LAP TRINH”
– Chiều dài: 9 ký tự
– Số lượng ô nhớ cần thiết: 10

’L’ ’A’ ’P’ ’ ’ ’T’ ’R’ ’I’ ’N’ ’H’ ’\0’

Chuỗi kết thúc bằng ký tự đặc biệt

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 121 121
© 2016
Chuỗi
#include <stdio.h>
#include <stdlib.h>

int main(){
const int MAX_LEN = 50;
char s1[MAX_LEN];
char s2[MAX_LEN] =
{'L', 'A', 'P', ' ', 'T', 'R', 'I', 'N', 'H', '\0'};
char s3[MAX_LEN] = "LAP TRINH";
char s4[] =
{'L', 'A', 'P', ' ', 'T', 'R', 'I', 'N', 'H', '\0'};
char s5[] = "LAP TRINH";

cout << s2 << endl << s3 << endl << s4 << endl << s5;
return 0;
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 122 122
© 2016
Chuỗi
• Thư viện string.h chứa các hàm xử lý chuỗi
Hàm Công dụng
strlen Lấy chiều dài chuỗi
strcpy Copy một chuỗi sang chuỗi khác
strcmp So sánh hai chuỗi
strstr Tìm chuỗi con trong một chuỗi

Xem chi tiết tại:


http://www.cplusplus.com/reference/cstring/

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 123 123
© 2016
Con trỏ
• Biến con trỏ: dùng để chứa địa chỉ của biến
khác.
• Ứng dụng của con trỏ
– Đại diện cho biến dữ liệu
– Xin cấp phát bộ nhớ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 124 124
© 2016
Con trỏ
• Khai báo

<Tên kiểu> *<tên biến>;


<Tên kiểu> *<tên biến a> = 0;
<Tên kiểu> *<tên biến a> = &<tên biến b>;

<tên biến b>: Phải có kiểu <Tên kiểu>, hoặc


có kiểu chuyển đổi qua được <Tên kiểu>

0: Hằng số, gọi là NULL

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 125 125
© 2016
Con trỏ
a: là số nguyên
int a;
p1: con trỏ đến số nguyên, giá trị chưa xác định
int *p1;
p2: con trỏ đến số nguyên, giá trị là NULL
int *p2 = 0;
p3: con trỏ đến số nguyên, giá trị chính là địa chỉ
int *p3 = &a;
của biến a
double d;
double *pd1;
double *pd2 = 0;
double *pd3 = &d;
f: là số float
float f; pf1: con trỏ đến số float, giá trị chưa xác định
float *pf1; pf2: con trỏ đến số float, giá trị là NULL
float *pf2 = 0; pf3: con trỏ đến số float, giá trị chính là địa chỉ
float *pf3 = &f; của biến f

Point3D p1 = {1.0f, 2.0f, 3.0f};


Point3D *pp1;
Point3D *pp2 = 0;
Point3D *pp3 = &p1;
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 126 126
© 2016
Con trỏ
• Toán tử & trả về địa chỉ của một biến
• Ví dụ

#include <stdio.h>
#include <stdlib.h>

int main(){
int a = 100;
printf("%d\n", a); In ra giá trị của a

printf("%p\n", &a); In ra địa chỉ của a

system("pause");
return 0;
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 127 127
© 2016
Con trỏ
• Toán tử * lấy giá trị (tham khảo) tại một địa chỉ
• Toán tử & lấy địa chỉ của biến

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 128 128
© 2016
Con trỏ
# include <stdio.h>
# include <stdlib.h>
typedef struct Point3D{
float x, y, z;
};
int main(){
Point3D p = {1.5f, 2.5f, 3.5f};
Point3D *p_ptr = &p;
(*p_ptr).x = 4.5f; (*p_ptr).y = 5.5f; (*p_ptr).z = 6.5f;
p_ptr->x = 7.5f; p_ptr->y = 8.5f; p_ptr->z = 9.5f;

printf("*p_ptr = [%-4.1f, %-4.1f, %4.1f]\n",


(*p_ptr).x, (*p_ptr).y, (*p_ptr).z);
printf("*p_ptr = [%-4.1f, %-4.1f, %4.1f]\n",
p_ptr->x, p_ptr->y, p_ptr->z);
system("pause");
return 0;
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 129 129
© 2016
Con trỏ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 130 130
© 2016
Con trỏ
• Cấu trúc bộ nhớ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 131 131
© 2016
Con trỏ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 132 132
© 2016
Con trỏ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 133 133
© 2016
Con trỏ
# include <stdio.h>
# include <stdlib.h>
typedef struct{
float x, y, z;
} Point3D;
int main(){
Point3D p = {1.5f, 2.5f, 3.5f};
Point3D *p_ptr = new Point3D;
(*p_ptr).x = 4.5f; (*p_ptr).y = 5.5f; (*p_ptr).z = 6.5f;
p_ptr->x = 7.5f; p_ptr->y = 8.5f; p_ptr->z = 9.5f;

printf("p = [%-4.1f, %-4.1f, %4.1f]\n",


p.x, p.y, p.z);
printf("*p_ptr = [%-4.1f, %-4.1f, %4.1f]\n",
(*p_ptr).x, (*p_ptr).y, (*p_ptr).z);
printf("*p_ptr = [%-4.1f, %-4.1f, %4.1f]\n",
p_ptr->x, p_ptr->y, p_ptr->z);
delete p_ptr;
return 0;
}
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 134 134
© 2016
Con trỏ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 135 135
© 2016
Quiz 4 + Lab 4

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 136 136
© 2016
PHẦN 5
Hàm

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 137 137
© 2016
Giới thiệu
• Hàm là
– Một đơn vị xử lý
– Một chuỗi các lệnh có liên quan, được thực
hiện cùng nhau để hoàn thành một công việc
nào đó

– Ví dụ: trong thư viện <math.h>


• Hàm sin(x)
– Là chuỗi các lệnh tính toán để tính giá trị sin của một góc x
được truyền vào, góc x có đơn vị tính là radian; hàm sin(x)
trả về một số thực
• Hàm sqrt(x)
– Là chuỗi các lệnh tính toán để tính căn bậc 2 của đại lượng
x được truyền vào, đại lượng x có đơn vị tính là một số thực
(float hay double); hàm sqrt trả về một số thực

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 138 138
© 2016
Giới thiệu
 Hàm là
 Một đơn vị tính toán
 Nhận giá trị đầu vào

 Tính toán

 Trả về giá trị

 Minh hoạ

Các giá trị đầu vào Chuỗi lệnh của hàm Các giá trị đầu ra

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 139 139
© 2016
Giới thiệu
 Tránh lặp lại mã nguồn
  Tiết kiệm thời gian phát triển
  Thay đổi đoạn mã nguồn trong hàm nhanh và dễ dàng, chỉ tại
một nơi
 Sử dụng lại một đơn vị tính toán mà không phải viết lại
 Tiết kiệm thời gian phát triển
 Có thể chia sẽ đơn vị tính toán không chỉ cho một dự án mà cho
nhiều dự án
 Ví dụ: hãy xem xét trường hợp mà mọi dự án đều viết lại các hàm
toán học: sin(x), sqrt(x), v.v.  tốn kém và lãng phí
  sử dụng thư viện <math.h>

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 140 140
© 2016
Giới thiệu
Mô tả module
 Tiền xử lý:
 #include
#<Tiền xử lý>
 #define
Khai báo / định nghĩa  Khai báo / định nghĩa:
 Hằng
Hàm 1
 Biến
 Hàm/biến extern
 Mô tả hàm
Hàm 2
 Các hàm:
 main được chạy đầu tiên.
 Định nghĩa ngang cấp, không lồng
Hàm 3 nhau.
 Được gọi mới chạy.

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 141 141
© 2016
Sử dụng hàm tự tạo
• Gồm hai bước
– (1) Tạo ra hàm
• Mô tả một hàm
• Hiện thực hàm
– (2) Gọi hàm

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 142 142
© 2016
Sử dụng hàm tự tạo
Khai báo hàm  extern
 Mô tả trước

Hàm Định nghĩa hàm


 Định nghĩa biến
 Lệnh thực thi
Gọi hàm
Trực tiếp
Gián tiếp
Truyền tham số hàm
 Trị
 Tham khảo, địa chỉ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 143 143
© 2016
Sử dụng hàm tự tạo
 Khối lệnh: tập hợp của các lệnh
 VD 1:
if (delta > 0) {
x1 = (-b + sqrt(delta))/(2*a);
x2 = (-b - sqrt(delta))/(2*a);
}
 VD 2:
for (int i = 0; i < 10; i++)
{
temp = i*i;
sum += temp;
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 144 144
© 2016
Sử dụng hàm tự tạo
 Hàm cũng là tập hợp của những câu lệnh, nhưng
 Có tên
 Có thể có tham số
 Có thể có giá trị trả về
 VD
floataverage(float a, float b)
{
float val;
val = (a + b) /2;
return val;
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 145 145
© 2016
Sử dụng hàm tự tạo
Phần mô tả một hàm, gồm:
#include <stdio.h> (1) Kiểu giá trị trả về: ví dụ này là int
#include <stdlib.h> (2) Tên hàm: ví dụ này là “add”
(3) Các thông số, là giá trị đầu vào.
int add(int a, int b) Ví dụ này có
{ • Thông số thứ nhất: tên là “a”, kiểu là int
int c; • Thông số thứ hai: tên là “b”, kiểu là int
c = a + b;
return c; • Danh sách thông số: bắt đầu bằng ”(“, kết
} thúc bằng “)”
int main(){ • Các thông số cách nhau bằng dấu phẩy “,”
printf("10 + 15 = %d", add(10, 15));

system("pause");
return EXIT_SUCCESS;
}

Tên hàm và tên thông số tuân theo quy tắc đặt tên danh hiệu
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 146 146
© 2016
Sử dụng hàm tự tạo
Phần thân của hàm, gồm:
#include <stdio.h> Gồm các câu lệnh được thực hiện cùng nhau,
#include <stdlib.h> lần lượt. Ở ví dụ này: có 3 lệnh trong thân hàm

int add(int a, int b) Dùng câu lệnh return để chấm dứt thực thi
{ hàm và trả điều khiển về cho hàm gọi  chuyển
int c; thực thi về lệnh kế sau lệnh gọi hàm
c = a + b;
return c;
}
int main(){
printf("10 + 15 = %d", add(10, 15));

system("pause");
return EXIT_SUCCESS;
}

Các lệnh trong thân của hàm phải được gôm lại với nhau
bằng cặp dấu “{“ và “}”
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 147 147
© 2016
Sử dụng hàm tự tạoLời gọi hàm:
Dùng tên hàm và truyền vào các giá trị cho các
tham số của hàm:
#include <stdio.h> • Thứ tự truyền vào quyết định giá trị nào sẽ
#include <stdlib.h> được truyền cho thông số nào.
• Ví dụ này: 10 được truyền cho a; 15 được
int add(int a, int b) truyền cho b
{ • Phải truyền đủ (không thiếu, không thừa) tất
int c; cả các tham số. Kiểu tham số phải tương
c = a + b; thích.
return c; • Không chấp nhận: add(), add(10), add(10,
} 20, 30)
int main(){
printf("10 + 15 = %d", add(10, 15));

system("pause");
return EXIT_SUCCESS;
}
Phần mô tả hàm phải xuất hiện trước khi lời gọi hàm xảy ra để biên
dịch không gặp lỗi danh hiệu chưa được định nghĩa
: “undefined identifer”
Trường Đại Học Bách Khoa Lập trình C/C++
Trung Tâm Kỹ Thuật Điện Toán 148 148
© 2016
Sử dụng hàm tự tạo

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 149 149
© 2016
Sử dụng hàm tự tạo
Tham số hình thức

Tham số thực

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 150 150
© 2016
Sử dụng hàm tự tạo

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 151 151
© 2016
Sử dụng hàm tự tạo

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 152 152
© 2016
Sử dụng hàm tự tạo

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 153 153
© 2016
Các kiểu truyền tham số
• Có hai kiểu truyền tham số
– Truyền tham số bằng trị hay truyền bằng trị
– Truyền tham số bằng địa chỉ, truyền bằng tham
khảo

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 154 154
© 2016
Các kiểu truyền tham số
 Lý do có hai kiểu truyền
 Truyền bằng trị
 Được sử dụng khi KHÔNG CHO PHÉP hàm được gọi thay đổi

giá trị đối

 Truyền bằng địa chỉ, tham khảo


 Được sử khi MUỐN CHO PHÉP hàm được gọi thay đổi giá trị

đối
 Hoặc

 Khi không muốn bộ thực thi tốn nhiều thời gian cho việc

chuẩn bị tham số của hàm được gọi (nghĩa là COPY giá trị
của đối số vào thông số), như truyền một mảng nhiều phần
tử vào hàm được gọi

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 155 155
© 2016
Các kiểu truyền tham số
 Truyền theo giá trị
 Giá trị của tham số thực được sao chép vào thông số hình
thức
 Mọi sự thay đổi giá trị tham số hình thức không ảnh hưởng
đến tham số thực (giá trị gốc)
void Increment(int Number)
{
Number += 1;
} a Number
int a = 10;
Increment(a); //a = 10

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 156 156
© 2016
Các kiểu truyền tham số
 Truyền theo kiểu tham khảo
 Giá trị của tham số thực được sao chép vào thông số hình thức
 Sự thay đổi giá trị tham số hình thức ảnh hưởng đến tham số thực (giá trị
gốc)
void Increment1(int & Number)
{
Number += 1;
} a Number
int a = 10;
Increment1(a); //a = 11

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 157 157
© 2016
Hàm đệ quy
 Một đối tượng chứa chính nó

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 158 158
© 2016
Hàm đệ quy
• Ví dụ về một định nghĩa đệ quy
– Sibling(X, Y): X và Y có cùng cha mẹ
– Cousin(X, Y): cha mẹ của X và cha mẹ của Y là anh
em ruột hoặc anh em họ

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 159 159
© 2016
Hàm đệ quy
• Hàm đệ quy là hàm gọi lại chính nó
– Trực tiếp:
• foo() gọi foo() trực tiếp trong thân hàm foo()
– Gián tiếp:
• foo() gọi bar, bar gọi foo(); hoặc qua nhiều trung
gian hàm khác

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 160 160
© 2016
Hàm đệ quy
 Tính giai thừa

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 161 161
© 2016
Hàm đệ quy
// Recursive definition of function factorial
unsigned long Factorial( unsigned long number ){
if (number < 1) // base case
return 1;
else // recursive case The output :
return number * Factorial( number - 1 ); 0! = 1
1! = 1
} 2! = 2
int main(){ 3! = 6
4! = 24
for ( int i = 0; i <= 10; i++ ) 5! = 120
cout << setw( 2 ) << i << "! = " 6! = 720
<< Factorial( i ) << endl; 7! = 5040
8! = 40320
return 0; 9! = 362880
} 10! = 3628800

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 162 162
© 2016
Hàm đệ quy

 Đệ quy là quá trình phân giải bài toán và tổng hợp lời giải
 Được làm một cách tự động bởi bộ thực thi

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 163 163
© 2016
Hàm đệ quy

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 164 164
© 2016
Hàm đệ quy
 Ví dụ
 Chương trình tính tổng của 1+2+3+ .. + N
 Nếu N = 0  kết quả bằng 0
 Nếu N > 0  1+ 2 + 3 + …+ N-1 + N =
(1 + 2 + 3 + … + N-1) + N

int tong(int N){


int ket_qua;
if(N <=0) return 0;
else return (N + tong(N-1));
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 165 165
© 2016
Hàm đệ quy
int tong(int N){
int ket_qua;
if(N <= 1) return 1;
else return (N + tong(N-1));
}

int tong(int N){


int ket_qua; Chỉ đúng khi gọi
if(N <= 4) return 10; với tham số ≥ 4
else return (N + tong(N-1));
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 166 166
© 2016
Hàm đệ quy

 Mỗi lần chỉ được di chuyển một chiếc đĩa.


 Chiếc đĩa lớn hơn không bao giờ được đặt trên chiếc đĩa
nhỏ hơn.
 Các đĩa có kích thước khác nhau

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 167 167
© 2016
Hàm đệ quy

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 168 168
© 2016
Hàm đệ quy

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 169 169
© 2016
Hàm đệ quy
#include <stdio.h>
#include <stdlib.h>

void move(int count, char source, char dest, char aux) {


if(count > 0) {
move(count-1, source, aux, dest);
printf("%c --> %c\n", source, dest);
move(count-1, aux, dest, source);
}
}
int main() {
move(3, 'A', 'C', 'B');
return 0;
}

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 170 170
© 2016
Hàm đệ quy
 Nếu có 64 chiếc đĩa, mỗi chiếc đĩa di chuyển mất 1 giây, thì
di chuyển hết 64 đĩa, cần khoảng 58.5 tỷ năm (gấp 42 lần
số tuổi hiện tại của vũ trụ).

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 171 171
© 2016
Quiz 5 + Lab 5

Trường Đại Học Bách Khoa Lập trình C/C++


Trung Tâm Kỹ Thuật Điện Toán 172 172
© 2016