在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;
}
答案 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;
}