Tài liệu Cơ sở lập trình: ĐẠI HỌC MỞ
TP.HCM
KHOA CÔNG NGHỆ
THÔNG TIN
-
Lý thuyết: 2 tín chỉ
- Thực hành: 2 tín chỉ
CƠ SỞ LẬP TRÌNH
ThS.GVC Tô Oai Hùng 2
Mục Đích, Yêu Cầu Môn Học
y Môn học này giúp cho sinh viên tiếp cận
cách lập trình trên máy tính. Một trong
những ngôn ngữ lập trình được sử
dụng là C++. Đây là môn học được xem
là nền tảng trong lập trình. Những kiến
thức về lập trình được sử dụng trong
hầu hết các môn học của ngành Công
Nghệ Thông Tin sau này.
y Học xong môn này sinh viên có thể lập
trình được những bài toán cơ bản về
tính toán. Biết cách tạo giải thuật,
chuyển thành chương trình từ bài toán
cụ thể và sử dụng thành thạo ngôn ngữ
C++ trong lập trình cấu trúc.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 3
Tài Liệu Học Tập
y Tài liệu chính:
- Giáo trình Cơ Sở
Lập Trình
- Khoa
CNTT Đại học Mở
Tp. HCM.
y Tài liệu tham khảo:
- Joel Adams & Larry Nyhoff, C++ An
Introduction to Computing, Prentice
Hall 2002, Third Edition.
- H.M. Deitel & P.J. Deitel, C++ How...
227 trang |
Chia sẻ: Khủng Long | Lượt xem: 1710 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Cơ sở lập trình, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
ĐẠI HỌC MỞ
TP.HCM
KHOA CÔNG NGHỆ
THÔNG TIN
-
Lý thuyết: 2 tín chỉ
- Thực hành: 2 tín chỉ
CƠ SỞ LẬP TRÌNH
ThS.GVC Tô Oai Hùng 2
Mục Đích, Yêu Cầu Môn Học
y Môn học này giúp cho sinh viên tiếp cận
cách lập trình trên máy tính. Một trong
những ngôn ngữ lập trình được sử
dụng là C++. Đây là môn học được xem
là nền tảng trong lập trình. Những kiến
thức về lập trình được sử dụng trong
hầu hết các môn học của ngành Công
Nghệ Thông Tin sau này.
y Học xong môn này sinh viên có thể lập
trình được những bài toán cơ bản về
tính toán. Biết cách tạo giải thuật,
chuyển thành chương trình từ bài toán
cụ thể và sử dụng thành thạo ngôn ngữ
C++ trong lập trình cấu trúc.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 3
Tài Liệu Học Tập
y Tài liệu chính:
- Giáo trình Cơ Sở
Lập Trình
- Khoa
CNTT Đại học Mở
Tp. HCM.
y Tài liệu tham khảo:
- Joel Adams & Larry Nyhoff, C++ An
Introduction to Computing, Prentice
Hall 2002, Third Edition.
- H.M. Deitel & P.J. Deitel, C++ How to
Program, Prentice Hall, New Jersey,
2003, Fourth Edition.
- Nicholas A. Solter & Scott J. Kleper,
Professional C++, Wiley Publishing,
2005.
Cơ Sở
Lập Trình
Chương 1
GIỚI THIỆU NGÔN NGỮ
C++
ĐẠI HỌC MỞ
TP.HCM
KHOA CÔNG NGHỆ
THÔNG TIN
ThS.GVC Tô Oai Hùng 5
Mục Tiêu
y Công dụng của máy tính.
y Một số khái niệm.
y Thế nào là một chương trình C++.
y Giải quyết bài toán bằng chương trình
C++.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 6
Công Dụng Của Máy Tính
y Công nghiệp:
- Robot, thiết kế
bằng máy tính, quản
lý dự
án và điều khiển.
y Chính phủ:
- Quốc phòng, vũ
trụ, biên dịch dữ
liệu, thời tiết.y Y học:
- Hồ sơ y khoa, các hệ
thống hỗ
trợ
khám chữa bệnh, máy chụp cắt lớp.y Giải trí:
- Hoạt hình, màu sắc, các hiệu ứng.
y Khoa học:
- Giả
lập, phân tích phân tử, kiểm tra
thực phẩm.
y Công nghệ thông tin:
- Công nghệ
số.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 7
Một Số
Khái Niệm
y Chương trình máy tính:
- Một loạt các câu lệnh mà
nó
chỉ
thị
cho máy tính giải quyết vấn đề như
thế
nào.
y Dữ liệu:
- Những thông tin có
thể được lưu trữ
và
xử
lý bằng máy tính.
y Lập trình:
- Thực hiện thiết kế, viết và
bảo trì
chương trình nhằm điều khiển máy
tính làm việc.
y Người lập trình:
- Người viết ra chương trình.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 8
Một Số
Khái Niệm
y Ngôn ngữ lập trình:
- Hệ
thống các ký hiệu dùng để
tạo
thành chương trình.
y Chương trình dịch:
- Chương trình dùng để
chuyển đổi
chương trình nguồn thành chương
trình ngôn ngữ
máy thực thi được.
y Thời gian dịch:
- Thời gian thực hiện dịch chương
trình nguồn.
y Thời gian thực thi:
- Thời gian chạy chương trình ngôn
ngữ
máy.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 9
Chương Trình C++
y Chương trình ví dụ:
// h01_01.cpp
// Chương trình đầu tiên trong C++
#include
int main()
{
cout << "Welcome to C++!\n";
return 0; // cho biết chương trình
// kết thúc thành công
}
Chú
thích
Chỉ
dẫn biên dịch
Phần chính của chương
trình chứa các lệnh C++
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 10
Chương Trình C++
- Các lệnh C++:
int main()
{
cout << "Welcome to C++!\n";
return 0;
}
Xuất chuỗi
thông báo
Trả
trị
0 cho hệ điều
hành -
cho biết
chương trình kết
thúc thành công
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 11
Các Bước Giải Quyết Bài Toán
Các bước trong phát triển phần mềm gồm:
y Thiết kế:
- Phân tích, đặc tả
giải thuật để
giải
quyết vấn đề.
y Viết mã lệnh:
- Viết đặc tả
giải thuật bằng cú
pháp
của ngôn ngữ
lập trình.
y Kiểm tra, thực thi, phát hiện lỗi :
- Tìm tất cả
những lỗi phát sinh và
chỉnh sửa lại chương trình.
y Bảo trì:
- Cập nhật, sửa đổi theo yêu cầu sử
dụng.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 12
Vấn Đề
y Quả cầu được quấn bằng sợi. Hỏi:
- Quả
cầu nặng bao nhiêu?
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 13
Giải Thuật
1.
Khởi tạo hằng PI.
2.
Xuất thông báo nhắc user nhập bán
kính.
3.
Nhập một giá
trị
thực và
chứa vào
biến radius.
4.
Xuất thông báo nhắc user nhập tỉ
trọng.
5.
Nhập một giá
trị
thực và
chứa vào
biến density.
6.
Tính:
7.
Xuất trọng lượng (weight) ra màn
hình.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 14
Viết Mã C++
y Đầu tiên tạo khung chương trình:
- Thêm các chỉ
dẫn biên dịch để
chèn
các thành phần cần thiết trong thư
viện cho chương trình.
- Tạo hàm main() rỗng.
y Chuyển đổi từng bước giải thuật thành
mã lệnh:
- Nếu chương trình có
sử
dụng đối
tượng phần mềm nào chưa được
khai báo, thêm các lệnh khai báo để
chỉ định kiểu và tên cho đối tượng
đó.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 15
Viết Mã C++
/* h01_02.cpp: Tính trọng lượng quả
cầu.
Nhập: Bán kinh (foot) và
tỷ
trọng
(pound/cubic foot) quả
cầu
Xuất: Trọng lượng quả
cầu (pound)
*/
#include // cin, cout,
// >
#include // pow()
int main() // hàm main() rỗng
{
return 0;
}
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 16
Viết Mã C++
int main()
{
const double PI = 3.14159;
cout << "Nhập
bán kính quả
cầu: ";
double radius;
cin >> radius;
cout << "Nhập tỷ
trọng quả
cầu: ";
double density;
cin >> density;
double weight = density * 4.0 * PI *
pow(radius,3)/3.0;
cout << "\nTrọng lượng quả
cầu xấp xỉ
"
<< weight << " pound.\n";
return 0;
}
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 17
Kiểm Tra, Thực Thi,
Phát Hiện Lỗi
Nhập bán kính quả
cầu: 6.5
Nhập tỉ
trọng quả
cầu: 14.6
Trọng lượng quả
cầu xấp xỉ
16795 pound.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 18
Kiểm Tra, Thực Thi,
Phát Hiện Lỗi
y Các lỗi thường gặp:
- Lỗi vi phạm các qui tắc văn phạm
của ngôn ngữ
cấp cao (lỗi cú
pháp).
- Lỗi xảy ra lúc thực thi chương trình
(lỗi thời gian thực thi).
- Lỗi do thiết kế
giải thuật (lỗi logic).
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 19
Lỗi Cú
Pháp
y Ví dụ:
double radius
- Mất dấu chấm phẩy.
y Đây là lỗi thường gặp nhất.
y Thông thường trình biên dịch đưa ra
thông báo lỗi để người lập trình xác
định vị trí và sửa lại chương trình
nguồn.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 20
Lỗi Thời Gian Thực Thi
y Không được phát hiện cho đến khi
chương trình thực thi.
y Ví dụ:
- Chia cho 0 sẽ
làm cho chương trình
dừng.
- Tính căn bậc hai của số
âm.
y Chương trình phải được sửa đổi khi có
bất kỳ lỗi nào xảy ra.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 21
Lỗi Logic
y Chương trình được dịch và được thực
thi nhưng cho kết quả không đúng.
y Đây là lỗi khó phát hiện nhất.
y Có thể sử dụng dữ liệu mẫu và tính
bằng tay rồi so sánh với kết quả của
chương trình.
y Chú ý: Kiểm tra lỗi càng khó khi độ
phức tạp của chương trình càng tăng:
- Một số chương trình được chạy
trong nhiều năm mà
không phát hiện
lỗi logic.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 22
Bảo Trì
y Các chương trình trong nhà trường
thường chỉ chạy vài lần.
y Các chương trình trong thực tế được
sử dụng nhiều năm:
- Nó
là
tài nguyên đã được đầu tư vào
đó.
y Những yêu cầu mới phát sinh trong quá
trình sử dụng chương trình .
y Cập nhật lại được gọi là “bảo trì”.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 23
Bảo Trì
y Ví dụ bảo trì chương trình Hình 1.2 bằng
cách tính trọng lượng quả cầu theo
pound và tấn.
/* h01_03.cpp: Tính trọng lượng quả
cầu
theo pound và
tấn.
Nhập: Bán kính (foot) và
tỷ
trọng (pound/
cubic foot) quả
cầu.
Xuất: Trọng lượng quả
cầu (pound và
tấn)*/
#include
#include
int main()
{
const double PI = 3.14159;
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 24
Bảo Trì
cout << "Nhập bán kính quả
cầu:
";
double radius;
cin >> radius;
cout << "Nhập tỷ
trọng quả
cầu: ";
double density;
cin >> density;
double weight = density * 4.0 * PI
* pow(radius,3) / 3.0;
cout <<"\nTrọng lượng quả
cầu xấp xỉ
"
<< weight << " pound, hay "
<< weight /2000.0 << " tấn.\n";
return 0;
}
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 25
Kiểm Tra Lại
Nhập bán kính quả
cầu: 6.5
Nhập tỉ
trọng quả
cầu: 14.6
Trọng lượng quả
cầu xấp xỉ
16795 pounds hay 8.39752 tấn.
Cơ Sở
Lập Trình
Bài Tập Tại Lớp
Thành lập mỗi nhóm gồm hai người
để
giải quyết vấn đề sau đây:
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 27
Vấn Đề
y Sam được công ty Metro Cable thuê để
nối cáp (đồng trục) máy tính cho các
phòng làm việc:
- Mỗi phòng được trả
$25.00.
- Ngoài ra, mỗi foot cáp được trả
$2.00.
- Công ty muốn tính tiền phải trả
cho
Sam.
- Ví
dụ: Nếu nối 263 yards (tính cả
phần lẻ
nếu có) cáp ở
27 phòng thì
số
tiền sẽ
là
$2253. Biết rằng:
1 yard = 3 foot
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 28
Giải Thuật và
Viết Mã Lệnh
y Mỗi nhóm phải xác định các bước cần
thiết để mô tả giải thuật của vấn đề đã
cho.
y Viết mã nguồn.
y Kiểm tra, thực thi và phát hiện lỗi của
chương trình.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 29
Kiểm Tra, Thực Thi,
Phát Hiện Lỗi
Để
tính tiền thù
lao phải trả,
Nhập số phòng đã kết nối: 27
Nhập số
yard cáp được nối: 263
Tổng số
tiền phải trả
là
$2253.
Cơ Sở
Lập Trình
Chương 2
CÁC KIỂU DỮ
LIỆU
ĐẠI HỌC MỞ
TP.HCM
KHOA CÔNG NGHỆ
THÔNG TIN
ThS.GVC Tô Oai Hùng 2
Mục Tiêu
y Tìm hiểu các kiểu dữ liệu của C++:
- Miền trị
của các kiểu dữ
liệu.
y Cách đặt tên cho các danh hiệu.
y Tìm hiểu về biến và hằng:
- Biến và
hằng là
gì?
- Sự
khác nhau giữa biến và
hằng.
- Cách khai báo.
- Cách sử
dụng.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 3
Vấn Đề
y Viết chương trình để thực hiện các tác
vụ sau:
- Tính lương cho mỗi nhân viên.
- Tất cả nhân viên đều được trả
$6.75
mỗi giờ.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 4
Thực Hiện
Nhập mã nhân viên: 3323
Nhập số
giờ
làm việc: 38.5
Mã số: 3323
Lương = $259.875
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 5
Giải Thuật
1.
Khai báo hằng HOURLY_WAGE = 6.75
2.
Xuất thông báo nhắc người sử
dụng
nhập mã nhân viên.
3.
Đọc giá
trị
nguyên từ
bàn phím vào
biến idNumber.
4.
Xuất thông báo nhắc người sử
dụng
nhập số
giờ
làm việc.
5.
Đọc giá
trị
thực từ
bàn phím vào biến
hours.
6.
Tính lương
pay = hours * HOURLY_WAGE
7.
Xuất mã nhân viên idNumber và
lương pay.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 6
Viết Mã, Thực Thi và
Kiểm Tra
y Tạo khung chương trình
- Tạo tập tin chương trình nguồn.
- Thêm vào các chỉ
dẫn biên dịch.
- Thêm vào hàm main()
rỗng.
y Chuyển đổi từng bước giải thuật thành
mã lệnh
- Thêm các khai báo cho những đối
tượng chưa được khai báo.
- Khai báo bao gồm tên và
kiểu dữ
liệu.
y Xem mã nguồn, Figure 2.1
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 7
Các Kiểu Dữ
Liệu Cơ Bản
y Kiểu số nguyên (số dương, âm):
- int
y Các biến thể của kiểu số nguyên:
- short,
long,
unsigned.
y Kiểu số thực (phân số):
- float,
double,
long double.
y Kiểu ký tự (chữ cái, chữ số, ký hiệu, ...):
- char.
y Kiểu luận lý (các giá trị logic đúng hay
sai):
- int/unsigned
hay
- bool
(trong Visual C++).
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 8
Kiểu Số
Nguyên
y Bộ nhớ được sử dụng để chứa một giá
trị kiểu int phụ thuộc vào kích thước
từ nhớ của phần cứng:
- Thường là
16, 32, hay 64 bit.
y Điều này dẫn đến miền trị của kiểu int
trong chương trình sẽ khác nhau trên
các máy tính khác nhau.
•
Để
kiểu int trong chương trình có
miền trị
cố định trên mọi máy tính, C++
cho phép sử
dụng biến thể
(gồm short
hay long) của kiểu int.•
Biến thể
16 bit (2 bytes): short
int
(hay short):
- Từ
-32768 đến 32767.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 9
Kiểu Số
Nguyên
•
Biến thể
32 bit (4 bytes): long
int
(hay long):
- Từ
-2137483648 đến 2137483647
•
Biến thể
thứ
ba là
các số
nguyên có
thể được dùng như số
không dấu:
- Bit dấu không cần thiết.
- Miền trị
biểu diễn giá
trị dương lớn
gấp đôi.
- unsigned int
(kích thước phụ
thuộc vào máy tính).
- unsigned short
(16 bit): Từ
0 đến
65535.
- unsigned long
(32 bit): Từ
0 đến
4294967295.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 10
Hằng Số
Nguyên
•
Số
thập phân:
- Một dãy các số
không có
dấu chấm
thập phân.
- Cơ số
10.
•
Số
bát phân
- Một dãy các số
bắt đầu bằng số 0.
- Cơ số
8.
•
Số
thập lục phân
- Một dãy các số
bắt đầu bằng 0x
hay
0X.
- Cơ số
16.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 11
Biểu Diễn Số
Nguyên
•
Dữ
liệu được lưu trữ
trong máy tính
bằng một dãy các giá
trị
nhị
phân (0/1)
•
Để đơn giản, chúng ta lấy ví
dụ
cho số
16 bit (nhưng thường là
32 hay 64 bit).
Ví
dụ, 58 được biểu diễn là:
5810
= 00000000001110102
- Nếu 58 là
hằng nguyên kiểu unsigned
thì
tất cả 16 bit được dùng
làm giá
trị
nhị
phân cho nó.
- Nếu 58 là
hằng nguyên kiểu int
thì
chỉ
có 15 bit được dùng làm giá
trị
nhị
phân cho nó, bit bên trái nhất
dùng làm bit dấu (0
– số dương, 1
–
số
âm).
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 12
Biểu Diễn Số
Nguyên
•
Các số nguyên âm thường được biểu
diễn trong máy tính theo dạng bù hai
•
Ví
dụ, -58 được biểu diễn là:
-5810
= 11111111110001102
•
Giải thuật tìm bù
hai (two’s
complement) để
biểu diễn số
âm:
- Chọn số
muốn biểu diễn (ví
dụ, -58).
- Biểu diễn trị
tuyệt đối của nó
theo
dạng nhị
phân:
0000000000111010
- Đảo ngược các bit:1111111111000101
- Cộng với 1:1111111111000110
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 13
Số
Nguyên Có
Dấu
•
Kiểu int/short/long
sử
dụng bit bên
trái nhất làm bit dấu (0
– số dương, 1
–
số
âm)
•
Ví
dụ, biểu diễn nhị
phân giá
trị
16 bit:
00000000000000002
= 010
00000000000000012
= 110
...
01111111111111112
= 3276710
10000000000000002 = -3276810
10000000000000012
= -3276710
...
11111111111111112
= -110
Các
giá
trị
dương
Các
giá
trị
âm
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 14
Số
Nguyên Không Dấu
•
Kiểu unsigned
không cần bit dấu, giá
trị dương biểu diễn được tăng gấp đôi
•
Ví
dụ, biểu diễn nhị
phân giá
trị
16 bit:
00000000000000002
= 010
00000000000000012
= 110
00000000000000102
= 210
...
11111111111111102
= 6553410
11111111111111112
= 6553510
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 15
So Sánh int
với unsigned
•
Giả
sử
số nguyên được chứa trong 32
bit:
- Miền trị
của kiểu int:
Từ
-231
(= -2147483648)
đến 231
-1
(= 2147483647)
- Miền trị
của kiểu unsigned:
Từ
0 đến 232
-
1
(= 4294967295)
- Giá
trị
kiểu int
sử
dụng 1 bit để
làm
bit dấu.
- Giá
trị
lớn nhất của kiểu int
bằng
nửa giá
trị
lớn nhất của kiểu unsigned.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 16
Số
Thực
•
Có
ba kiểu số
thực:
- float: Là
một giá
trị
32 bit (4 byte).
- double: Là
một giá
trị
64 bit (8 byte).
- long double: Là
một giá
trị
80 bit
(10 byte).
•
Có
hai cách để
biểu diễn một giá
trị
thực: Dạng dấu chấm cố định và
dạng
dấu chấm động:
Người lập trình phải chọn
kiểu dữ
liệu thích hợp dựa
trên độ
chính xác mà đối
tượng được yêu cầu
Người lập trình phải chọn
kiểu dữ
liệu thích hợp dựa
trên độ
chính xác à đối
tượng được yêu cầu
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 17
Số
Thực
- Dấu chấm cố định có
dạng:
m.n
Ví
dụ:
123.45
5.0
(có
thể
viết là
5.)
0.5
(có
thể
viết là
.5)
- Dạng dấu chấm động thường được
sử
dụng để
biểu diễn giá
trị
rất lớn
hay rất bé, có
dạng:
xEn
hay
xen
Ví
dụ, giá
trị
0.000123
có
thể được
biểu diễn theo dạng dấu chấm động
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 18
Số
Thực
ở
nhiều cách khác nhau, bằng cách di
chuyển dấu chấm và thay đổi số
mũ:
1.23e-4
12.3e-5
123E-6
Như vậy, một giá
trị
thực được biểu
diễn theo dạng dấu chấm động gồm:
+
1.23.10
– 4
- Dấu của giá
trị.
- Các chữ
số
có
nghĩa.
- Luỹ
thừa của 10.
- Dấu của luỹ
thừa.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 19
Biểu Diễn Số
Thực
y Các cách biểu diễn số thực được
chuẩn hoá theo chuẩn IEEE để biểu
diễn chúng theo một cách duy nhất.
y Theo chuẩn IEEE, sự biểu diễn nhị
phân của số thực có dạng:
b1
.b2
b3...
×
2k
- b1
= 1
(ngoại trừ
số
biểu diễn là
0).
- bi
là
0
hay 1.
- b1
.b2
b3...
được gọi là
phần định trị.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 20
Biểu Diễn Số
Thực
y Dấu chấm động 32 bit dạng chuẩn IEEE
có dạng:
số
mũ
(8 bit)
dấu
(1 bit)
Phần định trị
-
23 bit
(Các bit bên phải
dấu chấm nhị
phân
của phần định trị)
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 21
Biểu Diễn Số
Thực
y Ví dụ, biểu diễn giá trị 22.625
- Chuyển thành dạng nhị
phân:
22.62510
= 10110.1012
- Biểu diễn theo dạng chuẩn IEEE:
1.01101012
× 24
- Bit dấu: 0
- Số
mũ: 4 + 127
= 13110=
100000112
- Phần định trị:
01101010000000000000000
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 22
Biểu Diễn Số
Thực
y Dấu chấm động 64 bit dạng chuẩn IEEE
có dạng:
dấu
(1 bit)
số
mũ
(11 bit)
Phần định trị
- 52 bit
(Các bit bên phải
dấu chấm nhị
phân của
phần định trị)
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 23
Biểu Diễn Số
Thực
y Tràn (tràn trên):
- Số
mũ dương quá
lớn.
- Không đủ
số bit để
biểu diễn.
y Hụt (tràn dưới):
- Số
mũ
âm quá
nhỏ.
- Không đủ bit để
biểu diễn.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 24
Ký Tự
y Kiểu char.
y Được thể hiện bằng các ký tự riêng
biệt:
- Xem bảng mã ASCII trong Phục lục D.
y Các ký tự được thể hiện trong bộ nhớ
bằng giá trị nguyên một byte.
y Hằng ký tự:
- Các ký tự đặt trong cặp dấu nháy
đơn.
- Ví
dụ: 'X',
'7',
'>',
'e'
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 25
Ký Tự
y Các ký tự điều khiển:
- Dấu \ được kết hợp với ký tự
khác
thành chuỗi ký tự điều khiển có
ý
nghĩa đặc biệt:
Ký tự Chuỗi ký tự điều khiển
Xuống dòng \n
Tab ngang \t
Phím backspace \b
Trở
về đầu dòng \r
Tiếng beep \a
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 26
Chuỗi Ký Tự
y Có quan hệ với ký tự:
- Là
một dãy các ký tự.
- Được đặt trong cặp dấu nháy kép.
- Ví
dụ:
"Hi Mom"
y Có thể chứa các ký tự điều khiển:
"\nThe answer is "
y Lưu ý:
- ”A”
là
một hằng chuỗi.
- ’A’
là
một hằng ký tự.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 27
So Sánh Kiểu Ký Tự
và
Chuỗi
y Các ký tự được biểu diễn dạng số nhị
phân trong máy tính
- Một giá
trị
8 bit biểu diễn 128 ký tự:
- Chuỗi được chứa như một dãy các
số
nhị
phân:
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 28
So Sánh Kiểu Ký Tự
và
Chuỗi
y Mã Unicode sử dụng 16 bit.
y Có thể biểu diễn hơn 65000 ký tự.
y Có thể biểu diễn những ký tự đặc biệt.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 29
Kiểu Luận Lý
y C++ của các phiên bản trước không có
kiểu luận lý. Các kiểu int hay
unsigned được dùng làm kiểu luận lý.
y Riêng đối với Microsoft Visual C++ 6.0
có kiểu luận lý là bool.
y Kiểu luận lý sử dụng kiểu int hay
unsigned thì chỉ có hai giá trị: đúng và
sai.
- đúng được lưu trữ
là
1. Tổng quát
hơn, bất kỳ
giá
trị
nào khác không
được xem là
đúng.
- sai
được lưu trữ
là
0.
y Kiểu luận lý sử dụng kiểu bool có hai
giá trị: true và false.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 30
Danh Hiệu
y Dùng để đặt tên cho đối tượng phần
mềm như tên biến, hằng, hàm,
y Qui tắc:
- Danh hiệu không được trùng tên với
từ
khoá C++ như int, if, while,
- Phải bắt đầu bằng ký tự
chữ
cái (hay
dấu _
)
- Sau đó là số, chữ
cái, hay dấu gạch
dưới ( _
)
• Đề
nghị
- Nên sử
dụng các danh hiệu có
nghĩa.
- Không nên đặt tên quá
vắn tắt.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 31
Danh Hiệu
y C++ phân biệt chữ hoa với thường:
- Ví
dụ, firstName
là
danh hiệu khác
với firstname.
y Đề nghị:
- Tên hằng nên viết bằng chữ
hoa. Ví
dụ: PI
- Tên biến:
• Bắt đầu bằng ký tự thường.
• Ký tự đầu tiên của các từ sau đó
là
chữ
hoa. Ví
dụ:
monthlyElectricCharge,
myFirstName,
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 32
Các Loại Đối Tượng
y Có ba loại đối tượng phần mềm:
- Biến:
• Được đặt tên.
• Giá
trị
có
thể thay đổi lúc thực thi
chương trình.
- Hằng trực kiện:
• Không có
tên.
• Có
một giá
trị. Ví
dụ: 0,
-3,
2.5,
2.998e8,
‘A’, “Hello\n”, ...
- Hằng tượng trưng:
• Được đặt tên
• Giá
trị không đổi lúc thực thi
chương trình.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 33
Biến
y Tên được kết hợp với một vị trí nhớ:
- Trình biên dịch sẽ
truy xuất vị
trí
nhớ
cụ
thể khi chương trình có
sử
dụng
tên biến.
y Tham khảo đến đối tượng trong chương
trình mà giá trị của nó có thể thay đổi.
y Khai báo:
- Có
thể
khởi tạo hay không khởi tạo trị.
- Nếu biến không được khởi tạo trị, thì
giá
trị
của nó được xem là
“giá
trị
rác”
- Cú
pháp:
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 34
Biến
type variableName;
type variableName = init_exp;
- Ví
dụ
1:
int age = 18;
double GPA = 3.25, credits;
char letterGrade = ‘A’;
int ok,
done = 0; // false
Trong ví
dụ
trên, biến nguyên ok
không được khởi tạo trị, nên giá
trị
của nó
là
giá
trị
rác.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 35
Biến
- Ví
dụ
2:
double rate;
double hours = 40.0;
cin >> hours; (nhập 37.5)
hours = 37.5;
- Giá
trị
mới ghi đè lên giá trị
cũ.
40.0hours
rate ?
37.5hours
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 36
Hằng Trực Kiện
y Hằng kiểu số nguyên (int):
-27, 0, 4, +4
y Hằng kiểu số thực (double):
- Dấu chấm cố định: -0.333,
0.5,
1.414,
- Dấu chấm động: 2.998e8,
0.2998e9,
y Hằng kiểu luận lý: 0/sai và ≠0/đúng
y Hằng ký tự là mỗi ký tự ASCII:‘A’, ‘a’, ‘9’, ‘$’, ‘?’,
y Hằng chuỗi là một dãy các ký tự
ASCII: “Hello”, “Goodbye”,
“Goodbye\n”,
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 37
Hằng Tượng Trưng
y Khai báo đối tượng phần mềm mà giá
trị của nó không đổi:
const
double
HOURLY_WAGE =
6.75;
y Trong đó:
- const
là
từ
khoá.
- double
là
kiểu dữ
liệu.
- HOURLY_WAGE
là
tên hằng (nên viết
hoa).
- Giá
trị
phải được khởi tạo lúc khai
báo.
y Lý do để sử dụng hằng tượng trưng:
- Tăng tính khả đọc của chương trình.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 38
Hằng Tượng Trưng
- Làm chương trình dễ
sửa đổi.
y Đề nghị:
- Đặt tất cả
các khai báo hằng ở đầu
hàm nơi có
sử
dụng chúng.
Cõ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 39
Một Số
Hằng Định Nghĩa Trước
#include
CHAR_MIN –128
CHAR_MAX 127
INT_MIN
–32768
hoặc
–2147483648
INT_MAX
32767
hoặc
2147483647
SHRT_MIN
–32768
SHRT_MAX
32767
...`
Cõ Sở
Lập Trình
Chương 4
CẤU TRÚC LỰA CHỌN
ĐẠI HỌC MỞ
TP.HCM
KHOA CÔNG NGHỆ
THÔNG TIN
ThS.GVC Tô Oai Hùng 2
Mục Tiêu
y Giới thiệu các cấu trúc điều khiển.
y Giới thiệu chi tiết lệnh if và if-else.
y Biểu thức điều kiện.
y Cách sử dụng lệnh switch để thực
hiện sự lựa chọn trong nhiều khả
năng.
y Ứng dụng của các biểu thức logic để
thiết kế các mạch logic máy tính.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 3
Các
Cấu Trúc Điều Khiển
y Tất cả chương trình chỉ có thể được viết
dưới ba dạng cấu trúc điều khiển:
- Cấu trúc tuần tự
(mặc
định).
- Cấu trúc lựa chọn
(có
3 loại):
if, if-else, switch
- Cấu trúc lặp
(có
3 loại):
for, while, do-while
y Chương này chỉ xét cấu trúc lựa chọn.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 4
Lệnh
if
y Ví dụ: Tìm số lớn nhất trong ba số
nguyên được nhập từ bàn phím.
Nhập ba số
nguyên: 1 2 3
Số
lớn nhất là
3
Thực hiện
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 5
Giải Thuật
1.
Xuất thông báo nhắc người sử
dụng
nhập vào ba số nguyên.
2.
Đọc các giá
trị
nguyên và
lần lượt
chứa vào biến x, y, và
z.
3.
Khai báo biến max
và
gán max = x.
4.
Nếu max
nhỏ hơn y
thì
gán max = y.
5.
Nếu max
nhỏ hơn z
thì
gán max = z.
6.
Xuất giá
trị
của max
ra màn hình.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 6
Viết Mã, Thực Thi và Kiểm Tra
y Tạo khung chương trình:
- Tạo tập tin chương
trình
nguồn,
thêm
các
chỉ
dẫn biên dịch, và
hàm
main()
rỗng.
y Chuyển đổi từng bước giải thuật thành
mã lệnh:
- Thêm
các
khai
báo
cho
những
đối
tượng
chưa
được khai báo.
y Xem mã nguồn, Figure 4.1.
y Ví dụ thực thi, Sample run.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 7
Cú
Pháp và Lưu Đồ
y Lệnh if:
if(boolean_exp)
statement
y Nếu boolean_exp là true thì
statement được thực hiện, ngược lại
sự thực thi bắt đầu bằng lệnh kế tiếp
sau statement.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 8
Câu Lệnh Ghép
y Lệnh statement ở trên có thể là một
hay nhiều câu lệnh. Nếu là nhiều lệnh
thì đặt các lệnh đó trong cặp dấu { và }
để hình thành lệnh ghép. Ví dụ:
if(hoursWorked > 40.0)
{
overtime
=
hoursWorked
–
40.0;
overtimePay
=
1.5
*
overtime
*
rate;
regularPay
=
40.0
*
rate;
}
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 9
Lưu Ý
y Để tìm số lớn nhất trong hai số nguyên x và y, nhưng nếu viết:
max = x;
if(max < y) ;
max = y;
y Dấu ; sẽ làm cho if không thực hiện
hành động nào, vì thế câu lệnh max =
y luôn được thực thi. Do đó, nếu y <
x thì câu lệnh gán max = y sẽ cho kết
quả sai.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 10
Lệnh
if-else
y Ví dụ: Viết chương trình giải phương
trình bậc nhất ax + b = 0
Nhập
các
hệ
số
a, b: 5 8
Nghiệm là x = -1.6
Thực hiện
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 11
Giải Thuật
1.
Xuất thông báo nhắc người sử
dụng
nhập các hệ
số
của phương trình.
2.
Đọc các hệ
số
là
những giá
trị
thực
và
lần lượt chứa vào biến a
và
b.
3.
Nếu a = 0
thì
xét tiếp:
- Nếu b = 0, xuất “PT có
vô số
nghiệm”.
- Ngược lại, b ≠
0, xuất “PT vô
nghiệm”.
4.
Ngược lại, nếu a ≠
0
thì
hiển thị
nghiệm là:x = -b/a
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 12
Viết Mã, Thực Thi và
Kiểm Tra
y Xem mã nguồn, Figure 4.2
y Ví dụ thực thi, Sample run
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 13
Cú
Pháp và Lưu Đồ
y Lệnh if-else:
if(boolean_exp)
statement1else
statement2
y Nếu boolean_exp là true thì
statement1 được thực hiện. Ngược
lại, statement2 được thực hiện.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 14
Lệnh if-else
Lồng Nhau
y Là lệnh if-else nhưng phần if hay
else của nó là câu lệnh if-else khác
if(boolean_exp1)statement1else
if(boolean_exp2)statement2else if
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 15
Lệnh if-else
Lồng Nhau
if(Cond1)Stmt1else if(Cond2) Stmt2...
else if(Condn)Stmtnelse
Stmtn+1
Cond1
Stmt1
T F
Stmt2
Cond2
T F
Stmtn
Condn
T F
Stmtn+1
. . .
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 16
Lệnh if-else
Lồng Nhau
y Chú ý sự kết hợp của else với if:
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 17
Sự
Kết Hợp Của
else
Với if
y Xét đoạn lệnh sau:
if(x
>=
0)
if(y >= 0)
z
= sqrt (x) + sqrt(y);
else
cerr
<< "Không
tính
được!!!";
if
nào
sẽ được kết hợp với
else?
Trong
lệnh
if-else
lồng
nhau, mỗi
phần
else
sẽ được kết hợp với mỗi
phần
if
gần nhất trước
đó chưa
được kết hợp
Trong
lệnh
if-else
lồng
nhau, ỗi
phần
else
sẽ được kết hợp với ỗi
phần
if
gần nhất trước
đó chưa
được kết hợp
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 18
Nhầm Lẫn Giữa
=
và
==
y Có hai vấn đề dẫn đến sự khác nhau
giữa toán tử = và ==:
1.
true
và
false
trong
C++:
- Giá
trị
nguyên
0
được xem là false.
- Giá
trị
nguyên
khác
0
được
xem
là
true.
2. Phép
gán
là
biểu thức: x
= 7;
• Giá
trị được gán đến biến , và
• Biểu thức (x = 7) có
một giá trị
(giá
trị được gán – 7).
y Điều gì xảy ra khi viết: if(x = 7)
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 19
Nhầm Lẫn Giữa
=
và
==
y Khi viết if(x = 7):
- Giá
trị
7
được gán đến biến
x.
- Biểu thức
x = 7 có
giá
trị đó
(khác
0).
- Giá
trị
của biểu thức
dùng
để
chọn
hướng
thực thi true
hay false
trong
lệnh
if.
- Hướng thực thi luôn được chọn là
true.
y Chương trình này sẽ:
- Biên
dịch
và
thực thi.
- Nhưng
kết quả
có
thể
SAI.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 20
Biểu Thức
Điều Kiện
y Cú pháp:
condition ? exp1 : exp2
y Hành vi:
- Điều kiện
condition được tính trị.
- Nếu trị
là
true, giá
trị
của toàn bộ
biểu thức là expr1.
- Ngược lại, giá
trị
của toàn bộ
biểu
thức là expr2.
y Điều gì được hiển thị bởi các lệnh sau?
double
a
=
5,
b
=
10,
c
=
-3;
cout 0 ?
"real
root"
:
"imaginary root");
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 21
Lệnh switch
(tự
học)
y Ví dụ: Cho phép người sử dụng nhập
một nhiệt độ và chuyển thành thang
nhiệt khác. Các thang nhiệt bao gồm:
Celsius (C), Fahrenheit (F), và Kelvin
(K). Biết rằng:
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 22
Giải Thuật
1. Hiển thị
menu để
chọn.
Để
chuyển đổi nhiệt độ, chọn: A - Fahrenheit thành Celsius;B - Celsius thành Fahrenheit;C - Celsius thành Kelvin;D - Kelvin thành Celsius;E -
Fahrenheit thành Kelvin;
hayF - Kelvin thành Fahrenheit.
-->
2. Đọc mục chọn vào biến kiểu ký
tự
là
conversion.
3. Hiển thị
thông
báo
nhắc nhập
nhiệt
độ.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 23
Giải Thuật
4. Đọc nhiệt độ
vào biến temperature.
5. Xét conversion:
- Nếu là
’A’
hay ’a’
thì
chuyển từ
F
sang C, chứa kết quả
vào biến
result.
- Ngược lại, nếu là
’B’
hay ’b’
thì
chuyển từ
C
sang F, chứa kết quả
vào result.
-
- Ngược lại, thông báo lỗi.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 24
So Sánh
switch
Với if-else
y Khi sử dụng lệnh if-else lồng nhau
thì:
- Nếu chọn mục đầu tiên, cần 1 phép
so sánh.
-
- Nếu chọn mục cuối cùng, cần 12
phép so sánh.
y Khi sử dụng lệnh switch thì chỉ cần 1
phép so sánh bất chấp chọn mục đầu
tiên hay cuối cùng.
y Chương trình sau sẽ sử dụng lệnh switch thay cho if-else.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 25
Viết Mã, Thực Thi và Kiểm Tra
y Xem mã nguồn, Figure 4.3
y Ví dụ thực thi, Sample run
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 26
Cú
Pháp
switch(expression) {
case_list1 :
statement_list1 ;
case_list2 :
statement_list2 ;
default:
statement_listn+1 ;
}
Các
từ
khoáCác
từ
khoá
Biểu thức
int
hay char
Biểu thức
int
hay char
Mỗi
case_list
là
một
hay
nhiều
các
trường
hợp có dạng:
case ConstantValue:
ỗi
case_list
là
ột
hay
nhiều
các
trường
hợp có dạng:
case ConstantValue:
Mỗi
statement_list
được kết thúc bằng
lệnh
break
hay return
ỗi
statement_list
được kết thúc bằng
lệnh
break
hay return
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 27
Lưu Đồ
Của Lệnh
switch
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 28
Hành
Vi
1.
Biểu thức
expression
được tính trị.
2.
Nếu
expression
bằng với
ConstantValuei
thì điều khiển sẽ
nhảy
đến
statement_listi
sau
ConstantValuei
3.
Điều khiển tiếp tục bên trong lệnh
switch
cho
đến khi:
- Cuối lệnh
switch, hay
- lệnh
break được thực thi, hay
- lệnh return được thực thi, hay
- lệnh exit() được thực thi.
Chú
ý sự
sử
dụng
lệnh
break
trong
Figure 4.3
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 29
Hành Vi
4.
Nếu expression
không so trùng
với ConstantValuei nào thì
statement_listn+1
trong mệnh đề
default được thực hiện. Nếu
không có
mệnh đề
này, thì
sự
thực
thi sẽ
thoát khỏi switch.
5.
Mệnh đề
default
là
tùy ý, có
thể
không có
trong cấu trúc switch
6.
Lưu ý là
expression
phải là
một
biểu thức nguyên.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 30
Lưu Ý
y Trong một số trường hợp, biểu thức
của switch là một giá trị hợp lệ nhưng
không có hành động nào xảy ra cho giá
trị đó
y Giải quyết:
- Sau
các
nhãn
case
của các biểu thức
đó chỉ
là
câu
lệnh
break;
switch(option) {
case
1: doWhatever();
break;
case 2: doSomethingElse();break;
...
case 9: case 10: break;}
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 31
Khi Nào Dùng Lệnh switch
y Lệnh switch được ưa chuộng hơn lệnh
if-else lồng nhau khi:
1. Sự
so sánh bằng (==) được thực
hiện.
2.
Cùng một biểu thức được sử
dụng
để
so sánh trong mỗi điều kiện.
3.
Giá
trị
của biểu thức được so sánh
là
số
nguyên (int
hay char).
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 32
Bài
Tập Tại Lớp
y Giả sử sinh viên được xếp hạng cuối
học kỳ (thang điểm 100) dựa vào ba
loại điểm:
- Điểm bài làm ở
nhà
= 20%
- Điểm kiểm tra giữa kỳ
= 50%
- Điểm thi cuối kỳ
= 30%
y Chương trình sẽ đọc các điểm này và
tính hạng của sinh viên. Biết rằng, nếu:
- Điểm
≥
90:
Hạng
A
- 80
≤
điểm
< 90:
Hạng
B
- 70
≤
điểm
< 80:
Hạng
C
- 60
≤
điểm
< 70:
Hạng
D
- Điểm
< 60:
Hạng
F
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 33
Để
xếp hạng
của
sinh
viên
:
Nhập
điểm bài làm ở
nhà: 80
Nhập
điểm kiểm tra giữa kỳ: 80
Nhập
điểm thi cuối kỳ: 80
Điểm
trung
bình
cuối kỳ
= 80,
hạng = B
Thực hiện
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 34
Giải Thuật
1.
Khai
báo
các
hằng
HOMEWORK_WEIGHT,
TEST_WEIGHT, và
EXAM_WEIGHT
ứng
với tỉ
lệ đã
cho
là
20%, 50% và
30%.
2.
Nhắc người
dùng nhập
điểm bài làm ở
nhà, kiểm tra giữa kỳ
và
thi
cuối kỳ.
3.
Nhập
điểm tương
ứng
là
các
số
thực
vào
các
biến
homework, test, và
exam.
4.
Tính
điểm
trung
bình
cuối kỳ:
final
=
HOMEWORK_WEIGHT
*
homework +
TEST_WEIGHT * test +
EXAM_WEIGHT * exam
5.
Tính
và
hiển thị
hạng
tương
ứng
với
final.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 35
Viết Mã, Thực Thi và Kiểm Tra
y Chú ý những điều chỉnh cần thiết để có
thể sử dụng lệnh switch:
- Chuyển số
thực
final
thành
int
- Biểu thức
điều khiển của
switch
là
thương
của
phép
chia
nguyên
cho
10.
y Xem mã nguồn, Figure 4.4
y Ví dụ thực thi, Sample run
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 36
Biểu Thức Logic và
Thiết Kế
Mạch
Số
y Đại số Boole đã góp phần quan trọng
trong sự phát minh máy tính, đó là các
mạch số. Giả sử cần thiết kế mạch
cộng bán phần dựa trên 3 loại cổng
logic sau:
VÀ HOẶC ĐẢO
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 37
Biểu Thức Logic và
Thiết Kế
Mạch Số
y Gọi digit1, digit2 là hai số nhị phân,
sum (S) là tổng của chúng, và carry
(C) là số nhớ, ta có bảng sau:
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 38
Biểu Thức Logic và
Thiết Kế
Mạch Số
y Dựa vào bảng trên ta có nhận xét sau:
- Số
nhớ
C = 1 khi
digit1
và
digit2
là
1.
- Khi
C = 1
thì
tổng
S = 0.
- Ngược lại, khi
C = 0
thì
tổng
S
là
HOẶC
của
digit1
và
digit2.
y Vậy:
C = digit1 && digit2
S = !C && (digit1 || digit2)
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 39
Biểu Thức Logic và
Thiết Kế
Mạch Số
y Kết hợp các cổng logic để tạo mạch
cộng bán phần (half adder circuit).
y Xem mã nguồn Figure 4.5, sample run.
Cơ Sở
Lập Trình
Chương 3
PHÉP TOÁN VÀ
BIỂU THỨC
ĐẠI HỌC MỞ
TP.HCM
KHOA CÔNG NGHỆ
THÔNG TIN
ThS.GVC Tô Oai Hùng 2
Mục Tiêu
y Cung cấp cách thể hiện biểu thức C++
trong chương trình, gồm:
- Biểu thức số
học.
- Biểu thức luận lý.
- Biểu thức gán.
- Sử
dụng các toán tử tăng/giảm.
- Biểu thức nhập/xuất.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 3
Vấn Đề
y Dùng phương trình Einstein e = m.c2
để tính năng lượng chứa trong khối
lượng vật chất cho trước:
Để
tính năng lượng, nhập khối
lượng (là
số
không âm):
123
Năng lượng
= 999.99 kJ
Thực hiện
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 4
Giải Thuật
1.
Khai báo hằng
SPEED_OF_LIGHT
2.
Hiển thị
thông báo nhắc người sử
dụng nhập khối lượng.
3.
Đọc một số
thực không âm và
chứa
vào biến mass.
4.
Tính
5.
Hiển thị
giá
trị
energy ra màn hình.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 5
Viết Mã, Thực Thi và
Kiểm Tra
y Figure 3.1 Xem mã nguồn
y Sample run Ví dụ thực thi, dữ liệu thử
bao gồm:
- Hai giá
trị
nguyên.
- Một giá
trị
thực.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 6
Biểu Thức
y Định nghĩa: Một dãy các toán hạng và
toán tử được kết hợp nhau để tạo ra
một giá trị được gọi là biểu thức.
y Ví dụ:
double
energy
=
mass
*
SPEED_OF_
LIGHT
* SPEED_OF_LIGHT;
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 7
Biểu Thức Số
Học
y C++ cung cấp bốn toán tử số học quen
thuộc:
+
cộng
-
trừ
*
nhân
/
chia
y Các toán tử này có thể thực hiện trên
các toán hạng số thực (double) hay số
nguyên (int).
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 8
Phép Chia
y Trong phép chia, các toán hạng int và
double sẽ cho kết quả khác nhau. Ví
dụ:
y Nếu cả hai toán hạng là các số nguyên:
- Phép chia nguyên được thực hiện.
- Ngược lại, phép chia thực được thực
hiện.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 9
Phép Chia Nguyên
y Ngoài toán tử / còn có toán tử lấy phần
dư (%).
y Biểu thức 3/4 cho kết quả là thương số
(0) của phép chia:
- Đây là
phép chia nguyên.
y Biểu thức 3%4 cho kết quả là số dư (3)
của phép chia:
- Đọc là,
"3 mod 4".
- Toán tử
phần dư %
chỉ
thực hiện trên
các toán hạng là
số
nguyên.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 10
Độ Ưu Tiên Của Toán Tử
y Biểu thức
2
+ 3 * 4
sẽ
có
giá
trị
là
bao nhiêu:
(2 + 3) * 4 →
20
hay
2
+ (3 * 4) →
14 ?
y Độ ưu tiên của toán tử sẽ chi phối thứ
tự tính toán.
y Toán tử * có độ ưu tiên cao hơn +.
y Toán tử * được thực thi trước.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 11
Độ Ưu Tiên Của Toán Tử
()
CAO HƠN
+
(dương),
-
(âm),
!
(phủ)
*,
/,
%
+,
-
<,
<=,
>,
>=
==,
!=
&&
||
THẤP HƠN
Xem Phụ
lục C
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 12
Sự
Kết Hợp
y Biểu thức
8 - 4 – 2
sẽ
có
giá
trị
là
(8
-
4) –
2 →
2
hay 8
-
(4 -
2) → 6
?
y Độ ưu tiên không có tác dụng trong
trường hợp này.
y Sự kết hợp sẽ chi phối biểu thức trên
- Toán tử
trừ
kết hợp trái, bên trái
được tính trước, cho kết quả
là
2.
y Hầu hết (không phải tất cả) các toán tử
C++ là kết hợp trái.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 13
Chuyển Đổi Kiểu Dữ
Liệu
y Khi có sự kết hợp giữa số nguyên và
số thực trong cùng biểu thức. Ví dụ:
2
+ 3.0 →
5.0
y C++ tự động chuyển những giá trị hẹp
thành những giá trị rộng hơn, được gọi
là chuyển đổi kiểu ngầm định:
- Số nguyên được chuyển thành số
thực.
- Kết quả
của biểu thức là
số
thực.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 14
Chuyển Đổi Kiểu Dữ
Liệu
y Có thể chuyển đổi tường minh một giá
trị từ một kiểu đến kiểu khác.
y Cú pháp:
type
(expression)
hay
(type) expression
y Chuyển đổi kiểu có thể làm mất dữ
liệu. Ví dụ:
double
x = 3.456;
cout
<< (int) x;
Giá
trị
hiển thị?3
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 15
Biểu Thức Luận Lý
y Kiểu luận lý của C++ là int hay
unsigned, nó có hai giá trị đúng hay
sai
y Toán tử quan hệ tạo biểu thức luận lý:
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 16
Các Phép Toán Quan Hệ
y Sử dụng toán tử so sánh
- Mỗi toán tử
cần hai toán hạng
- Sinh ra giá
trị
luận lý (đúng
hay sai):
x < 5.2
b * b >= 4.0 * a * c
number == 500
‘a’
< ‘b’
y Lưu ý:
- KHÔNG lẫn lộn giữa =
(toán tử
gán)
với
==
(toán tử
so sánh bằng).
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 17
Biểu Thức Luận Lý Kết Hợp
y Các toán tử luận lý:
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 18
Biểu Thức Luận Lý Kết Hợp
y Các biểu thức luận lý phức tạp hơn có
thể được xây dựng bằng cách sử dụng
các toán tử luận lý:
a && b
// true
iff cả
hai a
và
b
là
true
a || b
// true
iff a
hay b
là
true
!a
// true
iff a
là
false
y Ví dụ:
cin >> score;
assert(0
<=
score
&&
score
<=
100);
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 19
Cách Tính Tắt
y Xét biểu thức luận lý sau:(n != 0) && (x < 1.0 / n)
- Biểu thức bên phải sẽ
không thực
thi nếu n == 0, vì
thế
lỗi chia 0
sẽ
không xảy ra.
y C++ sẽ tính biểu thức ban đầu từ trái
sang phải:
- Nếu
n == 0, biểu thức bên trái là
false.
- Vì đây là
toán tử
luận lý &&, nên toàn
bộ
biểu thức là
false.
- Vì
vậy, biểu thức bên phải không
được thực thi.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 20
Tiền Điều Kiện
y Khi chương trình muốn giá trị nhập
của nó bị ràng buộc trong điều kiện
nào đó:
- Ví
dụ:
Các số
nhập phải dương.
y Tiền điều kiện là các biểu thức luận lý
- Giá
trị
của các biểu thức này phải là
true để chương trình thực thi đúng.
y Để kiểm tra tiền điều kiện, C++ cung
cấp cơ chế assert().
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 21
Cơ Chế
assert()
#include
#include
int main()
{
cout
<< “\nNhập tuổi của bạn:
“;
int
age;
cin >> age;
assert(age > 0);
// ...
}
Phải được thêm vào
khi chương trình có
sử
dụng lệnh assert
assert()
sẽ
dừng chương
trình nếu
age
<= 0
if(age <= 0)
exit(1);
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 22
Biểu Thức Gán
y Cú pháp:
variable = expression;
- expression được tính cho một giá
trị
- Giá
trị đó được đặt trong vị
trí
nhớ
kết hợp với variable
y Ví dụ:
xCoord
= 4.56;
code
= 'T';
xCoord 4.56
code T
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 23
Biểu Thức Gán
y Xét ba câu lệnh gán sau:
y Giá trị trước đó của biến sẽ bị mất sau
khi thực thi lệnh gán.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 24
Biểu Thức Gán
y Toán tử gán =
- Kết hợp phải,
- Hỗ
trợ
các biểu thức như (toán tử
gán sinh trị):int
w, x, y, z;
w
= x = y = z = 0;
• Toán tử
=
bên phải nhất được thực
hiện trước
- Gán
z
bằng không,
- Rồi y
được gán giá
trị
của z
(0),
- Rồi
x
được gán giá
trị
của
y
(0)
- Cuối cùng
w
được gán giá
trị
của
x
(0).
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 25
Phép Gán Rút Gọn
y Một số phép gán thường sử dụng:
var = var + x;
//
var
cộng với
x
var = var -
y;
// var
trừ
cho
y
y C++ cung cấp cách rút gọn chúng:
var += x; //
var cộng với
x
var -= y; // var
trừ
cho
y
y Tổng quát, các biểu thức số học có
dạng:
var = var Δ
value;
có
thể được viết theo dạng “rút gọn”:
var Δ= value;
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 26
Phép Gán Rút Gọn
y Ví dụ:
double x, y;
cin >> x >> y;
x *= 2.0;
//
tăng x
gấp đôi
y /= 2.0;
//
giảm y
một nửa
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 27
Phép Toán Tăng Và
Giảm
y Các phép gán thường dùng khác:
var = var + 1;
//
var
cộng 1
var = var -
1;
// var
trừ
1
y C++ cũng cung cấp cách rút gọn cho
chúng:
var++;
// var
cộng 1
var--;
// var
trừ
1
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 28
Phép Toán Tăng Trước
y Dạng tiền tố của phép toán tăng làm
cho giá trị toán hạng của nó được tăng
lên 1 trước khi giá trị đó được sử
dụng trong biểu thức:
int
x, y = 0;
x
= ++y;
cout
<< x;
y Dạng tiền tố của phép toán giảm cũng
tương tự.
Hiển thị
1
và
y
= 1
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 29
Phép Toán Tăng Sau
y Dạng hậu tố của phép toán tăng chỉ
tăng giá trị toán hạng của nó lên 1 sau
khi giá trị đó được sử dụng trong biểu
thức:
int
x, y = 0;
x
= y++;
cout
<< x;
y Dạng hậu tố của phép toán giảm cũng
tương tự
Hiển thị
0
và
y
= 1
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 30
Phép Toán Tăng Trước Và
Sau
y Khi các toán tử tăng (hay giảm) được
sử dụng trong câu lệnh riêng biệt:
int
y = 0, x = 0;
++x; //
x =
1
y++; //
y =
1
thì
tác dụng của dạng tiền tố
hay hậu tố
trong phép toán tăng (hay giảm) là như
nhau.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 31
Chuyển Biểu Thức Thành
Câu Lệnh
y Một biểu thức có dấu chấm phẩy theo
sau sẽ trở thành câu lệnh:
x
= y + z;
'A';
cos(z); Các câu lệnh
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 32
Luồng Nhập -
Xuất
y C++ không trang bị sẵn các thao tác
nhập/xuất trong ngôn ngữ:
- Luồng nhập/xuất được cung cấp bởi
istream
và
ostream
cout cin
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 33
Biểu Thức Nhập
y Cú pháp:
input_stream >> variable;
y Toán tử >> có thể được nối với nhau
cin
>> x >> y;
y Kiểu của giá trị nhập phải phù hợp với
kiểu của biến. Vậy, nên xuất thông báo
cho người sử dụng biết trước khi nhập.
Ví dụ:
cout << “Nhập số
thực: “;
double x;
cin >> x;
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 34
Biểu Thức Xuất
y Cú pháp:
output_stream
<< expression;
y Toán tử << có thể được nối với nhau:
cout
<< "The
sum
= " <<
sum;
y Toán hạng của << có thể là biến, hằng,
hay sự kết hợp của chúng bằng toán
tử:
cout
<<
"Sum
=
"
<<
v1
+
v2
+
v3;
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 35
Định Dạng Xuất
y ios::showpoint: Hiển thị dấu chấm
thập phân và phần lẻ (kể cả 0) đối với
số thực. Mặc định là không hiển thị
phần lẻ nếu nó là không.
y ios::fixed: Sử dụng ký pháp dấu
chấm cố định cho các giá trị thực.
y ios::scientific: Sử dụng ký pháp
khoa học cho các giá trị thực.
y ios::left (hay ios::right): Hiển thị
giá trị được canh trái (hay canh phải –
mặc định) trong một trường.
y setprecision(p): Hiển thị p số lẻ cho
tất cả giá trị thực ở những lần xuất sau
đó (mặc định là 6).
Phải có
chỉ
dẫn
#include
#include
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 36
Bài Tập Tại Lớp
Vấn đề:
y Một công ty sử dụng xe tải để phân
phối hàng hoá. Mỗi chuyến đi, tài xế ghi
lại số dặm đã vận chuyển, số gallon
nhiên liệu đã sử dụng, giá tiền mỗi
gallon, và chi phí vận hành cho mỗi
dặm.
y Nhân viên kế toán muốn báo cáo số
dặm đi được cho mỗi gallon nhiên liệu,
tổng chi phí vận chuyển, chi phí vận
chuyển cho mỗi dặm trong mỗi chuyến
đi.
y Viết chương trình để ghi nhận và tính
các số liệu này.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 37
Thực Hiện
Ghi nhận số
liệu:
Số
dặm đã vận chuyển:
99
Số
gallon nhiêu liệu đã dùng:
99.99
Giá
tiền mỗi gallon:
99.99
Chi phí
vận hành mỗi dặm: 9.99
Số
dặm đi được cho mỗi gallon:
99.99
Tổng chi phí
vận chuyển:
99.99
Chi phí
vận chuyển mỗi dặm:
99.99
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 38
Giải Thuật
1.
Hiển thị
thông báo nhập số
dặm, số
gallon nhiên liệu, số
tiền mỗi gallon,
chi phí
mỗi dặm.
2.
Đọc giá
trị
vào các biến miles,
gallonsOfFuel, unitFuelCost
và
unitOperatingCost.
3.
Kiểm tra mỗi giá
trị
này phải là
giá
trị dương.
4.
Tính milesPerGallon = miles/
gallonsOfFuel
5.
Tính fuelCost = gallonsOfFuel
* unitFuelCost
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 39
Giải Thuật
6.
Tính
operatingCost =
unitOperatingCost * miles
7.
Tính totalTripCost = fuelCost
+ operatingCost
8.
Tính costPerMile =
totalTripCost / miles
9.
Hiển thị
milesPerGallon,
total-
TripCost
và
costPerMile
ra màn
hình.
Cơ Sở
Lập Trình
ThS.GVC Tô Oai Hùng 40
Viết Mã, Thực Thi Và
Kiểm Tra
y Figure 3.2: Xem mã nguồn.
y Chú ý các bước:
- Xuất thông báo nhắc người sử
dụng.
- Nhập các giá
trị.
- Định dạng xuất.
y Sample runs: Ví dụ thực thi.
Cơ Sở
Lập Trình
Chương 6
HÀM
(Phần 1)
ĐẠI HỌC MỞ
TP.HCM
KHOA CÔNG NGHỆ
THÔNG TIN
ThS.GVC Tô Oai Hùng 2
Mục Tiêu
y Xét chương trình có sử dụng hàm.
y Mô tả chi tiết sự thực thi bên trong
hàm.
y Định nghĩa hàm.
y Gọi hàm.
y Các bước thiết kế hàm.
y Nguyên mẫu hàm.
y Hàm không trả trị.
y Một số hàm toán học và xử lý ký tự.
ThS.GVC Tô Oai Hùng 3
Vấn Đề
y Viết chương trình chuyển đổi nhiệt độ
từ thang nhiệt Fahrenheit thành
Celsius. Biết:
Để
chuyển thành Celsius,
nhập nhiệt độ
Fahrenheit:
99
Nhiệt độ
Celsius là
99.9
Thực hiện
ThS.GVC Tô Oai Hùng 4
Giải Thuật
y Nhắc người sử dụng nhập nhiệt độ
Fahrenheit.
y Nhập giá trị thực và chứa vào tempFahrenheit.
y Tính
tempCelsius = (tempFahrenheit –
32.0) / 1.8
y Xuất tempCelsius.
ThS.GVC Tô Oai Hùng 5
Viết Mã, Thực Thi và
Kiểm Tra
y Xem mã nguồn, Figure 6.1
y Ví dụ thực thi, Sample Run
ThS.GVC Tô Oai Hùng 6
Sử
Dụng Hàm
y Sự định nghĩa hàm (thay vì viết mã lệnh
trong main()) để chuyển đổi nhiệt độ
từ Fahrenheit thành Celsius làm cho
các hàm hay các chương trình khác có
thể tái sử dụng nó.
y Tránh lặp lại mã lệnh nếu có nhiều nơi
trong chương trình sử dụng các mã
lệnh này.
y Xem mã nguồn, Figure 6.2.
ThS.GVC Tô Oai Hùng 7
So Sánh Figure 6.1 với 6.2
y Hình 6.2 xuất cùng kết quả với Hình 6.1
1 2 3
4
56
78
ThS.GVC Tô Oai Hùng 8
Định Nghĩa Hàm
y Định nghĩa hàm:
- Chứa những câu lệnh để
thực hiện
hành vi của nó
khi nó được gọi.
y Định nghĩa hàm có dạng:
return_type name (parameter-
Declarations)
{
statementList
}
ThS.GVC Tô Oai Hùng 9
Ví
Dụ Định Nghĩa Hàm
const double PI = 3.14159;
double area(double length,
double width)
{
double halfLength = length/2.0,
halfWidth = width/2.0;
return PI * halfLength *
halfWidth;
}
double circumference(double
length, double width)
{
ThS.GVC Tô Oai Hùng 10
Ví
Dụ Định Nghĩa Hàm
double halfLength = length/2.0,
halfWidth = width/2.0;
return 2.0 * PI *
sqrt((pow(halfLength, 2.0) +
pow(halfWidth, 2.0))/2.0);
}
ThS.GVC Tô Oai Hùng 11
Nguyên Mẫu Hàm
y Dùng để khai báo hàm:
- Cho phép hàm đó có thể được gọi.
y Nguyên mẫu hàm phải được xuất hiện
trước bất kỳ lời gọi nào hay định nghĩa
hàm
- Ngược lại, trình biên dịch sẽ
báo lỗi.
- Trình BD phải biết sự
tồn tại của
hàm đó.
y Dạng nguyên mẫu hàm:
return_type name(parameter-
Declarations);
ThS.GVC Tô Oai Hùng 12
Ví
Dụ
Nguyên Mẫu Hàm
#include
#include
double area(double, double);
double circumference(double,
double);
int main()
{
cout << “Tính diện tích và
chu vi
của Ellipse\n“
<< “Nhập chiều dài và
rộng: “;
double length, width;
cin >> length >> width;
ThS.GVC Tô Oai Hùng 13
Ví
Dụ
Nguyên Mẫu Hàm
double ellipseArea =
area(length, width);
double ellipseCircum =
circumference(length,width);
cout << “\nDiện tích là
“
<< ellipseArea
<< “\nvà
chu vi là
“
<< ellipseCircum;
} Để
gọi hàm, sử
dụng tên của nóĐể
gọ hà , sử
dụng tên của nó
ThS.GVC Tô Oai Hùng 14
Gọi Hàm Trả
Trị
y Lời gọi hàm bao gồm tên hàm và
những giá trị mà hàm bị gọi cần đến,
được gọi là đối số.
y Lời gọi hàm trả trị là một biểu thức:
double tempCelsius =
fahrToCelsius(tempFahrenheit);
ThS.GVC Tô Oai Hùng 15
Hàm Là Chương Trình Con
y Các bước để thiết kế chương trình có
thể được sử dụng để thiết kế hàm:
1. Hành vi.
2. Giải thuật.
3. Viết mã.
4. Kiểm tra, thực thi, phát hiện lỗi.
5. Bảo trì.
Hành vi của hàm gồm:
Nhận các giá
trị
từ
hàm gọi
Trả
về
giá
trị
cho hàm gọi
ành vi của hà gồ :
hận các giá
trị
t
hà gọi
Trả
về giá
trị
cho hà gọi
ThS.GVC Tô Oai Hùng 16
Tham Số
y Là các biến của hàm bị gọi mà hàm gọi
có thể chỉ định giá trị cho nó.
y Tham số được định nghĩa giữa cặp
dấu ngoặc đơn trong phần định nghĩa
hàm.
double fahrToCelsius(double
tempFahr)
{
return (tempFahr - 32.0) / 1.8;
}
ThS.GVC Tô Oai Hùng 17
Đối Số
y Khi một hàm được gọi:
- Hàm gọi có
thể
truyền giá
trị
của
nó
cho hàm bị
gọi, các giá
trị
này
được gọi là đối số.
- Giá
trị
của đối số
sẽ được chứa
trong tham số
của hàm bị
gọi.
double tempCelsius = fahrToCelsius(212)
double fahrToCelsius(double tempFahr){
return (tempFahr - 32.0) / 1.8;
y Khi hàm này thực thi, nó sẽ sử dụng giá
trị tham số của nó
212
ThS.GVC Tô Oai Hùng 18
Xét Hàm fahrToCelsius()
y Các thao tác gồm:
- Trừ
số
thực: tempFahr – 32.0
- Chia số
thực:
(tempFahr – 32.0)/1.8
- Trả
về
giá
trị
thực
double fahrToCelsius(double tempFahr)
{
return (tempFahr - 32.0) / 1.8;
}
ThS.GVC Tô Oai Hùng 19
Thiết Kế
Hàm (Lưu ý)
y Đặc tả hàm: Xác định phần đầu của
hàm gồm:
- Kiểu trả
về
(nếu có).
- Tên hàm.
- Các tham số
và
kiểu của chúng (nếu
có).
y Viết giải thuật: Xác định phần thân của
hàm gồm:
- Nhập, xuất.
- Rẽ
nhánh, lặp vòng.
ThS.GVC Tô Oai Hùng 20
Thiết Kế
Hàm (Lưu ý)
y Để kiểm tra hàm cần phải có chương
trình điều khiển:
- Mã nguồn, Figure 6.3
y Ví dụ thực thi, Test Run
ThS.GVC Tô Oai Hùng 21
Biến Cục Bộ
y Chương trình ví dụ của chúng ta chỉ
sử dụng tham số tempFahr.
y Tuy nhiên, nhiều hàm khác cần thêm
các biến bên trong nó gọi là biến cục
bộ:
y Biến cục bộ bị hủy đi khi sự thực thi
thoát khỏi hàm (hay khối) chứa nó.
int maximum(int x, int y, int z)
{
int max = x;
if(y > max) max = y;
if(z > max) max = z;
return max;
}
ThS.GVC Tô Oai Hùng 22
Biến Cục Bộ
y Tham số cũng được xem là biến cục
bộ.
y Do đó, bên trong một hàm nếu biến cục
bộ và tham số có cùng tên là lỗi cú
pháp
y Ví dụ:
int sum(int a, int b)
{
int a;
return a + b;
}
LỖI
ThS.GVC Tô Oai Hùng 23
Biến Toàn Cục
y Được tạo ra bằng cách đặt khai báo
biến bên ngoài tất cả định nghĩa hàm
#include
int x = 1;// x là
biến toàn cục
int main()
{
//...
}
y Biến toàn cục duy trì giá trị của nó
trong suốt thời gian thực thi chương
trình.
ThS.GVC Tô Oai Hùng 24
Hàm Không Trả
Trị
y Nhiều chương trình có các tác vụ
thường được lặp lại:
- Hiển thị
giá
trị, thông báo.
- Đọc giá
trị
từ
bàn phím, tập tin.
y Các tác vụ này có thể được thực hiện
bởi hàm không trả trị - hàm void
y Hàm void còn được sử dụng để trả về
nhiều giá trị cho hàm gọi (chương 7).
y Mã nguồn, Figure 6.4
y Ví dụ thực thi, Sample Runs
ThS.GVC Tô Oai Hùng 25
Gọi Hàm Không Trả
Trị
y Cần phân biệt lời gọi hàm trả trị với lời
gọi hàm không trả trị.
y Lời gọi hàm trả trị là biểu thức:
double tempCelsius =
fahrToCelsius(tempFahrenheit);
y Lời gọi hàm không trả trị là câu lệnh:
printAsMoney(payment-purchase);
ThS.GVC Tô Oai Hùng 26
Một Số
Hàm Toán Học
y Các hàm toán học trong tập tin
ceil(x) ceil(9.2) là 10.0
ceil (–9.8) là
–9.0
cos(x) cos(0.0) là 1.0
cos(1.570796) là
0.0
exp(x) exp(1.0) là
2.71828
exp(2.0) là
7.38906
fabs(x) fabs(5.1) là
5.1
fabs(0.0) là
0.0
fabs(–8.76) là
8.76
ThS.GVC Tô Oai Hùng 27
Một Số
Hàm Toán Học
floor(x) floor(9.2) là
9.0
floor(–9.8) là
–10.0
fmod(x, y) fmod(13.657, 2.333)
là
1.992
log(x) log(2.718282) là
1.0
log(7.389056) là
2.0
log10(x) log10(10.0) là
1.0
log10(100.0) là
2.0
pow(x, y) pow(2, 7) là 128
pow(9, .5) là 3
ThS.GVC Tô Oai Hùng 28
Một Số
Hàm Toán Học
sin(x) sin(0.0) là 0
sin(1.570796) là
1.0
sqrt(x) sqrt(900.0) là
30.0
sqrt(9.0) là 3.0
tan(x) tan(0.0) là
0
tan(0.785398) là 1.0
ThS.GVC Tô Oai Hùng 29
Một Số
Hàm Xử
Lý Ký Tự
y Các hàm xử lý ký tự trong
int isdigit(int c): Trả
về
true
nếu c là
ký số, ngược lại là
false.
int isalpha(int c): Trả
về
true
nếu c là
ký tự
chữ.
int isalnum(int c): Trả
về
true
nếu c là
ký tự
số
hay ký tự
chữ.
int islower(int c): Trả
về
true
nếu c là
ký tự
chữ thường.
ThS.GVC Tô Oai Hùng 30
Một Số
Hàm Xử
Lý Ký Tự
int isupper(int c): Trả
về
true
nếu c là
ký tự
chữ
hoa.
int tolower(int c): Nếu c là
ký tự
hoa thì
tolower() trả
về
ký tự
thường. Ngược lại, giá
trị
trả
về
không đổi.
int toupper(int c): Nếu c là
ký
tự thường thì
toupper() trả
về
ký
tự hoa. Ngược lại, giá
trị
trả
về
không đổi.
Bài Tập Tại Lớp
Thành lập mỗi nhóm gồm hai người
để
giải quyết vấn đề sau đây:
ThS.GVC Tô Oai Hùng 32
Vấn Đề
y Định nghĩa một hàm gồm chức năng
sau:
- Cho phép người sử
dụng thực hiện
các thao tác cộng, trừ, nhân, chia,
và
lũy thừa.
y Hành vi:
- Người sử
dụng nhập một toán tử.
- Chương trình sẽ
nhắc người sử
dụng nhập các toán hạng.
- Tính và
hiển thị
kết quả.
Chương 7
HÀM
(Phần 2)
ĐẠI HỌC MỞ
TP.HCM
KHOA CÔNG NGHỆ
THÔNG TIN
ThS.GVC Tô Oai Hùng 2
Mục Tiêu
y Mở rộng giới thiệu hàm trong chương 6
y Xét chi tiết cách truyền tham số.
y Tại sao và khi nào sử dụng hàm inline.
y Các qui tắc tầm vực/phạm vi.
y Nạp chồng hàm.
y Hàm template.
ThS.GVC Tô Oai Hùng 3
Vấn Đề
y Xét phép chia nguyên:
- Cho kết quả
là thương và
phần dư.
- Chúng ta muốn định nghĩa một hàm
mà
nó
trả
về
hai giá
trị
này.
y Tuy nhiên, nếu sử dụng lệnh return thì
mỗi hàm chỉ có thể trả về chỉ một giá trị.
y Các tham số mà chúng ta biết trước đây
được gọi là tham trị (value parameter),
nó là bản sao của các đối số của nó.
y Sự thay đổi giá trị của tham trị trong
hàm bị gọi, chính là thay đổi giá trị của
bản sao chứ không phải đối số thực
của nó.
ThS.GVC Tô Oai Hùng 4
Giải Quyết
y Tham số tham chiếu:
- Các tham số được khai báo với dấu &
- Dấu & được đặt sau kiểu của tham số
nhưng trước tên của nó.
y Tham số tham chiếu là một bí danh
(alias) cho đối số tương ứng của nó.
y Sự thay đổi giá trị của tham số tham
chiếu sẽ thay đổi giá trị của đối số
tương ứng của nó.
ThS.GVC Tô Oai Hùng 5
Giải Quyết
y Ví dụ một hàm với các tham số tham
chiếu:
void divideInts(int op1,int op2,
int& quotient,
int& remainder)
{
...
}
y quotient và remainder nhận giá trị
thích hợp của các câu lệnh gán trong
hàm bị gọi.
y Các đối số tương ứng trong lời gọi hàm
sẽ nhận cùng các giá trị này.
ThS.GVC Tô Oai Hùng 6
Sử
Dụng Tham Số
Tham Chiếu
y Định nghĩa hàm, Figure 7.1
- Chương trình, Figure 7.2
- Ví
dụ
thực thi, Sample Run
y Các biến quot và rem trong lời gọi hàm
for(int j = 1; j <= 4; j++)
{
for(int i = 1; i <= 4; i++)
{
divideInts(i, j, quot, rem);
...
y Những biến này chứa các giá trị được
gởi trở lại từ hàm bị gọi.
ThS.GVC Tô Oai Hùng 7
Tham Số
y Có hai cách truyền đối số đến tham số:
- Truyền bằng trị: tham số tương ứng
được gọi là
tham trị/tham số
trị.
- Truyền bằng tham chiếu: tham số
tương ứng được gọi là
tham số
tham
chiếu.
ThS.GVC Tô Oai Hùng 8
Tham Trị
y Là những biến riêng biệt trong bản sao
của các đối số
y Trong ví dụ trước, op1 và op2 là các
tham trị.
y Những đối tượng lớn được truyền bằng
tham trị sẽ tốn thời gian và bộ nhớ đáng
kể.
ThS.GVC Tô Oai Hùng 9
Tham Số
Tham Chiếu
y Một bí danh (tên thay thế) của đối số
tương ứng trong lời gọi hàm.
y Thay đổi giá trị của tham số tham
chiếu sẽ thay đổi giá trị của đối số
tương ứng.
1
2
ThS.GVC Tô Oai Hùng 10
Tham Số
Tham Chiếu
y Đối số tương ứng với tham số tham
chiếu phải là biến và có cùng kiểu với
tham số:
void divideInts(int op1, int op2,
int& quotient, int& remainder)
{
assert(op2 != 0);
quotient = op1 / op2;
remainder = op1 % op2;
}
----
divideInts(5, 3, quot, rem);
ThS.GVC Tô Oai Hùng 11
Tham Chiếu const
y Tránh phí tổn thời gian truyền bản sao
của đối số trong truyền bằng trị.
y Tạo sự an toàn (không cho phép sửa
đổi giá trị đối số) trong cách truyền
bằng tham chiếu.
void const_Ref (const int& x)
{
...
}
ThS.GVC Tô Oai Hùng 12
Sử
Dụng Tham Số
(Quan Trọng)
1. Nếu hàm bị
gọi chỉ
nhận giá
trị
từ
hàm
gọi mà
kiểu giá
trị đó là kiểu dữ
liệu cơ
bản thì
sử
dụng tham trị.
2. Nếu hàm bị
gọi chỉ
nhận giá
trị
từ
hàm
gọi mà
giá
trị đó là những đối tượng có
kiểu dữ
liệu lớn thì
sử
dụng tham số
tham chiếu const.
3. Nếu chỉ
có
một giá
trị được truyền trở
lại hàm gọi thì
hàm bị
gọi là
hàm trả
trị
thông qua lệnh return.
4. Nếu có
nhiều giá
trị được truyền trở
lại
hàm gọi thì
hàm bị
gọi là
hàm không trả
trị
(void) và
sử
dụng tham số
tham
chiếu
cho những giá
trị đó.
ThS.GVC Tô Oai Hùng 13
Ví
Dụ
1
y Mô phỏng máy tính tiền tự động:
- Nhập: Tổng số
tiền đã mua và đã trả.
- Xuất: Tiền thối lại theo dollar, đồng
25 xu, hào, đồng 5 xu, và đồng xu.
y Phần đầu của hàm:
void makeChange( double purchase,
double payment,
int& dollars, int& quarters,
int& dimes, int& nickels,
int& pennies)
{ ... }
Các tham số
tham chiếuCác tha số
tha chiếu
Các tham trịCác tha trị
ThS.GVC Tô Oai Hùng 14
Giải Thuật
1.
Tính tiền thối lại: payment - purchaseAmount
2.
Nếu tiền thối lại lớn hơn hay bằng 0
- Tính số
dollar.
- Tính số đồng 25 xu.
- . . .
3.
Ngược lại, gán:
- Xuất thông báo lỗi
- Gán dollars, quarters,
bằng
0.
ThS.GVC Tô Oai Hùng 15
Viết Mã
y Định nghĩa hàm, Figure 7.3.
y Chú ý là hàm divdeInts() trong ví dụ
trước:
void divideInts(int op1,int op2,
int& quotient, int& remainder)
{
...
}
có
thể được sử
dụng.
y Chương trình, Figure 7.4, Sample Run
Hãy cho biết lời gọi hàm
divideInts() được
thực hiện như thế
nào?
Hãy cho biết lời gọi hà
divideInts() được
thực hiện như thế
nào?
ThS.GVC Tô Oai Hùng 16
y Định nghĩa hàm để hoán đổi giá trị
của hai biến
- Giả
sử
hàm swap() được định
nghĩa để
thực hiện tác vụ
này.
- Chúng ta sẽ
hoán đổi giá
trị
của hai
số
nguyên.
Ví
Dụ
2
ThS.GVC Tô Oai Hùng 17
Viết Mã
void swap(int& first,int& second)
{
int temporary = first;
first = second;
second = temporary;
}
Gọi hàm:
int a = 5, b = 3;
swap(a, b);
cout << a << ‘ ‘ << b << endl;
Hãy cho biết tại sao
cần biến
temporary
Hãy cho biết tại sao
cần biến
temporary
Giá
trị
gì được
hiển thị?
iá
trị
gì được
hiển thị?
ThS.GVC Tô Oai Hùng 18
Hàm inline
y Khi một hàm gọi hàm khác
void f(int n)
{
...
x = g(n);
...
}
sự
thực thi chuyển từ
hàm này sang
hàm khác, do đó thời gian thực thi tăng.
y Để tránh chi phí thời gian này, C++ cung
cấp hàm inline.
y Hàm inline nên sử dụng cho những
hàm nhỏ, được gọi thường xuyên.
ThS.GVC Tô Oai Hùng 19
Hàm inline
y Để định nghĩa hàm inline , sử dụng từ
khóa inline trong nguyên mẫu và
trong định nghĩa hàm.
inline double fahrToCel (double
temp);
...
inline double fahrToCel (double
temp)
{ return (temp – 32.0)/1.8; }
y Trình biên dịch sẽ đặt mã lệnh của hàm inline vào mỗi lời gọi hàm trong hàm
gọi để tránh sự gọi hàm
ThS.GVC Tô Oai Hùng 20
Tầm Vực/Phạm Vi, Nạp Chồng
y Hai hàm có cùng tên trong cùng một
chương trình như sau có hợp lệ
không?
int sum(int n)
{ return n * (n + 1) / 2; }
int sum(int m, int n)
{
assert( m < n) ;
return (n – m + 1) * (n + m) / 2 ;
}
Cùng danh hiệu nhưng có
thể được sử
dụng trong hai
hàm khác nhau
Cùng danh hiệu nhưng có
thể được sử
dụng trong hai
hà khác nhau
Hai hàm có
thể
có
cùng tên
Hai hà có
thể
có
cùng tên
ThS.GVC Tô Oai Hùng 21
Tầm Vực/Phạm Vi, Nạp Chồng
y Hai danh hiệu cùng tên sau có hợp lệ
không?
void f()
{ int value;
...
char value;
...
}
Tầm vực
của một danh hiệu là
miền nào
đó trong chương trình mà
danh hiệu đó
có
thể được truy xuất.
Hai danh hiệu cùng tên n
không hợp lệ
vì
chúng đư
khai báo trong cùng một
Hai danh hiệu cùng tên n
không hợp lệ
vì
chúng đư
khai báo trong cùng ột k
ThS.GVC Tô Oai Hùng 22
Các Qui Tắc Tầm Vực
1.
Nếu một danh hiệu được khai báo
trong một khối, tầm vực của nó
bắt
đầu từ
vị
trí
khai báo đến cuối khối đó
2.
Nếu một danh hiệu là
tham số
của
một hàm, tầm vực của nó
là
thân của
hàm đó.
3.
Nếu một danh hiệu được khai báo
trong biểu thức khởi tạo của vòng lặp for, thì
tầm vực của nó đến cuối vòng
lặp đó.
4.
Nếu một danh hiệu được khai báo bên
ngoài tất cả
các khối/hàm, tầm vực
của nó
từ
vị
trí
khai báo đến cuối tập
tin.
ThS.GVC Tô Oai Hùng 23
Các Qui Tắc Tầm Vực
y Qui tắc 4 ngầm định:
- Nguyên mẫu hàm phải được đặt
trước lời gọi đầu tiên đến hàm đó.
- Tập tin tiêu đề
phải được gộp vào
(#include) trước khi các phần tử
của thư viện đó được sử
dụng
trong chương trình.
y Bên trong tầm vực của một danh hiệu
(trong cùng một khối) không được
khai báo lại danh hiệu đó.
ThS.GVC Tô Oai Hùng 24
Nạp Chồng Hàm
y Các hàm được phân biệt với nhau bằng
chữ ký (tên hàm và các tham số) của
nó.
y Nhiều hàm có thể có cùng tên nhưng
phải:
- Khác nhau về
số
tham số, hoặc
- Khác nhau về
kiểu của các tham số.
y Khi điều này xảy ra, chúng ta nói rằng
các hàm được nạp chồng.
int sum(int n);
int sum(int m, int n);
ThS.GVC Tô Oai Hùng 25
Nạp Chồng Hàm
y Hãy cho biết các hàm sau có được nạp
chồng không?
1. int sum(int n);
int sum(double n);
2. int sum(int n);
double sum(int n);
ThS.GVC Tô Oai Hùng 26
Hàm
template
y Xét hàm swap() của ví dụ trước: Giả
sử chúng ta cần hoán đổi giá trị của
hai biến kiểu char, kiểu double, . . .
y Giải quyết:
- Nạp chồng hàm swap() nhiều lần và
chứa trong thư viện:swap(int& first,int& second);
swap(double& first, double&
second);
...
y C++ cung cấp cách tốt hơn để giải
quyết vấn đề này.
ThS.GVC Tô Oai Hùng 27
Hàm
template
y Định nghĩa một hàm mẫu (hàm template) để trình biên dịch sinh ra
hàm có kiểu của tham số tương ứng
với kiểu của đối số trong lời gọi hàm
template
void swap(Item& first, Item&
second)
{
Item temp = first;
first = second;
second = temp;
}
Danh hiệu Item được
gọi là
“tham số
kiểu”
Danh hiệu Item được
gọi là
“tha số
kiểu”
Cả
hai nguyên mẫu và định
nghĩa hàm template phải
trong
cùng
một tập tin
Cả
hai nguyên ẫu và định
nghĩa hà template phải
trong cùng ột tập tin
Chương 8
MẢNG MỘT CHIỀU
ĐẠI HỌC MỞ
TP.HCM
KHOA CÔNG NGHỆ
THÔNG TIN
ThS.GVC Tô Oai Hùng 2
Mục Tiêu
y Khai báo, khởi tạo, và truy xuất mảng
một chiều.
y Xử lý mảng bằng vòng lặp for.
y Truyền mảng đến hàm.
y Cơ chế typedef.
y Một số phương pháp sắp xếp, tìm kiếm
trên mảng.
ThS.GVC Tô Oai Hùng 3
Vấn Đề
y Thực hiện nhiều lần công việc nhập
các số nguyên từ bàn phím, cho biết có
bao nhiêu số nguyên từ 0 đến 5 được
nhập?
ThS.GVC Tô Oai Hùng 4
Hành Vi
Nhập từ 0 đến 5 (giá
trị
khác để
thoát): 1
Nhập từ 0 đến 5 (giá
trị
khác để
thoát): -1
Số
các số nguyên đã nhập:
0 có
0 số.
1 có
1 số.
ThS.GVC Tô Oai Hùng 5
Giải Quyết
y Sử dụng 6 biến nguyên khác nhau:
int count0, count1,
và
lệnh switch để tăng các biến,
Figure 8.1.
y Mảng kiểu C giải quyết tốt hơnint count [6] = {0};
Tạo một biến có
chỉ
số
chứa 6 phần tử
nguyên:
ThS.GVC Tô Oai Hùng 6
Giải Thuật
1.
Khai báo mảng count có
6 phần tử
và
khởi tạo các phần tử
này bằng 0.
2.
Nhắc người sử
dụng nhập giá
trị
nguyên.
3.
Đọc giá
trị
nguyên vào biến number.
4.
Lặp lại khi 0 ≤
number ≤
5
a. Tăng phần tử
của count có
chỉ
số
là
number lên 1 đơn vị.
b. Nhắc người sử
dụng nhập giá
trị
nguyên.
c. Đọc giá
trị
nguyên vào biến number
5.
Với mỗi giá
trị
của i từ
0...5, hiển thị
count[i].
ThS.GVC Tô Oai Hùng 7
Viết Mã và
Kiểm Tra
y Xem mã nguồn, Figure 8.2
y Chú ý các khai báo:
const int CAPACITY = 6;
int count [CAPACITY] = {0};
- Báo cho TBD dành bộ
nhớ
cho 6 số
nguyên.
- Mỗi số nguyên được gọi là
phần tử.
- Chúng được đánh chỉ
số
từ
0
đến 5
Khởi tạo mỗi phần tử
bằng 0 (xem p.11)
Khởi tạo ỗi phần tử
bằng 0 (xe p.11)
ThS.GVC Tô Oai Hùng 8
Mảng Một Chiều
y Định nghĩa:
- Dung lượng (capacity) của mảng là
số
phần tử
mà
mảng có
thể
chứa
- Kích thước (size) của mảng là
số
giá
trị
mà
mảng thực sự
chứa, Figure 8.3
y Lưu ý kiểu của mỗi phần tử:long intArray [4]
Mảng có
bốn phần tử,
mỗi phần tử
kiểu long
chứa trong 4 byte
ảng có
bốn phần tử,
ỗi phần tử
kiểu long
chứa trong 4 byte
ThS.GVC Tô Oai Hùng 9
Khai Báo Mảng
y Trong ví dụ trước, dung lượng mảng
được khai báo:
const int CAPACITY = 6;
y Nên sử dụng hằng tượng trưng để khai
báo dung lượng:
- Hơn là
sử
dụng hằng trực kiện
(literal).
- Chương trình uyển chuyển hơn, dễ
sửa đổi hơn khi cần.
ThS.GVC Tô Oai Hùng 10
Khởi Tạo Mảng
y Ví dụ:
const int CAPACITY = 10;
int intArray [CAPACITY] = {9,
8, 7, 6, 5, 4, 3, 2, 1, 0};
y Có thể khởi tạo mảng trong khai báo:
- Các giá
trị
phải đặt trong cặp dấu
ngoặc móc { } và
cách nhau bằng
dấu phẩy.
Lưu ý là
số
giá
trị
khởi tạo
trong cặp dấu { } phải nhỏ hơn
hay bằng dung lượng mảng
Lưu ý là
số
giá
trị
khởi tạo
trong cặp dấu { } phải nhỏ hơn
hay bằng dung lượng ảng
ThS.GVC Tô Oai Hùng 11
Khởi Tạo Mảng
y Nếu số giá trị khởi tạo nhỏ hơn dung
lượng mảng thì các phần tử còn lại
được khởi tạo là 0
int intArray[10]={9,8,7,6,5,4};
y Ứng dụng: int count [6] = {0};
sẽ
làm cho phần tử đầu tiên bằng 0 và
các phần tử
còn lại cũng bằng 0.
y Nếu số giá trị khởi tạo lớn hơn dung
lượng mảng thì lỗi cú pháp.
ThS.GVC Tô Oai Hùng 12
Mảng Ký Tự
y Thừa kế từ ngôn ngữ C, mảng ký tự
trong C++ có thể được khởi tạo bằng
hai cách:
char name[10] = {'J','o','h',
'n',' ','D','o','e'};
hay
char name[10] = "John Doe";
y Trình biên dịch tự động gán ký tự null
(‘\0’) vào vị trí cuối cùng của mảng
ký tự
ThS.GVC Tô Oai Hùng 13
Truy Xuất Mảng
y Có thể truy xuất các phần tử riêng biệt
bên trong mảng.
y Chú ý cách truy xuất trong Figure 8.2
là count[number]++;
y Lệnh này tăng giá trị của phần tử trong
mảng có chỉ số là number.
Nếu nhập 58 số
0 thì
count[0] được tăng 58 lần
Nếu nhập 58 số
0 thì
count[0] được tăng 58 lần
ThS.GVC Tô Oai Hùng 14
Xử
Lý Mảng Bằng Vòng
for
y Vòng lặp for thường được sử dụng
để xử lý các phần tử trong mảng
thông qua chỉ số của chúng:
for(int i = 0; i < CAPACITY; i++)
// thao tác với
someArray[i]
y Những tác vụ thường được thực hiện
với các phần tử trong mảng:
- Tính tổng giá
trị
của các phần tử
- Khởi tạo giá
trị
cho các phần tử
- Tăng, giảm, tính phần trăm, ...
ThS.GVC Tô Oai Hùng 15
Truyền Mảng Đến Hàm
y Xét hàm tính tổng các phần tử mảng:
int arrTotal(int list[], int size)
{
int total = 0;
for(int i = 0; i < size; i++)
total += list[i];
return total;
}
cout << "Sum = "
<< arrTotal(intList,CAPACITY);
Tham số
bao gồm
mảng, dấu [], và
k
thước của mảng
Tha số
bao gồ t
ảng, dấu [], và
k
thước của ảng
Sử
dụng tên mảng
(không có
dấu []) như
là đối số để
truyền đến
hàm
Sử
dụng tên ảng
(không có
dấu []) như
là đối số để
truyền đến
hà
Nên có
tham số
thứ hai để
chỉ định kích thước mảng
khi truyền mảng đến hàm
Nên có
tha số
thứ hai để
chỉ định kích thước ảng
khi truyền ảng đến hà
ThS.GVC Tô Oai Hùng 16
Cơ chế
typedef
y ĐN tên mới cho kiểu dữ liệu đã có:
- Ví
dụ, định nghĩa tên mới Integer-
Array có
kiểu dữ
liệu là
mảng.
- Sử
dụng tên mới trong các khai báo
khác.
const int CAPACITY = 6;
typedef int
IntegerArray[CAPACITY];
IntegerArray count = {0};
hay
void initArray(IntegerArray list,
int listSize);
ThS.GVC Tô Oai Hùng 17
Lỗi Truy Xuất
y TBD C++ không kiểm tra sự truy xuất
ngoài phạm vi mảng của chương
trình.
y Minh họa, Figure 8.4.
y Sự truy xuất bên
ngoài phạm vi sẽ
là
vị
trí
nhớ
nào đó
ThS.GVC Tô Oai Hùng 18
Sắp xếp mảng bằng phương
pháp Bubble sort
(tự
học)
y Giả sử cần sắp theo thứ tự tăng dần.
y Duyệt nhiều lần qua các phần tử trong
mảng:
- Trong bước thứ
i (i = 1, , n-1)
đổi chỗ
những phần tử chưa có
thứ
tự
- Nghĩa là, a[i-1] > a[i]
ThS.GVC Tô Oai Hùng 19
Sắp xếp mảng bằng phương
pháp Bubble sort
(tự
học)
y Ví dụ:
y Fi ure 8.5
ThS.GVC Tô Oai Hùng 20
Tìm Kiếm Tuyến Tính (tự
học)
y Tìm lần lượt các phần tử trong mảng:
- Bắt đầu từ
phần tử đầu tiên.
- Tiếp tục cho đến khi tìm thấy hoặc
đến cuối mảng.
y Figure 8.6
ThS.GVC Tô Oai Hùng 21
y Khi mảng có thứ tự, tìm kiếm nhị phân
hiệu quả hơn
y Bắt đầu từ phần tử giữa.
y So sánh searchVal với phần tử này:
- Nếu phần tử
giữa nhỏ hơn, tìm kiếm
thực hiện trên danh sách con bên
phải.
- Nếu phần tử
giữa lớn hơn, tìm kiếm
thực hiện trên danh sách bên trái.
Xem Figure 8.7
Tìm Kiếm Nhị
Phân (tự
học)
25
Lặp lại quá
trình tìm kiếm
trong danh sách con nếu
cần. Lưu ý là
searchVal
có
thể
không tìm thấy
Lặp lại quá
trình tì kiế
trong danh sách con nếu
cần. Lưu ý là
searchVal
có
thể
không tì thấy
Các file đính kèm theo tài liệu này:
- tailieu.pdf