0

次のコードを使用して、2 つのベクトル a と b の量の差をベクトル d に保存していますが、正しく機能していません。エラーの場所を教えてください。入力ファイルには次のようなテキストがあります: 10- ペア数

8 50   //value in a -space- value in b
74 59
31 73
45 79
24 10
41 66
93 43
88 4
28 30
41 13

コード:

long int x, i = 0, j = 0;
FILE *fp = fopen("jobs.txt", "r");
fscanf(fp, "%lu", &x);
long int c = x;
vector<long int> a;
vector<long int> b;
vector<long int> d;

while (fscanf(fp, "%lu", &x) != EOF)

{
    a.pb(x);
    i++;
    fscanf(fp, "%lu", &x);
    b.pb(x);
    j++;
}

int k = 0;

while (k < c)
{
    d.pb(a[k] - b[k]);
    k++;
}
4

3 に答える 3

1

問題は、fscanf で読み取った最初の値が実際には破棄されるという事実にあると思います。これは、fscanf への 2 回目の呼び出し (while 条件の値) によってすぐに上書きされるためです。このようにすると、最初の対の 2 番目の値を 2 番目の最初の値と比較して、おそらく間違った方法で値を読み取ることになります。3 行目の fscanf 呼び出しを削除するだけです。

于 2013-09-14T06:08:25.880 に答える
1

要素ごとのベクトル差分計算に関して、これを行う簡単な方法は、 などの標準ライブラリ アルゴリズムと などのstd::transform関数オブジェクトを使用することstd::minusです。この例では、2 つのベクトルの要素ごとの差を計算し、それを 3 番目のベクトルに格納します。

#include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>

int main()
{
  std::vector<int> a={10, 10, 10, 10, 10};
  std::vector<int> b={0, 1, 2, 3, 4};
  std::vector<int> c;

  std::transform(a.begin(),
                 a.end(),
                 b.begin(), 
                 std::back_inserter(c),
                 std::minus<int>());

  for (const auto& i : result)
    std::cout << i << " ";
  std::cout << std::endl;
}

数値のペアを 2 つのベクトルに読み取ることに関しては、 から読み取ることを検討できますstd::ifstream

#include <fstream>
#include <vector>

int main()
{
  std::ifstream fp("jobs.txt");

  int ia, ib;
  while (fp >> ia >> ib)
  {
    a.push_back(ia);
    b.push_back(ib);
  }
}
于 2013-09-14T07:21:19.147 に答える
0

問題は、scanf()呼び出しで空白を処理していないことだと思います。を使用して、値のペアを簡単に読み取ることができます

scanf("\n%lu %lu", &ia, &ib)

また

scanf("%lu %lu\n", &ia, &ib)

先頭または末尾の改行を使用するかどうかによって異なります。

于 2013-09-14T07:57:47.330 に答える