自定义过滤器功能不会产生预期的输出

时间:2013-03-19 18:10:27

标签: c filter

我正在尝试制作一个过滤器,只在屏幕上打印我想要的数据。这就是我所说的:

Cost* FilterSum(Controller* ctrl, int n)
{
    int i;
    DynamicVector* CostList=getAll(ctrl->repo);
    for(i=0;i<getLen(CostList);i++)
    {
        Cost* c=getElementAtPosition(CostList,i); //returns the element on one position
        if((c->sum)<n)
        {
            return c; //if the element(Cost in my case) has the sum<20 return it
        }
    }


return 0;
}

因此,我将动态数组与成本作为元素。如果成本之和小于n(n是从键盘给出的),我想在屏幕上仅打印那些成本。 :) 这是控制台中的打印功能:

void PrintCost(Cost* c) //this function prints one cost
{
    printf("\nID: %d\n", getID(c));
    printf("Day: %s\n", getDay(c));
    printf("Type: %s\n", getType(c));
    printf("Sum: %d\n\n", getSum(c));
}

void PrintCosts(Console* console) //this one prints all the costs in the list
{
    DynamicVector* CostList=getAllCosts(console->ctrl);
    if (getLen(CostList))
    {
        int i;
        for(i=0;i<getLen(CostList);i++)
        {
            Cost *c=(Cost*)getElementAtPosition(CostList,i);
            PrintCost(c);
        }

    }
    else printf("No cost in the list!");
}

这是控制台中控制器的调用函数:

void FilterCostsBySum(Console* console)
{
    int n;
    printf("See the costs that have the sum less than: ");
    scanf("%d",&n);
    Cost* c = FilterSum(console->ctrl,n);
    PrintCost(c);
}

现在,问题来了。如果我有星期一,总和= 10,星期五,总和= 20,星期六,总和= 40,我想打印那些总和<30的日子,它只打印星期一,那就是它,它也不打印星期五。我哪里做错了?在控制器的FilterSum函数中我返回c?我尝试了一切,但根本没用......也许你可以帮助我! :)

3 个答案:

答案 0 :(得分:2)

它只打印一个,因为您只需通过PrintCost获得一个有效费用后执行FilterSum功能一次。您需要将FilterCostsBySum功能循环和打印成本推送到DynamicVector

编写一个返回DynamicVector的函数,其中包含满足您所需条件的所有成本。您可以通过更改FilterSum函数来执行此操作,这样就不会返回一个Cost,而是将满足给定条件的任何成本添加到DynamicVector并返回它。之后重命名函数GetFilteredCosts

最后,在FilterCostsBySum函数中,您将遍历返回的DynamicVector中的元素并打印成本。

答案 1 :(得分:1)

if((c->sum)<n)
    {
        return c; //if the element(Cost in my case) has the sum<20 return it
    }

return语句会中断循环并退出FilterSum函数,因此函数只返回与条件匹配的第一个Cost。您应该更改它以返回Const**,指向Const *列表的指针。

答案 2 :(得分:0)

if((c->sum)<n)
{
  return c; //if the element(Cost in my case) has the sum<20 return it
}

这将立即返回10。 而不是立即返回,将10添加到列表中。 然后,当您获得20时,将其添加到列表中。一旦forS循环在FilterSum()中完成,那么 你可以退回这个清单。