1

私は初心者で、Stroustrup の Principles and Practices に取り組んでいるときに、このような単純な問題に行き詰まっています。

基本的な要素のみを使用する

#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

0

値を文字列で読み取ります。一致しない場合 | 次の関数を使用して double に変換します。

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++ 正規表現ライブラリにはバグがあります。ただし、ブースト ( 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 に答える