在C++分数计算器中实现istream

Implementing istream in a C++ Fraction Calculator

本文关键字:实现 istream 计算器 C++      更新时间:2023-10-16

我正在尝试学习面向对象的编程,并制作一个简单的分数计算器,它可以添加或减去任何数量的函数,并将答案写为缩减分数。

示例:input=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

提取运算符>>应读取一个分数
使用其他代码读取完整的表达式并计算其值。

它看起来像这样(没有错误检查,只是假设输入是正确的形式):

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"。它并不意味着你认为它做了什么。