Cơ sở lập trình

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

pdf227 trang | Chia sẻ: Khủng Long | Lượt xem: 1710 | Lượt tải: 0download
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:

  • pdftailieu.pdf