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 の曜日のみを印刷したい場合、月曜日を印刷するだけで、金曜日も印刷しません。私はどこで間違っていますか?コントローラーの FilterSum 関数で、c? を返します。私はすべてを試しましたが、まったく機能しませんでした...多分あなたは私を助けることができます! :)

4

3 に答える 3

2

PrintCostを介して有効なコストの1つを取得した後、関数を1回だけ実行しているため、1つだけを出力していますFilterSumFilterCostsBySum関数をループさせ、コストを にプッシュする必要がありますDynamicVector

DynamicVector必要な条件を満たすすべてのコストを含むを返す関数を作成します。FilterSumこれを行うには、関数を変更して、 one を返す代わりにCost、特定の条件を満たすコストを a に追加してDynamicVector返します。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 に答える