0

文字列のベクトルを変換して代入ステートメントの右辺値にする効率的な方法は考えられません。たとえば、「5」、「*」、「3」の 3 つの要素を持つベクトルがあるので、必要なのは基本的に次の代入ステートメントと同等の代入ステートメントです。

int myInteger = 5 * 3;

前もって感謝します;

4

2 に答える 2

1

変数の順序を知っているか、変数の順序と演算子の順序を決定できると思います。また、ベクトルを使用しているので、複数の変数が存在する可能性があると思います(ポイントではありません:))。

その場合、変数をキャストし、演算子を正しい順序で適用するロジックを作成する必要があります(言語の演算子の優先順位で指定されているとおり)。

Javascriptを使用していると仮定します(ここで優先順位を参照してください)。簡単にするために、乗算、除算、加算、および減算の演算子のみを扱います。

<script>
var foo = 5*4+16/2-3*2; //should be 22
var bar = ["5","*","4","+","16","/","2","-","3","*","2"];
var done = parseVec(bar); //should calculate to 22

//there are no vectors in javascript, so we'll go with an array to demonstrate
//all parsing assumes that values in the array are in decimal, not octal or hex
function parseVec (array) {
  var result, i, h, j, action;
  var newarray = [];
  
  //decision based on order of operations...all multiplication will happen 
  //first, then division, then addition, etc...
  if (array.indexOf("*") > 0 && array.indexOf("*") < (array.length-1)) {
    i = array.indexOf("*");
    action = "*";
  } else if (array.indexOf("/") > 0 && array.indexOf("*/") < (array.length-1)) {
    i = array.indexOf("/");
    action = "/";
  } else if (array.indexOf("+") > 0 && array.indexOf("+") < (array.length-1)) {
    i = array.indexOf("+");
    action = "+";
  } else if (array.indexOf("-") > 0 && array.indexOf("-") < (array.length-1)) {
    i = array.indexOf("-");
    action = "-";
  } else
    return useParseFloat(array[0]) ? parseFloat(array[0], 10) : parseInt(array[0], 10);
  
  //operate on the value preceding and following array[i]...
  h = useParseFloat(array[i-1]) ? parseFloat(array[i-1], 10) : parseInt(array[i-1], 10);
  j = useParseFloat(array[i+1]) ? parseFloat(array[i+1], 10) : parseInt(array[i+1], 10);
  switch (action)
  {
    case "*":
        result = h * j;
        break;
    case "/":
        result = h / j;
        break;
    case "+":
        result = h + j;
        break;
    case "-":
        result = h - j;
        break;
  }
  
  //recreate the array for recursion
  for(var i2 = 0; i2 < array.length; i2++)
  {
    if (i2 == i)
      newarray.push(result.toString());
    else if (i2 != (i-1) && i2 != (i+1))
      newarray.push(array[i2]);
  }
  return parseVec(newarray);
}

//should I parse this as an int or float?
function useParseFloat(val) {
  return (val.indexOf(".") >= 0 && val.indexOf(".") < (val.length-1)) ? true : false;
}
</script>

このコードはJSBinで実行できます。

これにより、特定のタスクを実行する方法についての公正なアイデアが得られるはずです。少し遊びといじくり回すだけで、ほとんどの演算子と括弧のサポートを含めることができます。

于 2012-09-28T19:19:20.053 に答える
0

要素ごとに解析する必要があります。ベクトルに 3 つの要素 (文字列) があることがわかっていると仮定して、次のようにします。

vector<string> v = {"5","*", "3"};
int x, y;
char c;
stringstream(a);
string T = v[0]+v[1]+v[2];
a << T;
a >> x >> c >> y;

そして今、あなたはcでどのような操作が行われているかを確認して実行する必要があります.

于 2012-09-28T17:39:48.037 に答える