fork download
  1. #include <cstdlib>
  2. #include <iostream>
  3. using namespace std;
  4. class Fraction {
  5. private:
  6. int num,den; //числитель и знаменатель
  7. public:
  8. Fraction(){set(0,1);
  9. }
  10. Fraction(int n,int d){set(n,d);}
  11.  
  12. Fraction(Fraction const &src);
  13. void set (int n,int d) {num=n; den=d;normalize();}
  14. int get_num() {return num;}
  15. int get_den(){return den;}
  16. Fraction add(Fraction other);
  17. Fraction mult(Fraction other);
  18.  
  19. private:
  20. void normalize();//преобразов. дроби в стандартн форм
  21. int gcf(int a,int b);//наибольший общий делитель
  22. int lcm(int a,int b);//наименьшее общее кратное
  23. };
  24. int main(){
  25.  
  26. Fraction f1(3,4);
  27. Fraction f2(f1);
  28. Fraction f3=f1.add(f2);
  29.  
  30. cout<<"значение f3 такое ";
  31. cout<<f3.get_num()<<"/";
  32. cout<<f3.get_den()<<endl;
  33. return 0;
  34. }
  35. //Функции класса fraction
  36. Fraction::Fraction(Fraction const &src){
  37. cout<<"Теперь вызывается конструктор копирования."<<endl;
  38. num=src.num;
  39. den=src.den;
  40. }
  41. //нормализация : преобразовать дробь к стандартному
  42. //виду ,уникальному для каждого математически отличающегося
  43. //значения
  44. void Fraction::normalize(){
  45. //обработать случаи со значением 0
  46. if(den==0 || num==0){
  47. num=0;
  48. den=1;
  49. }
  50. //оставить отрицательный знак только в числителе.
  51. if(den<0){
  52. num*=-1;
  53. den*=-1;
  54. }
  55. //извлечение наибольшего общего делителя из числителя и
  56. //знаменателя.
  57. int n=gcf(num,den);
  58. num=num/n;
  59. den=den/n;
  60. }
  61. //наибольший общий делитель
  62. int Fraction::gcf(int a,int b){
  63. if(a%b==0)
  64. return abs(b);
  65. else
  66. return gcf(b,a%b);
  67. }
  68. //наименьшее общее кратное
  69. int Fraction::lcm(int a,int b){
  70. return (a/gcf(a,b))*b;
  71. }
  72. Fraction Fraction::add(Fraction other){
  73. Fraction fract;
  74. int lcd=lcm(den,other.den);
  75. int quot1=lcd/den;
  76. int quot2=lcd/other.den;
  77. fract.set(num*quot1+other.num*quot2, lcd);
  78. fract.normalize();
  79. return fract;
  80. }
  81. Fraction Fraction::mult(Fraction other){
  82. Fraction fract;
  83. fract.set(num*other.num, den* other.den);
  84. fract.normalize();
  85. return fract;
  86. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
Теперь вызывается конструктор копирования.
Теперь вызывается конструктор копирования.
значение f3 такое  3/2