0

解決しようとしている非常に具体的な問題があります。製品情報を含む構造体の配列があります。各構造体には次の情報があります。

供給タイプ製品名卸売価格卸売小売価格小売製品数量

私の構造体の配列は完全であり、それは問題なくダンディです。ここで、次のようないくつかの供給タイプがあるとしましょう。

肉乳製品など...

構造体の配列を反復処理し、供給タイプに応じて値情報を出力するにはどうすればよいですか。そして、私は一般的な解決策を必要としています。もちろん、多くの製品タイプがあるかもしれません。

この時点で何でも役に立ちます。私はこれを行う方法について混乱しており、誰かが私を助けてくれるならそれを大いに感謝します。これを行う方法がわからないか、何かが足りません。

編集 済みさて、私は戦略を少し変更しました。ほぼ完了し、すべてが機能しています。見つけられない小さな不具合が1つだけあります。私が見落としているのはおそらくかなり簡単なことです。これが私の更新されたコードです。ファイルからの供給タイプがすでにptrにある場合は、数値を更新するだけです。そうでない場合は、レコードを作成してptrに追加します。私のファイルにはこれがあります:

ミートサーロイン3.55157.308ミートチキン2.5195.445ミートベーコン3.30234.3810フルーツアップル.50401.1120フルーツバナンナ.3925.8516デイリーミルク1.00252.2515デイリーミルク1.00252.25 15

肉のカテゴリーでは正確に合計されますが、それ以降はそうではありません。これは、supTypeがすでに存在するかどうかを確認するループとどういうわけか関係があると私は考え続けています。

これが私の完全なコードです。

void calculateDisplay(pointerDynam, sizeA);
void cleanUp();

typedef struct
{
    char supType[15];
    char prodName[15];
    double wholePrice;
    int quantWhole;
    double retPrice;
    int retProdQuantity;
} PRODUCT;

FILE *fr;
int main()
{
    char supplyName[15];
    char productName[15];
    double wholeP = 0;
    int  quantityWhole = 0;
    double retailPrice = 0;
    int retailProductQuant = 0;

    //keep track of supply types.

    PRODUCT *ptr;

    ptr = malloc(sizeof(PRODUCT));

    PRODUCT *temp;

    //int num =0;
    int i = 1;
    int num = 0;
    int a;
    int countTrack = 0;
    bool alreadySupply = true;
    int needsChanged = 0;

    fr = fopen("ttt.txt", "r");

    while(fscanf(fr, "%s %s %lf %d %lf %d", supplyName, productName, &wholeP, &quantityWhole, &retailPrice, &retailProductQuant)==6)
    {
        if(num != 0)
        {
            for(a=0; a < num; a++)
            {
                if(strcmp(ptr[a].supType, supplyName) == 0)
                {
                    needsChanged = a;
                }
                else
                {
                    alreadySupply = false;
                }
            }
        }

        if(num == 0 || alreadySupply == false)
        {
            PRODUCT record;
            strcpy(record.supType, supplyName);
            strcpy(record.prodName, productName);
            record.wholePrice = wholeP;
            record.quantWhole = quantityWhole;
            record.retPrice = retailPrice;
            record.retProdQuantity = retailProductQuant;

            ptr[num] = record;
            countTrack++;
            num++;
            i++;
            temp = realloc(ptr, i*sizeof(PRODUCT));
            ptr = temp;
        }
        else
        {
            ptr[needsChanged].quantWhole += quantityWhole;
            ptr[needsChanged].retPrice += retailPrice;
            ptr[needsChanged].retProdQuantity += retailProductQuant;
            ptr[needsChanged].wholePrice += wholeP;
        }
    }

    calculateDisplay(ptr, num);
    cleanUp();

    return 0;
}



void calculateDisplay(PRODUCT *pointerDynam, int sizeA)
{
    int j;
    double totownerCost = 0;
    double totcustCost = 0;
    double totprofit = 0;

    double supownerCost = 0;
    double supcustCost = 0;
    double suprofit = 0;

    for(j=0; j<sizeA; j++)
    {
        supownerCost = pointerDynam[j].wholePrice;
        supcustCost = pointerDynam[j].retPrice;
        suprofit = pointerDynam[j].retPrice - pointerDynam[j].wholePrice;

        printf("Supply Type: %s\n Wholesale Price: %.2f\n Retail Price: %.2f\n Profit: %.2f\n\n\n",
                 pointerDynam[j].supType, supownerCost, supcustCost, suprofit);
        totownerCost += pointerDynam[j].wholePrice;
        totcustCost += pointerDynam[j].retPrice;
        totprofit += pointerDynam[j].retPrice - pointerDynam[j].wholePrice;
    }

    printf("Wholesale Cost is: %.2f\n Retail is: %.2f\n Profit made was: %.2f\n\n", totownerCost, totcustCost, totprofit);
}

void cleanUp()
{
    fclose(fr);
}
4

3 に答える 3

2

商品タイプを受け入れ、配列をループし、現在のアイテムの商品タイプが渡されたものと一致する場合にのみ出力する関数を作成します。

  void printProductInfo(char* productType, PRODUCT* products)
  {
        for (int i = 0; i < productsLength; i++)
        {
              if (strcmp(productType, products[i]->supType)
                  // call print method
        }
  }
于 2013-02-01T20:03:22.473 に答える
2

供給タイプを3番目のパラメーターとしてcalculateDisplay関数に渡すことができます。

 void calculateDisplay(PRODUCT *pointerDynam, int sizeA, const char *supplyType)
 {
    ...
    double typeCost = 0;
    double typeCust = 0;
    double typeProfit = 0;
    ...
    if(strcmp(pointerDynam[j].supType, supplyType)==0)
        {
            typeCost += pointerDynam[j].wholePrice;
            typeCust +=  pointerDynam[j].retPrice;
            typeProfit += pointerDynam[j].retPrice - pointerDynam[j].wholePrice;
        }
        ...

   printf("%s wholesale: %.2f\n %s retail %.2f\n %s profit: %.2f\n\n\n", 
      supplyType, typeCost, supplyType, meatCust, supplyType, typeProfit);

明らかに、一度に複数のタイプを分類したい場合は、これを再考する必要がありますが、個々のタイプについては、かなりうまくいくはずです。

注:宿題の割り当てには大したことではありませんが、実際の本番ソフトウェアでの通貨計算に浮動小数点型を使用することは実際には望ましくありません。丸め誤差は最終的に合計されます。整数型を使用し、追跡する必要のある最小単位に合わせてスケーリングする必要があります(たとえば、1.25ドルではなく125セント、125.9セントではなく1259セントなど)。これにより、表現できる値の範囲が制限されます(符号付き32ビット整数型の場合、セントで格納する場合は約+/- $ 2140万、セントで格納する場合は$ 214万など)が、すべての算術が正確になるという利点。より大きな値を格納する必要がある場合は、任意精度のライブラリを調べる必要があります。

于 2013-02-01T21:08:24.120 に答える
1

供給タイプの数が有限である場合、次のようにすることができます。3つの供給タイプがあるとしましょう。

const int NUM_SUPPLY_TYPES = 3;

供給タイプの情報を保持する構造体を定義します

struct SupplyTypeInfo
{
    double ownerCost;
    double custCost;
    double profitMargin;
};

これで、整数から情報および文字列表現へのマッピングを定義できます。

SupplyTypeInfo supplyTypeInfo[NUM_SUPPLY_TYPES];
char *supplyTypeName[] = { "Meat", "Fruit", "Dairy" }

次に、ループで次のことができます

for (int stNum = 0; stNum < NUM_SUPPLY_TYPES; ++stNum)
{
    if(strcmp(pointerDynam[j].supType, supplyTypeName[stNum])==0)
    {
        supplyTypeInfo[stNum].ownerCost += pointerDynam[j].wholePrice;
        supplyTypeInfo[stNum].custCost +=  pointerDynam[j].retPrice;
        supplyTypeInfo[stNum].profitMargin += pointerDynam[j].retPrice - pointerDynam[j].wholePrice;
    }
}

供給タイプの数が事前にわからない場合は、ハッシュテーブルのような動的データ構造が必要です。

于 2013-02-01T20:17:47.953 に答える