2013-02-01 55 views
0

我有一個非常特殊的問題,我正在嘗試解決。我有一個包含產品信息的結構數組。每個結構都有以下信息。通過一系列結構進行交互

供應 類型產品名稱 批發價格 批發 零售價 零售產品數量的數量

我的結構的數組是完全的,而且是非常愉快。現在,讓我們說,有一對夫婦的電源種類,如:

肉類 乳業 水果等......

我將如何通過結構的陣列迭代並打印出根據價值信息供應型。我需要一個通用的解決方案。當然,可能有很多產品類型。

此時任何事情都會有幫助。我很困惑如何做到這一點,如果有人能幫助我,我將不勝感激。我只是沒有看到如何做到這一點,或者我錯過了一些東西。

//////////////////////////////////// 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); 

} 

回答

1

你可以供應類型作爲第三個參數傳遞給您的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); 

很顯然,如果你想一次打破多種類型,你將不得不重新考慮這一點,但對於個人它應該工作得很好。

注意:雖然這對家庭作業並不是什麼大事,但您真的真的不想在實際生產軟件中使用浮點類型進行貨幣計算;舍入誤差最終會加起來。您需要使用整數類型,並且只需對需要跟蹤的最小單位進行縮放(例如,存儲125美分而不是1.25美元,或者1259美分而不是125.9美分等)。這確實限制了您可以表示的值的範圍(對於一個有符號的32位整數類型,如果您以美分爲單位存儲大約+/- 21.4百萬美元,如果以十分之一美分存儲則爲214萬美元等),但它具有所有算術都是精確的。如果您需要存儲更大的值,則需要查看一些任意精度庫。

+0

嘿約翰,我編輯了我的代碼,並考慮了我的策略。這個想法是隻添加一個新記錄,如果它不在ptr中。如果它只是更新其數值。我幾乎在那裏,但我不知道這最後一件事。如果一雙新鮮的眼睛能夠看到這一點,我會非常感激。我已經呆了好幾個小時了,找不到最後一個bug。 – Tastybrownies

+0

我想我可能已經得到了它。我將變量alreadySupply = false更改爲初始化,在檢查for循環中放置alreadySupply = true並刪除其他部分。因此,如果它與列表中已有的供應類型相匹配,那麼一旦它獲得了位置,就會打破循環。他們的KEY修復可能已經在while循環的底部重新初始化alreadySupply回到了false! – Tastybrownies

2

請它接受一個產品類型,循環陣列上方和功能僅打印如果傳遞給它的當前的項目的產品類型匹配。

void printProductInfo(char* productType, PRODUCT* products) 
    { 
     for (int i = 0; i < productsLength; i++) 
     { 
       if (strcmp(productType, products[i]->supType) 
        // call print method 
     } 
    } 
1

如果供應類型的數量是有限的,您可以執行以下操作。假設您有三種供應類型。

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; 
    } 
} 

如果事先未知供應類型的數量,則需要動態數據結構(如哈希表)。

+0

非常感謝您的回答。我一直想知道是否有辦法做到這一點,你有一個單獨的數組稱爲supp類型,當從文件中讀取事物時檢查supp類型。如果它已經在數組中,不要添加它,如果沒有添加它。當然,這可能需要realloc .... – Tastybrownies

+0

@Tastybrownies如果事先不知道可能的supp類型,我會簡單地將一個suppType字段添加到info結構中,而不是具有單獨的suppTypeName數組。然後,對於每個產品,您都會檢查是否已經有相同supp類型的信息。如果是的話加上,否則分配一個新的。當然,信息數組每次都需要重新分配。只要supp類型的數量很小(比方說<100),這不會是一個性能問題。對於更大的數字,您可以使用來自supp類型的地圖/散列表/字典來顯示信息。 –

+0

是的,我絕對明白你在說什麼。如果這是一家真正的雜貨店,你可能會知道所有的供應類型。但是,也許不是,誰知道。 – Tastybrownies

相關問題