3

たとえば、a次のようなデータを含むサイズ 10 の配列があります。

0.0
0.01
0.02
0.03
5.04
6.05
7.06
13.07
20.08
22.09

ステップ固定が 5 の場合、予想されるデータ範囲は次のとおりです。

start   end
0.0     0.03
5.04    7.06
13.07   13.07
20.08   22.09

C/C++ でこのように実装するための提案はありますか? プログラミング方法は?

4

5 に答える 5

1

単純なループでそれを行うことができます:

#include <stdio.h>

int main(void)
{
    float f, a[] = {0.0, 0.01, 0.02, 0.03, 5.04, 6.05, 7.06, 13.07, 20.08, 22.09};
    size_t i;

    #define N (sizeof a / sizeof a[0])

    for (f = a[0], i = 0; i <= N; i++) {
        if (i == N || a[i] > f + 5.0) {
            printf("%f %f\n", f, a[i - 1]);
            if (i != N) f = a[i];
        }
    }
    return 0;
}
于 2013-06-08T09:53:33.797 に答える
1
#include <iostream>
using namespace std;

int fun(double* arr, int n, double* res)
{
    int start = 0;
    int end   = 0;
    int len   = 0;
    for(int i = start; i < n; ++i)
    {
        if(arr[i]- arr[end] < 5)
        {
            end = i;
        }
        else
        {
            res[len++] = arr[start];
            res[len++] = arr[end];
            start = end = i;
        }
    }
    res[len++] = arr[start];
    res[len++] = arr[end];
    return len;
}

int main()
{
    double t[] = { 
        0.0,
        0.01,
        0.02,
        0.03,
        5.04,
        6.05,
        7.06,
        13.07,
        20.08,
        22.09
    };

    int n = sizeof(t) / sizeof(*t);
    double *res = new double[n];
    int k = fun(t, n, res);
    for(int j = 0; j < k; j += 2)
        cout<<res[j]<<"  "<<res[j+1]<<endl;
 }
于 2013-06-08T10:07:49.827 に答える
0

少し遅くなりましたが、ここでは C++ の非常にコンパクトな実装を示します。

template <typename T>
std::vector<std::pair<T, T>> generate_pairs(T *first, T *last)
{
    std::vector<std::pair<T, T>> result(std::distance(first, last) / 2);
    std::generate(std::begin(result), std::end(result), [&first] { return std::make_pair(*first++, *first++); });
    return result;
}

int main(int argc, char *argv[])
{
    double arr[] = { 0.0, 0.01, 0.02, 0.03, 5.04, 6.05, 7.06, 13.07, 20.08, 22.09 };

    auto v = generate_pairs(std::begin(arr), std::end(arr));
    for (const auto &p : v)
        std::cout << "(" << p.first << ", " << p.second << ")" << std::endl;

    return 0;
}
于 2013-06-08T14:46:31.050 に答える