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

Đề tài: [?]Làm sao để khai báo mảng có chỉ số âm

  1. #1
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Mặc định [?]Làm sao để khai báo mảng có chỉ số âm

    Cho em hỏi em thấy trong Pascal ta có thể khai báo như sau:

    Code:
    a: array[-2...2] of float;
    Thì sẽ được một mảng các số thực gồm 5 phần tử a[-2] , a[-1] , a[0] , a[1] , a[2].

    Nếu như trong C hay trong C++ muốn khai báo mảng với chỉ số âm như thế thì làm sao ạ ? Em có 1 số bài toán cần có mảng chỉ số âm như vậy . Help ! Thanks.

  2. #2
    Ngày gia nhập
    07 2007
    Nơi ở
    Sơn La
    Bài viết
    133

    Hỏng kó bít luôn.
    SP cho ví dụ kụ thể koi nào.
    Như thế này à?
    Ex: Matrix[-3] || Matrix[-40]
    ???
    Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.

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

    C không hề có khả năng này, C++ thì ok, T_T, hồi đọc code pascal vì cái negative subsript này mà anh phải tìm cách để sử dụng mãng âm. Em coi cái này nhé, anh sẽ upgrade nó sau :
    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. }

  4. #4
    Ngày gia nhập
    07 2007
    Nơi ở
    Sơn La
    Bài viết
    133

    Bài của rr nói chung vẫn dựa vào
    mid=abs( (end-start) + 1).
    Nghĩa là dựa vào dời trục tọa độ.
    Cách này thì ok.
    Mình cứ tưởng là khai báo kiểu int arr[- Int]; thì không có biết.
    ^^
    Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.

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

    Nói chung C/C++ họ đã thống nhất sẽ bắt đầu mãng từ 0, nên không có cách gì khác ngoài cách đó để làm vậy cả T_T, vì có hỏi 1 bà cô thì bả nói dùng negative indices là rất poor programming. Nhưng Nt thấy đó nhiều khi trong giải thuật lại phải dùng negative indices thì ý nghĩa mới rõ ràng, và đó là lý do tại sao người ta nói code Pascal rất sáng. Nhưng version trên vẫn còn rất giới hạn và không handle kĩ exception. Dùng allocator mình viết sẽ bảo đảm quản lý resource tốt hơn nhiều, nhưng có lẽ code sẽ trở nên phức tạp hơn 1 tí. Hồi đó thú thật cũng chết mệ chết mệt vì mấy cái mãng âm khi đọc giải thuật pascal T_T, nên đã có ý tưởng này hì hì. r2 nhất định sẽ viết lại hoàn chỉnh hơn khi có thời gian.

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Mặc định [?]Làm sao để khai báo mảng có chỉ số âm

    Uhm... vậy là chỉ còn cách dời mảng lại hà . Thanks anh nhé.

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

  1. Tệp tin *.lib khác *.dll khác nhau như thế nào ?
    Gửi bởi ngusaomanoi trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 18-12-2012, 05:15 PM
  2. Chính chủ cần bán CHCC 310 Minh Khai, bán chung cư 310 minh khai 87m tầng 8, cc 310 minh khai
    Gửi bởi nguyenminhanh trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 19-04-2012, 02:40 PM
  3. taị sao các biến static khi khai báo để dùng được lại phải khai báo lại trước hàm main ? ?
    Gửi bởi anhnpson trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 15-06-2011, 08:18 PM
  4. Lập trình C Thắc mắc về khai báo protoype và các hàm liên quan khi khai báo!
    Gửi bởi ganhim trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 15
    Bài viết cuối: 10-08-2010, 02:03 PM
  5. Sự khác nhau giữa các khai báo int, void, float trong khai báo hàm?
    Gửi bởi toend2008 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 06-05-2009, 07:19 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