0

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

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);
}

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

4

3 回答 3

2

它只打印一个,因为您在PrintCost通过FilterSum. 您需要将FilterCostsBySum函数循环和打印成本推送到DynamicVector.

编写一个返回 a 的函数,其中DynamicVector包含满足您想要的条件的所有成本。您可以通过更改FilterSum函数来做到这一点,而不是返回 one Cost,而是将满足给定条件的任何成本添加到 aDynamicVector并返回它。之后重命名函数GetFilteredCosts

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

于 2013-03-19T18:16:52.257 回答
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 *

于 2013-03-19T18:14:32.563 回答
0
if((c->sum)<n)
{
  return c; //if the element(Cost in my case) has the sum<20 return it
}

这将立即只返回 10。而不是立即返回,将 10 添加到列表中。然后当您获得 20 时,将其添加到列表中。一旦 FilterSum() 中的 for 循环完成,您就可以返回此列表。

于 2013-03-19T18:17:10.520 回答