2013-07-29 2 views
0

Я работаю над программой расчета заработной платы, которая берет пользовательский ввод (имя/фамилия, оплачиваемый период и часы работы) и выводит эти данные вместе с валовым, налоговым и сетевым.Хранение данных из нескольких функций в массиве

У меня есть отдельные модули для ввода, calc gross, calc tax и calc net; но я не уверен, как реализовать хранилище массивов, чтобы он включал данные из каждого из этих модулей.

любая помощь будет оценена

* Edit: мне нужно, чтобы иметь возможность сортировать данные (в алфавитном порядке) работником, так что мне нужно (я считаю) является запись массивов. У меня есть запись инициализирована внутри основного модуля и хочу запись, чтобы прочитать что-то вроде:

LastName [1], ПгвЬЫат [1] payrate [1] ч [1] брутто [1] налога [1] нетто [1]

LastName [2], ПгвЬЫат [2] payrate [2] ч [2] полный [2] налог [2] чистый [2]

Я не знаю, как вытащить полученные данные из других модулей в эту структуру.

+0

Вы хотите, чтобы один массив хранил имя пользователя, фамилию, ставку оплаты, часы работы, валовую оплату и т. Д.? Это невозможно сделать в C; элементы массива все должны быть одного типа, поэтому вы не можете хранить строки, такие как имя, в том же массиве, что и double/floats, например, брутто. Вы можете создать структуру для каждого пользователя и создать массив или связанный список пользовательских структур. – verbose

ответ

4

Вы можете просто создать глобальную структуру для хранения этих данных.

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

Вы можете просто сделать массив этой структуры и сортировки, используя qsort()

0

Вы должны использовать структуру, чтобы хранить все о ДАННЫЕ пользователя.

Что-то вроде:

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

Если модули находятся на разных бинарных файлов,
, то вы можете обмениваться данными с помощью extern ключевое слово, как так:

  1. Объявляем массив в одном место в коде float paychecks[12].
  2. Для того, чтобы получить доступ к данным из другого файла, объявить его следующим образом импортируемого файла
    extern float[] paycheks
  3. ли выше (2) в каждом файле, который вы хотите использовать массив зарплатами.

Теперь у вас должна быть единственная копия массива - со всеми, кто видит/указывает на тот же массив.

1

В дополнение к в Struct предложения, которые были предложены ...,
ваш вопрос также имеет отношение к видимости данных между файлами (модулей).
Здесь является 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