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ố 11 kết quả

Đề tài: Lỗi không hủy đc, stack cộng 2 đa thức

  1. #1
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Mặc định Lỗi không hủy đc, stack cộng 2 đa thức

    Bài Hoàng làm cộng 2 đa thức sử dụng stack, nhưng chương trình bị crash.
    Không thể huy được stack tạo ra trong phép cộng. Mọi người hướng dẫn sử lý vấn đề này với.

    poly1.Add(poly2).Display();///////

    C++ Code:
    1. /** Title: Polynomial
    2.   * Author: QuangHoang
    3.   * File: Polynomial.h
    4.   * Date: 20090312
    5.   * Info: Calculative with two Polynomial.
    6.   **/
    7. #include <iostream>
    8. using namespace std;
    9. /*
    10. */
    11. typedef struct Monomial
    12. {
    13.     float co;     //constand
    14.     int de;       //degree
    15.     Monomial *next;
    16. } *NODE;
    17.  
    18. /**Class stack**/
    19. class Polynomial
    20. {
    21.     private:
    22.         NODE plist;
    23.     public:
    24.         Polynomial()
    25.         {
    26.             cout << " - Initalization..." << endl;
    27.             plist=NULL;
    28.         }
    29.         ~Polynomial()
    30.         {
    31.             cout << "Chua kip huy" << endl;
    32.             while (plist!=NULL)
    33.             {
    34.                 NODE p = plist;
    35.                 plist = plist->next;
    36.                 delete p;
    37.             }
    38.             cout << " - Destroy..." << endl;
    39.         }
    40.         bool Empty()
    41.         {
    42.             if (plist==NULL) return true;
    43.             return false;
    44.         }
    45.         void Push(float c, int d);
    46.         void Pop(float &c, int &d);
    47.         void CreatePoly();
    48.         Polynomial Add(Polynomial p);
    49.         void Display();
    50. };
    51.  
    52. /*Function in class*/
    53. void Polynomial::Push(float c, int d)
    54. {
    55.     NODE p = new Monomial;
    56.     p->co = c;
    57.     p->de = d;
    58.  
    59.     if (Empty())
    60.     {
    61.         plist = p;
    62.         plist->next = NULL;
    63.         return;
    64.     }
    65.  
    66.     p->next = plist;
    67.     plist = p;
    68. }
    69.  
    70. void Polynomial::Pop(float &c, int &d)
    71. {
    72.     if (!Empty())
    73.     {
    74.         NODE p = plist;
    75.         plist = plist->next;
    76.         c = p->co;
    77.         d = p->de;
    78.         delete p;
    79.     }
    80. }
    81.  
    82. void Polynomial::CreatePoly()
    83. {
    84.     float c;
    85.     int d;
    86.     cout << " * Input degree of polynomial: ";cin >> d;
    87.     cout << " * Input constand: \n";
    88.     for (int i=0; i<=d; ++i)
    89.     {
    90.         cout << " - a" << i << " = ";
    91.         cin >> c;
    92.         if (c!=0) Push(c,i);
    93.     }
    94. }
    95.  
    96. Polynomial Polynomial::Add(Polynomial p)
    97. {
    98.     Polynomial pResult;
    99.     float c1,c2;
    100.     int d1, d2;
    101.     Pop(c1,d1);
    102.     p.Pop(c2,d2);
    103.     while (!Empty() && !p.Empty())
    104.     {
    105.         if (d1>d2)
    106.         {
    107.             pResult.Push(c1,d1);
    108.             Pop(c1,d1);
    109.         }
    110.         else if (d1<d2)
    111.         {
    112.             pResult.Push(c2,d2);
    113.             p.Pop(c2,d2);
    114.         }
    115.         else
    116.         {
    117.             pResult.Push(c1+c2,d1);
    118.             Pop(c1,d1);
    119.             p.Pop(c2,d2);
    120.         }
    121.     }
    122.  
    123.     if (d1>d2) pResult.Push(c1,d1);
    124.     else if (d1<d2) pResult.Push(c2,d2);
    125.     else pResult.Push(c1+c2,d1);
    126.  
    127.     while (!Empty()) {Pop(c1,d1);pResult.Push(c1,d1);}
    128.     while (!p.Empty()) {p.Pop(c2,d2);pResult.Push(c2,d2);}
    129.  
    130.     return pResult;
    131. }
    132.  
    133. void Polynomial::Display()
    134. {
    135.     float c;
    136.     int d;
    137.     Pop(c,d);
    138.     if (d!=0)
    139.         cout << c << "*X^" << d;
    140.     else cout << c;
    141.     while (!Empty())
    142.     {
    143.         Pop(c,d);
    144.         if (d!=0)
    145.         {
    146.             if (c>0)
    147.                 cout << " +" << c << "*X^" << d;
    148.             else cout << " " << c << "*X^" << d;
    149.         }
    150.         else
    151.         {
    152.             if (c>0)
    153.                 cout << " +" << c;
    154.             else cout << " " << c;
    155.         }
    156.     }
    157. }
    158.  
    159.  
    160. /**Main program**/
    161. int main()
    162. {
    163.     Polynomial poly1,poly2;
    164.     poly1.CreatePoly();
    165.     //poly1.Display();
    166.     poly2.CreatePoly();
    167.     //poly2.Display();
    168.  
    169.     poly1.Add(poly2).Display();
    170.     return EXIT_SUCCESS;
    171. }

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

    Copy constructor đâu mà return local object một cách tự tin thế em ? Còn truyền tham trị cho hàm nữa chứ !

  3. #3
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Em sửa có vẻ nó chạy ổn rùi, nhưng đề yêu cầu dùng stack như này, không display được từng đa thức, chăc phải copy sang một đa thức mới rồi display, có cách nào han giải quyết vấn đề này không ạ.

    C++ Code:
    1. /** Title: Polynomial
    2.   * Author: QuangHoang
    3.   * File: Polynomial.h
    4.   * Date: 20090312
    5.   * Info: Calculative with two Polynomial.
    6.   **/
    7. #include <iostream>
    8. using namespace std;
    9. /*
    10. */
    11. typedef struct Monomial
    12. {
    13.     float co;     //constand
    14.     int de;       //degree
    15.     Monomial *next;
    16. } *NODE;
    17.  
    18. /**Class stack**/
    19. class Polynomial
    20. {
    21.     private:
    22.         NODE plist;
    23.  
    24.     public:
    25.         Polynomial()
    26.         {
    27.             cout << " - Initalization..." << endl;
    28.             plist=NULL;
    29.         }
    30.  
    31.         Polynomial(Polynomial &p)
    32.         {
    33.             Polynomial pl;
    34.             while (!p.Empty())
    35.             {
    36.                 float c;
    37.                 int d;
    38.                 p.Pop(c,d);
    39.                 pl.Push(c,d);
    40.             }
    41.  
    42.             while (!pl.Empty())
    43.             {
    44.                 float c;
    45.                 int d;
    46.                 pl.Pop(c,d);
    47.                 Push(c,d);
    48.             }
    49.         }
    50.  
    51.         ~Polynomial()
    52.         {
    53.             while (plist!=NULL)
    54.             {
    55.                 NODE p = plist;
    56.                 plist = plist->next;
    57.                 delete p;
    58.             }
    59.             cout << " - Destroy..." << endl;
    60.         }
    61.  
    62.         bool Empty()
    63.         {
    64.             if (plist==NULL) return true;
    65.             return false;
    66.         }
    67.  
    68.         void Push(float c, int d);
    69.         void Pop(float &c, int &d);
    70.         void CreatePoly();
    71.         Polynomial Add(Polynomial &p);
    72.         void Display();
    73. };
    74.  
    75.  
    76. /*Function in class*/
    77. void Polynomial::Push(float c, int d)
    78. {
    79.     NODE p = new Monomial;
    80.     p->co = c;
    81.     p->de = d;
    82.  
    83.     if (Empty())
    84.     {
    85.         plist = p;
    86.         plist->next = NULL;
    87.         return;
    88.     }
    89.  
    90.     p->next = plist;
    91.     plist = p;
    92. }
    93.  
    94. void Polynomial::Pop(float &c, int &d)
    95. {
    96.     if (!Empty())
    97.     {
    98.         NODE p = plist;
    99.         plist = plist->next;
    100.         c = p->co;
    101.         d = p->de;
    102.         delete p;
    103.     }
    104. }
    105.  
    106. void Polynomial::CreatePoly()
    107. {
    108.     float c;
    109.     int d;
    110.     cout << " * Input degree of polynomial: ";cin >> d;
    111.     cout << " * Input constand: \n";
    112.     for (int i=0; i<=d; ++i)
    113.     {
    114.         cout << " - a" << i << " = ";
    115.         cin >> c;
    116.         if (c!=0) Push(c,i);
    117.     }
    118. }
    119.  
    120. Polynomial Polynomial::Add(Polynomial &p)
    121. {
    122.     Polynomial pResult;
    123.     float c1,c2;
    124.     int d1, d2;
    125.     Pop(c1,d1);
    126.     p.Pop(c2,d2);
    127.     while (!Empty() && !p.Empty())
    128.     {
    129.         if (d1>d2)
    130.         {
    131.             pResult.Push(c1,d1);
    132.             Pop(c1,d1);
    133.         }
    134.         else if (d1<d2)
    135.         {
    136.             pResult.Push(c2,d2);
    137.             p.Pop(c2,d2);
    138.         }
    139.         else
    140.         {
    141.             pResult.Push(c1+c2,d1);
    142.             Pop(c1,d1);
    143.             p.Pop(c2,d2);
    144.         }
    145.     }
    146.  
    147.     if (d1>d2) pResult.Push(c1,d1);
    148.     else if (d1<d2) pResult.Push(c2,d2);
    149.     else pResult.Push(c1+c2,d1);
    150.  
    151.     while (!Empty()) {Pop(c1,d1);pResult.Push(c1,d1);}
    152.     while (!p.Empty()) {p.Pop(c2,d2);pResult.Push(c2,d2);}
    153.  
    154.     return pResult;
    155. }
    156.  
    157. void Polynomial::Display()
    158. {
    159.     float c;
    160.     int d;
    161.     Pop(c,d);
    162.     if (d!=0)
    163.         cout << c << "*X^" << d;
    164.     else cout << c;
    165.     while (!Empty())
    166.     {
    167.         Pop(c,d);
    168.         if (d!=0)
    169.         {
    170.             if (c>0)
    171.                 cout << " +" << c << "*X^" << d;
    172.             else cout << " " << c << "*X^" << d;
    173.         }
    174.         else
    175.         {
    176.             if (c>0)
    177.                 cout << " +" << c;
    178.             else cout << " " << c;
    179.         }
    180.     }
    181. }
    182.  
    183.  
    184. /**Main program**/
    185. int main()
    186. {
    187.     Polynomial poly1,poly2;
    188.     poly1.CreatePoly();
    189.     //poly1.Display();
    190.     poly2.CreatePoly();
    191.     //poly2.Display();
    192.  
    193.     poly1.Add(poly2).Display();
    194.     return EXIT_SUCCESS;
    195. }

    * Cả tại e mới học, nên code chỗ nào a thấy nó không hợp lý cần sửa (kể cả nhưng cái nhỏ) a góp ý e để e sửa hết.

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

    - Dùng stack cho polynomial thì phải chịu thôi, em chuyển sang dùng double linked-list đi.
    - Thiếu const nhiều quá, em đọc kĩ lại sách về const xem. Code thiếu operator = và copy constructor là logic error rồi.
    - Hàm add có vẻ nghe không xuông cho lắm, dùng quá tải toán tử đi.
    - Hơn nữa class Poly nên độc lập 1 mình, biết là bên trong dùng linklist nhưng không nên để 2 ý tưởng thành 1( ví dụ em gôm stack + poly chung 1 lớp ) lúc cần xài lại thì rất sữa code rất mệt.
    - Anh cũng có làm qua cái này, có gì rảnh anh sẽ tìm lại code cũ rồi post cho em xem thử.

  5. #5
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Chắc e sẽ làm lại với double linked-list, nhưng chiều mới làm đc, giờ em phải đi học đã.

    Khi làm xong cũng muốn tham khảo thêm code của a, cảm ơn a.

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

    Mặc định Lỗi không hủy đc, stack cộng 2 đa thức

    Em cứ làm lại bằng linklist rồi tham khảo cái này, nếu có chỗ nào không rõ ràng thì cứ nói cho anh biết. Code hơi dài do lúc anh làm phải comment để nộp bài mà viết không rõ ràng thì bị trừ điểm T_T, nên hơi dài dòng văn tự một tí, chứ nội dung cũng đơn giản không có gì hết.
    Attached Files Attached Files

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

    @QH: Tham khảo cái này nè bạn

    1) Đa thức danh sách đặc.
    http://www.mediafire.com/?imzngmy5nnh

    2) Đa thức danh sách liên kết.
    http://www.mediafire.com/?0jmvx3mnr5u

    @Rox Rock: Không hiểu sao cái đa thức danh sách liên kết này (xài template) lúc biên dịch thì nó báo lỗi "unresolved external symbol".
    Lỗi này em có đọc ở đâu mà quên rồi. Để chung file thì chạy được, chia ra nhiều file thì nó báo lỗi @_@.

  8. #8
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Cảm ơn nhé, nhưng H nhác xem template lắm , chưa học đến nên vừa đọc code vừa tra lý thuyết cũng hơi mệt.

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

    Trích dẫn Nguyên bản được gửi bởi Emerald214 Xem bài viết
    Lỗi này em có đọc ở đâu mà quên rồi. Để chung file thì chạy được, chia ra nhiều file thì nó báo lỗi @_@.
    http://www.codeguru.com/forum/showthread.php?t=250284
    code ra gió bão

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

    Nãy cũng search ra trang này, đọc xong thì "sáng" ra liền ^^!
    => Khi xài template, cứ nhét hết vào header file +_+. Không xài template mà để nhiều file nó cũng báo lỗi tương tự.
    => Có hay ko có template, nhét hết cả declaration và definition vào header file là ổn @_@.

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

  1. Bài tập C++ copy noi dung tu stack S sang stack D
    Gửi bởi thaodn_chuprong trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 12
    Bài viết cuối: 18-10-2012, 11:45 PM
  2. Cấu trúc dữ liệu Chuyển các phần tử từ stack này sang stack kia như thế nào?
    Gửi bởi rukawa1184 trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 9
    Bài viết cuối: 06-12-2011, 06:52 PM
  3. Stack, ngăn xếp - Thiết lập và ứng dụng stack trong C
    Gửi bởi PoPoPoPo trong diễn đàn Thủ thuật, Tutorials CTDL & Giải thuật
    Trả lời: 8
    Bài viết cuối: 15-11-2010, 11:24 PM
  4. Stack trên C | Lỗi khó hiểu trong Stack
    Gửi bởi tom3cang trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 22-05-2009, 11:09 PM
  5. Code về stack | Chuyển hệ số 10 sang 2 dùng stack
    Gửi bởi ahappyboy89 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: 17-04-2009, 09:48 AM

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