Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Lập trình C++ | Truy xuất mãng có negative subscript !

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

    Mặc định Lập trình C++ | Truy xuất mãng có negative subscript !

    Hì hì, nếu ai từng học Pascal có lẽ cũng biết là mãng Pascal ta có thể khai báo ví dụ như A[-1..100].., nhưng trong C++ thì ta chỉ có thể dùng mãng có index từ 0->. Nhưng với quá tải toán tử thì cái gì cũng có thể xảy ra. Khi ta có thể xài index âm thì sẽ rất tiện trong việc cài đặt các giải thuật như lính canh hay QHD, bài này mình viết để có thể ứng dụng trong các thuật toán, vì mình từng đọc các giải thuật pascal đôi khi lời giải hiểu nhưng không cách gì trình bày qua C++ được. Mơ ước lâu lắm rùi bây h mới viết xong đó hì hì. Các bạn có thể cài đặt thử rùi nếu có bug gì thì xin chỉ cho mình với nhé, để mình hoàn thiện thêm, thanks T_T.
    All feedbacks and comments are appreciated.
    Dùng mãng này có thể xài với char, double, anytype of data, và có safe checking tránh những truy xuất out of range.

    Mãng 1 chiều

    C++ Code:
    1. #include <iostream>
    2. #include <cmath>
    3.  
    4. class _Err{
    5. public:
    6.   void report()
    7.   {std::cout << "range error. ";}
    8. };
    9.  
    10. template <class T>
    11. class arrD{
    12. private :
    13.   int start, end;
    14.   T *iter;
    15. public:
    16.   arrD(int s, int e):start(s), end(e){
    17.     iter = new T[abs(end-start) + 1];
    18.   }
    19.   arrD(int size):start(0), end(size){
    20.     iter = new T[size];
    21.   }
    22.   ~arrD(){delete[] iter;}
    23.   const arrD &operator = (const arrD &os);
    24.   T& operator[](int offset);
    25.   const T& operator[](int offset) const;
    26.   int arrend() const   { return end;   }
    27.   int arrstart() const { return start; }
    28.   int size() const     { return (end - start);}
    29. };
    30.  
    31. template <class T>
    32. T& arrD<T>::operator[](int offset){
    33.   if(offset < start || offset >= end){
    34.     throw _Err();
    35.   }
    36.   else{
    37.     int pos = 0;
    38.     for(int x = start; x < end; ++x){
    39.       ++pos;
    40.       if(offset == x) offset = pos;
    41.     }
    42.   }
    43.   return iter[offset];
    44. }
    45.  
    46. template <class T>
    47. const T& arrD<T>::operator[](int offset) const{
    48.   if(offset < start || offset >= end){
    49.     throw _Err();
    50.   }
    51.   else{
    52.     unsigned pos = 0;
    53.     for(int x = start; x < end; ++x){
    54.       ++pos;
    55.       if(offset == x) offset = pos;
    56.     }
    57.   }
    58.   return iter[offset];
    59. }
    60.  
    61. template <class T>
    62. const arrD<T>& arrD<T>::operator = (const arrD<T> &os)
    63. {
    64.   if(&os != this){
    65.     if((end - start) != (os.end - os.start)){
    66.       delete []iter;
    67.       end = os.end;
    68.       start = os.start;
    69.       iter = new T[abs(end-start) + 1];
    70.     }
    71.     for(int i = start; i < end; ++i)
    72.       iter[i] = os.iter[i];
    73.   }
    74.   return *this;
    75. }
    76.  
    77. int main()
    78. {
    79.   arrD<char> A(-3,3);
    80.   try{
    81.     for(int i = -3; i < 3; ++i){
    82.       A[i] = 'a';
    83.     }  
    84.     for(int i = -3; i < 3; ++i)
    85.       std::cout << A[i] << '\n';
    86.   }
    87.   catch(_Err e){
    88.     e.report();
    89.   }
    90.   return 0;
    91. }

    Phiên bản vector :
    C++ Code:
    1. // a.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4. #include <iostream>
    5. #include <cmath>
    6. #include <vector>
    7.  
    8. class _Err{
    9. public:
    10.     void report(){
    11.         std::cout << "range error. ";
    12.     }
    13. };
    14.  
    15. template <class T>
    16. class arrD{
    17. private :
    18.     int start, end;
    19.     std::vector<T> iter;
    20. public:
    21.     arrD(int s, int e):start(s), end(e), iter(e - s + 1)
    22.     {}
    23.     T& operator[](int offset);
    24.     const T& operator[](int offset) const;
    25.     int arrend() const   { return end;   }
    26.     int arrstart() const { return start; }
    27.     int size() const     { return (end - start);}
    28. };
    29.  
    30. template <class T>
    31. T& arrD<T>::operator[](int offset)
    32. {
    33.     if(offset < start || offset >= end){
    34.         throw _Err();
    35.     }
    36.     else{
    37.         int pos = 0;
    38.         for(int x = start; x < end; ++x){
    39.             ++pos;
    40.             if(offset == x) offset = pos;
    41.         }
    42.     }
    43.     return iter[offset];
    44. }
    45.  
    46. template <class T>
    47. const T& arrD<T>::operator[](int offset) const
    48. {
    49.     if(offset < start || offset >= end){
    50.         throw _Err();
    51.     }
    52.     else
    53.     {
    54.         unsigned pos = 0;
    55.         for(int x = start; x < end; ++x){
    56.             ++pos;
    57.             if(offset == x) offset = pos;
    58.         }
    59.     }
    60.     return iter[offset];
    61. }
    62.  
    63. int main()
    64. {
    65.     arrD<char> A(-3, 3);
    66.     for(int x = -3; x < 3; ++x){
    67.         A[x] = 'c';
    68.     }
    69.    
    70.     for(int x = -3; x < 3; ++x){
    71.         std::cout << A[x] << ' ';    
    72.     }
    73. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 02-03-2008 lúc 03:03 AM.

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

    Mãng 2 chiều
    C++ Code:
    1. #include <iostream>
    2. #include <vector>
    3. #include <cmath>
    4. #include <string>
    5.  
    6. class _Err{
    7.   void report(){
    8.     std::cerr << "Range error :";
    9.   }
    10. };
    11.  
    12. template <class T>
    13. class arr2D{
    14.   int sRow, eRow, sCol, eCol;
    15.   std::vector<T> data;
    16. public:
    17.   arr2D(int sRow, int eRow, int sCol, int eCol)
    18.     :sRow(sRow), eRow(eRow), sCol(sCol), eCol(eCol),
    19.     data(abs((eRow - sRow + 1)*(eCol - sCol + 1)))
    20.   {}
    21.   int size() const{
    22.     return abs((eRow - sRow + 1)*(eCol - sCol + 1));
    23.   }
    24.            
    25.   T &element(int x, int y){
    26.     return data[x*abs(eCol - sCol) + y];
    27.   }
    28.        
    29.   class Row{
    30.     arr2D &im;
    31.     int row;
    32.   public :
    33.     Row(arr2D &im, int row):im(im), row(row){}
    34.     T &operator[](int offset){
    35.       if(offset < im.sCol || offset >= im.eCol){
    36.         throw _Err();
    37.       }
    38.       else{
    39.         unsigned pos = 0;
    40.         for(int x = im.sCol; x < im.eCol; ++x){
    41.           ++pos;
    42.           if(offset == x) offset = pos;
    43.         }
    44.         return im.element(row, offset);
    45.       }
    46.     }
    47.   };
    48.   Row operator[](int offset){
    49.   if(offset < sRow || offset >= eRow){
    50.     throw _Err();
    51.   }
    52.   else{
    53.     unsigned pos = 0;
    54.     for(int x = sRow; x < eRow; ++x){
    55.       ++pos;
    56.       if(offset == x) offset = pos;
    57.     }
    58.   }
    59.   return Row(*this, offset);
    60.   }
    61. };
    62.  
    63.  
    64.  
    65. int main()
    66. {
    67.   arr2D<std::string> M(-3, 3, -3, 4);
    68.   for(int x = -3; x < 3; x++){
    69.     for(int y = -3; y < 4; y++){
    70.       M[x][y] = "IloveYou";
    71.     }
    72.   }
    73.   for(int x = -3; x < 3; x++){
    74.     for(int y = -3; y < 4; y++){
    75.       std::cout << M[x][y] << ' ';
    76.     }
    77.     std::cout << '\n';
    78.   }
    79.   return 0;
    80. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 02-03-2008 lúc 03:04 AM.

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

  1. Truy xuất dữ liệu của 1 địa chỉ con trỏ
    Gửi bởi hsagduag trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 7
    Bài viết cuối: 29-12-2011, 11:14 AM
  2. Truy xuất dữ liệu ra .xls và .doc
    Gửi bởi snowaleg_5555 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 03-04-2009, 05:12 PM
  3. truy xuất địa chỉ ô nhớ
    Gửi bởi vicky1986 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 8
    Bài viết cuối: 31-01-2009, 10:22 AM
  4. Truy xuất biến của lớp ?
    Gửi bởi BuithiHa trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 12-04-2008, 07:36 PM
  5. Cách truy xuất đối tượng trong lập trình C
    Gửi bởi rox_rook trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 21-11-2007, 02:30 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