【问题标题】:Mixed number class istream issues混合数字类 istream 问题
【发布时间】:2012-08-16 02:21:22
【问题描述】:

我在夏天给自己布置了一些作业,我完成了 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。不幸的是,我想不出一种分离分子和分母的方法。它们都是整数,但它们之间有一个字符 (/)。

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

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

【问题讨论】:

  • 你会允许自己使用stringstreamstring吗?
  • 如果您查看<complex> 标头,有一个读取格式(22,34) 的示例。可以用作灵感!
  • @jrok:不,我只会使用 iostream 和 iomanip。我想到的一种解决方法是以某种方式读取流内容两次,例如复制流对象,或者在第一次读取后寻找开头。我可以通过使用字符串、对它们进行分段并转换为 int 来轻松地使程序工作。但同样,作业应该能够(因为它在说明中)仅使用 iostream 和 iomanip 完成。

标签: c++ operator-overloading iostream fractions iomanip


【解决方案1】:

你可以先提取分母,然后是分隔符,然后是分母。

举例说明:

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;
}

【讨论】:

  • 我的印象是,像 in >> num 这样的操作会读入整个字符块,只忽略空格,导致整个分数被转换为单个 int。
【解决方案2】:

再一次,我需要将“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;
}

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

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    相关资源
    最近更新 更多