Chào các bac pro. Em có bài thi này khó quá, muốn mong các bác giúp giùm. Em là thanh viên mới tinh.
Bài toán: Xem kiểu dữ liệu trừng tượng cùng với thuật toán tìm phần tử tốt nhất(theo điều kiện nào đó) mô tả trong lớp trừu tượng BestAlg (abstract class) sau đây. Lập trình viên sẽ tổ chức dữ liệu và cài đặt các phương thức thích hợp trong từng lớp con cụ thể (concrete class) của lớp BestAlg tù theo mỗi bài toán cần giải quyết.
-----------------
class BestAlg{
public:
virtual void * FirstItem()=0;// Lấy phần tử đầu tiên: trả về NULL nếu hết dữ liệu
virtual void * NextItem()=0;// Lấy phần tử kế tiếp: trả về NULL nếu hết dữ liệu
virtual int Better(Void* Item1, Void* Item2)=0; //Kiểm tra Item1 có tốt hơn Item2 không
void* BestElement();//tìm phần tử tốt nhất.
};
void* BestAlg::BestElement(){
void *best=FirstItem(); void *cur=NextItem();
while (cur!=NULL){
if (Better(cur,best)){
best=cur;
}
cur=NextItem();
}
return best;
}
----------------------
a. Trường hợp cần tìm phần tử tốt nhất trên mảng số thực, lập trình viên có thể tiến hành cài đặt sau:
#include<vector>
using namespace std;
class BestFloat:Pubic BestAlg{
protected:
vector<float> Data; int curIdx;
public
BestFloat(int size, float a[]){
Data.resize(size);
for i=0;i<Data.size();i++){
Data[i]=a[i];
}
curIdx=0
}
void* getItem(int j){
if(j>=Data.size()||j<0){
return NULL;
}
return &Data[j];
}
vitual void* FirstItem(){
curIdx=0 ;
return getItem(curIdx);
}
vitual void* NextItem(){
curIdx++;
return getItem(curIdx);
}
vitual int Better(void* Item1, void* Item2){
//Viết thêm mã nguồn cần viết.
}
};
-----------------
câu a: Bạn hãy viết b
ổ sung mã nguồn cần viết cho phương thức Better() nếu cần phải tìm phần tử nhỏ nhất trong mảng.
câu b: Nếu cần phải tìm phần tử dương nhỏ nhất trong mảng các số thực, lập trình viên có thể viết lớp MinPositiveFloat kế thừa từ BestFloat như sau:
class MinPositiveFloat: public BestFloat{
//cần phải viết mã nguồn đặc biệt hóa...
Theo bạn thì những phương thức nào cần phải viết đặc biệt hóa cho lớp MinPositiveFloat? hãy viết mã nguồn cho phương thức đó.
Câu c: Giả sử cần tìm phần tử tốt nhất trong ma trận vuông n x n có dạng các phần tử phía trên đường chéo chính đều bằng 0. Đối với ma trận loại này ta chỉ cần lưu các phần tử nằm bên dưới đường chéo chính bởi vì tất cả các phần tử còn lại đều bằng 0. Một lập trình viên muốn phát triển lớp đối tượng cho các thuật toán ma trận tam giác dưới bằng cách kế thừa lớp BestFloat như dưới đây(bên trong bộ nhớ vẫn lưu mảng động một chiều dựa trên kiểu vector<T>).
Code:
class Matrix (int n);//Hàm tạo construtor: ma trận cấp n x n
void Setij(int i, int j, float x);// đặty số x vào dòng i cột j
// và các phương thức khác.
};
Bạn hãy thực hiện công việc sau đâycho lập trình viên đó.
Câu c1: viết mã nguồn cài đặt hàm tạo Matrix(): chú ý dung lượng bộ nhớ xin cấp phát
Câu c2: viết mã nguồn cài đặt phương thức Setij(): chú ý điều kiện ràng bộc mà các chì số i, j phải thỏa mãn.
Câu c3: nếu cần tìm phần ử dương nhỏ nhất trong ma trận thì cần phải viết đặc biệt hóa phương thức nào khác hay không? Hãy giải thích rõ trả lời của bạn.
Câu c4: Nếu cần tìm phần ử dương nhỏ nhất trên đường chéo chính thì những phương thức nào cần phải viết đặc biệt hóa? Viết mã nguồn minh họa.
Câu d: giả sử "điều kiện dương" trong các câu b và câu c có thể thao thế bởi điều kiện khác( chẳng hạn âm, khác không, số nguyên chẵn...) tùy theo tình hình bạn có thể đề xuất giải quyết thích hợp.
-----------
Các bác giúp em với vì đây là một bài tập thật khó mà em gửi lên lần đầu tiên. Lần sau em sẽ post lên tiếp những bài tập khác. Giải càng nhanh càng ốt nghe các bac C/C++.
Thanks alot!!!!
Trả lời cùng với trích dẫn
Vui lòng để tag vào trong tag code, và để đúng diễn đàn. Đọc Nội quy để biết thêm chi tiết.