Advertisement
dmkozyrev

fraction_input_output

Feb 9th, 2016
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. class Fraction
  6. {
  7.     private:
  8.         double p, q;
  9.     public:
  10.         Fraction(double a = 0, double b = 1){p=a; q=b;};
  11.         void print(){cout<<p<<"/"<<q;};
  12.         Fraction sum(Fraction f){return Fraction(p*f.q+f.p*q, q*f.q);};
  13.         Fraction sum(double d){return sum(Fraction(d, 1));};
  14.         Fraction operator+(Fraction f){return sum(f);};
  15.         Fraction operator+(double d){return sum(d);};
  16.         Fraction operator=(const Fraction & f){p = f.p; q = f.q;};
  17.         void setP(double value){p=value;};
  18.         void setQ(double value){q=value;};
  19.         double getP(){return p;};
  20.         double getQ(){return q;};
  21.        
  22.         friend ostream & operator << (ostream & os, const Fraction & f);
  23.         friend istream & operator >> (istream & is, Fraction & f);
  24.        
  25.         bool saveToFile(const string & filename)const;
  26.         bool loadFromFile(const string & filename);
  27. };
  28.  
  29. int main()
  30. {
  31.     Fraction temp1, temp2;
  32.     cin >> temp1;
  33.     cout << temp1 << endl;
  34.     string filename = "temp.txt";
  35.     cout << "Saving to file " << filename << endl;
  36.     temp1.saveToFile(filename);
  37.  
  38.     cout << "Loading from file " << filename << endl;
  39.     temp2.loadFromFile(filename);
  40.    
  41.     cout << temp2 << endl;
  42. }
  43.  
  44. bool Fraction::saveToFile(const string & filename)const
  45. // Сохранение дроби в файл
  46. {
  47.     std::ofstream fout(filename);
  48.     if (!fout)
  49.         return false;
  50.    
  51.     fout<<*this;
  52.     return true;   
  53. }
  54.  
  55. bool Fraction::loadFromFile(const string & filename)
  56. // Загрузка дроби из файла
  57. {
  58.     ifstream fin(filename); // Открываем файловый поток для чтения
  59.     if (!fin) // Если не удалось
  60.         return false; // То выходим из функции , возвращая false
  61.    
  62.     fin>>*this; // Считываем дробь из потока
  63.     return true; // Возвращаем true , что означает , что дробь успешно прочитанна
  64. }
  65.  
  66. ostream & operator << (ostream & os, const Fraction & f)
  67. // Вывод дроби в поток
  68. {
  69.     os << f.p; // Выводим числитель
  70.     if (f.q != 1) // Если знаменатель не тривиален
  71.         os << "/" << f.q; // То выводим из знаменатель
  72.     return os; // Возвращаем наш поток
  73. }
  74.  
  75. istream & operator >> (istream & is, Fraction & f)
  76. // Считывание дроби из потока
  77. {
  78.     string input; // Заводим строковую переменную для ввода дроби
  79.     is >> input; // Считываем в нее
  80.     int pos = input.find('/'); // Ищем разделитель между дробной и целой частью
  81.    
  82. //  Реализуем разбор строки на числитель и знаменатель
  83.     string p, q;
  84.     if (pos == -1) // Если разделитель не найден , то знаменатель тривиален
  85.     {
  86.         p = input; // В числитель записываем всю строку
  87.         q = "1"; // В знаменатель записываем единицу
  88.     }
  89.     else // Иначе ( если найден разделитель )
  90.     {
  91.         p = input.substr(0, pos); // В числитель записываем всё до разделителя
  92.         q = input.substr(pos+1); // В знаменатель записываем всё после разделителя
  93.     }
  94.    
  95. //  Записываем результат в дробь , конвертируя из строки в число с плавающей точкой
  96.     f.setP(stod(p));
  97.     f.setQ(stod(q));
  98.    
  99.     return is; // Возвращаем поток
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement