1

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

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

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

例如: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。不幸的是,我想不出一种方法来分离分子和分母。它们都是整数,但它们之间有一个字符 (/)。

  • 我不能将 getline() 与它的分隔符一起使用,因为它将数据分配给一个 char 数组,我不相信我可以在没有另一个库的情况下将其转换为 int。
  • 出于同样的原因,我不能使用 char 数组然后对其进行分段。
  • 我不能在 get() 和 peek() 中使用 while 循环,因为我认为我不能将 char 数组转换为 int。
  • 我不能使用字符串或 c 字符串然后对其进行分段,因为这需要外部库。

再一次,我需要只使用 iostream 和 iomanip 将像“22/34”这样的值拆分为 22 和 34。我忽略了一些相当明显的方法吗?有没有办法使用指针隐式转换?

4

2 回答 2

2

您可以先提取提名者,然后是分隔字符,然后是分母。

举例说明:

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;
}
于 2012-08-20T18:36:55.933 回答
0

再一次,我需要只使用 iostream 和 iomanip 将像“22/34”这样的值拆分为 22 和 34。

难道你不能只读取第一个整数,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;
}

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

于 2012-08-20T18:40:01.357 回答