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

 

pdf29 trang | Chuyên mục: C/C++ | Chia sẻ: tuando | Lượt xem: 446 | Lượt tải: 0download
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:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_tap_1_chuong_7_he_thong.pdf