Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- class Fraction
- {
- private:
- double p, q;
- public:
- Fraction(double a = 0, double b = 1){p=a; q=b;};
- void print(){cout<<p<<"/"<<q;};
- Fraction sum(Fraction f){return Fraction(p*f.q+f.p*q, q*f.q);};
- Fraction sum(double d){return sum(Fraction(d, 1));};
- Fraction operator+(Fraction f){return sum(f);};
- Fraction operator+(double d){return sum(d);};
- Fraction operator=(const Fraction & f){p = f.p; q = f.q;};
- void setP(double value){p=value;};
- void setQ(double value){q=value;};
- double getP(){return p;};
- double getQ(){return q;};
- friend ostream & operator << (ostream & os, const Fraction & f);
- friend istream & operator >> (istream & is, Fraction & f);
- bool saveToFile(const string & filename)const;
- bool loadFromFile(const string & filename);
- };
- int main()
- {
- Fraction temp1, temp2;
- cin >> temp1;
- cout << temp1 << endl;
- string filename = "temp.txt";
- cout << "Saving to file " << filename << endl;
- temp1.saveToFile(filename);
- cout << "Loading from file " << filename << endl;
- temp2.loadFromFile(filename);
- cout << temp2 << endl;
- }
- bool Fraction::saveToFile(const string & filename)const
- // Сохранение дроби в файл
- {
- std::ofstream fout(filename);
- if (!fout)
- return false;
- fout<<*this;
- return true;
- }
- bool Fraction::loadFromFile(const string & filename)
- // Загрузка дроби из файла
- {
- ifstream fin(filename); // Открываем файловый поток для чтения
- if (!fin) // Если не удалось
- return false; // То выходим из функции , возвращая false
- fin>>*this; // Считываем дробь из потока
- return true; // Возвращаем true , что означает , что дробь успешно прочитанна
- }
- ostream & operator << (ostream & os, const Fraction & f)
- // Вывод дроби в поток
- {
- os << f.p; // Выводим числитель
- if (f.q != 1) // Если знаменатель не тривиален
- os << "/" << f.q; // То выводим из знаменатель
- return os; // Возвращаем наш поток
- }
- istream & operator >> (istream & is, Fraction & f)
- // Считывание дроби из потока
- {
- string input; // Заводим строковую переменную для ввода дроби
- is >> input; // Считываем в нее ( до первого пробела )
- int pos = input.find('/'); // Ищем разделитель между дробной и целой частью
- // Реализуем разбор строки на числитель и знаменатель
- string p, q;
- if (pos == -1) // Если разделитель не найден , то знаменатель тривиален
- {
- p = input; // В числитель записываем всю строку
- q = "1"; // В знаменатель записываем единицу
- }
- else // Иначе ( если найден разделитель )
- {
- p = input.substr(0, pos); // В числитель записываем всё до разделителя
- q = input.substr(pos+1); // В знаменатель записываем всё после разделителя
- }
- // Записываем результат в дробь , конвертируя из строки в число с плавающей точкой
- char* temp; // Временная никому не нужная переменная для вызова функции конвертирования из строки в число с плавающей точкой
- f.setP(strtod(p.c_str(), &temp)); // Ставим в числитель дроби отконвертированную строку
- f.setQ(strtod(q.c_str(), &temp)); // Ставим в знаменатель дроби отконвертированную строку
- return is; // Возвращаем поток
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement