[r]
(1)Chương Mở đầu
Chương giới thiệu phần chương trình C++ Chúng ta sử dụng ví dụđơn giản để trình bày cấu trúc chương trình C++ cách thức biên dịch chúng Các khái niệm hằng, biến, việc lưu trữ chúng nhớ sẽđược thảo luận chương Sau đặc tả sơ khái niệm lập trình Lập trình
Máy tính số cơng cụđể giải hàng loạt bài tốn lớn Một lời giải cho tốn gọi giải thuật (algorithm); mơ tả chuỗi bước cần thực để giải tốn Một ví dụđơn giản cho tốn giải thuật là:
Bài tốn: Sắp xếp danh sách số theo thứ tự tăng dần
Giải thuật:Giả sử danh sách cho list1; tạo danh sách rỗng, list2, để lưu danh sách xếp Lặp lặp lại cơng việc, tìm số nhỏ list1, xóa khỏi list1, thêm vào phần tử danh sách list2, cho đến list1 là rỗng
Giải thuật diễn giải thuật ngữ trừu tượng mang tính chất dễ hiểu Ngơn ngữ thật sựđược hiểu máy tính ngơn ngữ máy Chương trình diễn đạt ngơn ngữ máy gọi có thể thực thi Một chương trình viết ngơn ngữ khác trước hết cần dịch sang ngôn ngữ máy để máy tính hiểu thực thi
Ngơn ngữ máy khó hiểu lập trình viên họ khơng thể sử dụng trực tiếp ngơn ngữ máy để viết chương trình Một trừu tượng khác ngôn ngữ
(2)1.1. Một chương trình C++ đơn giản
Danh sách 1.1 trình bày chương trình C++ Chương trình chạy xuất thơng điệp Hello World
Danh sách 1.1
#include <iostream.h> int main (void) {
cout << "Hello World\n"; }
Chú giải
1 Hàng sử dụng thị tiền xử lý #include để chèn vào nội dung tập tin header iostream.h chương trình iostream.h tập tin header chuẩn C++ chứa đựng định nghĩa cho xuất nhập
2 Hàng định nghĩa hàm gọi main Hàm khơng có hay có nhiều tham số (parameters); tham số xuất sau tên hàm, cặp dấu ngoặc Việc xuất từ void dấu ngoặc chỉđịnh hàm main khơng có tham số Hàm có kiểu trả
về; kiểu trả xuất trước tên hàm Kiểu trả cho hàm main int (ví dụ: số nguyên) Tất chương trình C++ phải có hàm main nhất.Việc thực thi chương trình ln hàm main Dấu ngoặc nhọn bắt đầu thân hàm main
4 Hàng câu lệnh (statement) Một lệnh tính tốn giá trị Kết thúc lệnh luôn đánh dấu dấu chấm phẩy (;) Câu lệnh xuất chuỗi "Hello World\n" để gởi đến dòng xuất cout Chuỗi dãy ký tự đặt cặp nháy kép Ký tự cuối chuỗi (\n) ký tự xuống hàng (newline) Dòng đối tượng dùng để thực xuất nhập cout dòng xuất chuẩn C++ (xuất chuẩn thường hiểu hình máy tính) Ký tự << tốn tử xuất, xem dịng xuất tốn hạng trái xem biểu thức toán hạng phải, tạo nên giá trị biểu thức gởi đến dòng xuất Trong trường hợp này, kết chuỗi "Hello World\n" gởi đến dịng cout, làm cho hiển thị hình máy tính
5 Dấu ngoặc đóng kết thúc thân hàm main
1.2. Biên dịch chương trình C++
(3)Bảng 1.1
$ CC hello.cc $ a.out Hello World $
Chú giải
1 Lệnh để triệu gọi dịch AT&T C++ môi trường UNIX CC Đối số cho lệnh (hello.cc) tên tập tin chứa đựng chương trình Theo qui định tên tập tin có phần mở rộng c, C, cc (Phần mở rộng khác hệđiều hành khác nhau) Kết biên dịch tập tin thực thi mặc định a.out
Để chạy chương trình, sử dụng a.out lệnh Đây kết quảđược cung cấp chương trình
4 Dấu nhắc trở hệ thống định chương trình hồn tất thực thi
Lệnh cc chấp nhận phần tùy chọn Mỗi tùy chọn xuất name, name tên tùy chọn (thường ký tự đơn) Một vài tùy chọn u cầu có đối số Ví dụ tùy chọn xuất (-o) cho phép định rõ tập tin cung cấp trình biên dịch thay a.out Bảng 1.2 minh họa việc sử dụng tùy chọn cách chỉđịnh rõ hello tên tập tin thực thi
Bảng 1.2
$ CC hello.cc -o hello $ hello
Hello World $
Mặc dù lệnh thực khác phụ thuộc vào trình biên dịch, thủ tục biên dịch tương tự dùng mơi trường MS-DOS Trình biên dịch C++ dựa Windows dâng tặng môi trường thân thiện với người dùng mà việc biên dịch đơn giản cách chọn lệnh từ menu Qui định tên MS-DOS Windows tên tập tin nguồn C++ phải có phần mở rộng cpp
1.3. Việc biên dịch C++ diễn
Biên dịch chương trình C++ liên quan đến số bước (hầu hết bước suốt với người dùng):
(4)• Sau đó, trình biên dịch C++ dịch mã chương trình Trình biên dịch trình biên dịch C++ thật phát mã assembly hay mã máy, trình chuyển đổi dịch mã sang C Ở trường hợp thứ hai, mã C sau dịch tạo thành mã assembly hay mã máy thơng qua trình biên dịch C Trong hai trường hợp, đầu khơng hồn chỉnh chương trình tham khảo tới thủ tục thư viện chưa định nghĩa phần chương trình Ví dụ Danh sách 1.1 tham chiếu tới toán tử << mà thực định nghĩa thư viện IO riêng biệt
• Cuối cùng, trình liên kết hồn tất mã đối tượng cách liên kết với mã đối tượng module thư viện mà chương trình tham khảo tới Kết cuối tập tin thực thi
Hình 1.1 minh họa bước cho hai trình chuyển đổi C++ trình biên dịch C++ Thực tế tất bước triệu gọi lệnh đơn (như CC) người dùng chí khơng thấy tập tin phát
Hình 1.1 Việc biên dịch C++
C++ Program
C Code
Object Code
Execut-able
C++ COMPILER
NATIVE C++ TRANSLATOR
LINKER C COMPILER
C++ Program
1.4. Biến
Biến tên tượng trưng cho vùng nhớ mà liệu có thểđược lưu trữ sử dụng lại Các biến sử dụng để giữ giá trị liệu mà chúng có thểđược dùng nhiều tính tốn khác chương trình Tất biến có hai thuộc tính quan trọng:
(5)• Giá trịcó thểđược chuyển đổi cách gán giá trị cho biến Loại giá trị biến nhận phụ thuộc vào kiểu Ví dụ, biến số ngun giữ giá trị nguyên (chẳng hạn, 2, 100, -12) Danh sách 1.2 minh họa sử dụng vài biến đơn giản
Danh sách 1.2
10 11
#include <iostream.h> int main (void) {
int workDays;
float workHours, payRate, weeklyPay; workDays = 5;
workHours = 7.5; payRate = 38.55;
weeklyPay = workDays * workHours * payRate; cout << "Weekly Pay = "<< weeklyPay<< '\n'; }
Chú giải
4 Hàng định nghĩa biến int (kiểu số nguyên) tên workDays, biến đại diện cho số ngày làm việc tuần Theo luật chung, trước tiên biến định nghĩa cách định kiểu nó, theo sau tên biến cuối kết thúc dấu chấm phẩy
5 Hàng định nghĩa ba biến float (kiểu số thực) thay cho số làm việc ngày, số tiền phải trả hàng giờ, số tiền phải trả hàng tuần Như thấy hàng này, nhiều biến kiểu có thểđịnh nghĩa lượt qua việc dùng dấu phẩy để ngăn cách chúng
6 Hàng câu lệnh gán Nó gán giá trị cho biến workDays Vì thế, sau câu lệnh thực thi, workDays biểu thị giá trị
7 Hàng gán giá trị 7.5 tới biến workHours Hàng gán giá trị 38.55 tới biến payRate
9 Hàng tính tốn số tiền phải trả hàng tuần từ biến workDays, workHours, payRate (* toán tử nhân) Giá trị kết lưu vào biến weeklyPay
10-12 Các hàng xuất ba mục là: chuỗi "Weekly Pay = ", giá trị biến weeklyPay, ký tự xuống dòng
Khi chạy, chương trình cho kết sau: Weekly Pay = 1445.625
(6)Bài tập cuối chương
9.1 Xem xét lớp Year chia ngày năm thành ngày làm việc ngày nghỉ Bởi ngày có giá trị nhị phân nên lớp Year dễ dàng dẫn xuất từ BitVec:
enum Month {
Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
class Year : public BitVec { public:
Year (const short year);
void WorkDay (const short day); // dat nhu lam viec void OffDay (const short day); // dat nhu nghi
Bool Working (const short day); // true neu la lam viec short Day (const short day, // chuyen date day
const Month month, const short year); protected:
short year; // nam theo lich };
Các ngày đánh số từ điểm bắt đầu năm, ngày tháng năm Hồn tất lớp Year cách thi cơng hàm thành viên 9.2 Các bảng liệt kê giới thiệu khai báo enum tập nhỏ
của số nguyên Trong vài ứng dụng cần xây dựng tập hợp bảng liệt kê Ví dụ, phân tích cú pháp, hàm phân tích có thểđược truyền tập ký hiệu mà sẽđược bỏ qua phân tích cú pháp cố gắng phục hồi từ lỗi hệ thống Các ký hiệu thông thường dành riêng từ ngôn ngữ:
enum Reserved {classSym, privateSym, publicSym, protectedSym, friendSym, ifSym, elseSym, switchSym, };
Với thứđã cho có nhiều n phần tử (n số nhỏ) tập hợp có thểđược trình bày có hiệu vectơ bit n phần tử Dẫn xuất lớp đặt tên EnumSet từ BitVec để làm cho điều dễ dàng Lớp EnumSet nên tái định nghĩa toán tử sau:
• Tốn tử + để hợp tập hợp
• Tốn tử - để hiệu tập hợp
• Tốn tử * để giao tập hợp
• Tốn tử % để kiểm tra phần tử có thành viên tập hợp
• Các tốn tử <= >= để kiểm tra tập hợp có tập tập khác hay không
• Các tốn tử >> << để thêm phần tử tới tập hợp xóa phần tử từ tập hợp
(7)cả hàm thành viên lớp trừu tượng ảo Bên ví dụ đơn giản lớp trừu tượng:
class Database { public:
virtual void Insert (Key, Data) {} virtual void Delete (Key) {} virtual Data Search (Key) {return 0;} };
Nó cung cấp khung cho lớp giống sở liệu Các ví dụ loại lớp dẫn xuất từ sở liệu gồm: danh sách liên kết, nhị phân, B-cây Trước tiên dẫn xuất lớp B-cây từ lớp Database sau dẫn xuất lớp B*-cây từ lớp B-cây:
class BTree : public Database { /* */ }; class BStar : public BTree { /* */ };