问题简单如下:
实现回调函数void data_cb(int raw)。每次data_cb(n)由分析器调用(在本例中为我们的测试模块),您必须根据n的值更新模块的内部状态。 您无法使用数组。相反,我们有一些模块变量来跟踪统计信息。
这就是我所做的:
// data_cb(n) updates the internal state based on the value of n
void data_cb(int n)
{
a= n;}
// total_data_points() returns the number of integers processed so far
int total_data_points(void){
count++;
return count;}
// negative_sum() returns the sum of the negative integers processed so far
// NOTE: you do not have to worry about overflow
int negative_sum(void){
if (a<=0)
{
neg_sum = neg_sum+a;
return neg_sum;
}
else
{
return neg_sum;
}}
// positive_sum() returns the sum of the positive integers processed so far
// NOTE: you do not have to worry about overflow
int positive_sum(void){
if (a>=0)
{
pos_sum = pos_sum+a;
return pos_sum;
}
else
{
return pos_sum;}}
total_data_points()返回已处理的整数,但它没有给我们想要的东西。请考虑以下示例:
假设已使用以下值调用data_cb(n):2 5 7 4 1 -3 -6 -5 -3 1 3 5
assert (total_data_points() == 12);
assert (negative_sum() == -17);
assert (positive_sum() == 28);
assert (data_max() == 7);
assert (data_min() == -6);
assert (data_spread() == 4);
答案 0 :(得分:1)
问题是,当您调用total_data_points()
,negative_sum()
等功能时,您剩下的唯一数据是data_cb(5)
的最近一次调用。内部状态只是保持a = 5
。
相反,您需要更新某些内容以在接收数据时跟踪统计信息 。我认为练习中“你不能使用数组”的规定是确保你将数据作为流处理而不是仅仅保留在内存中的所有数据。因此,您需要执行以下操作:
void data_cb(int n)
{
dataPointsSeen++;
if (n > 0) {positiveSum += n;}
if (n < 0) {negativeSum += n;}
//...
}
然后根据要求返回这些事情:
int total_data_points()
{
return dataPointsSeen;
}