我正在尝试制作一个过滤器,只在屏幕上打印我想要的数据。这就是我所说的:
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?我尝试了一切,但根本没用......也许你可以帮助我! :)
答案 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()中完成,那么 你可以退回这个清单。