解決しようとしている非常に具体的な問題があります。製品情報を含む構造体の配列があります。各構造体には次の情報があります。
供給タイプ製品名卸売価格卸売小売価格小売製品数量
私の構造体の配列は完全であり、それは問題なくダンディです。ここで、次のようないくつかの供給タイプがあるとしましょう。
肉乳製品など...
構造体の配列を反復処理し、供給タイプに応じて値情報を出力するにはどうすればよいですか。そして、私は一般的な解決策を必要としています。もちろん、多くの製品タイプがあるかもしれません。
この時点で何でも役に立ちます。私はこれを行う方法について混乱しており、誰かが私を助けてくれるならそれを大いに感謝します。これを行う方法がわからないか、何かが足りません。
編集 済みさて、私は戦略を少し変更しました。ほぼ完了し、すべてが機能しています。見つけられない小さな不具合が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);
}