1. Đề bài 2 - KHTN 2010.
Xem mã nguồn C++ được viết trong bảng sau đây (chú ý các phương thức ảo).
PHP Code:
#include <iostream>
using namespace std;
class ListItem{
protected:
int Index;
ListItem* nextItem;
public:
ListItem (int idx = 0){
Index = idx;
nextItem = NULL;
}
ListItem* addFront (int idxNew){
ListItem* anItem = create(idxNew);
anItem->nextItem = this;
return anItem;
}
void outFromThis (ostream& oDev){
ListItem* pItem = this;
while (pItem != NULL){
pItem->outItem(oDev);
pItem = pItem->nextItem;
}
}
virtual void outItem (ostream& outDev){
outDev << Index <<"";
}
virtual ListItem* create (int idxNew){
return new ListItem(idxNew);
}
ListItem* searchFromThis(int idx);//sẽ cài đặt....
};
class LinkedList{
protected:
ListItem* firstItem;
public:
LinkedList (ListItem* head = NULL){
firstItem = head;
}
ListItem* add (int idxNew){
if (firstItem != NULL)
firstItem = firstItem->addFront(idxNew);
else
firstItem = new ListItem(idxNew);
return firstItem;
}
void out (ostream& oDev){
if (firstItem != NULL)
firstItem->outFromThis(oDev);
}
bool isEmpty(){
return (firstItem == NULL);
}
ListItem* search(int idx); //sẽ cài đặt....
};
void main(){
2. LinkedList* myList = new LinkedList();
int indices[] = {8, 9, 9, 1, 0, 1, 0, 2};
int n = sizeof(indices)/sizeof(indices[0]);
for (int i = 0; i < n; i++)
myList->add(indices[i]);
myList->out(cout);
}
Mỗi đối tượng thuộc lớp ListItem có trường nextItem bằng NULL (nghĩa là đừng) hay là trỏ đến một phàn tử kế tiếp
cũng là một đối tượng thuộc lớp này, tức là mỗi đối tượng như vậy cũng là phần tử đầu tiên của một danh sách liên
kết (phần tử đầu một xâu).
a/ Không kể hai phương thức chưa cài đặt searchFromThis(), search() trong hai lớp ListItem, LinkedList, hãy cho
biết kết quả chạy của chương trình.
b/ Dựa vào cách viết phương thức outFromThis(), hãy cài đặt phương thức searchFromThis() của lớp ListItem theo
hướng dẫn như sau:
PHP Code:
ListItem* ListItem::searchFromThis (int idx){
//Bạn viết thêm các dòng mã nguồn tại đây....
//
}
để tìm và trả về phần tử đầu tiên trong xâu (khởi đầu từ đối tượng đang xét của lớp ListItem) có trường Index bằng
với giá trị của tham số idx (trả về NULL nếu tìm không có).
c/ Viết phương thức search() của lớp LinkedList để tìm và trả về phần tử đầu tiên trong xâu (khởi đầu từ đối tượng
đang xét của lớp ListItem) có trường Index bằng với giá trị của tham số idx (trả về NULL nếu tìm không có).
Xem mã nguồn của lớp Point (tọa độ điểm trong mặt phẳng) và lớp Polygon (đa giác) kế thừa từ các lớp ListItem,
LinkedList bên trên và hàm main() được viết lại như sau:
PHP Code:
class Point:public ListItem{
double x, y;
public:
Point (int idxNew): ListItem(idxNew){}
Point(double xx = 0, double yy = 0, int idx = 0):ListItem(idx){
set(xx, yy);
}
void set(double xx, double yy){
x = xx; y = yy;
}
virtual ListItem* create(int idxNew){
return new Point(idxNew);
}
virtual void outItem(ostream& outDev){
outDev <<"(" << x << ","<<y<<")";
}
};
class Polygon: public LinkedList{
int nVer;
public:
Polygon(double xfirst = 0, double yfirst = 0):
LinkedList(new Point(xfirst, yfirst)){
nVer = 1;
}
Point* addVer(double x, double y){
Point* p = (Point*)add(nVer);
p->set(x,y);
nVer++;
return p;
}
static Polygon* read(istream& inDev);//sẽ cài đặt ....
};
void main(){
3. Polygon pg(1.9, 8.4);
pg.addVer(1.9, 8.9);
pg.addVer(1.7, 6.8);
pg.addVer(2.5, 1.1);
pg.out(cout);
}
d/ Hãy cho biết kết quả chạy của chương trình.
e/ Phương thức read() của lớp polygon là một phương thức tĩnh có nhiệm vụ nhập dãy các đỉnh của đa giác từ thiết
bị nhập (mỗi đỉnh gồm một hoành độ và tung độ là các số thực, các số cách nhau bởi dấu khoảng trống hay kí tự
ngắt) và trả về một đối tượng của lớp Polygon. Hãy viết mã nguồn đầy đủ của phương thức này theo hướng dẫn
sau:
PHP Code:
Polygon* Polygon::read(ítream& inDev){
Polygon* poly;
//Bạn viết thêm các dòng mã nguồn tại đây....
//..........
return poly;
}