Реализация istream в C ++ Fraction Calculator

Я пытаюсь изучить объектно-ориентированное программирование и создать простой калькулятор дробей, который может добавлять или вычитать любое количество функций и писать ответ в виде сокращенной дроби.

Пример: вход =
3/2 + 4 /
8
, выход =
2

Я пытаюсь перегрузить операторы для достижения этой цели.

Поэтому в программе я пытаюсь разработать входные данные, состоящие из выражения, состоящего из дробей, разделенных операторами «+» или «-».

Количество дробей в выражении произвольно.

Каждая из следующих 6 строк является примером допустимого входного выражения:

1/2 + 3/4
1/2 -5/7+3/5
355/113
3    /9-21/    -7
4/7-5/-8
-2/-3+7/5

Числитель и / или знаменатель дроби, заданной в качестве входных данных, может быть отрицательным.
Я пытаюсь сделать ввод состоит из одного выражения в одной строке, и конец ввода должен быть обнаружен путем обнаружения конца файла.

Мой неполный класс дроби определен в моем исходном файле ниже:

#include <iostream>
using namespace std;
#include "Fraction.h"#include <stdexcept>

class Fraction
{
public:
Fraction::Fraction(int a, int b);
int find_gcd(int n1, int n2);

void reduce_fraction(int *nump,  int *denomp)
{
int gcd;
gcd = find_gcd(*nump, *denomp);
*nump = *nump / gcd;
*denomp = *denomp / gcd;

if ((*denomp<0 && *nump < 0 ))
{
*denomp*=-1;
*nump*=-1;
}
else if (*denomp < 0 &&  *nump >0){
*denomp*=-1;

}
if ( *denomp ==0) {
throw invalid_argument( "Error: zero denominator" );
}
}Fraction& Fraction::operator+(const Fraction& n) {
int denom = *denomp * n.denom;
int numera = (*nump * n.numera) + (n.denom * n.nump);
return Fraction(numera,denom);
}

Fraction& Fraction::operator-(const Fraction& n) {
int denom = *denomp * n.denom;
int numera = (*nump * n.numera) - (n.denom* n.nump);
return Fraction(numera, denom);
}

friend ostream& operator<<(ostream &os, Fraction& n)
{
if (n.numera == 0)
{
cout << 0 << endl;
return os;
}
else if (n.numera == n.denom)
{
cout << 1 << endl;
return os
}
else
{
cout << n.numera << '/' << n.denom << endl;
return os;
}
}

friend istream& operator>>(istream &os, Fraction& n)
{
while(!cin.EOF)
{}
}
}};

По сути, у меня проблемы с обходом файлов и получением символов для назначения членам данных функций, которые передаются в качестве параметра.

Я пытаюсь реализовать это в моей функции-члене istream, но у меня возникают проблемы с реализацией в этом случае

Также мой заголовочный файл ниже для контекста:

#ifndef FRACTION_H
#define FRACTION_H
#include <iostream>
using namespace std;class Fraction{

public:
Fraction(int , int );
int fraction(int,int);
void reduce_fraction(int *,  int *);
Fraction& operator+(const Fraction&);
Fraction& operator-(const Fraction&);
friend ostream& operator<<(ostream &os, const  Fraction& n);
friend istream& operator>>(istream &is, const Fraction& n);};

#endif

0

Решение

Оператор извлечения, >>, должен прочесть один доля.
Используйте другой код, чтобы прочитать полное выражение и вычислить его значение.

Это выглядело бы примерно так (без проверки ошибок, просто предполагая, что ввод находится в правильной форме):

istream& operator >> (istream& is, Fraction& f)
{
char slash = 0;
return is >> f.numerator >> slash >> f.denominator;
}

Подсказка 1: вам не нужно использовать один указатель, чтобы решить эту проблему — вы только усложняете ситуацию для себя.

Подсказка 2: вы возвращаете ссылки от операторов, но присваиваете результат добавления, например, (1/2 + 3/4) = 7/3не имеет особого смысла.

Подсказка 3: никогда не вводите символы «eof». Это не значит, что вы думаете, что делает.

1

Другие решения


По вопросам рекламы [email protected]