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

