Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 18 kết quả

Đề tài: [ Solved ]Chỉ dùng một đối tượng A?

  1. #1
    Ngày gia nhập
    08 2008
    Bài viết
    46

    Mặc định [ Solved ]Chỉ dùng một đối tượng A?

    tớ có hai hàm duyệt đồ thị là: DFS và BFS. hai hàm này trong cùng một lớp. Và khi tớ khai báo một đối tượng A và tớ gọi hàm DFS, thì tất cả những thuộc tính cảu lớp bị thay đổi, sau đó tớ không thể dùng chính đối tượng đó để gọi hàm BFS, vì các thuộc tính đã bị thay đổi và kết quả không đúng nữa. Không khai báo một đối tượng thứ 2 tớ còn cách nào không?
    Hạnh phúc luôn đợi ta mỉn cười lại với nó.(^,,^).

  2. #2
    Ngày gia nhập
    06 2007
    Nơi ở
    UIT
    Bài viết
    44

    Trích dẫn Nguyên bản được gửi bởi hahonga3 Xem bài viết
    tớ có hai hàm duyệt đồ thị là: DFS và BFS. hai hàm này trong cùng một lớp. Và khi tớ khai báo một đối tượng A và tớ gọi hàm DFS, thì tất cả những thuộc tính cảu lớp bị thay đổi, sau đó tớ không thể dùng chính đối tượng đó để gọi hàm BFS, vì các thuộc tính đã bị thay đổi và kết quả không đúng nữa. Không khai báo một đối tượng thứ 2 tớ còn cách nào không?
    Đọc không thế thì khó hiểu quá bạn post cái code đó lên đây đi bạn .
    Phương thức làm thay đổi giá trị của thuộc tính chứ làm sao thay đổi thuộc tính của đối tượng được ?

  3. #3
    Ngày gia nhập
    08 2008
    Bài viết
    46

    tất nhiên là giá trị của thuộc tính rồi. code dài lắm sợ các bạn ngại đọc. Tớ xin post lên đây vậy.
    PHP Code:
    #include<iostream>
    #include<fstream>
    using namespace std;
    //---------------------------------------- bat dau lop stack--------------------------------
    class Stack
    {
        
    int size;         //kich thuoc stack
        
    int butter[20];      //ten stack
        
    int top;          //con tro dinh stack
    public:
        
    Stack();    //ham khoi tao
        
    bool is_empty();         //ham kiem tra rong
        
    void push(int);               //ham truyen vao stack 1 gia tri
        
    int pop(int);                //ham lay ra khoi stack 1 gia tri
        
    int giaTriDauStack();    //tra ra gia tri dau stack
        
    friend void DFS();
    };
    Stack::Stack(){
        
    size 20;
        
    top 0;
    }    
    bool Stack::is_empty(){
        if(
    top==0)
            return 
    true;
        else
            return 
    false;
    }
    void Stack::push(int x){ //day vao
        
    if (top size){
            
    butter[top] = x;
            
    top++;
        }
    }
    int Stack::pop(int a){
        if(!
    is_empty()){
            
    top--;
            
    butter[top];
        }
        else 
            
    = -1;
        return 
    a;
    }
    int Stack::giaTriDauStack(){
        if(!
    is_empty()){
            
    int a top;
            return 
    butter[--a];
        }
        else
            return -
    1;
    }
    //----------------------------------------------------------------------ket thuc viec cai dat lop stack----
    //--------------------------------------bat dau lop queue-----------------------
    class Queue{
        
    int size;
        
    int butter[20];
        
    int front;
        
    int back;
    public:
        
    Queue();    //ham khoi tao
        
    bool is_empty();         //ham kiem tra rong
        
    void Add(int);               //ham truyen vao queue 1 gia tri
        
    int    eliminate(int);        //ham lay ra khoi queue 1 gia tri
        
    int    giaTriDauQueue();                //tra ra gia tri dau queue
        
    friend void    BFS();
    };
    Queue::Queue(){
        
    size    =    20;
        
    front    =    0;
        
    back    =    0;
    }
    bool Queue::is_empty(){
        if((
    front==0&&back==0)||(front>back))
            return 
    true;
        else
            return 
    false;
    }
    void Queue::Add(int a){
        
    butter[back]=a;
        
    back++;
    }
    int Queue::eliminate(int a){
        if(!
    is_empty()){
            
    butter[front];
            
    front++;
        }
        else
            
    = -1;
        return 
    a;

    }
    int Queue::giaTriDauQueue(){//tra ra gia tri dau queue
        
    if(!is_empty())
            return 
    butter[front];
        else
            return -
    1;
    }
    //---------------------------ket thuc viec cai dat lop queue-----------
    //-------------------------------bat dau lop Graph---------------------
    class Graph{
        
    int A[20][20];
        
    int soDinh;//so dinh cua ma tran
        
    bool was_visited[20];//mang danh dau nhung dinh da tham
        
    int daTham[20]; //mang luu tru dinh da tham
        
    int dinhQueue;//dinh cua queue
        
    int dinhStack;//dinh cua stack
    public:
        
    Graph();//ham khoi tao
        
    void readFile1(const char*);
        
    int dinhLienKe(int,int &);
        
    void BFS();//se la ham ban cua lop Queue
        
    void DFS();//se la ham ban cua lop Stack
    };
    //----------------------------han khoi tao---------------------------
    Graph::Graph(){
        for(
    int i=0;i<20;i++){
            for(
    int j=0;j<20;j++)
                
    A[i][j] = 0;
            }
        for(
    int i=0;i<20;i++)
            
    was_visited[i]=false;//ban dau gan gia tri cho cac phan tu mang danh dau
        
    for (int k=0;k<20;k++)
            
    daTham[k]=0;//khoi gan cac gia tri trong mang
    }
    //-------------------------------------------------------------------
    //--------------------------ham doc file ma tran lien ke-------------
    void Graph::readFile1(const charnameFile){
        
    ifstream dataFile(nameFile);
        if(!
    dataFile.fail()){
            
    dataFile>>soDinh;
            for(
    int i=0;i<soDinh;i++)
                for(
    int j=0;j<soDinh;j++)
                    
    dataFile>>A[i][j];
        }
        else{
            
    cout<<"\nBi loi. kiem tra lai file "<<nameFile<<" xem\n";
            exit(
    1);
        }
        
    dataFile.close();    
    }
    //-------------------------------------------------------------------------------------
    //----------------------------ham kiem tra dinh lien ke voi dinh dau Queue------------
    int Graph::dinhLienKe(int vint &t){
        
    int a;
        for(
    int jt;j<soDinh;j++){
            if((
    A[v][j]!=0)&&(was_visited[j]==false)){// dinh la lien ke va chua duoc tham la j
                
    return j;
                break;
            }
            else 
    = -2;        
        }
        return 
    a;    
    }
    //--------------------------------------------------------------------------------------
    //----------------------------------------thuat toan BFS bat dau------------------------
    void Graph::BFS(){
        
    Queue theQueue;//khai bao mot doi tuong    
        
    int stt=0;
        
    int start;
        
    cout<<"\nNhap vao dinh bat dau duyet   ";
        
    cin>>start;
        while(
    start>=soDinh){
            
    cout<<"\nnhap lai dinh sao cho be hon "<<soDinh<<" nha ";
            
    cin>>start;
        }
        if(
    start<soDinh){
            
    daTham[0]=start//ghi nhan dinh dau tien duoc tham
            
    theQueue.Add(start); //dua dinh do vao queue
            
    was_visited[start]=true//danh dau dinh da duoc tham
            
    int t 0;
            while(!
    theQueue.is_empty()){
                
    dinhQueue theQueue.giaTriDauQueue();   //tim den dinh dau cua Queue
                
    int k dinhLienKe(dinhQueue,t);
                if(
    k==-2){//neu nhu khong co dinh lien ke
                    
    theQueue.eliminate(dinhQueue);//lay ra phan tu dau queue
                    
    0;
                }
                else{
                    
    was_visited[k] = true;//danh dau dinh lien ke cua dinh v da duoc tham
                    
    if(k<soDinh-1)
                        
    k+1//ty nua se for tu dinh thu k+1 chu khong for lai cac dinh <k nua
                    
    else k//neu k = so dinh luon roi thi thoi khoi duyet them chi cho met
                    
    theQueue.Add(k);//dua dinh lien ke nay vao queue
                    
    daTham[++stt] = k;//dua dinh lien ke vao mang da tham theo thu tu
                
    }
            }
            
    cout<<"\ndanh sach cac dinh lan luot duoc duyet la\n";
            for (
    int i0;i<soDinhi++)
                
    cout<<"  "<<daTham[i];
            
    cout<<endl;
        }
    }
    void Graph::DFS(){
        
    int daTham[10];                  //mang luu tru dinh da tham
        
    int stt=0;
        
    int start;    
        
    Stack theStack;          //tao 1 doi tuong co kieu stack
        
    cout<<"\nNhap vao dinh bat dau duyet   ";
        
    cin>>start;
        while(
    start>=soDinh){
            
    cout<<"\nnhap lai dinh sao cho be hon "<<soDinh<<" nha ";
            
    cin>>start;
        }
        if(
    start<soDinh){
            
    daTham[0]=start;               //gi nhan dinh dau tin duoc tham
            
    theStack.push(start);        //dua dinh do vao stack
            
    was_visited[start]=true;     //danh dau dinh da duoc tham
            
    int t 0;//bien nay chi de dam bao duyet cac dinh khong bi lap lai
            
    while(!theStack.is_empty()){
                
    dinhStack theStack.giaTriDauStack();   //tim den dinh dau cua Stack
                
    int k dinhLienKe(dinhStack,t);
                if(
    k==-2){//neu nhu khong co dinh lien ke
                    
    theStack.pop(dinhStack);//lay ra phan tu dau Stack
                    
    0;
                }
                else{
                    
    was_visited[k] = true;//danh dau dinh lien ke cua dinh v da duoc tham
                    
    if(k<soDinh-1)
                        
    k+1//ty nua se for tu dinh thu k+1 chu khong for lai cac dinh <k nua
                    
    else k//neu k = so dinh luon roi thi thoi khoi duyet them chi cho met
                    
    theStack.push(k);//dua dinh lien ke nay vao Stack
                    
    daTham[++stt] = k;//dua dinh lien ke vao mang da tham theo thu tu
                
    }
            }
            
    cout<<"\ndanh sach cac dinh lan luot duoc duyet la\n";
            for (
    int i0;i<soDinhi++)
                
    cout<<"  "<<daTham[i];
            
    cout<<endl;
        }
    }
    int main(){
        
    Graph doThi_A;
        
    Graph doThi_B;
        
    char nameFile[20];
        
    //------------------ket thuc khai bao cac bien a doi tuong-----------------------
        
    cout<<"\nHay nhap vao ten File ma ban muon lay du lieu\n";
        
    cin.getline(nameFile,20);
        
    doThi_A.readFile1(nameFile);
        
    cout<<"\nDa doc file co ma tran ke xong. \n";
        
    cout<<"\nThuc hien thuat toan BFS\n";
        
    doThi_A.BFS();
        
    //-----------------------------thuc hien thuat toan duyet do thi theo chieu rong--
        //--------------------------------------------------------------------------------
        //-----------------------------thuc hien thuat toan duyet do thi theo chieu sau---
        
    doThi_B.readFile1(nameFile);
        
    cout<<"\nDa doc file co ma tran ke xong. \n";
        
    cout<<"\nThuc hien thuat toan DFS\n";
        
    doThi_B.DFS();
        return 
    0;

    bài này tớ đã dùng 2 đối tượng đó là doThi_A và doThi_B. Nhưng mà tớ muốn chỉ dùng một đối tượng thôi thì làm sao ?
    Hạnh phúc luôn đợi ta mỉn cười lại với nó.(^,,^).

  4. #4
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    tớ có hai hàm duyệt đồ thị là: DFS và BFS. hai hàm này trong cùng một lớp. Và khi tớ khai báo một đối tượng A và tớ gọi hàm DFS, thì tất cả những thuộc tính cảu lớp bị thay đổi, sau đó tớ không thể dùng chính đối tượng đó để gọi hàm BFS, vì các thuộc tính đã bị thay đổi và kết quả không đúng nữa. Không khai báo một đối tượng thứ 2 tớ còn cách nào không?
    làm hàm tạo đưa giá trị về ban đầu hoặc làm 1 hàm riềng đưa giá trị về ban đầu

  5. #5
    Ngày gia nhập
    08 2008
    Bài viết
    46

    Hàm tạo sẽ tự động được goi khi khai báo một đối tượng mới. Trong chương trình của tớ cũng có hàm tạo rồi, nhưng để làm được điều tớ muốn thì dùng hàm tạo thế nào để nó đưa các giá trị này về vị trí ban đầu nhỉ? Đúng là có thể dùng một hàm riêng đưa các giá trị của thuộc tính về vị trí ban đầu. Cái này tớ hiểu còn hàm tạo thì không biết phải làm sao?
    Hạnh phúc luôn đợi ta mỉn cười lại với nó.(^,,^).

  6. #6
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Mặc định [ Solved ]Chỉ dùng một đối tượng A?

    Code:
    Stack::Stack(){
        size = 20;
        top = 0;
    }
    ah,OK cậu có thể gọi lại hàm tạo nếu muốn đưa nó về giá trị ban đầu mà

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Tạo 1 copy của dữ liệu trong hàm gọi DFS, 1 copy cho hàm gọi BFS, thì các đỉnh không bị thay đổi. Tui đoán chắc cái đám này phải không ?
    C++ Code:
    1.  int A[20][20];
    2.     int soDinh;//so dinh cua ma tran
    3.     bool was_visited[20];//mang danh dau nhung dinh da tham
    4.     int daTham[20]; //mang luu tru dinh da tham

  8. #8
    Ngày gia nhập
    08 2008
    Bài viết
    46

    Trích dẫn Nguyên bản được gửi bởi coder_gate Xem bài viết
    Code:
    Stack::Stack(){
        size = 20;
        top = 0;
    }
    ah,OK cậu có thể gọi lại hàm tạo nếu muốn đưa nó về giá trị ban đầu mà
    sao lại gọi lại hàm tạo được, nó tự động được gọi khi khai báo một đối tượng mà. tớ không hiểu gọi lại như thế nào?
    Hạnh phúc luôn đợi ta mỉn cười lại với nó.(^,,^).

  9. #9
    Ngày gia nhập
    08 2008
    Bài viết
    46

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Tạo 1 copy của dữ liệu trong hàm gọi DFS, 1 copy cho hàm gọi BFS, thì các đỉnh không bị thay đổi. Tui đoán chắc cái đám này phải không ?
    Cplusplus Code: | Lựa chọn code | Ẩn/Hiện code |
    int A[20][20];
    int soDinh;//so dinh cua ma tran
    bool was_visited[20];//mang danh dau nhung dinh da tham
    int daTham[20]; //mang luu tru dinh da tham

    Tớ lại không hiểu: Tạo 1 coppy của kiểu dữ liệu trong hàm gọi DFS, và BFS là sao? tạo như thế nào nhỉ?
    Hạnh phúc luôn đợi ta mỉn cười lại với nó.(^,,^).

  10. #10
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Cậu tạo hàm getAarray(), getSoDinh(), getWasVisitiedArray(), getDaThamArray(). Xử lý trên đám này, thằng nào gọi thì cho nó xử lý trên bản copy vậy là xong.

Các đề tài tương tự

  1. [ Solved ]Đối tượng hằng, phương thức hằng!!! Khi nào cần dùng ???
    Gửi bởi camping29 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 18-11-2008, 12:50 AM
  2. [ Solved ]Hàm cộng 2 số lớn dùng mảng int
    Gửi bởi reddevils528 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 19-10-2008, 02:49 PM
  3. [ Solved ]Lỗi khi dùng template
    Gửi bởi kidyboy2003 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 15
    Bài viết cuối: 13-10-2008, 01:01 AM
  4. [ Solved ]Lỗi khi dùng dịch bằng Dev C++
    Gửi bởi Huyx trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 9
    Bài viết cuối: 25-09-2008, 10:20 AM
  5. [Solved]lập trình cho hệ thống nhúng dùng C/C++
    Gửi bởi luon07 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 14-03-2008, 10:09 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn