我有一個非常特殊的問題,我正在嘗試解決。我有一個包含產品信息的結構數組。每個結構都有以下信息。通過一系列結構進行交互
供應 類型產品名稱 批發價格 批發 零售價 零售產品數量的數量
我的結構的數組是完全的,而且是非常愉快。現在,讓我們說,有一對夫婦的電源種類,如:
肉類 乳業 水果等......
我將如何通過結構的陣列迭代並打印出根據價值信息供應型。我需要一個通用的解決方案。當然,可能有很多產品類型。
此時任何事情都會有幫助。我很困惑如何做到這一點,如果有人能幫助我,我將不勝感激。我只是沒有看到如何做到這一點,或者我錯過了一些東西。
//////////////////////////////////// EDITED ///////// //////////////////////////////////////// 嗯,我改變了我的策略了一下我差不多完成了所有工作,只有一個小故障,我找不到。這可能很容易讓我忽略。這是我更新的代碼。如果文件中的供應類型已經存在於ptr中,只需更新數值即可,如果不創建記錄並將其添加到ptr。在我的文件我有這樣的:
肉類沙朗3.55 15 7.30 8 肉雞2.51 9 5.44 5 肉類培根3.30 23 4.38 10 水果蘋果0.50 1.11 40 20 水果Bananna 0.39 25 0.85 16 乳業牛奶1.00 25 2.25 15 乳牛奶1.00 25 2.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);
}
嘿約翰,我編輯了我的代碼,並考慮了我的策略。這個想法是隻添加一個新記錄,如果它不在ptr中。如果它只是更新其數值。我幾乎在那裏,但我不知道這最後一件事。如果一雙新鮮的眼睛能夠看到這一點,我會非常感激。我已經呆了好幾個小時了,找不到最後一個bug。 – Tastybrownies
我想我可能已經得到了它。我將變量alreadySupply = false更改爲初始化,在檢查for循環中放置alreadySupply = true並刪除其他部分。因此,如果它與列表中已有的供應類型相匹配,那麼一旦它獲得了位置,就會打破循環。他們的KEY修復可能已經在while循環的底部重新初始化alreadySupply回到了false! – Tastybrownies