Форум программистов, компьютерный форум CyberForum.ru

Сводная таблица - C++

Восстановить пароль Регистрация
 
kolia123456
-51 / 1 / 1
Регистрация: 12.02.2011
Сообщений: 37
19.02.2011, 13:37     Сводная таблица #1
Бухгалтерия хочет получить сводную таблицу начислений сотрудников за один год, с января по декабрь. Бухгалтер Ануар попросил программиста выгрузить все начисления с января по декабрь прошлого года в виде сводной таблицы. Так как данные в базе лежат в нормализованном виде, то программист поленился и выгрузил данные в следующем формате:
ФИО МЕСЯЦ НАЧИСЛЕНИЕ

Кроме того, ленивый программист не учел, что у одного сотрудника за один месяц могут быть несколько начислений, выгрузил данные не в отсортированном виде.

Когда Ануар увидел выгруженные данные, то он сильно расстроился, так как хотел получить данные в удобном виде, в формате сводной таблицы: ФИО ЯНВАРЬ ФЕВРАЛЬ МАРТ …. ДЕКАБРЬ

Помогите Ануару написать программу, которая из выгруженного формата переводит данные в сводную таблицу.
Формат входных данных

Во входном файла сначала записано одно число N – количество выгруженных данных (1<=N<=200). Далее следуют N строк данных Si, Mi, Vi – фамилия сотрудника (без пробелов), месяц, начисление. Si, Mi, Vi разделены одним пробелом. Длина фамилии не превышает 10 символов. Месяцы заданы в следующем формате:

* Январь – JAN
* Февраль – FEB
* Март - MAR
* Апрель - APR
* Май - MAY
* Июнь - JUN
* Июль - JUL
* Август - AUG
* Сентябрь - SEP
* Октябрь - OCT
* Ноябрь - NOV
* Декабрь - DEC

Формат выходных данных

Выведите в выходной файл число T, а затем T строк в следующем формате
(ФАМИЛИЯ) (СУММА ЗА ЯНВАРЬ) (СУММА ЗА ФЕВРАЛЬ) …. (СУММА ЗА ДЕКАБРЬ). Данные выводить отсортированными по фамилии в строгой форме, после вывода фамилии один пробел, затем 12 целых чисел, разделенными одним пробелом. Если у сотрудника в один месяц было несколько начислений, то их нужно суммировать, если не было ни одного, то вывести для соответствующего месяца цифру 0.
Примеры:
ввод вывод

4
Ivanov NOV 10
Petrov FEB 5
Ivanov JAN 2
Petrov FEB 4


2
Ivanov 2 0 0 0 0 0 0 0 0 0 10 0
Petrov 0 9 0 0 0 0 0 0 0 0 0 0


на с++ кодик плз с комментами
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2011, 13:37     Сводная таблица
Посмотрите здесь:

Таблица в C++ C++
Таблица лексем и таблица идентификаторов C++
Таблица факториалов C++
C++ Таблица
C++ Хэш таблица
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
19.02.2011, 14:24     Сводная таблица #2
kolia123456, ты лучше выложи сюда свой вариант решения (или свои попытки решения) - глядишь, и помогут быстрее (если вообще помогут)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
19.02.2011, 14:29     Сводная таблица #3
Цитата Сообщение от Nameless One Посмотреть сообщение
свой вариант решения (или свои попытки решения)
Ага, аристократы нынче коды сами не пишут, на холопов возложили они сию миссию.

Цитата Сообщение от Nameless One Посмотреть сообщение
если вообще помогут
Вот это вряд-ли...
kolia123456
-51 / 1 / 1
Регистрация: 12.02.2011
Сообщений: 37
19.02.2011, 14:53  [ТС]     Сводная таблица #4
лан...извините..када решу выложу
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.02.2011, 15:28     Сводная таблица #5
Старался как мог

employee.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef _EMPLOYEE_H
#define _EMPLOYEE_H 1
 
#include <assert.h>
#include <stddef.h>
#include <string.h>
 
 
# define MAX_EMPLOYEE_NAME          11
# define MONTHS_PER_YEAR            12
# define EMPLOYEE_PAYMENTS_FOR_YEAR MONTHS_PER_YEAR
 
 
/*  this structure defines the employee's type 
    which includes the name and charges for the year
*/
typedef struct {
    char name[MAX_EMPLOYEE_NAME];
    int  payments[EMPLOYEE_PAYMENTS_FOR_YEAR];
} employee_t, *pemployee_t;
 
/*
*/
void employee_copy (pemployee_t destination,
                    pemployee_t source)
{
    assert(destination);
    assert(source);
 
    memcpy(destination, source, sizeof(employee_t));
}
 
#endif /* employee.h */
employeelist.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#ifndef _EMPLOYEE_LIST_H
#define _EMPLOYEE_LIST_H 1
 
#include "employee.h"
#include <malloc.h>
 
struct _tag_node {
    struct _tag_node *next;
    employee_t employee;
};
 
/*  list for a work with employee's structure
*/
typedef struct {
    struct _tag_node *head;
    struct _tag_node *tail;
} employee_list_t, *pemployee_list_t;
 
size_t employee_list_size (pemployee_list_t list)
{
    struct _tag_node *node = NULL;
    size_t size = 0;
    assert(list);
 
    node = list->head;
    while (node != NULL) {
        ++size;
        node = node->next;
    }
 
    return size;
}
 
int employee_list_empty (pemployee_list_t list)
{
    assert(list);
    return list->head == NULL;
}
 
void employee_list_pop_front (pemployee_list_t list)
{
    struct _tag_node *node = NULL;
    assert(list);
    assert(!employee_list_empty(list));
 
    node = list->head;
    list->head = node->next;
 
    free(node);
}
 
/*  initialization of `employee's' list'
    it makes allocation of needed memory
*/
void employee_list_init (pemployee_list_t list)
{
    assert(list);
    memset(list, 0, sizeof(*list));
}
 
/*  shutdown of `employee's list'
    it makes deallocation of allocated memory
*/
void employee_list_release (pemployee_list_t list)
{
    assert(list);
    while (!employee_list_empty(list))
        employee_list_pop_front(list);
}
 
pemployee_t employee_list_front (pemployee_list_t list)
{
    assert(list);
    assert(!employee_list_empty(list));
    return &list->head->employee;
}
 
pemployee_t employee_list_back (pemployee_list_t list)
{
    assert(list);
    assert(!employee_list_empty(list));
    return &list->tail->employee;
}
 
/*  add new `employee' in the end of list
*/
void employee_list_push_back (pemployee_list_t list,
                              pemployee_t employee)
{
    struct _tag_node *node = NULL;
    assert(list);
    assert(employee);
    
    if ((node = (struct _tag_node *)malloc(sizeof(*node))) == NULL) {
        assert(node);
    }
 
    node->next = NULL;
    employee_copy(&node->employee, employee);
 
    if (employee_list_empty(list)) {
        list->head = node;
        list->tail = node;
    }
    else {
        list->tail->next = node;
        list->tail = node;
    }
}
 
/*  search the `employee' in the list by the name
*/
pemployee_t search_employee (pemployee_list_t list,
                             const char *name)
{
    struct _tag_node *node = NULL;
    assert(list);
    assert(name);
 
    node = list->head;
    while (node != NULL) {
        if (strcmp(name, node->employee.name) == 0)
            return &node->employee;
 
        node = node->next;
    }
 
    return NULL;
}
 
#endif /* employeelist.h */
indata.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#ifndef _INPUT_DATA_H
#define _INPUT_DATA_H 1
 
 
#include <assert.h>
 
/*  maximum length of short month's name
*/
# define MAX_MONTH_NAME 4
 
 
/* short names of months 
*/
char const * month_names[MONTHS_PER_YEAR] = {
    "JAN", "FEB", "MAR", "APR", "MAY", "JUN", 
    "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"
};
 
/*  this structure defines the 
    format of the data in a input file
*/
typedef struct {
    char name[MAX_EMPLOYEE_NAME];
    char month[MAX_MONTH_NAME];
    int  payment;
} indata_t, *pindata_t;
 
/*  this makes it possible to detect index of mounth by its short name.
    if a short name of month is founded function returns its index,
    otherwise it returns -1
*/
int count_month (const char *month)
{
    int i;
    assert(month);
 
    for (i = 0; i < MONTHS_PER_YEAR; ++i)
        if (strcmp(month, month_names[i]) == 0)
            return i;
 
    return -1;
}
 
void indata_clear (pindata_t indata)
{
    assert(indata);
    memset(indata, 0, sizeof(*indata));
}
 
pindata_t indata_read (pindata_t indata, 
                       FILE * stream)
{
    assert(indata);
    assert(stream);
 
    indata_clear(indata);
    fscanf(stream, "%s %s %d", indata->name, indata->month, &indata->payment);
 
    return indata;
}
 
#endif /* indata.h */
main.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
 
#include "employeelist.h"
#include "indata.h"
 
/*  output filename and input filename should be sent 
    to the program as arguments of command line, where
    - 'argv[1]' - input filename 
    - 'argv[2]' - output filename. 
 
    for example, 'myprog file.in file.out'.
*/
# define INFILE_NAME    argv[1]
# define OUTFILE_NAME   argv[2]
 
/*  this function returns the pointer to
    clear `employee' with the name
*/
pemployee_t employee_create_new (const char *name)
{
    static employee_t employee;
    assert(name);
 
    memset(&employee, 0, sizeof(employee));
    strncpy(employee.name, name, MAX_EMPLOYEE_NAME - 1);
 
    return &employee;
}
 
/*  update information in the list
    if the `employee' already exists in the list then
    its payments updated, otherwise new employee added in the list
*/
void employee_list_update_info (pemployee_list_t list,
                                pindata_t in_data)
{
    pemployee_t pemployee;
    if ((pemployee = search_employee(list, in_data->name)) == NULL) {
        employee_list_push_back(list, employee_create_new(in_data->name));
        pemployee = employee_list_back(list);
    }
 
    pemployee->payments[count_month(in_data->month)] += in_data->payment;
}
 
int main(int argc, char **argv)
{
    /* counters */
    size_t i = 0, j = 0;
    size_t number_of_records = 0;
 
    /* filestreams */
    FILE *input_file    = NULL;
    FILE *output_file   = NULL;
 
    /* inputdata struct */
    indata_t in_data;
 
    /* list of every `employee' */
    employee_list_t summary_table;
    
 
    /* opening of the input file for read only */
    if ((input_file = fopen(INFILE_NAME, "r")) == NULL) {
        fprintf(stderr, "can't open file %s\n", INFILE_NAME);
        exit(1);
    }
 
    /* reading number of records in the input file */
    fscanf(input_file, "%d", &number_of_records);
 
    /* initialization of employee's list */
    employee_list_init(&summary_table);
 
    /* reading the input file */
    do {
        employee_list_update_info(&summary_table, indata_read(&in_data, input_file));
    } while (--number_of_records);
 
    /* closing the input file */
    fclose(input_file);
 
    /* opening the output file for writing */
    if ((output_file = fopen(OUTFILE_NAME, "w")) == NULL) {
        fprintf(stderr, "can't open file %s\n", OUTFILE_NAME);
        exit(1);
    }
 
    /* writing the summary table in output file */
    fprintf(output_file, "%d\n", employee_list_size(&summary_table));
    while (!employee_list_empty(&summary_table)) {
        fprintf(output_file, "%s ", employee_list_front(&summary_table)->name);
 
        for (j = 0; j < EMPLOYEE_PAYMENTS_FOR_YEAR; ++j)
            fprintf(output_file, "%d ", employee_list_front(&summary_table)->payments[j]);
 
        fprintf(output_file, "\n");
        employee_list_pop_front(&summary_table);
    }
 
    /* closing the output file */
    fclose(output_file);
 
    /* release the employee list */
    employee_list_release(&summary_table);
 
 
    return 0;
}
Пример результата работы.

Входные данные:
Код
8
Ivanov NOV 10
Petrov FEB 5
Ivanov JAN 2
Petrov FEB 4
Sidorov JUN 9
Petrov SEP 20
Sidorov JUL 45
Ivanov MAY 1
Выходные данные:
Код
3
Ivanov 2 0 0 0 1 0 0 0 0 0 10 0 
Petrov 0 9 0 0 0 0 0 0 20 0 0 0 
Sidorov 0 0 0 0 0 9 45 0 0 0 0 0
kolia123456
-51 / 1 / 1
Регистрация: 12.02.2011
Сообщений: 37
20.02.2011, 15:46  [ТС]     Сводная таблица #6
если бы я знал что такое решение будет то не писал бы))))
Nameless One
20.02.2011, 15:48
  #7

Не по теме:

kolia123456, а чем не нравится решение? Отличное решение.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2011, 16:07     Сводная таблица
Еще ссылки по теме:

Таблица умножения C++
таблица умножения C++
Таблица истинности C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kolia123456
-51 / 1 / 1
Регистрация: 12.02.2011
Сообщений: 37
20.02.2011, 16:07  [ТС]     Сводная таблица #8
тут решение не причем...я прост пока не понял...решение наверное не плохое, может быть и отличное..мне бы понять что почем
Yandex
Объявления
20.02.2011, 16:07     Сводная таблица
Ответ Создать тему
Опции темы

Текущее время: 22:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru