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

Đề tài: Class Phân số viết bằng C++

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

    Mặc định Class Phân số viết bằng C++

    C++ Code:
    1. #include <iostream.h>
    2. #include <conio.h>
    3. #include <math.h>
    4. class PS {
    5. public:
    6.     long tu,mau;
    7.  
    8.     PS()
    9.     {
    10.             tu=0;
    11.             mau=0;
    12.     }
    13.     ~PS(){};
    14.  
    15.     int uscln(long a,long b)
    16.     {
    17.         if(a!=0 && b!=0)
    18.         {
    19.             a=abs(a);
    20.             b=abs(b);
    21.             while(a!=b)
    22.             {
    23.                 if(a>b)
    24.                     a=a-b;
    25.                 else
    26.                     b=b-a;
    27.             }
    28.             return a;
    29.         }
    30.         else
    31.             return 1;
    32.     }
    33.  
    34.     void rutgon(){
    35.         int u;
    36.             u=uscln(tu,mau);
    37.             tu=tu/u;
    38.             mau=mau/u;
    39.     }
    40.  
    41.     void nhap()
    42.     {
    43.     Nhap:
    44.         cout<<"Nhap tu so ";
    45.         cin>>tu;
    46.         cout<<"Nhap mau so ";
    47.         cin>>mau;
    48.         if(mau==0)
    49.         {
    50.             cout<<"Mau phai khac 0, nhap lai cho dung nha!^-^"<<endl;
    51.             goto Nhap;
    52.         }
    53.     }
    54.  
    55.     void  xuat()
    56.     {
    57.         if(mau<0)
    58.         {mau=-mau; tu=-tu;}
    59.         if(tu==0)
    60.             cout<<"0"<<endl;
    61.         else
    62.             if(mau==1)
    63.                 cout<<tu<<endl;
    64.             else
    65.                 cout<<tu<<"/"<<mau<<endl;
    66.     }
    67.  
    68.     PS operator+(PS &a)
    69.     {
    70.         PS x;
    71.         x.tu=tu*a.mau+mau*a.tu;
    72.         x.mau=mau*a.mau;
    73.         return x;
    74.     }
    75.     PS operator-()
    76.     {
    77.         PS x;
    78.         x.tu=-tu;
    79.         x.mau=mau;
    80.         return x;
    81.     }
    82.     PS operator-(PS &a)
    83.     {
    84.         PS x;
    85.         x.tu=tu*a.mau-mau*a.tu;
    86.         x.mau=mau*a.mau;
    87.         return x;
    88.     }
    89.     PS operator*(PS &a)
    90.     {
    91.         PS x;
    92.         x.tu=tu*a.tu;
    93.         x.mau=mau*a.mau;
    94.         return x;
    95.     }
    96.     PS operator/(PS &a)
    97.     {
    98.         PS x;
    99.         x.tu=tu*a.mau;
    100.         x.mau=mau*a.tu;
    101.         return x;
    102.     }
    103. };
    104. void main()
    105. {
    106.     PS e,b,c;
    107.     e.nhap();
    108.     cout<<"Phan so a:";
    109.     e.rutgon();
    110.     e.xuat();
    111.     b.nhap();
    112.     cout<<"Phan so b:";
    113.     b.rutgon();
    114.     b.xuat();
    115.     cout<<"a+b=";
    116.     c=e+b;
    117.     c.rutgon();
    118.     c.xuat();
    119.     cout<<"a-b=";
    120.     c=e-b;
    121.     c.rutgon();
    122.     c.xuat();
    123.     cout<<"a*b=";
    124.     c=e*b;
    125.     c.rutgon();
    126.     c.xuat();
    127.     cout<<"a/b=";
    128.     c=e/b;
    129.     c.rutgon();
    130.     c.xuat();
    131.     getch();
    132. }

  2. #2
    Ngày gia nhập
    01 2007
    Nơi ở
    Somewhere I belong
    Bài viết
    168

    Hơ hơ cái bài phân số nì thì cơ bản quá. À lớp PS của cậu thiếu quá tải toán tử xuất
    Code:
    friend ostream& operator<<(ostream&,PS&); ////prototype
    ostream& operator<<(ostream& cout,PS& d) //cai dat
    {
    	d.rutgon();
    	cout<<(d.tu)<<" / "<<(d.mau);
    	return cout;
    }
    Đã được chỉnh sửa lần cuối bởi iamvtn : 19-05-2007 lúc 08:51 PM.

  3. #3
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Ko biết là làm như thế này có tốt hơn ko, mấy bạn cho ý kiến nhé:
    file fraction.h
    C++ Code:
    1. #ifndef fraction_h
    2. #define fraction_h
    3. #include <iostream>
    4. #include <string>
    5. using namespace std;
    6. class fraction
    7. {
    8.       private:
    9.               int ts,ms;
    10.       public:
    11.               fraction(int t = 0,int m = 1){ts = t; ms = m;};
    12.               friend ostream& operator<<(ostream&,fraction&);
    13.               friend istream& operator>>(istream&,fraction&);
    14.               fraction operator~(); //reduce
    15.               fraction operator-(); //negative
    16.               fraction operator*(); //reciprocal
    17.               fraction operator+(fraction);
    18.               fraction operator-(fraction);
    19.               fraction operator*(fraction);
    20.               fraction operator/(fraction);
    21.               string ftos(); //fraction to string
    22.               void stof(string&,bool); //string to fraction
    23.               friend void cong(fraction&,fraction&);
    24.               friend void tru(fraction&,fraction&);
    25.               friend void nhan(fraction&,fraction&);
    26.               friend void chia(fraction&,fraction&);
    27.              
    28. };
    29. #endif
    flie fraction.cpp
    C++ Code:
    1. #include <iostream>
    2. #include <sstream>
    3. #include <string>
    4. #include "fraction.h"
    5. #include "common.h"
    6. using namespace std;
    7. ostream& operator<<(ostream& cout,fraction& x) //xuat phan so
    8. {
    9.          cout <<x.ts;
    10.          if (x.ms != 1) cout<<'|' <<x.ms;
    11.          return cout;
    12. }
    13.  
    14. istream& operator>>(istream& cin,fraction& x) //nhap phan so
    15. {
    16.          string s;
    17.          cin >>s;
    18.          if ( s[0] != '-' ) x.stof(s,false);
    19.          else
    20.          {
    21.              string s1(s,1,s.size()-1);
    22.              x.stof(s1,true);
    23.          }
    24.          return cin;
    25. }
    26. fraction fraction::operator~() //rut gon
    27. {
    28.      int tmp = gcd(ts,ms);
    29.      ts /= tmp;
    30.      ms /= tmp;
    31.      return *this;
    32. }
    33. fraction fraction::operator-() //so doi
    34. {
    35.      ts = -ts;
    36.      return *this;
    37. }
    38. fraction fraction::operator*() //nghich dao
    39. {
    40.      swap(ts,ms);
    41.      return *this;
    42. }
    43. fraction fraction::operator+(fraction x)
    44. {
    45.          return ~fraction(ts * x.ms + ms * x.ts,ms * x.ms);
    46. }
    47. fraction fraction::operator-(fraction x)
    48. {
    49.          x = -x;
    50.          return ~(*this + x);
    51. }
    52. fraction fraction::operator*(fraction x)
    53. {
    54.           return ~fraction(ts * x.ts,ms * x.ms);
    55. }
    56. fraction fraction::operator/(fraction x)
    57. {
    58.           x = *x;
    59.           return ~(*this * x);
    60. }
    61. string its(int value) //int to string
    62. {
    63.    ostringstream os;
    64.    os <<value;
    65.    return os.str();
    66. }
    67. int sti(const string &str) //string to int
    68. {
    69.     istringstream is(str);
    70.     int i;  
    71.     is >>i;  
    72.     return i;
    73. }
    74. string fraction::ftos() //fraction to string
    75. {
    76.    string s = its(ts) + '|' + its(ms);
    77.    return s;
    78. }
    79. bool isfrac(string& s) //kiem tra la phan so thuc su
    80. {
    81.      int i = 0;
    82.      while ( (i < s.size()) && (s[i] != '|') ) ++i;
    83.      if (i < s.size()) return true;
    84.      else return false;
    85. }
    86. void fraction::stof(string& s,bool neg) //string to fraction
    87. {
    88.      if (!isfrac(s))
    89.      {
    90.         ts = sti(s);
    91.         ms = 1;
    92.      }
    93.      else
    94.      {
    95.          int i = 0;
    96.          int pos = i;
    97.          int len = 1;
    98.          while ( s[i++] != '|' ) ++len;
    99.          string num;
    100.          num.assign(s,pos,len);
    101.          ts = sti(num);
    102.          if (neg) ts = -ts;
    103.          pos = i;
    104.          len = 1;
    105.          while ( i < s.size() )
    106.          {
    107.                ++len;
    108.                ++i;
    109.          }
    110.          num.assign(s,pos,len);
    111.          ms = sti(num);
    112.      }
    113. }
    114. void cong(fraction& a,fraction& b)
    115. {
    116.      cout <<"Phep cong\n"
    117.           <<"a|b + c|d = (ad + bc)|bd\n"
    118.           <<a <<" + " <<b <<"\n=("
    119.           <<a.ts <<" * " <<b.ms
    120.           <<" + "
    121.           <<a.ms <<" * " <<b.ts
    122.           <<") | ("
    123.           <<a.ms <<" * " <<b.ms
    124.           <<")\n=("
    125.           <<a.ts*b.ms <<" + " <<a.ms*b.ts
    126.           <<") | "
    127.           <<a.ms*b.ms
    128.           <<"\n="
    129.           <<a.ts*b.ms+a.ms*b.ts
    130.           <<"|"
    131.           <<a.ms*b.ms
    132.           <<"\nKet qua: ";
    133.      fraction c = a+b;
    134.      cout <<c;
    135. }
    136. void tru(fraction& a,fraction& b)
    137. {
    138.      cout <<"Phep tru\na|b + c|d = (ad + bc)|bd\n"
    139.           <<a <<" - " <<b <<"\n=("
    140.           <<a.ts <<" * " <<b.ms
    141.           <<" - "
    142.           <<a.ms <<" * " <<b.ts
    143.           <<") | ("
    144.           <<a.ms <<" * " <<b.ms
    145.           <<")\n=("
    146.           <<a.ts*b.ms <<" - " <<a.ms*b.ts
    147.           <<") | "
    148.           <<a.ms*b.ms
    149.           <<"\n="
    150.           <<a.ts*b.ms-a.ms*b.ts
    151.           <<"|"
    152.           <<a.ms*b.ms
    153.           <<"\nKet qua: ";
    154.      fraction c = a-b;
    155.      cout <<c;
    156. }
    157. void nhan(fraction& a,fraction& b)
    158. {
    159.      cout <<"Phep nhan\n"
    160.           <<"a|b * c|d = (a * c)|(b * d)\n"
    161.           <<a <<" * " <<b <<"\n=("
    162.           <<a.ts <<" * " <<b.ts
    163.           <<") | ("
    164.           <<a.ms <<" * " <<b.ms
    165.           <<")\n="
    166.           <<a.ts*b.ts <<"|" <<a.ms*b.ms
    167.           <<"\nKet qua: ";
    168.      fraction c = a*b;
    169.      cout <<c;
    170. }
    171. void chia(fraction& a,fraction& b)
    172. {
    173.      cout <<"Phep chia\n"
    174.           <<"a|b / c|d = a|b * d|c = (a * d)|(b * c)\n"
    175.           <<a <<" / " <<b <<"\n=("
    176.           <<a.ts <<" * " <<b.ms
    177.           <<") | ("
    178.           <<a.ms <<" * " <<b.ts
    179.           <<")\n="
    180.           <<a.ts*b.ms <<"|" <<a.ms*b.ts
    181.           <<"\nKet qua: ";
    182.      fraction c = a/b;
    183.      cout <<c;
    184. }
    file common.h
    Code:
    #ifndef common_h
    #define common_h
    #include <iostream>
    #include <cmath>
    void swap(int& m,int& n)
    {
         int t = m;
         m = n;
         n = t;
    }
    int gcd(int m,int n) //greatest common divisor
    {
        m = abs(m);
        n = abs(n);
        if (m < n) swap(m,n);
        if (m == 0) return n;
        int r;
        while (n != 0){
              r = m % n; 
              m = n; 
              n = r;
        }
        return m;
    }
    int scm(int m,int n) //smallest common multiple
    {
        return(m*n/gcd(m,n));
    }
    #endif

  4. #4
    Ngày gia nhập
    04 2007
    Bài viết
    128

    mình có hàm xuất roài, bạn nhìn kĩ lại xem. Code tiếng Việt ko mà!! Cái này làm từ hồi năm ngoái, post lên cho phong phú cái Tutorials, dù là cơ bản nhưng cũng có người có nhu cầu tham khảo chứ! có bài nào hay hơn thì bạn cứ post lên .

  5. #5
    Ngày gia nhập
    04 2007
    Bài viết
    128

    Hix! bài của bác huynguyen pro wa' toàn tiếng Anh!! xử lý khâu xuất ra các phép toán rất chi tiết, nhưng ko biết có rút gọn phân số sau các phép toán ko nhỉ? ah có thấy roài!! bài hay lắm!!
    Đã được chỉnh sửa lần cuối bởi soda_chanhmuoi : 19-05-2007 lúc 10:37 PM.

  6. #6
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Mặc định Class Phân số viết bằng C++

    Cái này mình viết nhưng tại vì viết tiếng việt ko dấu sợ đọc hiểu nhầm nên viết tiếng anh cho nó chắc, hơn nữa luyện tập kỹ năng viết tiếng anh lun
    Sau này có đọc code của programmer nước ngoài thì cũng ko phải lo mồm chữ O mắt chữ A.

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

    hix, chả bù tiếng Anh em chẳng đến đâu, cứ nhìn code tiếng Anh là hoảng bỏ chạy, hơ hơ. Ah tiện bác xem bài ma trận dùm em, chả biết sao e thấy nó dài và dở wa'!! mấy cái operator đó hàm thành viên của class có sử dụng được ko nhỉ?

  8. #8
    Ngày gia nhập
    11 2006
    Bài viết
    633

    mấy cái operator đó hàm thành viên của class có sử dụng được ko nhỉ?
    Cái này thì cậu phải học kỹ lại về OOP roài, ko thì lúc nào viết code cũng thắc mắc ko bít đúng hay sai đó.
    Đang xem bài matran, sẽ có ý kiến sau hén.

  9. #9
    Ngày gia nhập
    01 2007
    Nơi ở
    Somewhere I belong
    Bài viết
    168

    Bài nì để dữ liệu trong public không ổn lắm, nên để vào private rồi quá tải thêm toán tử xuất << và nhập nữa >> là ok.

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

    Cậu nói bài mình hay bài anh Huy? Bài anh Huy wa' ổn roài! chắc bài mình thôi, đúng là phải để ts và ms ở private roài, tại làm hồi mới học C++ nên cứ cho hết mọi thứ vào private cho chắc ăn, giờ thì biết roài, toán tử << và >> mình ko làm, nhưng thay vào đó là hàm xuất và nhập.

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

  1. Cách viết class Đa Thức trong C# ( Cộng , Trừ 2 đa thức )?
    Gửi bởi vuonghao77 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 12-08-2013, 08:07 PM
  2. Viết code trên Form và viết code trong class có gì khác nhau.
    Gửi bởi hocCsharp trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 21
    Bài viết cuối: 21-01-2011, 10:37 PM
  3. Cây nhị phân viết bằng C++ sử dụng class không chạy được.
    Gửi bởi banhbeo trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 18-03-2010, 07:17 PM
  4. Viết 1 class xử lý đa thức
    Gửi bởi thangit 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: 28-09-2008, 01:11 AM
  5. học cách viết class !
    Gửi bởi calme1202 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 8
    Bài viết cuối: 03-06-2008, 06:55 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