使用其他数组中相同索引位置的范围中的对应值对数组值进行计数

时间:2018-11-26 17:58:04

标签: c++

在c ++程序中,我有2个C数组作为c ++和c程序之间接口的一部分,不能使用c ++向量。

还有一些大小范围的起始点:

int start = 2;
int end = 4;
int range_size = end-start;

此处范围将包含值2,3。

我需要计算范围中的值出现在JA中的频率,以及JB中相同索引位置的值落入相同数字范围的频率(但可以是该范围中的任何值)。我需要在另一个数组中计数。

以上示例的预期结果将是:

int result [range_size] = {2,2},即在JA中2出现2x,而在JB中值为2或3,在JB中相同索引位置的值也出现2x或3。

int JA = {0,3,0,1,3,0,2,3,4,2,3,4};
            x     x   | |   | |
int JB = {0,0,1,1,1,2,2,2,2,3,3,4};

x =超出JB的范围,| =在JB范围内,因此后者应计算在内。

我尝试了以下操作,但是它不起作用,检查它是否在JB范围内似乎导致了问题:

#include <stdio.h>
#include <iostream>

int main()
{

int start = 2;
int end = 4;
int range_size;
int JA[12] = {0,3,0,1,3,0,2,3,4,2,3,4};
int JB[12] = {0,0,1,1,1,2,2,2,2,3,3,4};

range_size = end-start;
int result[range_size];


    int x = 0;
    for (x=start; x<end; ++x) {
        for (int a=0; a<12; ++a) {
            int y = JA[a];

            if (x=y) {
            int z = JB[a];

            if (z>=start && z<end) {
               result[x]++;
               printf("result[x] %i.\n", result[x]);
               }
            }
        }
    }

return 0;
}

有人可以发现错误吗?

实际上,JA和JB包含数千个甚至数百万个int值,并且范围也很大,也许还有另一种方法?

最后,此版本有效:

int main()
{

int start = 2;
int end = 4;
int range_size;
int JA[12] = {0,3,0,1,3,0,2,3,4,2,3,4};
int JB[12] = {0,0,1,1,1,2,2,2,2,3,3,4};

range_size = end-start;
int result[2] = {0,0};

    int x = 0;
    int k;
    for (x=start; x<end; ++x) {
        for (int a=0; a<12; ++a) {
            int y = JA[a];

            if (x==y) {
            int z = JB[a];

            if (z>=start && z<end) {
               k = x-start;
               result[k]++;
    std::cout << "x = " << x << "\n";
    std::cout << "k = " << k << "\n";
               }
            }
        }
    }
    std::cout << "result = " << result[0] << "\n";
    std::cout << "result = " << result[1] << "\n";
    return 0;
}

1 个答案:

答案 0 :(得分:0)

可以通过编写一个测试数字是否在范围内的函数来简化程序。
另一个简化是使外部循环与数组的索引相对应。

#include <stdio.h>
#include <iostream>
#include <vector>

bool in_range (int start, int end, int val){
    return (val >= start) && (val < end);
}

int main() {

    int start = 2;
    int end = 4;
    int range_size = end - start;
    int JA[12] = {0,3,0,1,3,0,2,3,4,2,3,4};
    int JB[12] = {0,0,1,1,1,2,2,2,2,3,3,4};

    std::vector<int> result (range_size, 0);
    for (int i = 0; i < 12; i++) {
        bool test = in_range (start, end, JA[i]) && in_range (start, end, JB[i]);
        if (test) result[JA[i]-start]++;
    }

    for (int val = start; val < end; ++val) {
        std::cout << val << " : " << result[val - start] << "\n";
    }
    return 0;
}