混合数字类istream问题

Mixed number class istream issues

本文关键字:问题 istream 数字 混合      更新时间:2023-10-16

整个夏天我给自己布置了一些家庭作业,由于这个问题,我完成了98%的项目陷入了停滞。

我有一个班叫混合班。它包含整数、分子和分母的成员数据。我需要重载所有常见的运算符,以允许Mixed类型的对象的乘法、加法、比较和流。除了>>(提取运算符)之外,我已经重载了所有运算符。

读入的所有混合数字的格式为:全分子/分母

例如:1 2/3、0 7/8、-3 18/5、0-1/89

标题:friend istream& operator>> (istream &, Mixed);

CPP文件:istream& operator>> (istream &in, Mixed m) {...}

对于任务,我仅限于iostream和iomanip库。我的计划是从流中读取值,并将它们分配给临时int变量(w,n,d),然后我将使用Mixed构造函数来创建对象m。不幸的是,我想不出分离分子和分母的方法。它们都是int,但它们之间有一个char(/)。

  • 我不能将getline()与其分隔符一起使用,因为它将数据分配给一个char数组,我认为如果没有其他库,我无法将其转换为int
  • 出于同样的原因,我不能使用char数组然后对其进行分段
  • 我不能将while循环与get()和peek()一起使用,因为我认为我无法将char数组转换为int
  • 我不能使用字符串或c字符串然后对其进行分段,因为这需要外部库

再次,我需要将像"22/34"这样的值拆分为22和34,只使用iostream和iomanip。有没有什么明显的方法我忽略了?有没有一种方法可以使用指针进行隐式转换?

您可以首先提取主格,然后提取分隔符,然后提取分母。

示例:

istream& operator>> (istream &in, Mixed &m) {
    int num, denom;
    char separ;
    in >> num;
    in.get(separ);
    if (separ != '/')
      in.setstate(ios::failbit);
    in >> denom;
    if (in) {
      // All extraction worked
      m.numerator = num;
      m.denominator = denom;
    }
    return in;
}

再次,我需要将类似"22/34"的值拆分为22和34,使用只有iostream和iomanip。

你不能只读取第一个整数,用get得到下一个字符,然后读取第二个整数吗?类似这样的东西:

#include <iostream>
int main() {
    using std::cin;
    using std::cout;
    int num;
    int den;
    while(cin) {
        cin >> num;
        if (cin.get() != '/') {
            // handle error
        }   
        cin >> den;
        cout << num << "/" << den << std::endl;
    }   
    return 0;
}

然后,您可以确保在两个整数之间读取的字符是'/',如果不是,则进行适当处理。