bài này là chương trình em viết để + - * / và so sánh 2 phân số, khi chạy chương trình với các số nhỏ và tử khác 0 thì không có vấn đề gì. Nhưng khi nhập tử là 0 hoặc các số lớn( 12/17 và 23/21 chẳng hạn) thì nó lại không chạy. Em chẳng biết là sao nữa. giúp dùm em với...

Đây là code mà em viết:
C++ Code:
  1. #include "iostream.h"
  2. #include "conio.h"
  3.  
  4. class PhanSo
  5. {
  6. private:
  7.     int iTu;
  8.     int iMau;
  9. public:
  10.     void Nhap();
  11.     void Xuat();
  12.     int KiemTra ();
  13.     PhanSo Cong (const PhanSo &);
  14.     PhanSo Tru (const PhanSo &);
  15.     PhanSo Nhan (const PhanSo & );
  16.     PhanSo Chia (const PhanSo &);
  17.     int SoSanh(const PhanSo &);
  18. };
  19.  
  20. void PhanSo::Nhap()
  21. {
  22.     cout<<"+Nhap tu: ";
  23.     cin>>this->iTu;
  24.  
  25.     cout<<"+Nhap mau: ";
  26.     cin>>this->iMau;
  27.  
  28.     if(this->iTu == this->iMau)
  29.         this->iTu=this->iMau=1;
  30. }
  31.  
  32. void PhanSo::Xuat()
  33. {
  34.     if(this->iTu == 0)
  35.         cout<<"0\n";
  36.     else
  37.     {
  38.         if((this->iTu != 0) && (this->iMau == 1))
  39.             cout<<this->iTu<<"\n";
  40.         else
  41.         {
  42.             if((this->iTu != 0) && (this->iMau != 0))
  43.                 cout<<this->iTu<<"/"<<this->iMau<<"\n";
  44.         }
  45.     }
  46. }
  47.  
  48. int RutGon(int a,int b)
  49. {
  50.     while((a!=0)&&(b!=0))
  51.     {
  52.         if(a>=b)
  53.         a-=b;
  54.         else
  55.         b-=a;
  56.     }
  57.     if(a==0)   
  58.         return b;
  59.     else
  60.         return a;
  61.  
  62. }
  63.  
  64. int PhanSo::KiemTra()
  65. {
  66.     return(this->iMau != 0)?1:0;
  67. }
  68.  
  69. PhanSo PhanSo::Cong(const PhanSo &a)
  70. {
  71.     PhanSo c;
  72.  
  73.     c.iTu = (this->iTu * a.iMau) + (this->iMau * a.iTu);
  74.     c.iMau = this->iMau * a.iMau;
  75.  
  76.     int k =RutGon(c.iTu, c.iMau);
  77.     c.iTu=c.iTu/k;
  78.     c.iMau=c.iMau/k;
  79.  
  80.     return c;
  81. }
  82.  
  83. PhanSo PhanSo::Tru(const PhanSo &a)
  84. {
  85.     PhanSo c;
  86.  
  87.     c.iTu = (this->iTu * a.iMau) - (this->iMau * a.iTu);
  88.     c.iMau = this->iMau * a.iMau;
  89.  
  90.     int k =RutGon(c.iTu, c.iMau);
  91.     c.iTu/=k;
  92.     c.iMau/=k;
  93.  
  94.     return c;
  95. }
  96.  
  97. PhanSo PhanSo::Nhan(const PhanSo &a)
  98. {
  99.     PhanSo c;
  100.  
  101.     c.iTu = this->iTu * a.iTu;
  102.     c.iMau = this->iMau * a.iMau;
  103.  
  104.     int k =RutGon(c.iTu, c.iMau);
  105.     c.iTu=c.iTu/k;
  106.     c.iMau=c.iMau/k;
  107.  
  108.     return c;
  109. }
  110.  
  111. PhanSo PhanSo::Chia(const PhanSo &a)
  112. {
  113.     PhanSo c;
  114.  
  115.     c.iTu = this->iTu * a.iMau;
  116.     c.iMau = this->iMau * a.iTu;
  117.  
  118.     int k =RutGon(c.iTu, c.iMau);
  119.     c.iTu/=k;
  120.     c.iMau/=k;
  121.  
  122.     return c;
  123. }
  124.  
  125. int PhanSo::SoSanh(const PhanSo &a)
  126. {
  127.     int tong;
  128.  
  129.     tong = (this->iTu * a.iMau) - (this->iMau * a.iTu);
  130.  
  131.     if(tong <0)
  132.         return -1;
  133.     if(tong == 0)
  134.         return 0;
  135.     if(tong > 0)
  136.         return 1;
  137. }
  138.  
  139. void main()
  140. {
  141.     PhanSo a, b, c, d ,e, f;
  142. lap_lai:
  143.     cout<<"\tNHAP PHAN SO THU 1: \n";
  144.     a.Nhap();
  145.     a.KiemTra();
  146.     int i = a.KiemTra();
  147.     if(i==1)
  148.     {
  149.         cout<<"\tNHAP PHAN SO THU 2: \n";
  150.         b.Nhap();
  151.         b.KiemTra();
  152.  
  153.         int j = b.KiemTra();
  154.         if(j == 1)
  155.         {
  156.             cout<<"-------------KET QUA-------------\n";
  157.             cout<<"Tong hai phan so la: ";
  158.             c = a.Cong(b);
  159.             c.Xuat();
  160.  
  161.             cout<<"Hieu hai phan so la: ";
  162.             d = a.Tru(b);
  163.             d.Xuat();
  164.  
  165.             cout<<"Tich hai phan so la: ";
  166.             e = a.Nhan(b);
  167.             e.Xuat();
  168.  
  169.             cout<<"Thuong hai phan so la: ";
  170.             f = a.Chia(b);
  171.             f.Xuat();
  172.  
  173.             a.SoSanh(b);
  174.             int i = a.SoSanh(b);
  175.             if(i == -1 )
  176.                 cout<<"Phan so thu nhat nho hon phan so thu hai"<<endl;
  177.             else
  178.             {
  179.                 if(i == 0)
  180.                     cout<<"Hai phan so bang nhau"<<endl;
  181.                 else
  182.                     cout<<"Phan so thu nhat lon hon phan so thu hai"<<endl;
  183.             }
  184.         }
  185.         else
  186.         {
  187.             cout<<"Ban nhap mau so sai, nhap lai\n";
  188.             goto lap_lai;
  189.         }
  190.     }
  191.     else
  192.     {
  193.         cout<<"Ban nhap mau so sai, nhap lai\n";
  194.         goto lap_lai;
  195.     }
  196. }