1

我正在寻找清理我拥有的一些已经运行的代码。首先,这是一个赋值,并且赋值指定整数必须作为整数,双精度数作为双精度数等,否则我可能只是将输入作为双精度并强制转换为 int if(number%1==0)

我已将代码精简为仅处理输入(使用输出语句来验证它是否正常工作)。

int wholePart=0;
double decimalPart=0;
cout << "Input a number: ";
cin >> wholePart;
if(cin.peek() != '\n')
    cin >> decimalPart;

cout << "wholePart = " << wholePart << endl << "decimalPart = " << decimalPart << endl;

现在......这按原样工作,并且在我添加代码以处理组合整数和小数(如果小数部分不为 0)之后,我已经完成了超出分配要求的工作,但我正在学习,我想尽可能地清理这段代码。

我可以用其他输入验证来包装整个输入部分,以确保用户实际上输入的是数字而不是字符。但我在这里主要担心的是这if(cin.peek() != '\n')还不够好。也许if(cin.peek() == '.')是一个更好的选择,但我很好奇什么是完成我在这里想要完成的事情的最佳方式。有任何想法吗?

并且请不要将其拒绝为“哦,这是家庭作业”。我想强调的是,我的课程已经超出了作业的额外学分部分所要求的范围。我只是想更多地了解该语言以及处理此类输入的最佳方式可能是什么。

4

3 回答 3

2

我认为类似的东西也"1.0"应该被认为是双重的;这几乎消除了读取双精度数,然后检查它是否实际上是整数之类的事情。

唯一的方法是解析数据,看看你是否遇到了可以解释为的东西int。如果您要使用流的转换功能,这几乎意味着扫描输入两次。显而易见的解决方案是将输入放入字符串中;这些更容易多次扫描。如果你不允许这样做,你可以用它istream::tellg来记住位置,向前扫描,一旦你决定了,istream::seekg就回到你开始的地方。但我不知道你的导师有什么规定。

如果你不能寻找,你可以尝试手动破解它。先读一个int,然后看下一个字符。如果它是 a '.',那么您可以读取一个双精度数,这将为您提供小数部分,您可以将其添加到您已经读取的整数中。如果它是'E'or and 'e',它会变得有点困难;您可能必须提前,读取 int,然后pow手动使用。但这远非完美:如果双 "1.2E6"精度数具有 200000 作为“小数”部分;你需要一些方法来检测这个,并缩放你已经读过的整数。如果数字是".3",则在读取整数时会出现错误:您可以事先检查(但不要忘记"-.3"),或在执行任何其他操作之前重置错误。当然, double 的组成部分可能不适合 a int(甚至 a long long)。

总而言之,这对我来说似乎有点做作。在实践中,你会读入一个字符串,并匹配正则表达式来确定你想要如何解释它。

于 2013-09-25T16:54:10.680 回答
1

首先将整行作为字符串读取可能更容易,检查小数点,然后将该行输入到 stringstream,然后可以将其转换为 int 或 double(取决于小数点是否可用):

#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
  string line;
  int anInteger;
  double aDouble;

  getline( cin, line );
  stringstream ss( line );
  if ( line.find( '.' ) == string::npos ) {
    ss >> anInteger;
  } else {
    ss >> aDouble;
  }

  return 0;
}
于 2013-09-25T16:14:13.803 回答
0

鉴于您的规范,我会阅读 a std::string,看看它是否可能不是整数,并取决于结果解析为int或 as double。例如

int         integer;
double      number;
std::string value;
if (std::cin >> value) {
    if (value.find_first_of(".Ee")) {
        if (std::istringstream(value) >> number) {
            std::cout << "read double=" << number << '\n';
        }
        else {
            std::cout << "failed to read double from '" << value << "'\n";
        }
    }
    else {
        if (std::istringstream(value) >> integer) {
            std::cout << "read integer=" << integer << '\n';
        }
        else {
            std::cout << "failed to read integer from '" << value << "'\n";
        }
}
于 2013-09-25T16:15:58.503 回答