2013-07-29 55 views
0

我正在開發一個工資單程序,它接受用戶輸入(姓名,薪水和工作時間)並輸出這些詳細信息以及總額,稅額和淨額。將多個函數的數據存儲在一個數組中

我有單獨的輸入模塊,計算毛重,計算稅和計算淨值;但我不確定如何實現陣列存儲,以便它包含來自每個模塊的數據。

任何幫助,將不勝感激

*編輯:我需要能夠通過員工的數據(按字母順序)進行排序,以便我需要什麼(我相信)是陣列的記錄。 我有主模塊內初始化的記錄,想讀什麼樣的記錄:

lastName的[1],名[1] payrate [1]小時[1]總值(GDP)[1]稅[1]網[1]

lastName的[2],名字[2] payrate [2]小時[2]總值[2]稅[2]淨[2]

我不知道該怎麼將來自其他模塊的派生數據拉入該結構。

+0

你的意思是你想要一個數組來存儲用戶的名字,姓氏,工資率,工作時間,總工資等嗎?這不能在C中完成;一個數組的元素都必須是相同的類型,所以你不能像總毛錢那樣在同一個數組中存儲像名字這樣的字符串。您可以爲每個用戶創建一個結構並創建一個用戶結構的數組或鏈接列表。 – verbose

回答

4

您可以創建一個全局結構來保存該數據。

struct payroll_info 
{ 
    char *fname; 
    char *lname; 
    ... 
}; 

然後,您可以只是使這個結構數組和排序使用qsort()

0

你應該用結構來存儲所有關於用戶的DATAS。

是這樣的:

struct user 
{ 
    char *lastName; 
    char *firstName; 
    //other variables 
} 
0

如果模塊位於不同的二進制文件,
然後可以使用extern關鍵字像這樣共享數據:

  1. 聲明陣列中的單個放在代碼float paychecks[12]中。
  2. 爲了從另一個文件訪問數據,在導入文件
    extern float[] paycheks
  3. 這樣聲明執行上述(2),你要使用的薪水陣列中的每個文件。

你現在應該有一個數組的副本 - 每個人都看到/指向同一個數組。

1

除了已經提供了結構的建議......,
你的問題也有文件(模塊)之間的數據的可視性做。
這裏great link將闡明如何創建和定義的信息,例如在一個文件中(通常是.h)中的結構體,將值分配給所述結構成員和在另一個文件中使用它們(可能是一個。c)並修改第三個文件中的值。 (可能也是.c)。

至於陣列的結構;將其創建在將使用它的任何.c模塊包含的頭文件中。它可能看起來像:

 #define NUM_EMPL 10 //number of employees 

     typedef struct { 
     char last[40]; 
     char first[40]; 
     float payrate; 
     int hours; 
     float gross; 
     float tax; 
     float net; 
    } EMPLOYEE; 

    extern EMPLOYEE empl[NUM_EMPL], *pEmpl; //'extern' keyword is used only in this file 

然後,在所有 .C模塊(一個或多個),其中這個結構將被使用,文件頂部的地方(即功能不中),創建即在.h文件中定義的結構的新實例:

EMPLOYEE empl[NUM_EMPL], *pEmpl; //same as in .h file except without 'extern' keyword  

然後,函數中你可以初始化結構的指針版本的結構定義的開始,填充值結構成員;

void func1(void) 
{ 
    Empl = &empl[0]; // '[0]' guarantees pointer location. 

    //finally assign values 
    //(can be put into loop or similar to assign all n employess) 
    strcpy(pEmpl[0].last, "Smith"); 
    strcpy(pEmpl[0].first, "John"); 
    pEmpl[0].payrate = 100.00; 
    pEmpl[0].hours = 40; 
    //and so on... 
    //pass pointer to struct to another function 
    func2(pEmpl); 
} 

或者,您會收到一個指向結構作爲參數:
(下面的函數可以在不同的.c文件,以更好地展示數據的文件間的知名度。)

void func2(EMPLOYEE *e) 
{ 
    // assign values 
    //(can be put into loop or similar to assign all n employess) 
    strcpy(e[0].last, pEmpl[0].last); 
    strcpy(e[0].first, pEmpl[0].first); 
    e[0].payrate = pEmpl[0].payrate; 
    e[0].hours = pEmpl[0].hours; 
    //and so on... 
} 
+0

請記住,POSIX保留以'_t'結尾的類型名稱。編輯過的 – dreamlax

+0

以避免與POSIX衝突:)。 – ryyker

+0

'char last [40];'是危險的,因爲我可以向你保證在某個地方會有一個名字更長的人,不管你選擇緩衝區的時間有多長。我總是使用'char * last;'併爲它動態分配內存,最好使用'asprintf()'或'%as'格式字符串到'scanf()'如果我有glibc可用。 – cmaster

相關問題