1

我是一个初学者,在通过 Stroustrup 的原则和实践工作时被困在这样一个简单的问题上。

仅使用基本元素

#include "std_lib_facilities.h"

int main()
{

double highest = 0;
double lowest = 100;
int i=0;
double sum = 0;
vector <double> inputlist;
double input;
string unit;

cout<<"Type in a number followed by it's unit \n";

while(cin>>input>>unit){

    inputlist.push_back(input);
    sum += inputlist[i];

    if (input >= lowest && input <= highest){
        cout<<input<<" \n";
        ++i;
    }

    else if (input < lowest){
        lowest = input;
        cout<<"\nLowest Number so far \n"<<lowest;
    ++i;
    }

    else if (input > highest){
        highest = input;
    cout<<"\nHighest number so far \n"<< highest;
    ++i;
    }

    else
        cout<<"Lowest is: \n"<<lowest<<"\n\n Highest is: \n"<<highest<<" \n\n and the total is: \n"<<sum;


    if (unit == "ft", "m", "in","cm")
        cout<<unit<<"\n";

    else
        cout<<"cannot recognize unit";
}

keep_window_open();
return 0;
}

当字符“|”时,我需要程序向用户显示总和以及最高和最低值 被输入。问题是:我需要在应该输入整数值的地方输入这个。

注意:我对转换了解不多,但尝试了一些,但没有成功。

4

3 回答 3

3

如果我理解正确,您想从 阅读intstd::cin但是:

int i;
if (std::cin >> i) {
    ...

不适合您的需求,因为可能有'|'标志作为终止阅读的信号。

以下是您可以执行的操作:逐字读取输入 ( std::string) 并使用temporary 分别解析这些单词std::istringstream

std::string word;
if (std::cin >> word) {
    if (word == "|")
        ...
    // else:
    std::istringstream is(word);
    int i;
    if (is >> i) {
        // integer successfully retrieved from stream
    }
}

只是#include <sstream>

于 2013-09-25T11:48:30.027 回答
0

用字符串读取值。如果不匹配 | 使用以下函数将其转换为双精度:

double toDouble(string s)
{
   int sign = 1, i=0;
   if (s[0]=='-')
      sign = -1, i=1;

   double result = 0, result2 = 0;
   for (; i < s.size(); i++)
     if (s[i] == '.')
       break;
     else
       result = result * 10 + (s[i] - '0');

   for (i = s.size()-1 ; i>=0 ; i--)
     if (s[i] == '.')
        break;
     else
        result2 = result2 / 10 + (s[i] - '0');

   if (i>=0)
      result += result2/10;
   return result * sign;
}
于 2013-09-25T11:55:02.183 回答
0

用英寸求和米没有多大意义。因此,您应该考虑将单位转换为比例因子。您可以使用地图来获取比例因子。即使这有点过头,您也可以使用正则表达式来解析用户输入。如果正则表达式不匹配,您可以测试“|”之类的内容。在新的 c++ 标准 ( http://en.wikipedia.org/wiki/C%2B%2B11 ) 中,为此目的定义了一个正则表达式库。可惜的是,g++ 正则表达式库有问题。但是您可以使用 boost ( http://www.boost.org/doc/libs/1_54_0/libs/regex/doc/html/boost_regex/ )。这是一个例子:

#include <iostream>
#include <vector>
#include <map>
#include <boost/regex.hpp> //< Pittyingly std::regex is buggy.

using namespace std; ///< Avoid this in larger projects!
using namespace boost;

int main() {

const string strReFloat("([-+]?[[:digit:]]*\\.?[[:digit:]]+(?:[eE][-+]?[[:digit:]]+)?)");
const string strReUnit("([[:alpha:]]+)");
const string strReMaybeBlanks("[[:blank:]]*");
const string strReFloatWithUnit(strReMaybeBlanks+strReFloat+strReMaybeBlanks+strReUnit+strReMaybeBlanks);
const regex reFloatWithUnit(strReFloatWithUnit);

const map<const string,double> unitVal= {
    {"m", 1.0},
    {"in", 0.0254},
    {"ft", 0.3048},
    {"cm", 0.01}
};

double highest = 0;
double lowest = 100;
int i=0;
double sum = 0;
vector <double> inputlist;
double input;
double unitToMeter;
string unit;
string str;

while( (cout<<"\nType in a number followed by it's unit \n", getline(cin,str), str != "") ){

    smatch parts;

    if( regex_match(str,parts,reFloatWithUnit) ) {
        unit = parts[2].str();

        auto found = unitVal.find(unit);
        if( found != unitVal.end() ) {
            cout<<unit<<"\n";
            input = found->second * atof(parts[1].str().c_str());
        } else {
            cout << "Unit \"" << unit << "\" not recognized. Using meters.\n";
        }

        inputlist.push_back(input);
    sum += inputlist[i];

    if (input >= lowest && input <= highest){
        cout<<input<<" \n";
        ++i;
    }
    else if (input < lowest){
        lowest = input;
        cout<<"\nLowest Number so far \n"<<lowest;
    ++i;
    }

    else if (input > highest){
        highest = input;
                cout<<"\nHighest number so far \n"<< highest;
                ++i;
    }

    } else if( str == "|" ) {
        cout << "sum:" << sum << "\n";
    } else {
        cout << "Input not recognized.\n";
    }
}

return 0;
}
于 2013-09-25T14:23:45.720 回答