Bài giảng Lập trình hướng đối tượng - Chương 7: Hệ thống Nhập/Xuất C++
• Cơ sở Nhập/Xuất C++
• Nhập/Xuất có định dạng
• Sử dụng width(), precision() và fill()
• Sử dụng bộ thao tác Nhập/Xuất
• Tạo bộ chèn
• Tạo bộ chiết
Tóm tắt nội dung Bài giảng Lập trình hướng đối tượng - Chương 7: Hệ thống Nhập/Xuất C++, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
<< ob.x << ", " << ob.y << '\n'; return stream; } Ví dụ 5.2 Lớp coord chứa bộ chèn không phải là hàm friend . // Create an inserter for objects of type coord, using a non-friend inserter. #include class coord { public: int x, y; // must be public coord() { x = 0; y = 0; } coord(int i, int j) { x = i; y = j; } }; // An inserter for the coord class. ostream &operator<<(ostream &stream, coord ob) { stream << ob.x << ", " << ob.y << '\n'; return stream; } int main() { coord a(1, 1), b(10, 23); cout << a << b; return 0; } • Một bộ chèn không chỉ giởi hạn ở việc xuất thông tin dạng văn bản. Nó có thể thực hiện các thao tác hay chuyển đổi thông tin cần thiết để kết xuất thông tin ra thiết bị riêng biệt hay một tình huống riêng biệt nào đó. Ví dụ 5.3 Bộ chèn xuất thông tin ra máy vẽ (plotter) Chương 7 Hệ thống Nhập / Xuất C++ 217 // This program draws right triangles #include class triangle { int height, base; public: triangle(int h, int b) { height = h; base = b; } friend ostream &operator<<(ostream &stream, triangle ob); }; // Draw a triangle. ostream &operator<<(ostream &stream, triangle ob) { int i, j, h, k; i = j = ob.base - 1; for( h = ob.height - 1; h ; h--) { for( k = i; k; k--) stream << ' '; stream << '-'; if( j != i) { for( k = j - i - 1; k; k--) stream << ' '; stream << '-'; } i--; stream << '\n'; } for( k = 0; k < ob.base; k++) stream << '-'; stream << '\n'; return stream; } Kết quả chương trình là 3 hình tam giác vuông đồng dạng với kích thước khác nhau Chương 7 Hệ thống Nhập / Xuất C++ 218 int main() { triangle t1(5, 5), t2(10, 10), t3(12, 12); cout << t1; cout << endl << t2 << endl << t3; return 0; } Bài tập V 1. Cho lớp strtype và đoạn chương trình sau. Hãy tạo bộ chèn cho lớp strtype để xuất chuỗi ký tự ra màn hình. #include #include #include class strtype { char *p; int len; public: strtype(char *ptr); ~strtype() {delete [] p;} friend ostream &operator<<(ostream &stream, strtype &ob); }; strtype::strtype(char *ptr) { len = strlen(ptr)+1; p = new char [len]; if(!p) { cout << "Allocation error\n"; exit(1); Chương 7 Hệ thống Nhập / Xuất C++ 219 } strcpy(p, ptr); } // Create operator<< inserter function here. // ... int main() { strtype s1("This is a test."), s2("I like C++."); cout << s1 << '\n' << s2; return 0; } 2. Hãy thay thế hàm show() trong chương trình sau bằng bộ chèn do bạn tạo ra #include class planet { protected: double distance; // miles from the sun int revolve; // in days public: planet(double d, int r) { distance = d; revolve = r; } }; class earth : public planet { double circumference; // circumference of orbit public: earth(double d, int r) : planet(d, r) { circumference = 2*distance*3.1416; } // Rewrite this so that it displays the information using an inserter function. void show() { Chương 7 Hệ thống Nhập / Xuất C++ 220 cout << "Distance from sun: " << distance << '\n'; cout << "Days in obit: " << revolve << '\n'; cout << "Circumference of orbit: " << circumference << '\n'; } }; int main() { earth ob(93000000, 365); cout << ob; return 0; } VI. Tạo bộ chiết (extractor) Chương 7 Hệ thống Nhập / Xuất C++ 221 • Trong C++, thao tác nhập còn được gọi là chiết (extractor), toán tử >> còn gọi là toán tử chiết. Khi quá tải toán tử này, nghiã là tạo một hàm chiết, hay còn gọi là bộ chiết (extractor) , do toán tử >> thực hiện chức năng lấy thông tin từ một stream. Cú pháp các bộ chiết istream &operator >> (istream &stream, class_name &ob) { // body of extractor } stream : tham số thứ nhất tham chiếu đến một stream nhập istream. ob : tham số thứ hai tham chiếu đến đối tượng nhận thông tin nhập vào Bộ chiết sẽ trả về một tham chiếu đến stream nhập kiểu istream. Nội dung của bộ chiết có thể thực hiện bất kỳ thủ tục nào. Tuy nhiên, nên giới hạn chức năng của nó trong phạm vi nhập thông tin. • Một bộ chiết không được phép là thành phần của lớp mà bộ chiết này thao tác. C++ cho phép bộ chèn là hàm friend của lớp mà nó thao tác. Ví dụ 6.1 Tạo bộ chiết cho lớp coord // Add a friend extractor for objects of type coord. #include class coord { int x, y; public: coord() { x = 0; y = 0; } coord(int i, int j) { x = i; y = j; } friend ostream &operator<<(ostream &stream, coord ob); friend istream &operator>>(istream &stream, coord &ob); }; ostream &operator<<(ostream &stream, coord ob) { Chương 7 Hệ thống Nhập / Xuất C++ 222 stream << ob.x << ", " << ob.y << '\n'; return stream; } istream &operator>>(istream &stream, coord &ob) { cout << "Enter coordinates: "; // thông báo nhập dữ liệu này là cần thiết ở bộ chiết stream >> ob.x >> ob.y; return stream; } int main() { coord a(1, 1), b(10, 23); cout << a << b; cin >> a; cout << a; return 0; } Ví dụ 6.2 Lớp inventory lưu thông tin kiểm kê hàng tồn kho gồm tên hàng, lượng tồn và trị giá, chứa bộ chèn và bộ chiết. #include #include class inventory { char item[40]; // name of item int onhand; // number on hand double cost; // cost of item public: inventory(char *i, int o, double c) { Chương 7 Hệ thống Nhập / Xuất C++ 223 strcpy(item, i); onhand = o; cost = c; } friend ostream &operator<<(ostream &stream, inventory ob); friend istream &operator>>(istream &stream, inventory &ob); }; ostream &operator<<(ostream &stream, inventory ob) { stream << ob.item << ": " << ob.onhand; stream << " on hand at $" << ob.cost << '\n'; return stream; } istream &operator>>(istream &stream, inventory &ob) { cout << "Enter item name: "; stream >> ob.item; cout << "Enter number on hand: "; stream >> ob.onhand; cout << "Enter cost: "; stream >> ob.cost; return stream; } int main() { inventory ob("hammer", 4, 12.55); cout << ob; cin >> ob; cout << ob; Chương 7 Hệ thống Nhập / Xuất C++ 224 return 0; } Bài tập VI 1. Bổ sung vào lớp strtype trong bài tập 1 phần V, chương 7, một bộ chiết để nhập thông tin cho lớp strtype. 2. Hãy tạo ra một lớp factor dùng để lưu một giá trị nguyên num và thừa số nhỏ nhất của nó là lfact. Hãy tạo bộ chèn và bộ chiết cho lớp trên. Bài tập chương 7 1. Viết một chương trình để trình bày giá trị 1000 ở dạng thập phân, thập lục phân và bát phân, sử dụng các cờ định dạng của ios. 2. Viết một chương trình để trình bày giá trị 1000.1234 trong một trường có chiều dài 20 cột, con số được canh biên trái, số có hai chữ số sau dấu chấm thập phân, và được lấp đầy chỗ trống bằng ký tự * , sử dụng các cờ định dạng của ios. 3. Thực hiện lại bài tập 1 và 2, sử dụng bộ tạo thao tác nhập/xuất thay cho cờ định dạng. 4. Hãy tạo bộ chèn và bộ chiết cho lớp pwr tính hàm mũ x^n trong chương trình sau class pwr { int base; int exponent; double result; // base to the exponent power public: pwr(int b, int e); }; pwr::pwr(int b, int e) { Chương 7 Hệ thống Nhập / Xuất C++ 225 base = b; exponent = e; result = 1; for( ; e; e--) result = result * base; } 5. Hãy tạo một lớp box để lưu trữ thông tin về kích thước của một hình vuông. Hãy tạo bộ chèn và bộ chiết cho lớp box để in hình vuông đó ra màn hình. 6. Hãy tạo bộ chèn để xuất nội dung của một stack của lớp stack sau #include #define SIZE 10 // Declare a stack class for characters class stack { char stck[SIZE]; // holds the stack int tos; // index of top-of-stack public: stack(); void push(char ch); // push character on stack char pop(); // pop character from stack }; // Initialize the stack stack::stack() { tos = 0; } // Push a character. void stack::push(char ch) { if(tos==SIZE) { cout << "Stack is full\n"; return; } Chương 7 Hệ thống Nhập / Xuất C++ 226 stck[tos] = ch; tos++; } // Pop a character. char stack::pop() { if(tos==0) { cout << "Stack is empty\n"; return 0; // return null on empty stack } tos--; return stck[tos]; } 7. Hãy viết chương trình chứa lớp watch có biến riêng t với kiểu dữ liệu là time_t. Hàm tạo của lớp này dùng hàm thời gian chuẩn time() để lấy giờ của hệ thống và lưu lại vào biến t. Hãy tạo bộ chèn để trình bày thời gian. Sử dụng các hàm localtime() và asctime() . 8. Cho lớp ft_to_inche dùng để đổi đơn vị chiều dài từ feet sang inch. Hãy tạo bộ chiết cho lớp này để nhập giá trị bằng feet. Hãy tạo bộ chèn dùng để trình bày số đo ở đơn vị là feet và inch. Viết chương trình để biểu diễn hoạt động của bộ chèn và bộ chiết. class ft_to_inches { double feet; double inches; public: void set(double f) { feet = f; inches = f * 12; // inserter and extractor } };
File đính kèm:
- bai_giang_lap_trinh_huong_doi_tuong_tap_1_chuong_7_he_thong.pdf